diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index 7d551a4a..eedc9d43 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -186,7 +186,6 @@ events = require "core:internal/events" function pack.unload(prefix) events.remove_by_prefix(prefix) - __vc__pack_envs[prefix] = nil end function __vc_start_app_script(path) diff --git a/res/scripts/stdmin.lua b/res/scripts/stdmin.lua index 362e9a41..ea425748 100644 --- a/res/scripts/stdmin.lua +++ b/res/scripts/stdmin.lua @@ -771,6 +771,7 @@ function __scripts_cleanup(non_reset_packs) __cached_scripts[k] = nil package.loaded[k] = nil end + __vc__pack_envs[packname] = nil ::continue:: end end diff --git a/src/logic/scripting/lua/lua_util.cpp b/src/logic/scripting/lua/lua_util.cpp index 401255c7..1f0bfd99 100644 --- a/src/logic/scripting/lua/lua_util.cpp +++ b/src/logic/scripting/lua/lua_util.cpp @@ -336,6 +336,22 @@ int lua::create_environment(State* L, int parent) { return id; } +int lua::restore_pack_environment(lua::State* L, const std::string& packid) { + if(!lua::getglobal(L, "__vc__pack_envs")) { + return -1; + } + int id = nextEnvironment++; + + if (lua::getfield(L, packid)) { + // envname = env + setglobal(L, env_name(id)); + lua::pop(L); + return id; + } + lua::pop(L); + return -1; +} + void lua::remove_environment(State* L, int id) { if (id == 0) { return; diff --git a/src/logic/scripting/lua/lua_util.hpp b/src/logic/scripting/lua/lua_util.hpp index a8fb246e..9e543a0a 100644 --- a/src/logic/scripting/lua/lua_util.hpp +++ b/src/logic/scripting/lua/lua_util.hpp @@ -614,6 +614,7 @@ namespace lua { return 0; } int create_environment(lua::State*, int parent); + int restore_pack_environment(lua::State*, const std::string& packid); void remove_environment(lua::State*, int id); inline void close(lua::State* L) { diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index f3135c1c..8fe88d39 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -173,7 +173,15 @@ std::unique_ptr scripting::start_app_script(const io::path& script) { const ContentPack& pack ) { auto L = lua::get_main_state(); - int id = lua::create_environment(L, 0); + int id = lua::restore_pack_environment(L, pack.id); + if (id != -1) { + return std::shared_ptr(new int(id), [=](int* id) { //-V508 + lua::remove_environment(L, *id); + delete id; + }); + } + id = lua::create_environment(L, 0); + lua::pushenv(L, id); lua::pushvalue(L, -1); lua::setfield(L, "PACK_ENV"); @@ -352,9 +360,6 @@ void scripting::cleanup(const std::vector& nonReset) { auto L = lua::get_main_state(); lua::requireglobal(L, "pack"); for (auto& pack : content_control->getAllContentPacks()) { - if (std::find(nonReset.begin(), nonReset.end(), pack.id) != nonReset.end()) { - continue; - } lua::requirefield(L, "unload"); lua::pushstring(L, pack.id); lua::call_nothrow(L, 1);