From 6a30c3e4f22de4d0f8f32107f614f597f5f39cc1 Mon Sep 17 00:00:00 2001 From: Mel Date: Mon, 12 Feb 2024 13:01:15 +0100 Subject: Rescue player from void if current chunk wasn't generated prior --- src/Entities/Player.cpp | 16 ++++++++++++++++ src/Entities/Player.hpp | 2 ++ 2 files changed, 18 insertions(+) (limited to 'src/Entities') 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 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; diff --git a/src/Entities/Player.hpp b/src/Entities/Player.hpp index 83ac091..2b69d57 100644 --- a/src/Entities/Player.hpp +++ b/src/Entities/Player.hpp @@ -43,6 +43,8 @@ private: static ProcessCollisionsResult process_collisions(World::World& world, Position::World from, Position::World to); static std::vector terrain_collision_domain(Position::World from, Position::World to, World::World& world); + Position::World rescue_from_void_on_new_chunk(Time const& time, World::World& world, Position::World position); + Position::World movement(GFX::Window& window, const Time& time, Vec3 input_direction); Vec3 walking_velocity(GFX::Window& window, const Time& time, Vec3 input_direction); Vec3 flying_velocity(GFX::Window& window, const Time& time, Vec3 input_direction); -- cgit 1.4.1