Wieldhand: Specify which ItemStack to use (#8961)
authorSmallJoker <SmallJoker@users.noreply.github.com>
Sat, 21 Sep 2019 09:44:24 +0000 (11:44 +0200)
committerGitHub <noreply@github.com>
Sat, 21 Sep 2019 09:44:24 +0000 (11:44 +0200)
Makes 'get_wield_item' to return the "main" ItemStack

doc/lua_api.txt
src/content_sao.cpp
src/content_sao.h
src/network/serverpackethandler.cpp
src/script/lua_api/l_object.cpp
src/serverobject.cpp
src/serverobject.h

index 4eb9c797c6e21b2922f3c5027455b11d0901a3f1..04882ad59d73d234b60767418d79314be8ca0e69 100644 (file)
@@ -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
index 800c74859cb081fc710a6e4cbbaa9a959c2a25b6..90240e2674147e26d86f433abd048598b1803ad8 100644 (file)
@@ -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)
index 2dd839e119f2a888803732d7a7ed90c7a8fee2cf..b8ef5382dc1dd6ad8458aca42d7fc3b3c2c2e377 100644 (file)
@@ -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);
 
        /*
index a642f4a6e36e92fb1da2be24b27c2f98db55169e..0169a57dae833c12baae2e33637036c17797e15f 100644 (file)
@@ -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);
                        }
                }
index 1ad79024fd107880a3d190bc1b3f85e9994de020..22445fc9a91cea1421b9ba91718bf08bf765a54d 100644 (file)
@@ -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;
 }
 
index 4eebc0da4e21554cff5f7d2b9434964a3aa96103..1ed33f66b88c0e7d0cd2760b6b42bb1bbe5e9198 100644 (file)
@@ -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;
 }
index c81abb972722dbfcd4cfe00751b108d8a40f42ab..5ab9885713d5a95bec458693d83b4254113418cf 100644 (file)
@@ -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)
        {