fix(g20): использовать api.setNpcLocalRef вместо прямого access
Lua-runtime FATAL: 'Cannot access api before initialization' — я обращался к api._localToRealNpc на 1852 до const api = на 2027. Фикс: - _localToRealNpc объявил как const до api (доступен в closures) - api.setNpcLocalRef(localRef, realRef) — публичный метод - GameRuntime: sb.api.setNpcLocalRef?.(ref, 'npc:'+npcId) - В fireGlobalEvent npcDeath используем _localToRealNpc напрямую
This commit is contained in:
parent
8a3405e34a
commit
b83c9bb75c
@ -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 (_) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user