diff --git a/doc/en/scripting/builtins/libapp.md b/doc/en/scripting/builtins/libapp.md index 2dd78361..2b5a74cd 100644 --- a/doc/en/scripting/builtins/libapp.md +++ b/doc/en/scripting/builtins/libapp.md @@ -168,3 +168,21 @@ 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. + +``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 ddd91f14..128232bf 100644 --- a/doc/ru/scripting/builtins/libapp.md +++ b/doc/ru/scripting/builtins/libapp.md @@ -168,3 +168,21 @@ app.create_memory_device( ``` Создаёт файловую систему в памяти. + +```lua +app.get_content_sources() -> table +``` + +Возвращает список источников контента (путей), в порядке убывания приоритета. + +```lua +app.set_content_sources(sources: table) +``` + +Устанавливает список источников контента (путей). Указывается в порядке убывания приоритета. + +```lua +app.reset_content_sources() +``` + +Сбрасывает список источников контента. 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..7837c0a4 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,41 @@ 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) { + 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(std::string(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; +} + 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} };