From c8517703866ad4a56240ca0824ea972b78efdef9 Mon Sep 17 00:00:00 2001 From: Regalis Date: Sat, 11 Mar 2017 12:49:08 +0200 Subject: [PATCH] Fixed "trying to read past the buffer size" errors caused by item updates sent by clients, midround syncing timeout period is calculated based on the number of events the client needs to receive --- Subsurface/Source/Items/Item.cs | 3 ++- Subsurface/Source/Networking/GameServer.cs | 5 +++++ .../NetEntityEvent/ServerEntityEventManager.cs | 13 ++++++++----- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index d9d8ec9ec..039a1709c 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -1812,12 +1812,13 @@ namespace Barotrauma break; case NetEntityEvent.Type.ApplyStatusEffect: //no further data needed, the server applies the effect - //on the character of the client who sent the message + //on the character of the client who sent the message break; case NetEntityEvent.Type.ChangeProperty: WritePropertyChange(msg, extraData); break; } + msg.WritePadBits(); } public void ServerRead(ClientNetObject type, NetBuffer msg, Client c) diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index aadc2134c..8688f9273 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -61,6 +61,11 @@ namespace Barotrauma.Networking get { return entityEventManager; } } + public TimeSpan UpdateInterval + { + get { return updateInterval; } + } + public GameServer(string name, int port, bool isPublic = false, string password = "", bool attemptUPnP = false, int maxPlayers = 10) { name = name.Replace(":", ""); diff --git a/Subsurface/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs b/Subsurface/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs index 3314bd7e9..f497600db 100644 --- a/Subsurface/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs +++ b/Subsurface/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs @@ -2,8 +2,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Barotrauma.Networking { @@ -252,9 +250,12 @@ namespace Barotrauma.Networking { if (uniqueEvents.Count > 0) { + double midRoundSyncTimeOut = uniqueEvents.Count / MaxEventsPerWrite * server.UpdateInterval.TotalSeconds; + midRoundSyncTimeOut = Math.Max(5.0f, midRoundSyncTimeOut * 1.5f); + client.UnreceivedEntityEventCount = (UInt16)uniqueEvents.Count; client.NeedsMidRoundSync = true; - client.MidRoundSyncTimeOut = Timing.TotalTime + 10.0; + client.MidRoundSyncTimeOut = Timing.TotalTime + midRoundSyncTimeOut; } else { @@ -293,11 +294,13 @@ namespace Barotrauma.Networking msg.Position += msgLength * 8; } else - { + { + DebugConsole.NewMessage("received msg " + thisEventID, Microsoft.Xna.Framework.Color.Green); + UInt16 characterStateID = msg.ReadUInt16(); NetBuffer buffer = new NetBuffer(); - buffer.Write(msg.ReadBytes(msgLength-2)); + buffer.Write(msg.ReadBytes(msgLength - 2)); BufferEvent(new BufferedEvent(sender, sender.Character, characterStateID, entity, buffer)); sender.lastSentEntityEventID++;