mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-02-04 03:39:55 +00:00
RotatingElementsVariableSyncer
This commit is contained in:
parent
5cff9e2da5
commit
5aea577e40
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
59
QSB/EchoesOfTheEye/RotatingElementsVariableSyncer.cs
Normal file
59
QSB/EchoesOfTheEye/RotatingElementsVariableSyncer.cs
Normal 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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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>();
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user