From a641099d36a0f75bf0aaf94e7efe77e67b7e3db9 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 22 Nov 2024 08:56:59 +0300 Subject: [PATCH] feat: load block and item scripts after content load --- src/content/ContentLoader.cpp | 49 ++++++++++++++++++------------- src/content/ContentLoader.hpp | 3 ++ src/engine.cpp | 4 ++- src/logic/scripting/scripting.cpp | 11 ++++--- src/logic/scripting/scripting.hpp | 6 ++-- 5 files changed, 45 insertions(+), 28 deletions(-) diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index cb50e4a5..baf5e06e 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -483,16 +483,6 @@ void ContentLoader::loadBlock( auto configFile = folder / fs::path("blocks/" + name + ".json"); if (fs::exists(configFile)) loadBlock(def, full, configFile); - auto scriptfile = folder / fs::path("scripts/" + def.scriptName + ".lua"); - if (fs::is_regular_file(scriptfile)) { - scripting::load_block_script( - env, - full, - scriptfile, - pack->id + ":scripts/" + def.scriptName + ".lua", - def.rt.funcsset - ); - } if (!def.hidden) { auto& item = builder.items.create(full + BLOCK_ITEM_SUFFIX); item.generated = true; @@ -514,17 +504,6 @@ void ContentLoader::loadItem( auto folder = pack->folder; auto configFile = folder / fs::path("items/" + name + ".json"); if (fs::exists(configFile)) loadItem(def, full, configFile); - - auto scriptfile = folder / fs::path("scripts/" + def.scriptName + ".lua"); - if (fs::is_regular_file(scriptfile)) { - scripting::load_item_script( - env, - full, - scriptfile, - pack->id + ":scripts/" + def.scriptName + ".lua", - def.rt.funcsset - ); - } } static std::tuple create_unit_id( @@ -825,6 +804,34 @@ void ContentLoader::load() { } } +template +static void load_scripts(Content& content, ContentUnitDefs& units) { + for (const auto& [name, def] : units.getDefs()) { + size_t pos = name.find(':'); + if (pos == std::string::npos) { + throw std::runtime_error("invalid content unit name"); + } + const auto runtime = content.getPackRuntime(name.substr(0, pos)); + const auto& pack = runtime->getInfo(); + const auto& folder = pack.folder; + auto scriptfile = folder / fs::path("scripts/" + def->scriptName + ".lua"); + if (fs::is_regular_file(scriptfile)) { + scripting::load_content_script( + runtime->getEnvironment(), + name, + scriptfile, + pack.id + ":scripts/" + def->scriptName + ".lua", + def->rt.funcsset + ); + } + } +} + +void ContentLoader::loadScripts(Content& content) { + load_scripts(content, content.blocks); + load_scripts(content, content.items); +} + void ContentLoader::loadResources(ResourceType type, const dv::value& list) { for (size_t i = 0; i < list.size(); i++) { builder.resourceIndices[static_cast(type)].add( diff --git a/src/content/ContentLoader.hpp b/src/content/ContentLoader.hpp index 22cb33ef..d99aa622 100644 --- a/src/content/ContentLoader.hpp +++ b/src/content/ContentLoader.hpp @@ -17,6 +17,7 @@ struct ContentPack; struct GeneratorDef; class ResPaths; +class Content; class ContentBuilder; class ContentPackRuntime; struct ContentPackStats; @@ -76,4 +77,6 @@ public: void fixPackIndices(); void load(); + + static void loadScripts(Content& content); }; diff --git a/src/engine.cpp b/src/engine.cpp index 85a9e42b..f08175a1 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -361,8 +361,10 @@ void Engine::loadContent() { ContentLoader(&pack, contentBuilder, *resPaths).load(); load_configs(pack.folder); } - content = contentBuilder.build(); + scripting::on_content_load(content.get()); + + ContentLoader::loadScripts(*content); langs::setup(resdir, langs::current->getId(), contentPacks); loadAssets(); diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index f0082a3c..77f15473 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -157,10 +157,13 @@ void scripting::process_post_runnables() { } } +void scripting::on_content_load(Content* content) { + scripting::content = content; + scripting::indices = content->getIndices(); +} + void scripting::on_world_load(LevelController* controller) { scripting::level = controller->getLevel(); - scripting::content = level->content; - scripting::indices = level->content->getIndices(); scripting::blocks = controller->getBlocksController(); scripting::controller = controller; @@ -671,7 +674,7 @@ int scripting::get_values_on_stack() { return lua::gettop(lua::get_main_state()); } -void scripting::load_block_script( +void scripting::load_content_script( const scriptenv& senv, const std::string& prefix, const fs::path& file, @@ -692,7 +695,7 @@ void scripting::load_block_script( register_event(env, "on_blocks_tick", prefix + ".blockstick"); } -void scripting::load_item_script( +void scripting::load_content_script( const scriptenv& senv, const std::string& prefix, const fs::path& file, diff --git a/src/logic/scripting/scripting.hpp b/src/logic/scripting/scripting.hpp index ca0ea433..3cd8a022 100644 --- a/src/logic/scripting/scripting.hpp +++ b/src/logic/scripting/scripting.hpp @@ -45,6 +45,8 @@ namespace scripting { void initialize(Engine* engine); + void on_content_load(Content* content); + bool register_event( int env, const std::string& name, const std::string& id ); @@ -128,7 +130,7 @@ namespace scripting { /// @param file item script file /// @param fileName script file path using the engine format /// @param funcsset block callbacks set - void load_block_script( + void load_content_script( const scriptenv& env, const std::string& prefix, const fs::path& file, @@ -142,7 +144,7 @@ namespace scripting { /// @param file item script file /// @param fileName script file path using the engine format /// @param funcsset item callbacks set - void load_item_script( + void load_content_script( const scriptenv& env, const std::string& prefix, const fs::path& file,