mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-02-04 12:39:52 +00:00
85 lines
2.0 KiB
C#
85 lines
2.0 KiB
C#
using QSB.SectorSync;
|
|
using QSB.Syncs.Sectored.Rigidbodies;
|
|
using QSB.WorldSync;
|
|
|
|
namespace QSB.ShipSync.TransformSync
|
|
{
|
|
public class ShipTransformSync : SectoredRigidbodySync
|
|
{
|
|
public static ShipTransformSync LocalInstance { get; private set; }
|
|
|
|
private const int ForcePositionAfterUpdates = 50;
|
|
private int _updateCount;
|
|
|
|
public override bool IsReady
|
|
=> Locator.GetShipBody() != null;
|
|
|
|
public override void Start()
|
|
{
|
|
base.Start();
|
|
LocalInstance = this;
|
|
}
|
|
|
|
protected override OWRigidbody GetRigidbody()
|
|
{
|
|
QSBCore.UnityEvents.RunWhen(() => WorldObjectManager.AllReady, () => SectorSync.Init(Locator.GetShipDetector().GetComponent<SectorDetector>(), TargetType.Ship));
|
|
return Locator.GetShipBody();
|
|
}
|
|
|
|
private void ForcePosition()
|
|
{
|
|
if (ReferenceTransform == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var targetPos = _intermediaryTransform.GetTargetPosition_Unparented();
|
|
var targetRot = _intermediaryTransform.GetTargetRotation_Unparented();
|
|
|
|
(AttachedObject as OWRigidbody).SetPosition(targetPos);
|
|
(AttachedObject as OWRigidbody).SetRotation(targetRot);
|
|
}
|
|
|
|
protected override bool UpdateTransform()
|
|
{
|
|
if (!UpdateSectors())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Dont do base... this is a replacement!
|
|
|
|
if (HasAuthority)
|
|
{
|
|
SetValuesToSync();
|
|
return true;
|
|
}
|
|
|
|
_updateCount++;
|
|
|
|
if (_updateCount >= ForcePositionAfterUpdates)
|
|
{
|
|
_updateCount = 0;
|
|
ForcePosition();
|
|
}
|
|
|
|
if (ReferenceTransform == null)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
var targetPos = _intermediaryTransform.GetTargetPosition_Unparented();
|
|
|
|
var targetVelocity = ReferenceTransform.GetAttachedOWRigidbody().GetPointVelocity(targetPos) + _relativeVelocity;
|
|
var targetAngularVelocity = ReferenceTransform.GetAttachedOWRigidbody().GetAngularVelocity() + _relativeAngularVelocity;
|
|
|
|
SetVelocity(AttachedObject as OWRigidbody, targetVelocity);
|
|
(AttachedObject as OWRigidbody).SetAngularVelocity(targetAngularVelocity);
|
|
|
|
return true;
|
|
}
|
|
|
|
public override bool UseInterpolation => true;
|
|
protected override float DistanceLeeway => 20f;
|
|
}
|
|
} |