diff options
Diffstat (limited to 'src/Entities/Player.cpp')
| -rw-r--r-- | src/Entities/Player.cpp | 16 |
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; |
