Client and server now use NetCommand to fill outgoing NetPackets and use the byte stream to parse the received NetPackets. This is a preparation to put multiple commands into one packet.

This commit is contained in:
Benjamin Berkels 2018-07-28 18:05:41 +02:00
parent 43891c3103
commit a07f8feb75
4 changed files with 50 additions and 41 deletions

View file

@ -76,8 +76,10 @@ NetClient::NetClient(FString server)
NetPacket packet; NetPacket packet;
packet.node = mServerNode; packet.node = mServerNode;
packet.size = 1;
packet[0] = (uint8_t)NetPacketType::ConnectRequest; NetCommand cmd ( NetPacketType::ConnectRequest );
cmd.writeCommandToPacket ( packet );
mComm->PacketSend(packet); mComm->PacketSend(packet);
} }
@ -101,7 +103,7 @@ void NetClient::Update()
} }
else else
{ {
NetPacketType type = (NetPacketType)packet[0]; NetPacketType type = (NetPacketType)packet.stream.ReadByte();
switch (type) switch (type)
{ {
default: OnClose(packet); break; default: OnClose(packet); break;
@ -137,10 +139,12 @@ void NetClient::EndCurrentTic()
{ {
NetPacket packet; NetPacket packet;
packet.node = mServerNode; packet.node = mServerNode;
packet.size = 2 + sizeof(usercmd_t);
packet[0] = (uint8_t)NetPacketType::Tic; NetCommand cmd ( NetPacketType::Tic );
packet[1] = 0; // target gametic cmd.addByte ( 0 ); // target gametic
memcpy(&packet[2], &mCurrentInput[consoleplayer].ucmd, sizeof(usercmd_t)); cmd.addBuffer ( &mCurrentInput[consoleplayer].ucmd, sizeof(usercmd_t) );
cmd.writeCommandToPacket ( packet );
mComm->PacketSend(packet); mComm->PacketSend(packet);
mCurrentCommands = mSendCommands; mCurrentCommands = mSendCommands;
@ -220,17 +224,18 @@ void NetClient::OnClose(const NetPacket &packet)
} }
} }
void NetClient::OnConnectResponse(const NetPacket &packet) void NetClient::OnConnectResponse(NetPacket &packet)
{ {
if (packet.size != 3) if (packet.size != 3)
return; return;
int version = packet[1]; // Protocol version int version = packet.stream.ReadByte(); // Protocol version
if (version == 1) if (version == 1)
{ {
if (packet[2] != 255) // Join accepted int playernum = packet.stream.ReadByte();
if (playernum != 255) // Join accepted
{ {
mPlayer = packet[2]; mPlayer = playernum;
mStatus = NodeStatus::InGame; mStatus = NodeStatus::InGame;
G_InitClientNetGame(mPlayer, "e1m1"); G_InitClientNetGame(mPlayer, "e1m1");
@ -262,17 +267,17 @@ void NetClient::OnDisconnect(const NetPacket &packet)
mStatus = NodeStatus::Closed; mStatus = NodeStatus::Closed;
} }
void NetClient::OnTic(const NetPacket &packet) void NetClient::OnTic(NetPacket &packet)
{ {
if (packet.size != 2 + sizeof(float) * 5) if (packet.size != 2 + sizeof(float) * 5)
return; return;
int tic = packet[1]; int tic = packet.stream.ReadByte();
float x = *(float*)&packet[2]; float x = packet.stream.ReadFloat();
float y = *(float*)&packet[6]; float y = packet.stream.ReadFloat();
float z = *(float*)&packet[10]; float z = packet.stream.ReadFloat();
float yaw = *(float*)&packet[14]; float yaw = packet.stream.ReadFloat();
float pitch = *(float*)&packet[18]; float pitch = packet.stream.ReadFloat();
if (playeringame[consoleplayer] && players[consoleplayer].mo) if (playeringame[consoleplayer] && players[consoleplayer].mo)
{ {

View file

@ -51,9 +51,9 @@ public:
private: private:
void OnClose(const NetPacket &packet); void OnClose(const NetPacket &packet);
void OnConnectResponse(const NetPacket &packet); void OnConnectResponse(NetPacket &packet);
void OnDisconnect(const NetPacket &packet); void OnDisconnect(const NetPacket &packet);
void OnTic(const NetPacket &packet); void OnTic(NetPacket &packet);
std::unique_ptr<doomcom_t> mComm; std::unique_ptr<doomcom_t> mComm;
int mServerNode = -1; int mServerNode = -1;

View file

@ -91,7 +91,7 @@ void NetServer::Update()
} }
else else
{ {
NetPacketType type = (NetPacketType)packet[0]; NetPacketType type = (NetPacketType)packet.stream.ReadByte();
switch (type) switch (type)
{ {
default: OnClose(node, packet); break; default: OnClose(node, packet); break;
@ -117,27 +117,28 @@ void NetServer::EndCurrentTic()
{ {
NetPacket packet; NetPacket packet;
packet.node = i; packet.node = i;
packet.size = 2 + sizeof(float) * 5;
packet[0] = (uint8_t)NetPacketType::Tic; NetCommand cmd ( NetPacketType::Tic);
packet[1] = gametic; cmd.addByte ( gametic );
int player = mNodes[i].Player; int player = mNodes[i].Player;
if (playeringame[player] && players[player].mo) if (playeringame[player] && players[player].mo)
{ {
*(float*)&packet[2] = (float)players[player].mo->X(); cmd.addFloat ( static_cast<float> ( players[player].mo->X() ) );
*(float*)&packet[6] = (float)players[player].mo->Y(); cmd.addFloat ( static_cast<float> ( players[player].mo->Y() ) );
*(float*)&packet[10] = (float)players[player].mo->Z(); cmd.addFloat ( static_cast<float> ( players[player].mo->Z() ) );
*(float*)&packet[14] = (float)players[player].mo->Angles.Yaw.Degrees; cmd.addFloat ( static_cast<float> ( players[player].mo->Angles.Yaw.Degrees ) );
*(float*)&packet[18] = (float)players[player].mo->Angles.Pitch.Degrees; cmd.addFloat ( static_cast<float> ( players[player].mo->Angles.Pitch.Degrees ) );
} }
else else
{ {
*(float*)&packet[2] = 0.0f; cmd.addFloat ( 0.0f );
*(float*)&packet[6] = 0.0f; cmd.addFloat ( 0.0f );
*(float*)&packet[10] = 0.0f; cmd.addFloat ( 0.0f );
*(float*)&packet[14] = 0.0f; cmd.addFloat ( 0.0f );
*(float*)&packet[18] = 0.0f; cmd.addFloat ( 0.0f );
} }
cmd.writeCommandToPacket ( packet );
mComm->PacketSend(packet); mComm->PacketSend(packet);
} }
@ -264,10 +265,12 @@ void NetServer::OnConnectRequest(NetNode &node, const NetPacket &packet)
NetPacket response; NetPacket response;
response.node = packet.node; response.node = packet.node;
response[0] = (uint8_t)NetPacketType::ConnectResponse;
response[1] = 1; // Protocol version NetCommand cmd ( NetPacketType::ConnectResponse );
response[2] = 255; cmd.addByte ( 1 ); // Protocol version
response.size = 3; cmd.addByte ( 255 );
cmd.writeCommandToPacket ( response );
mComm->PacketSend(response); mComm->PacketSend(response);
node.Status = NodeStatus::Closed; node.Status = NodeStatus::Closed;
@ -290,14 +293,15 @@ void NetServer::OnDisconnect(NetNode &node, const NetPacket &packet)
mComm->Close(packet.node); mComm->Close(packet.node);
} }
void NetServer::OnTic(NetNode &node, const NetPacket &packet) void NetServer::OnTic(NetNode &node, NetPacket &packet)
{ {
if (node.Status == NodeStatus::InGame) if (node.Status == NodeStatus::InGame)
{ {
if (packet.size != 2 + sizeof(usercmd_t)) if (packet.size != 2 + sizeof(usercmd_t))
return; return;
memcpy(&mCurrentInput[node.Player].ucmd, &packet[2], sizeof(usercmd_t)); /* gametic */ packet.stream.ReadByte();
packet.stream.ReadBuffer ( &mCurrentInput[node.Player].ucmd, sizeof(usercmd_t));
} }
else else
{ {

View file

@ -72,7 +72,7 @@ private:
void OnClose(NetNode &node, const NetPacket &packet); void OnClose(NetNode &node, const NetPacket &packet);
void OnConnectRequest(NetNode &node, const NetPacket &packet); void OnConnectRequest(NetNode &node, const NetPacket &packet);
void OnDisconnect(NetNode &node, const NetPacket &packet); void OnDisconnect(NetNode &node, const NetPacket &packet);
void OnTic(NetNode &node, const NetPacket &packet); void OnTic(NetNode &node, NetPacket &packet);
std::unique_ptr<doomcom_t> mComm; std::unique_ptr<doomcom_t> mComm;
NetNode mNodes[MAXNETNODES]; NetNode mNodes[MAXNETNODES];