From 5ae34c2dc27b8fdba7adc95c57860cc0e218b435 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 1 Dec 2025 22:01:18 +0300 Subject: [PATCH] fix: pack environment not passed to components --- src/content/ContentLoader.cpp | 4 +++- src/logic/scripting/lua/libs/libentity.cpp | 10 +++++++++- src/logic/scripting/scripting.cpp | 7 +++++-- src/logic/scripting/scripting.hpp | 2 ++ 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index a88146be..c9b98281 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -492,6 +492,7 @@ void ContentLoader::loadScripts(Content& content) { load_scripts(content, content.items); for (const auto& [packid, runtime] : content.getPacks()) { + auto env = runtime->getEnvironment(); const auto& pack = runtime->getInfo(); const auto& folder = pack.folder; @@ -500,9 +501,10 @@ void ContentLoader::loadScripts(Content& content) { // Load entity components io::path componentsDir = folder / "scripts/components"; - foreach_file(componentsDir, [&pack](const io::path& file) { + foreach_file(componentsDir, [&pack, env](const io::path& file) { auto name = pack.id + ":" + file.stem(); scripting::load_entity_component( + env, name, file, pack.id + ":scripts/components/" + file.name() diff --git a/src/logic/scripting/lua/libs/libentity.cpp b/src/logic/scripting/lua/libs/libentity.cpp index 3b9730c2..5cab675a 100644 --- a/src/logic/scripting/lua/libs/libentity.cpp +++ b/src/logic/scripting/lua/libs/libentity.cpp @@ -1,6 +1,7 @@ #include "libentity.hpp" #include "content/Content.hpp" +#include "content/ContentPack.hpp" #include "engine/Engine.hpp" #include "engine/EnginePaths.hpp" #include "objects/Entities.hpp" @@ -236,7 +237,14 @@ static int l_reload_component(lua::State* L) { } auto filename = name.substr(0, pos + 1) + "scripts/components/" + name.substr(pos + 1) + ".lua"; - scripting::load_entity_component(name, filename, filename); + auto prefix = name.substr(0, pos); + auto runtime = content->getPackRuntime(prefix); + if (runtime == nullptr) { + throw std::runtime_error("pack '" + prefix + "' content is not loaded"); + } + scripting::load_entity_component( + runtime->getEnvironment(), name, filename, filename + ); return 0; } diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index 3a68917d..15c4e85e 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -708,12 +708,15 @@ void scripting::load_content_script( } void scripting::load_entity_component( - const std::string& name, const io::path& file, const std::string& fileName + const scriptenv& env, + const std::string& name, + const io::path& file, + const std::string& fileName ) { auto L = lua::get_main_state(); std::string src = io::read_string(file); logger.info() << "script (component) " << file.string(); - lua::loadbuffer(L, 0, src, fileName); + lua::loadbuffer(L, *env, src, fileName); lua::store_in(L, lua::CHUNKS_TABLE, name); } diff --git a/src/logic/scripting/scripting.hpp b/src/logic/scripting/scripting.hpp index 966450c6..298130c9 100644 --- a/src/logic/scripting/scripting.hpp +++ b/src/logic/scripting/scripting.hpp @@ -186,10 +186,12 @@ namespace scripting { ); /// @brief Load component script + /// @param env environment /// @param name component full name (packid:name) /// @param file component script file path /// @param fileName script file path using the engine format void load_entity_component( + const scriptenv& env, const std::string& name, const io::path& file, const std::string& fileName