diff options
| author | Mel <einebeere@gmail.com> | 2024-02-02 16:16:25 +0100 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2024-02-02 16:16:25 +0100 |
| commit | a4a61ac2e6389af0968ac4fb305b82c6eb90bf0e (patch) | |
| tree | 800749ed6a5d503837a6bf0c389c133fcb59143d /src/Entities | |
| parent | 250e37c742f3ad46f093f4534098cdf8f68a29a9 (diff) | |
| download | meowcraft-a4a61ac2e6389af0968ac4fb305b82c6eb90bf0e.tar.zst meowcraft-a4a61ac2e6389af0968ac4fb305b82c6eb90bf0e.zip | |
Placing blocks
Diffstat (limited to 'src/Entities')
| -rw-r--r-- | src/Entities/Player.cpp | 41 | ||||
| -rw-r--r-- | src/Entities/Player.hpp | 2 |
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; |
