From 3e6eb265a018fd0422b59ca9ea1b8918abee5c16 Mon Sep 17 00:00:00 2001 From: Mel Date: Thu, 15 Feb 2024 12:32:03 +0100 Subject: Not every valid block position is within a chunk, `ChunkRegistry::find` should reflect that --- src/World/ChunkRegistry.cpp | 7 ++++--- src/World/ChunkRegistry.hpp | 4 ++-- src/World/World.cpp | 12 ++++++------ 3 files changed, 12 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/World/ChunkRegistry.cpp b/src/World/ChunkRegistry.cpp index 97896fe..95ae6bd 100644 --- a/src/World/ChunkRegistry.cpp +++ b/src/World/ChunkRegistry.cpp @@ -14,11 +14,12 @@ ChunkRegistry::Data& ChunkRegistry::get(ChunkIndex index) { return entry->second; } -ChunkRegistry::Data& ChunkRegistry::find(Position::BlockWorld pos) { - return get(ChunkIndex::from_position(pos)); +ChunkRegistry::Data* ChunkRegistry::find(Position::BlockWorld pos) { + if (!Chunk::is_valid_position(pos.to_local())) return nullptr; + return &get(ChunkIndex::from_position(pos)); } -ChunkRegistry::Data& ChunkRegistry::find(Position::World pos) { +ChunkRegistry::Data* ChunkRegistry::find(Position::World pos) { return find(pos.round_to_block()); } diff --git a/src/World/ChunkRegistry.hpp b/src/World/ChunkRegistry.hpp index d583765..b6d1613 100644 --- a/src/World/ChunkRegistry.hpp +++ b/src/World/ChunkRegistry.hpp @@ -48,8 +48,8 @@ public: Data& get(ChunkIndex index); - Data& find(Position::BlockWorld pos); - Data& find(Position::World pos); + Data* find(Position::BlockWorld pos); + Data* find(Position::World pos); private: std::unordered_map m_chunks; }; diff --git a/src/World/World.cpp b/src/World/World.cpp index b5dae43..ff8d22e 100644 --- a/src/World/World.cpp +++ b/src/World/World.cpp @@ -42,18 +42,18 @@ std::vector World::get_visible_chunks(Time const& time, Po } Chunk::BlockData World::block_at(Position::BlockWorld pos) { - auto& data = m_registry.find(pos); - if (data.chunk.has_value()) return data.chunk->at(pos.to_local()); + auto data = m_registry.find(pos); + if (data && data->chunk.has_value()) return data->chunk->at(pos.to_local()); return {}; } void World::set_block(Position::BlockWorld pos, BlockType type) { - auto& chunk_data = m_registry.find(pos); - if (!chunk_data.chunk.has_value()) return; + auto chunk_data = m_registry.find(pos); + if (!chunk_data || !chunk_data->chunk.has_value()) return; - auto& block_data = chunk_data.chunk->at(pos.to_local()); + auto& block_data = chunk_data->chunk->at(pos.to_local()); block_data.type = type; - chunk_data.damage(); + chunk_data->damage(); } void World::break_block(Position::BlockWorld pos) { -- cgit 1.4.1