diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index dd1352681..60bcf7594 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -2044,12 +2044,27 @@ namespace Barotrauma { if (GameMain.Server == null) return; + if (c.Character != this) + { +#if DEBUG + DebugConsole.Log("Received a character update message from a client who's not controlling the character"); +#endif + return; + } + switch (type) { case ClientNetObject.CHARACTER_INPUT: UInt32 networkUpdateID = msg.ReadUInt32(); byte inputCount = msg.ReadByte(); + +#if DEBUG + if (((long)networkUpdateID - (long)LastNetworkUpdateID)>10000) + { + DebugConsole.ThrowError("((long)networkUpdateID - (long)LastNetworkUpdateID) > 10000"); + } +#endif for (int i = 0; i < inputCount; i++) { @@ -2107,7 +2122,7 @@ namespace Barotrauma public virtual void ServerWrite(NetBuffer msg, Client c, object[] extraData = null) { if (GameMain.Server == null) return; - + if (extraData != null) { switch ((NetEntityEvent.Type)extraData[0]) diff --git a/Subsurface/Source/DebugConsole.cs b/Subsurface/Source/DebugConsole.cs index 2e5a022f0..0cb827891 100644 --- a/Subsurface/Source/DebugConsole.cs +++ b/Subsurface/Source/DebugConsole.cs @@ -511,9 +511,15 @@ namespace Barotrauma Submarine.MainSub.GodMode = !Submarine.MainSub.GodMode; break; case "dumpids": - int count = commands.Length < 2 ? 10 : int.Parse(commands[1]); - - Entity.DumpIds(count); + try + { + int count = commands.Length < 2 ? 10 : int.Parse(commands[1]); + Entity.DumpIds(count); + } + catch + { + return; + } break; case "heal": if (Character.Controlled != null) diff --git a/Subsurface/Source/Map/Submarine.cs b/Subsurface/Source/Map/Submarine.cs index 24f3a1398..62864dd7b 100644 --- a/Subsurface/Source/Map/Submarine.cs +++ b/Subsurface/Source/Map/Submarine.cs @@ -1250,6 +1250,8 @@ namespace Barotrauma if (GameMain.GameScreen.Cam != null) GameMain.GameScreen.Cam.TargetPos = Vector2.Zero; Entity.RemoveAll(); + + System.Diagnostics.Debug.Assert(Item.ItemList.Count == 0); PhysicsBody.list.Clear(); diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index 716c7e5b4..2b40d7324 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -909,11 +909,12 @@ namespace Barotrauma.Networking private IEnumerable StartGame(Submarine selectedSub, Submarine selectedShuttle, GameModePreset selectedMode) { Item.Spawner.Clear(); + entityEventManager.Clear(); GameMain.NetLobbyScreen.StartButton.Enabled = false; GUIMessageBox.CloseAll(); - + roundStartSeed = DateTime.Now.Millisecond; Rand.SetSyncedSeed(roundStartSeed); @@ -1150,6 +1151,7 @@ namespace Barotrauma.Networking } while (secondsLeft > 0.0f); Submarine.Unload(); + entityEventManager.Clear(); GameMain.NetLobbyScreen.Select(); diff --git a/Subsurface/Source/Networking/NetEntityEvent/NetEntityEventManager.cs b/Subsurface/Source/Networking/NetEntityEvent/NetEntityEventManager.cs index ce179e20f..d58d92de3 100644 --- a/Subsurface/Source/Networking/NetEntityEvent/NetEntityEventManager.cs +++ b/Subsurface/Source/Networking/NetEntityEvent/NetEntityEventManager.cs @@ -36,6 +36,14 @@ namespace Barotrauma.Networking tempBuffer.LengthBytes < 256, "Maximum EntityEvent size exceeded when serializing \""+e.Entity+"\"!"); +#if DEBUG + if (Entity.FindEntityByID(e.Entity.ID) != e.Entity) + { + DebugConsole.ThrowError("Error in NetEntityEventManager.Write (FindEntityByID(e.Entity.ID) != e.Entity)"); + } +#endif + + msg.Write((UInt16)e.Entity.ID); msg.Write((byte)tempBuffer.LengthBytes); msg.Write(tempBuffer);