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
This commit is contained in:
Ben Deutsch 2017-08-24 08:30:46 +02:00 committed by Loïc Blot
parent c7160cb629
commit 397a701f98
4 changed files with 22 additions and 1 deletions

@ -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. # 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 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). # Enable random user input (only used for testing).
random_input (Random input) bool false random_input (Random input) bool false

@ -75,6 +75,11 @@
# type: float # type: float
# repeat_rightclick_time = 0.25 # 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). # Enable random user input (only used for testing).
# type: bool # type: bool
# random_input = false # random_input = false

@ -240,6 +240,7 @@ void set_default_settings(Settings *settings)
settings->setDefault("invert_mouse", "false"); settings->setDefault("invert_mouse", "false");
settings->setDefault("mouse_sensitivity", "0.2"); settings->setDefault("mouse_sensitivity", "0.2");
settings->setDefault("repeat_rightclick_time", "0.25"); settings->setDefault("repeat_rightclick_time", "0.25");
settings->setDefault("safe_dig_and_place", "false");
settings->setDefault("random_input", "false"); settings->setDefault("random_input", "false");
settings->setDefault("aux1_descends", "false"); settings->setDefault("aux1_descends", "false");
settings->setDefault("doubletap_jump", "false"); settings->setDefault("doubletap_jump", "false");

@ -1142,6 +1142,7 @@ struct GameRunData {
bool digging; bool digging;
bool ldown_for_dig; bool ldown_for_dig;
bool dig_instantly; bool dig_instantly;
bool digging_blocked;
bool left_punch; bool left_punch;
bool update_wielded_item_trigger; bool update_wielded_item_trigger;
bool reset_jump_timer; bool reset_jump_timer;
@ -3559,6 +3560,11 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug)
hud->updateSelectionMesh(camera_offset); hud->updateSelectionMesh(camera_offset);
} }
if (runData.digging_blocked && !isLeftPressed()) {
// allow digging again if button is not pressed
runData.digging_blocked = false;
}
/* /*
Stop digging when Stop digging when
- releasing left mouse button - 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 = ""; 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; runData.repeat_rightclick_timer += dtime;
else else
runData.repeat_rightclick_timer = 0; runData.repeat_rightclick_timer = 0;
@ -3762,6 +3769,7 @@ void Game::handlePointingAtNode(const PointedThing &pointed,
ClientMap &map = client->getEnv().getClientMap(); ClientMap &map = client->getEnv().getClientMap();
if (runData.nodig_delay_timer <= 0.0 && isLeftPressed() if (runData.nodig_delay_timer <= 0.0 && isLeftPressed()
&& !runData.digging_blocked
&& client->checkPrivilege("interact")) { && client->checkPrivilege("interact")) {
handleDigging(pointed, nodepos, playeritem_toolcap, dtime); handleDigging(pointed, nodepos, playeritem_toolcap, dtime);
} }
@ -3985,6 +3993,9 @@ void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos,
runData.dig_time = 0; runData.dig_time = 0;
runData.digging = false; 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.nodig_delay_timer =
runData.dig_time_complete / (float)crack_animation_length; runData.dig_time_complete / (float)crack_animation_length;