130 lines
2.5 KiB
C#
130 lines
2.5 KiB
C#
|
using System.Runtime.InteropServices;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.Networking;
|
||
|
|
||
|
namespace RoR2;
|
||
|
|
||
|
public class RunFixedTimeRotateObject : NetworkBehaviour
|
||
|
{
|
||
|
private const float ERROR_THRESHOLD = 0.1f;
|
||
|
|
||
|
[SerializeField]
|
||
|
private Vector3 eulerVelocity;
|
||
|
|
||
|
[SerializeField]
|
||
|
private bool isLocal = true;
|
||
|
|
||
|
[SyncVar]
|
||
|
private Quaternion initialRotation = Quaternion.identity;
|
||
|
|
||
|
private float clientFixedTime;
|
||
|
|
||
|
private Quaternion desiredRotation = Quaternion.identity;
|
||
|
|
||
|
private Quaternion currentRotation = Quaternion.identity;
|
||
|
|
||
|
public Quaternion NetworkinitialRotation
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return initialRotation;
|
||
|
}
|
||
|
[param: In]
|
||
|
set
|
||
|
{
|
||
|
SetSyncVar(value, ref initialRotation, 1u);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void Start()
|
||
|
{
|
||
|
if ((bool)Run.instance)
|
||
|
{
|
||
|
clientFixedTime = Run.instance.fixedTime;
|
||
|
}
|
||
|
if (isLocal)
|
||
|
{
|
||
|
NetworkinitialRotation = base.transform.localRotation;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
NetworkinitialRotation = base.transform.rotation;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void FixedUpdate()
|
||
|
{
|
||
|
if ((bool)Run.instance && NetworkServer.active)
|
||
|
{
|
||
|
desiredRotation = initialRotation * Quaternion.Euler(eulerVelocity * Run.instance.fixedTime);
|
||
|
return;
|
||
|
}
|
||
|
clientFixedTime += Time.fixedDeltaTime;
|
||
|
if (Mathf.Abs(Run.instance.fixedTime - clientFixedTime) > 0.1f)
|
||
|
{
|
||
|
clientFixedTime = Mathf.Lerp(clientFixedTime, Run.instance.fixedTime, Time.fixedDeltaTime);
|
||
|
}
|
||
|
desiredRotation = initialRotation * Quaternion.Euler(eulerVelocity * clientFixedTime);
|
||
|
}
|
||
|
|
||
|
private void Update()
|
||
|
{
|
||
|
Quaternion quaternion = Quaternion.Lerp(currentRotation, desiredRotation, Time.deltaTime);
|
||
|
if (isLocal)
|
||
|
{
|
||
|
base.transform.localRotation = quaternion;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
base.transform.rotation = quaternion;
|
||
|
}
|
||
|
currentRotation = quaternion;
|
||
|
}
|
||
|
|
||
|
private void UNetVersion()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
public override bool OnSerialize(NetworkWriter writer, bool forceAll)
|
||
|
{
|
||
|
if (forceAll)
|
||
|
{
|
||
|
writer.Write(initialRotation);
|
||
|
return true;
|
||
|
}
|
||
|
bool flag = false;
|
||
|
if ((base.syncVarDirtyBits & (true ? 1u : 0u)) != 0)
|
||
|
{
|
||
|
if (!flag)
|
||
|
{
|
||
|
writer.WritePackedUInt32(base.syncVarDirtyBits);
|
||
|
flag = true;
|
||
|
}
|
||
|
writer.Write(initialRotation);
|
||
|
}
|
||
|
if (!flag)
|
||
|
{
|
||
|
writer.WritePackedUInt32(base.syncVarDirtyBits);
|
||
|
}
|
||
|
return flag;
|
||
|
}
|
||
|
|
||
|
public override void OnDeserialize(NetworkReader reader, bool initialState)
|
||
|
{
|
||
|
if (initialState)
|
||
|
{
|
||
|
initialRotation = reader.ReadQuaternion();
|
||
|
return;
|
||
|
}
|
||
|
int num = (int)reader.ReadPackedUInt32();
|
||
|
if (((uint)num & (true ? 1u : 0u)) != 0)
|
||
|
{
|
||
|
initialRotation = reader.ReadQuaternion();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override void PreStartClient()
|
||
|
{
|
||
|
}
|
||
|
}
|