diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index a6b05496a..5b7de5ff2 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -111,6 +111,12 @@ doubletap_jump (Double tap jump for fly) bool false # enabled. always_fly_fast (Always fly fast) bool true +# If enabled, the "Sneak" key will toggle when pressed. +toggle_sneak_key (Toggle Sneak key) bool false + +# If enabled, the "Aux1" key will toggle when pressed. +toggle_aux1_key (Toggle Aux1 key) bool false + # The time in seconds it takes between repeated node placements when holding # the place button. # diff --git a/src/client/game.cpp b/src/client/game.cpp index 7588fedc7..a4ec79ffc 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -560,6 +560,7 @@ protected: void updateCameraDirection(CameraOrientation *cam, float dtime); void updateCameraOrientation(CameraOrientation *cam, float dtime); + bool getTogglableKeyState(GameKeyType key, bool toggling_enabled, bool prev_key_state); void updatePlayerControl(const CameraOrientation &cam); void updatePauseState(); void step(f32 dtime); @@ -746,6 +747,8 @@ private: * a later release. */ bool m_cache_doubletap_jump; + bool m_cache_toggle_sneak_key; + bool m_cache_toggle_aux1_key; bool m_cache_enable_joysticks; bool m_cache_enable_fog; bool m_cache_enable_noclip; @@ -791,6 +794,10 @@ Game::Game() : &settingChangedCallback, this); g_settings->registerChangedCallback("doubletap_jump", &settingChangedCallback, this); + g_settings->registerChangedCallback("toggle_sneak_key", + &settingChangedCallback, this); + g_settings->registerChangedCallback("toggle_aux1_key", + &settingChangedCallback, this); g_settings->registerChangedCallback("enable_joysticks", &settingChangedCallback, this); g_settings->registerChangedCallback("enable_fog", @@ -2427,6 +2434,16 @@ void Game::updateCameraOrientation(CameraOrientation *cam, float dtime) } +// Get the state of an optionally togglable key +bool Game::getTogglableKeyState(GameKeyType key, bool toggling_enabled, bool prev_key_state) +{ + if (!toggling_enabled) + return isKeyDown(key); + else + return prev_key_state ^ wasKeyPressed(key); +} + + void Game::updatePlayerControl(const CameraOrientation &cam) { LocalPlayer *player = client->getEnv().getLocalPlayer(); @@ -2439,8 +2456,8 @@ void Game::updatePlayerControl(const CameraOrientation &cam) isKeyDown(KeyType::LEFT), isKeyDown(KeyType::RIGHT), isKeyDown(KeyType::JUMP) || player->getAutojump(), - isKeyDown(KeyType::AUX1), - isKeyDown(KeyType::SNEAK), + getTogglableKeyState(KeyType::AUX1, m_cache_toggle_aux1_key, player->control.aux1), + getTogglableKeyState(KeyType::SNEAK, m_cache_toggle_sneak_key, player->control.sneak), isKeyDown(KeyType::ZOOM), isKeyDown(KeyType::DIG), isKeyDown(KeyType::PLACE), @@ -4100,6 +4117,8 @@ void Game::readSettings() m_chat_log_buf.setLogLevel(chat_log_level); m_cache_doubletap_jump = g_settings->getBool("doubletap_jump"); + m_cache_toggle_sneak_key = g_settings->getBool("toggle_sneak_key"); + m_cache_toggle_aux1_key = g_settings->getBool("toggle_aux1_key"); m_cache_enable_joysticks = g_settings->getBool("enable_joysticks"); m_cache_enable_fog = g_settings->getBool("enable_fog"); m_cache_mouse_sensitivity = g_settings->getFloat("mouse_sensitivity", 0.001f, 10.0f); diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index f9f0c41f0..b6d45b073 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -356,6 +356,8 @@ void set_default_settings() settings->setDefault("aux1_descends", "false"); settings->setDefault("doubletap_jump", "false"); settings->setDefault("always_fly_fast", "true"); + settings->setDefault("toggle_sneak_key", "false"); + settings->setDefault("toggle_aux1_key", "false"); settings->setDefault("autojump", bool_to_cstr(has_touch)); settings->setDefault("continuous_forward", "false"); settings->setDefault("enable_joysticks", "false");