diff --git a/Subsurface/Source/Networking/Client.cs b/Subsurface/Source/Networking/Client.cs index b25d056c6..0632d92f0 100644 --- a/Subsurface/Source/Networking/Client.cs +++ b/Subsurface/Source/Networking/Client.cs @@ -48,6 +48,10 @@ namespace Barotrauma.Networking private List kickVoters; + //when was a specific entity event last sent to the client + // key = event id, value = NetTime.Now when sending + public Dictionary entityEventLastSent; + public bool ReadyToStart; private object[] votes; @@ -65,6 +69,7 @@ namespace Barotrauma.Networking lastRecvChatMsgID = ChatMessage.LastID; lastRecvEntitySpawnID = 0; + lastRecvEntityEventID = 0; } public int KickVoteCount @@ -88,6 +93,8 @@ namespace Barotrauma.Networking votes = new object[Enum.GetNames(typeof(VoteType)).Length]; jobPreferences = new List(JobPrefab.List.GetRange(0, 3)); + + entityEventLastSent = new Dictionary(); } public static bool IsValidName(string name) diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index 6e210061c..002c1877f 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -1026,6 +1026,7 @@ namespace Barotrauma.Networking GameMain.LightManager.LosEnabled = false; Item.Spawner.Clear(); + entityEventManager.Clear(); #if DEBUG messageCount.Clear(); diff --git a/Subsurface/Source/Networking/NetEntityEvent/NetEntityEvent.cs b/Subsurface/Source/Networking/NetEntityEvent/NetEntityEvent.cs index 12cc6219a..5528ffdea 100644 --- a/Subsurface/Source/Networking/NetEntityEvent/NetEntityEvent.cs +++ b/Subsurface/Source/Networking/NetEntityEvent/NetEntityEvent.cs @@ -26,6 +26,28 @@ namespace Barotrauma.Networking { this.Data = data; } + + public bool IsDuplicate(NetEntityEvent other) + { + if (other.Entity != this.Entity) return false; + + if (Data != null && other.Data != null) + { + if (Data.Length == other.Data.Length) + { + for (int i = 0; i eventsToSync = new List(); for (int i = events.Count - 1; i >= 0 && events[i].ID > client.lastRecvEntityEventID; i--) { + float lastSent = 0; + client.entityEventLastSent.TryGetValue(events[i].ID, out lastSent); + + if (lastSent > NetTime.Now - client.Connection.AverageRoundtripTime) + { + break; + } + eventsToSync.Insert(0, events[i]); } if (eventsToSync.Count == 0) return; + + foreach (NetEntityEvent entityEvent in eventsToSync) + { + client.entityEventLastSent[entityEvent.ID] = (float)NetTime.Now; + } Write(msg, eventsToSync, client); }