RotatingElementsVariableSyncer

This commit is contained in:
JohnCorby 2022-03-14 06:42:00 -07:00
parent 5cff9e2da5
commit 5aea577e40
6 changed files with 73 additions and 45 deletions

View File

@ -1,29 +1,9 @@
using Mirror;
using QSB.EchoesOfTheEye.AirlockSync.WorldObjects;
using QSB.Utility.LinkedWorldObject;
using System.Linq;
using QSB.EchoesOfTheEye.AirlockSync.WorldObjects;
using UnityEngine;
namespace QSB.EchoesOfTheEye.AirlockSync.VariableSync;
internal class AirlockVariableSyncer : LinkedVariableSyncer<Vector3[], QSBGhostAirlock>
internal class AirlockVariableSyncer : RotatingElementsVariableSyncer<QSBGhostAirlock>
{
protected override bool HasChanged()
{
var rotatingElements = WorldObject.AttachedObject._interface._rotatingElements;
Value = rotatingElements.Select(x => x.localRotation.eulerAngles).ToArray();
return base.HasChanged();
}
protected override void Deserialize(NetworkReader reader)
{
base.Deserialize(reader);
var rotatingElements = WorldObject.AttachedObject._interface._rotatingElements;
for (var i = 0; i < rotatingElements.Length; i++)
{
rotatingElements[i].localRotation = Quaternion.Euler(Value[i]);
}
}
protected override Transform[] RotatingElements => WorldObject.AttachedObject._interface._rotatingElements;
}

View File

@ -1,7 +1,9 @@
using QSB.EchoesOfTheEye.EclipseDoors.WorldObjects;
using QSB.Utility.LinkedWorldObject;
using UnityEngine;
namespace QSB.EchoesOfTheEye.EclipseDoors.VariableSync;
internal class EclipseDoorVariableSyncer : LinkedVariableSyncer<Vector3, QSBEclipseDoorController> { }
internal class EclipseDoorVariableSyncer : RotatingElementsVariableSyncer<QSBEclipseDoorController>
{
protected override Transform[] RotatingElements => WorldObject.AttachedObject._rotatingElements;
}

View File

@ -1,8 +1,9 @@
using QSB.EchoesOfTheEye.EclipseElevators.WorldObjects;
using QSB.Utility.LinkedWorldObject;
using QSB.Utility.VariableSync;
using UnityEngine;
namespace QSB.EchoesOfTheEye.EclipseElevators.VariableSync;
internal class EclipseElevatorVariableSyncer : LinkedVariableSyncer<Vector3, QSBEclipseElevatorController> { }
internal class EclipseElevatorVariableSyncer : RotatingElementsVariableSyncer<QSBEclipseElevatorController>
{
protected override Transform[] RotatingElements => WorldObject.AttachedObject._rotatingElements;
}

View File

@ -0,0 +1,59 @@
using Mirror;
using QSB.Utility.LinkedWorldObject;
using QSB.Utility.VariableSync;
using QSB.WorldSync;
using System;
using UnityEngine;
namespace QSB.EchoesOfTheEye;
internal abstract class RotatingElementsVariableSyncer<TWorldObject> : BaseVariableSyncer<Quaternion[]>, ILinkedNetworkBehaviour
where TWorldObject : IWorldObject
{
protected abstract Transform[] RotatingElements { get; }
protected override bool HasChanged()
{
var rotatingElements = RotatingElements;
if (Value == null)
{
Value = new Quaternion[rotatingElements.Length];
PrevValue = new Quaternion[rotatingElements.Length];
}
for (var i = 0; i < rotatingElements.Length; i++)
{
Value[i] = rotatingElements[i].localRotation;
}
for (var i = 0; i < rotatingElements.Length; i++)
{
if (Quaternion.Angle(Value[i], PrevValue[i]) > 1)
{
return true;
}
}
return false;
}
/// <summary>
/// copy array instead of setting, or else changes to values also happen on prev value
/// </summary>
protected override void UpdatePrevData() =>
Array.Copy(Value, PrevValue, Value.Length);
protected override void Deserialize(NetworkReader reader)
{
base.Deserialize(reader);
var rotatingElements = RotatingElements;
for (var i = 0; i < rotatingElements.Length; i++)
{
rotatingElements[i].localRotation = Value[i];
}
}
protected TWorldObject WorldObject { get; private set; }
public void SetWorldObject(IWorldObject worldObject) => WorldObject = (TWorldObject)worldObject;
}

View File

@ -1,14 +0,0 @@
using QSB.Utility.VariableSync;
using QSB.WorldSync;
namespace QSB.Utility.LinkedWorldObject;
/// <summary>
/// helper implementation of the interface
/// </summary>
public abstract class LinkedVariableSyncer<T, TWorldObject> : BaseVariableSyncer<T>, ILinkedNetworkBehaviour
where TWorldObject : IWorldObject
{
protected TWorldObject WorldObject { get; private set; }
public void SetWorldObject(IWorldObject worldObject) => WorldObject = (TWorldObject)worldObject;
}

View File

@ -8,12 +8,12 @@ public abstract class BaseVariableSyncer<T> : QSBNetworkBehaviour
{
protected override float SendInterval => 0.1f;
private T _prevValue;
protected T PrevValue;
[NonSerialized]
public T Value;
protected override bool HasChanged() => !EqualityComparer<T>.Default.Equals(_prevValue, Value);
protected override void UpdatePrevData() => _prevValue = Value;
protected override bool HasChanged() => !EqualityComparer<T>.Default.Equals(PrevValue, Value);
protected override void UpdatePrevData() => PrevValue = Value;
protected override void Serialize(NetworkWriter writer) => writer.Write(Value);
protected override void Deserialize(NetworkReader reader) => Value = reader.Read<T>();
}