Merge pull request #343 from ChancellorIkseew/placing-block-by-button-long-press

Placing block by button long press
This commit is contained in:
MihailRis 2024-11-03 12:12:48 +03:00 committed by GitHub
commit 1777600275
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 34 additions and 20 deletions

View File

@ -16,4 +16,5 @@ player.attack="mouse:left"
player.build="mouse:right" player.build="mouse:right"
player.pick="mouse:middle" player.pick="mouse:middle"
player.drop="key:q" player.drop="key:q"
player.fast_interaction="key:x"
hud.inventory="key:tab" hud.inventory="key:tab"

View File

@ -31,6 +31,7 @@ hud.inventory=Inventory
player.pick=Pick Block player.pick=Pick Block
player.attack=Attack / Break player.attack=Attack / Break
player.build=Place Block player.build=Place Block
player.fast_interaction=Accelerated interaction
player.flight=Flight player.flight=Flight
player.noclip=No-clip player.noclip=No-clip
player.drop=Drop Item player.drop=Drop Item

View File

@ -92,6 +92,7 @@ hud.inventory=Инвентарь
player.pick=Подобрать Блок player.pick=Подобрать Блок
player.attack=Атаковать / Сломать player.attack=Атаковать / Сломать
player.build=Поставить Блок player.build=Поставить Блок
player.fast_interaction=Ускоренное взаимодействие
player.flight=Полёт player.flight=Полёт
player.drop=Выбросить Предмет player.drop=Выбросить Предмет
camera.zoom=Приближение camera.zoom=Приближение

View File

@ -27,6 +27,8 @@ inline const std::string BIND_PLAYER_FLIGHT = "player.flight";
inline const std::string BIND_PLAYER_ATTACK = "player.attack"; inline const std::string BIND_PLAYER_ATTACK = "player.attack";
inline const std::string BIND_PLAYER_BUILD = "player.build"; inline const std::string BIND_PLAYER_BUILD = "player.build";
inline const std::string BIND_PLAYER_PICK = "player.pick"; inline const std::string BIND_PLAYER_PICK = "player.pick";
inline const std::string BIND_PLAYER_FAST_INTERACTOIN =
"player.fast_interaction";
inline const std::string BIND_HUD_INVENTORY = "hud.inventory"; inline const std::string BIND_HUD_INVENTORY = "hud.inventory";
class EnginePaths; class EnginePaths;

View File

@ -37,7 +37,7 @@ LevelScreen::LevelScreen(Engine* engine, std::unique_ptr<Level> level)
auto menu = engine->getGUI()->getMenu(); auto menu = engine->getGUI()->getMenu();
menu->reset(); menu->reset();
controller = std::make_unique<LevelController>(settings, std::move(level)); controller = std::make_unique<LevelController>(engine, std::move(level));
frontend = std::make_unique<LevelFrontend>(controller->getPlayer(), controller.get(), assets); frontend = std::make_unique<LevelFrontend>(controller->getPlayer(), controller.get(), assets);
worldRenderer = std::make_unique<WorldRenderer>(engine, frontend.get(), controller->getPlayer()); worldRenderer = std::make_unique<WorldRenderer>(engine, frontend.get(), controller->getPlayer());

View File

@ -3,6 +3,7 @@
#include <algorithm> #include <algorithm>
#include "debug/Logger.hpp" #include "debug/Logger.hpp"
#include "engine.hpp"
#include "files/WorldFiles.hpp" #include "files/WorldFiles.hpp"
#include "interfaces/Object.hpp" #include "interfaces/Object.hpp"
#include "objects/Entities.hpp" #include "objects/Entities.hpp"
@ -15,10 +16,8 @@
static debug::Logger logger("level-control"); static debug::Logger logger("level-control");
LevelController::LevelController( LevelController::LevelController(Engine* engine, std::unique_ptr<Level> level)
EngineSettings& settings, std::unique_ptr<Level> level : settings(engine->getSettings()),
)
: settings(settings),
level(std::move(level)), level(std::move(level)),
blocks(std::make_unique<BlocksController>( blocks(std::make_unique<BlocksController>(
this->level.get(), settings.chunks.padding.get() this->level.get(), settings.chunks.padding.get()
@ -27,7 +26,7 @@ LevelController::LevelController(
this->level.get(), settings.chunks.padding.get() this->level.get(), settings.chunks.padding.get()
)), )),
player(std::make_unique<PlayerController>( player(std::make_unique<PlayerController>(
this->level.get(), settings, blocks.get() engine, this->level.get(), blocks.get()
)) { )) {
scripting::on_world_load(this); scripting::on_world_load(this);
} }

View File

@ -6,6 +6,7 @@
#include "ChunksController.hpp" #include "ChunksController.hpp"
#include "PlayerController.hpp" #include "PlayerController.hpp"
class Engine;
class Level; class Level;
class Player; class Player;
struct EngineSettings; struct EngineSettings;
@ -19,7 +20,7 @@ class LevelController {
std::unique_ptr<ChunksController> chunks; std::unique_ptr<ChunksController> chunks;
std::unique_ptr<PlayerController> player; std::unique_ptr<PlayerController> player;
public: public:
LevelController(EngineSettings& settings, std::unique_ptr<Level> level); LevelController(Engine* engine, std::unique_ptr<Level> level);
/// @param delta time elapsed since the last update /// @param delta time elapsed since the last update
/// @param input is user input allowed to be handled /// @param input is user input allowed to be handled

View File

@ -6,6 +6,7 @@
#include "content/Content.hpp" #include "content/Content.hpp"
#include "core_defs.hpp" #include "core_defs.hpp"
#include "engine.hpp"
#include "items/Inventory.hpp" #include "items/Inventory.hpp"
#include "items/ItemDef.hpp" #include "items/ItemDef.hpp"
#include "items/ItemStack.hpp" #include "items/ItemStack.hpp"
@ -26,6 +27,7 @@
#include "BlocksController.hpp" #include "BlocksController.hpp"
#include "scripting/scripting.hpp" #include "scripting/scripting.hpp"
const float INTERACTION_RELOAD = 0.160f;
const float STEPS_SPEED = 2.2f; const float STEPS_SPEED = 2.2f;
const float CAM_SHAKE_OFFSET = 0.0075f; const float CAM_SHAKE_OFFSET = 0.0075f;
const float CAM_SHAKE_OFFSET_Y = 0.031f; const float CAM_SHAKE_OFFSET_Y = 0.031f;
@ -187,13 +189,12 @@ void CameraControl::update(PlayerInput input, float delta, Chunks* chunks) {
} }
PlayerController::PlayerController( PlayerController::PlayerController(
Level* level, Engine* engine, Level* level,
const EngineSettings& settings,
BlocksController* blocksController BlocksController* blocksController
) )
: level(level), : engine(engine), level(level),
player(level->getObject<Player>(0)), player(level->getObject<Player>(0)),
camControl(player, settings.camera), camControl(player, engine->getSettings().camera),
blocksController(blocksController) { blocksController(blocksController) {
} }
@ -485,12 +486,19 @@ void PlayerController::updateInteraction() {
auto chunks = level->chunks.get(); auto chunks = level->chunks.get();
const auto& selection = player->selection; const auto& selection = player->selection;
bool xkey = Events::pressed(keycode::X); if (interactionTimer > 0.0f) {
bool lclick = Events::jactive(BIND_PLAYER_ATTACK) || interactionTimer -= static_cast<float>(engine->getDelta());
(xkey && Events::active(BIND_PLAYER_ATTACK)); }
bool rclick = Events::jactive(BIND_PLAYER_BUILD) || bool xkey = Events::active(BIND_PLAYER_FAST_INTERACTOIN);
(xkey && Events::active(BIND_PLAYER_BUILD));
float maxDistance = xkey ? 200.0f : 10.0f; 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(); auto inventory = player->getInventory();
const ItemStack& stack = inventory->getSlot(player->getChosenSlot()); const ItemStack& stack = inventory->getSlot(player->getChosenSlot());

View File

@ -6,6 +6,7 @@
#include "objects/Player.hpp" #include "objects/Player.hpp"
class Engine;
class Camera; class Camera;
class Level; class Level;
class Block; class Block;
@ -45,12 +46,14 @@ public:
}; };
class PlayerController { class PlayerController {
Engine* engine;
Level* level; Level* level;
std::shared_ptr<Player> player; std::shared_ptr<Player> player;
PlayerInput input {}; PlayerInput input {};
CameraControl camControl; CameraControl camControl;
BlocksController* blocksController; BlocksController* blocksController;
float interactionTimer = 0.0f;
void updateKeyboard(); void updateKeyboard();
void resetKeyboard(); void resetKeyboard();
void updatePlayer(float delta); void updatePlayer(float delta);
@ -65,9 +68,7 @@ class PlayerController {
voxel* updateSelection(float maxDistance); voxel* updateSelection(float maxDistance);
public: public:
PlayerController( PlayerController(
Level* level, Engine* engine, Level* level, BlocksController* blocksController
const EngineSettings& settings,
BlocksController* blocksController
); );
void update(float delta, bool input, bool pause); void update(float delta, bool input, bool pause);
void postUpdate(float delta, bool input, bool pause); void postUpdate(float delta, bool input, bool pause);