feat: 50 игр на Lua + импорт Roblox для всех + поддержка Lua в плеере #39

Merged
min merged 215 commits from feat/lua-50-games-bundle into main 2026-06-09 21:59:25 +00:00
Showing only changes of commit 86b3d2f238 - Show all commits

View File

@ -24,9 +24,13 @@ import { LangTabs, highlightCode } from './docsLang';
// Код-блок с подсветкой синтаксиса // Код-блок с подсветкой синтаксиса
// lang='js' (default) | 'lua'. Если не указан автодетект по содержимому. // lang='js' (default) | 'lua'. Если не указан автодетект по содержимому.
export const Code = ({ children, lang }) => { // plain=true без подсветки (для длинных текстов вроде AI-контекста).
export const Code = ({ children, lang, plain }) => {
const text = typeof children === 'string' ? children const text = typeof children === 'string' ? children
: Array.isArray(children) ? children.join('') : String(children); : Array.isArray(children) ? children.join('') : String(children);
if (plain) {
return <pre className="docCode"><code>{text}</code></pre>;
}
const resolved = lang || ( const resolved = lang || (
/\blocal\b|\bthen\b|\bend\b|\b:Connect\b|\bfunction\(|--\s/.test(text) ? 'lua' : 'js' /\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 = [ export const DOCS = [
// //
// РАЗДЕЛ A ОСНОВЫ // РАЗДЕЛ A ОСНОВЫ
@ -4979,8 +5212,10 @@ end)`}</Code>}
Открой статью <b>«AI2. Контекст скопируй в нейросеть»</b> ниже. Открой статью <b>«AI2. Контекст скопируй в нейросеть»</b> ниже.
</Step> </Step>
<Step n={2}> <Step n={2}>
<b>Выдели и скопируй весь текст</b> из серого блока (он Сверху статьи переключи язык (JS или Lua) зависит от
описывает все команды Рублокса). того, на каком пишешь скрипты в своей игре.
<b> Выдели и скопируй весь текст</b> из серого блока (он
описывает все команды Рублокса для выбранного языка).
</Step> </Step>
<Step n={3}> <Step n={3}>
Вставь его в нейросеть <b>первым сообщением</b>. Затем добавь Вставь его в нейросеть <b>первым сообщением</b>. Затем добавь
@ -5005,10 +5240,14 @@ end)`}</Code>}
body: ( body: (
<> <>
<p> <p>
<b>Выдели весь текст ниже и скопируй</b> (Ctrl+A внутри блока Сверху выбери язык скриптов своей игры. <b>Выдели весь
или мышью), затем вставь в нейросеть перед своим вопросом: текст ниже и скопируй</b> (Ctrl+A внутри блока или мышью),
затем вставь в нейросеть перед своим вопросом:
</p> </p>
<Code>{AI_CONTEXT}</Code> <LangTabs
js={<Code plain>{AI_CONTEXT}</Code>}
lua={<Code plain>{AI_CONTEXT_LUA}</Code>}
/>
</> </>
), ),
}, },