Send Inventory packet on event, don't check it at each AsyncRunStep.
authorLoic Blot <loic.blot@unix-experience.fr>
Wed, 4 Mar 2015 10:29:34 +0000 (11:29 +0100)
committerLoic Blot <loic.blot@unix-experience.fr>
Wed, 4 Mar 2015 10:29:39 +0000 (11:29 +0100)
* Call UpdateCrafting into SendInventory because this functions is only called before SendInventory
* Use Player* instead of peer_id for UpdateCrafting because SendInventory already has the Player* pointer, then don't loop for searching Player* per peer_id
* m_env_mutex don't need to be used with this modification because it's already locked before the calls

src/content_sao.cpp
src/content_sao.h
src/network/packethandlers/server.cpp
src/script/lua_api/l_object.cpp
src/server.cpp
src/server.h
src/serverobject.cpp

index 0600689e4b242c8124c93b8a85980e3a247ee24f..ad48f95fbb3d00d2c7d1b6367d7121f4218c1bf4 100644 (file)
@@ -717,7 +717,6 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
        m_attachment_sent(false),
        // public
        m_moved(false),
-       m_inventory_not_sent(false),
        m_physics_override_speed(1),
        m_physics_override_jump(1),
        m_physics_override_gravity(1),
@@ -1162,11 +1161,6 @@ InventoryLocation PlayerSAO::getInventoryLocation() const
        return loc;
 }
 
-void PlayerSAO::setInventoryModified()
-{
-       m_inventory_not_sent = true;
-}
-
 std::string PlayerSAO::getWieldList() const
 {
        return "main";
index 6b7304944d30cd83ecd4b882a50e295ece7270f2..a9302915490bf27946ceb277ca6048dd04ae48c0 100644 (file)
@@ -205,7 +205,6 @@ public:
        Inventory* getInventory();
        const Inventory* getInventory() const;
        InventoryLocation getInventoryLocation() const;
-       void setInventoryModified();
        std::string getWieldList() const;
        int getWieldIndex() const;
        void setWieldIndex(int i);
@@ -317,7 +316,6 @@ private:
 public:
        // Some flags used by Server
        bool m_moved;
-       bool m_inventory_not_sent;
 
        float m_physics_override_speed;
        float m_physics_override_jump;
index 2deede0ca3f6e6ea29f06e58d25bc25f50503a5e..9dd1c95dd2536f8e8f6be7d01a7a07e2bfd8de84 100644 (file)
@@ -1390,7 +1390,9 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
                        // Placement was handled in lua
 
                        // Apply returned ItemStack
-                       playersao->setWieldedItem(item);
+                       if (playersao->setWieldedItem(item)) {
+                               SendInventory(pkt->getPeerId());
+                       }
                }
 
                // If item has node placement prediction, always send the
index 0bc6c0bbcdb97083e5919571061983ee6ec5fd7e..0f3848aace75f2bf22c53e2d962be0040b1d5369 100644 (file)
@@ -355,6 +355,9 @@ int ObjectRef::l_set_wielded_item(lua_State *L)
        // Do it
        ItemStack item = read_item(L, 2, getServer(L));
        bool success = co->setWieldedItem(item);
+       if (success && co->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
+               getServer(L)->SendInventory(((PlayerSAO*)co)->getPeerID());
+       }
        lua_pushboolean(L, success);
        return 1;
 }
index cafeb951dcf298bb68edf961c002118830d96c0f..0bb91d7584cb3557904cc1eee63c6c6143af284f 100644 (file)
@@ -609,14 +609,6 @@ void Server::AsyncRunStep(bool initial_step)
                                SendMovePlayer(*i);
                                playersao->m_moved = false;
                        }
-
-                       /*
-                               Send player inventories if necessary
-                       */
-                       if(playersao->m_inventory_not_sent) {
-                               UpdateCrafting(*i);
-                               SendInventory(*i);
-                       }
                }
        }
 
@@ -1164,7 +1156,6 @@ PlayerSAO* Server::StageTwoClientInit(u16 peer_id)
        SendPlayerInventoryFormspec(peer_id);
 
        // Send inventory
-       UpdateCrafting(peer_id);
        SendInventory(peer_id);
 
        // Send HP
@@ -1385,7 +1376,8 @@ void Server::setInventoryModified(const InventoryLocation &loc)
                PlayerSAO *playersao = player->getPlayerSAO();
                if(!playersao)
                        return;
-               playersao->m_inventory_not_sent = true;
+
+               SendInventory(playersao->getPeerID());
        }
                break;
        case InventoryLocation::NODEMETA:
@@ -1650,7 +1642,7 @@ void Server::SendInventory(u16 peer_id)
        PlayerSAO *playersao = getPlayerSAO(peer_id);
        assert(playersao);
 
-       playersao->m_inventory_not_sent = false;
+       UpdateCrafting(playersao->getPlayer());
 
        /*
                Serialize it
@@ -2701,13 +2693,10 @@ void Server::DeleteClient(u16 peer_id, ClientDeletionReason reason)
                SendChatMessage(PEER_ID_INEXISTENT,message);
 }
 
-void Server::UpdateCrafting(u16 peer_id)
+void Server::UpdateCrafting(Player* player)
 {
        DSTACK(__FUNCTION_NAME);
 
-       Player* player = m_env->getPlayer(peer_id);
-       assert(player);
-
        // Get a preview for crafting
        ItemStack preview;
        InventoryLocation loc;
index 8c5ea2e1e9e619663d4005d2292f8cad6ab4c5f6..b3d5d0fec434fa42c5b14260d46b7d5a94165c77 100644 (file)
@@ -375,6 +375,9 @@ public:
        void SendPlayerHPOrDie(u16 peer_id, bool die) { die ? DiePlayer(peer_id) : SendPlayerHP(peer_id); }
        void SendPlayerBreath(u16 peer_id);
 
+       // Envlock and conlock should be locked when calling these
+       void SendInventory(u16 peer_id);
+
        // Bind address
        Address m_bind_addr;
 
@@ -394,8 +397,7 @@ private:
        /* mark blocks not sent for all clients */
        void SetBlocksNotSent(std::map<v3s16, MapBlock *>& block);
 
-       // Envlock and conlock should be locked when calling these
-       void SendInventory(u16 peer_id);
+
        void SendChatMessage(u16 peer_id, const std::wstring &message);
        void SendTimeOfDay(u16 peer_id, u16 time, f32 time_speed);
        void SendPlayerHP(u16 peer_id);
@@ -466,7 +468,7 @@ private:
        void DiePlayer(u16 peer_id);
        void RespawnPlayer(u16 peer_id);
        void DeleteClient(u16 peer_id, ClientDeletionReason reason);
-       void UpdateCrafting(u16 peer_id);
+       void UpdateCrafting(Player *player);
 
        // When called, connection mutex should be locked
        RemoteClient* getClient(u16 peer_id,ClientState state_min=CS_Active);
index 9cf817859a855d0a1656dc29eff219d98f16c2df..699040bf2599a42716aa4dd0ec471c39183042e8 100644 (file)
@@ -90,14 +90,9 @@ ItemStack ServerActiveObject::getWieldedItem() const
 
 bool ServerActiveObject::setWieldedItem(const ItemStack &item)
 {
-       Inventory *inv = getInventory();
-       if(inv)
-       {
-               InventoryList *list = inv->getList(getWieldList());
-               if (list)
-               {
+       if(Inventory *inv = getInventory()) {
+               if (InventoryList *list = inv->getList(getWieldList())) {
                        list->changeItem(getWieldIndex(), item);
-                       setInventoryModified();
                        return true;
                }
        }