fix(lua): task.delay/spawn/defer не терялись после prelude

Корень бага HUD/звука в игре 'Собери монетки':
prelude перезаписывал task = { wait = rbx_wait } если type(task)~='table'.
task — JS-объект (userdata) → ветка else → методы delay/spawn/defer
исчезали.

Скрипт g1_main падал на:
  task.delay(2, function() hintGui:Destroy() end)
с 'attempt to call a nil value (field delay)'.

Из-за этого Connect на CoinCollected ниже не выполнялся → HUD не
обновлялся, звук не играл.

Фикс: сохраняем существующие методы task.delay/spawn/defer из shim,
добавляем wait.
This commit is contained in:
min 2026-06-09 10:37:18 +03:00
parent bb69ccf9ed
commit 701125d17b

View File

@ -1698,8 +1698,21 @@ export function registerRobloxShim(lua, opts) {
function __rbxl_yield_frame() function __rbxl_yield_frame()
coroutine.yield(0.05) coroutine.yield(0.05)
end end
if type(task) == 'table' then -- task JS-object из shim ('userdata'/'table'). Сохраняем
task.wait = rbx_wait -- существующие методы (delay/spawn/defer) и добавляем wait.
if type(task) == 'table' or type(task) == 'userdata' then
local existing = task
local jsDelay = existing.delay
local jsSpawn = existing.spawn
local jsDefer = existing.defer
task = {
wait = rbx_wait,
delay = jsDelay or function(_, fn) if fn then fn() end end,
spawn = jsSpawn or function(fn) if fn then fn() end end,
defer = jsDefer or function(fn) if fn then fn() end end,
synchronize = function() end,
desynchronize = function() end,
}
else else
task = { wait = rbx_wait } task = { wait = rbx_wait }
end end