From 61625ffe00f70df9f8a80e391aad7c947b90a7b8 Mon Sep 17 00:00:00 2001 From: Xertis <118364459+Xertis@users.noreply.github.com> Date: Sun, 22 Mar 2026 21:40:38 +0300 Subject: [PATCH 1/8] Added script-listener to packs loading --- src/content/ContentLoader.cpp | 24 ++++++++++++++++- src/content/ContentLoader.hpp | 1 + src/content/ContentPack.hpp | 5 ++++ src/logic/scripting/scripting.cpp | 45 +++++++++++++++++++++++++++++++ src/logic/scripting/scripting.hpp | 18 +++++++++++++ 5 files changed, 92 insertions(+), 1 deletion(-) diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index e2a463cac..47af7232a 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -334,12 +334,16 @@ void ContentLoader::load() { fixPackIndices(); + loadMainScript(*runtime); + auto folder = pack->folder; builder.defaults = paths.readCombinedObject( EnginePaths::CONFIG_DEFAULTS.string() ); + scripting::on_content_initialization(); + // Load world generators io::path generatorsDir = folder / "generators"; foreach_file(generatorsDir, [this](const io::path& file) { @@ -462,6 +466,21 @@ void ContentLoader::reloadScript(const Content& content, ItemDef& item) { load_script(content, item); } +void ContentLoader::loadMainScript(ContentPackRuntime& runtime) { + const auto& pack = runtime.getInfo(); + const auto& folder = pack.folder; + io::path scriptFile = folder / "scripts/main.lua"; + if (io::is_regular_file(scriptFile)) { + scripting::load_main_script( + runtime.getEnvironment(), + pack.id, + scriptFile, + pack.id + ":scripts/main.lua", + runtime.mainfuncsset + ); + } +} + void ContentLoader::loadWorldScript(ContentPackRuntime& runtime) { const auto& pack = runtime.getInfo(); const auto& folder = pack.folder; @@ -478,6 +497,7 @@ void ContentLoader::loadWorldScript(ContentPackRuntime& runtime) { } void ContentLoader::loadScripts(Content& content) { + scripting::on_content_loading(); load_scripts(content, content.blocks); load_scripts(content, content.items); @@ -486,7 +506,7 @@ void ContentLoader::loadScripts(Content& content) { const auto& pack = runtime->getInfo(); const auto& folder = pack.folder; - // Load main world script + // Load world script loadWorldScript(*runtime); // Load entity components @@ -501,6 +521,8 @@ void ContentLoader::loadScripts(Content& content) { ); }); } + + scripting::on_content_loaded(); } void ContentLoader::loadResources(ResourceType type, const dv::value& list) { diff --git a/src/content/ContentLoader.hpp b/src/content/ContentLoader.hpp index 3bf385c5b..0dd292809 100644 --- a/src/content/ContentLoader.hpp +++ b/src/content/ContentLoader.hpp @@ -58,6 +58,7 @@ public: void load(); static void loadScripts(Content& content); + static void loadMainScript(ContentPackRuntime& pack); static void loadWorldScript(ContentPackRuntime& pack); static void reloadScript(const Content& content, Block& block); static void reloadScript(const Content& content, ItemDef& item); diff --git a/src/content/ContentPack.hpp b/src/content/ContentPack.hpp index a4548d038..146858f55 100644 --- a/src/content/ContentPack.hpp +++ b/src/content/ContentPack.hpp @@ -129,12 +129,17 @@ struct WorldFuncsSet { bool oninventoryclosed; }; +struct MainFuncsSet { + bool oncontentloading; +}; + class ContentPackRuntime { ContentPack info; ContentPackStats stats {}; scriptenv env; public: WorldFuncsSet worldfuncsset {}; + MainFuncsSet mainfuncsset {}; ContentPackRuntime(ContentPack info, scriptenv env); ~ContentPackRuntime(); diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index e3c23ee1e..b49f2c5ee 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -627,6 +627,36 @@ void scripting::on_ui_close(UiDocument* layout, Inventory* inventory) { }); } +void scripting::on_content_initialization() { + auto L = lua::get_main_state(); + + for (auto& pack : content_control->getAllContentPacks()) { + lua::emit_event(L, pack.id + ":.oncontentinitialization", [](auto L) { + return 0; + }); + } +} + +void scripting::on_content_loading() { + auto L = lua::get_main_state(); + + for (auto& pack : content_control->getAllContentPacks()) { + lua::emit_event(L, pack.id + ":.oncontentloading", [](auto L) { + return 0; + }); + } +} + +void scripting::on_content_loaded() { + auto L = lua::get_main_state(); + + for (auto& pack : content_control->getAllContentPacks()) { + lua::emit_event(L, pack.id + ":.oncontentloaded", [](auto L) { + return 0; + }); + } +} + bool scripting::register_event( int env, const std::string& name, const std::string& id ) { @@ -763,6 +793,21 @@ void scripting::load_world_script( register_event(env, "on_inventory_closed", prefix + ":.inventoryclosed"); } +void scripting::load_main_script( + const scriptenv& senv, + const std::string& prefix, + const io::path& file, + const std::string& fileName, + MainFuncsSet& funcsset +) { + int env = *senv; + lua::pop(lua::get_main_state(), load_script(env, "main", file, fileName)); + + register_event(env, "on_content_initialization", prefix + ":.oncontentinitialization"); + register_event(env, "on_content_loading", prefix + ":.oncontentloading"); + register_event(env, "on_content_loaded", prefix + ":.oncontentloaded"); +} + void scripting::load_layout_script( const scriptenv& senv, const std::string& prefix, diff --git a/src/logic/scripting/scripting.hpp b/src/logic/scripting/scripting.hpp index db27e8873..90f5ac1ea 100644 --- a/src/logic/scripting/scripting.hpp +++ b/src/logic/scripting/scripting.hpp @@ -27,6 +27,7 @@ struct BlockFuncNamesCache; struct ItemFuncsSet; struct ItemFuncNamesCache; struct WorldFuncsSet; +struct MainFuncsSet; struct UserComponent; struct UiDocScript; class BlocksController; @@ -160,6 +161,15 @@ namespace scripting { /// @brief Called on UI view close void on_ui_close(UiDocument* layout, Inventory* inventory); + /// @brief Called before loading + void on_content_initialization(); + + /// @brief Called on Content loading + void on_content_loading(); + + /// @brief Called on Content loading finish + void on_content_loaded(); + /// @brief Load script associated with a Block /// @param env environment /// @param prefix pack id @@ -221,6 +231,14 @@ namespace scripting { WorldFuncsSet& funcsset ); + void load_main_script( + const scriptenv& env, + const std::string& packid, + const io::path& file, + const std::string& fileName, + MainFuncsSet& funcsset + ); + /// @brief Load script associated with an UiDocument /// @param env environment /// @param prefix pack id From 89a6747c218e49cfd6d05c636dd2e02288153a15 Mon Sep 17 00:00:00 2001 From: Xertis <118364459+Xertis@users.noreply.github.com> Date: Sun, 22 Mar 2026 22:59:57 +0300 Subject: [PATCH 2/8] rename on_content_loading to on_scripts_loading --- src/content/ContentLoader.cpp | 2 +- src/content/ContentPack.hpp | 4 +++- src/logic/scripting/scripting.cpp | 6 +++--- src/logic/scripting/scripting.hpp | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index 47af7232a..ee2903bb6 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -497,7 +497,7 @@ void ContentLoader::loadWorldScript(ContentPackRuntime& runtime) { } void ContentLoader::loadScripts(Content& content) { - scripting::on_content_loading(); + scripting::on_scripts_loading(); load_scripts(content, content.blocks); load_scripts(content, content.items); diff --git a/src/content/ContentPack.hpp b/src/content/ContentPack.hpp index 146858f55..9940732fb 100644 --- a/src/content/ContentPack.hpp +++ b/src/content/ContentPack.hpp @@ -130,7 +130,9 @@ struct WorldFuncsSet { }; struct MainFuncsSet { - bool oncontentloading; + bool oncontentinitialization; + bool onscriptsloading; + bool oncontentloaded; }; class ContentPackRuntime { diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index b49f2c5ee..2be28695b 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -637,11 +637,11 @@ void scripting::on_content_initialization() { } } -void scripting::on_content_loading() { +void scripting::on_scripts_loading() { auto L = lua::get_main_state(); for (auto& pack : content_control->getAllContentPacks()) { - lua::emit_event(L, pack.id + ":.oncontentloading", [](auto L) { + lua::emit_event(L, pack.id + ":.onscriptsloading", [](auto L) { return 0; }); } @@ -804,7 +804,7 @@ void scripting::load_main_script( lua::pop(lua::get_main_state(), load_script(env, "main", file, fileName)); register_event(env, "on_content_initialization", prefix + ":.oncontentinitialization"); - register_event(env, "on_content_loading", prefix + ":.oncontentloading"); + register_event(env, "on_scripts_loading", prefix + ":.onscriptsloading"); register_event(env, "on_content_loaded", prefix + ":.oncontentloaded"); } diff --git a/src/logic/scripting/scripting.hpp b/src/logic/scripting/scripting.hpp index 90f5ac1ea..b9152921e 100644 --- a/src/logic/scripting/scripting.hpp +++ b/src/logic/scripting/scripting.hpp @@ -165,7 +165,7 @@ namespace scripting { void on_content_initialization(); /// @brief Called on Content loading - void on_content_loading(); + void on_scripts_loading(); /// @brief Called on Content loading finish void on_content_loaded(); From b0356212496394b06a50659c6f903e65150c6a23 Mon Sep 17 00:00:00 2001 From: Xertis <118364459+Xertis@users.noreply.github.com> Date: Mon, 23 Mar 2026 00:03:43 +0300 Subject: [PATCH 3/8] fixes --- src/content/ContentLoader.cpp | 13 +++++-------- src/content/ContentLoader.hpp | 2 +- src/content/ContentPack.hpp | 7 ------- src/logic/scripting/scripting.cpp | 18 +++--------------- src/logic/scripting/scripting.hpp | 9 ++------- 5 files changed, 11 insertions(+), 38 deletions(-) diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index ee2903bb6..b38d933fe 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -334,7 +334,7 @@ void ContentLoader::load() { fixPackIndices(); - loadMainScript(*runtime); + loadContentScript(*runtime); auto folder = pack->folder; @@ -342,8 +342,6 @@ void ContentLoader::load() { EnginePaths::CONFIG_DEFAULTS.string() ); - scripting::on_content_initialization(); - // Load world generators io::path generatorsDir = folder / "generators"; foreach_file(generatorsDir, [this](const io::path& file) { @@ -466,17 +464,16 @@ void ContentLoader::reloadScript(const Content& content, ItemDef& item) { load_script(content, item); } -void ContentLoader::loadMainScript(ContentPackRuntime& runtime) { +void ContentLoader::loadContentScript(ContentPackRuntime& runtime) { const auto& pack = runtime.getInfo(); const auto& folder = pack.folder; - io::path scriptFile = folder / "scripts/main.lua"; + io::path scriptFile = folder / "scripts/content.lua"; if (io::is_regular_file(scriptFile)) { - scripting::load_main_script( + scripting::load_content_script( runtime.getEnvironment(), pack.id, scriptFile, - pack.id + ":scripts/main.lua", - runtime.mainfuncsset + pack.id + ":scripts/content.lua" ); } } diff --git a/src/content/ContentLoader.hpp b/src/content/ContentLoader.hpp index 0dd292809..aa65478ae 100644 --- a/src/content/ContentLoader.hpp +++ b/src/content/ContentLoader.hpp @@ -58,7 +58,7 @@ public: void load(); static void loadScripts(Content& content); - static void loadMainScript(ContentPackRuntime& pack); + static void loadContentScript(ContentPackRuntime& pack); static void loadWorldScript(ContentPackRuntime& pack); static void reloadScript(const Content& content, Block& block); static void reloadScript(const Content& content, ItemDef& item); diff --git a/src/content/ContentPack.hpp b/src/content/ContentPack.hpp index 9940732fb..a4548d038 100644 --- a/src/content/ContentPack.hpp +++ b/src/content/ContentPack.hpp @@ -129,19 +129,12 @@ struct WorldFuncsSet { bool oninventoryclosed; }; -struct MainFuncsSet { - bool oncontentinitialization; - bool onscriptsloading; - bool oncontentloaded; -}; - class ContentPackRuntime { ContentPack info; ContentPackStats stats {}; scriptenv env; public: WorldFuncsSet worldfuncsset {}; - MainFuncsSet mainfuncsset {}; ContentPackRuntime(ContentPack info, scriptenv env); ~ContentPackRuntime(); diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index 2be28695b..bba9f6837 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -627,16 +627,6 @@ void scripting::on_ui_close(UiDocument* layout, Inventory* inventory) { }); } -void scripting::on_content_initialization() { - auto L = lua::get_main_state(); - - for (auto& pack : content_control->getAllContentPacks()) { - lua::emit_event(L, pack.id + ":.oncontentinitialization", [](auto L) { - return 0; - }); - } -} - void scripting::on_scripts_loading() { auto L = lua::get_main_state(); @@ -793,17 +783,15 @@ void scripting::load_world_script( register_event(env, "on_inventory_closed", prefix + ":.inventoryclosed"); } -void scripting::load_main_script( +void scripting::load_content_script( const scriptenv& senv, const std::string& prefix, const io::path& file, - const std::string& fileName, - MainFuncsSet& funcsset + const std::string& fileName ) { int env = *senv; - lua::pop(lua::get_main_state(), load_script(env, "main", file, fileName)); + lua::pop(lua::get_main_state(), load_script(env, "content", file, fileName)); - register_event(env, "on_content_initialization", prefix + ":.oncontentinitialization"); register_event(env, "on_scripts_loading", prefix + ":.onscriptsloading"); register_event(env, "on_content_loaded", prefix + ":.oncontentloaded"); } diff --git a/src/logic/scripting/scripting.hpp b/src/logic/scripting/scripting.hpp index b9152921e..9d29528b8 100644 --- a/src/logic/scripting/scripting.hpp +++ b/src/logic/scripting/scripting.hpp @@ -27,7 +27,6 @@ struct BlockFuncNamesCache; struct ItemFuncsSet; struct ItemFuncNamesCache; struct WorldFuncsSet; -struct MainFuncsSet; struct UserComponent; struct UiDocScript; class BlocksController; @@ -161,9 +160,6 @@ namespace scripting { /// @brief Called on UI view close void on_ui_close(UiDocument* layout, Inventory* inventory); - /// @brief Called before loading - void on_content_initialization(); - /// @brief Called on Content loading void on_scripts_loading(); @@ -231,12 +227,11 @@ namespace scripting { WorldFuncsSet& funcsset ); - void load_main_script( + void load_content_script( const scriptenv& env, const std::string& packid, const io::path& file, - const std::string& fileName, - MainFuncsSet& funcsset + const std::string& fileName ); /// @brief Load script associated with an UiDocument From b707c18931f2ebd7e9a0cff1e0d4703d5d29430d Mon Sep 17 00:00:00 2001 From: Xertis <118364459+Xertis@users.noreply.github.com> Date: Mon, 23 Mar 2026 00:23:04 +0300 Subject: [PATCH 4/8] doc update --- doc/en/scripting/events.md | 17 ++++++++++++++++- doc/ru/scripting/events.md | 16 ++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/doc/en/scripting/events.md b/doc/en/scripting/events.md index 504bde532..fe7d5eecb 100644 --- a/doc/en/scripting/events.md +++ b/doc/en/scripting/events.md @@ -180,6 +180,22 @@ function on_inventory_closed(invid: int, playerid: int) Called when the inventory is closed. +### CONTENT events + +Callbacks specified in *content.lua* script. + +```lua +function on_scripts_loading() +``` + +Called before the content pack scripts are loaded + +```lua +function on_content_loaded() +``` + +Called after the content pack has been fully loaded + ## Layout events Script *layouts/layout_name.xml.lua* events. @@ -202,7 +218,6 @@ Called on element removed from the screen. Callbacks specified in *hud.lua* script. - ```lua function on_hud_open(playerid: int) ``` diff --git a/doc/ru/scripting/events.md b/doc/ru/scripting/events.md index 116c73551..c71e58ecb 100644 --- a/doc/ru/scripting/events.md +++ b/doc/ru/scripting/events.md @@ -4,6 +4,7 @@ - [События блоков](#события-блоков) - [События предметов](#события-предметов) - [События мира](#события-мира) +- [События CONTENT](#События CONTENT) - [События макета](#события-макета) - [События HUD](#события-hud) - [События ECS](ecs.md#события-компонента) @@ -189,6 +190,21 @@ function on_inventory_closed(invid: int, playerid: int) Вызывается при закрытии инвентаря. +### События CONTENT + +События жизненного цикла контент-пака прописываются в файле `scripts/content.lua` + +```lua +function on_scripts_loading() +``` + +Вызывается перед загрузкой скриптов контент-пака + +```lua +function on_content_loaded() +``` + +Вызывается после того, как контент-пак был полностью загружен ## События макета From 4f7039730a96ab8391b5b4a6e1d14c94277f5b8d Mon Sep 17 00:00:00 2001 From: Xertis <118364459+Xertis@users.noreply.github.com> Date: Mon, 23 Mar 2026 00:26:06 +0300 Subject: [PATCH 5/8] Update events.md --- doc/ru/scripting/events.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ru/scripting/events.md b/doc/ru/scripting/events.md index c71e58ecb..2d8ed97a1 100644 --- a/doc/ru/scripting/events.md +++ b/doc/ru/scripting/events.md @@ -4,7 +4,7 @@ - [События блоков](#события-блоков) - [События предметов](#события-предметов) - [События мира](#события-мира) -- [События CONTENT](#События CONTENT) +- [События CONTENT](#события-content) - [События макета](#события-макета) - [События HUD](#события-hud) - [События ECS](ecs.md#события-компонента) From f486219a77ec5fb67c6c452d0d767a662a8977e7 Mon Sep 17 00:00:00 2001 From: Xertis <118364459+Xertis@users.noreply.github.com> Date: Mon, 23 Mar 2026 00:27:52 +0300 Subject: [PATCH 6/8] Update events.md --- doc/ru/scripting/events.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/doc/ru/scripting/events.md b/doc/ru/scripting/events.md index 2d8ed97a1..e8e76b2db 100644 --- a/doc/ru/scripting/events.md +++ b/doc/ru/scripting/events.md @@ -4,8 +4,8 @@ - [События блоков](#события-блоков) - [События предметов](#события-предметов) - [События мира](#события-мира) -- [События CONTENT](#события-content) - [События макета](#события-макета) +- [События CONTENT](#события-content) - [События HUD](#события-hud) - [События ECS](ecs.md#события-компонента) - [Библиотека *Events*](#библиотека-events) @@ -190,22 +190,6 @@ function on_inventory_closed(invid: int, playerid: int) Вызывается при закрытии инвентаря. -### События CONTENT - -События жизненного цикла контент-пака прописываются в файле `scripts/content.lua` - -```lua -function on_scripts_loading() -``` - -Вызывается перед загрузкой скриптов контент-пака - -```lua -function on_content_loaded() -``` - -Вызывается после того, как контент-пак был полностью загружен - ## События макета События прописываются в файле `layouts/имя_макета.xml.lua`. @@ -224,6 +208,22 @@ function on_close(invid: int) Вызывается при удалении элемента с экрана. +## События CONTENT + +События жизненного цикла контент-пака прописываются в файле `scripts/content.lua` + +```lua +function on_scripts_loading() +``` + +Вызывается перед загрузкой скриптов контент-пака + +```lua +function on_content_loaded() +``` + +Вызывается после того, как контент-пак был полностью загружен + ## События HUD События связанные с игровым интерфейсом прописываются в файле `scripts/hud.lua` From 4f80a56362b471da9fd2d68be18b426727365752 Mon Sep 17 00:00:00 2001 From: Xertis <118364459+Xertis@users.noreply.github.com> Date: Mon, 23 Mar 2026 00:28:57 +0300 Subject: [PATCH 7/8] Update en/events.md --- doc/en/scripting/events.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/doc/en/scripting/events.md b/doc/en/scripting/events.md index fe7d5eecb..0b61d5b4b 100644 --- a/doc/en/scripting/events.md +++ b/doc/en/scripting/events.md @@ -180,22 +180,6 @@ function on_inventory_closed(invid: int, playerid: int) Called when the inventory is closed. -### CONTENT events - -Callbacks specified in *content.lua* script. - -```lua -function on_scripts_loading() -``` - -Called before the content pack scripts are loaded - -```lua -function on_content_loaded() -``` - -Called after the content pack has been fully loaded - ## Layout events Script *layouts/layout_name.xml.lua* events. @@ -214,6 +198,22 @@ function on_close(invid: int) Called on element removed from the screen. +## CONTENT events + +Callbacks specified in *content.lua* script. + +```lua +function on_scripts_loading() +``` + +Called before the content pack scripts are loaded + +```lua +function on_content_loaded() +``` + +Called after the content pack has been fully loaded + ## HUD events Callbacks specified in *hud.lua* script. From 8b66b8890af97c21b2c2832122f54d919b2c5a82 Mon Sep 17 00:00:00 2001 From: Xertis <118364459+Xertis@users.noreply.github.com> Date: Thu, 2 Apr 2026 23:43:09 +0300 Subject: [PATCH 8/8] doc fixes --- doc/en/scripting/events.md | 2 +- doc/ru/scripting/events.md | 4 ++-- src/content/ContentLoader.cpp | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/doc/en/scripting/events.md b/doc/en/scripting/events.md index 0b61d5b4b..fea9de7df 100644 --- a/doc/en/scripting/events.md +++ b/doc/en/scripting/events.md @@ -198,7 +198,7 @@ function on_close(invid: int) Called on element removed from the screen. -## CONTENT events +## Content events Callbacks specified in *content.lua* script. diff --git a/doc/ru/scripting/events.md b/doc/ru/scripting/events.md index e8e76b2db..7dbe7bc07 100644 --- a/doc/ru/scripting/events.md +++ b/doc/ru/scripting/events.md @@ -5,7 +5,7 @@ - [События предметов](#события-предметов) - [События мира](#события-мира) - [События макета](#события-макета) -- [События CONTENT](#события-content) +- [События контента](#события-контента) - [События HUD](#события-hud) - [События ECS](ecs.md#события-компонента) - [Библиотека *Events*](#библиотека-events) @@ -208,7 +208,7 @@ function on_close(invid: int) Вызывается при удалении элемента с экрана. -## События CONTENT +## События контента События жизненного цикла контент-пака прописываются в файле `scripts/content.lua` diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index b38d933fe..5120f5c59 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -503,7 +503,6 @@ void ContentLoader::loadScripts(Content& content) { const auto& pack = runtime->getInfo(); const auto& folder = pack.folder; - // Load world script loadWorldScript(*runtime); // Load entity components