Safe digging and placing (#6127)
authorBen Deutsch <ben@bendeutsch.de>
Thu, 24 Aug 2017 06:30:46 +0000 (08:30 +0200)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Thu, 24 Aug 2017 06:30:46 +0000 (08:30 +0200)
* 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
minetest.conf.example
src/defaultsettings.cpp
src/game.cpp

index 298e706699ac0fab047e2511aba5519edd49636b..1ae13a3a656a860592c34c4662be53a5590c44c0 100644 (file)
@@ -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
 
index 8ad579b43fbae37ad8750c529ef8e7386c43789c..6413d136a9e05a319da7d8100d3b736a6c96cb8c 100644 (file)
 #    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
index 4f128fdae497749c499f210c8d3a8f22d5b7e6e1..ccf81f1e7bec5195695146ae2ff9cc6841c8101a 100644 (file)
@@ -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");
index 0f82277492cb1c63b0764afa9cbc815a14f73550..c3d8446344237ea17ea95d27cc8d5330653bb3e4 100644 (file)
@@ -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;