diff --git a/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs b/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs index bd0597493..def51c503 100644 --- a/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs +++ b/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.8.9.7")] -[assembly: AssemblyFileVersion("0.8.9.7")] +[assembly: AssemblyVersion("0.8.9.6")] +[assembly: AssemblyFileVersion("0.8.9.6")] diff --git a/Barotrauma/BarotraumaClient/Source/DebugConsole.cs b/Barotrauma/BarotraumaClient/Source/DebugConsole.cs index b8c7f8fee..4d681d60b 100644 --- a/Barotrauma/BarotraumaClient/Source/DebugConsole.cs +++ b/Barotrauma/BarotraumaClient/Source/DebugConsole.cs @@ -403,11 +403,6 @@ namespace Barotrauma AssignRelayToServer("help", false); AssignRelayToServer("verboselogging", false); AssignRelayToServer("freecam", false); -#if DEBUG - AssignRelayToServer("simulatedlatency", false); - AssignRelayToServer("simulatedloss", false); - AssignRelayToServer("simulatedduplicateschance", false); -#endif commands.Add(new Command("clientlist", "", (string[] args) => { })); AssignRelayToServer("clientlist", true); diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Sonar.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Sonar.cs index a4935fd62..da6fe39d0 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Sonar.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Sonar.cs @@ -785,9 +785,8 @@ namespace Barotrauma.Items.Components foreach (Limb limb in c.AnimController.Limbs) { - if (!limb.body.Enabled) { continue; } - float pointDist = ((limb.WorldPosition - pingSource) * displayScale).LengthSquared(); + if (limb.SimPosition == Vector2.Zero || pointDist > DisplayRadius * DisplayRadius) continue; if (pointDist > prevPingRadiusSqr && pointDist < pingRadiusSqr) diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Repairable.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Repairable.cs index 7e8fdc706..b1871cfe0 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Repairable.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Repairable.cs @@ -1,6 +1,4 @@ -using Barotrauma.Networking; -using Barotrauma.Particles; -using Lidgren.Network; +using Barotrauma.Particles; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using System.Collections.Generic; @@ -114,7 +112,8 @@ namespace Barotrauma.Items.Components System.Diagnostics.Debug.Assert(GuiFrame.GetChild(0) is GUILayoutGroup, "Repair UI hierarchy has changed, could not find skill texts"); foreach (GUIComponent c in GuiFrame.GetChild(0).Children) { - if (!(c.UserData is Skill skill)) continue; + Skill skill = c.UserData as Skill; + if (skill == null) continue; GUITextBlock textBlock = (GUITextBlock)c; if (character.GetSkillLevel(skill.Identifier) < skill.Level) @@ -127,15 +126,5 @@ namespace Barotrauma.Items.Components } } } - - public void ClientRead(ServerNetObject type, NetBuffer msg, float sendingTime) - { - deteriorationTimer = msg.ReadSingle(); - } - - public void ClientWrite(NetBuffer msg, object[] extraData = null) - { - //no need to write anything, just letting the server know we started repairing - } } } diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/StatusHUD.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/StatusHUD.cs index b56dd8629..8b6b5ea03 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/StatusHUD.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/StatusHUD.cs @@ -181,7 +181,7 @@ namespace Barotrauma.Items.Components Dictionary combinedAfflictionStrengths = new Dictionary(); foreach (Affliction affliction in allAfflictions) { - if (affliction.Strength < affliction.Prefab.ShowInHealthScannerThreshold || affliction.Strength <= 0.0f) continue; + if (affliction.Strength < affliction.Prefab.ActivationThreshold || affliction.Strength <= 0.0f) continue; if (combinedAfflictionStrengths.ContainsKey(affliction.Prefab)) { combinedAfflictionStrengths[affliction.Prefab] += affliction.Strength; diff --git a/Barotrauma/BarotraumaClient/Source/Map/Hull.cs b/Barotrauma/BarotraumaClient/Source/Map/Hull.cs index 8dc7700f0..f295160c6 100644 --- a/Barotrauma/BarotraumaClient/Source/Map/Hull.cs +++ b/Barotrauma/BarotraumaClient/Source/Map/Hull.cs @@ -1,13 +1,14 @@ using Barotrauma.Networking; using Barotrauma.Particles; using Barotrauma.Sounds; -using Lidgren.Network; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using System; using System.Collections.Generic; +using Microsoft.Xna.Framework.Input; using System.Linq; +using Lidgren.Network; namespace Barotrauma { @@ -18,8 +19,6 @@ namespace Barotrauma private List decals = new List(); private float serverUpdateDelay; - private float remoteWaterVolume, remoteOxygenPercentage; - private List remoteFireSources; private bool networkUpdatePending; private float networkUpdateTimer; @@ -140,10 +139,6 @@ namespace Barotrauma partial void UpdateProjSpecific(float deltaTime, Camera cam) { serverUpdateDelay -= deltaTime; - if (serverUpdateDelay <= 0.0f) - { - ApplyRemoteState(); - } if (networkUpdatePending) { @@ -552,18 +547,18 @@ namespace Barotrauma public void ClientRead(ServerNetObject type, NetBuffer message, float sendingTime) { - remoteWaterVolume = message.ReadRangedSingle(0.0f, 1.5f, 8) * Volume; - remoteOxygenPercentage = message.ReadRangedSingle(0.0f, 100.0f, 8); + float newWaterVolume = message.ReadRangedSingle(0.0f, 1.5f, 8) * Volume; + float newOxygenPercentage = message.ReadRangedSingle(0.0f, 100.0f, 8); bool hasFireSources = message.ReadBoolean(); int fireSourceCount = 0; - remoteFireSources = new List(); + List newFireSources = new List(); if (hasFireSources) { fireSourceCount = message.ReadRangedInteger(0, 16); for (int i = 0; i < fireSourceCount; i++) { - remoteFireSources.Add(new Vector3( + newFireSources.Add(new Vector3( MathHelper.Clamp(message.ReadRangedSingle(0.0f, 1.0f, 8), 0.05f, 0.95f), MathHelper.Clamp(message.ReadRangedSingle(0.0f, 1.0f, 8), 0.05f, 0.95f), message.ReadRangedSingle(0.0f, 1.0f, 8))); @@ -572,6 +567,41 @@ namespace Barotrauma if (serverUpdateDelay > 0.0f) { return; } + WaterVolume = newWaterVolume; + OxygenPercentage = newOxygenPercentage; + + for (int i = 0; i < fireSourceCount; i++) + { + Vector2 pos = new Vector2( + rect.X + rect.Width * newFireSources[i].X, + rect.Y - rect.Height + (rect.Height * newFireSources[i].Y)); + float size = newFireSources[i].Z * rect.Width; + + var newFire = i < FireSources.Count ? + FireSources[i] : + new FireSource(Submarine == null ? pos : pos + Submarine.Position, null, true); + newFire.Position = pos; + newFire.Size = new Vector2(size, newFire.Size.Y); + + //ignore if the fire wasn't added to this room (invalid position)? + if (!FireSources.Contains(newFire)) + { + newFire.Remove(); + continue; + } + } + + for (int i = FireSources.Count - 1; i >= fireSourceCount; i--) + { + FireSources[i].Remove(); + if (i < FireSources.Count) + { + FireSources.RemoveAt(i); + } + } + + if (serverUpdateDelay > 0.0f) { return; } + ApplyRemoteState(); } diff --git a/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs b/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs index 2992282f5..eecbeb119 100644 --- a/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs +++ b/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs @@ -622,7 +622,7 @@ namespace Barotrauma.Networking if (gameStarted) SetRadioButtonColor(); - if (ShowNetStats && client?.ServerConnection != null) + if (ShowNetStats) { netStats.AddValue(NetStats.NetStatType.ReceivedBytes, client.ServerConnection.Statistics.ReceivedBytes); netStats.AddValue(NetStats.NetStatType.SentBytes, client.ServerConnection.Statistics.SentBytes); @@ -1109,7 +1109,7 @@ namespace Barotrauma.Networking { string errorMsg = "Level equality check failed. The level generated at your end doesn't match the level generated by the server (seed " + Level.Loaded.Seed + ")."; DebugConsole.ThrowError(errorMsg, createMessageBox: true); - GameAnalyticsManager.AddErrorEventOnce("GameClient.StartGame:LevelsDontMatch" + levelSeed, GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); + GameAnalyticsManager.AddErrorEventOnce("GameClient.StartGame:LevelsDontMatch"+levelSeed, GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); CoroutineManager.StartCoroutine(EndGame("")); yield return CoroutineStatus.Failure; } @@ -1687,8 +1687,6 @@ namespace Barotrauma.Networking SaveUtil.LoadGame(GameMain.GameSession.SavePath, GameMain.GameSession); campaign.LastSaveID = campaign.PendingSaveID; - - DebugConsole.Log("Campaign save received, save ID " + campaign.LastSaveID); //decrement campaign update ID so the server will send us the latest data //(as there may have been campaign updates after the save file was created) campaign.LastUpdateID--; @@ -1706,7 +1704,7 @@ namespace Barotrauma.Networking public override void CreateEntityEvent(INetSerializable entity, object[] extraData) { - if (!(entity is IClientSerializable)) throw new InvalidCastException("Entity is not IClientSerializable"); + if (!(entity is IClientSerializable)) throw new InvalidCastException("entity is not IClientSerializable"); entityEventManager.CreateEvent(entity as IClientSerializable, extraData); } @@ -1975,8 +1973,7 @@ namespace Barotrauma.Networking msg.Write(true); msg.WritePadBits(); msg.Write(savePath); msg.Write(mapSeed); - msg.Write(sub.Name); - msg.Write(sub.MD5Hash.Hash); + msg.Write(sub.FilePath); client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered); diff --git a/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs b/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs index 1a54bc6aa..eb0a60828 100644 --- a/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs +++ b/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.8.9.7")] -[assembly: AssemblyFileVersion("0.8.9.7")] +[assembly: AssemblyVersion("0.8.9.6")] +[assembly: AssemblyFileVersion("0.8.9.6")] diff --git a/Barotrauma/BarotraumaServer/Source/GameSession/GameModes/MultiPlayerCampaign.cs b/Barotrauma/BarotraumaServer/Source/GameSession/GameModes/MultiPlayerCampaign.cs index 0e1667db4..b94525388 100644 --- a/Barotrauma/BarotraumaServer/Source/GameSession/GameModes/MultiPlayerCampaign.cs +++ b/Barotrauma/BarotraumaServer/Source/GameSession/GameModes/MultiPlayerCampaign.cs @@ -11,11 +11,11 @@ namespace Barotrauma { private List characterData = new List(); - public static void StartNewCampaign(string savePath, string subPath, string seed) + public static void StartNewCampaign(string savePath, string subName, string seed) { if (string.IsNullOrWhiteSpace(savePath)) return; - GameMain.GameSession = new GameSession(new Submarine(subPath, ""), savePath, + GameMain.GameSession = new GameSession(new Submarine(subName, ""), savePath, GameModePreset.List.Find(g => g.Identifier == "multiplayercampaign")); var campaign = ((MultiPlayerCampaign)GameMain.GameSession.GameMode); campaign.GenerateMap(seed); @@ -251,7 +251,6 @@ namespace Barotrauma } lastSaveID++; - DebugConsole.Log("Campaign saved, save ID " + lastSaveID); } } } diff --git a/Barotrauma/BarotraumaServer/Source/Items/Components/Repairable.cs b/Barotrauma/BarotraumaServer/Source/Items/Components/Repairable.cs index 7bf36f0f8..04ca33c0d 100644 --- a/Barotrauma/BarotraumaServer/Source/Items/Components/Repairable.cs +++ b/Barotrauma/BarotraumaServer/Source/Items/Components/Repairable.cs @@ -1,5 +1,9 @@ using Barotrauma.Networking; -using Lidgren.Network; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; namespace Barotrauma.Items.Components { @@ -10,16 +14,5 @@ namespace Barotrauma.Items.Components //let the clients know the initial deterioration delay item.CreateServerEvent(this); } - - public void ServerRead(ClientNetObject type, NetBuffer msg, Client c) - { - if (c.Character == null) return; - StartRepairing(c.Character); - } - - public void ServerWrite(NetBuffer msg, Client c, object[] extraData = null) - { - msg.Write(deteriorationTimer); - } } } diff --git a/Barotrauma/BarotraumaServer/Source/Map/Hull.cs b/Barotrauma/BarotraumaServer/Source/Map/Hull.cs index 3b10a7a24..907ba6f45 100644 --- a/Barotrauma/BarotraumaServer/Source/Map/Hull.cs +++ b/Barotrauma/BarotraumaServer/Source/Map/Hull.cs @@ -20,16 +20,6 @@ namespace Barotrauma partial void UpdateProjSpecific(float deltaTime, Camera cam) { if (IdFreed) { return; } - - //don't create updates if all clients are very far from the hull - float hullUpdateDistanceSqr = NetConfig.HullUpdateDistance * NetConfig.HullUpdateDistance; - if (!GameMain.Server.ConnectedClients.Any(c => - c.Character != null && - Vector2.DistanceSquared(c.Character.WorldPosition, WorldPosition) < hullUpdateDistanceSqr)) - { - return; - } - //update client hulls if the amount of water has changed by >10% //or if oxygen percentage has changed by 5% if (Math.Abs(lastSentVolume - waterVolume) > Volume * 0.1f || @@ -41,8 +31,8 @@ namespace Barotrauma GameMain.NetworkMember.CreateEntityEvent(this); lastSentVolume = waterVolume; lastSentOxygen = OxygenPercentage; - sendUpdateTimer = NetConfig.HullUpdateInterval; - } + sendUpdateTimer = NetworkUpdateInterval; + } } } diff --git a/Barotrauma/BarotraumaServer/Source/Networking/Client.cs b/Barotrauma/BarotraumaServer/Source/Networking/Client.cs index 28e291e39..78ff44d7a 100644 --- a/Barotrauma/BarotraumaServer/Source/Networking/Client.cs +++ b/Barotrauma/BarotraumaServer/Source/Networking/Client.cs @@ -46,7 +46,7 @@ namespace Barotrauma.Networking //when was a specific entity event last sent to the client // key = event id, value = NetTime.Now when sending - public readonly Dictionary EntityEventLastSent = new Dictionary(); + public readonly Dictionary EntityEventLastSent = new Dictionary(); //when was a position update for a given entity last sent to the client // key = entity id, value = NetTime.Now when sending diff --git a/Barotrauma/BarotraumaServer/Source/Networking/FileTransfer/FileSender.cs b/Barotrauma/BarotraumaServer/Source/Networking/FileTransfer/FileSender.cs index 22bf12ea6..031d826c6 100644 --- a/Barotrauma/BarotraumaServer/Source/Networking/FileTransfer/FileSender.cs +++ b/Barotrauma/BarotraumaServer/Source/Networking/FileTransfer/FileSender.cs @@ -172,7 +172,7 @@ namespace Barotrauma.Networking transfer.WaitTimer -= deltaTime; if (transfer.WaitTimer > 0.0f) continue; - if (!transfer.Connection.CanSendImmediately(NetDeliveryMethod.ReliableOrdered, transfer.SequenceChannel)) continue; + if (!transfer.Connection.CanSendImmediately(NetDeliveryMethod.ReliableOrdered, 1)) continue; transfer.WaitTimer = 0.05f;// transfer.Connection.AverageRoundtripTime; @@ -187,6 +187,13 @@ namespace Barotrauma.Networking { message = peer.CreateMessage(); message.Write((byte)ServerPacketHeader.FILE_TRANSFER); + message.Write((byte)FileTransferMessageType.Initiate); + message.Write((byte)transfer.FileType); + message.Write((ushort)chunkLen); + message.Write((ulong)transfer.Data.Length); + message.Write(transfer.FileName); + GameMain.Server.CompressOutgoingMessage(message); + transfer.Connection.SendMessage(message, NetDeliveryMethod.ReliableOrdered, transfer.SequenceChannel); //if the recipient is the owner of the server (= a client running the server from the main exe) //we don't need to send anything, the client can just read the file directly diff --git a/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs b/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs index dd514f544..4ea71904f 100644 --- a/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs +++ b/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs @@ -715,25 +715,23 @@ namespace Barotrauma.Networking { string savePath = inc.ReadString(); string seed = inc.ReadString(); - string subName = inc.ReadString(); - string subHash = inc.ReadString(); + string subPath = inc.ReadString(); - var matchingSub = Submarine.SavedSubmarines.FirstOrDefault(s => s.Name == subName && s.MD5Hash.Hash == subHash); - - if (matchingSub == null) + if (!File.Exists(subPath)) { SendDirectChatMessage( - TextManager.Get("CampaignStartFailedSubNotFound").Replace("[subname]", subName), + TextManager.Get("CampaignStartFailedSubNotFound").Replace("[subpath]", subPath), connectedClient, ChatMessageType.MessageBox); } else { - if (connectedClient.HasPermission(ClientPermissions.SelectMode)) MultiPlayerCampaign.StartNewCampaign(savePath, matchingSub.FilePath, seed); + if (connectedClient.HasPermission(ClientPermissions.SelectMode)) MultiPlayerCampaign.StartNewCampaign(savePath, subPath, seed); } } else { string saveName = inc.ReadString(); + if (connectedClient.HasPermission(ClientPermissions.SelectMode)) MultiPlayerCampaign.LoadCampaign(saveName); } break; @@ -1337,6 +1335,10 @@ namespace Barotrauma.Networking WriteClientList(c, outmsg); clientListBytes = outmsg.LengthBytes - clientListBytes; + int eventManagerBytes = outmsg.LengthBytes; + entityEventManager.Write(c, outmsg, out List sentEvents); + eventManagerBytes = outmsg.LengthBytes - eventManagerBytes; + int chatMessageBytes = outmsg.LengthBytes; WriteChatMessages(outmsg, c); chatMessageBytes = outmsg.LengthBytes - chatMessageBytes; @@ -1385,55 +1387,25 @@ namespace Barotrauma.Networking errorMsg += " Client list size: " + clientListBytes + " bytes\n" + " Chat message size: " + chatMessageBytes + " bytes\n" + + " Event size: " + eventManagerBytes + " bytes\n" + " Position update size: " + positionUpdateBytes + " bytes\n\n"; + + if (sentEvents != null && sentEvents.Count > 0) + { + errorMsg += "Sent events: \n"; + foreach (var entityEvent in sentEvents) + { + errorMsg += " - " + (entityEvent.Entity?.ToString() ?? "null") + "\n"; + } + } + DebugConsole.ThrowError(errorMsg); - GameAnalyticsManager.AddErrorEventOnce("GameServer.ClientWriteIngame1:PacketSizeExceeded" + outmsg.LengthBytes, GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); + GameAnalyticsManager.AddErrorEventOnce("GameServer.ClientWriteIngame:PacketSizeExceeded" + outmsg.LengthBytes, GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); } CompressOutgoingMessage(outmsg); + server.SendMessage(outmsg, c.Connection, NetDeliveryMethod.Unreliable); - - //--------------------------------------------------------------------------- - - for (int i = 0; i < NetConfig.MaxEventPacketsPerUpdate; i++) - { - outmsg = server.CreateMessage(); - outmsg.Write((byte)ServerPacketHeader.UPDATE_INGAME); - outmsg.Write((float)NetTime.Now); - - int eventManagerBytes = outmsg.LengthBytes; - entityEventManager.Write(c, outmsg, out List sentEvents); - eventManagerBytes = outmsg.LengthBytes - eventManagerBytes; - - if (sentEvents.Count == 0) - { - break; - } - - outmsg.Write((byte)ServerNetObject.END_OF_MESSAGE); - - if (outmsg.LengthBytes > NetPeerConfiguration.MaximumTransmissionUnit) - { - string errorMsg = "Maximum packet size exceeded (" + outmsg.LengthBytes + " > " + NetPeerConfiguration.MaximumTransmissionUnit + ")\n"; - errorMsg += - " Event size: " + eventManagerBytes + " bytes\n"; - - if (sentEvents != null && sentEvents.Count > 0) - { - errorMsg += "Sent events: \n"; - foreach (var entityEvent in sentEvents) - { - errorMsg += " - " + (entityEvent.Entity?.ToString() ?? "null") + "\n"; - } - } - - DebugConsole.ThrowError(errorMsg); - GameAnalyticsManager.AddErrorEventOnce("GameServer.ClientWriteIngame2:PacketSizeExceeded" + outmsg.LengthBytes, GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); - } - - CompressOutgoingMessage(outmsg); - server.SendMessage(outmsg, c.Connection, NetDeliveryMethod.Unreliable); - } } private void WriteClientList(Client c, NetOutgoingMessage outmsg) diff --git a/Barotrauma/BarotraumaServer/Source/Networking/GameServerLogin.cs b/Barotrauma/BarotraumaServer/Source/Networking/GameServerLogin.cs index 4bd7a0077..630c09a08 100644 --- a/Barotrauma/BarotraumaServer/Source/Networking/GameServerLogin.cs +++ b/Barotrauma/BarotraumaServer/Source/Networking/GameServerLogin.cs @@ -164,7 +164,7 @@ namespace Barotrauma.Networking if (connectedClient != null) { Log("Disconnecting client " + connectedClient.Name + " (Steam ID: " + steamID + "). Steam authentication no longer valid (" + status + ").", ServerLog.MessageType.ServerMessage); - KickClient(connectedClient, $"DisconnectMessage.SteamAuthNoLongerValid~[status]={status.ToString()}"); + KickClient(connectedClient, $"DisconnectMessage.SteamAuthNoLongerValid_[status]={status.ToString()}"); } }*/ } @@ -342,7 +342,7 @@ namespace Barotrauma.Networking if (clVersion != GameMain.Version.ToString()) { DisconnectUnauthClient(inc, unauthClient, DisconnectReason.InvalidVersion, - $"DisconnectMessage.InvalidVersion~[version]={GameMain.Version.ToString()}~[clientversion]={clVersion}"); + $"DisconnectMessage.InvalidVersion_[version]={GameMain.Version.ToString()}_[clientversion]={clVersion}"); Log(clName + " (" + inc.SenderConnection.RemoteEndPoint.Address.ToString() + ") couldn't join the server (wrong game version)", ServerLog.MessageType.Error); DebugConsole.NewMessage(clName + " (" + inc.SenderConnection.RemoteEndPoint.Address.ToString() + ") couldn't join the server (wrong game version)", Color.Red); @@ -368,7 +368,7 @@ namespace Barotrauma.Networking if (missingPackages.Count == 1) { - DisconnectUnauthClient(inc, unauthClient, DisconnectReason.MissingContentPackage, $"DisconnectMessage.MissingContentPackage~[missingcontentpackage]={GetPackageStr(missingPackages[0])}"); + DisconnectUnauthClient(inc, unauthClient, DisconnectReason.MissingContentPackage, $"DisconnectMessage.MissingContentPackage_[missingcontentpackage]={GetPackageStr(missingPackages[0])}"); Log(clName + " (" + inc.SenderConnection.RemoteEndPoint.Address.ToString() + ") couldn't join the server (missing content package " + GetPackageStr(missingPackages[0]) + ")", ServerLog.MessageType.Error); return; } @@ -376,7 +376,7 @@ namespace Barotrauma.Networking { List packageStrs = new List(); missingPackages.ForEach(cp => packageStrs.Add(GetPackageStr(cp))); - DisconnectUnauthClient(inc, unauthClient, DisconnectReason.MissingContentPackage, $"DisconnectMessage.MissingContentPackages~[missingcontentpackages]={string.Join(", ", packageStrs)}"); + DisconnectUnauthClient(inc, unauthClient, DisconnectReason.MissingContentPackage, $"DisconnectMessage.MissingContentPackages_[missingcontentpackages]={string.Join(", ", packageStrs)}"); Log(clName + " (" + inc.SenderConnection.RemoteEndPoint.Address.ToString() + ") couldn't join the server (missing content packages " + string.Join(", ", packageStrs) + ")", ServerLog.MessageType.Error); return; } @@ -399,7 +399,7 @@ namespace Barotrauma.Networking if (incompatiblePackages.Count == 1) { DisconnectUnauthClient(inc, unauthClient, DisconnectReason.IncompatibleContentPackage, - $"DisconnectMessage.IncompatibleContentPackage~[incompatiblecontentpackage]={GetPackageStr2(incompatiblePackages[0])}"); + $"DisconnectMessage.IncompatibleContentPackage_[incompatiblecontentpackage]={GetPackageStr2(incompatiblePackages[0])}"); Log(clName + " (" + inc.SenderConnection.RemoteEndPoint.Address.ToString() + ") couldn't join the server (incompatible content package " + GetPackageStr2(incompatiblePackages[0]) + ")", ServerLog.MessageType.Error); return; } @@ -408,7 +408,7 @@ namespace Barotrauma.Networking List packageStrs = new List(); incompatiblePackages.ForEach(cp => packageStrs.Add(GetPackageStr2(cp))); DisconnectUnauthClient(inc, unauthClient, DisconnectReason.IncompatibleContentPackage, - $"DisconnectMessage.IncompatibleContentPackages~[incompatiblecontentpackages]={string.Join(", ", packageStrs)}"); + $"DisconnectMessage.IncompatibleContentPackages_[incompatiblecontentpackages]={string.Join(", ", packageStrs)}"); Log(clName + " (" + inc.SenderConnection.RemoteEndPoint.Address.ToString() + ") couldn't join the server (incompatible content packages " + string.Join(", ", packageStrs) + ")", ServerLog.MessageType.Error); return; } @@ -500,7 +500,7 @@ namespace Barotrauma.Networking private void DisconnectUnauthClient(NetIncomingMessage inc, UnauthenticatedClient unauthClient, DisconnectReason reason, string message) { - inc.SenderConnection.Disconnect(reason.ToString() + "/ " + TextManager.GetServerMessage(message)); + inc.SenderConnection.Disconnect(reason.ToString() + "/ " + message); if (unauthClient.SteamID > 0) { Steam.SteamManager.StopAuthSession(unauthClient.SteamID); } if (unauthClient != null) { diff --git a/Barotrauma/BarotraumaServer/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs b/Barotrauma/BarotraumaServer/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs index 326df08c3..83e59c6cc 100644 --- a/Barotrauma/BarotraumaServer/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs +++ b/Barotrauma/BarotraumaServer/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs @@ -228,7 +228,7 @@ namespace Barotrauma.Networking GameServer.Log("Disconnecting client " + c.Name + " due to excessive desync (expected old event " + (c.LastRecvEntityEventID + 1).ToString() + " (created " + (Timing.TotalTime - firstEventToResend.CreateTime).ToString("0.##") + " s ago)" + - " Events queued: " + events.Count + ", last sent to all: " + lastSentToAll, ServerLog.MessageType.Error); + " Events queued: " + events.Count + ", last sent to all: " + lastSentToAll, ServerLog.MessageType.ServerMessage); server.DisconnectClient(c, "", "ServerMessage.ExcessiveDesyncOldEvent"); } ); @@ -242,7 +242,7 @@ namespace Barotrauma.Networking toKick.ForEach(c => { DebugConsole.NewMessage(c.Name + " was kicked due to excessive desync (expected removed event " + (c.LastRecvEntityEventID + 1).ToString() + ", last available is " + events[0].ID.ToString() + ")", Color.Red); - GameServer.Log("Disconnecting client " + c.Name + " due to excessive desync (expected removed event " + (c.LastRecvEntityEventID + 1).ToString() + ", last available is " + events[0].ID.ToString() + ")", ServerLog.MessageType.Error); + GameServer.Log("Disconnecting client " + c.Name + " due to excessive desync (expected removed event " + (c.LastRecvEntityEventID + 1).ToString() + ", last available is " + events[0].ID.ToString() + ")", ServerLog.MessageType.ServerMessage); server.DisconnectClient(c, "", "ServerMessage.ExcessiveDesyncRemovedEvent"); }); } @@ -251,7 +251,7 @@ namespace Barotrauma.Networking var timedOutClients = clients.FindAll(c => c.InGame && c.NeedsMidRoundSync && Timing.TotalTime > c.MidRoundSyncTimeOut); foreach (Client timedOutClient in timedOutClients) { - GameServer.Log("Disconnecting client " + timedOutClient.Name + ". Syncing the client with the server took too long.", ServerLog.MessageType.Error); + GameServer.Log("Disconnecting client " + timedOutClient.Name + ". Syncing the client with the server took too long.", ServerLog.MessageType.ServerMessage); GameMain.Server.DisconnectClient(timedOutClient, "", "ServerMessage.SyncTimeout"); } @@ -305,7 +305,19 @@ namespace Barotrauma.Networking } //too many events for one packet - if (eventsToSync.Count > 200) + if (eventsToSync.Count > MaxEventsPerWrite) + { + if (eventsToSync.Count > MaxEventsPerWrite * 3 && !client.NeedsMidRoundSync) + { + Color color = eventsToSync.Count > MaxEventsPerWrite * 20 ? Color.Red : Color.Orange; + if (eventsToSync.Count < MaxEventsPerWrite * 5) { color = Color.Yellow; } + DebugConsole.NewMessage("WARNING: event count very high: " + eventsToSync.Count + "/" + MaxEventsPerWrite, color); + } + + eventsToSync.RemoveRange(MaxEventsPerWrite, eventsToSync.Count - MaxEventsPerWrite); + } + + foreach (NetEntityEvent entityEvent in eventsToSync) { if (eventsToSync.Count > 200 && !client.NeedsMidRoundSync) { @@ -338,7 +350,7 @@ namespace Barotrauma.Networking msg.Write(client.UnreceivedEntityEventCount); msg.Write(client.FirstNewEventID); - Write(msg, eventsToSync, out sentEvents, client); + Write(msg, eventsToSync, client); } else { @@ -351,6 +363,7 @@ namespace Barotrauma.Networking (entityEvent as ServerEntityEvent).Sent = true; client.EntityEventLastSent[entityEvent.ID] = NetTime.Now; } + sentEvents = eventsToSync; } /// @@ -374,10 +387,10 @@ namespace Barotrauma.Networking for (int i = startIndex; i < eventList.Count; i++) { - //find the first event that hasn't been sent in roundtriptime or at all - client.EntityEventLastSent.TryGetValue(eventList[i].ID, out double lastSent); + //find the first event that hasn't been sent in 1.5 * roundtriptime or at all + client.EntityEventLastSent.TryGetValue(eventList[i].ID, out float lastSent); - float minInterval = Math.Max(client.Connection.AverageRoundtripTime, (float)server.UpdateInterval.TotalSeconds * 2); + float minInterval = Math.Max(client.Connection.AverageRoundtripTime * 1.5f, (float)server.UpdateInterval.TotalSeconds * 2); if (lastSent > NetTime.Now - Math.Min(minInterval, 0.5f)) { @@ -403,7 +416,7 @@ namespace Barotrauma.Networking } else { - double midRoundSyncTimeOut = uniqueEvents.Count / 100 * server.UpdateInterval.TotalSeconds; + double midRoundSyncTimeOut = uniqueEvents.Count / MaxEventsPerWrite * server.UpdateInterval.TotalSeconds; midRoundSyncTimeOut = Math.Max(10.0f, midRoundSyncTimeOut * 10.0f); client.UnreceivedEntityEventCount = (UInt16)uniqueEvents.Count; diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs index 74062db2e..cb053d161 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs @@ -1110,15 +1110,13 @@ namespace Barotrauma ViewTarget = null; if (!AllowInput) return; - if (Controlled == this || (GameMain.NetworkMember != null && GameMain.NetworkMember.IsServer)) + Vector2 smoothedCursorDiff = cursorPosition - SmoothedCursorPosition; + if (Controlled == this) { SmoothedCursorPosition = cursorPosition; } else { - //apply some smoothing to the cursor positions of remote players when playing as a client - //to make aiming look a little less choppy - Vector2 smoothedCursorDiff = cursorPosition - SmoothedCursorPosition; smoothedCursorDiff = NetConfig.InterpolateCursorPositionError(smoothedCursorDiff); SmoothedCursorPosition = cursorPosition - smoothedCursorDiff; } @@ -1666,12 +1664,10 @@ namespace Barotrauma focusedItem = null; } findFocusedTimer -= deltaTime; - } + } #endif //climb ladders automatically when pressing up/down inside their trigger area - Ladder currentLadder = SelectedConstruction?.GetComponent(); - if ((SelectedConstruction == null || currentLadder != null) && - !AnimController.InWater && Screen.Selected != GameMain.SubEditorScreen) + if (SelectedConstruction == null && !AnimController.InWater && Screen.Selected != GameMain.SubEditorScreen) { bool climbInput = IsKeyDown(InputType.Up) || IsKeyDown(InputType.Down); bool isControlled = Controlled == this; @@ -1682,19 +1678,6 @@ namespace Barotrauma float minDist = float.PositiveInfinity; foreach (Ladder ladder in Ladder.List) { - if (ladder == currentLadder) - { - continue; - } - else if (currentLadder != null) - { - //only switch from ladder to another if the ladders are above the current ladders and pressing up, or vice versa - if (ladder.Item.WorldPosition.Y > currentLadder.Item.WorldPosition.Y != IsKeyDown(InputType.Up)) - { - continue; - } - } - if (CanInteractWith(ladder.Item, out float dist, checkLinked: false) && dist < minDist) { minDist = dist; diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Health/Afflictions/AfflictionPrefab.cs b/Barotrauma/BarotraumaShared/Source/Characters/Health/Afflictions/AfflictionPrefab.cs index 708e62bee..aea153f53 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Health/Afflictions/AfflictionPrefab.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Health/Afflictions/AfflictionPrefab.cs @@ -153,10 +153,7 @@ namespace Barotrauma //how high the strength has to be for the affliction icon to be shown in the UI public readonly float ShowIconThreshold = 0.05f; public readonly float MaxStrength = 100.0f; - - //how high the strength has to be for the affliction icon to be shown with a health scanner - public readonly float ShowInHealthScannerThreshold = 0.05f; - + public float BurnOverlayAlpha; public float DamageOverlayAlpha; @@ -260,8 +257,6 @@ namespace Barotrauma ShowIconThreshold = element.GetAttributeFloat("showiconthreshold", Math.Max(ActivationThreshold, 0.05f)); MaxStrength = element.GetAttributeFloat("maxstrength", 100.0f); - ShowInHealthScannerThreshold = element.GetAttributeFloat("showinhealthscannerthreshold", Math.Max(ActivationThreshold, 0.05f)); - DamageOverlayAlpha = element.GetAttributeFloat("damageoverlayalpha", 0.0f); BurnOverlayAlpha = element.GetAttributeFloat("burnoverlayalpha", 0.0f); diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Health/CharacterHealth.cs b/Barotrauma/BarotraumaShared/Source/Characters/Health/CharacterHealth.cs index 5d6f70a83..dff106cfb 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Health/CharacterHealth.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Health/CharacterHealth.cs @@ -460,7 +460,6 @@ namespace Barotrauma { affliction.Strength = 0.0f; } - CalculateVitality(); } private void AddLimbAffliction(Limb limb, Affliction newAffliction) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Limb.cs b/Barotrauma/BarotraumaShared/Source/Characters/Limb.cs index 0c1d42432..2d07409d1 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Limb.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Limb.cs @@ -520,9 +520,10 @@ namespace Barotrauma // Ignore blocking on items, because it causes cases where a Mudraptor cannot hit the hatch, for example. wasHit = true; } - else if (damageTarget is Structure && structureBody?.UserData is Structure) + else if (damageTarget is Structure wall && structureBody != null && + (structureBody.UserData is Structure || (structureBody.UserData is Submarine sub && sub == wall.Submarine))) { - // If the attack is aimed to a structure and hits a structure, it's successful + // If the attack is aimed to a structure (wall) and hits a structure or the sub, it's successful wasHit = true; } else diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Repairable.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Repairable.cs index 8d3baec86..3f33c4df2 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Repairable.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Repairable.cs @@ -12,6 +12,8 @@ namespace Barotrauma.Items.Components public static float SkillIncreaseMultiplier = 0.4f; private string header; + + private float fixDurationLowSkill, fixDurationHighSkill; private float deteriorationTimer; @@ -50,20 +52,17 @@ namespace Barotrauma.Items.Components set; } - [Serialize(100.0f, true), Editable(MinValueFloat = 0.0f, MaxValueFloat = 100.0f, ToolTip = "The amount of time it takes to fix the item with insufficient skill levels.")] - public float FixDurationLowSkill + /*private float repairProgress; + public float RepairProgress { - get; - set; - } - - [Serialize(10.0f, true), Editable(MinValueFloat = 0.0f, MaxValueFloat = 100.0f, ToolTip = "The amount of time it takes to fix the item with sufficient skill levels.")] - public float FixDurationHighSkill - { - get; - set; - } - + get { return repairProgress; } + set + { + repairProgress = MathHelper.Clamp(value, 0.0f, 1.0f); + if (repairProgress >= 1.0f && currentFixer != null) currentFixer.AnimController.Anim = AnimController.Animation.None; + } + }*/ + private Character currentFixer; public Character CurrentFixer { @@ -84,6 +83,8 @@ namespace Barotrauma.Items.Components this.item = item; header = element.GetAttributeString("name", ""); + fixDurationLowSkill = element.GetAttributeFloat("fixdurationlowskill", 100.0f); + fixDurationHighSkill = element.GetAttributeFloat("fixdurationhighskill", 5.0f); InitProjSpecific(element); } @@ -159,7 +160,7 @@ namespace Barotrauma.Items.Components } bool wasBroken = !item.IsFullCondition; - float fixDuration = MathHelper.Lerp(FixDurationLowSkill, FixDurationHighSkill, successFactor); + float fixDuration = MathHelper.Lerp(fixDurationLowSkill, fixDurationHighSkill, successFactor); if (fixDuration <= 0.0f) { item.Condition = item.MaxCondition; @@ -185,5 +186,26 @@ namespace Barotrauma.Items.Components { character.AnimController.UpdateUseItem(false, item.WorldPosition + new Vector2(0.0f, 100.0f) * ((item.Condition / item.MaxCondition) % 0.1f)); } + + public void ServerWrite(NetBuffer msg, Client c, object[] extraData = null) + { + msg.Write(deteriorationTimer); + } + + public void ClientRead(ServerNetObject type, NetBuffer msg, float sendingTime) + { + deteriorationTimer = msg.ReadSingle(); + } + + public void ClientWrite(NetBuffer msg, object[] extraData = null) + { + //no need to write anything, just letting the server know we started repairing + } + + public void ServerRead(ClientNetObject type, NetBuffer msg, Client c) + { + if (c.Character == null) return; + StartRepairing(c.Character); + } } } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index 32cb6f3be..81eab7a47 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -59,7 +59,7 @@ namespace Barotrauma public PhysicsBody body; public readonly XElement StaticBodyConfig; - + private float lastSentCondition; private float sendConditionUpdateTimer; private bool conditionUpdatePending; @@ -274,11 +274,12 @@ namespace Barotrauma SetActiveSprite(); - if (GameMain.NetworkMember != null && GameMain.NetworkMember.IsServer && !MathUtils.NearlyEqual(lastSentCondition, condition)) + if (GameMain.NetworkMember != null && GameMain.NetworkMember.IsServer && lastSentCondition != condition) { if (Math.Abs(lastSentCondition - condition) > 1.0f || condition == 0.0f || condition == Prefab.Health) { - conditionUpdatePending = true; + GameMain.NetworkMember.CreateEntityEvent(this, new object[] { NetEntityEvent.Type.Status }); + lastSentCondition = condition; } } } @@ -995,21 +996,6 @@ namespace Barotrauma aiTarget.SightRange -= deltaTime * 1000.0f; aiTarget.SoundRange -= deltaTime * 1000.0f; } - - if (GameMain.NetworkMember != null && GameMain.NetworkMember.IsServer) - { - sendConditionUpdateTimer -= deltaTime; - if (conditionUpdatePending) - { - if (sendConditionUpdateTimer <= 0.0f) - { - GameMain.NetworkMember.CreateEntityEvent(this, new object[] { NetEntityEvent.Type.Status }); - lastSentCondition = condition; - sendConditionUpdateTimer = NetConfig.ItemConditionUpdateInterval; - conditionUpdatePending = false; - } - } - } ApplyStatusEffects(ActionType.Always, deltaTime, null); diff --git a/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs b/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs index c252c399a..83ea002c0 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs @@ -175,11 +175,12 @@ namespace Barotrauma LimitSize(); UpdateProjSpecific(growModifier); - - if (size.X < 1.0f && (GameMain.NetworkMember == null || GameMain.NetworkMember.IsServer)) - { - Remove(); - } + +#if CLIENT + if (GameMain.Client != null) return; +#endif + + if (size.X < 1.0f) Remove(); } partial void UpdateProjSpecific(float growModifier); @@ -292,6 +293,10 @@ namespace Barotrauma //evaporate some of the water hull.WaterVolume -= extinguishAmount; +#if CLIENT + if (GameMain.Client != null) return; +#endif + if (size.X < 1.0f && (GameMain.NetworkMember == null || GameMain.NetworkMember.IsServer)) { Remove(); @@ -320,11 +325,12 @@ namespace Barotrauma size.X -= extinguishAmount; hull.WaterVolume -= extinguishAmount; - - if (size.X < 1.0f && (GameMain.NetworkMember == null || GameMain.NetworkMember.IsServer)) - { - Remove(); - } + +#if CLIENT + if (GameMain.Client != null) return; +#endif + + if (size.X < 1.0f) Remove(); } public void Extinguish(float deltaTime, float amount, Vector2 worldPosition) diff --git a/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs b/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs index 6f537c2c7..8ffc5630e 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs @@ -231,7 +231,7 @@ namespace Barotrauma public static Level CreateRandom(LocationConnection locationConnection) { - string seed = locationConnection.Locations[0].BaseName + locationConnection.Locations[1].BaseName; + string seed = locationConnection.Locations[0].Name + locationConnection.Locations[1].Name; float sizeFactor = MathUtils.InverseLerp( MapGenerationParams.Instance.SmallLevelConnectionLength, diff --git a/Barotrauma/BarotraumaShared/Source/Map/Levels/LevelObjects/LevelObject.cs b/Barotrauma/BarotraumaShared/Source/Map/Levels/LevelObjects/LevelObject.cs index 3874415b6..d96da098c 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Levels/LevelObjects/LevelObject.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Levels/LevelObjects/LevelObject.cs @@ -15,6 +15,7 @@ namespace Barotrauma public Vector3 Position; public float NetworkUpdateTimer; + public const float NetworkUpdateInterval = 0.2f; public float Scale; diff --git a/Barotrauma/BarotraumaShared/Source/Map/Levels/LevelObjects/LevelObjectManager.cs b/Barotrauma/BarotraumaShared/Source/Map/Levels/LevelObjects/LevelObjectManager.cs index b75965a40..40469cea9 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Levels/LevelObjects/LevelObjectManager.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Levels/LevelObjects/LevelObjectManager.cs @@ -343,7 +343,7 @@ namespace Barotrauma { GameMain.NetworkMember.CreateEntityEvent(this, new object[] { obj }); obj.NeedsNetworkSyncing = false; - obj.NetworkUpdateTimer = NetConfig.LevelObjectUpdateInterval; + obj.NetworkUpdateTimer = LevelObject.NetworkUpdateInterval; } } diff --git a/Barotrauma/BarotraumaShared/Source/Map/Levels/LevelObjects/LevelTrigger.cs b/Barotrauma/BarotraumaShared/Source/Map/Levels/LevelObjects/LevelTrigger.cs index 1c3ec2339..83033e604 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Levels/LevelObjects/LevelTrigger.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Levels/LevelObjects/LevelTrigger.cs @@ -432,16 +432,12 @@ namespace Barotrauma { if (ForceFluctuationStrength > 0.0f) { - //no need for force fluctuation (or network updates) if the trigger limits velocity and there are no triggerers - if (forceMode != TriggerForceMode.LimitVelocity || triggerers.Any()) + forceFluctuationTimer += deltaTime; + if (forceFluctuationTimer > ForceFluctuationInterval) { - forceFluctuationTimer += deltaTime; - if (forceFluctuationTimer > ForceFluctuationInterval) - { - NeedsNetworkSyncing = true; - currentForceFluctuation = Rand.Range(1.0f - ForceFluctuationStrength, 1.0f); - forceFluctuationTimer = 0.0f; - } + NeedsNetworkSyncing = true; + currentForceFluctuation = Rand.Range(1.0f - ForceFluctuationStrength, 1.0f); + forceFluctuationTimer = 0.0f; } } diff --git a/Barotrauma/BarotraumaShared/Source/Map/Map/Location.cs b/Barotrauma/BarotraumaShared/Source/Map/Map/Location.cs index f507b0796..c2e449bc8 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Map/Location.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Map/Location.cs @@ -15,8 +15,6 @@ namespace Barotrauma public int TypeChangeTimer; - public string BaseName { get => baseName; } - public string Name { get; private set; } public Vector2 MapPosition { get; private set; } @@ -36,7 +34,7 @@ namespace Barotrauma for (int i = availableMissions.Count; i < Connections.Count * 2; i++) { - int seed = (ToolBox.StringToInt(BaseName) + MissionsCompleted * 10 + i) % int.MaxValue; + int seed = (ToolBox.StringToInt(Name) + MissionsCompleted * 10 + i) % int.MaxValue; MTRandom rand = new MTRandom(seed); LocationConnection connection = Connections[(MissionsCompleted + i) % Connections.Count]; diff --git a/Barotrauma/BarotraumaShared/Source/Map/Map/Map.cs b/Barotrauma/BarotraumaShared/Source/Map/Map/Map.cs index 5776ce80b..ba0ba04d5 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Map/Map.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Map/Map.cs @@ -578,12 +578,10 @@ namespace Barotrauma location.MissionsCompleted = missionsCompleted; if (showNotifications && prevLocationType != location.Type) { - var change = prevLocationType.CanChangeTo.Find(c => - c.ChangeToType.ToLowerInvariant() == location.Type.Identifier.ToLowerInvariant()); - if (change != null) - { - ChangeLocationType(location, prevLocationName, change); - } + ChangeLocationType( + location, + prevLocationName, + prevLocationType.CanChangeTo.Find(c => c.ChangeToType.ToLowerInvariant() == location.Type.Identifier.ToLowerInvariant())); } break; case "connection": diff --git a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs index 4e71afd3b..c721d576f 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs @@ -10,7 +10,6 @@ using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; -using System.Threading; using System.Xml.Linq; using Voronoi2; diff --git a/Barotrauma/BarotraumaShared/Source/Networking/FileTransfer/FileTransfer.cs b/Barotrauma/BarotraumaShared/Source/Networking/FileTransfer/FileTransfer.cs index a5d48f5eb..51a489698 100644 --- a/Barotrauma/BarotraumaShared/Source/Networking/FileTransfer/FileTransfer.cs +++ b/Barotrauma/BarotraumaShared/Source/Networking/FileTransfer/FileTransfer.cs @@ -7,7 +7,7 @@ enum FileTransferMessageType { - Unknown, Initiate, Data, TransferOnSameMachine, Cancel + Unknown, Initiate, Data, Cancel } enum FileTransferType diff --git a/Barotrauma/BarotraumaShared/Source/Networking/NetConfig.cs b/Barotrauma/BarotraumaShared/Source/Networking/NetConfig.cs index 74b6afcb2..d7a36e28c 100644 --- a/Barotrauma/BarotraumaShared/Source/Networking/NetConfig.cs +++ b/Barotrauma/BarotraumaShared/Source/Networking/NetConfig.cs @@ -32,14 +32,11 @@ namespace Barotrauma.Networking public const float HighPrioCharacterPositionUpdateInterval = 0.0f; public const float LowPrioCharacterPositionUpdateInterval = 1.0f; - public const float DeleteDisconnectedTime = 20.0f; - - public const float ItemConditionUpdateInterval = 0.15f; - public const float LevelObjectUpdateInterval = 0.5f; - public const float HullUpdateInterval = 0.5f; - public const float HullUpdateDistance = 20000.0f; - - public const int MaxEventPacketsPerUpdate = 4; + //how much the physics body of an item has to move until the server + //send a position update to clients (in sim units) + public const float ItemPosUpdateDistance = 2.0f; + + public const float DeleteDisconnectedTime = 10.0f; /// /// Interpolates the positional error of a physics body towards zero. diff --git a/Barotrauma/BarotraumaShared/Source/Networking/NetEntityEvent/NetEntityEventManager.cs b/Barotrauma/BarotraumaShared/Source/Networking/NetEntityEvent/NetEntityEventManager.cs index 20cb9b39a..03e28f3d4 100644 --- a/Barotrauma/BarotraumaShared/Source/Networking/NetEntityEvent/NetEntityEventManager.cs +++ b/Barotrauma/BarotraumaShared/Source/Networking/NetEntityEvent/NetEntityEventManager.cs @@ -58,8 +58,15 @@ namespace Barotrauma.Networking eventCount++; continue; } - - if (msg.LengthBytes + tempBuffer.LengthBytes + tempEventBuffer.LengthBytes > MaxEventBufferLength) + //the ID has been taken by another entity (the original entity has been removed) -> write an empty event + /*else if (Entity.FindEntityByID(e.Entity.ID) != e.Entity || e.Entity.IdFreed) + { + //technically the clients don't have any use for these, but removing events and shifting the IDs of all + //consecutive ones is so error-prone that I think this is a safer option + tempBuffer.Write(Entity.NullEntityID); + tempBuffer.WritePadBits(); + }*/ + else { //no more room in this packet break; diff --git a/Barotrauma/BarotraumaShared/Submarines/Dugong.sub b/Barotrauma/BarotraumaShared/Submarines/Dugong.sub index bfcc4904b..d2cd1ff19 100644 Binary files a/Barotrauma/BarotraumaShared/Submarines/Dugong.sub and b/Barotrauma/BarotraumaShared/Submarines/Dugong.sub differ diff --git a/Barotrauma/BarotraumaShared/Submarines/Humpback.sub b/Barotrauma/BarotraumaShared/Submarines/Humpback.sub index 0e37eeee6..aacc41a31 100644 Binary files a/Barotrauma/BarotraumaShared/Submarines/Humpback.sub and b/Barotrauma/BarotraumaShared/Submarines/Humpback.sub differ diff --git a/Barotrauma/BarotraumaShared/changelog.txt b/Barotrauma/BarotraumaShared/changelog.txt index 421c3d7df..15722f9ce 100644 --- a/Barotrauma/BarotraumaShared/changelog.txt +++ b/Barotrauma/BarotraumaShared/changelog.txt @@ -9,8 +9,6 @@ Additions and changes: - Clients communicate syncing errors to the server, and the server logs a more descriptive error about what went wrong. Should make it easier to diagnose disconnection issues from now on. - Ending a multiplayer campaign round by talking to watchman doesn't require any special permissions. -- Server automatically ends rounds if there have been no players alive in 60 seconds and respawning -is not allowed during the round. - Added a button for resetting an entity's properties to the default values to the sub editor. - Updated handheld sonar UI graphics.