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); }