Add control information to player interacts (#4685)
authorraymoo <raymoo@users.noreply.github.com>
Sat, 12 Nov 2016 07:22:39 +0000 (23:22 -0800)
committerZeno- <kde.psych@gmail.com>
Sat, 12 Nov 2016 07:22:39 +0000 (17:22 +1000)
src/client.cpp
src/network/networkpacket.h
src/network/serverpackethandler.cpp
src/server.h

index 62bd274aab557ff7f4d739ac92b7a48282623bf0..3726f5bc478b0a903ad3dbde40daac253f74d344 100644 (file)
@@ -929,6 +929,30 @@ void Client::Send(NetworkPacket* pkt)
                serverCommandFactoryTable[pkt->getCommand()].reliable);
 }
 
+// Will fill up 12 + 12 + 4 + 4 + 4 bytes
+void writePlayerPos(LocalPlayer *myplayer, NetworkPacket *pkt)
+{
+       v3f pf         = myplayer->getPosition() * 100;
+       v3f sf         = myplayer->getSpeed() * 100;
+       s32 pitch      = myplayer->getPitch() * 100;
+       s32 yaw        = myplayer->getYaw() * 100;
+       u32 keyPressed = myplayer->keyPressed;
+
+       v3s32 position(pf.X, pf.Y, pf.Z);
+       v3s32 speed(sf.X, sf.Y, sf.Z);
+
+       /*
+               Format:
+               [0] v3s32 position*100
+               [12] v3s32 speed*100
+               [12+12] s32 pitch*100
+               [12+12+4] s32 yaw*100
+               [12+12+4+4] u32 keyPressed
+       */
+
+       *pkt << position << speed << pitch << yaw << keyPressed;
+}
+
 void Client::interact(u8 action, const PointedThing& pointed)
 {
        if(m_state != LC_Ready) {
@@ -938,12 +962,17 @@ void Client::interact(u8 action, const PointedThing& pointed)
                return;
        }
 
+       LocalPlayer *myplayer = m_env.getLocalPlayer();
+       if (myplayer == NULL)
+               return;
+
        /*
                [0] u16 command
                [2] u8 action
                [3] u16 item
-               [5] u32 length of the next item
+               [5] u32 length of the next item (plen)
                [9] serialized PointedThing
+               [9 + plen] player position information
                actions:
                0: start digging (from undersurface) or use
                1: stop digging (all parameters ignored)
@@ -963,6 +992,8 @@ void Client::interact(u8 action, const PointedThing& pointed)
 
        pkt.putLongString(tmp_os.str());
 
+       writePlayerPos(myplayer, &pkt);
+
        Send(&pkt);
 }
 
@@ -1291,26 +1322,9 @@ void Client::sendPlayerPos()
 
        assert(myplayer->peer_id == our_peer_id);
 
-       v3f pf         = myplayer->getPosition();
-       v3f sf         = myplayer->getSpeed();
-       s32 pitch      = myplayer->getPitch() * 100;
-       s32 yaw        = myplayer->getYaw() * 100;
-       u32 keyPressed = myplayer->keyPressed;
-
-       v3s32 position(pf.X*100, pf.Y*100, pf.Z*100);
-       v3s32 speed(sf.X*100, sf.Y*100, sf.Z*100);
-       /*
-               Format:
-               [0] v3s32 position*100
-               [12] v3s32 speed*100
-               [12+12] s32 pitch*100
-               [12+12+4] s32 yaw*100
-               [12+12+4+4] u32 keyPressed
-       */
-
        NetworkPacket pkt(TOSERVER_PLAYERPOS, 12 + 12 + 4 + 4 + 4);
 
-       pkt << position << speed << pitch << yaw << keyPressed;
+       writePlayerPos(myplayer, &pkt);
 
        Send(&pkt);
 }
index 72f8cabe276e0c3e19af340d27c16eb104a00a89..524470999bf55e75cc9e7a1e428208b05cba858e 100644 (file)
@@ -40,6 +40,7 @@ public:
                u32 getSize() { return m_datasize; }
                u16 getPeerId() { return m_peer_id; }
                u16 getCommand() { return m_command; }
+               const u32 getRemainingBytes() const { return m_datasize - m_read_offset; }
 
                // Returns a c-string without copying.
                // A better name for this would be getRawString()
index 80eec140db94fd04ead4acec60d4ebe1857857c8..d56424b75f076ee558ee76515df7c9476f49ebf2 100644 (file)
@@ -774,9 +774,10 @@ void Server::handleCommand_GotBlocks(NetworkPacket* pkt)
        }
 }
 
-void Server::handleCommand_PlayerPos(NetworkPacket* pkt)
+void Server::process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao,
+       NetworkPacket *pkt)
 {
-       if (pkt->getSize() < 12 + 12 + 4 + 4)
+       if (pkt->getRemainingBytes() < 12 + 12 + 4 + 4)
                return;
 
        v3s32 ps, ss;
@@ -791,7 +792,7 @@ void Server::handleCommand_PlayerPos(NetworkPacket* pkt)
        f32 yaw = (f32)f32yaw / 100.0;
        u32 keyPressed = 0;
 
-       if (pkt->getSize() >= 12 + 12 + 4 + 4 + 4)
+       if (pkt->getRemainingBytes() >= 4)
                *pkt >> keyPressed;
 
        v3f position((f32)ps.X / 100.0, (f32)ps.Y / 100.0, (f32)ps.Z / 100.0);
@@ -800,6 +801,30 @@ void Server::handleCommand_PlayerPos(NetworkPacket* pkt)
        pitch = modulo360f(pitch);
        yaw = modulo360f(yaw);
 
+       playersao->setBasePosition(position);
+       player->setSpeed(speed);
+       playersao->setPitch(pitch);
+       playersao->setYaw(yaw);
+       player->keyPressed = keyPressed;
+       player->control.up = (keyPressed & 1);
+       player->control.down = (keyPressed & 2);
+       player->control.left = (keyPressed & 4);
+       player->control.right = (keyPressed & 8);
+       player->control.jump = (keyPressed & 16);
+       player->control.aux1 = (keyPressed & 32);
+       player->control.sneak = (keyPressed & 64);
+       player->control.LMB = (keyPressed & 128);
+       player->control.RMB = (keyPressed & 256);
+
+       if (playersao->checkMovementCheat()) {
+               // Call callbacks
+               m_script->on_cheat(playersao, "moved_too_fast");
+               SendMovePlayer(pkt->getPeerId());
+       }
+}
+
+void Server::handleCommand_PlayerPos(NetworkPacket* pkt)
+{
        RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
        if (player == NULL) {
                errorstream << "Server::ProcessData(): Canceling: "
@@ -825,26 +850,7 @@ void Server::handleCommand_PlayerPos(NetworkPacket* pkt)
                return;
        }
 
-       playersao->setBasePosition(position);
-       player->setSpeed(speed);
-       playersao->setPitch(pitch);
-       playersao->setYaw(yaw);
-       player->keyPressed = keyPressed;
-       player->control.up = (keyPressed & 1);
-       player->control.down = (keyPressed & 2);
-       player->control.left = (keyPressed & 4);
-       player->control.right = (keyPressed & 8);
-       player->control.jump = (keyPressed & 16);
-       player->control.aux1 = (keyPressed & 32);
-       player->control.sneak = (keyPressed & 64);
-       player->control.LMB = (keyPressed & 128);
-       player->control.RMB = (keyPressed & 256);
-
-       if (playersao->checkMovementCheat()) {
-               // Call callbacks
-               m_script->on_cheat(playersao, "moved_too_fast");
-               SendMovePlayer(pkt->getPeerId());
-       }
+       process_PlayerPos(player, playersao, pkt);
 }
 
 void Server::handleCommand_DeletedBlocks(NetworkPacket* pkt)
@@ -1281,15 +1287,13 @@ void Server::handleCommand_Respawn(NetworkPacket* pkt)
 
 void Server::handleCommand_Interact(NetworkPacket* pkt)
 {
-       std::string datastring(pkt->getString(0), pkt->getSize());
-       std::istringstream is(datastring, std::ios_base::binary);
-
        /*
                [0] u16 command
                [2] u8 action
                [3] u16 item
-               [5] u32 length of the next item
+               [5] u32 length of the next item (plen)
                [9] serialized PointedThing
+               [9 + plen] player position information
                actions:
                0: start digging (from undersurface) or use
                1: stop digging (all parameters ignored)
@@ -1297,9 +1301,11 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
                3: place block or item (to abovesurface)
                4: use item
        */
-       u8 action = readU8(is);
-       u16 item_i = readU16(is);
-       std::istringstream tmp_is(deSerializeLongString(is), std::ios::binary);
+       u8 action;
+       u16 item_i;
+       *pkt >> action;
+       *pkt >> item_i;
+       std::istringstream tmp_is(pkt->readLongString(), std::ios::binary);
        PointedThing pointed;
        pointed.deSerialize(tmp_is);
 
@@ -1331,6 +1337,8 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
                return;
        }
 
+       process_PlayerPos(player, playersao, pkt);
+
        v3f player_pos = playersao->getLastGoodPosition();
 
        // Update wielded item
index f8b3ec106484035cb354179e2f593a4c57d097b2..9e844e36c3531ccf641dbefef209c3bfc0d76c7c 100644 (file)
@@ -197,6 +197,10 @@ public:
 
        void Send(NetworkPacket* pkt);
 
+       // Helper for handleCommand_PlayerPos and handleCommand_Interact
+       void process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao,
+               NetworkPacket *pkt);
+
        // Both setter and getter need no envlock,
        // can be called freely from threads
        void setTimeOfDay(u32 time);