From 82fd83fd12e23ad7c61b4c7ae525be745b5236a5 Mon Sep 17 00:00:00 2001
From: PilzAdam <PilzAdam@gmx.de>
Date: Thu, 3 Jan 2013 19:51:52 +0100
Subject: [PATCH] Switch to fly mode if spacebar is doubleclicked Can be turned
 off in the key change GUI or in minetest.conf via doubletab_space

---
 minetest.conf.example    |  2 ++
 src/defaultsettings.cpp  |  1 +
 src/game.cpp             | 35 +++++++++++++++++++++++++++++++++++
 src/guiKeyChangeMenu.cpp | 20 ++++++++++++++++++++
 4 files changed, 58 insertions(+)

diff --git a/minetest.conf.example b/minetest.conf.example
index 5fb4244b2..a4448ab61 100644
--- a/minetest.conf.example
+++ b/minetest.conf.example
@@ -51,6 +51,8 @@
 #keymap_screenshot = KEY_F12
 # If true, keymap_special1 instead of keymap_sneak is used for climbing down and descending
 #aux1_descends = false
+# Doubletabing the jump key toogles fly mode
+#doubletab_jump = false
 # Some (temporary) keys for debugging
 #keymap_print_debug_stacks = KEY_KEY_P
 #keymap_quicktune_prev = KEY_HOME
diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp
index cac3e568a..82783db0d 100644
--- a/src/defaultsettings.cpp
+++ b/src/defaultsettings.cpp
@@ -56,6 +56,7 @@ void set_default_settings(Settings *settings)
 	settings->setDefault("anaglyph", "false");
 	settings->setDefault("anaglyph_strength", "0.1");
 	settings->setDefault("aux1_descends", "false");
+	settings->setDefault("doubletab_jump", "false");
 
 	// Some (temporary) keys for debugging
 	settings->setDefault("keymap_print_debug_stacks", "KEY_KEY_P");
diff --git a/src/game.cpp b/src/game.cpp
index fdb083ff1..ab480c3db 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -1310,6 +1310,9 @@ void the_game(
 	float damage_flash = 0;
 	s16 farmesh_range = 20*MAP_BLOCKSIZE;
 
+	float jump_timer = 0;
+	bool reset_jump_timer = false;
+
 	const float object_hit_delay = 0.2;
 	float object_hit_delay_timer = 0.0;
 	float time_from_last_punch = 10;
@@ -1592,6 +1595,10 @@ void the_game(
 		// Input handler step() (used by the random input generator)
 		input->step(dtime);
 
+		// Increase timer for doubleclick of "jump"
+		if(g_settings->getBool("doubletab_jump") && jump_timer <= 0.2)
+			jump_timer += dtime;
+
 		/*
 			Launch menus and trigger stuff according to keys
 		*/
@@ -1681,6 +1688,27 @@ void the_game(
 					statustext += L" (note: no 'fly' privilege)";
 			}
 		}
+		else if(input->wasKeyDown(getKeySetting("keymap_jump")))
+		{
+			if(g_settings->getBool("doubletab_jump") && jump_timer < 0.2)
+			{
+				if(g_settings->getBool("free_move"))
+				{
+					g_settings->set("free_move","false");
+					statustext = L"free_move disabled";
+					statustext_time = 0;
+				}
+				else
+				{
+					g_settings->set("free_move","true");
+					statustext = L"free_move enabled";
+					statustext_time = 0;
+					if(!client.checkPrivilege("fly"))
+						statustext += L" (note: no 'fly' privilege)";
+				}
+			}
+			reset_jump_timer = true;
+		}
 		else if(input->wasKeyDown(getKeySetting("keymap_fastmove")))
 		{
 			if(g_settings->getBool("fast_move"))
@@ -1843,6 +1871,13 @@ void the_game(
 			statustext_time = 0;
 		}
 		
+		// Reset jump_timer
+		if(!input->isKeyDown(getKeySetting("keymap_jump")) && reset_jump_timer)
+		{
+			reset_jump_timer = false;
+			jump_timer = 0.0;
+		}
+
 		// Handle QuicktuneShortcutter
 		if(input->wasKeyDown(getKeySetting("keymap_quicktune_next")))
 			quicktune.next();
diff --git a/src/guiKeyChangeMenu.cpp b/src/guiKeyChangeMenu.cpp
index 8f7c7245c..336b13e07 100644
--- a/src/guiKeyChangeMenu.cpp
+++ b/src/guiKeyChangeMenu.cpp
@@ -57,6 +57,7 @@ enum
 	GUI_ID_KEY_RANGE_BUTTON,
 	// other
 	GUI_ID_CB_AUX1_DESCENDS,
+	GUI_ID_CB_DOUBLETAB_JUMP,
 };
 
 GUIKeyChangeMenu::GUIKeyChangeMenu(gui::IGUIEnvironment* env,
@@ -149,6 +150,20 @@ void GUIKeyChangeMenu::regenerateGui(v2u32 screensize)
 			Environment->addCheckBox(g_settings->getBool("aux1_descends"), rect, this,
 					GUI_ID_CB_AUX1_DESCENDS, wgettext("\"Use\" = climb down"));
 		}
+		offset += v2s32(0, 25);
+	}
+
+	{
+		s32 option_x = offset.X + 10;
+		s32 option_y = offset.Y;
+		u32 option_w = 220;
+		{
+			core::rect<s32> rect(0, 0, option_w, 30);
+			rect += topleft + v2s32(option_x, option_y);
+			Environment->addCheckBox(g_settings->getBool("doubletab_jump"), rect, this,
+					GUI_ID_CB_DOUBLETAB_JUMP, wgettext("Doubltab \"jump\" to toogle fly"));
+		}
+		offset += v2s32(0, 25);
 	}
 
 	{
@@ -197,6 +212,11 @@ bool GUIKeyChangeMenu::acceptInput()
 		if(e != NULL && e->getType() == gui::EGUIET_CHECK_BOX)
 			g_settings->setBool("aux1_descends", ((gui::IGUICheckBox*)e)->isChecked());
 	}
+	{
+		gui::IGUIElement *e = getElementFromId(GUI_ID_CB_DOUBLETAB_JUMP);
+		if(e != NULL && e->getType() == gui::EGUIET_CHECK_BOX)
+			g_settings->setBool("doubletab_jump", ((gui::IGUICheckBox*)e)->isChecked());
+	}
 	clearKeyCache();
 	return true;
 }
-- 
GitLab