From 152a92e600ea45a5b4166c5d88f307b666757c0f Mon Sep 17 00:00:00 2001 From: Regalis Date: Fri, 5 May 2017 00:14:30 +0300 Subject: [PATCH] Server removes events if no clients are playing. Otherwise the server would keep creating new events indefinitely and midround-joining clients would instantly get kicked out because they're missing very old events. + fixed server not sending midroung sync messages if the list of new (non-unique) events is empty --- .../NetEntityEvent/ServerEntityEventManager.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Subsurface/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs b/Subsurface/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs index 9d08d1e84..08614b3e2 100644 --- a/Subsurface/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs +++ b/Subsurface/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs @@ -80,8 +80,13 @@ namespace Barotrauma.Networking //remove events that have been sent to all clients, they are redundant now //keep at least one event in the list (lastSentToAll == e.ID) so we can use it to keep track of the latest ID - events.RemoveAll(e => NetIdUtils.IdMoreRecent(lastSentToAll, e.ID)); - + events.RemoveAll(e => NetIdUtils.IdMoreRecent(lastSentToAll, e.ID)); + + if (server.ConnectedClients.Count(c => c.inGame) == 0 && events.Count > 1) + { + events.RemoveRange(0, events.Count - 1); + } + for (int i = events.Count - 1; i >= 0; i--) { //we already have an identical event that's waiting to be sent @@ -189,8 +194,6 @@ namespace Barotrauma.Networking /// public void Write(Client client, NetOutgoingMessage msg) { - if (events.Count == 0) return; - List eventsToSync = null; if (client.NeedsMidRoundSync) { @@ -246,6 +249,7 @@ namespace Barotrauma.Networking private List GetEventsToSync(Client client, List eventList) { List eventsToSync = new List(); + if (eventList.Count == 0) return eventsToSync; //find the index of the first event the client hasn't received int startIndex = eventList.Count;