From 4c3ce8c1747b6c18e956ff231d8b86b3566ca1bd Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 14 Oct 2024 07:18:24 +0300 Subject: [PATCH] add resource-aliases.json --- res/content/base/resource-aliases.json | 8 ++++++++ src/content/Content.hpp | 11 ++++++++++- src/content/ContentLoader.cpp | 22 ++++++++++++++++++++++ src/content/ContentLoader.hpp | 1 + 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 res/content/base/resource-aliases.json diff --git a/res/content/base/resource-aliases.json b/res/content/base/resource-aliases.json new file mode 100644 index 00000000..1d51f5c3 --- /dev/null +++ b/res/content/base/resource-aliases.json @@ -0,0 +1,8 @@ +{ + "camera": { + "base:first-person": "core:first-person", + "base:third-person-front": "core:third-person-front", + "base:third-person-back": "core:third-person-back", + "base:cinematic": "core:cinematic" + } +} diff --git a/src/content/Content.hpp b/src/content/Content.hpp index 9c9c9743..3a836c4e 100644 --- a/src/content/Content.hpp +++ b/src/content/Content.hpp @@ -137,12 +137,21 @@ public: static constexpr size_t MISSING = SIZE_MAX; - void add(std::string name, dv::value map) { + void add(const std::string& name, dv::value map) { indices[name] = names.size(); names.push_back(name); savedData->push_back(std::move(map)); } + void addAlias(const std::string& name, const std::string& alias) { + size_t index = indexOf(name); + if (index == MISSING) { + throw std::runtime_error( + "resource does not exists: "+name); + } + indices[alias] = index; + } + const std::string& getName(size_t index) const { return names.at(index); } diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index 89fabec0..7a772d84 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -790,6 +790,20 @@ void ContentLoader::load() { } } + // Load pack resources aliases + fs::path aliasesFile = folder / fs::u8path("resource-aliases.json"); + if (fs::exists(aliasesFile)) { + auto resRoot = files::read_json(aliasesFile); + for (const auto& [key, arr] : resRoot.asObject()) { + if (auto resType = ResourceType_from(key)) { + loadResourceAliases(*resType, arr); + } else { + // Ignore unknown resources + logger.warning() << "unknown resource type: " << key; + } + } + } + // Load block materials fs::path materialsDir = folder / fs::u8path("block_materials"); if (fs::is_directory(materialsDir)) { @@ -835,3 +849,11 @@ void ContentLoader::loadResources(ResourceType type, const dv::value& list) { ); } } + +void ContentLoader::loadResourceAliases(ResourceType type, const dv::value& aliases) { + for (const auto& [alias, name] : aliases.asObject()) { + builder.resourceIndices[static_cast(type)].addAlias( + name.asString(), alias + ); + } +} diff --git a/src/content/ContentLoader.hpp b/src/content/ContentLoader.hpp index 0f904172..1b011cbb 100644 --- a/src/content/ContentLoader.hpp +++ b/src/content/ContentLoader.hpp @@ -54,6 +54,7 @@ class ContentLoader { EntityDef& def, const std::string& name, const fs::path& file ); void loadResources(ResourceType type, const dv::value& list); + void loadResourceAliases(ResourceType type, const dv::value& aliases); void loadContent(const dv::value& map); public: