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
3 changed files with 43 additions and 2 deletions
Showing only changes of commit 0805da0708 - Show all commits

View File

@ -40,16 +40,22 @@ import ConfirmModal from './ConfirmModal';
// Используется при смене языка JSLua когда текущий код выглядит «пустым». // Используется при смене языка JSLua когда текущий код выглядит «пустым».
export const LUA_TEMPLATE_PART = `-- Скрипт привязан к Part. script.Parent = эта часть. export const LUA_TEMPLATE_PART = `-- Скрипт привязан к Part. script.Parent = эта часть.
local part = script.Parent local part = script.Parent
print("Скрипт детали", part.Name, "запущен")
part.Touched:Connect(function(hit) part.Touched:Connect(function(hit)
print("Касание:", hit.Name) print("Касание:", hit.Name)
end) end)
`; `;
export const LUA_TEMPLATE_GLOBAL = `-- Глобальный Lua-скрипт. Работает на стороне сервера/клиента. export const LUA_TEMPLATE_GLOBAL = `-- Глобальный Lua-скрипт. Доступ к game.* API через Roblox-обёртку.
local Players = game:GetService("Players") local Players = game:GetService("Players")
print("Привет, Рублокс! Lua-скрипты работают.")
-- Здороваемся со всеми кто уже в игре + кто заходит позже
for _, player in ipairs(Players:GetPlayers()) do
print("Игрок в игре:", player.Name)
end
Players.PlayerAdded:Connect(function(player) Players.PlayerAdded:Connect(function(player)
print("Игрок зашёл:", player.Name) print("Зашёл игрок:", player.Name)
end) end)
`; `;
export const JS_TEMPLATE_GLOBAL = `// Глобальный JS-скрипт. Подробнее: см. game.* API в /справочник. export const JS_TEMPLATE_GLOBAL = `// Глобальный JS-скрипт. Подробнее: см. game.* API в /справочник.

View File

@ -134,6 +134,21 @@ export class LuaSharedSandbox {
} else { } else {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.log(`[LuaSharedSandbox] all ${pending.length} scripts kicked off`); console.log(`[LuaSharedSandbox] all ${pending.length} scripts kicked off`);
// После того как все скрипты подключили хендлеры — фейрим
// events для уже существующих сущностей. Roblox-конвенция:
// если игрок уже на сервере когда скрипт подключается,
// Players.PlayerAdded не сработает повторно. Юзеру нужно
// делать ручной обход GetPlayers() — но это редко кто помнит.
// Мы дублируем событие через короткую задержку.
setTimeout(() => {
try {
if (this.api?.fireExistingPlayers) {
this.api.fireExistingPlayers();
}
} catch (e) {
console.warn('[LuaSharedSandbox] fireExistingPlayers failed:', e);
}
}, 100);
} }
}; };
setTimeout(initBatch, 0); setTimeout(initBatch, 0);

View File

@ -828,6 +828,9 @@ export function registerRobloxShim(lua, opts) {
character.Parent = localPlayer; character.Parent = localPlayer;
localPlayer.Children.push(character); localPlayer.Children.push(character);
localPlayer.Character = character; localPlayer.Character = character;
localPlayer.CharacterAdded = makeSignal();
localPlayer.CharacterRemoving = makeSignal();
localPlayer.CharacterAppearanceLoaded = makeSignal();
const humanoid = newInstance('Humanoid', 'Humanoid'); const humanoid = newInstance('Humanoid', 'Humanoid');
humanoid.Parent = character; humanoid.Parent = character;
@ -1730,6 +1733,23 @@ export function registerRobloxShim(lua, opts) {
onGuiSnapshot() {}, onGuiSnapshot() {},
onDataSnapshot() {}, onDataSnapshot() {},
/** Фейр PlayerAdded для уже существующих игроков после того как
* скрипты успели подключить хендлеры. Roblox-конвенция:
* Players.PlayerAdded не срабатывает для игроков уже на сервере.
* Мы дублируем чтобы простые скрипты вроде
* Players.PlayerAdded:Connect(...) работали из коробки. */
fireExistingPlayers() {
try {
if (players?.PlayerAdded?.Fire) {
players.PlayerAdded.Fire(localPlayer);
}
// CharacterAdded — то же самое
if (localPlayer?.CharacterAdded?.Fire && character) {
localPlayer.CharacterAdded.Fire(character);
}
} catch (_) {}
},
tickScheduler(_dt) { tickScheduler(_dt) {
// 0a. Lua-handlers из очереди (signal.Fire отложил их сюда). // 0a. Lua-handlers из очереди (signal.Fire отложил их сюда).
// Запускаем каждый в своей coroutine — wait() внутри безопасен. // Запускаем каждый в своей coroutine — wait() внутри безопасен.