From 725740372ba8fb164b70478a15aa1aa3b6a518fa Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 15 Dec 2025 22:05:27 +0300 Subject: [PATCH] update ContentUnitIndices --- src/content/Content.cpp | 6 +++--- src/content/Content.hpp | 35 +++++++++++++++++++------------ src/content/ContentReport.cpp | 4 ++-- src/content/ContentReport.hpp | 2 +- src/logic/scripting/scripting.cpp | 4 ++-- src/typedefs.hpp | 1 + src/voxels/GlobalChunks.cpp | 2 +- src/voxels/Pathfinding.hpp | 6 ++++-- src/world/files/WorldFiles.cpp | 4 ++-- 9 files changed, 38 insertions(+), 26 deletions(-) diff --git a/src/content/Content.cpp b/src/content/Content.cpp index c00934916..0c697fd1d 100644 --- a/src/content/Content.cpp +++ b/src/content/Content.cpp @@ -15,9 +15,9 @@ #include "ContentPack.hpp" ContentIndices::ContentIndices( - ContentUnitIndices blocks, - ContentUnitIndices items, - ContentUnitIndices entities + ContentUnitIndices blocks, + ContentUnitIndices items, + ContentUnitIndices entities ) : blocks(std::move(blocks)), items(std::move(items)), diff --git a/src/content/Content.hpp b/src/content/Content.hpp index 599d50fec..12dc77d2f 100644 --- a/src/content/Content.hpp +++ b/src/content/Content.hpp @@ -36,48 +36,57 @@ public: } }; -template +template class ContentUnitIndices { std::vector defs; public: ContentUnitIndices(std::vector defs) : defs(std::move(defs)) { } - inline const T* get(blockid_t id) const { + const T* get(IdType id) const { if (id >= defs.size()) { return nullptr; } return defs[id]; } - inline const T& require(blockid_t id) const { - return *defs.at(id); + const T& require(IdType id) const { + if (id >= defs.size()) { + invalidId(id); + } + return *defs[id]; } - inline size_t count() const { + size_t count() const { return defs.size(); } - inline const auto& getIterable() const { + const auto& getIterable() const { return defs; } - inline const T* const* getDefs() const { + const T* const* getDefs() const { return defs.data(); } +private: + void invalidId(IdType id) const { + throw std::runtime_error( + "invalid content unit id: " + std::to_string(id) + ); + } }; /// @brief Runtime defs cache: indices class ContentIndices { public: - ContentUnitIndices blocks; - ContentUnitIndices items; - ContentUnitIndices entities; + ContentUnitIndices blocks; + ContentUnitIndices items; + ContentUnitIndices entities; ContentIndices( - ContentUnitIndices blocks, - ContentUnitIndices items, - ContentUnitIndices entities + ContentUnitIndices blocks, + ContentUnitIndices items, + ContentUnitIndices entities ); }; diff --git a/src/content/ContentReport.cpp b/src/content/ContentReport.cpp index a8ecad402..2b04bbf37 100644 --- a/src/content/ContentReport.cpp +++ b/src/content/ContentReport.cpp @@ -22,9 +22,9 @@ ContentReport::ContentReport( regionsVersion(regionsVersion) { } -template +template static constexpr size_t get_entries_count( - const ContentUnitIndices& indices, const dv::value& list + const ContentUnitIndices& indices, const dv::value& list ) { return list != nullptr ? std::max(list.size(), indices.count()) : indices.count(); diff --git a/src/content/ContentReport.hpp b/src/content/ContentReport.hpp index 325e5f29e..9f9e4ac78 100644 --- a/src/content/ContentReport.hpp +++ b/src/content/ContentReport.hpp @@ -51,7 +51,7 @@ class ContentUnitLUT { public: ContentUnitLUT( size_t count, - const ContentUnitIndices& unitIndices, + const ContentUnitIndices& unitIndices, T missingValue, ContentType type ) diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index 15c4e85e7..4af1a4287 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -253,9 +253,9 @@ void scripting::process_post_runnables() { } } -template +template static int push_properties_tables( - lua::State* L, const ContentUnitIndices& indices + lua::State* L, const ContentUnitIndices& indices ) { const auto units = indices.getDefs(); size_t size = indices.count(); diff --git a/src/typedefs.hpp b/src/typedefs.hpp index f075e9984..6984a943f 100644 --- a/src/typedefs.hpp +++ b/src/typedefs.hpp @@ -21,6 +21,7 @@ using ubyte = uint8_t; // content indices using itemid_t = uint32_t; using blockid_t = uint16_t; +using entitydefid_t = uint16_t; using entityid_t = uint64_t; using itemcount_t = uint32_t; diff --git a/src/voxels/GlobalChunks.cpp b/src/voxels/GlobalChunks.cpp index cbde6f9c6..6d19dda79 100644 --- a/src/voxels/GlobalChunks.cpp +++ b/src/voxels/GlobalChunks.cpp @@ -70,7 +70,7 @@ void GlobalChunks::erase(int x, int z) { static inline auto load_inventories( WorldRegions& regions, const Chunk& chunk, - const ContentUnitIndices& defs + const ContentUnitIndices& defs ) { auto invs = regions.fetchInventories(chunk.x, chunk.z); auto iterator = invs.begin(); diff --git a/src/voxels/Pathfinding.hpp b/src/voxels/Pathfinding.hpp index 9c172c7df..2e079076e 100644 --- a/src/voxels/Pathfinding.hpp +++ b/src/voxels/Pathfinding.hpp @@ -11,11 +11,13 @@ #include #include +#include "typedefs.hpp" + class Block; class Level; class GlobalChunks; -template +template class ContentUnitIndices; namespace voxels { @@ -82,7 +84,7 @@ namespace voxels { private: const Level& level; const GlobalChunks& chunks; - const ContentUnitIndices& blockDefs; + const ContentUnitIndices& blockDefs; std::unordered_map agents; int nextAgent = 1; diff --git a/src/world/files/WorldFiles.cpp b/src/world/files/WorldFiles.cpp index e4137f034..8e471772a 100644 --- a/src/world/files/WorldFiles.cpp +++ b/src/world/files/WorldFiles.cpp @@ -104,9 +104,9 @@ void WorldFiles::writePacks(const std::vector& packs) { io::write_string(packsFile, ss.str()); } -template +template static void write_indices( - const ContentUnitIndices& indices, dv::value& list + const ContentUnitIndices& indices, dv::value& list ) { for (auto unit : indices.getIterable()) { list.add(unit->name);