This commit is contained in:
2023-04-10 16:29:20 +03:00
parent 7228c51dd7
commit 3b4d50e75e
8 changed files with 242 additions and 109 deletions

View File

@@ -53,11 +53,15 @@ namespace Game
private static ulong lastReceivedServerFrame = 0;
public static ulong ServerFrame => /*NetworkManager.server != null ? serverWorldState.frame :*/ lastReceivedServerFrame;
public static ulong ClientFrame => clientWorldState.frame;
public static float ServerTime = 0f;
public static float ClientTime = 0f;
public static void Init()
{
welcomed = false;
lastReceivedServerFrame = 0;
ServerTime = Time.GameTime;
ClientTime = 0f;
players = new Dictionary<uint, PlayerActor>();
playerConnections = new Dictionary<uint, NetworkConnection>();
@@ -126,7 +130,10 @@ namespace Game
var playerFrame = playerFrames[serverWorldState.frame % 120];
playerFrame.frame = serverWorldState.frame;
playerFrame.position = playerActor.Position;
//playerFrame.position = playerActor.Position;
PlayerMovement playerMovement = playerActor.GetScript<PlayerMovement>();
playerMovement.input.GetState(serverWorldState.frame, out var inputState, out var actorState);
playerFrame.position = actorState.position;
}
foreach (KeyValuePair<uint, PlayerActor> kv in players)
@@ -142,8 +149,9 @@ namespace Game
// TODO: relevancy checks here etc.
PlayerMovement playerMovement = otherPlayerActor.GetScript<PlayerMovement>();
PlayerActorState actorState = playerMovement.input.GetCurrentActorState();
PlayerInputState inputState = playerMovement.input.GetCurrentInputState();
//PlayerActorState actorState = playerMovement.input.GetCurrentActorState();
//PlayerInputState inputState = playerMovement.input.GetCurrentInputState();
playerMovement.input.GetState(serverWorldState.frame, out var inputState, out var actorState);
{
NetworkMessage message = NetworkManager.ServerBeginSendMessage();
message.WriteByte((byte)GameModeMessageType.PlayerPosition);
@@ -162,6 +170,7 @@ namespace Game
message.WriteSingle(actorState.viewAngles.X);
message.WriteSingle(actorState.viewAngles.Y);
message.WriteSingle(actorState.viewAngles.Z);
message.WriteSingle(actorState.lastJumpTime);
//inputState.frame
message.WriteSingle(inputState.viewDeltaX);
@@ -265,6 +274,7 @@ namespace Game
if (NetworkManager.IsClient || NetworkManager.IsLocalClient)
{
var serverFrame = networkEvent.Message.ReadUInt64();
ClientTime = networkEvent.Message.ReadSingle();
int numActors = (int)networkEvent.Message.ReadUInt32();
for (int i = 0; i < numActors; i++)
{
@@ -353,6 +363,7 @@ namespace Game
actorState.viewAngles.X = networkEvent.Message.ReadSingle();
actorState.viewAngles.Y = networkEvent.Message.ReadSingle();
actorState.viewAngles.Z = networkEvent.Message.ReadSingle();
actorState.lastJumpTime = networkEvent.Message.ReadSingle();
inputState.frame = reportedFrame;
inputState.viewDeltaX = networkEvent.Message.ReadSingle();
@@ -365,44 +376,11 @@ namespace Game
//Assert.IsTrue(reportedFrame >= lastReceivedServerFrame);
if (reportedFrame < lastReceivedServerFrame)
{
Console.Print($"packet wrong order, received {lastReceivedServerFrame}, new {reportedFrame}");
//Console.Print($"packet wrong order, received {lastReceivedServerFrame}, new {reportedFrame}");
break;
}
/*if (NetworkManager.IsLocalClient && !NetworkManager.IsServer)
{
}
else*/ if (NetworkManager.IsServer)
{
Assert.Fail();
/*PlayerFrame playerFrame = GetPlayerFrame(playerId, reportedFrame);
PlayerActor playerActor = players[playerId];
if (playerFrame == null)
Console.Print("frame is in the past, unable to verify frame");
else
{
Float3 playerFramePosition = playerFrame.position;
if ((playerFramePosition - reportedPosition).Length > 0.0001)
{
Console.Print("player drifted, len: " + (playerFramePosition - reportedPosition).Length);
{
NetworkMessage message = NetworkManager.ServerBeginSendMessage();
message.WriteByte((byte)GameModeMessageType.PlayerPosition);
message.WriteUInt64(serverWorldState.frame);
message.WriteUInt32(playerId);
message.WriteSingle(playerActor.Position.X);
message.WriteSingle(playerActor.Position.Y);
message.WriteSingle(playerActor.Position.Z);
NetworkManager.ServerEndSendMessage(ref message, playerConnections[playerId]);
}
}
}*/
}
else if (NetworkManager.IsClient)
if (NetworkManager.IsClient)
{
lastReceivedServerFrame = reportedFrame;
//Console.Print($"we drifted, corrected. client frame: {serverWorldState.frame}, server frame: {reportedFrame}");
@@ -414,7 +392,7 @@ namespace Game
{
PlayerInput playerInput = playerActor.GetScript<PlayerMovement>().input;
playerInput.SetState(reportedFrame, ref inputState, ref actorState);
playerInput.SetState(reportedFrame, inputState, actorState);
{
}
@@ -440,6 +418,7 @@ namespace Game
NetworkMessage message = NetworkManager.ServerBeginSendMessage();
message.WriteByte((byte)GameModeMessageType.WelcomePlayer);
message.WriteUInt64(serverWorldState.frame);
message.WriteSingle(ServerTime);
message.WriteUInt32((uint)serverWorldState.actors.Count);
foreach (PlayerActor playerActor in serverWorldState.actors)
{
@@ -514,7 +493,7 @@ namespace Game
players.Add(playerId, null);
players[playerId] = playerActor;
PlayerInput playerInput = playerActor.GetScript<PlayerMovement>().input;
playerInput.frame = (NetworkManager.IsServer) ? serverWorldState.frame : clientWorldState.frame;
if (NetworkManager.IsServer)
serverWorldState.actors.Add(playerActor);
}