docs(48) + feat(g49): «Мультиплеер: Гонка»

g48 docs: CodeBoth g48_main.

g49 паритет (упрощённый без MP-API):
- showText 'Гонка! Беги к финишу первым'
- hud_set 'info' 'Игроков: N | Победил: X' (Players:GetPlayers count + LocalPlayer name)
- Players.PlayerAdded/Removing → refresh
- BindableEvent FinishReached
- g49_finish: Touched → FinishReached:Fire (fired-флаг)
- При победе: winnerName = LocalPlayer.Name + refresh + 'Победа!' + confetti
This commit is contained in:
min 2026-06-09 23:18:39 +03:00
parent e78f585fd4
commit 3a95cd148a
2 changed files with 63 additions and 3 deletions

View File

@ -4484,7 +4484,67 @@ end)`,
}, },
// ═══════════════════════════════════════════════════════════════ // ═══════════════════════════════════════════════════════════════
// ИГРЫ 49-50: явных Lua-версий пока нет. // ИГРА 49 — «Мультиплеер: Гонка»
// ═══════════════════════════════════════════════════════════════
'mp-race': {
g49_main: `-- === ИГРА «МУЛЬТИПЛЕЕР: ГОНКА» — главный скрипт (Lua) ===
-- Мультиплеерная гонка. Чтобы соревноваться с друзьями опубликуй
-- игру с галочкой «Мультиплеер».
${SNIPPET_BROADCAST}
local Players = game:GetService("Players")
local winnerName = nil
local won = false
__rbxl_show_text("Гонка! Беги к финишу первым", 3)
local winSound = Instance.new("Sound", workspace)
winSound.SoundId = "win"; winSound.Volume = 1
local function refresh()
local n = #Players:GetPlayers()
local txt = "Игроков: " .. n
if winnerName then txt = txt .. " | Победил: " .. winnerName end
__rbxl_hud_set("info", txt, 50, 8, "#ffe066", 22)
end
refresh()
Players.PlayerAdded:Connect(refresh)
Players.PlayerRemoving:Connect(refresh)
-- Финиш
local finEvent = getEvent("FinishReached")
finEvent.Event:Connect(function()
if won then return end
won = true
-- В одиночке мы и есть первый
local me = Players.LocalPlayer
winnerName = me and me.Name or "Игрок"
refresh()
__rbxl_show_text("Ты пришёл первым! Победа!", 5)
winSound:Play()
local px = __rbxl_player_x()
local py = __rbxl_player_y()
local pz = __rbxl_player_z()
__rbxl_spawn_particles("confetti", px, py + 3, pz, 3, 3)
end)`,
g49_finish: `-- === Скрипт финиша (Lua) ===
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local part = script.Parent
local fired = false
part.Touched:Connect(function(hit)
if fired then return end
local h = hit.Parent and hit.Parent:FindFirstChild("Humanoid")
if not h then return end
fired = true
local ev = ReplicatedStorage:FindFirstChild("FinishReached")
if ev then ev:Fire() end
end)`,
},
// ═══════════════════════════════════════════════════════════════
// ИГРА 50: явных Lua-версий пока нет.
// buildGameProject в docsGamesBuilders.js использует generateFallbackLua. // buildGameProject в docsGamesBuilders.js использует generateFallbackLua.
'clicker': { 'clicker': {
g46_main: `-- === ИГРА «КЛИКЕР» — главный скрипт (Lua) === g46_main: `-- === ИГРА «КЛИКЕР» — главный скрипт (Lua) ===

View File

@ -6969,7 +6969,7 @@ game.self.onTouch(() => {
<h3 className="lessonH">Шаг 2. Главный скрипт</h3> <h3 className="lessonH">Шаг 2. Главный скрипт</h3>
<ScriptKind kind="global" /> <ScriptKind kind="global" />
<Code>{`// === ИГРА «МУЛЬТИПЛЕЕР: САЛКИ» — главный скрипт === <CodeBoth game="mp-tag" script="g48_main">{`// === ИГРА «МУЛЬТИПЛЕЕР: САЛКИ» — главный скрипт ===
// //
// Это МУЛЬТИПЛЕЕРНАЯ игра. Чтобы играть с друзьями, опубликуй её // Это МУЛЬТИПЛЕЕРНАЯ игра. Чтобы играть с друзьями, опубликуй её
// с галочкой «Мультиплеер» тогда в комнату смогут зайти несколько // с галочкой «Мультиплеер» тогда в комнату смогут зайти несколько
@ -7006,7 +7006,7 @@ game.room.onChange('tagger', (taggerId) => {
} else { } else {
game.ui.showText('Убегай от водящего!', 3); game.ui.showText('Убегай от водящего!', 3);
} }
});`}</Code> });`}</CodeBoth>
<p>Разберём:</p> <p>Разберём:</p>
<ul> <ul>
<li><code>game.players.count()</code> сколько игроков <li><code>game.players.count()</code> сколько игроков