Skip to content

Commit

Permalink
- hook up NetNodeInput and NetNodeOutput
Browse files Browse the repository at this point in the history
  • Loading branch information
dpjudas committed Jul 18, 2019
1 parent 8491828 commit 1ed3f18
Show file tree
Hide file tree
Showing 12 changed files with 292 additions and 370 deletions.
4 changes: 2 additions & 2 deletions src/d_main.cpp
Expand Up @@ -1061,7 +1061,7 @@ class PlaySim

for (int i = 0; i < tics; i++)
{
network->SetCurrentTic(gametime.BaseGameTic() + i);
network->BeginTic();
network->WriteLocalInput(G_BuildTiccmd());

if (advancedemo)
Expand All @@ -1071,7 +1071,7 @@ class PlaySim
M_Ticker();
G_Ticker();

network->EndCurrentTic();
network->EndTic();
LoopBackCommands();
}

Expand Down
9 changes: 3 additions & 6 deletions src/network/net.h
Expand Up @@ -40,11 +40,9 @@ class Network
// Check for incoming packets
virtual void Update() = 0;

// Set current tic time
virtual void SetCurrentTic(int localtic) = 0;

// Send any pending outgoing data
virtual void EndCurrentTic() = 0;
// Called when starting and ending a playsim tic
virtual void BeginTic() = 0;
virtual void EndTic() = 0;

// Retrieve data about the current tic
virtual int GetSendTick() const = 0;
Expand All @@ -57,7 +55,6 @@ class Network

// Statistics
virtual int GetPing(int player) const = 0;
virtual int GetServerPing() const = 0;
int GetHighPingThreshold() const { return ((BACKUPTICS / 2 - 1)) * (1000 / TICRATE); }

// CCMDs
Expand Down
176 changes: 71 additions & 105 deletions src/network/netclient.cpp
Expand Up @@ -77,13 +77,9 @@ NetClient::NetClient(FString server)
mServerNode = mComm->Connect(server);
mStatus = NodeStatus::InPreGame;

NetOutputPacket packet(mServerNode);

NetCommand cmd ( NetPacketType::ConnectRequest );
cmd.addString("ZDoom Connect Request");
cmd.writeCommandToStream (packet.stream);

mComm->PacketSend(packet);
NetCommand cmd(NetPacketType::ConnectRequest);
cmd.AddString("ZDoom Connect Request");
cmd.WriteToNode(mOutput);
}

void NetClient::Update()
Expand All @@ -95,77 +91,81 @@ void NetClient::Update()
if (packet.node == -1)
break;

if (packet.node != mServerNode)
if (packet.node == mServerNode)
{
mComm->Close(packet.node);
mInput.ReceivedPacket(packet, mOutput);
}
else if (packet.stream.IsAtEnd())
else
{
OnClose();
break;
mComm->Close(packet.node);
}
else
}

while (mStatus == NodeStatus::InPreGame)
{
mOutput.Send(mComm.get(), mServerNode);

ByteInputStream message = mInput.ReadMessage();
if (message.IsAtEnd())
break;

NetPacketType type = (NetPacketType)message.ReadByte();
switch (type)
{
UpdateLastReceivedTic(packet.stream.ReadByte());

if (mStatus == NodeStatus::InPreGame)
{
ProcessCommands(packet.stream);
}
else
{
auto &ticUpdate = mTicUpdates[mLastReceivedTic % BACKUPTICS];
ticUpdate.Resize(packet.stream.BytesLeft());
packet.stream.ReadBuffer(ticUpdate.Data(), ticUpdate.Size());
}
default: OnClose(); break;
case NetPacketType::ConnectResponse: OnConnectResponse(message); break;
}
}

if (mStatus == NodeStatus::Closed)
if (mStatus == NodeStatus::Closed)
{
if (network.get() == this)
{
network.reset(new NetSinglePlayer());
G_EndNetGame();
}
else
{
if (network.get() == this)
{
network.reset(new NetSinglePlayer());
G_EndNetGame();
}
else
{
netconnect.reset();
}
return;
netconnect.reset();
}
}
}

void NetClient::SetCurrentTic(int tictime)
void NetClient::BeginTic()
{
gametic = tictime;
mSendTic = gametic + 10;
// [BB] Don't check net packets while we are supposed to load a map.
// This way the commands from the full update will not be parsed before we loaded the map.
if ((gameaction == ga_newgame) || (gameaction == ga_newgame2))
return;

if (abs(gametic + mServerTicDelta - mLastReceivedTic) > jitter)
while (mStatus == NodeStatus::InGame)
{
mServerTicDelta = mLastReceivedTic - gametic - jitter;
}
ByteInputStream message = mInput.ReadMessage();
if (message.IsAtEnd())
break;

mServerTic = MAX(gametic + mServerTicDelta, 0);
//UpdateLastReceivedTic(message.ReadByte());

mCurrentInput[consoleplayer] = mSentInput[gametic % BACKUPTICS];
NetPacketType type = (NetPacketType)message.ReadByte();
switch (type)
{
default: OnClose(); break;
case NetPacketType::Disconnect: OnDisconnect(); break;
case NetPacketType::Tic: OnTic(message); break;
case NetPacketType::SpawnActor: OnSpawnActor(message); break;
case NetPacketType::DestroyActor: OnDestroyActor(message); break;
}
}

// [BB] Don't check net packets while we are supposed to load a map.
// This way the commands from the full update will not be parsed before we loaded the map.
//if ((gameaction == ga_newgame) || (gameaction == ga_newgame2))
// return;
gametic = mReceiveTic;
mSendTic++;

TArray<uint8_t> &update = mTicUpdates[mServerTic % BACKUPTICS];
if (update.Size() > 0)
{
ByteInputStream stream(update.Data(), update.Size());
ProcessCommands(stream);
update.Clear();
}
mCurrentInput[consoleplayer] = mSentInput[gametic % BACKUPTICS];
}

void NetClient::EndCurrentTic()
void NetClient::EndTic()
{
mOutput.Send(mComm.get(), mServerNode);
}

int NetClient::GetSendTick() const
Expand All @@ -189,16 +189,10 @@ void NetClient::WriteLocalInput(ticcmd_t ticcmd)

if (mStatus == NodeStatus::InGame)
{
int targettic = (mSendTic + mServerTicDelta);

NetOutputPacket packet(mServerNode);

NetCommand cmd(NetPacketType::Tic);
cmd.addByte(targettic); // target gametic
cmd.addBuffer(&ticcmd.ucmd, sizeof(usercmd_t));
cmd.writeCommandToStream(packet.stream);

mComm->PacketSend(packet);
cmd.AddByte(mSendTic);
cmd.AddBuffer(&ticcmd.ucmd, sizeof(usercmd_t));
cmd.WriteToNode(mOutput, true);
}
}

Expand All @@ -209,12 +203,10 @@ void NetClient::WriteBotInput(int player, const ticcmd_t &cmd)

int NetClient::GetPing(int player) const
{
return 0;
}

int NetClient::GetServerPing() const
{
return 0;
if (player == consoleplayer)
return (mSendTic - mReceiveTic) * 1000 / TICRATE;
else
return 0;
}

void NetClient::ListPingTimes()
Expand All @@ -234,39 +226,6 @@ void NetClient::ActorDestroyed(AActor *actor)
{
}

void NetClient::UpdateLastReceivedTic(int tic)
{
if (mLastReceivedTic != -1)
{
int delta = tic - (mLastReceivedTic & 0xff);
if (delta > 128) delta -= 256;
else if (delta < -128) delta += 256;
mLastReceivedTic += delta;
}
else
{
mLastReceivedTic = tic;
}
mLastReceivedTic = MAX(mLastReceivedTic, 0);
}

void NetClient::ProcessCommands(ByteInputStream &stream)
{
while (stream.IsAtEnd() == false)
{
NetPacketType type = (NetPacketType)stream.ReadByte();
switch (type)
{
default: OnClose(); break;
case NetPacketType::ConnectResponse: OnConnectResponse(stream); break;
case NetPacketType::Disconnect: OnDisconnect(); break;
case NetPacketType::Tic: OnTic(stream); break;
case NetPacketType::SpawnActor: OnSpawnActor(stream); break;
case NetPacketType::DestroyActor: OnDestroyActor(stream); break;
}
}
}

void NetClient::OnClose()
{
mComm->Close(mServerNode);
Expand All @@ -293,7 +252,6 @@ void NetClient::OnConnectResponse(ByteInputStream &stream)
{
mPlayer = playernum;
mStatus = NodeStatus::InGame;
mServerTicDelta = mLastReceivedTic - gametic - jitter;

G_InitClientNetGame(mPlayer, "e1m1");

Expand Down Expand Up @@ -326,6 +284,14 @@ void NetClient::OnDisconnect()

void NetClient::OnTic(ByteInputStream &stream)
{
int inputtic = stream.ReadByte();
int delta = (mSendTic & 0xff) - inputtic;
if (delta < -0x7f)
delta += 0xff;
else if (delta > 0x7f)
delta -= 0xff;
mReceiveTic = std::max(mSendTic - delta, 0);

DVector3 Pos, Vel;
float yaw, pitch;
Pos.X = stream.ReadFloat();
Expand Down
21 changes: 7 additions & 14 deletions src/network/netclient.h
Expand Up @@ -23,6 +23,7 @@

#include "netserver.h"
#include "netcommand.h"
#include "netnode.h"
#include "playsim/a_dynlight.h"

class NetClient : public Network
Expand All @@ -32,8 +33,8 @@ class NetClient : public Network

void Update() override;

void SetCurrentTic(int tictime) override;
void EndCurrentTic() override;
void BeginTic() override;
void EndTic() override;

int GetSendTick() const override;
ticcmd_t GetPlayerInput(int player) const override;
Expand All @@ -43,7 +44,6 @@ class NetClient : public Network
void WriteBotInput(int player, const ticcmd_t &cmd) override;

int GetPing(int player) const override;
int GetServerPing() const override;

void ListPingTimes() override;
void Network_Controller(int playernum, bool add) override;
Expand All @@ -59,22 +59,15 @@ class NetClient : public Network
void OnSpawnActor(ByteInputStream &stream);
void OnDestroyActor(ByteInputStream &stream);

void ProcessCommands(ByteInputStream &stream);
void UpdateLastReceivedTic(int tic);

std::unique_ptr<doomcom_t> mComm;
NetNodeInput mInput;
NetNodeOutput mOutput;
int mServerNode = -1;
int mPlayer = -1;
NodeStatus mStatus = NodeStatus::Closed;

int mSendTic = 0;
int mServerTic = 0;
int mServerTicDelta = -1;
int mLastReceivedTic = -1;

int jitter = 2;

TArray<uint8_t> mTicUpdates[BACKUPTICS];
int mReceiveTic = 0;
int mSendTic = 1;

ticcmd_t mCurrentInput[MAXPLAYERS];
ticcmd_t mSentInput[BACKUPTICS];
Expand Down

0 comments on commit 1ed3f18

Please sign in to comment.