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} };