diff --git a/Subsurface/Source/Networking/NetEntityEvent/ClientEntityEventManager.cs b/Subsurface/Source/Networking/NetEntityEvent/ClientEntityEventManager.cs index a6ef737b3..7f0838d03 100644 --- a/Subsurface/Source/Networking/NetEntityEvent/ClientEntityEventManager.cs +++ b/Subsurface/Source/Networking/NetEntityEvent/ClientEntityEventManager.cs @@ -54,18 +54,35 @@ namespace Barotrauma.Networking if (events.Count == 0) return; List eventsToSync = new List(); - for (int i = events.Count - 1; i >= 0 && events[i].ID > thisClient.LastSentEntityEventID; i--) + + //find the index of the first event the server hasn't received + int startIndex = events.Count; + while (startIndex > 0 && + events[startIndex-1].ID > thisClient.LastSentEntityEventID) { + startIndex--; + } + + for (int i = startIndex; i < events.Count; i++) + { + //find the first event that hasn't been sent in 1.5 * roundtriptime or at all float lastSent = 0; eventLastSent.TryGetValue(events[i].ID, out lastSent); - //wait for 1.5f * roundtriptime until resending if (lastSent > NetTime.Now - serverConnection.AverageRoundtripTime * 1.5f) { - break; + continue; } - eventsToSync.Insert(0, events[i]); + eventsToSync.AddRange(events.GetRange(i, events.Count - i)); + break; + } + if (eventsToSync.Count == 0) return; + + //too many events for one packet + if (eventsToSync.Count > MaxEventsPerWrite) + { + eventsToSync.RemoveRange(MaxEventsPerWrite, eventsToSync.Count - MaxEventsPerWrite); } if (eventsToSync.Count == 0) return; diff --git a/Subsurface/Source/Networking/NetEntityEvent/NetEntityEvent.cs b/Subsurface/Source/Networking/NetEntityEvent/NetEntityEvent.cs index 110de751a..7667f7251 100644 --- a/Subsurface/Source/Networking/NetEntityEvent/NetEntityEvent.cs +++ b/Subsurface/Source/Networking/NetEntityEvent/NetEntityEvent.cs @@ -45,7 +45,7 @@ namespace Barotrauma.Networking { for (int i = 0; i protected void Write(NetOutgoingMessage msg, List eventsToSync, Client recipient = null) { - //too many events for one packet - if (eventsToSync.Count > MaxEventsPerWrite) - { - eventsToSync.RemoveRange(MaxEventsPerWrite, eventsToSync.Count - MaxEventsPerWrite); - } - msg.Write(eventsToSync[0].ID); msg.Write((byte)eventsToSync.Count); diff --git a/Subsurface/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs b/Subsurface/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs index 326aa71ae..2d02d3b9f 100644 --- a/Subsurface/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs +++ b/Subsurface/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs @@ -53,20 +53,36 @@ namespace Barotrauma.Networking if (events.Count == 0) return; List eventsToSync = new List(); - for (int i = events.Count - 1; i >= 0 && events[i].ID > client.lastRecvEntityEventID; i--) + + //find the index of the first event the client hasn't received + int startIndex = events.Count; + while (startIndex > 0 && + events[startIndex-1].ID > client.lastRecvEntityEventID) { + startIndex--; + } + + for (int i = startIndex; i < events.Count; i++) + { + //find the first event that hasn't been sent in 1.5 * roundtriptime or at all float lastSent = 0; client.entityEventLastSent.TryGetValue(events[i].ID, out lastSent); - //wait for 1.5f * roundtriptime until resending if (lastSent > NetTime.Now - client.Connection.AverageRoundtripTime * 1.5f) { - break; + continue; } - - eventsToSync.Insert(0, events[i]); + + eventsToSync.AddRange(events.GetRange(i, events.Count - i)); + break; } if (eventsToSync.Count == 0) return; + + //too many events for one packet + if (eventsToSync.Count > MaxEventsPerWrite) + { + eventsToSync.RemoveRange(MaxEventsPerWrite, eventsToSync.Count - MaxEventsPerWrite); + } foreach (NetEntityEvent entityEvent in eventsToSync) {