diff --git a/src/network/netclient.cpp b/src/network/netclient.cpp index 166830cbba..c2039be4de 100644 --- a/src/network/netclient.cpp +++ b/src/network/netclient.cpp @@ -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(DVector3(x, y, z), NO_REPLACE); + //syncactor->sprite = GetSpriteIndex("POSSA1"); } + +IMPLEMENT_CLASS(ANetSyncActor, false, false) + diff --git a/src/network/netclient.h b/src/network/netclient.h index 932f94a704..006c409be6 100644 --- a/src/network/netclient.h +++ b/src/network/netclient.h @@ -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 syncUpdates; }; TicUpdate mTicUpdates[BACKUPTICS]; @@ -85,3 +96,9 @@ private: FDynamicBuffer mCurrentCommands; FDynamicBuffer mSendCommands; }; + +class ANetSyncActor : public AActor +{ + DECLARE_CLASS(ANetSyncActor, AActor) +public: +}; diff --git a/src/network/netserver.cpp b/src/network/netserver.cpp index 3225255084..c7d33d0897 100644 --- a/src/network/netserver.cpp +++ b/src/network/netserver.cpp @@ -143,21 +143,36 @@ void NetServer::EndCurrentTic() int player = mNodes[i].Player; if (playeringame[player] && players[player].mo) { - cmd.addFloat ( static_cast ( players[player].mo->X() ) ); - cmd.addFloat ( static_cast ( players[player].mo->Y() ) ); - cmd.addFloat ( static_cast ( players[player].mo->Z() ) ); - cmd.addFloat ( static_cast ( players[player].mo->Angles.Yaw.Degrees ) ); - cmd.addFloat ( static_cast ( players[player].mo->Angles.Pitch.Degrees ) ); + cmd.addFloat(static_cast (players[player].mo->X())); + cmd.addFloat(static_cast (players[player].mo->Y())); + cmd.addFloat(static_cast (players[player].mo->Z())); + cmd.addFloat(static_cast (players[player].mo->Angles.Yaw.Degrees)); + cmd.addFloat(static_cast (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 (players[player].mo->X())); + cmd.addFloat(static_cast (players[player].mo->Y())); + cmd.addFloat(static_cast (players[player].mo->Z())); + cmd.addFloat(static_cast (players[player].mo->Angles.Yaw.Degrees)); + cmd.addFloat(static_cast (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; diff --git a/wadsrc/static/zscript.txt b/wadsrc/static/zscript.txt index 41b3851412..f10a9d7435 100644 --- a/wadsrc/static/zscript.txt +++ b/wadsrc/static/zscript.txt @@ -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" diff --git a/wadsrc/static/zscript/network.txt b/wadsrc/static/zscript/network.txt new file mode 100644 index 0000000000..5d5da291bd --- /dev/null +++ b/wadsrc/static/zscript/network.txt @@ -0,0 +1,4 @@ + +class NetSyncActor : Actor native +{ +}