From 86b3d2f238af152747f510cea549a86fc7b7198a Mon Sep 17 00:00:00 2001 From: min Date: Tue, 9 Jun 2026 03:22:58 +0300 Subject: [PATCH] =?UTF-8?q?feat(wiki):=20AI-=D0=BA=D0=BE=D0=BD=D1=82=D0=B5?= =?UTF-8?q?=D0=BA=D1=81=D1=82=20=D0=B4=D0=BB=D1=8F=20Lua=20=D1=80=D1=8F?= =?UTF-8?q?=D0=B4=D0=BE=D0=BC=20=D1=81=20JS-=D0=BA=D0=BE=D0=BD=D1=82=D0=B5?= =?UTF-8?q?=D0=BA=D1=81=D1=82=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Раньше в статье "AI2. Контекст — скопируй в нейросеть" был только JS-вариант. Юзер пишущий на Lua не мог использовать. Сейчас: - Новая константа AI_CONTEXT_LUA — полный API Lua-рантайма Рублокса (стандартный Roblox-стиль: game:GetService, workspace, Vector3, Instance.new, TweenService и т.п. + наши особенности). - LangTabs обёртка над в AI2 — нейросеть получит контекст на нужном языке. - AI1 (как пользоваться) дополнен подсказкой про переключатель. Также в добавлен prop plain=true для отключения подсветки — AI-контекст это текст для копирования, а не код, ему подсветка не нужна (и она ломала бы тысячи символов API-описаний). --- src/community/docsData.jsx | 251 ++++++++++++++++++++++++++++++++++++- 1 file changed, 245 insertions(+), 6 deletions(-) diff --git a/src/community/docsData.jsx b/src/community/docsData.jsx index 000a264..17c37fe 100644 --- a/src/community/docsData.jsx +++ b/src/community/docsData.jsx @@ -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
{text}
; + } 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)`}
} Открой статью «AI2. Контекст — скопируй в нейросеть» ниже. - Выдели и скопируй весь текст из серого блока (он - описывает все команды Рублокса). + Сверху статьи переключи язык (JS или Lua) — зависит от + того, на каком пишешь скрипты в своей игре. + Выдели и скопируй весь текст из серого блока (он + описывает все команды Рублокса для выбранного языка). Вставь его в нейросеть первым сообщением. Затем добавь @@ -5005,10 +5240,14 @@ end)`}
} body: ( <>

- Выдели весь текст ниже и скопируй (Ctrl+A внутри блока - или мышью), затем вставь в нейросеть перед своим вопросом: + Сверху выбери язык скриптов своей игры. Выдели весь + текст ниже и скопируй (Ctrl+A внутри блока или мышью), + затем вставь в нейросеть перед своим вопросом:

- {AI_CONTEXT} + {AI_CONTEXT}} + lua={{AI_CONTEXT_LUA}} + /> ), },