From e4031156f13d062b03960e7ef1c9221f749f884b Mon Sep 17 00:00:00 2001 From: raymoo Date: Fri, 11 Nov 2016 23:22:39 -0800 Subject: Add control information to player interacts (#4685) --- src/client.cpp | 52 +++++++++++++++++----------- src/network/networkpacket.h | 1 + src/network/serverpackethandler.cpp | 68 +++++++++++++++++++++---------------- src/server.h | 4 +++ 4 files changed, 76 insertions(+), 49 deletions(-) diff --git a/src/client.cpp b/src/client.cpp index 62bd274aa..3726f5bc4 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -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); } diff --git a/src/network/networkpacket.h b/src/network/networkpacket.h index 72f8cabe2..524470999 100644 --- a/src/network/networkpacket.h +++ b/src/network/networkpacket.h @@ -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() diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index 80eec140d..d56424b75 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -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 diff --git a/src/server.h b/src/server.h index f8b3ec106..9e844e36c 100644 --- a/src/server.h +++ b/src/server.h @@ -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); -- cgit v1.2.3