feat: 50 игр на Lua + импорт Roblox для всех + поддержка Lua в плеере #39
@ -139,19 +139,8 @@ local RunService = game:GetService("RunService")
|
|||||||
local player = Players.LocalPlayer
|
local player = Players.LocalPlayer
|
||||||
local won = false
|
local won = false
|
||||||
|
|
||||||
-- Подсказка по центру (на 3 секунды)
|
-- Подсказка по центру (паритет с JS game.ui.showText)
|
||||||
local hintGui = Instance.new("ScreenGui", player.PlayerGui)
|
__rbxl_show_text("Допрыгай до зелёной площадки!", 3)
|
||||||
hintGui.Name = "Hint"
|
|
||||||
local hint = Instance.new("TextLabel", hintGui)
|
|
||||||
hint.Size = UDim2.new(0, 480, 0, 60)
|
|
||||||
hint.Position = UDim2.new(0.5, -240, 0.3, 0)
|
|
||||||
hint.BackgroundColor3 = Color3.fromRGB(0, 0, 0)
|
|
||||||
hint.BackgroundTransparency = 0.4
|
|
||||||
hint.TextColor3 = Color3.fromRGB(255, 255, 255)
|
|
||||||
hint.TextScaled = true
|
|
||||||
hint.Font = Enum.Font.SourceSansBold
|
|
||||||
hint.Text = "Допрыгай до зелёной площадки!"
|
|
||||||
task.delay(3, function() hintGui:Destroy() end)
|
|
||||||
|
|
||||||
-- Звуки
|
-- Звуки
|
||||||
local loseSound = Instance.new("Sound", workspace)
|
local loseSound = Instance.new("Sound", workspace)
|
||||||
@ -170,17 +159,7 @@ RunService.Heartbeat:Connect(function()
|
|||||||
if hrp and hrp.Position.Y < -3 then
|
if hrp and hrp.Position.Y < -3 then
|
||||||
player:LoadCharacter()
|
player:LoadCharacter()
|
||||||
loseSound:Play()
|
loseSound:Play()
|
||||||
local fallGui = Instance.new("ScreenGui", player.PlayerGui)
|
__rbxl_show_text("Упал! Пробуй снова.", 1.5)
|
||||||
local fallLabel = Instance.new("TextLabel", fallGui)
|
|
||||||
fallLabel.Size = UDim2.new(0, 400, 0, 60)
|
|
||||||
fallLabel.Position = UDim2.new(0.5, -200, 0.35, 0)
|
|
||||||
fallLabel.BackgroundColor3 = Color3.fromRGB(120, 0, 0)
|
|
||||||
fallLabel.BackgroundTransparency = 0.3
|
|
||||||
fallLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
|
|
||||||
fallLabel.TextScaled = true
|
|
||||||
fallLabel.Font = Enum.Font.SourceSansBold
|
|
||||||
fallLabel.Text = "Упал! Пробуй снова."
|
|
||||||
task.delay(1.5, function() fallGui:Destroy() end)
|
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
@ -190,16 +169,10 @@ finishEvent.Event:Connect(function()
|
|||||||
if won then return end
|
if won then return end
|
||||||
won = true
|
won = true
|
||||||
winSound:Play()
|
winSound:Play()
|
||||||
local winGui = Instance.new("ScreenGui", player.PlayerGui)
|
__rbxl_show_text("Победа! Ты дошёл до финиша!", 5)
|
||||||
local winLabel = Instance.new("TextLabel", winGui)
|
-- Конфетти над игроком (как JS game.scene.spawnParticles)
|
||||||
winLabel.Size = UDim2.new(0, 540, 0, 80)
|
local pos = __rbxl_player_pos()
|
||||||
winLabel.Position = UDim2.new(0.5, -270, 0.4, 0)
|
__rbxl_spawn_particles("confetti", pos.x, pos.y + 3, pos.z, 3, 3)
|
||||||
winLabel.BackgroundColor3 = Color3.fromRGB(0, 120, 0)
|
|
||||||
winLabel.BackgroundTransparency = 0.2
|
|
||||||
winLabel.TextColor3 = Color3.fromRGB(255, 255, 0)
|
|
||||||
winLabel.TextScaled = true
|
|
||||||
winLabel.Font = Enum.Font.SourceSansBold
|
|
||||||
winLabel.Text = "Победа! Ты дошёл до финиша!"
|
|
||||||
end)`,
|
end)`,
|
||||||
g2_finish: `-- === Скрипт финиш-зоны (Lua) ===
|
g2_finish: `-- === Скрипт финиш-зоны (Lua) ===
|
||||||
-- Висит на невидимой зоне над зелёной площадкой.
|
-- Висит на невидимой зоне над зелёной площадкой.
|
||||||
|
|||||||
@ -296,6 +296,23 @@ export class GameRuntime {
|
|||||||
this._ensureRbxlHud();
|
this._ensureRbxlHud();
|
||||||
this._rbxlHud.showWin(payload.text || 'WIN!');
|
this._rbxlHud.showWin(payload.text || 'WIN!');
|
||||||
} catch (_) {}
|
} catch (_) {}
|
||||||
|
} else if (cmd === 'ui.showText') {
|
||||||
|
// Lua-helper __rbxl_show_text: красивый центрированный
|
||||||
|
// текст без рамки (паритет с JS game.ui.showText).
|
||||||
|
try {
|
||||||
|
this._ensureRbxlHud();
|
||||||
|
this._rbxlHud.showMessage(payload.text || '');
|
||||||
|
const dur = Number(payload.duration) || 2;
|
||||||
|
const t = payload.text || '';
|
||||||
|
setTimeout(() => {
|
||||||
|
try {
|
||||||
|
if (this._rbxlHud._lastMessage === t) {
|
||||||
|
this._rbxlHud.hideMessage();
|
||||||
|
}
|
||||||
|
} catch (_) {}
|
||||||
|
}, dur * 1000);
|
||||||
|
try { this._rbxlHud._lastMessage = t; } catch (_) {}
|
||||||
|
} catch (_) {}
|
||||||
} else if (cmd === 'leaderstatSet') {
|
} else if (cmd === 'leaderstatSet') {
|
||||||
// Roblox leaderstats: IntValue.Value меняется → HUD.
|
// Roblox leaderstats: IntValue.Value меняется → HUD.
|
||||||
try {
|
try {
|
||||||
|
|||||||
@ -1807,6 +1807,31 @@ export function registerRobloxShim(lua, opts) {
|
|||||||
global.set('__log', (level, text) => {
|
global.set('__log', (level, text) => {
|
||||||
send('log', { level: String(level || 'info'), text: String(text || '') });
|
send('log', { level: String(level || 'info'), text: String(text || '') });
|
||||||
});
|
});
|
||||||
|
// === Хелперы паритета с JS game.ui / game.scene ===
|
||||||
|
// Красивый центрированный текст без рамки (как game.ui.showText).
|
||||||
|
global.set('__rbxl_show_text', (text, duration, color) => {
|
||||||
|
send('ui.showText', {
|
||||||
|
text: String(text || ''),
|
||||||
|
duration: Number(duration) || 2,
|
||||||
|
color: color || '#ffffff',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
// Эффекты частиц (confetti, sparks и т.п.) — как game.scene.spawnParticles.
|
||||||
|
global.set('__rbxl_spawn_particles', (kind, x, y, z, duration, count) => {
|
||||||
|
send('scene.particles', {
|
||||||
|
kind: String(kind || 'confetti'),
|
||||||
|
pos: { x: +x, y: +y, z: +z },
|
||||||
|
duration: Number(duration) || 2,
|
||||||
|
count: Number(count) || 1,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
// Позиция игрока для удобства (для confetti над головой и т.п.)
|
||||||
|
global.set('__rbxl_player_pos', () => {
|
||||||
|
try {
|
||||||
|
const p = hrp._position || { X: 0, Y: 0, Z: 0 };
|
||||||
|
return { x: p.X, y: p.Y, z: p.Z };
|
||||||
|
} catch (_) { return { x: 0, y: 0, z: 0 }; }
|
||||||
|
});
|
||||||
// Достаём ссылку на Lua-функцию один раз; вызовы безопасны (не doStringSync)
|
// Достаём ссылку на Lua-функцию один раз; вызовы безопасны (не doStringSync)
|
||||||
const luaResumeCo = lua.global.get('__rbxl_resume_co');
|
const luaResumeCo = lua.global.get('__rbxl_resume_co');
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user