From e9076f22fe2a49d1cd8933e54b7b00c5dd943269 Mon Sep 17 00:00:00 2001 From: untodesu Date: Fri, 12 Sep 2025 13:33:52 +0500 Subject: It compiles --- game/shared/world/item_registry.cc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'game/shared/world/item_registry.cc') diff --git a/game/shared/world/item_registry.cc b/game/shared/world/item_registry.cc index d1b9ff4..783c85e 100644 --- a/game/shared/world/item_registry.cc +++ b/game/shared/world/item_registry.cc @@ -14,7 +14,7 @@ world::ItemInfoBuilder::ItemInfoBuilder(std::string_view name) { prototype.name = name; prototype.texture = std::string(); - prototype.place_voxel = NULL_VOXEL_ID; + prototype.place_voxel = nullptr; prototype.cached_texture = nullptr; } @@ -25,7 +25,7 @@ world::ItemInfoBuilder& world::ItemInfoBuilder::set_texture(std::string_view tex return *this; } -world::ItemInfoBuilder& world::ItemInfoBuilder::set_place_voxel(voxel_id place_voxel) +world::ItemInfoBuilder& world::ItemInfoBuilder::set_place_voxel(const Voxel* place_voxel) { prototype.place_voxel = place_voxel; return *this; @@ -99,7 +99,10 @@ std::uint64_t world::item_registry::calculate_checksum(void) for(const auto& info : world::item_registry::items) { result = math::crc64(info->name, result); - result += static_cast(info->place_voxel); + + if(info->place_voxel) { + result += static_cast(info->place_voxel->get_id()); + } } return result; -- cgit From 73cbcdd6e8c849e32abbf9757e603e6a6654e870 Mon Sep 17 00:00:00 2001 From: untodesu Date: Fri, 12 Sep 2025 14:09:34 +0500 Subject: Metaitems --- game/shared/world/item_registry.cc | 101 +++++++++++-------------------------- 1 file changed, 30 insertions(+), 71 deletions(-) (limited to 'game/shared/world/item_registry.cc') diff --git a/game/shared/world/item_registry.cc b/game/shared/world/item_registry.cc index 783c85e..4e0932c 100644 --- a/game/shared/world/item_registry.cc +++ b/game/shared/world/item_registry.cc @@ -6,104 +6,63 @@ #include "shared/world/voxel_registry.hh" -std::unordered_map world::item_registry::builders = {}; +static std::uint64_t registry_checksum = 0U; std::unordered_map world::item_registry::names = {}; -std::vector> world::item_registry::items = {}; +std::vector> world::item_registry::items = {}; -world::ItemInfoBuilder::ItemInfoBuilder(std::string_view name) +static void recalculate_checksum(void) { - prototype.name = name; - prototype.texture = std::string(); - prototype.place_voxel = nullptr; - prototype.cached_texture = nullptr; -} + registry_checksum = 0U; -world::ItemInfoBuilder& world::ItemInfoBuilder::set_texture(std::string_view texture) -{ - prototype.texture = texture; - prototype.cached_texture = nullptr; - return *this; + for(const auto& item : world::item_registry::items) { + registry_checksum = item->get_checksum(registry_checksum); + } } -world::ItemInfoBuilder& world::ItemInfoBuilder::set_place_voxel(const Voxel* place_voxel) +world::Item* world::item_registry::register_item(const ItemBuilder& builder) { - prototype.place_voxel = place_voxel; - return *this; -} + assert(builder.get_name().size()); + assert(nullptr == find(builder.get_name())); -item_id world::ItemInfoBuilder::build(void) const -{ - const auto it = world::item_registry::names.find(prototype.name); + const auto id = static_cast(1 + items.size()); - if(it != world::item_registry::names.cend()) { - spdlog::warn("item_registry: cannot build {}: name already present", prototype.name); - return it->second; - } + std::unique_ptr item(builder.build(id)); + names.emplace(std::string(builder.get_name()), id); + items.push_back(std::move(item)); - auto new_info = std::make_shared(); - new_info->name = prototype.name; - new_info->texture = prototype.texture; - new_info->place_voxel = prototype.place_voxel; - new_info->cached_texture = nullptr; + recalculate_checksum(); - world::item_registry::items.push_back(new_info); - world::item_registry::names.insert_or_assign(prototype.name, static_cast(world::item_registry::items.size())); - - return static_cast(world::item_registry::items.size()); + return items.back().get(); } -world::ItemInfoBuilder& world::item_registry::construct(std::string_view name) +world::Item* world::item_registry::find(std::string_view name) { - const auto it = world::item_registry::builders.find(std::string(name)); - - if(it != world::item_registry::builders.cend()) { - return it->second; - } - else { - return world::item_registry::builders.emplace(std::string(name), ItemInfoBuilder(name)).first->second; - } -} + const auto it = names.find(std::string(name)); -world::ItemInfo* world::item_registry::find(std::string_view name) -{ - const auto it = world::item_registry::names.find(std::string(name)); - - if(it != world::item_registry::names.cend()) { - return world::item_registry::find(it->second); - } - else { + if(it == names.end()) { return nullptr; } + + return items[it->second - 1].get(); } -world::ItemInfo* world::item_registry::find(const item_id item) +world::Item* world::item_registry::find(const item_id item) { - if((item != NULL_ITEM_ID) && (item <= world::item_registry::items.size())) { - return world::item_registry::items[item - 1].get(); - } - else { + if(item == NULL_ITEM_ID || item > items.size()) { return nullptr; } + + return items[item - 1].get(); } void world::item_registry::purge(void) { - world::item_registry::builders.clear(); - world::item_registry::names.clear(); - world::item_registry::items.clear(); + registry_checksum = 0U; + items.clear(); + names.clear(); } -std::uint64_t world::item_registry::calculate_checksum(void) +std::uint64_t world::item_registry::get_checksum(void) { - std::uint64_t result = 0; - - for(const auto& info : world::item_registry::items) { - result = math::crc64(info->name, result); - - if(info->place_voxel) { - result += static_cast(info->place_voxel->get_id()); - } - } - - return result; + return registry_checksum; } -- cgit