diff --git a/QSB/ShipSync/TransformSync/ShipTransformSync.cs b/QSB/ShipSync/TransformSync/ShipTransformSync.cs index 98aed441..48e1b400 100644 --- a/QSB/ShipSync/TransformSync/ShipTransformSync.cs +++ b/QSB/ShipSync/TransformSync/ShipTransformSync.cs @@ -73,7 +73,7 @@ namespace QSB.ShipSync.TransformSync var targetVelocity = ReferenceTransform.GetAttachedOWRigidbody().GetPointVelocity(targetPos) + _relativeVelocity; var targetAngularVelocity = ReferenceTransform.GetAttachedOWRigidbody().GetAngularVelocity() + _relativeAngularVelocity; - (AttachedObject as OWRigidbody).SetVelocity(targetVelocity); + SetVelocity(AttachedObject as OWRigidbody, targetVelocity); (AttachedObject as OWRigidbody).SetAngularVelocity(targetAngularVelocity); return true; diff --git a/QSB/Syncs/Sectored/Rigidbodies/SectoredRigidbodySync.cs b/QSB/Syncs/Sectored/Rigidbodies/SectoredRigidbodySync.cs index d6502a7c..b160b75d 100644 --- a/QSB/Syncs/Sectored/Rigidbodies/SectoredRigidbodySync.cs +++ b/QSB/Syncs/Sectored/Rigidbodies/SectoredRigidbodySync.cs @@ -1,4 +1,5 @@ using OWML.Common; +using OWML.Utils; using QSB.Utility; using QuantumUNET.Transport; using UnityEngine; @@ -163,7 +164,7 @@ namespace QSB.Syncs.Sectored.Rigidbodies var targetVelocity = ReferenceTransform.GetAttachedOWRigidbody().GetPointVelocity(targetPos) + _relativeVelocity; var targetAngularVelocity = ReferenceTransform.GetAttachedOWRigidbody().GetAngularVelocity() + _relativeAngularVelocity; - (AttachedObject as OWRigidbody).SetVelocity(targetVelocity); + SetVelocity(AttachedObject as OWRigidbody, targetVelocity); (AttachedObject as OWRigidbody).SetAngularVelocity(targetAngularVelocity); return true; @@ -218,6 +219,26 @@ namespace QSB.Syncs.Sectored.Rigidbodies return false; } + protected void SetVelocity(OWRigidbody rigidbody, Vector3 relativeVelocity) + { + var isRunningKinematic = rigidbody.RunningKinematicSimulation(); + var currentVelocity = rigidbody.GetValue("_currentVelocity"); + + if (isRunningKinematic) + { + var kinematicRigidbody = rigidbody.GetValue("_kinematicRigidbody"); + kinematicRigidbody.velocity = relativeVelocity + Locator.GetCenterOfTheUniverse().GetStaticFrameVelocity_Internal(); + } + else + { + var normalRigidbody = rigidbody.GetValue("_rigidbody"); + normalRigidbody.velocity = relativeVelocity + Locator.GetCenterOfTheUniverse().GetStaticFrameVelocity_Internal(); + } + + rigidbody.SetValue("_lastVelocity", currentVelocity); + rigidbody.SetValue("_currentVelocity", relativeVelocity); + } + public float GetVelocityChangeMagnitude() => (_relativeVelocity - _prevVelocity).magnitude; diff --git a/QSB/Syncs/Unsectored/Rigidbodies/UnsectoredRigidbodySync.cs b/QSB/Syncs/Unsectored/Rigidbodies/UnsectoredRigidbodySync.cs index 6c165f60..95bdc518 100644 --- a/QSB/Syncs/Unsectored/Rigidbodies/UnsectoredRigidbodySync.cs +++ b/QSB/Syncs/Unsectored/Rigidbodies/UnsectoredRigidbodySync.cs @@ -1,4 +1,5 @@ using OWML.Common; +using OWML.Utils; using QSB.Utility; using QuantumUNET.Transport; using UnityEngine; @@ -154,7 +155,7 @@ namespace QSB.Syncs.Unsectored.Rigidbodies var targetVelocity = ReferenceTransform.GetAttachedOWRigidbody().GetPointVelocity(targetPos) + _relativeVelocity; var targetAngularVelocity = ReferenceTransform.GetAttachedOWRigidbody().GetAngularVelocity() + _relativeAngularVelocity; - (AttachedObject as OWRigidbody).SetVelocity(targetVelocity); + SetVelocity(AttachedObject as OWRigidbody, targetVelocity); (AttachedObject as OWRigidbody).SetAngularVelocity(targetAngularVelocity); return true; @@ -209,6 +210,26 @@ namespace QSB.Syncs.Unsectored.Rigidbodies return false; } + protected void SetVelocity(OWRigidbody rigidbody, Vector3 relativeVelocity) + { + var isRunningKinematic = rigidbody.RunningKinematicSimulation(); + var currentVelocity = rigidbody.GetValue("_currentVelocity"); + + if (isRunningKinematic) + { + var kinematicRigidbody = rigidbody.GetValue("_kinematicRigidbody"); + kinematicRigidbody.velocity = relativeVelocity + Locator.GetCenterOfTheUniverse().GetStaticFrameVelocity_Internal(); + } + else + { + var normalRigidbody = rigidbody.GetValue("_rigidbody"); + normalRigidbody.velocity = relativeVelocity + Locator.GetCenterOfTheUniverse().GetStaticFrameVelocity_Internal(); + } + + rigidbody.SetValue("_lastVelocity", currentVelocity); + rigidbody.SetValue("_currentVelocity", relativeVelocity); + } + public float GetVelocityChangeMagnitude() => (_relativeVelocity - _prevVelocity).magnitude;