From 614d5f4ae4ad05278a62385fbfaadcf66f351664 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 17 Nov 2025 17:58:16 +0300 Subject: [PATCH 1/5] add app.get_content_sources, app.set_content_sources --- src/content/ContentControl.cpp | 27 +++++++++++++++++++------ src/content/ContentControl.hpp | 9 +++++---- src/content/PacksManager.cpp | 4 ++++ src/content/PacksManager.hpp | 3 +++ src/logic/scripting/lua/libs/libapp.cpp | 22 ++++++++++++++++++++ 5 files changed, 55 insertions(+), 10 deletions(-) diff --git a/src/content/ContentControl.cpp b/src/content/ContentControl.cpp index c887baa6..4a7ed14f 100644 --- a/src/content/ContentControl.cpp +++ b/src/content/ContentControl.cpp @@ -16,6 +16,13 @@ static void load_configs(Input& input, const io::path& root) { auto configFolder = root / "config"; } +static std::vector default_content_sources { + "world:content", + "user:content", + "project:content", + "res:content", +}; + ContentControl::ContentControl( const Project& project, EnginePaths& paths, @@ -27,12 +34,7 @@ ContentControl::ContentControl( postContent(std::move(postContent)), basePacks(project.basePacks), manager(std::make_unique()) { - manager->setSources({ - "world:content", - "user:content", - "project:content", - "res:content", - }); + manager->setSources(default_content_sources); } ContentControl::~ContentControl() = default; @@ -68,6 +70,7 @@ void ContentControl::resetContent(const std::vector& nonReset) { scripting::on_content_reset(); setContentPacksRaw(manager->getAll(basePacks)); + resetContentSources(); postContent(); } @@ -139,3 +142,15 @@ PacksManager& ContentControl::scan() { manager->scan(); return *manager; } + +void ContentControl::setContentSources(std::vector sources) { + manager->setSources(std::move(sources)); +} + +void ContentControl::resetContentSources() { + manager->setSources(default_content_sources); +} + +const std::vector& ContentControl::getContentSources() const { + return manager->getSources(); +} diff --git a/src/content/ContentControl.hpp b/src/content/ContentControl.hpp index f066601e..1d1d48fc 100644 --- a/src/content/ContentControl.hpp +++ b/src/content/ContentControl.hpp @@ -5,6 +5,7 @@ #include #include +#include "io/path.hpp" #include "ContentPack.hpp" class Content; @@ -13,10 +14,6 @@ class EnginePaths; class Input; struct Project; -namespace io { - class path; -} - class ContentControl { public: ContentControl( @@ -46,6 +43,10 @@ public: const std::vector& getAllContentPacks() const; PacksManager& scan(); + + void setContentSources(std::vector sources); + void resetContentSources(); + const std::vector& getContentSources() const; private: EnginePaths& paths; Input& input; diff --git a/src/content/PacksManager.cpp b/src/content/PacksManager.cpp index 12276717..36f66146 100644 --- a/src/content/PacksManager.cpp +++ b/src/content/PacksManager.cpp @@ -9,6 +9,10 @@ PacksManager::PacksManager() = default; +const std::vector& PacksManager::getSources() const { + return sources; +} + void PacksManager::setSources(std::vector sources) { this->sources = std::move(sources); } diff --git a/src/content/PacksManager.hpp b/src/content/PacksManager.hpp index 94ce7bdc..6f2fb732 100644 --- a/src/content/PacksManager.hpp +++ b/src/content/PacksManager.hpp @@ -12,6 +12,9 @@ class PacksManager { public: PacksManager(); + /// @brief Get current content packs sources + const std::vector& getSources() const; + /// @brief Set content packs sources (search folders) void setSources(std::vector sources); diff --git a/src/logic/scripting/lua/libs/libapp.cpp b/src/logic/scripting/lua/libs/libapp.cpp index fae18bb6..d478a30e 100644 --- a/src/logic/scripting/lua/libs/libapp.cpp +++ b/src/logic/scripting/lua/libs/libapp.cpp @@ -2,6 +2,11 @@ #include "io/io.hpp" #include "io/devices/MemoryDevice.hpp" +#include "engine/Engine.hpp" +#include "content/ContentControl.hpp" +#include "logic/scripting/scripting.hpp" + +using namespace scripting; static int l_create_memory_device(lua::State* L) { std::string name = lua::require_string(L, 1); @@ -18,8 +23,25 @@ static int l_create_memory_device(lua::State* L) { return 0; } +static int l_get_content_sources(lua::State* L) { + const auto& sources = engine->getContentControl().getContentSources(); + lua::createtable(L, static_cast(sources.size()), 0); + for (size_t i = 0; i < sources.size(); i++) { + lua::pushlstring(L, sources[i].string()); + lua::rawseti(L, static_cast(i + 1)); + } + return 1; +} + +static int l_set_content_sources(lua::State* L) { + engine->getContentControl().resetContentSources(); + return 0; +} + const luaL_Reg applib[] = { {"create_memory_device", lua::wrap}, + {"get_content_sources", lua::wrap}, + {"set_content_sources", lua::wrap}, // see libcore.cpp an stdlib.lua {nullptr, nullptr} }; From eb1a95548300efa87d86787a1affe37a18835b72 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 17 Nov 2025 18:17:13 +0300 Subject: [PATCH 2/5] update doc/*/scripting/builtins/libapp.md --- doc/en/scripting/builtins/libapp.md | 12 ++++++++++++ doc/ru/scripting/builtins/libapp.md | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/doc/en/scripting/builtins/libapp.md b/doc/en/scripting/builtins/libapp.md index 2dd78361..7151912e 100644 --- a/doc/en/scripting/builtins/libapp.md +++ b/doc/en/scripting/builtins/libapp.md @@ -168,3 +168,15 @@ app.create_memory_device( ``` Creates an in-memory filesystem. + +```lua +app.get_content_sources() -> table +``` + +Returns a list of content sources (paths), in descending priority order. + +``lua +app.set_content_sources(sources: table) +``` + +Sets a list of content sources (paths). Specified in descending priority order. diff --git a/doc/ru/scripting/builtins/libapp.md b/doc/ru/scripting/builtins/libapp.md index ddd91f14..12de257a 100644 --- a/doc/ru/scripting/builtins/libapp.md +++ b/doc/ru/scripting/builtins/libapp.md @@ -168,3 +168,15 @@ app.create_memory_device( ``` Создаёт файловую систему в памяти. + +```lua +app.get_content_sources() -> table +``` + +Возвращает список источников контента (путей), в порядке убывания приоритета. + +```lua +app.set_content_sources(sources: table) +``` + +Устанавливает список источников контента (путей). Указывается в порядке убывания приоритета. From 222d4d3fc66a14e916c6e4da47b89bec0a5668d0 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 17 Nov 2025 18:35:36 +0300 Subject: [PATCH 3/5] add actual app.set_content_sources --- src/logic/scripting/lua/libs/libapp.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/logic/scripting/lua/libs/libapp.cpp b/src/logic/scripting/lua/libs/libapp.cpp index d478a30e..da33dcf5 100644 --- a/src/logic/scripting/lua/libs/libapp.cpp +++ b/src/logic/scripting/lua/libs/libapp.cpp @@ -34,6 +34,21 @@ static int l_get_content_sources(lua::State* L) { } static int l_set_content_sources(lua::State* L) { + if (!lua::istable(L, 1)) { + throw std::runtime_error("table expected as argument 1"); + } + int len = lua::objlen(L, 1); + std::vector sources; + for (int i = 0; i < len; i++) { + lua::rawgeti(L, i + 1); + sources.emplace_back(lua::require_lstring(L, -1)); + lua::pop(L); + } + engine->getContentControl().setContentSources(std::move(sources)); + return 0; +} + +static int l_reset_content_sources(lua::State* L) { engine->getContentControl().resetContentSources(); return 0; } @@ -42,6 +57,7 @@ const luaL_Reg applib[] = { {"create_memory_device", lua::wrap}, {"get_content_sources", lua::wrap}, {"set_content_sources", lua::wrap}, + {"reset_content_sources", lua::wrap}, // see libcore.cpp an stdlib.lua {nullptr, nullptr} }; From 1a04e319190788bfefb3ef2b3fe93505d756dfec Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 17 Nov 2025 18:36:57 +0300 Subject: [PATCH 4/5] update doc/*/scripting/builtins/libapp.md --- doc/en/scripting/builtins/libapp.md | 6 ++++++ doc/ru/scripting/builtins/libapp.md | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/doc/en/scripting/builtins/libapp.md b/doc/en/scripting/builtins/libapp.md index 7151912e..2b5a74cd 100644 --- a/doc/en/scripting/builtins/libapp.md +++ b/doc/en/scripting/builtins/libapp.md @@ -180,3 +180,9 @@ app.set_content_sources(sources: table) ``` Sets a list of content sources (paths). Specified in descending priority order. + +``lua +app.reset_content_sources() +``` + +Resets content sources. diff --git a/doc/ru/scripting/builtins/libapp.md b/doc/ru/scripting/builtins/libapp.md index 12de257a..128232bf 100644 --- a/doc/ru/scripting/builtins/libapp.md +++ b/doc/ru/scripting/builtins/libapp.md @@ -180,3 +180,9 @@ app.set_content_sources(sources: table) ``` Устанавливает список источников контента (путей). Указывается в порядке убывания приоритета. + +```lua +app.reset_content_sources() +``` + +Сбрасывает список источников контента. From bc229a39a12f25198c2927b750a4324289e1b2fe Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 17 Nov 2025 18:39:38 +0300 Subject: [PATCH 5/5] fix --- src/logic/scripting/lua/libs/libapp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/logic/scripting/lua/libs/libapp.cpp b/src/logic/scripting/lua/libs/libapp.cpp index da33dcf5..7837c0a4 100644 --- a/src/logic/scripting/lua/libs/libapp.cpp +++ b/src/logic/scripting/lua/libs/libapp.cpp @@ -41,7 +41,7 @@ static int l_set_content_sources(lua::State* L) { std::vector sources; for (int i = 0; i < len; i++) { lua::rawgeti(L, i + 1); - sources.emplace_back(lua::require_lstring(L, -1)); + sources.emplace_back(std::string(lua::require_lstring(L, -1))); lua::pop(L); } engine->getContentControl().setContentSources(std::move(sources));