update generators scanning
This commit is contained in:
parent
39030efd74
commit
c46090f881
@ -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 = {}
|
||||
@ -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<std::string> ContentLoader::scanContent(
|
||||
const ContentPack& pack, ContentType type
|
||||
) {
|
||||
std::vector<std::string> detected;
|
||||
detect_defs(pack.folder / ContentPack::getFolderFor(type), pack.id, detected);
|
||||
return detected;
|
||||
}
|
||||
|
||||
bool ContentLoader::fixPackIndices(
|
||||
const fs::path& folder,
|
||||
dv::value& indicesRoot,
|
||||
|
||||
@ -63,6 +63,11 @@ public:
|
||||
dv::value& indicesRoot,
|
||||
const std::string& contentSection
|
||||
);
|
||||
|
||||
static std::vector<std::string> scanContent(
|
||||
const ContentPack& pack, ContentType type
|
||||
);
|
||||
|
||||
void fixPackIndices();
|
||||
void load();
|
||||
};
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
#include <vector>
|
||||
|
||||
#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<std::string> 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 {
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user