From b9d95a16fbc99bf095987d12305bf4a57d5c6032 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Tue, 7 Dec 2021 19:51:11 -0800 Subject: [PATCH 1/3] QNetworkServer.RegisterHandlerSafe --- QSB/Utility/VariableSync/BaseVariableSyncer.cs | 2 +- QuantumUNET/QNetworkServer.cs | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/QSB/Utility/VariableSync/BaseVariableSyncer.cs b/QSB/Utility/VariableSync/BaseVariableSyncer.cs index 934cdff1..1a2df65a 100644 --- a/QSB/Utility/VariableSync/BaseVariableSyncer.cs +++ b/QSB/Utility/VariableSync/BaseVariableSyncer.cs @@ -20,7 +20,7 @@ namespace QSB.Utility.VariableSync public virtual void Awake() { - QNetworkServer.instance.m_SimpleServerSimple.RegisterHandlerSafe(short.MaxValue, HandleVariable); + QNetworkServer.RegisterHandlerSafe(short.MaxValue, HandleVariable); if (LocalPlayerAuthority) { diff --git a/QuantumUNET/QNetworkServer.cs b/QuantumUNET/QNetworkServer.cs index 13551272..eee1fc59 100644 --- a/QuantumUNET/QNetworkServer.cs +++ b/QuantumUNET/QNetworkServer.cs @@ -615,6 +615,8 @@ namespace QuantumUNET public static void RegisterHandler(short msgType, QNetworkMessageDelegate handler) => instance.m_SimpleServerSimple.RegisterHandler(msgType, handler); + public static void RegisterHandlerSafe(short msgType, QNetworkMessageDelegate handler) => instance.m_SimpleServerSimple.RegisterHandlerSafe(msgType, handler); + public static void UnregisterHandler(short msgType) => instance.m_SimpleServerSimple.UnregisterHandler(msgType); public static void ClearHandlers() => instance.m_SimpleServerSimple.ClearHandlers(); @@ -1348,7 +1350,7 @@ namespace QuantumUNET private readonly HashSet m_ExternalConnections; - public readonly ServerSimpleWrapper m_SimpleServerSimple; + private readonly ServerSimpleWrapper m_SimpleServerSimple; private float m_MaxDelay = 0.1f; From f8eb7970d077820c4217f82e13d8a793d143582e Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Tue, 7 Dec 2021 21:56:24 -0800 Subject: [PATCH 2/3] improve variable syncer (fixes the TODO) --- QSB/Animation/Player/CrouchSync.cs | 6 ++--- .../Thrusters/JetpackAccelerationSync.cs | 14 +++++----- .../VariableSync/BaseVariableSyncer.cs | 20 +++++++------- .../VariableSync/BoolVariableSyncer.cs | 19 +++++++------ .../VariableSync/FloatVariableSyncer.cs | 19 +++++++------ QSB/Utility/VariableSync/VariableReference.cs | 27 ++++++++++--------- .../VariableSync/Vector3VariableSyncer.cs | 21 +++++++-------- 7 files changed, 61 insertions(+), 65 deletions(-) diff --git a/QSB/Animation/Player/CrouchSync.cs b/QSB/Animation/Player/CrouchSync.cs index dabcf039..9c07d96e 100644 --- a/QSB/Animation/Player/CrouchSync.cs +++ b/QSB/Animation/Player/CrouchSync.cs @@ -1,8 +1,6 @@ -using QSB.Utility; -using QSB.Utility.VariableSync; +using QSB.Utility.VariableSync; using QuantumUNET; using UnityEngine; -using UnityEngine.Networking; namespace QSB.Animation.Player { @@ -46,7 +44,7 @@ namespace QSB.Animation.Player } var jumpChargeFraction = _playerController.GetJumpCrouchFraction(); - CrouchVariableSyncer.ValueToSync.Value = jumpChargeFraction; + CrouchValue = jumpChargeFraction; } private void SyncRemoteCrouch() diff --git a/QSB/Animation/Player/Thrusters/JetpackAccelerationSync.cs b/QSB/Animation/Player/Thrusters/JetpackAccelerationSync.cs index d15be2c0..c5271060 100644 --- a/QSB/Animation/Player/Thrusters/JetpackAccelerationSync.cs +++ b/QSB/Animation/Player/Thrusters/JetpackAccelerationSync.cs @@ -8,19 +8,17 @@ namespace QSB.Animation.Player.Thrusters { public Vector3VariableSyncer AccelerationVariableSyncer; public BoolVariableSyncer ThrustingVariableSyncer; - public Vector3 LocalAcceleration => AccelerationVariableSyncer.ValueToSync.Value; - public bool IsThrusting => ThrustingVariableSyncer.ValueToSync.Value; + public Vector3 LocalAcceleration { get; private set; } + public bool IsThrusting { get; private set; } - private Vector3 _localAcceleration; - private bool _isThrusting; private ThrusterModel _thrusterModel; public void Init(ThrusterModel model) { _thrusterModel = model; - AccelerationVariableSyncer.Init(() => _localAcceleration, val => _localAcceleration = val); - ThrustingVariableSyncer.Init(() => _isThrusting, val => _isThrusting = val); + AccelerationVariableSyncer.Init(() => LocalAcceleration, val => LocalAcceleration = val); + ThrustingVariableSyncer.Init(() => IsThrusting, val => IsThrusting = val); } public void Update() @@ -35,8 +33,8 @@ namespace QSB.Animation.Player.Thrusters { if (_thrusterModel != null) { - AccelerationVariableSyncer.ValueToSync.Value = _thrusterModel.GetLocalAcceleration(); - ThrustingVariableSyncer.ValueToSync.Value = _thrusterModel.IsTranslationalThrusterFiring(); + LocalAcceleration = _thrusterModel.GetLocalAcceleration(); + IsThrusting = _thrusterModel.IsTranslationalThrusterFiring(); } } } diff --git a/QSB/Utility/VariableSync/BaseVariableSyncer.cs b/QSB/Utility/VariableSync/BaseVariableSyncer.cs index 1a2df65a..8b0a6061 100644 --- a/QSB/Utility/VariableSync/BaseVariableSyncer.cs +++ b/QSB/Utility/VariableSync/BaseVariableSyncer.cs @@ -1,7 +1,6 @@ using QuantumUNET; using QuantumUNET.Messages; using QuantumUNET.Transport; -using System.Linq; using UnityEngine; namespace QSB.Utility.VariableSync @@ -11,12 +10,11 @@ namespace QSB.Utility.VariableSync private float _lastClientSendTime; private QNetworkWriter _writer; private int _index; - protected bool _ready; + public bool Ready { get; protected set; } public abstract void WriteData(QNetworkWriter writer); public abstract void ReadData(QNetworkReader writer); - - public bool Ready => _ready; + public abstract bool HasChanged(); public virtual void Awake() { @@ -29,7 +27,10 @@ namespace QSB.Utility.VariableSync } public virtual void Start() - => _index = GetComponents().ToList().IndexOf(this); + => _index = GetComponents().IndexOfReference(this); + + public void OnDestroy() + => Ready = false; public override bool OnSerialize(QNetworkWriter writer, bool initialState) { @@ -63,12 +64,12 @@ namespace QSB.Utility.VariableSync private void FixedUpdate() { - if (!IsServer || SyncVarDirtyBits != 0U || !QNetworkServer.active || !_ready) + if (!IsServer || SyncVarDirtyBits != 0U || !QNetworkServer.active || !Ready) { return; } - if (GetNetworkSendInterval() != 0f) + if (GetNetworkSendInterval() != 0f && HasChanged()) { SetDirtyBit(1U); } @@ -76,7 +77,7 @@ namespace QSB.Utility.VariableSync public virtual void Update() { - if (!HasAuthority || !LocalPlayerAuthority || QNetworkServer.active || !_ready) + if (!HasAuthority || !LocalPlayerAuthority || QNetworkServer.active || !Ready) { return; } @@ -90,8 +91,7 @@ namespace QSB.Utility.VariableSync private void SendVariable() { - // TODO - this sends a message, even when the value hasnt changed! this is really bad! - if (QClientScene.readyConnection != null) + if (HasChanged() && QClientScene.readyConnection != null) { _writer.StartMessage(short.MaxValue); _writer.Write(NetId); diff --git a/QSB/Utility/VariableSync/BoolVariableSyncer.cs b/QSB/Utility/VariableSync/BoolVariableSyncer.cs index 874fadca..f2c20e9e 100644 --- a/QSB/Utility/VariableSync/BoolVariableSyncer.cs +++ b/QSB/Utility/VariableSync/BoolVariableSyncer.cs @@ -5,24 +5,21 @@ namespace QSB.Utility.VariableSync { public class BoolVariableSyncer : BaseVariableSyncer { - public VariableReference ValueToSync { get; private set; } + private VariableReference _ref; + private bool _prevValue; public void Init(Func getter, Action setter) { - ValueToSync = new(this); - ValueToSync.Getter = getter; - ValueToSync.Setter = setter; - _ready = true; + _ref = new VariableReference(this, getter, setter); + Ready = true; } - public void OnDestroy() - => _ready = false; - public override void WriteData(QNetworkWriter writer) { if (Ready) { - writer.Write(ValueToSync.Value); + writer.Write(_ref.Value); + _prevValue = _ref.Value; } else { @@ -34,12 +31,14 @@ namespace QSB.Utility.VariableSync { if (Ready) { - ValueToSync.Value = reader.ReadBoolean(); + _ref.Value = reader.ReadBoolean(); } else { reader.ReadBoolean(); } } + + public override bool HasChanged() => _ref.Value != _prevValue; } } diff --git a/QSB/Utility/VariableSync/FloatVariableSyncer.cs b/QSB/Utility/VariableSync/FloatVariableSyncer.cs index 5a49bf5d..ef679a7b 100644 --- a/QSB/Utility/VariableSync/FloatVariableSyncer.cs +++ b/QSB/Utility/VariableSync/FloatVariableSyncer.cs @@ -5,24 +5,21 @@ namespace QSB.Utility.VariableSync { public class FloatVariableSyncer : BaseVariableSyncer { - public VariableReference ValueToSync { get; private set; } + private VariableReference _ref; + private float _prevValue; public void Init(Func getter, Action setter) { - ValueToSync = new(this); - ValueToSync.Getter = getter; - ValueToSync.Setter = setter; - _ready = true; + _ref = new VariableReference(this, getter, setter); + Ready = true; } - public void OnDestroy() - => _ready = false; - public override void WriteData(QNetworkWriter writer) { if (Ready) { - writer.Write(ValueToSync.Value); + writer.Write(_ref.Value); + _prevValue = _ref.Value; } else { @@ -34,12 +31,14 @@ namespace QSB.Utility.VariableSync { if (Ready) { - ValueToSync.Value = reader.ReadSingle(); + _ref.Value = reader.ReadSingle(); } else { reader.ReadSingle(); } } + + public override bool HasChanged() => _ref.Value != _prevValue; } } diff --git a/QSB/Utility/VariableSync/VariableReference.cs b/QSB/Utility/VariableSync/VariableReference.cs index f2343bb5..d6b6662f 100644 --- a/QSB/Utility/VariableSync/VariableReference.cs +++ b/QSB/Utility/VariableSync/VariableReference.cs @@ -2,23 +2,26 @@ namespace QSB.Utility.VariableSync { - public class VariableReference + public readonly struct VariableReference { - private BaseVariableSyncer _owner; + private readonly BaseVariableSyncer _owner; + private readonly Func _getter; + private readonly Action _setter; - public Func Getter; - public Action Setter; - - public VariableReference(BaseVariableSyncer owner) - => _owner = owner; + public VariableReference(BaseVariableSyncer owner, Func getter, Action setter) + { + _owner = owner; + _getter = getter; + _setter = setter; + } public T Value { get { - if (Getter != null) + if (_getter != null) { - return Getter(); + return _getter(); } else { @@ -26,15 +29,15 @@ namespace QSB.Utility.VariableSync { DebugLog.ToConsole($"Warning - Getter is null!", OWML.Common.MessageType.Warning); } - + return default; } } set { - if (Setter != null) + if (_setter != null) { - Setter(value); + _setter(value); } else { diff --git a/QSB/Utility/VariableSync/Vector3VariableSyncer.cs b/QSB/Utility/VariableSync/Vector3VariableSyncer.cs index 4c8ad761..26e5f859 100644 --- a/QSB/Utility/VariableSync/Vector3VariableSyncer.cs +++ b/QSB/Utility/VariableSync/Vector3VariableSyncer.cs @@ -6,28 +6,25 @@ namespace QSB.Utility.VariableSync { public class Vector3VariableSyncer : BaseVariableSyncer { - public VariableReference ValueToSync { get; private set; } + private VariableReference _ref; + private Vector3 _prevValue; public void Init(Func getter, Action setter) { - ValueToSync = new(this); - ValueToSync.Getter = getter; - ValueToSync.Setter = setter; - _ready = true; + _ref = new VariableReference(this, getter, setter); + Ready = true; } - public void OnDestroy() - => _ready = false; - public override void WriteData(QNetworkWriter writer) { if (Ready) { - writer.Write(ValueToSync.Value); + writer.Write(_ref.Value); + _prevValue = _ref.Value; } else { - writer.Write(default(Vector3)); + writer.Write(default(float)); } } @@ -35,12 +32,14 @@ namespace QSB.Utility.VariableSync { if (Ready) { - ValueToSync.Value = reader.ReadVector3(); + _ref.Value = reader.ReadVector3(); } else { reader.ReadVector3(); } } + + public override bool HasChanged() => _ref.Value != _prevValue; } } From 60ce63173cb041596aecab0cc6112cde83a64249 Mon Sep 17 00:00:00 2001 From: Will Corby Date: Tue, 7 Dec 2021 23:24:29 -0800 Subject: [PATCH 3/3] Update Vector3VariableSyncer.cs --- QSB/Utility/VariableSync/Vector3VariableSyncer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QSB/Utility/VariableSync/Vector3VariableSyncer.cs b/QSB/Utility/VariableSync/Vector3VariableSyncer.cs index 26e5f859..8eea8624 100644 --- a/QSB/Utility/VariableSync/Vector3VariableSyncer.cs +++ b/QSB/Utility/VariableSync/Vector3VariableSyncer.cs @@ -24,7 +24,7 @@ namespace QSB.Utility.VariableSync } else { - writer.Write(default(float)); + writer.Write(default(Vector3)); } }