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
2 changed files with 9 additions and 7 deletions
Showing only changes of commit b83c9bb75c - Show all commits

View File

@ -2153,7 +2153,7 @@ export class GameRuntime {
// npc.onDeath по локальному ref находил npcId. // npc.onDeath по локальному ref находил npcId.
for (const sb of this.sandboxes) { for (const sb of this.sandboxes) {
if (sb.api?._localToRealNpc) { if (sb.api?._localToRealNpc) {
try { sb.api._localToRealNpc.set(payload.ref, 'npc:' + npcId); } catch (_) {} try { sb.api.setNpcLocalRef?.(payload.ref, 'npc:' + npcId); } catch (_) {}
} }
} }
} }

View File

@ -1849,7 +1849,7 @@ export function registerRobloxShim(lua, opts) {
// Возвращает локальный ref (строку 'npc_lua_N'), который можно передавать // Возвращает локальный ref (строку 'npc_lua_N'), который можно передавать
// в __rbxl_npc_say(ref, text, duration). // в __rbxl_npc_say(ref, text, duration).
let _nextNpcRef = 0; let _nextNpcRef = 0;
api._localToRealNpc = new Map(); const _localToRealNpc = new Map();
global.set('__rbxl_spawn_npc', (modelType, x, y, z, name, hp, speed) => { global.set('__rbxl_spawn_npc', (modelType, x, y, z, name, hp, speed) => {
const ref = 'npc_lua_' + (_nextNpcRef++); const ref = 'npc_lua_' + (_nextNpcRef++);
send('npc.spawn', { send('npc.spawn', {
@ -1895,7 +1895,6 @@ export function registerRobloxShim(lua, opts) {
global.set('__rbxl_npc_on_death', (ref, fn) => { global.set('__rbxl_npc_on_death', (ref, fn) => {
if (typeof fn === 'function') _npcDeathCbs.set(String(ref || ''), fn); if (typeof fn === 'function') _npcDeathCbs.set(String(ref || ''), fn);
}); });
api._npcDeathCbs = _npcDeathCbs;
// Инвентарь invUI — паритет с JS game.inventory.add(itemId, count). // Инвентарь invUI — паритет с JS game.inventory.add(itemId, count).
// Сначала определяем итем (один раз), потом добавляем. // Сначала определяем итем (один раз), потом добавляем.
const _localInventory = new Map(); const _localInventory = new Map();
@ -2026,6 +2025,11 @@ export function registerRobloxShim(lua, opts) {
// вроде __rbxl_player_pos и updatePlayerPos могли его видеть. // вроде __rbxl_player_pos и updatePlayerPos могли его видеть.
const api = { const api = {
_realPlayerPos: null, _realPlayerPos: null,
// GameRuntime зовёт после npc.spawn-резолва: маппинг локального
// ref ('npc_lua_N') на реальный ('npc:<id>'). Нужно для npcDeath.
setNpcLocalRef(localRef, realRef) {
_localToRealNpc.set(String(localRef), String(realRef));
},
onSceneSnapshot(snap) { onSceneSnapshot(snap) {
try { try {
const prims = snap?.primitives || []; const prims = snap?.primitives || [];
@ -2247,10 +2251,8 @@ export function registerRobloxShim(lua, opts) {
const realRef = 'npc:' + p.npcId; const realRef = 'npc:' + p.npcId;
// Ищем локальный ref по реальному // Ищем локальный ref по реальному
let localRef = null; let localRef = null;
if (api._localToRealNpc) { for (const [k, v] of _localToRealNpc.entries()) {
for (const [k, v] of api._localToRealNpc.entries()) { if (v === realRef) { localRef = k; break; }
if (v === realRef) { localRef = k; break; }
}
} }
// Вызываем все cb с подходящим ref // Вызываем все cb с подходящим ref
if (_npcDeathCbs.size > 0) { if (_npcDeathCbs.size > 0) {