From ee8d0368bd59dbf8382830051167d555835066b8 Mon Sep 17 00:00:00 2001 From: ChancellorIkseew Date: Sun, 3 Nov 2024 06:55:17 +1000 Subject: [PATCH] add interacton by long press --- src/frontend/screens/LevelScreen.cpp | 2 +- src/logic/LevelController.cpp | 9 ++++----- src/logic/LevelController.hpp | 3 ++- src/logic/PlayerController.cpp | 24 ++++++++++++++++-------- src/logic/PlayerController.hpp | 7 ++++--- 5 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/frontend/screens/LevelScreen.cpp b/src/frontend/screens/LevelScreen.cpp index 8824d640..c0d4aa88 100644 --- a/src/frontend/screens/LevelScreen.cpp +++ b/src/frontend/screens/LevelScreen.cpp @@ -37,7 +37,7 @@ LevelScreen::LevelScreen(Engine* engine, std::unique_ptr level) auto menu = engine->getGUI()->getMenu(); menu->reset(); - controller = std::make_unique(settings, std::move(level)); + controller = std::make_unique(engine, std::move(level)); frontend = std::make_unique(controller->getPlayer(), controller.get(), assets); worldRenderer = std::make_unique(engine, frontend.get(), controller->getPlayer()); diff --git a/src/logic/LevelController.cpp b/src/logic/LevelController.cpp index f0bee4c5..1bfa8249 100644 --- a/src/logic/LevelController.cpp +++ b/src/logic/LevelController.cpp @@ -3,6 +3,7 @@ #include #include "debug/Logger.hpp" +#include "engine.hpp" #include "files/WorldFiles.hpp" #include "interfaces/Object.hpp" #include "objects/Entities.hpp" @@ -15,10 +16,8 @@ static debug::Logger logger("level-control"); -LevelController::LevelController( - EngineSettings& settings, std::unique_ptr level -) - : settings(settings), +LevelController::LevelController(Engine* engine, std::unique_ptr level) + : settings(engine->getSettings()), level(std::move(level)), blocks(std::make_unique( this->level.get(), settings.chunks.padding.get() @@ -27,7 +26,7 @@ LevelController::LevelController( this->level.get(), settings.chunks.padding.get() )), player(std::make_unique( - this->level.get(), settings, blocks.get() + engine, this->level.get(), blocks.get() )) { scripting::on_world_load(this); } diff --git a/src/logic/LevelController.hpp b/src/logic/LevelController.hpp index a2c5af3e..94e0ac2c 100644 --- a/src/logic/LevelController.hpp +++ b/src/logic/LevelController.hpp @@ -6,6 +6,7 @@ #include "ChunksController.hpp" #include "PlayerController.hpp" +class Engine; class Level; class Player; struct EngineSettings; @@ -19,7 +20,7 @@ class LevelController { std::unique_ptr chunks; std::unique_ptr player; public: - LevelController(EngineSettings& settings, std::unique_ptr level); + LevelController(Engine* engine, std::unique_ptr level); /// @param delta time elapsed since the last update /// @param input is user input allowed to be handled diff --git a/src/logic/PlayerController.cpp b/src/logic/PlayerController.cpp index 64e2a40c..04a39f61 100644 --- a/src/logic/PlayerController.cpp +++ b/src/logic/PlayerController.cpp @@ -6,6 +6,7 @@ #include "content/Content.hpp" #include "core_defs.hpp" +#include "engine.hpp" #include "items/Inventory.hpp" #include "items/ItemDef.hpp" #include "items/ItemStack.hpp" @@ -26,6 +27,7 @@ #include "BlocksController.hpp" #include "scripting/scripting.hpp" +const float INTERACTION_RELOAD = 0.160f; const float STEPS_SPEED = 2.2f; const float CAM_SHAKE_OFFSET = 0.0075f; const float CAM_SHAKE_OFFSET_Y = 0.031f; @@ -187,13 +189,12 @@ void CameraControl::update(PlayerInput input, float delta, Chunks* chunks) { } PlayerController::PlayerController( - Level* level, - const EngineSettings& settings, + Engine* const engine, Level* level, BlocksController* blocksController ) - : level(level), + : engine(engine), level(level), player(level->getObject(0)), - camControl(player, settings.camera), + camControl(player, engine->getSettings().camera), blocksController(blocksController) { } @@ -485,12 +486,19 @@ void PlayerController::updateInteraction() { auto chunks = level->chunks.get(); const auto& selection = player->selection; + if (interactionTimer > 0.0f) { + interactionTimer -= static_cast(engine->getDelta()); + } bool xkey = Events::pressed(keycode::X); - bool lclick = Events::jactive(BIND_PLAYER_ATTACK) || - (xkey && Events::active(BIND_PLAYER_ATTACK)); - bool rclick = Events::jactive(BIND_PLAYER_BUILD) || - (xkey && Events::active(BIND_PLAYER_BUILD)); float maxDistance = xkey ? 200.0f : 10.0f; + bool longInteraction = interactionTimer <= 0 || xkey; + bool lclick = Events::jactive(BIND_PLAYER_ATTACK) || + (longInteraction && Events::active(BIND_PLAYER_ATTACK)); + bool rclick = Events::jactive(BIND_PLAYER_BUILD) || + (longInteraction && Events::active(BIND_PLAYER_BUILD)); + if (lclick || rclick) { + interactionTimer = INTERACTION_RELOAD; + } auto inventory = player->getInventory(); const ItemStack& stack = inventory->getSlot(player->getChosenSlot()); diff --git a/src/logic/PlayerController.hpp b/src/logic/PlayerController.hpp index 306e2336..c64a8495 100644 --- a/src/logic/PlayerController.hpp +++ b/src/logic/PlayerController.hpp @@ -6,6 +6,7 @@ #include "objects/Player.hpp" +class Engine; class Camera; class Level; class Block; @@ -45,12 +46,14 @@ public: }; class PlayerController { + Engine* engine; Level* level; std::shared_ptr player; PlayerInput input {}; CameraControl camControl; BlocksController* blocksController; + float interactionTimer = 0.0f; void updateKeyboard(); void resetKeyboard(); void updatePlayer(float delta); @@ -65,9 +68,7 @@ class PlayerController { voxel* updateSelection(float maxDistance); public: PlayerController( - Level* level, - const EngineSettings& settings, - BlocksController* blocksController + Engine* const engine, Level* level, BlocksController* blocksController ); void update(float delta, bool input, bool pause); void postUpdate(float delta, bool input, bool pause);