diff --git a/GameServer.cs b/GameServer.cs index fddd126..47c22f7 100644 --- a/GameServer.cs +++ b/GameServer.cs @@ -746,6 +746,9 @@ public sealed class GameServer int count = 0; foreach (var c in clients.Values.Where(x => x.State == ClientState.Joined).ToList()) { + // Positionen/Bedürfnisse aus der alten Welt, die bis zum Trennen noch ankommen, nicht mehr speichern - sonst + // erscheint man nach Reset/neuem Spiel wieder dort, wo man in der alten Welt stand + c.TrackPositionFrom = DateTime.MaxValue; c.Conn.Send(MsgType.Reconnect, Wire.Build(w => w.Write(message))); c.Conn.CloseAfterSend("Reconnect after world change"); count++; diff --git a/MSCO.Server.csproj b/MSCO.Server.csproj index c413179..a2e18d4 100644 --- a/MSCO.Server.csproj +++ b/MSCO.Server.csproj @@ -7,7 +7,7 @@ enable MSCO.Server MSCO.Server - 2.9.5 + 2.9.6 MBM MSCO Dedicated Server true diff --git a/Tests/Program.cs b/Tests/Program.cs index 374537b..938c555 100644 --- a/Tests/Program.cs +++ b/Tests/Program.cs @@ -1,4 +1,4 @@ -using System.Net.Sockets; +using System.Net.Sockets; using MSCO.Server; // Protokoll-Tests gegen den echten Server-Code: startet einen Server offline (ohne Master, ohne Lizenz) auf @@ -235,11 +235,24 @@ try Console.WriteLine("== reset-world makes everyone reconnect"); var r1 = await TestClient.Join("Resetter", 0, null); + r1.Send(MsgType.Ready, Array.Empty()); + await r1.WaitFor(MsgType.WorldSnapshot); + await Task.Delay(8500); + r1.Send(MsgType.Player, PlayerPos(950f, 1f, -653f)); // irgendwo in der alten Welt + await Task.Delay(300); Srv().EnqueueCommand("reset-world"); var rec = await r1.WaitFor(MsgType.Reconnect); + r1.Send(MsgType.Player, PlayerPos(951f, 1f, -654f)); // kommt noch an, bevor die Verbindung zu ist Check(rec != null && new BinaryReader(new MemoryStream(rec)).ReadString().Contains("reset"), "Players get the 'world is being reset' reconnect message"); await Task.Delay(300); Check(r1.IsClosedByServer(), "Their connection is closed so they load the fresh world"); + var rejoined = await TestClient.Join("Resetter", 0, null); + rejoined.Send(MsgType.Ready, Array.Empty()); + var resetSpawn = Snapshot.Parse(await rejoined.WaitFor(MsgType.WorldSnapshot)).Spawn; + Check(resetSpawn == null, "After a reset nobody spawns at their old position (also not from late position updates): " + + (resetSpawn == null ? "none" : string.Join(", ", resetSpawn))); + rejoined.Close(); + await Task.Delay(300); Console.WriteLine("== Joining gets the CURRENT save game from a player in the game"); var inGame = await TestClient.Join("InGame", 0, null);