mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-02-28 06:41:47 +00:00
- 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:
parent
6f38ecad9b
commit
567e8e2c55
5 changed files with 82 additions and 12 deletions
|
@ -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)
|
||||
|
||||
|
|
|
@ -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:
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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"
|
||||
|
|
4
wadsrc/static/zscript/network.txt
Normal file
4
wadsrc/static/zscript/network.txt
Normal file
|
@ -0,0 +1,4 @@
|
|||
|
||||
class NetSyncActor : Actor native
|
||||
{
|
||||
}
|
Loading…
Reference in a new issue