aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorraymoo <raymoo@users.noreply.github.com>2016-11-11 23:22:39 -0800
committerZeno- <kde.psych@gmail.com>2016-11-12 17:22:39 +1000
commite4031156f13d062b03960e7ef1c9221f749f884b (patch)
tree9c7223d972521560d99a8438cbf1efcc00e3b32c
parent67ec2fa92d7441e0dab0fdc222003e916f3b5efa (diff)
downloadminetest-e4031156f13d062b03960e7ef1c9221f749f884b.tar.gz
minetest-e4031156f13d062b03960e7ef1c9221f749f884b.tar.bz2
minetest-e4031156f13d062b03960e7ef1c9221f749f884b.zip
Add control information to player interacts (#4685)
-rw-r--r--src/client.cpp52
-rw-r--r--src/network/networkpacket.h1
-rw-r--r--src/network/serverpackethandler.cpp68
-rw-r--r--src/server.h4
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);