From 397a701f985f918cf8403802575045435de40c9a Mon Sep 17 00:00:00 2001 From: Ben Deutsch Date: Thu, 24 Aug 2017 08:30:46 +0200 Subject: [PATCH] Safe digging and placing (#6127) * Setting: Safe digging and placing * New setting 'safe_dig_and_place' under Controls * If set, digging and placing will not auto-repeat * Releasing buttons unblocks the respective action again * Useful for inexperienced users in creative mode where default repeat times may be too short * Safe placing (right click repetition) does not need a guarding flag * Added new setting to minetest.conf.example --- builtin/settingtypes.txt | 4 ++++ minetest.conf.example | 5 +++++ src/defaultsettings.cpp | 1 + src/game.cpp | 13 ++++++++++++- 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 298e70669..1ae13a3a6 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -101,6 +101,10 @@ always_fly_fast (Always fly and fast) bool true # The time in seconds it takes between repeated right clicks when holding the right mouse button. repeat_rightclick_time (Rightclick repetition interval) float 0.25 +# Prevent digging and placing from repeating when holding the mouse buttons. +# Enable this when you dig or place too often by accident. +safe_dig_and_place (Safe digging and placing) bool false + # Enable random user input (only used for testing). random_input (Random input) bool false diff --git a/minetest.conf.example b/minetest.conf.example index 8ad579b43..6413d136a 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -75,6 +75,11 @@ # type: float # repeat_rightclick_time = 0.25 +# Prevent digging and placing from repeating when holding the mouse buttons. +# Enable this when you dig or place too often by accident. +# type: bool +# safe_dig_and_place = false + # Enable random user input (only used for testing). # type: bool # random_input = false diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 4f128fdae..ccf81f1e7 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -240,6 +240,7 @@ void set_default_settings(Settings *settings) settings->setDefault("invert_mouse", "false"); settings->setDefault("mouse_sensitivity", "0.2"); settings->setDefault("repeat_rightclick_time", "0.25"); + settings->setDefault("safe_dig_and_place", "false"); settings->setDefault("random_input", "false"); settings->setDefault("aux1_descends", "false"); settings->setDefault("doubletap_jump", "false"); diff --git a/src/game.cpp b/src/game.cpp index 0f8227749..c3d844634 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -1142,6 +1142,7 @@ struct GameRunData { bool digging; bool ldown_for_dig; bool dig_instantly; + bool digging_blocked; bool left_punch; bool update_wielded_item_trigger; bool reset_jump_timer; @@ -3559,6 +3560,11 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug) hud->updateSelectionMesh(camera_offset); } + if (runData.digging_blocked && !isLeftPressed()) { + // allow digging again if button is not pressed + runData.digging_blocked = false; + } + /* Stop digging when - releasing left mouse button @@ -3603,7 +3609,8 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug) soundmaker->m_player_leftpunch_sound.name = ""; - if (isRightPressed()) + // Prepare for repeating, unless we're not supposed to + if (isRightPressed() && !g_settings->getBool("safe_dig_and_place")) runData.repeat_rightclick_timer += dtime; else runData.repeat_rightclick_timer = 0; @@ -3762,6 +3769,7 @@ void Game::handlePointingAtNode(const PointedThing &pointed, ClientMap &map = client->getEnv().getClientMap(); if (runData.nodig_delay_timer <= 0.0 && isLeftPressed() + && !runData.digging_blocked && client->checkPrivilege("interact")) { handleDigging(pointed, nodepos, playeritem_toolcap, dtime); } @@ -3985,6 +3993,9 @@ void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos, runData.dig_time = 0; runData.digging = false; + // we successfully dug, now block it from repeating if we want to be safe + if (g_settings->getBool("safe_dig_and_place")) + runData.digging_blocked = true; runData.nodig_delay_timer = runData.dig_time_complete / (float)crack_animation_length; -- 2.25.1