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

View file

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

View file

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

View file

@ -72,7 +72,7 @@ private:
void OnClose(NetNode &node, const NetPacket &packet);
void OnConnectRequest(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;
NetNode mNodes[MAXNETNODES];