- implement sending some player syncdata each tic

- create ANetSyncActor so the client can spawn objects entirely operated by the server
This commit is contained in:
Magnus Norddahl 2018-11-12 09:26:21 +01:00
parent 6f38ecad9b
commit 567e8e2c55
5 changed files with 82 additions and 12 deletions

View file

@ -197,7 +197,19 @@ void NetClient::EndCurrentTic()
players[consoleplayer].mo->Angles.Pitch = update.pitch;
}
update.received = false;
for (unsigned int i = 0; i < update.syncUpdates.Size(); i++)
{
const TicSyncData &syncdata = update.syncUpdates[i];
AActor *netactor = g_NetIDList.findPointerByID(syncdata.netID);
if (netactor)
{
netactor->SetXYZ(syncdata.x, syncdata.y, syncdata.z);
netactor->Angles.Yaw = syncdata.yaw;
netactor->Angles.Pitch = syncdata.pitch;
}
}
update = TicUpdate();
}
}
@ -341,6 +353,21 @@ void NetClient::OnTic(ByteInputStream &stream)
update.yaw = stream.ReadFloat();
update.pitch = stream.ReadFloat();
while (true)
{
TicSyncData syncdata;
syncdata.netID = stream.ReadShort();
if (syncdata.netID == -1)
break;
syncdata.x = stream.ReadFloat();
syncdata.y = stream.ReadFloat();
syncdata.z = stream.ReadFloat();
syncdata.yaw = stream.ReadFloat();
syncdata.pitch = stream.ReadFloat();
update.syncUpdates.Push(syncdata);
}
mTicUpdates[mLastReceivedTic % BACKUPTICS] = update;
}
@ -381,4 +408,10 @@ void NetClient::OnSpawnPlayer(ByteInputStream &stream)
p.mo->syncdata.NetID = netID;
g_NetIDList.useID ( netID, p.mo );
}
//ANetSyncActor *syncactor = Spawn<ANetSyncActor>(DVector3(x, y, z), NO_REPLACE);
//syncactor->sprite = GetSpriteIndex("POSSA1");
}
IMPLEMENT_CLASS(ANetSyncActor, false, false)

View file

@ -69,6 +69,16 @@ private:
int mServerTicDelta = -1;
int mLastReceivedTic = -1;
struct TicSyncData
{
int16_t netID;
float x;
float y;
float z;
float yaw;
float pitch;
};
struct TicUpdate
{
bool received = false;
@ -77,6 +87,7 @@ private:
float z;
float yaw;
float pitch;
TArray<TicSyncData> syncUpdates;
};
TicUpdate mTicUpdates[BACKUPTICS];
@ -85,3 +96,9 @@ private:
FDynamicBuffer mCurrentCommands;
FDynamicBuffer mSendCommands;
};
class ANetSyncActor : public AActor
{
DECLARE_CLASS(ANetSyncActor, AActor)
public:
};

View file

@ -143,21 +143,36 @@ void NetServer::EndCurrentTic()
int player = mNodes[i].Player;
if (playeringame[player] && players[player].mo)
{
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 ) );
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
{
cmd.addFloat ( 0.0f );
cmd.addFloat ( 0.0f );
cmd.addFloat ( 0.0f );
cmd.addFloat ( 0.0f );
cmd.addFloat ( 0.0f );
cmd.addFloat(0.0f);
cmd.addFloat(0.0f);
cmd.addFloat(0.0f);
cmd.addFloat(0.0f);
cmd.addFloat(0.0f);
}
// To do: needs to be done for all syncdata objects that changed and not just players
for (player = 0; player < MAXPLAYERS; player++)
{
if (player != mNodes[i].Player && playeringame[player] && players[player].mo)
{
cmd.addShort(players[player].mo->syncdata.NetID);
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));
}
}
cmd.addShort(-1);
cmd.writeCommandToStream(packet.stream);
mComm->PacketSend(packet);
}
@ -373,7 +388,7 @@ void NetServer::FullUpdate(NetNode &node)
NetOutputPacket packet(node.NodeIndex);
// Inform the client about all players already in the game.
for ( int i = 0; i < MAXPLAYERNAME; ++i )
for ( int i = 0; i < MAXPLAYERS; ++i )
{
if ( i == node.Player )
continue;

View file

@ -9,6 +9,7 @@ version "3.7"
#include "zscript/events.txt"
#include "zscript/destructible.txt"
#include "zscript/level_compatibility.txt"
#include "zscript/network.txt"
#include "zscript/menu/menuitembase.txt"
#include "zscript/menu/menu.txt"

View file

@ -0,0 +1,4 @@
class NetSyncActor : Actor native
{
}