summary refs log tree commit diff
path: root/src/Entities/Player.cpp
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2024-02-12 13:01:15 +0100
committerMel <einebeere@gmail.com>2024-02-12 13:01:15 +0100
commit6a30c3e4f22de4d0f8f32107f614f597f5f39cc1 (patch)
treea4e45ac6c5c728266eef1b42099494854744d497 /src/Entities/Player.cpp
parentd2b5fc5b3bc648afffa42375706429685ac63794 (diff)
downloadmeowcraft-6a30c3e4f22de4d0f8f32107f614f597f5f39cc1.tar.zst
meowcraft-6a30c3e4f22de4d0f8f32107f614f597f5f39cc1.zip
Rescue player from void if current chunk wasn't generated prior
Diffstat (limited to 'src/Entities/Player.cpp')
-rw-r--r--src/Entities/Player.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp
index 652f3fd..7a1c1af 100644
--- a/src/Entities/Player.cpp
+++ b/src/Entities/Player.cpp
@@ -10,6 +10,9 @@ void Player::update(const Time& time, GFX::Window& window, GFX::Camera& camera,
     auto destination = movement(window, time, input_direction);
 
     if (can_collide()) {
+        if (m_velocity.y() < 0.0)
+            destination = rescue_from_void_on_new_chunk(time, world, destination);
+
         auto const [position, blocked_axes] = process_collisions(world, m_transform.position(), destination);
 
         destination = position;
@@ -286,6 +289,19 @@ std::vector<AABB> Player::terrain_collision_domain(
     return colliding_blocks;
 }
 
+Position::World Player::rescue_from_void_on_new_chunk(Time const& time, World::World& world, Position::World position) {
+    auto& chunk = world.chunks().get(World::ChunkIndex::from_position(position));
+    // If the chunk was generated at the previous tick, we
+    // can rescue the player by moving them to the top of the chunk.
+    if (chunk.generated() && chunk.generated_at_tick == time.tick() - 1){
+        // TODO: Move to first solid block.
+        position.y() = World::Chunk::Height / 2.0;
+        m_transform.position() = position;
+        m_velocity.y() = 0;
+    }
+    return position;
+}
+
 Transform Player::camera_transform() const {
     auto position = m_transform.position();
     position.y() += 1.5;