Merge branch 'dev' into tornadoes

This commit is contained in:
JohnCorby 2021-12-08 09:21:10 -08:00
commit 8b177653d6
8 changed files with 64 additions and 66 deletions

View File

@ -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()

View File

@ -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();
}
}
}

View File

@ -1,7 +1,6 @@
using QuantumUNET;
using QuantumUNET.Messages;
using QuantumUNET.Transport;
using System.Linq;
using UnityEngine;
namespace QSB.Utility.VariableSync
@ -11,16 +10,15 @@ 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()
{
QNetworkServer.instance.m_SimpleServerSimple.RegisterHandlerSafe(short.MaxValue, HandleVariable);
QNetworkServer.RegisterHandlerSafe(short.MaxValue, HandleVariable);
if (LocalPlayerAuthority)
{
@ -29,7 +27,10 @@ namespace QSB.Utility.VariableSync
}
public virtual void Start()
=> _index = GetComponents<BaseVariableSyncer>().ToList().IndexOf(this);
=> _index = GetComponents<BaseVariableSyncer>().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);

View File

@ -5,24 +5,21 @@ namespace QSB.Utility.VariableSync
{
public class BoolVariableSyncer : BaseVariableSyncer
{
public VariableReference<bool> ValueToSync { get; private set; }
private VariableReference<bool> _ref;
private bool _prevValue;
public void Init(Func<bool> getter, Action<bool> setter)
{
ValueToSync = new(this);
ValueToSync.Getter = getter;
ValueToSync.Setter = setter;
_ready = true;
_ref = new VariableReference<bool>(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;
}
}

View File

@ -5,24 +5,21 @@ namespace QSB.Utility.VariableSync
{
public class FloatVariableSyncer : BaseVariableSyncer
{
public VariableReference<float> ValueToSync { get; private set; }
private VariableReference<float> _ref;
private float _prevValue;
public void Init(Func<float> getter, Action<float> setter)
{
ValueToSync = new(this);
ValueToSync.Getter = getter;
ValueToSync.Setter = setter;
_ready = true;
_ref = new VariableReference<float>(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;
}
}

View File

@ -2,23 +2,26 @@
namespace QSB.Utility.VariableSync
{
public class VariableReference<T>
public readonly struct VariableReference<T>
{
private BaseVariableSyncer _owner;
private readonly BaseVariableSyncer _owner;
private readonly Func<T> _getter;
private readonly Action<T> _setter;
public Func<T> Getter;
public Action<T> Setter;
public VariableReference(BaseVariableSyncer owner)
=> _owner = owner;
public VariableReference(BaseVariableSyncer owner, Func<T> getter, Action<T> 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
{

View File

@ -6,24 +6,21 @@ namespace QSB.Utility.VariableSync
{
public class Vector3VariableSyncer : BaseVariableSyncer
{
public VariableReference<Vector3> ValueToSync { get; private set; }
private VariableReference<Vector3> _ref;
private Vector3 _prevValue;
public void Init(Func<Vector3> getter, Action<Vector3> setter)
{
ValueToSync = new(this);
ValueToSync.Getter = getter;
ValueToSync.Setter = setter;
_ready = true;
_ref = new VariableReference<Vector3>(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
{
@ -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;
}
}

View File

@ -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<int> m_ExternalConnections;
public readonly ServerSimpleWrapper m_SimpleServerSimple;
private readonly ServerSimpleWrapper m_SimpleServerSimple;
private float m_MaxDelay = 0.1f;