Clients inform server on wielded item
authorGiuseppe Bilotta <giuseppe.bilotta@gmail.com>
Wed, 10 Aug 2011 19:43:40 +0000 (21:43 +0200)
committerGiuseppe Bilotta <giuseppe.bilotta@gmail.com>
Thu, 11 Aug 2011 13:22:36 +0000 (15:22 +0200)
This is done with the new TOSERVER_PLAYERITEM message, that informs the
server on the index of the wielded item.

src/client.cpp
src/client.h
src/clientserver.h
src/server.cpp

index 2687d01e0daf209bb51dc31eb6d397027ec17b6f..398b2602dd3f8540ee2c561fda56a03e87e9645c 100644 (file)
@@ -1864,6 +1864,28 @@ void Client::sendPlayerPos()
        Send(0, data, false);
 }
 
+void Client::sendPlayerItem(u16 item)
+{
+       Player *myplayer = m_env.getLocalPlayer();
+       if(myplayer == NULL)
+               return;
+
+       u16 our_peer_id = m_con.GetPeerID();
+
+       // Set peer id if not set already
+       if(myplayer->peer_id == PEER_ID_INEXISTENT)
+               myplayer->peer_id = our_peer_id;
+       // Check that an existing peer_id is the same as the connection's
+       assert(myplayer->peer_id == our_peer_id);
+
+       SharedBuffer<u8> data(2+2);
+       writeU16(&data[0], TOSERVER_PLAYERITEM);
+       writeU16(&data[2], item);
+
+       // Send as reliable
+       Send(0, data, true);
+}
+
 void Client::removeNode(v3s16 p)
 {
        //JMutexAutoLock envlock(m_env_mutex); //bulk comment-out
@@ -1959,6 +1981,8 @@ void Client::selectPlayerItem(u16 item)
        assert(player != NULL);
 
        player->wieldItem(item);
+
+       sendPlayerItem(item);
 }
 
 // Returns true if the inventory of the local player has been
index d21764f751c3fc310c6be09bff16dadba5cdf7fc..963eb67025ba2e1bf25b04de97f8f739dc0c6d6d 100644 (file)
@@ -318,6 +318,8 @@ private:
        void sendPlayerPos();
        // This sends the player's current name etc to the server
        void sendPlayerInfo();
+       // Send the item number 'item' as player item to the server
+       void sendPlayerItem(u16 item);
        
        float m_packetcounter_timer;
        float m_connection_reinit_timer;
index 4981b7ea8c845f7ff4fe75c54fa78aa89787e9ce..717e657b710deb4982e97c5e4fff921a93cd8b80 100644 (file)
@@ -301,6 +301,14 @@ enum ToServerCommand
                [30] u8[28] new password
        */
 
+       TOSERVER_PLAYERITEM=0x37,
+       /*
+               Sent to change selected item.
+
+               [0] u16 TOSERVER_PLAYERITEM
+               [2] u16 item
+       */
+
 };
 
 inline SharedBuffer<u8> makePacket_TOCLIENT_TIME_OF_DAY(u16 time)
index c2fb6097e1c3c08747ea3e95e1cad4ece30f00d6..e3747775a22ae91c0a6295a855da12b8854a6602 100644 (file)
@@ -3381,6 +3381,14 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
                                <<std::endl;
                SendChatMessage(peer_id, L"Password change successful");
        }
+       else if (command == TOSERVER_PLAYERITEM)
+       {
+               if (datasize < 2+2)
+                       return;
+
+               u16 item = readU16(&data[2]);
+               player->wieldItem(item);
+       }
        else
        {
                derr_server<<"WARNING: Server::ProcessData(): Ignoring "