NetEntityEvent fixes:

- comparing event data equality with Object.Equals instead of == because == returns false for boxed value types
- fixed old unacked messages not being resent if there are newer unacked messages that have been resent less than 1.5 * RTT ago
This commit is contained in:
Regalis
2017-01-03 20:10:03 +02:00
parent 1fb15f5589
commit 1eea373117
4 changed files with 45 additions and 18 deletions

View File

@@ -54,18 +54,35 @@ namespace Barotrauma.Networking
if (events.Count == 0) return;
List<NetEntityEvent> eventsToSync = new List<NetEntityEvent>();
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;