summaryrefslogtreecommitdiff
path: root/src/Entities
diff options
context:
space:
mode:
Diffstat (limited to 'src/Entities')
-rw-r--r--src/Entities/Player.cpp41
-rw-r--r--src/Entities/Player.hpp2
2 files changed, 32 insertions, 11 deletions
diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp
index a8abb1d..da96d56 100644
--- a/src/Entities/Player.cpp
+++ b/src/Entities/Player.cpp
@@ -24,17 +24,7 @@ void Player::update(const Time& time, GFX::Window& window, GFX::Camera& camera,
update_camera_position(camera);
- if (window.mouse(GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS)) {
- auto look_transform = camera_transform();
- auto look_direction = -look_transform.forward(); // Why does this need to be inverted?
- auto block = world.traverse(
- Ray{look_transform.position(), look_direction},
- 4.0,
- [](auto b) { return b.type.is_solid(); }
- );
-
- if (block != Position::BlockWorld{}) world.break_block(block);
- }
+ actions(window, world);
}
void Player::move(Position::WorldOffset by) {
@@ -105,6 +95,35 @@ Vec3 Player::flying_velocity(GFX::Window& window, const Time& time, Vec3 input_d
return direction * (base_move_speed + boost) * time.delta();
}
+void Player::actions(GFX::Window& window, World::World& world) {
+ auto constexpr max_block_reach = 4.0;
+
+ auto left_click = window.mouse(GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS);
+ auto right_click = window.mouse(GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS);
+ if (left_click || right_click) {
+ auto const look_transform = camera_transform();
+ Ray const ray{look_transform.position(), -look_transform.forward()};
+ auto const traversal = world.traverse(
+ ray,
+ [](auto b) { return b.type.is_solid(); },
+ max_block_reach
+ );
+
+ if (traversal.hit) {
+ if (left_click) {
+ world.break_block(traversal.block);
+ } else {
+ auto const new_block = Position::BlockWorld(traversal.block + traversal.normal);
+ auto const current_box = bounding_box_for_position(m_transform.position());
+ auto const block_box = World::Chunk::block_bounds(new_block);
+
+ if (!current_box.collides(block_box)) // Don't place blocks inside the player.
+ world.set_block(new_block, World::BlockType::Stone);
+ }
+ }
+ }
+}
+
#define STUCK_THRESHOLD 100
Player::ProcessCollisionsResult Player::process_collisions(World::World& world, Position::World from, Position::World to) {
diff --git a/src/Entities/Player.hpp b/src/Entities/Player.hpp
index b1ec8e7..f6c1f9a 100644
--- a/src/Entities/Player.hpp
+++ b/src/Entities/Player.hpp
@@ -40,6 +40,8 @@ private:
Vec3 walking_velocity(GFX::Window& window, const Time& time, Vec3 input_direction);
Vec3 flying_velocity(GFX::Window& window, const Time& time, Vec3 input_direction);
+ void actions(GFX::Window& window, World::World& world);
+
Transform camera_transform() const;
void update_camera_position(GFX::Camera& camera) const;