diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 5b502f795..664a7d1eb 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -2401,6 +2401,10 @@ keymap_screenshot (Screenshot) key KEY_F12 # Key for dropping the currently selected item. keymap_drop (Drop item key) key KEY_KEY_Q +# Key for swapping items between main hand and offhand. +# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 +keymap_swap_offhand (Swap hand items) key KEY_KEY_F + # Key to use view zoom when possible. keymap_zoom (View zoom key) key KEY_KEY_Z diff --git a/src/client/game.cpp b/src/client/game.cpp index 0084c795c..6e374b7d7 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -727,6 +727,7 @@ protected: void processItemSelection(u16 *new_playeritem); void dropSelectedItem(bool single_item = false); + void swapOffhand(); void openInventory(); void openConsole(float scale, const wchar_t *line=NULL); void toggleFreeMove(); @@ -2037,6 +2038,8 @@ void Game::processKeyInput() { if (wasKeyDown(KeyType::DROP)) { dropSelectedItem(isKeyDown(KeyType::SNEAK)); + } else if (wasKeyDown(KeyType::SWAP_OFFHAND)) { + swapOffhand(); } else if (wasKeyDown(KeyType::AUTOFORWARD)) { toggleAutoforward(); } else if (wasKeyDown(KeyType::BACKWARD)) { @@ -2216,6 +2219,34 @@ void Game::dropSelectedItem(bool single_item) } +void Game::swapOffhand() +{ + + IMoveAction *a = new IMoveAction(); + a->count = 0; + a->from_inv.setCurrentPlayer(); + a->from_list = "main"; + a->from_i = client->getEnv().getLocalPlayer()->getWieldIndex(); + a->to_inv.setCurrentPlayer(); + a->to_list = "offhand"; + a->to_i = 0; + + ItemStack selected; + client->getEnv().getLocalPlayer()->getWieldedItem(&selected, nullptr); + + if (selected.name == "") { + auto tmp_list = a->from_list; + auto tmp_i = a->from_i; + a->from_list = a->to_list; + a->from_i = a->to_i; + a->to_list = tmp_list; + a->to_i = tmp_i; + } + + client->inventoryAction(a); +} + + void Game::openInventory() { /* @@ -4200,6 +4231,14 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, runData.damage_flash -= 384.0f * dtime; } + /* + ==================== End scene ==================== + */ + + driver->endScene(); + + stats->drawtime = tt_draw.stop(true); + g_profiler->graphAdd("Draw scene [us]", stats->drawtime); g_profiler->avg("Game::updateFrame(): update frame [ms]", tt_update.stop(true)); } diff --git a/src/client/inputhandler.cpp b/src/client/inputhandler.cpp index 5c91898bc..b113e16a9 100644 --- a/src/client/inputhandler.cpp +++ b/src/client/inputhandler.cpp @@ -44,6 +44,7 @@ void KeyCache::populate() key[KeyType::AUTOFORWARD] = getKeySetting("keymap_autoforward"); key[KeyType::DROP] = getKeySetting("keymap_drop"); + key[KeyType::SWAP_OFFHAND] = getKeySetting("keymap_swap_offhand"); key[KeyType::INVENTORY] = getKeySetting("keymap_inventory"); key[KeyType::CHAT] = getKeySetting("keymap_chat"); key[KeyType::CMD] = getKeySetting("keymap_cmd"); diff --git a/src/client/keys.h b/src/client/keys.h index e120a2d92..989eb528c 100644 --- a/src/client/keys.h +++ b/src/client/keys.h @@ -42,6 +42,7 @@ public: // Other DROP, + SWAP_OFFHAND, INVENTORY, CHAT, CMD, diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 0e0ba72b2..cb47c8be7 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -86,6 +86,7 @@ void set_default_settings() settings->setDefault("keymap_dig", "KEY_LBUTTON"); settings->setDefault("keymap_place", "KEY_RBUTTON"); settings->setDefault("keymap_drop", "KEY_KEY_Q"); + settings->setDefault("keymap_swap_offhand", "KEY_KEY_F"); settings->setDefault("keymap_zoom", "KEY_KEY_Z"); settings->setDefault("keymap_inventory", "KEY_KEY_I"); settings->setDefault("keymap_aux1", "KEY_KEY_E"); diff --git a/src/gui/guiKeyChangeMenu.cpp b/src/gui/guiKeyChangeMenu.cpp index 3d8c13e5e..87024b4d8 100644 --- a/src/gui/guiKeyChangeMenu.cpp +++ b/src/gui/guiKeyChangeMenu.cpp @@ -58,6 +58,7 @@ enum GUI_ID_KEY_CONSOLE_BUTTON, GUI_ID_KEY_SNEAK_BUTTON, GUI_ID_KEY_DROP_BUTTON, + GUI_ID_KEY_SWAP_OFFHAND_BUTTON, GUI_ID_KEY_INVENTORY_BUTTON, GUI_ID_KEY_HOTBAR_PREV_BUTTON, GUI_ID_KEY_HOTBAR_NEXT_BUTTON, @@ -391,6 +392,7 @@ void GUIKeyChangeMenu::init_keys() this->add_key(GUI_ID_KEY_JUMP_BUTTON, wstrgettext("Jump"), "keymap_jump"); this->add_key(GUI_ID_KEY_SNEAK_BUTTON, wstrgettext("Sneak"), "keymap_sneak"); this->add_key(GUI_ID_KEY_DROP_BUTTON, wstrgettext("Drop"), "keymap_drop"); + this->add_key(GUI_ID_KEY_SWAP_OFFHAND_BUTTON, wstrgettext("Swap hand items"), "keymap_swap_offhand"); this->add_key(GUI_ID_KEY_INVENTORY_BUTTON, wstrgettext("Inventory"), "keymap_inventory"); this->add_key(GUI_ID_KEY_HOTBAR_PREV_BUTTON, wstrgettext("Prev. item"), "keymap_hotbar_previous"); this->add_key(GUI_ID_KEY_HOTBAR_NEXT_BUTTON, wstrgettext("Next item"), "keymap_hotbar_next");