From 0e6fb878bf0b20149c56d165eeb6c4ec1d6bf3a4 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 9 Nov 2025 23:04:50 +0300 Subject: [PATCH] add app.reset_content 'non_reset_packs' optional argument --- res/scripts/stdmin.lua | 23 ++++++++++++++++++++++- src/content/ContentControl.cpp | 6 ++---- src/content/ContentControl.hpp | 2 +- src/engine/Engine.cpp | 1 + src/frontend/screens/MenuScreen.cpp | 2 +- src/logic/scripting/lua/libs/libcore.cpp | 11 ++++++++++- src/logic/scripting/scripting.cpp | 12 ++++++++++-- src/logic/scripting/scripting.hpp | 2 +- src/window/detail/GLFWWindow.cpp | 6 +++--- 9 files changed, 51 insertions(+), 14 deletions(-) diff --git a/res/scripts/stdmin.lua b/res/scripts/stdmin.lua index df5c7ce2..362e9a41 100644 --- a/res/scripts/stdmin.lua +++ b/res/scripts/stdmin.lua @@ -742,15 +742,36 @@ function require(path) return __load_script(prefix .. ":modules/" .. file .. ".lua", nil, env) end -function __scripts_cleanup() +-- TODO: move to string +local function join(t, sep) + local s = "" + for i, v in ipairs(t) do + s = s..tostring(v) + if i < #t then + s = s..sep + end + end + return s +end + +function __scripts_cleanup(non_reset_packs) debug.log("cleaning scripts cache") + if #non_reset_packs == 0 then + debug.log("no non-reset packs") + else + debug.log("non-reset packs: "..join(non_reset_packs, ", ")) + end for k, v in pairs(__cached_scripts) do local packname, _ = parse_path(k) + if table.has(non_reset_packs, packname) then + goto continue + end if packname ~= "core" then debug.log("unloaded "..k) __cached_scripts[k] = nil package.loaded[k] = nil end + ::continue:: end end diff --git a/src/content/ContentControl.cpp b/src/content/ContentControl.cpp index 6140c3d2..c887baa6 100644 --- a/src/content/ContentControl.cpp +++ b/src/content/ContentControl.cpp @@ -49,10 +49,10 @@ std::vector& ContentControl::getBasePacks() { return basePacks; } -void ContentControl::resetContent() { +void ContentControl::resetContent(const std::vector& nonReset) { paths.setCurrentWorldFolder(""); - scripting::cleanup(); + scripting::cleanup(nonReset); std::vector resRoots; { auto pack = ContentPack::createCore(); @@ -79,8 +79,6 @@ void ContentControl::loadContent(const std::vector& names) { } void ContentControl::loadContent() { - scripting::cleanup(); - std::vector names; for (auto& pack : contentPacks) { names.push_back(pack.id); diff --git a/src/content/ContentControl.hpp b/src/content/ContentControl.hpp index ef45a04a..f066601e 100644 --- a/src/content/ContentControl.hpp +++ b/src/content/ContentControl.hpp @@ -34,7 +34,7 @@ public: std::vector& getBasePacks(); /// @brief Reset content to base packs list - void resetContent(); + void resetContent(const std::vector& nonReset); void loadContent(const std::vector& names); diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index 4cd7a316..6598562f 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -394,6 +394,7 @@ void Engine::setScreen(std::shared_ptr screen) { } if (project->clientScript && this->screen) { project->clientScript->onScreenChange(this->screen->getName(), true); + window->setShouldRefresh(); } } diff --git a/src/frontend/screens/MenuScreen.cpp b/src/frontend/screens/MenuScreen.cpp index e1015e8c..6472578d 100644 --- a/src/frontend/screens/MenuScreen.cpp +++ b/src/frontend/screens/MenuScreen.cpp @@ -26,7 +26,7 @@ MenuScreen::MenuScreen(Engine& engine) MenuScreen::~MenuScreen() = default; void MenuScreen::onOpen() { - engine.getContentControl().resetContent(); + engine.getContentControl().resetContent({}); auto menu = engine.getGUI().getMenu(); menu->reset(); diff --git a/src/logic/scripting/lua/libs/libcore.cpp b/src/logic/scripting/lua/libs/libcore.cpp index 34c33d6d..8f8a7bc8 100644 --- a/src/logic/scripting/lua/libs/libcore.cpp +++ b/src/logic/scripting/lua/libs/libcore.cpp @@ -43,7 +43,16 @@ static int l_reset_content(lua::State* L) { if (level != nullptr) { throw std::runtime_error("world must be closed before"); } - content_control->resetContent(); + std::vector nonResetPacks; + if (lua::istable(L, 1)) { + int len = lua::objlen(L, 1); + for (int i = 0; i < len; i++) { + lua::rawgeti(L, i + 1, 1); + nonResetPacks.emplace_back(lua::require_lstring(L, -1)); + lua::pop(L); + } + } + content_control->resetContent(std::move(nonResetPacks)); return 0; } diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index b9efda4b..f3135c1c 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -348,10 +348,13 @@ void scripting::on_world_quit() { scripting::controller = nullptr; } -void scripting::cleanup() { +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); @@ -359,7 +362,12 @@ void scripting::cleanup() { lua::pop(L); if (lua::getglobal(L, "__scripts_cleanup")) { - lua::call_nothrow(L, 0); + lua::createtable(L, nonReset.size(), 0); + for (size_t i = 0; i < nonReset.size(); i++) { + lua::pushstring(L, nonReset[i]); + lua::rawseti(L, i + 1); + } + lua::call_nothrow(L, 1); } } diff --git a/src/logic/scripting/scripting.hpp b/src/logic/scripting/scripting.hpp index d9c7e614..a096e9cc 100644 --- a/src/logic/scripting/scripting.hpp +++ b/src/logic/scripting/scripting.hpp @@ -82,7 +82,7 @@ namespace scripting { void on_world_tick(int tps); void on_world_save(); void on_world_quit(); - void cleanup(); + void cleanup(const std::vector& nonReset); void on_blocks_tick(const Block& block, int tps); void update_block(const Block& block, const glm::ivec3& pos); void random_update_block(const Block& block, const glm::ivec3& pos); diff --git a/src/window/detail/GLFWWindow.cpp b/src/window/detail/GLFWWindow.cpp index a80c10e0..5fa8865f 100644 --- a/src/window/detail/GLFWWindow.cpp +++ b/src/window/detail/GLFWWindow.cpp @@ -382,11 +382,11 @@ public: } void setShouldRefresh() override { - shouldRefresh = true; + shouldRefresh = 2; } bool checkShouldRefresh() override { - if (shouldRefresh) { + if ((--shouldRefresh) == 0) { shouldRefresh = false; return true; } @@ -573,7 +573,7 @@ private: double prevSwap = 0.0; int posX = 0; int posY = 0; - bool shouldRefresh = true; + int shouldRefresh = 1; }; static_assert(!std::is_abstract());