From f2c26aed193b12b45d0a967b476d0e85ef2a2e89 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 19 Mar 2024 13:22:35 +0300 Subject: [PATCH] double event handlers calls fix --- res/scripts/stdlib.lua | 12 ++++++++++++ src/logic/scripting/scripting.cpp | 9 +++++++++ 2 files changed, 21 insertions(+) diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index c547f7d3..d8397f57 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -135,6 +135,18 @@ function events.on(event, func) table.insert(events.handlers[event], func) end +function events.remove_by_prefix(prefix) + for name, handlers in pairs(events.handlers) do + if name:sub(1, #prefix) == prefix then + events.handlers[name] = nil + end + end +end + +function pack.unload(prefix) + events.remove_by_prefix(prefix) +end + function events.emit(event, ...) result = nil if events.handlers[event] then diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index f74dc943..8624a394 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -125,6 +125,15 @@ void scripting::on_world_quit() { for (auto& pack : scripting::engine->getContentPacks()) { emit_event(pack.id + ".worldquit"); } + + state->getglobal("pack"); + for (auto& pack : scripting::engine->getContentPacks()) { + state->getfield("unload"); + state->pushstring(pack.id); + state->callNoThrow(1); + } + state->pop(); + if (state->getglobal("__scripts_cleanup")) { state->callNoThrow(0); }