diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 4eb9c797c..04882ad59 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2556,8 +2556,7 @@ Player Inventory lists * `craftresult`: list containing the crafted output * `hand`: list containing an override for the empty hand * Is not created automatically, use `InvRef:set_size` - - + * Is only used to enhance the empty hand's tool capabilities Colors diff --git a/src/content_sao.cpp b/src/content_sao.cpp index 800c74859..90240e267 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -638,12 +638,13 @@ int LuaEntitySAO::punch(v3f dir, FATAL_ERROR_IF(!puncher, "Punch action called without SAO"); s32 old_hp = getHP(); - const ItemStack &punchitem = puncher->getWieldedItem(); + ItemStack selected_item, hand_item; + ItemStack tool_item = puncher->getWieldedItem(&selected_item, &hand_item); PunchDamageResult result = getPunchDamage( m_armor_groups, toolcap, - &punchitem, + &tool_item, time_from_last_punch); bool damage_handled = m_env->getScriptIface()->luaentity_Punch(m_id, puncher, @@ -1376,10 +1377,9 @@ u16 PlayerSAO::getWieldIndex() const return m_player->getWieldIndex(); } -ItemStack PlayerSAO::getWieldedItem() const +ItemStack PlayerSAO::getWieldedItem(ItemStack *selected, ItemStack *hand) const { - ItemStack selected_item, hand_item; - return m_player->getWieldedItem(&selected_item, &hand_item); + return m_player->getWieldedItem(selected, hand); } bool PlayerSAO::setWieldedItem(const ItemStack &item) diff --git a/src/content_sao.h b/src/content_sao.h index 2dd839e11..b8ef5382d 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -277,7 +277,7 @@ public: void setInventoryModified() {} std::string getWieldList() const { return "main"; } u16 getWieldIndex() const; - ItemStack getWieldedItem() const; + ItemStack getWieldedItem(ItemStack *selected, ItemStack *hand = nullptr) const; bool setWieldedItem(const ItemStack &item); /* diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index a642f4a6e..0169a57da 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -1150,9 +1150,10 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) if (pointed_object->isGone()) return; - ItemStack punchitem = playersao->getWieldedItem(); + ItemStack selected_item, hand_item; + ItemStack tool_item = playersao->getWieldedItem(&selected_item, &hand_item); ToolCapabilities toolcap = - punchitem.getToolCapabilities(m_itemdef); + tool_item.getToolCapabilities(m_itemdef); v3f dir = (pointed_object->getBasePosition() - (playersao->getBasePosition() + playersao->getEyeOffset()) ).normalize(); @@ -1291,11 +1292,12 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) 3: place block or right-click object */ else if (action == INTERACT_PLACE) { - ItemStack item = playersao->getWieldedItem(); + ItemStack selected_item; + playersao->getWieldedItem(&selected_item, nullptr); // Reset build time counter if (pointed.type == POINTEDTHING_NODE && - item.getDefinition(m_itemdef).type == ITEM_NODE) + selected_item.getDefinition(m_itemdef).type == ITEM_NODE) getClient(pkt->getPeerId())->m_time_from_building = 0.0; if (pointed.type == POINTEDTHING_OBJECT) { @@ -1311,13 +1313,12 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) // Do stuff pointed_object->rightClick(playersao); - } - else if (m_script->item_OnPlace( - item, playersao, pointed)) { + } else if (m_script->item_OnPlace( + selected_item, playersao, pointed)) { // Placement was handled in lua // Apply returned ItemStack - if (playersao->setWieldedItem(item)) { + if (playersao->setWieldedItem(selected_item)) { SendInventory(playersao, true); } } @@ -1327,7 +1328,7 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) RemoteClient *client = getClient(pkt->getPeerId()); v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_above, BS)); v3s16 blockpos2 = getNodeBlockPos(floatToInt(pointed_pos_under, BS)); - if (!item.getDefinition(m_itemdef).node_placement_prediction.empty()) { + if (!selected_item.getDefinition(m_itemdef).node_placement_prediction.empty()) { client->SetBlockNotSent(blockpos); if (blockpos2 != blockpos) { client->SetBlockNotSent(blockpos2); @@ -1345,15 +1346,16 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) 4: use */ else if (action == INTERACT_USE) { - ItemStack item = playersao->getWieldedItem(); + ItemStack selected_item; + playersao->getWieldedItem(&selected_item, nullptr); - actionstream << player->getName() << " uses " << item.name + actionstream << player->getName() << " uses " << selected_item.name << ", pointing at " << pointed.dump() << std::endl; if (m_script->item_OnUse( - item, playersao, pointed)) { + selected_item, playersao, pointed)) { // Apply returned ItemStack - if (playersao->setWieldedItem(item)) { + if (playersao->setWieldedItem(selected_item)) { SendInventory(playersao, true); } } @@ -1364,14 +1366,15 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) 5: rightclick air */ else if (action == INTERACT_ACTIVATE) { - ItemStack item = playersao->getWieldedItem(); + ItemStack selected_item; + playersao->getWieldedItem(&selected_item, nullptr); actionstream << player->getName() << " activates " - << item.name << std::endl; + << selected_item.name << std::endl; if (m_script->item_OnSecondaryUse( - item, playersao)) { - if( playersao->setWieldedItem(item)) { + selected_item, playersao)) { + if (playersao->setWieldedItem(selected_item)) { SendInventory(playersao, true); } } diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 1ad79024f..22445fc9a 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -340,7 +340,9 @@ int ObjectRef::l_get_wielded_item(lua_State *L) return 1; } - LuaItemStack::create(L, co->getWieldedItem()); + ItemStack selected_item; + co->getWieldedItem(&selected_item, nullptr); + LuaItemStack::create(L, selected_item); return 1; } diff --git a/src/serverobject.cpp b/src/serverobject.cpp index 4eebc0da4..1ed33f66b 100644 --- a/src/serverobject.cpp +++ b/src/serverobject.cpp @@ -68,25 +68,16 @@ float ServerActiveObject::getMinimumSavedMovement() return 2.0*BS; } -ItemStack ServerActiveObject::getWieldedItem() const +ItemStack ServerActiveObject::getWieldedItem(ItemStack *selected, ItemStack *hand) const { - const Inventory *inv = getInventory(); - if(inv) - { - const InventoryList *list = inv->getList(getWieldList()); - if(list && (getWieldIndex() < (s32)list->getSize())) - return list->getItem(getWieldIndex()); - } + *selected = ItemStack(); + if (hand) + *hand = ItemStack(); + return ItemStack(); } bool ServerActiveObject::setWieldedItem(const ItemStack &item) { - if(Inventory *inv = getInventory()) { - if (InventoryList *list = inv->getList(getWieldList())) { - list->changeItem(getWieldIndex(), item); - return true; - } - } return false; } diff --git a/src/serverobject.h b/src/serverobject.h index c81abb972..5ab988571 100644 --- a/src/serverobject.h +++ b/src/serverobject.h @@ -180,7 +180,8 @@ public: { return ""; } virtual u16 getWieldIndex() const { return 0; } - virtual ItemStack getWieldedItem() const; + virtual ItemStack getWieldedItem(ItemStack *selected, + ItemStack *hand = nullptr) const; virtual bool setWieldedItem(const ItemStack &item); inline void attachParticleSpawner(u32 id) {