summaryrefslogtreecommitdiff
path: root/src/Entities
diff options
context:
space:
mode:
Diffstat (limited to 'src/Entities')
-rw-r--r--src/Entities/Player.cpp16
-rw-r--r--src/Entities/Player.hpp2
2 files changed, 18 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;
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<AABB> 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);