aboutsummaryrefslogtreecommitdiff
path: root/src/game.cpp
diff options
context:
space:
mode:
authorBen Deutsch <ben@bendeutsch.de>2017-08-24 08:30:46 +0200
committerLoïc Blot <nerzhul@users.noreply.github.com>2017-08-24 08:30:46 +0200
commit397a701f985f918cf8403802575045435de40c9a (patch)
tree042be04cd4d558e1563662b2bbbd3e37ac56189a /src/game.cpp
parentc7160cb629086df2a32c7dcf4faed4761ec4393e (diff)
downloadminetest-397a701f985f918cf8403802575045435de40c9a.tar.gz
minetest-397a701f985f918cf8403802575045435de40c9a.tar.bz2
minetest-397a701f985f918cf8403802575045435de40c9a.zip
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
Diffstat (limited to 'src/game.cpp')
-rw-r--r--src/game.cpp13
1 files changed, 12 insertions, 1 deletions
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;