From c46090f881e1c7d85d9c9b864ff38bdf1eb1aac6 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 27 Sep 2024 23:55:14 +0300 Subject: [PATCH] update generators scanning --- .../{demo => demo.files}/biomes.json | 0 .../fragments/coal_ore0.vox | Bin .../{demo => demo.files}/fragments/tower.vox | Bin .../{demo => demo.files}/fragments/tree0.vox | Bin .../{demo => demo.files}/fragments/tree1.vox | Bin .../{demo => demo.files}/fragments/tree2.vox | Bin .../{demo => demo.files}/script.lua | 2 +- .../{demo => demo.files}/structures.json | 0 .../{default => default.files}/script.lua | 0 src/content/ContentLoader.cpp | 11 ++++++++- src/content/ContentLoader.hpp | 5 ++++ src/content/ContentPack.hpp | 12 +++++++++ src/content/loading/GeneratorLoader.cpp | 2 +- src/logic/scripting/lua/libcore.cpp | 23 +++++++++++++----- 14 files changed, 46 insertions(+), 9 deletions(-) rename res/content/base/generators/{demo => demo.files}/biomes.json (100%) rename res/content/base/generators/{demo => demo.files}/fragments/coal_ore0.vox (100%) rename res/content/base/generators/{demo => demo.files}/fragments/tower.vox (100%) rename res/content/base/generators/{demo => demo.files}/fragments/tree0.vox (100%) rename res/content/base/generators/{demo => demo.files}/fragments/tree1.vox (100%) rename res/content/base/generators/{demo => demo.files}/fragments/tree2.vox (100%) rename res/content/base/generators/{demo => demo.files}/script.lua (96%) rename res/content/base/generators/{demo => demo.files}/structures.json (100%) rename res/generators/{default => default.files}/script.lua (100%) diff --git a/res/content/base/generators/demo/biomes.json b/res/content/base/generators/demo.files/biomes.json similarity index 100% rename from res/content/base/generators/demo/biomes.json rename to res/content/base/generators/demo.files/biomes.json diff --git a/res/content/base/generators/demo/fragments/coal_ore0.vox b/res/content/base/generators/demo.files/fragments/coal_ore0.vox similarity index 100% rename from res/content/base/generators/demo/fragments/coal_ore0.vox rename to res/content/base/generators/demo.files/fragments/coal_ore0.vox diff --git a/res/content/base/generators/demo/fragments/tower.vox b/res/content/base/generators/demo.files/fragments/tower.vox similarity index 100% rename from res/content/base/generators/demo/fragments/tower.vox rename to res/content/base/generators/demo.files/fragments/tower.vox diff --git a/res/content/base/generators/demo/fragments/tree0.vox b/res/content/base/generators/demo.files/fragments/tree0.vox similarity index 100% rename from res/content/base/generators/demo/fragments/tree0.vox rename to res/content/base/generators/demo.files/fragments/tree0.vox diff --git a/res/content/base/generators/demo/fragments/tree1.vox b/res/content/base/generators/demo.files/fragments/tree1.vox similarity index 100% rename from res/content/base/generators/demo/fragments/tree1.vox rename to res/content/base/generators/demo.files/fragments/tree1.vox diff --git a/res/content/base/generators/demo/fragments/tree2.vox b/res/content/base/generators/demo.files/fragments/tree2.vox similarity index 100% rename from res/content/base/generators/demo/fragments/tree2.vox rename to res/content/base/generators/demo.files/fragments/tree2.vox diff --git a/res/content/base/generators/demo/script.lua b/res/content/base/generators/demo.files/script.lua similarity index 96% rename from res/content/base/generators/demo/script.lua rename to res/content/base/generators/demo.files/script.lua index 7744882f..a254c664 100644 --- a/res/content/base/generators/demo/script.lua +++ b/res/content/base/generators/demo.files/script.lua @@ -1,4 +1,4 @@ -biomes = json.parse(file.read("base:generators/demo/biomes.json")) +biomes = json.parse(file.read("base:generators/demo.files/biomes.json")) function place_structures(x, z, w, d, seed, hmap) local placements = {} diff --git a/res/content/base/generators/demo/structures.json b/res/content/base/generators/demo.files/structures.json similarity index 100% rename from res/content/base/generators/demo/structures.json rename to res/content/base/generators/demo.files/structures.json diff --git a/res/generators/default/script.lua b/res/generators/default.files/script.lua similarity index 100% rename from res/generators/default/script.lua rename to res/generators/default.files/script.lua diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index 93a3aa6b..bd811074 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -51,13 +51,22 @@ static void detect_defs( } if (fs::is_regular_file(file) && files::is_data_file(file)) { detected.push_back(prefix.empty() ? name : prefix + ":" + name); - } else if (fs::is_directory(file)) { + } else if (fs::is_directory(file) && + file.extension() != fs::u8path(".files")) { detect_defs(file, name, detected); } } } } +std::vector ContentLoader::scanContent( + const ContentPack& pack, ContentType type +) { + std::vector detected; + detect_defs(pack.folder / ContentPack::getFolderFor(type), pack.id, detected); + return detected; +} + bool ContentLoader::fixPackIndices( const fs::path& folder, dv::value& indicesRoot, diff --git a/src/content/ContentLoader.hpp b/src/content/ContentLoader.hpp index b252d2a8..762b3fbe 100644 --- a/src/content/ContentLoader.hpp +++ b/src/content/ContentLoader.hpp @@ -63,6 +63,11 @@ public: dv::value& indicesRoot, const std::string& contentSection ); + + static std::vector scanContent( + const ContentPack& pack, ContentType type + ); + void fixPackIndices(); void load(); }; diff --git a/src/content/ContentPack.hpp b/src/content/ContentPack.hpp index 7815d009..7b7b19e8 100644 --- a/src/content/ContentPack.hpp +++ b/src/content/ContentPack.hpp @@ -6,6 +6,7 @@ #include #include "typedefs.hpp" +#include "content_fwd.hpp" class EnginePaths; @@ -51,6 +52,7 @@ struct ContentPack { static inline const fs::path BLOCKS_FOLDER = "blocks"; static inline const fs::path ITEMS_FOLDER = "items"; static inline const fs::path ENTITIES_FOLDER = "entities"; + static inline const fs::path GENERATORS_FOLDER = "generators"; static const std::vector RESERVED_NAMES; static bool is_pack(const fs::path& folder); @@ -69,6 +71,16 @@ struct ContentPack { ); static ContentPack createCore(const EnginePaths*); + + static inline fs::path getFolderFor(ContentType type) { + switch (type) { + case ContentType::BLOCK: return ContentPack::BLOCKS_FOLDER; + case ContentType::ITEM: return ContentPack::ITEMS_FOLDER; + case ContentType::ENTITY: return ContentPack::ENTITIES_FOLDER; + case ContentType::GENERATOR: return ContentPack::GENERATORS_FOLDER; + case ContentType::NONE: return fs::u8path(""); + } + } }; struct ContentPackStats { diff --git a/src/content/loading/GeneratorLoader.cpp b/src/content/loading/GeneratorLoader.cpp index 5342c081..28ff2f30 100644 --- a/src/content/loading/GeneratorLoader.cpp +++ b/src/content/loading/GeneratorLoader.cpp @@ -74,7 +74,7 @@ void ContentLoader::loadGenerator( map.at("biome_parameters").get(def.biomeParameters); map.at("sea_level").get(def.seaLevel); - auto folder = generatorsDir / fs::u8path(name); + auto folder = generatorsDir / fs::u8path(name + ".files"); auto scriptFile = folder / fs::u8path("script.lua"); auto structuresFile = folder / STRUCTURES_FILE; diff --git a/src/logic/scripting/lua/libcore.cpp b/src/logic/scripting/lua/libcore.cpp index 38267e4d..5f04ff64 100644 --- a/src/logic/scripting/lua/libcore.cpp +++ b/src/logic/scripting/lua/libcore.cpp @@ -4,6 +4,7 @@ #include "constants.hpp" #include "engine.hpp" #include "content/Content.hpp" +#include "content/ContentLoader.hpp" #include "files/engine_paths.hpp" #include "files/settings_io.hpp" #include "frontend/menu.hpp" @@ -14,6 +15,8 @@ #include "window/Window.hpp" #include "world/generator/WorldGenerator.hpp" #include "world/Level.hpp" +#include "util/listutil.hpp" + #include "api_lua.hpp" using namespace scripting; @@ -180,18 +183,26 @@ static int l_get_default_generator(lua::State* L) { /// @brief Get a list of all world generators /// @return A table with the IDs of all world generators static int l_get_generators(lua::State* L) { - if (content == nullptr) { - throw std::runtime_error("content is not initialized"); - } - const auto& generators = content->generators.getDefs(); - lua::createtable(L, generators.size(), 0); + const auto& packs = engine->getContentPacks(); + + lua::createtable(L, 0, 0); int i = 0; - for (auto& [name, _] : generators) { + auto names = ContentLoader::scanContent( + ContentPack::createCore(engine->getPaths()), ContentType::GENERATOR); + for (const auto& name : names) { lua::pushstring(L, name); lua::rawseti(L, i + 1); i++; } + for (const auto& pack : packs) { + auto names = ContentLoader::scanContent(pack, ContentType::GENERATOR); + for (const auto& name : names) { + lua::pushstring(L, name); + lua::rawseti(L, i + 1); + i++; + } + } return 1; }