feat(wiki): AI-контекст для Lua рядом с JS-контекстом
Раньше в статье "AI2. Контекст — скопируй в нейросеть" был только JS-вариант. Юзер пишущий на Lua не мог использовать. Сейчас: - Новая константа AI_CONTEXT_LUA — полный API Lua-рантайма Рублокса (стандартный Roblox-стиль: game:GetService, workspace, Vector3, Instance.new, TweenService и т.п. + наши особенности). - LangTabs обёртка над <Code> в AI2 — нейросеть получит контекст на нужном языке. - AI1 (как пользоваться) дополнен подсказкой про переключатель. Также в <Code> добавлен prop plain=true для отключения подсветки — AI-контекст это текст для копирования, а не код, ему подсветка не нужна (и она ломала бы тысячи символов API-описаний).
This commit is contained in:
parent
d6ba23ae8d
commit
86b3d2f238
@ -24,9 +24,13 @@ import { LangTabs, highlightCode } from './docsLang';
|
||||
|
||||
// ── Код-блок с подсветкой синтаксиса ──────────────────────────────
|
||||
// lang='js' (default) | 'lua'. Если не указан — автодетект по содержимому.
|
||||
export const Code = ({ children, lang }) => {
|
||||
// plain=true — без подсветки (для длинных текстов вроде AI-контекста).
|
||||
export const Code = ({ children, lang, plain }) => {
|
||||
const text = typeof children === 'string' ? children
|
||||
: Array.isArray(children) ? children.join('') : String(children);
|
||||
if (plain) {
|
||||
return <pre className="docCode"><code>{text}</code></pre>;
|
||||
}
|
||||
const resolved = lang || (
|
||||
/\blocal\b|\bthen\b|\bend\b|\b:Connect\b|\bfunction\(|--\s/.test(text) ? 'lua' : 'js'
|
||||
);
|
||||
@ -232,6 +236,235 @@ game.onMessage('coin', () => { s++; game.ui.score = s; game.sound.play('coin');
|
||||
|
||||
Теперь напиши скрипт под мою задачу (она ниже). Укажи, КУДА его вставить (глобальный или на объект).`;
|
||||
|
||||
// ════════════════════════════════════════════════════════════
|
||||
// AI_CONTEXT_LUA — то же самое, но для Lua-скриптов.
|
||||
// API Lua-рантайма Рублокса совместим со стандартным Roblox API.
|
||||
// ════════════════════════════════════════════════════════════
|
||||
const AI_CONTEXT_LUA = `Ты — помощник по написанию скриптов на Lua для онлайн-конструктора 3D-игр «Рублокс» (аналог Roblox, движок Babylon.js + wasmoon-runtime). API максимально совместим со стандартным Roblox: game:GetService(...), workspace, Vector3, CFrame, Instance.new, signals через :Connect. Пиши ТОЛЬКО рабочий Lua-код. Не используй require() и DataStoreService.
|
||||
|
||||
=== ДВА ВИДА СКРИПТОВ ===
|
||||
1) Глобальный (Script) — в категории «Скрипты», запускается 1 раз. Управляет всей сценой.
|
||||
2) На объекте (Script внутри Part) — script.Parent = объект-носитель. Через script.Parent ловим Touched/ClickDetector.
|
||||
Всегда указывай пользователю, КУДА класть скрипт.
|
||||
|
||||
=== ОСНОВНЫЕ СЕРВИСЫ ===
|
||||
local Players = game:GetService("Players")
|
||||
local RunService = game:GetService("RunService")
|
||||
local UserInputService = game:GetService("UserInputService")
|
||||
local TweenService = game:GetService("TweenService")
|
||||
local Debris = game:GetService("Debris")
|
||||
local CollectionService = game:GetService("CollectionService")
|
||||
local Teams = game:GetService("Teams")
|
||||
local Lighting = game:GetService("Lighting")
|
||||
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
||||
local SoundService = game:GetService("SoundService")
|
||||
|
||||
=== ИГРОК ===
|
||||
local player = Players.LocalPlayer
|
||||
local char = player.Character or player.CharacterAdded:Wait()
|
||||
local humanoid = char:WaitForChild("Humanoid")
|
||||
local hrp = char:WaitForChild("HumanoidRootPart")
|
||||
|
||||
humanoid.Health -- HP (0..MaxHealth)
|
||||
humanoid.MaxHealth = 100
|
||||
humanoid.WalkSpeed = 16 -- 16 = норма
|
||||
humanoid.JumpPower = 50 -- 50 = норма
|
||||
humanoid:TakeDamage(n)
|
||||
humanoid.Health = 0 -- мгновенная смерть
|
||||
player:LoadCharacter() -- респавн
|
||||
humanoid.Died:Connect(fn)
|
||||
hrp.Position -- Vector3
|
||||
hrp.CFrame = CFrame.new(x,y,z) -- телепорт
|
||||
workspace.Gravity = 196 -- 196 = норма
|
||||
Players.PlayerAdded:Connect(function(p) ... end)
|
||||
Players.PlayerRemoving:Connect(function(p) ... end)
|
||||
|
||||
=== ОБЪЕКТ-НОСИТЕЛЬ (script на Part) ===
|
||||
local part = script.Parent
|
||||
part.Position = Vector3.new(x,y,z)
|
||||
part.Color = Color3.fromRGB(255, 100, 50)
|
||||
part.Material = Enum.Material.Neon -- Plastic/Neon/Metal/Glass/Wood
|
||||
part.Transparency = 0.5 -- 0=видно, 1=невидимо
|
||||
part.CanCollide = false
|
||||
part.Anchored = true -- висит / падает
|
||||
part.Size = Vector3.new(2, 1, 2)
|
||||
part.Orientation = Vector3.new(0, 90, 0) -- ГРАДУСЫ
|
||||
part.Touched:Connect(function(hit)
|
||||
local h = hit.Parent:FindFirstChild("Humanoid")
|
||||
if h then ... end
|
||||
end)
|
||||
part.TouchEnded:Connect(fn)
|
||||
-- Клик по Part:
|
||||
local cd = Instance.new("ClickDetector", part)
|
||||
cd.MouseClick:Connect(function(player) ... end)
|
||||
-- Кнопка E:
|
||||
local pp = Instance.new("ProximityPrompt", part)
|
||||
pp.ActionText = "Открыть"; pp.MaxActivationDistance = 4
|
||||
pp.Triggered:Connect(function(player) ... end)
|
||||
|
||||
=== СОЗДАНИЕ ОБЪЕКТОВ ===
|
||||
local p = Instance.new("Part")
|
||||
p.Shape = Enum.PartType.Block -- Block/Ball/Cylinder/Wedge/CornerWedge
|
||||
p.Size = Vector3.new(2, 2, 2)
|
||||
p.Position = Vector3.new(0, 5, 0)
|
||||
p.Color = Color3.fromRGB(255, 0, 0)
|
||||
p.Material = Enum.Material.Neon
|
||||
p.Anchored = true
|
||||
p.Parent = workspace -- обязательно!
|
||||
|
||||
p:Destroy()
|
||||
Debris:AddItem(p, 5) -- удалить через 5 сек
|
||||
|
||||
workspace:WaitForChild("Имя") -- ждать пока появится
|
||||
workspace:FindFirstChild("Имя")
|
||||
workspace:GetChildren()
|
||||
|
||||
=== ВЕКТОРЫ И CFRAME ===
|
||||
Vector3.new(x, y, z)
|
||||
v.Magnitude -- длина
|
||||
v.Unit -- единичный
|
||||
(a - b).Magnitude -- расстояние
|
||||
|
||||
CFrame.new(x, y, z)
|
||||
CFrame.new(pos, lookAt)
|
||||
cf * CFrame.Angles(0, math.rad(90), 0) -- РАДИАНЫ
|
||||
cf.Position cf.LookVector cf.RightVector
|
||||
|
||||
Color3.fromRGB(255, 100, 50)
|
||||
Color3.new(1, 0.4, 0.2)
|
||||
UDim2.new(scaleX, offsetX, scaleY, offsetY) -- для GUI
|
||||
|
||||
=== СОБЫТИЯ И ТАЙМЕРЫ ===
|
||||
RunService.Heartbeat:Connect(function(dt) ... end) -- каждый кадр
|
||||
UserInputService.InputBegan:Connect(function(input, gp)
|
||||
if input.KeyCode == Enum.KeyCode.Space then ... end
|
||||
end)
|
||||
task.wait(2) -- ждать 2 сек
|
||||
task.delay(3, function() ... end) -- через 3 сек один раз
|
||||
task.spawn(function() -- параллельный поток
|
||||
while true do task.wait(1); ... end
|
||||
end)
|
||||
local ev = Instance.new("BindableEvent")
|
||||
ev.Event:Connect(fn); ev:Fire(arg)
|
||||
|
||||
=== TWEEN ===
|
||||
local info = TweenInfo.new(2, Enum.EasingStyle.Quad, Enum.EasingDirection.InOut, 0, false, 0)
|
||||
local goal = { Position = part.Position + Vector3.new(0, 5, 0) }
|
||||
local tween = TweenService:Create(part, info, goal)
|
||||
tween:Play()
|
||||
tween.Completed:Connect(fn)
|
||||
|
||||
=== GUI ===
|
||||
local gui = player:WaitForChild("PlayerGui")
|
||||
local screen = Instance.new("ScreenGui", gui)
|
||||
local label = Instance.new("TextLabel", screen)
|
||||
label.Size = UDim2.new(0.4, 0, 0.1, 0)
|
||||
label.Position = UDim2.new(0.3, 0, 0.4, 0)
|
||||
label.Text = "Привет!"
|
||||
label.TextColor3 = Color3.new(1, 1, 1)
|
||||
label.TextScaled = true
|
||||
local btn = Instance.new("TextButton", screen)
|
||||
btn.MouseButton1Click:Connect(fn)
|
||||
-- BillboardGui над Part:
|
||||
local bb = Instance.new("BillboardGui", part)
|
||||
bb.StudsOffset = Vector3.new(0, 3, 0)
|
||||
|
||||
=== ЛИДЕРБОРД (HUD справа сверху) ===
|
||||
Players.PlayerAdded:Connect(function(player)
|
||||
local stats = Instance.new("Folder", player)
|
||||
stats.Name = "leaderstats" -- магическое имя!
|
||||
local coins = Instance.new("IntValue", stats)
|
||||
coins.Name = "Монеты"; coins.Value = 0
|
||||
end)
|
||||
|
||||
=== КОМАНДЫ ===
|
||||
local team = Instance.new("Team")
|
||||
team.Name = "Red"
|
||||
team.TeamColor = BrickColor.new("Bright red")
|
||||
team.AutoAssignable = true
|
||||
team.Parent = Teams
|
||||
player.Team = team
|
||||
|
||||
=== ФИЗИКА ===
|
||||
local ray = workspace:Raycast(origin, direction * 50)
|
||||
if ray then print(ray.Instance.Name, ray.Position) end
|
||||
part:ApplyImpulse(Vector3.new(0, 100, 0))
|
||||
local exp = Instance.new("Explosion")
|
||||
exp.Position = Vector3.new(0, 5, 0); exp.BlastRadius = 10; exp.Parent = workspace
|
||||
|
||||
=== ТЕГИ ===
|
||||
CollectionService:AddTag(part, "звезда")
|
||||
CollectionService:HasTag(part, "звезда")
|
||||
CollectionService:GetTagged("звезда")
|
||||
CollectionService:GetInstanceAddedSignal("звезда"):Connect(fn)
|
||||
|
||||
=== АТРИБУТЫ ===
|
||||
part:SetAttribute("Price", 50)
|
||||
part:GetAttribute("Price")
|
||||
part:GetAttributeChangedSignal("Price"):Connect(fn)
|
||||
|
||||
=== ЗВУК ===
|
||||
local s = Instance.new("Sound", workspace)
|
||||
s.SoundId = "rbxassetid://9120386436"
|
||||
s.Volume = 0.7; s.Looped = false
|
||||
s:Play()
|
||||
|
||||
=== ОСВЕЩЕНИЕ И НЕБО ===
|
||||
Lighting:SetMinutesAfterMidnight(12 * 60)
|
||||
Lighting.FogColor = Color3.fromRGB(220, 220, 230)
|
||||
Lighting.FogEnd = 200
|
||||
local sky = Instance.new("Sky", Lighting)
|
||||
local atm = Instance.new("Atmosphere", Lighting)
|
||||
atm.Density = 0.3
|
||||
|
||||
=== ИНСТРУМЕНТЫ (Tools) ===
|
||||
local tool = Instance.new("Tool")
|
||||
tool.Name = "Меч"
|
||||
tool.RequiresHandle = false
|
||||
tool.Parent = player.Backpack
|
||||
tool.Activated:Connect(fn)
|
||||
tool.Equipped:Connect(fn)
|
||||
|
||||
=== СООБЩЕНИЯ МЕЖДУ СКРИПТАМИ ===
|
||||
-- Скрипты НЕ видят переменные друг друга.
|
||||
-- Общаются через BindableEvent в ReplicatedStorage
|
||||
-- или через общие IntValue/StringValue в ReplicatedStorage.
|
||||
|
||||
=== ВАЖНЫЕ ПРАВИЛА ===
|
||||
- В CFrame.Angles — РАДИАНЫ (math.rad(90) = 90°). В part.Orientation — градусы.
|
||||
- Перед обращением к Character: WaitForChild или CharacterAdded:Wait().
|
||||
- task.wait/delay/spawn вместо устаревших wait/delay/spawn.
|
||||
- DataStoreService НЕ работает (нет онлайн-БД). Прогресс храни в IntValue игрока.
|
||||
- НЕ используй require() и ModuleScript (наш wasmoon-рантайм не поддерживает).
|
||||
- Player.Team задаётся ссылкой на Team-объект, не строкой.
|
||||
- BrickColor — устаревшее, но работает: BrickColor.new("Bright red"). Лучше Color3.fromRGB.
|
||||
|
||||
ПРИМЕР (килблок-лава, скрипт В ОБЪЕКТЕ):
|
||||
local part = script.Parent
|
||||
part.Touched:Connect(function(hit)
|
||||
local h = hit.Parent:FindFirstChild("Humanoid")
|
||||
if h then h.Health = 0 end
|
||||
end)
|
||||
|
||||
ПРИМЕР (сбор монет — глобальный + на каждой монетке):
|
||||
-- Глобальный:
|
||||
local Players = game:GetService("Players")
|
||||
Players.PlayerAdded:Connect(function(player)
|
||||
local stats = Instance.new("Folder", player); stats.Name = "leaderstats"
|
||||
local coins = Instance.new("IntValue", stats); coins.Name = "Монеты"
|
||||
end)
|
||||
-- На монетке:
|
||||
local part = script.Parent
|
||||
part.Touched:Connect(function(hit)
|
||||
local player = game:GetService("Players"):GetPlayerFromCharacter(hit.Parent)
|
||||
if not player then return end
|
||||
local stats = player:FindFirstChild("leaderstats")
|
||||
if stats then stats.Монеты.Value = stats.Монеты.Value + 1 end
|
||||
part:Destroy()
|
||||
end)
|
||||
|
||||
Теперь напиши Lua-скрипт под мою задачу (она ниже). Укажи, КУДА его вставить (глобальный или на объект).`;
|
||||
|
||||
export const DOCS = [
|
||||
// ════════════════════════════════════════════════════
|
||||
// РАЗДЕЛ A — ОСНОВЫ
|
||||
@ -4979,8 +5212,10 @@ end)`}</Code>}
|
||||
Открой статью <b>«AI2. Контекст — скопируй в нейросеть»</b> ниже.
|
||||
</Step>
|
||||
<Step n={2}>
|
||||
Сверху статьи переключи язык (JS или Lua) — зависит от
|
||||
того, на каком пишешь скрипты в своей игре.
|
||||
<b> Выдели и скопируй весь текст</b> из серого блока (он
|
||||
описывает все команды Рублокса).
|
||||
описывает все команды Рублокса для выбранного языка).
|
||||
</Step>
|
||||
<Step n={3}>
|
||||
Вставь его в нейросеть <b>первым сообщением</b>. Затем добавь
|
||||
@ -5005,10 +5240,14 @@ end)`}</Code>}
|
||||
body: (
|
||||
<>
|
||||
<p>
|
||||
<b>Выдели весь текст ниже и скопируй</b> (Ctrl+A внутри блока
|
||||
или мышью), затем вставь в нейросеть перед своим вопросом:
|
||||
Сверху выбери язык скриптов своей игры. <b>Выдели весь
|
||||
текст ниже и скопируй</b> (Ctrl+A внутри блока или мышью),
|
||||
затем вставь в нейросеть перед своим вопросом:
|
||||
</p>
|
||||
<Code>{AI_CONTEXT}</Code>
|
||||
<LangTabs
|
||||
js={<Code plain>{AI_CONTEXT}</Code>}
|
||||
lua={<Code plain>{AI_CONTEXT_LUA}</Code>}
|
||||
/>
|
||||
</>
|
||||
),
|
||||
},
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user