From 785a9a6c1af424b0a46f334de7176c9e67341cfb Mon Sep 17 00:00:00 2001 From: TeTpaAka Date: Thu, 25 Jun 2015 13:06:49 +0200 Subject: [PATCH] Wieldhand: Allow overriding the hand --- doc/lua_api.txt | 7 ++++++ src/content_sao.cpp | 36 +++++++++++++++++++++++++++++ src/content_sao.h | 2 ++ src/game.cpp | 17 ++++++++++++++ src/network/serverpackethandler.cpp | 5 +--- src/player.cpp | 1 + 6 files changed, 64 insertions(+), 4 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 760a829d..9da0fb4f 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -1759,6 +1759,13 @@ Inventory locations * `"nodemeta:,,"`: Any node metadata * `"detached:"`: A detached inventory +Player Inventory lists +---------------------- +* `main`: list containing the default inventory +* `craft`: list containing the craft input +* `craftpreview`: list containing the craft output +* `hand`: list containing an override for the empty hand + `ColorString` ------------- `#RGB` defines a color in hexadecimal format. diff --git a/src/content_sao.cpp b/src/content_sao.cpp index 6caea519..609673ed 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -1341,6 +1341,42 @@ std::string PlayerSAO::getWieldList() const return "main"; } +ItemStack PlayerSAO::getWieldedItem() const +{ + const Inventory *inv = getInventory(); + ItemStack ret; + const InventoryList *mlist = inv->getList(getWieldList()); + if (mlist && getWieldIndex() < (s32)mlist->getSize()) + ret = mlist->getItem(getWieldIndex()); + if (ret.name.empty()) { + const InventoryList *hlist = inv->getList("hand"); + if (hlist) + ret = hlist->getItem(0); + } + return ret; +} + +bool PlayerSAO::setWieldedItem(const ItemStack &item) +{ + Inventory *inv = getInventory(); + if (inv) { + InventoryList *mlist = inv->getList(getWieldList()); + if (mlist) { + ItemStack olditem = mlist->getItem(getWieldIndex()); + if (olditem.name.empty()) { + InventoryList *hlist = inv->getList("hand"); + if (hlist) { + hlist->changeItem(0, item); + return true; + } + } + mlist->changeItem(getWieldIndex(), item); + return true; + } + } + return false; +} + int PlayerSAO::getWieldIndex() const { return m_wield_index; diff --git a/src/content_sao.h b/src/content_sao.h index f58c7dad..c5b066f5 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -251,6 +251,8 @@ public: const Inventory* getInventory() const; InventoryLocation getInventoryLocation() const; std::string getWieldList() const; + ItemStack getWieldedItem() const; + bool setWieldedItem(const ItemStack &item); int getWieldIndex() const; void setWieldIndex(int i); diff --git a/src/game.cpp b/src/game.cpp index 67168234..e6d38d0a 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -3684,6 +3684,12 @@ void Game::updateCamera(VolatileRunFlags *flags, u32 busy_time, if (mlist && client->getPlayerItem() < mlist->getSize()) playeritem = mlist->getItem(client->getPlayerItem()); } + if (playeritem.getDefinition(itemdef_manager).name.empty()) { // override the hand + InventoryList *hlist = local_inventory->getList("hand"); + if (hlist) + playeritem = hlist->getItem(0); + } + ToolCapabilities playeritem_toolcap = playeritem.getToolCapabilities(itemdef_manager); @@ -3768,6 +3774,11 @@ void Game::processPlayerInteraction(GameRunData *runData, playeritem = mlist->getItem(client->getPlayerItem()); } + if (playeritem.getDefinition(itemdef_manager).name.empty()) { // override the hand + InventoryList *hlist = local_inventory->getList("hand"); + if (hlist) + playeritem = hlist->getItem(0); + } const ItemDefinition &playeritem_def = playeritem.getDefinition(itemdef_manager); @@ -4321,8 +4332,14 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, if (mlist && (client->getPlayerItem() < mlist->getSize())) { ItemStack item = mlist->getItem(client->getPlayerItem()); + if (item.getDefinition(itemdef_manager).name.empty()) { // override the hand + InventoryList *hlist = local_inventory->getList("hand"); + if (hlist) + item = hlist->getItem(0); + } camera->wield(item); } + runData->update_wielded_item_trigger = false; } diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index d56424b7..70eb0a82 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -1529,10 +1529,7 @@ void Server::handleCommand_Interact(NetworkPacket* pkt) m_script->on_cheat(playersao, "finished_unknown_dig"); } // Get player's wielded item - ItemStack playeritem; - InventoryList *mlist = playersao->getInventory()->getList("main"); - if (mlist != NULL) - playeritem = mlist->getItem(playersao->getWieldIndex()); + ItemStack playeritem = playersao->getWieldedItem(); ToolCapabilities playeritem_toolcap = playeritem.getToolCapabilities(m_itemdef); // Get diggability and expected digging time diff --git a/src/player.cpp b/src/player.cpp index 9c321d57..85bc639e 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -40,6 +40,7 @@ Player::Player(const char *name, IItemDefManager *idef): inventory.clear(); inventory.addList("main", PLAYER_INVENTORY_SIZE); + inventory.addList("hand", 1); InventoryList *craft = inventory.addList("craft", 9); craft->setWidth(3); inventory.addList("craftpreview", 1);