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);