summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/World/ChunkRegistry.cpp7
-rw-r--r--src/World/ChunkRegistry.hpp4
-rw-r--r--src/World/World.cpp12
3 files changed, 12 insertions, 11 deletions
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<ChunkIndex, Data> 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<ChunkRegistry::Data*> 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) {