From ef66d27ffe32a87fba40d04922b7c24310e151d5 Mon Sep 17 00:00:00 2001 From: MapleWheels Date: Thu, 9 Apr 2026 05:34:50 -0400 Subject: [PATCH] - Fixed network synchro of vars, needs synctype testing. --- .../{Services => _Services}/ConfigService.cs | 0 .../{Services => _Services}/LoggerService.cs | 0 .../ModConfigStylesFileParserService.cs | 0 .../NetworkingService.cs | 18 ++++- .../UIStylesCollection.cs | 0 .../UIStylesService.cs | 0 .../_Interfaces/IClientLoggerService.cs | 0 .../_Interfaces/IConfigService.cs | 0 .../_Interfaces/ISettingsMenuService.cs | 0 .../_Interfaces/IUIStylesCollection.cs | 0 .../_Interfaces/IUIStylesService.cs | 0 .../_SettingsMenu/ModsControlsSettingsMenu.cs | 0 .../_SettingsMenu/ModsGameplaySettingsMenu.cs | 0 .../_SettingsMenu/ModsSettingsMenuBase.cs | 0 .../_SettingsMenu/SettingsMenuSystem.cs | 0 .../NetworkingService.cs | 0 .../[DebugOnlyTest]TestLuaMod/Settings.xml | 2 + .../SharedSource/LuaCs/Data/SettingEntry.cs | 75 ++++++++++++++----- .../SharedSource/LuaCs/Data/SettingList.cs | 6 +- .../SharedSource/LuaCs/IEvents.cs | 2 + .../LuaCs/_Services/NetworkingService.cs | 34 ++++++++- .../_Interfaces/INetworkingService.cs | 1 + 22 files changed, 115 insertions(+), 23 deletions(-) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/{Services => _Services}/ConfigService.cs (100%) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/{Services => _Services}/LoggerService.cs (100%) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/{Services => _Services}/ModConfigStylesFileParserService.cs (100%) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/{Services => _Services}/NetworkingService.cs (90%) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/{Services => _Services}/UIStylesCollection.cs (100%) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/{Services => _Services}/UIStylesService.cs (100%) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/{Services => _Services}/_Interfaces/IClientLoggerService.cs (100%) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/{Services => _Services}/_Interfaces/IConfigService.cs (100%) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/{Services => _Services}/_Interfaces/ISettingsMenuService.cs (100%) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/{Services => _Services}/_Interfaces/IUIStylesCollection.cs (100%) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/{Services => _Services}/_Interfaces/IUIStylesService.cs (100%) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/{Services => _Services}/_SettingsMenu/ModsControlsSettingsMenu.cs (100%) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/{Services => _Services}/_SettingsMenu/ModsGameplaySettingsMenu.cs (100%) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/{Services => _Services}/_SettingsMenu/ModsSettingsMenuBase.cs (100%) rename Barotrauma/BarotraumaClient/ClientSource/LuaCs/{Services => _Services}/_SettingsMenu/SettingsMenuSystem.cs (100%) rename Barotrauma/BarotraumaServer/ServerSource/LuaCs/{Services => _Services}/NetworkingService.cs (100%) diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ConfigService.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/ConfigService.cs similarity index 100% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ConfigService.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/ConfigService.cs diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/LoggerService.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/LoggerService.cs similarity index 100% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/LoggerService.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/LoggerService.cs diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ModConfigStylesFileParserService.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/ModConfigStylesFileParserService.cs similarity index 100% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/ModConfigStylesFileParserService.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/ModConfigStylesFileParserService.cs diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/NetworkingService.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/NetworkingService.cs similarity index 90% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/NetworkingService.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/NetworkingService.cs index 0e4a1eb38..4b7c5d771 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/NetworkingService.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/NetworkingService.cs @@ -13,9 +13,25 @@ partial class NetworkingService : INetworkingService, IEventServerConnected, IEv public void OnServerConnected() { + ActivateNetVars(); SendSyncMessage(); } + private void ActivateNetVars() + { + if (GameMain.Client == null) + { + return; + } + + // re-activate net vars + // todo: unregister net vars on client disconnect, currently handled by unloading the state machine. + foreach (var networkSyncVar in netVars.Keys) + { + networkSyncVar.SetNetworkOwner(this); + } + } + public void OnReceivedServerNetMessage(IReadMessage netMessage, ServerPacketHeader serverPacketHeader) { if (serverPacketHeader != ServerHeader) @@ -44,7 +60,7 @@ partial class NetworkingService : INetworkingService, IEventServerConnected, IEv private void SendSyncMessage() { if (GameMain.Client == null) { return; } - + WriteOnlyMessage message = new WriteOnlyMessage(); message.WriteByte((byte)ClientHeader); message.WriteByte((byte)ClientToServer.RequestSync); diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/UIStylesCollection.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/UIStylesCollection.cs similarity index 100% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/UIStylesCollection.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/UIStylesCollection.cs diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/UIStylesService.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/UIStylesService.cs similarity index 100% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/UIStylesService.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/UIStylesService.cs diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_Interfaces/IClientLoggerService.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/_Interfaces/IClientLoggerService.cs similarity index 100% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_Interfaces/IClientLoggerService.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/_Interfaces/IClientLoggerService.cs diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_Interfaces/IConfigService.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/_Interfaces/IConfigService.cs similarity index 100% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_Interfaces/IConfigService.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/_Interfaces/IConfigService.cs diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_Interfaces/ISettingsMenuService.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/_Interfaces/ISettingsMenuService.cs similarity index 100% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_Interfaces/ISettingsMenuService.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/_Interfaces/ISettingsMenuService.cs diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_Interfaces/IUIStylesCollection.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/_Interfaces/IUIStylesCollection.cs similarity index 100% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_Interfaces/IUIStylesCollection.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/_Interfaces/IUIStylesCollection.cs diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_Interfaces/IUIStylesService.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/_Interfaces/IUIStylesService.cs similarity index 100% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_Interfaces/IUIStylesService.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/_Interfaces/IUIStylesService.cs diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsControlsSettingsMenu.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/_SettingsMenu/ModsControlsSettingsMenu.cs similarity index 100% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsControlsSettingsMenu.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/_SettingsMenu/ModsControlsSettingsMenu.cs diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsGameplaySettingsMenu.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/_SettingsMenu/ModsGameplaySettingsMenu.cs similarity index 100% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsGameplaySettingsMenu.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/_SettingsMenu/ModsGameplaySettingsMenu.cs diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsSettingsMenuBase.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/_SettingsMenu/ModsSettingsMenuBase.cs similarity index 100% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/ModsSettingsMenuBase.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/_SettingsMenu/ModsSettingsMenuBase.cs diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/SettingsMenuSystem.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/_SettingsMenu/SettingsMenuSystem.cs similarity index 100% rename from Barotrauma/BarotraumaClient/ClientSource/LuaCs/Services/_SettingsMenu/SettingsMenuSystem.cs rename to Barotrauma/BarotraumaClient/ClientSource/LuaCs/_Services/_SettingsMenu/SettingsMenuSystem.cs diff --git a/Barotrauma/BarotraumaServer/ServerSource/LuaCs/Services/NetworkingService.cs b/Barotrauma/BarotraumaServer/ServerSource/LuaCs/_Services/NetworkingService.cs similarity index 100% rename from Barotrauma/BarotraumaServer/ServerSource/LuaCs/Services/NetworkingService.cs rename to Barotrauma/BarotraumaServer/ServerSource/LuaCs/_Services/NetworkingService.cs diff --git a/Barotrauma/BarotraumaShared/LocalMods/[DebugOnlyTest]TestLuaMod/Settings.xml b/Barotrauma/BarotraumaShared/LocalMods/[DebugOnlyTest]TestLuaMod/Settings.xml index 0cd18babc..c05583cf2 100644 --- a/Barotrauma/BarotraumaShared/LocalMods/[DebugOnlyTest]TestLuaMod/Settings.xml +++ b/Barotrauma/BarotraumaShared/LocalMods/[DebugOnlyTest]TestLuaMod/Settings.xml @@ -2,6 +2,8 @@ + + diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingEntry.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingEntry.cs index 4e584dbdf..83879b195 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingEntry.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingEntry.cs @@ -53,9 +53,14 @@ public partial class SettingEntry : SettingBase, ISettingBase, INetworkSyn public virtual bool TrySetValue(T value) { + if (value is null || value.Equals(Value)) + { + return false; + } #if CLIENT if (SyncType is NetSync.ServerAuthority && NetworkingService is not null && GameMain.IsMultiplayer + && GameMain.Client is not null && !GameMain.Client.HasPermission(this.WritePermissions)) { return false; @@ -73,7 +78,7 @@ public partial class SettingEntry : SettingBase, ISettingBase, INetworkSyn NetworkingService?.SendNetVar(this); } #elif SERVER - if (GameMain.IsMultiplayer && SyncType is NetSync.TwoWay or NetSync.ServerAuthority) + if (SyncType is NetSync.TwoWay or NetSync.ServerAuthority) { NetworkingService?.SendNetVar(this); } @@ -97,9 +102,48 @@ public partial class SettingEntry : SettingBase, ISettingBase, INetworkSyn return true; } + /// + /// handles internal networking rules after reading the net message (to avoid synchro issues). + /// + /// + /// + private bool TrySetValueNetwork(T value) + { + if (NetworkingService is null) + { + return false; + } +#if CLIENT + if (SyncType is NetSync.None or NetSync.ClientOneWay) + { + return false; + } +#else + if (SyncType is NetSync.None or NetSync.ServerAuthority) + { + return false; + } +#endif + if (!TrySetValueInternal(value)) + { + return false; + } + +#if SERVER + if (SyncType is NetSync.TwoWay) + { + NetworkingService?.SendNetVar(this); + } +#endif + + OnValueChanged?.Invoke(this); + return true; + } + protected override void OnDispose() { ValueChangePredicate = null; + NetworkingService?.DeregisterNetVar(this); } public override Type GetValueType() => typeof(T); @@ -151,11 +195,6 @@ public partial class SettingEntry : SettingBase, ISettingBase, INetworkSyn public void SetNetworkOwner(IEntityNetworkingService networkingService) { NetworkingService = networkingService; - if (NetworkingService is null) - { - return; - } - NetworkingService.RegisterNetVar(this); } public NetSync SyncType => ConfigInfo?.NetSync ?? NetSync.None; @@ -181,42 +220,42 @@ public partial class SettingEntry : SettingBase, ISettingBase, INetworkSyn switch (typeCode) { case TypeCode.Boolean: - TrySetValueInternal((T)Convert.ChangeType(message.ReadBoolean(), typeCode)); + TrySetValueNetwork((T)Convert.ChangeType(message.ReadBoolean(), typeCode)); return; case TypeCode.Byte: - TrySetValueInternal((T)Convert.ChangeType(message.ReadByte(), typeCode)); + TrySetValueNetwork((T)Convert.ChangeType(message.ReadByte(), typeCode)); return; // SByte not supported by interface case TypeCode.SByte: - TrySetValueInternal((T)Convert.ChangeType(message.ReadInt16(), typeCode)); + TrySetValueNetwork((T)Convert.ChangeType(message.ReadInt16(), typeCode)); return; case TypeCode.Int16: - TrySetValueInternal((T)Convert.ChangeType(message.ReadInt16(), typeCode)); + TrySetValueNetwork((T)Convert.ChangeType(message.ReadInt16(), typeCode)); return; case TypeCode.Char: case TypeCode.UInt16: - TrySetValueInternal((T)Convert.ChangeType(message.ReadUInt16(), typeCode)); + TrySetValueNetwork((T)Convert.ChangeType(message.ReadUInt16(), typeCode)); return; case TypeCode.Int32: - TrySetValueInternal((T)Convert.ChangeType(message.ReadInt32(), typeCode)); + TrySetValueNetwork((T)Convert.ChangeType(message.ReadInt32(), typeCode)); return; case TypeCode.UInt32: - TrySetValueInternal((T)Convert.ChangeType(message.ReadUInt32(), typeCode)); + TrySetValueNetwork((T)Convert.ChangeType(message.ReadUInt32(), typeCode)); return; case TypeCode.Int64: - TrySetValueInternal((T)Convert.ChangeType(message.ReadInt64(), typeCode)); + TrySetValueNetwork((T)Convert.ChangeType(message.ReadInt64(), typeCode)); return; case TypeCode.UInt64: - TrySetValueInternal((T)Convert.ChangeType(message.ReadUInt64(), typeCode)); + TrySetValueNetwork((T)Convert.ChangeType(message.ReadUInt64(), typeCode)); return; case TypeCode.Single: - TrySetValueInternal((T)Convert.ChangeType(message.ReadSingle(), typeCode)); + TrySetValueNetwork((T)Convert.ChangeType(message.ReadSingle(), typeCode)); return; case TypeCode.Double: - TrySetValueInternal((T)Convert.ChangeType(message.ReadDouble(), typeCode)); + TrySetValueNetwork((T)Convert.ChangeType(message.ReadDouble(), typeCode)); return; case TypeCode.String: - TrySetValueInternal((T)Convert.ChangeType(message.ReadString(), typeCode)); + TrySetValueNetwork((T)Convert.ChangeType(message.ReadString(), typeCode)); return; case TypeCode.Decimal: default: diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingList.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingList.cs index 6e1b19f7e..5c080f5ba 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingList.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Data/SettingList.cs @@ -91,7 +91,11 @@ public class SettingList : SettingEntry, ISettingList where T : IEquata public bool TrySetValueByIndex(int index) { - throw new NotImplementedException(); + if (_valuesList.Count <= index) + { + return false; + } + return base.TrySetValue(_valuesList[index]); } public IReadOnlyList Options => _valuesList.AsReadOnly(); diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/IEvents.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/IEvents.cs index 095ec22bd..d0da76844 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/IEvents.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/IEvents.cs @@ -947,6 +947,8 @@ interface IEventInventoryItemSwap : IEvent #region Networking + + #region Networking-Server #if SERVER public interface IEventClientRawNetMessageReceived : IEvent diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/NetworkingService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/NetworkingService.cs index 8ec528afa..42511ed01 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/NetworkingService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/NetworkingService.cs @@ -11,10 +11,11 @@ using System.Linq; using System.Net.Http; using System.Security.Cryptography; using System.Text; +using Barotrauma.LuaCs.Data; namespace Barotrauma.LuaCs; -internal partial class NetworkingService : INetworkingService +internal partial class NetworkingService : INetworkingService, IEventSettingInstanceLifetime { public readonly record struct NetId { @@ -112,7 +113,6 @@ internal partial class NetworkingService : INetworkingService #if SERVER IsSynchronized = true; #endif - SubscribeToEvents(); } @@ -189,6 +189,7 @@ internal partial class NetworkingService : INetworkingService private void SubscribeToEvents() { + _eventService.Subscribe(this); #if CLIENT _eventService.Subscribe(this); _eventService.Subscribe(this); @@ -246,7 +247,18 @@ internal partial class NetworkingService : INetworkingService #endif } - public void SendNetVar(INetworkSyncVar netVar) => SendNetVar(netVar); + public void DeregisterNetVar(INetworkSyncVar netVar) + { + if (netVar is null) + { + return; + } + + netVar.SetNetworkOwner(null); + netVars.TryRemove(netVar, out _); + } + + public void SendNetVar(INetworkSyncVar netVar) => SendNetVar(netVar, null); public void SendNetVar(INetworkSyncVar netVar, NetworkConnection connection = null) { @@ -390,4 +402,20 @@ internal partial class NetworkingService : INetworkingService #endif #endregion + + public void OnSettingInstanceCreated(T configInstance) where T : ISettingBase + { + if (configInstance is INetworkSyncVar syncVar) + { + RegisterNetVar(syncVar); + } + } + + public void OnSettingInstanceDisposed(T configInstance) where T : ISettingBase + { + if (configInstance is INetworkSyncVar syncVar) + { + DeregisterNetVar(syncVar); + } + } } diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/INetworkingService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/INetworkingService.cs index d72b2c303..007cd6ffe 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/INetworkingService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/INetworkingService.cs @@ -33,6 +33,7 @@ public interface IEntityNetworkingService { Guid GetNetworkIdForInstance(INetworkSyncVar var); void RegisterNetVar(INetworkSyncVar netVar); + void DeregisterNetVar(INetworkSyncVar netVar); void SendNetVar(INetworkSyncVar netVar); void SendNetVar(INetworkSyncVar netVar, NetworkConnection connection); }