From 82fd83fd12e23ad7c61b4c7ae525be745b5236a5 Mon Sep 17 00:00:00 2001 From: PilzAdam 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 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; }