From 83bec7b75fd5529bbaac4ff9b6ea2c83af64e1ec Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Tue, 15 Feb 2022 20:56:16 -0800 Subject: [PATCH 01/16] optimization: MinBy and MaxBy instead of sorting --- QSB/DeathSync/RespawnOnDeath.cs | 4 +- QSB/Player/QSBPlayerManager.cs | 12 ++--- QSB/SectorSync/QSBSectorDetector.cs | 2 +- QSB/Syncs/SyncBase.cs | 2 +- QSB/Utility/Extensions.cs | 68 +++++++++++++++++++++++++++-- 5 files changed, 76 insertions(+), 12 deletions(-) diff --git a/QSB/DeathSync/RespawnOnDeath.cs b/QSB/DeathSync/RespawnOnDeath.cs index 2ab95f24..68825b1e 100644 --- a/QSB/DeathSync/RespawnOnDeath.cs +++ b/QSB/DeathSync/RespawnOnDeath.cs @@ -68,8 +68,8 @@ namespace QSB.DeathSync else { var allAstroobjects = QSBWorldSync.GetUnityObjects().Where(x => x.GetAstroObjectName() != AstroObject.Name.None && x.GetAstroObjectType() != AstroObject.Type.Satellite); - var ordered = allAstroobjects.OrderBy(x => Vector3.SqrMagnitude(x.transform.position)); - DeathClosestAstroObject = ordered.First().transform; + var closest = allAstroobjects.MinBy(x => Vector3.SqrMagnitude(x.transform.position)); + DeathClosestAstroObject = closest.transform; } var deathPosition = Locator.GetPlayerTransform().position; diff --git a/QSB/Player/QSBPlayerManager.cs b/QSB/Player/QSBPlayerManager.cs index 5d618924..ff4fb66f 100644 --- a/QSB/Player/QSBPlayerManager.cs +++ b/QSB/Player/QSBPlayerManager.cs @@ -94,8 +94,8 @@ namespace QSB.Player => PlayerList.ForEach(x => x.SetVisible(false, 2)); public static PlayerInfo GetClosestPlayerToWorldPoint(Vector3 worldPoint, bool includeLocalPlayer) => includeLocalPlayer - ? GetClosestPlayerToWorldPoint(PlayerList, worldPoint) - : GetClosestPlayerToWorldPoint(PlayerList.Where(x => x != LocalPlayer).ToList(), worldPoint); + ? GetClosestPlayerToWorldPoint(PlayerList, worldPoint) + : GetClosestPlayerToWorldPoint(PlayerList.Where(x => x != LocalPlayer).ToList(), worldPoint); public static PlayerInfo GetClosestPlayerToWorldPoint(List playerList, Vector3 worldPoint) { @@ -105,16 +105,18 @@ namespace QSB.Player return null; } + playerList = playerList.Where(x => x.IsReady && x.Body != null).ToList(); + if (playerList.Count == 0) { - DebugLog.ToConsole($"Error - Cannot get closest player from empty player list.", MessageType.Error); + DebugLog.ToConsole($"Error - Cannot get closest player from empty (ready) player list.", MessageType.Error); return null; } - return playerList.Where(x => x.IsReady && x.Body != null).OrderBy(x => Vector3.Distance(x.Body.transform.position, worldPoint)).FirstOrDefault(); + return playerList.MinBy(x => Vector3.Distance(x.Body.transform.position, worldPoint)); } public static IEnumerable> GetPlayerCarryItems() => PlayerList.Select(x => new Tuple(x, x.HeldItem)); } -} \ No newline at end of file +} diff --git a/QSB/SectorSync/QSBSectorDetector.cs b/QSB/SectorSync/QSBSectorDetector.cs index 6c443397..a62788c6 100644 --- a/QSB/SectorSync/QSBSectorDetector.cs +++ b/QSB/SectorSync/QSBSectorDetector.cs @@ -120,7 +120,7 @@ namespace QSB.SectorSync } var closest = goodSectors - .OrderBy(sector => CalculateSectorScore(sector, _sectorDetector._attachedRigidbody)).First(); + .MinBy(sector => CalculateSectorScore(sector, _sectorDetector._attachedRigidbody)); if (inASector) { diff --git a/QSB/Syncs/SyncBase.cs b/QSB/Syncs/SyncBase.cs index b252dec3..17de797d 100644 --- a/QSB/Syncs/SyncBase.cs +++ b/QSB/Syncs/SyncBase.cs @@ -138,7 +138,7 @@ namespace QSB.Syncs // and use the closest one _player = QSBPlayerManager.PlayerList .Where(x => x.PlayerId <= netId) - .OrderBy(x => x.PlayerId).Last(); + .MaxBy(x => x.PlayerId); } DontDestroyOnLoad(gameObject); diff --git a/QSB/Utility/Extensions.cs b/QSB/Utility/Extensions.cs index 6d092da9..c1f0a06a 100644 --- a/QSB/Utility/Extensions.cs +++ b/QSB/Utility/Extensions.cs @@ -19,15 +19,17 @@ namespace QSB.Utility public static GameObject InstantiateInactive(this GameObject original) { + if (!original.activeSelf) + { + return Object.Instantiate(original); + } + original.SetActive(false); var copy = Object.Instantiate(original); original.SetActive(true); return copy; } - public static Transform InstantiateInactive(this Transform original) => - original.gameObject.InstantiateInactive().transform; - #endregion #region MIRROR @@ -94,6 +96,66 @@ namespace QSB.Utility } } + public static TSource MinBy(this IEnumerable source, Func keySelector) + { + var comparer = Comparer.Default; + var yk = default(TKey); + var y = default(TSource); + var hasValue = false; + foreach (var x in source) + { + var xk = keySelector(x); + if (!hasValue) + { + hasValue = true; + yk = xk; + y = x; + } + else if (comparer.Compare(xk, yk) < 0) + { + yk = xk; + y = x; + } + } + + if (!hasValue) + { + throw new InvalidOperationException("Sequence contains no elements"); + } + + return y; + } + + public static TSource MaxBy(this IEnumerable source, Func keySelector) + { + var comparer = Comparer.Default; + var yk = default(TKey); + var y = default(TSource); + var hasValue = false; + foreach (var x in source) + { + var xk = keySelector(x); + if (!hasValue) + { + hasValue = true; + yk = xk; + y = x; + } + else if (comparer.Compare(xk, yk) > 0) + { + yk = xk; + y = x; + } + } + + if (!hasValue) + { + throw new InvalidOperationException("Sequence contains no elements"); + } + + return y; + } + public static int IndexOf(this T[] array, T value) => Array.IndexOf(array, value); public static bool IsInRange(this IList list, int index) => index >= 0 && index < list.Count; From 6fb47ffd3568c13441511b12586bc115188f0202 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 16 Feb 2022 00:59:24 -0800 Subject: [PATCH 02/16] QSBWorldSync: check _cts == null after awaiting tasks, since that means it's been cancelled so we should stop stop working --- QSB/WorldSync/QSBWorldSync.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/QSB/WorldSync/QSBWorldSync.cs b/QSB/WorldSync/QSBWorldSync.cs index 3529e94b..a781b3d4 100644 --- a/QSB/WorldSync/QSBWorldSync.cs +++ b/QSB/WorldSync/QSBWorldSync.cs @@ -75,10 +75,20 @@ namespace QSB.WorldSync } await _managersBuilding.Values; + if (_cts == null) + { + return; + } + AllObjectsAdded = true; DebugLog.DebugWrite("World Objects added.", MessageType.Success); await _objectsIniting.Values; + if (_cts == null) + { + return; + } + AllObjectsReady = true; DebugLog.DebugWrite("World Objects ready.", MessageType.Success); From e119920db944472558d95f92e3bd12a0f6c35046 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 16 Feb 2022 01:22:13 -0800 Subject: [PATCH 03/16] cache ReferenceTransform.GetAttachedOWRigidbody() into ReferenceRigidbody --- .../TransformSync/JellyfishTransformSync.cs | 4 ++-- .../TransformSync/ShipTransformSync.cs | 4 ++-- .../Occasional/OccasionalTransformSync.cs | 4 ++-- .../Rigidbodies/SectoredRigidbodySync.cs | 20 +++++++++++++++---- QSB/Syncs/SyncBase.cs | 2 +- .../Rigidbodies/UnsectoredRigidbodySync.cs | 20 +++++++++++++++---- 6 files changed, 39 insertions(+), 15 deletions(-) diff --git a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs index 24f7ae3f..1d7e52e5 100644 --- a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs +++ b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs @@ -95,8 +95,8 @@ namespace QSB.JellyfishSync.TransformSync var pos = ReferenceTransform.FromRelPos(transform.position); AttachedRigidbody.SetPosition(pos); AttachedRigidbody.SetRotation(ReferenceTransform.FromRelRot(transform.rotation)); - AttachedRigidbody.SetVelocity(ReferenceTransform.GetAttachedOWRigidbody().FromRelVel(_relativeVelocity, pos)); - AttachedRigidbody.SetAngularVelocity(ReferenceTransform.GetAttachedOWRigidbody().FromRelAngVel(_relativeAngularVelocity)); + AttachedRigidbody.SetVelocity(ReferenceRigidbody.FromRelVel(_relativeVelocity, pos)); + AttachedRigidbody.SetAngularVelocity(ReferenceRigidbody.FromRelAngVel(_relativeAngularVelocity)); _qsbJellyfish.SetIsRising(_isRising); } diff --git a/QSB/ShipSync/TransformSync/ShipTransformSync.cs b/QSB/ShipSync/TransformSync/ShipTransformSync.cs index 28ec3222..05c55f1f 100644 --- a/QSB/ShipSync/TransformSync/ShipTransformSync.cs +++ b/QSB/ShipSync/TransformSync/ShipTransformSync.cs @@ -49,8 +49,8 @@ namespace QSB.ShipSync.TransformSync AttachedRigidbody.SetRotation(targetRot); } - var targetVelocity = ReferenceTransform.GetAttachedOWRigidbody().FromRelVel(_relativeVelocity, targetPos); - var targetAngularVelocity = ReferenceTransform.GetAttachedOWRigidbody().FromRelAngVel(_relativeAngularVelocity); + var targetVelocity = ReferenceRigidbody.FromRelVel(_relativeVelocity, targetPos); + var targetAngularVelocity = ReferenceRigidbody.FromRelAngVel(_relativeAngularVelocity); SetVelocity(AttachedRigidbody, targetVelocity); AttachedRigidbody.SetAngularVelocity(targetAngularVelocity); diff --git a/QSB/Syncs/Occasional/OccasionalTransformSync.cs b/QSB/Syncs/Occasional/OccasionalTransformSync.cs index c043fb60..cb355295 100644 --- a/QSB/Syncs/Occasional/OccasionalTransformSync.cs +++ b/QSB/Syncs/Occasional/OccasionalTransformSync.cs @@ -72,8 +72,8 @@ namespace QSB.Syncs.Occasional var pos = ReferenceTransform.FromRelPos(transform.position); AttachedRigidbody.SetPosition(pos); AttachedRigidbody.SetRotation(ReferenceTransform.FromRelRot(transform.rotation)); - AttachedRigidbody.SetVelocity(ReferenceTransform.GetAttachedOWRigidbody().FromRelVel(_relativeVelocity, pos)); - AttachedRigidbody.SetAngularVelocity(ReferenceTransform.GetAttachedOWRigidbody().FromRelAngVel(_relativeAngularVelocity)); + AttachedRigidbody.SetVelocity(ReferenceRigidbody.FromRelVel(_relativeVelocity, pos)); + AttachedRigidbody.SetAngularVelocity(ReferenceRigidbody.FromRelAngVel(_relativeAngularVelocity)); Move(); } diff --git a/QSB/Syncs/Sectored/Rigidbodies/SectoredRigidbodySync.cs b/QSB/Syncs/Sectored/Rigidbodies/SectoredRigidbodySync.cs index 02cf1698..1e1cb42a 100644 --- a/QSB/Syncs/Sectored/Rigidbodies/SectoredRigidbodySync.cs +++ b/QSB/Syncs/Sectored/Rigidbodies/SectoredRigidbodySync.cs @@ -17,6 +17,7 @@ namespace QSB.Syncs.Sectored.Rigidbodies private Vector3 _prevAngularVelocity; public OWRigidbody AttachedRigidbody { get; private set; } + public OWRigidbody ReferenceRigidbody { get; private set; } protected abstract OWRigidbody InitAttachedRigidbody(); @@ -26,6 +27,17 @@ namespace QSB.Syncs.Sectored.Rigidbodies return AttachedRigidbody ? AttachedRigidbody.transform : null; } + public override void SetReferenceTransform(Transform referenceTransform) + { + if (ReferenceTransform == referenceTransform) + { + return; + } + + base.SetReferenceTransform(referenceTransform); + ReferenceRigidbody = ReferenceTransform ? ReferenceTransform.GetAttachedOWRigidbody() : null; + } + protected override void UpdatePrevData() { base.UpdatePrevData(); @@ -57,8 +69,8 @@ namespace QSB.Syncs.Sectored.Rigidbodies transform.position = ReferenceTransform.ToRelPos(AttachedRigidbody.GetPosition()); transform.rotation = ReferenceTransform.ToRelRot(AttachedRigidbody.GetRotation()); - _relativeVelocity = ReferenceTransform.GetAttachedOWRigidbody().ToRelVel(AttachedRigidbody.GetVelocity(), AttachedRigidbody.GetPosition()); - _relativeAngularVelocity = ReferenceTransform.GetAttachedOWRigidbody().ToRelAngVel(AttachedRigidbody.GetAngularVelocity()); + _relativeVelocity = ReferenceRigidbody.ToRelVel(AttachedRigidbody.GetVelocity(), AttachedRigidbody.GetPosition()); + _relativeAngularVelocity = ReferenceRigidbody.ToRelAngVel(AttachedRigidbody.GetAngularVelocity()); } protected override void ApplyToAttached() @@ -84,8 +96,8 @@ namespace QSB.Syncs.Sectored.Rigidbodies AttachedRigidbody.MoveToPosition(positionToSet); AttachedRigidbody.MoveToRotation(rotationToSet); - var targetVelocity = ReferenceTransform.GetAttachedOWRigidbody().FromRelVel(_relativeVelocity, targetPos); - var targetAngularVelocity = ReferenceTransform.GetAttachedOWRigidbody().FromRelAngVel(_relativeAngularVelocity); + var targetVelocity = ReferenceRigidbody.FromRelVel(_relativeVelocity, targetPos); + var targetAngularVelocity = ReferenceRigidbody.FromRelAngVel(_relativeAngularVelocity); AttachedRigidbody.SetVelocity(targetVelocity); AttachedRigidbody.SetAngularVelocity(targetAngularVelocity); diff --git a/QSB/Syncs/SyncBase.cs b/QSB/Syncs/SyncBase.cs index 17de797d..50edd5b7 100644 --- a/QSB/Syncs/SyncBase.cs +++ b/QSB/Syncs/SyncBase.cs @@ -278,7 +278,7 @@ namespace QSB.Syncs return Vector3.SmoothDamp(currentPosition, targetPosition, ref _positionSmoothVelocity, SmoothTime); } - public void SetReferenceTransform(Transform referenceTransform) + public virtual void SetReferenceTransform(Transform referenceTransform) { if (ReferenceTransform == referenceTransform) { diff --git a/QSB/Syncs/Unsectored/Rigidbodies/UnsectoredRigidbodySync.cs b/QSB/Syncs/Unsectored/Rigidbodies/UnsectoredRigidbodySync.cs index f2720c7c..563f4057 100644 --- a/QSB/Syncs/Unsectored/Rigidbodies/UnsectoredRigidbodySync.cs +++ b/QSB/Syncs/Unsectored/Rigidbodies/UnsectoredRigidbodySync.cs @@ -17,6 +17,7 @@ namespace QSB.Syncs.Unsectored.Rigidbodies private Vector3 _prevAngularVelocity; protected OWRigidbody AttachedRigidbody { get; private set; } + public OWRigidbody ReferenceRigidbody { get; private set; } protected abstract OWRigidbody InitAttachedRigidbody(); @@ -26,6 +27,17 @@ namespace QSB.Syncs.Unsectored.Rigidbodies return AttachedRigidbody ? AttachedRigidbody.transform : null; } + public override void SetReferenceTransform(Transform referenceTransform) + { + if (ReferenceTransform == referenceTransform) + { + return; + } + + base.SetReferenceTransform(referenceTransform); + ReferenceRigidbody = ReferenceTransform ? ReferenceTransform.GetAttachedOWRigidbody() : null; + } + protected override void UpdatePrevData() { base.UpdatePrevData(); @@ -51,8 +63,8 @@ namespace QSB.Syncs.Unsectored.Rigidbodies { transform.position = ReferenceTransform.ToRelPos(AttachedRigidbody.GetPosition()); transform.rotation = ReferenceTransform.ToRelRot(AttachedRigidbody.GetRotation()); - _relativeVelocity = ReferenceTransform.GetAttachedOWRigidbody().ToRelVel(AttachedRigidbody.GetVelocity(), AttachedRigidbody.GetPosition()); - _relativeAngularVelocity = ReferenceTransform.GetAttachedOWRigidbody().ToRelAngVel(AttachedRigidbody.GetAngularVelocity()); + _relativeVelocity = ReferenceRigidbody.ToRelVel(AttachedRigidbody.GetVelocity(), AttachedRigidbody.GetPosition()); + _relativeAngularVelocity = ReferenceRigidbody.ToRelAngVel(AttachedRigidbody.GetAngularVelocity()); } protected override void ApplyToAttached() @@ -72,8 +84,8 @@ namespace QSB.Syncs.Unsectored.Rigidbodies AttachedRigidbody.MoveToPosition(positionToSet); AttachedRigidbody.MoveToRotation(rotationToSet); - var targetVelocity = ReferenceTransform.GetAttachedOWRigidbody().FromRelVel(_relativeVelocity, targetPos); - var targetAngularVelocity = ReferenceTransform.GetAttachedOWRigidbody().FromRelAngVel(_relativeAngularVelocity); + var targetVelocity = ReferenceRigidbody.FromRelVel(_relativeVelocity, targetPos); + var targetAngularVelocity = ReferenceRigidbody.FromRelAngVel(_relativeAngularVelocity); AttachedRigidbody.SetVelocity(targetVelocity); AttachedRigidbody.SetAngularVelocity(targetAngularVelocity); From 2761d463e1fce2d3caa982431827d4014655d963 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Tue, 15 Feb 2022 21:54:12 -0800 Subject: [PATCH 04/16] QSBSectorDetector: improve --- .../Local/LocalPlayerCreation.cs | 2 +- QSB/SectorSync/QSBSectorDetector.cs | 41 ++++++++++--------- QSB/SectorSync/TargetType.cs | 9 ---- QSB/SectorSync/WorldObjects/QSBSector.cs | 5 ++- .../TransformSync/ShipTransformSync.cs | 3 +- .../TransformSync/PlayerProbeSync.cs | 3 +- 6 files changed, 28 insertions(+), 35 deletions(-) delete mode 100644 QSB/SectorSync/TargetType.cs diff --git a/QSB/PlayerBodySetup/Local/LocalPlayerCreation.cs b/QSB/PlayerBodySetup/Local/LocalPlayerCreation.cs index 3fde2c98..3c083447 100644 --- a/QSB/PlayerBodySetup/Local/LocalPlayerCreation.cs +++ b/QSB/PlayerBodySetup/Local/LocalPlayerCreation.cs @@ -22,7 +22,7 @@ namespace QSB.PlayerBodySetup.Local { DebugLog.DebugWrite($"CREATE PLAYER"); - sectorDetector.Init(Locator.GetPlayerSectorDetector(), TargetType.Player); + sectorDetector.Init(Locator.GetPlayerSectorDetector()); // player body var playerBody = Locator.GetPlayerTransform(); diff --git a/QSB/SectorSync/QSBSectorDetector.cs b/QSB/SectorSync/QSBSectorDetector.cs index a62788c6..4b2944d3 100644 --- a/QSB/SectorSync/QSBSectorDetector.cs +++ b/QSB/SectorSync/QSBSectorDetector.cs @@ -13,9 +13,8 @@ namespace QSB.SectorSync public readonly List SectorList = new(); private SectorDetector _sectorDetector; - private TargetType _targetType; - public void Init(SectorDetector detector, TargetType type) + public void Init(SectorDetector detector) { if (_sectorDetector) { @@ -33,8 +32,6 @@ namespace QSB.SectorSync _sectorDetector.OnExitSector += RemoveSector; _sectorDetector._sectorList.ForEach(AddSector); - - _targetType = type; } public void Uninit() @@ -106,35 +103,41 @@ namespace QSB.SectorSync /// public QSBSector GetClosestSector() { - var inASector = SectorList.Any(x => x.ShouldSyncTo(_targetType)); + var type = _sectorDetector._occupantType; - var listToCheck = inASector - ? SectorList - : QSBWorldSync.GetWorldObjects().Where(x => !x.IsFakeSector && x.Type != Sector.Name.Unnamed); + var validSectors = SectorList.Where(x => x.ShouldSyncTo(type)).ToList(); + var inASector = validSectors.Count > 0; - var goodSectors = listToCheck.Where(sector => sector.ShouldSyncTo(_targetType)).ToList(); + if (!inASector) + { + validSectors = QSBWorldSync.GetWorldObjects() + .Where(x => !x.IsFakeSector && x.Type != Sector.Name.Unnamed && x.ShouldSyncTo(type)) + .ToList(); + } - if (goodSectors.Count == 0) + if (validSectors.Count == 0) { return null; } - var closest = goodSectors + var closest = validSectors .MinBy(sector => CalculateSectorScore(sector, _sectorDetector._attachedRigidbody)); if (inASector) { var pos = _sectorDetector._attachedRigidbody.GetPosition(); - bool IsApproxCloseToClosestSector(QSBSector sectorToCheck) - => OWMath.ApproxEquals(Vector3.Distance(sectorToCheck.Position, pos), - Vector3.Distance(closest.Position, pos), - 0.01f); + bool IsSameDistanceAsClosest(QSBSector fakeSector) + => OWMath.ApproxEquals( + Vector3.Distance(fakeSector.Position, pos), + Vector3.Distance(closest.Position, pos), + 0.01f); - bool IsFakeSectorActive(QSBSector fakeSectorToCheck) - => goodSectors.Any(x => fakeSectorToCheck.FakeSector.AttachedSector == x.AttachedObject); + bool IsAttachedValid(QSBSector fakeSector) + => validSectors.Any(x => x.AttachedObject == fakeSector.FakeSector.AttachedSector); - var fakeToSyncTo = QSBSectorManager.Instance.FakeSectors.FirstOrDefault(x => IsApproxCloseToClosestSector(x) && IsFakeSectorActive(x)); + var fakeToSyncTo = QSBSectorManager.Instance.FakeSectors + .FirstOrDefault(x => IsSameDistanceAsClosest(x) && IsAttachedValid(x)); return fakeToSyncTo ?? closest; } @@ -174,4 +177,4 @@ namespace QSB.SectorSync return 0; } } -} \ No newline at end of file +} diff --git a/QSB/SectorSync/TargetType.cs b/QSB/SectorSync/TargetType.cs deleted file mode 100644 index 7abef4ad..00000000 --- a/QSB/SectorSync/TargetType.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace QSB.SectorSync -{ - public enum TargetType - { - Player, - Probe, - Ship - } -} diff --git a/QSB/SectorSync/WorldObjects/QSBSector.cs b/QSB/SectorSync/WorldObjects/QSBSector.cs index da7a60bf..e6ac8a22 100644 --- a/QSB/SectorSync/WorldObjects/QSBSector.cs +++ b/QSB/SectorSync/WorldObjects/QSBSector.cs @@ -26,6 +26,7 @@ namespace QSB.SectorSync.WorldObjects } } public Vector3 Position => Transform.position; + public bool IsFakeSector => AttachedObject is FakeSector; public FakeSector FakeSector => (FakeSector)AttachedObject; @@ -47,7 +48,7 @@ namespace QSB.SectorSync.WorldObjects public override void SendInitialState(uint to) { } - public bool ShouldSyncTo(TargetType targetType) + public bool ShouldSyncTo(DynamicOccupant occupantType) { if (AttachedObject == null) { @@ -60,7 +61,7 @@ namespace QSB.SectorSync.WorldObjects return false; } - if (targetType == TargetType.Ship && Type == Sector.Name.Ship) + if (occupantType == DynamicOccupant.Ship && Type == Sector.Name.Ship) { return false; } diff --git a/QSB/ShipSync/TransformSync/ShipTransformSync.cs b/QSB/ShipSync/TransformSync/ShipTransformSync.cs index 05c55f1f..8f0676da 100644 --- a/QSB/ShipSync/TransformSync/ShipTransformSync.cs +++ b/QSB/ShipSync/TransformSync/ShipTransformSync.cs @@ -1,4 +1,3 @@ -using QSB.SectorSync; using QSB.Syncs.Sectored.Rigidbodies; using QSB.Utility; using UnityEngine; @@ -23,7 +22,7 @@ namespace QSB.ShipSync.TransformSync protected override OWRigidbody InitAttachedRigidbody() { - SectorDetector.Init(Locator.GetShipDetector().GetComponent(), TargetType.Ship); + SectorDetector.Init(Locator.GetShipDetector().GetComponent()); return Locator.GetShipBody(); } diff --git a/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs b/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs index 239ca4fb..a85acd3f 100644 --- a/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs +++ b/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs @@ -1,5 +1,4 @@ using OWML.Common; -using QSB.SectorSync; using QSB.Syncs.Sectored.Transforms; using QSB.Tools.ProbeLauncherTool; using QSB.Utility; @@ -26,7 +25,7 @@ namespace QSB.Tools.ProbeTool.TransformSync protected override Transform InitLocalTransform() { - SectorDetector.Init(Locator.GetProbe().GetSectorDetector(), TargetType.Probe); + SectorDetector.Init(Locator.GetProbe().GetSectorDetector()); var body = Locator.GetProbe().transform; Player.ProbeBody = body.gameObject; From 2f6b67845a8f025e27f25b0084c6e34c5ad79374 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Tue, 15 Feb 2022 22:39:49 -0800 Subject: [PATCH 05/16] QSBNetworkBehaviour: remove unneeded check --- QSB/Utility/QSBNetworkBehaviour.cs | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/QSB/Utility/QSBNetworkBehaviour.cs b/QSB/Utility/QSBNetworkBehaviour.cs index aa31f81e..72f17dee 100644 --- a/QSB/Utility/QSBNetworkBehaviour.cs +++ b/QSB/Utility/QSBNetworkBehaviour.cs @@ -22,11 +22,6 @@ namespace QSB.Utility return; } - if (!NetworkClient.ready) - { - return; - } - if (NetworkTime.localTime >= _lastSendTime + SendInterval) { _lastSendTime = NetworkTime.localTime; @@ -59,11 +54,6 @@ namespace QSB.Utility return; } - if (!NetworkClient.ready) - { - return; - } - _lastSendTime = NetworkTime.localTime; using var writer = NetworkWriterPool.GetWriter(); From 9e5e7bb6a1472fab22993ca9fdb1ba84693e4823 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 16 Feb 2022 02:30:01 -0800 Subject: [PATCH 06/16] initial state: - always send from the host - QSBNetworkBehaviour will store last known data in an array and send that, since real data will be wrong if no authority --- QSB/Anglerfish/WorldObjects/QSBAngler.cs | 9 ++--- QSB/CampfireSync/WorldObjects/QSBCampfire.cs | 9 ++--- .../WorldObjects/QSBRemoteDialogueTrigger.cs | 9 ++--- QSB/ElevatorSync/WorldObjects/QSBElevator.cs | 9 ++--- QSB/GeyserSync/WorldObjects/QSBGeyser.cs | 9 ++--- .../WorldObjects/QSBJellyfish.cs | 9 ++--- QSB/MeteorSync/WorldObjects/QSBFragment.cs | 9 ++--- QSB/OrbSync/WorldObjects/QSBOrb.cs | 9 ++--- .../WorldObjects/QSBQuantumObject.cs | 9 ++--- QSB/ShipSync/WorldObjects/QSBShipComponent.cs | 19 +++++------ QSB/ShipSync/WorldObjects/QSBShipHull.cs | 19 +++++------ .../WorldObjects/QSBProbeLauncher.cs | 15 ++++---- .../WorldObjects/QSBNomaiText.cs | 11 ++---- QSB/TornadoSync/WorldObjects/QSBTornado.cs | 9 ++--- QSB/TriggerSync/WorldObjects/QSBTrigger.cs | 9 ++--- QSB/Utility/QSBNetworkBehaviour.cs | 34 +++++++++++-------- QSB/WorldSync/IWorldObject.cs | 3 ++ QSB/WorldSync/RequestInitialStatesMessage.cs | 24 ++++++------- .../WorldObjects/QSBSatelliteNode.cs | 11 +++--- 19 files changed, 86 insertions(+), 149 deletions(-) diff --git a/QSB/Anglerfish/WorldObjects/QSBAngler.cs b/QSB/Anglerfish/WorldObjects/QSBAngler.cs index 2f2ae88f..1ce64a93 100644 --- a/QSB/Anglerfish/WorldObjects/QSBAngler.cs +++ b/QSB/Anglerfish/WorldObjects/QSBAngler.cs @@ -37,13 +37,8 @@ namespace QSB.Anglerfish.WorldObjects } } - public override void SendInitialState(uint to) - { - if (TransformSync.hasAuthority) - { - this.SendMessage(new AnglerDataMessage(this) { To = to }); - } - } + public override void SendInitialState(uint to) => + this.SendMessage(new AnglerDataMessage(this) { To = to }); public void UpdateTargetVelocity() { diff --git a/QSB/CampfireSync/WorldObjects/QSBCampfire.cs b/QSB/CampfireSync/WorldObjects/QSBCampfire.cs index 938cc7b4..5727c826 100644 --- a/QSB/CampfireSync/WorldObjects/QSBCampfire.cs +++ b/QSB/CampfireSync/WorldObjects/QSBCampfire.cs @@ -6,13 +6,8 @@ namespace QSB.CampfireSync.WorldObjects { public class QSBCampfire : WorldObject { - public override void SendInitialState(uint to) - { - if (QSBCore.IsHost) - { - this.SendMessage(new CampfireStateMessage(GetState()) { To = to }); - } - } + public override void SendInitialState(uint to) => + this.SendMessage(new CampfireStateMessage(GetState()) { To = to }); public void StartRoasting() => AttachedObject.StartRoasting(); diff --git a/QSB/ConversationSync/WorldObjects/QSBRemoteDialogueTrigger.cs b/QSB/ConversationSync/WorldObjects/QSBRemoteDialogueTrigger.cs index 1a6adf8a..8ffd79a5 100644 --- a/QSB/ConversationSync/WorldObjects/QSBRemoteDialogueTrigger.cs +++ b/QSB/ConversationSync/WorldObjects/QSBRemoteDialogueTrigger.cs @@ -6,13 +6,8 @@ namespace QSB.ConversationSync.WorldObjects { internal class QSBRemoteDialogueTrigger : WorldObject { - public override void SendInitialState(uint to) - { - if (QSBCore.IsHost) - { - this.SendMessage(new RemoteDialogueInitialStateMessage(AttachedObject) { To = to }); - } - } + public override void SendInitialState(uint to) => + this.SendMessage(new RemoteDialogueInitialStateMessage(AttachedObject) { To = to }); public void RemoteEnterDialogue(int dialogueIndex) { diff --git a/QSB/ElevatorSync/WorldObjects/QSBElevator.cs b/QSB/ElevatorSync/WorldObjects/QSBElevator.cs index eb643d10..3365f736 100644 --- a/QSB/ElevatorSync/WorldObjects/QSBElevator.cs +++ b/QSB/ElevatorSync/WorldObjects/QSBElevator.cs @@ -22,13 +22,8 @@ namespace QSB.ElevatorSync.WorldObjects _elevatorTrigger = AttachedObject.gameObject.GetAddComponent(); } - public override void SendInitialState(uint to) - { - if (QSBCore.IsHost) - { - this.SendMessage(new ElevatorMessage(AttachedObject._goingToTheEnd)); - } - } + public override void SendInitialState(uint to) => + this.SendMessage(new ElevatorMessage(AttachedObject._goingToTheEnd)); public void RemoteCall(bool isGoingUp) { diff --git a/QSB/GeyserSync/WorldObjects/QSBGeyser.cs b/QSB/GeyserSync/WorldObjects/QSBGeyser.cs index 68dea07f..fbf69116 100644 --- a/QSB/GeyserSync/WorldObjects/QSBGeyser.cs +++ b/QSB/GeyserSync/WorldObjects/QSBGeyser.cs @@ -26,13 +26,8 @@ namespace QSB.GeyserSync.WorldObjects } } - public override void SendInitialState(uint to) - { - if (QSBCore.IsHost) - { - this.SendMessage(new GeyserMessage(AttachedObject._isActive)); - } - } + public override void SendInitialState(uint to) => + this.SendMessage(new GeyserMessage(AttachedObject._isActive)); private void OnActivate() => this.SendMessage(new GeyserMessage(true)); private void OnDeactivate() => this.SendMessage(new GeyserMessage(false)); diff --git a/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs b/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs index 2f5c1b85..b6094d57 100644 --- a/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs +++ b/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs @@ -33,13 +33,8 @@ namespace QSB.JellyfishSync.WorldObjects } } - public override void SendInitialState(uint to) - { - if (TransformSync.hasAuthority) - { - this.SendMessage(new JellyfishRisingMessage(AttachedObject._isRising) { To = to }); - } - } + public override void SendInitialState(uint to) => + this.SendMessage(new JellyfishRisingMessage(AttachedObject._isRising) { To = to }); public void SetIsRising(bool value) { diff --git a/QSB/MeteorSync/WorldObjects/QSBFragment.cs b/QSB/MeteorSync/WorldObjects/QSBFragment.cs index 10cfd586..86177444 100644 --- a/QSB/MeteorSync/WorldObjects/QSBFragment.cs +++ b/QSB/MeteorSync/WorldObjects/QSBFragment.cs @@ -19,13 +19,8 @@ namespace QSB.MeteorSync.WorldObjects } } - public override void SendInitialState(uint to) - { - if (QSBCore.IsHost) - { - this.SendMessage(new FragmentInitialStateMessage(this) { To = to }); - } - } + public override void SendInitialState(uint to) => + this.SendMessage(new FragmentInitialStateMessage(this) { To = to }); public DetachableFragment DetachableFragment; public bool IsDetached => DetachableFragment != null && DetachableFragment._isDetached; diff --git a/QSB/OrbSync/WorldObjects/QSBOrb.cs b/QSB/OrbSync/WorldObjects/QSBOrb.cs index 8e5a3fa4..01026d6a 100644 --- a/QSB/OrbSync/WorldObjects/QSBOrb.cs +++ b/QSB/OrbSync/WorldObjects/QSBOrb.cs @@ -36,12 +36,9 @@ namespace QSB.OrbSync.WorldObjects public override void SendInitialState(uint to) { - if (TransformSync.hasAuthority) - { - this.SendMessage(new OrbDragMessage(AttachedObject._isBeingDragged) { To = to }); - var slotIndex = AttachedObject._slots.IndexOf(AttachedObject._occupiedSlot); - this.SendMessage(new OrbSlotMessage(slotIndex, false) { To = to }); - } + this.SendMessage(new OrbDragMessage(AttachedObject._isBeingDragged) { To = to }); + var slotIndex = AttachedObject._slots.IndexOf(AttachedObject._occupiedSlot); + this.SendMessage(new OrbSlotMessage(slotIndex, false) { To = to }); } public void SetDragging(bool value) diff --git a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs index ef4fab32..477d86a3 100644 --- a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs @@ -73,13 +73,8 @@ namespace QSB.QuantumSync.WorldObjects } } - public override void SendInitialState(uint to) - { - if (QSBCore.IsHost) - { - ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(ControllingPlayer) { To = to }); - } - } + public override void SendInitialState(uint to) => + ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(ControllingPlayer) { To = to }); public List GetAttachedShapes() { diff --git a/QSB/ShipSync/WorldObjects/QSBShipComponent.cs b/QSB/ShipSync/WorldObjects/QSBShipComponent.cs index a93b07d2..2e8f1d59 100644 --- a/QSB/ShipSync/WorldObjects/QSBShipComponent.cs +++ b/QSB/ShipSync/WorldObjects/QSBShipComponent.cs @@ -9,19 +9,16 @@ namespace QSB.ShipSync.WorldObjects { public override void SendInitialState(uint to) { - if (QSBCore.IsHost) + if (AttachedObject._damaged) { - if (AttachedObject._damaged) - { - this.SendMessage(new ComponentDamagedMessage()); - } - else - { - this.SendMessage(new ComponentRepairedMessage()); - } - - this.SendMessage(new ComponentRepairTickMessage(AttachedObject._repairFraction)); + this.SendMessage(new ComponentDamagedMessage()); } + else + { + this.SendMessage(new ComponentRepairedMessage()); + } + + this.SendMessage(new ComponentRepairTickMessage(AttachedObject._repairFraction)); } public void SetDamaged() diff --git a/QSB/ShipSync/WorldObjects/QSBShipHull.cs b/QSB/ShipSync/WorldObjects/QSBShipHull.cs index 5052e639..b51455d9 100644 --- a/QSB/ShipSync/WorldObjects/QSBShipHull.cs +++ b/QSB/ShipSync/WorldObjects/QSBShipHull.cs @@ -9,19 +9,16 @@ namespace QSB.ShipSync.WorldObjects { public override void SendInitialState(uint to) { - if (QSBCore.IsHost) + if (AttachedObject._damaged) { - if (AttachedObject._damaged) - { - this.SendMessage(new HullDamagedMessage()); - } - else - { - this.SendMessage(new HullRepairedMessage()); - } - - this.SendMessage(new HullChangeIntegrityMessage(AttachedObject._integrity)); + this.SendMessage(new HullDamagedMessage()); } + else + { + this.SendMessage(new HullRepairedMessage()); + } + + this.SendMessage(new HullChangeIntegrityMessage(AttachedObject._integrity)); } public void SetDamaged() diff --git a/QSB/Tools/ProbeLauncherTool/WorldObjects/QSBProbeLauncher.cs b/QSB/Tools/ProbeLauncherTool/WorldObjects/QSBProbeLauncher.cs index 79b5ab65..09b27466 100644 --- a/QSB/Tools/ProbeLauncherTool/WorldObjects/QSBProbeLauncher.cs +++ b/QSB/Tools/ProbeLauncherTool/WorldObjects/QSBProbeLauncher.cs @@ -16,16 +16,13 @@ namespace QSB.Tools.ProbeLauncherTool.WorldObjects public override void SendInitialState(uint to) { - if (QSBCore.IsHost) + if (AttachedObject._preLaunchProbeProxy.activeSelf) { - if (AttachedObject._preLaunchProbeProxy.activeSelf) - { - this.SendMessage(new RetrieveProbeMessage(false)); - } - else - { - this.SendMessage(new LaunchProbeMessage(false)); - } + this.SendMessage(new RetrieveProbeMessage(false)); + } + else + { + this.SendMessage(new LaunchProbeMessage(false)); } } diff --git a/QSB/Tools/TranslatorTool/TranslationSync/WorldObjects/QSBNomaiText.cs b/QSB/Tools/TranslatorTool/TranslationSync/WorldObjects/QSBNomaiText.cs index 5385e456..907d4cc4 100644 --- a/QSB/Tools/TranslatorTool/TranslationSync/WorldObjects/QSBNomaiText.cs +++ b/QSB/Tools/TranslatorTool/TranslationSync/WorldObjects/QSBNomaiText.cs @@ -10,14 +10,9 @@ namespace QSB.Tools.TranslatorTool.TranslationSync.WorldObjects { internal class QSBNomaiText : WorldObject { - public override void SendInitialState(uint to) - { - if (QSBCore.IsHost) - { - GetTranslatedIds().ForEach(id => - this.SendMessage(new SetAsTranslatedMessage(id) { To = to })); - } - } + public override void SendInitialState(uint to) => + GetTranslatedIds().ForEach(id => + this.SendMessage(new SetAsTranslatedMessage(id) { To = to })); public void SetAsTranslated(int id) => AttachedObject.SetAsTranslated(id); diff --git a/QSB/TornadoSync/WorldObjects/QSBTornado.cs b/QSB/TornadoSync/WorldObjects/QSBTornado.cs index 9cdcddaf..36cae8ef 100644 --- a/QSB/TornadoSync/WorldObjects/QSBTornado.cs +++ b/QSB/TornadoSync/WorldObjects/QSBTornado.cs @@ -6,13 +6,8 @@ namespace QSB.TornadoSync.WorldObjects { public class QSBTornado : WorldObject { - public override void SendInitialState(uint to) - { - if (QSBCore.IsHost) - { - this.SendMessage(new TornadoFormStateMessage(FormState) { To = to }); - } - } + public override void SendInitialState(uint to) => + this.SendMessage(new TornadoFormStateMessage(FormState) { To = to }); public bool FormState { diff --git a/QSB/TriggerSync/WorldObjects/QSBTrigger.cs b/QSB/TriggerSync/WorldObjects/QSBTrigger.cs index 9ad5dda4..754debb2 100644 --- a/QSB/TriggerSync/WorldObjects/QSBTrigger.cs +++ b/QSB/TriggerSync/WorldObjects/QSBTrigger.cs @@ -52,13 +52,8 @@ namespace QSB.TriggerSync.WorldObjects QSBPlayerManager.OnRemovePlayer -= OnPlayerLeave; } - public override void SendInitialState(uint to) - { - if (QSBCore.IsHost) - { - ((IQSBTrigger)this).SendMessage(new TriggerInitialStateMessage(Occupants) { To = to }); - } - } + public override void SendInitialState(uint to) => + ((IQSBTrigger)this).SendMessage(new TriggerInitialStateMessage(Occupants) { To = to }); protected void OnEnterEvent(GameObject hitObj) { diff --git a/QSB/Utility/QSBNetworkBehaviour.cs b/QSB/Utility/QSBNetworkBehaviour.cs index 72f17dee..15c76363 100644 --- a/QSB/Utility/QSBNetworkBehaviour.cs +++ b/QSB/Utility/QSBNetworkBehaviour.cs @@ -9,6 +9,7 @@ namespace QSB.Utility protected virtual bool UseReliableRpc => false; private double _lastSendTime; + private byte[] _lastKnownData; protected abstract bool HasChanged(); protected abstract void UpdatePrevData(); @@ -44,24 +45,24 @@ namespace QSB.Utility { CmdSendDataUnreliable(data); } + + if (QSBCore.IsHost) + { + _lastKnownData ??= new byte[data.Count]; + Array.Copy(data.Array!, data.Offset, _lastKnownData, 0, data.Count); + } } } - public void SendInitialState(uint to) + /// + /// called on the host to send the last known data to a new client + /// + public void SendInitialState(NetworkConnectionToClient target) { - if (!hasAuthority) + if (_lastKnownData != null) { - return; + TargetSendInitialData(target, new ArraySegment(_lastKnownData)); } - - _lastSendTime = NetworkTime.localTime; - - using var writer = NetworkWriterPool.GetWriter(); - Serialize(writer); - UpdatePrevData(); - - var data = writer.ToArraySegment(); - CmdSendInitialData(to, data); } [Command(channel = Channels.Reliable, requiresAuthority = true)] @@ -76,14 +77,17 @@ namespace QSB.Utility [ClientRpc(channel = Channels.Unreliable, includeOwner = false)] private void RpcSendDataUnreliable(ArraySegment data) => OnData(data); - [Command(channel = Channels.Reliable, requiresAuthority = true)] - private void CmdSendInitialData(uint to, ArraySegment data) => TargetSendInitialData(to.GetNetworkConnection(), data); - [TargetRpc(channel = Channels.Reliable)] private void TargetSendInitialData(NetworkConnection target, ArraySegment data) => OnData(data); private void OnData(ArraySegment data) { + if (QSBCore.IsHost) + { + _lastKnownData ??= new byte[data.Count]; + Array.Copy(data.Array!, data.Offset, _lastKnownData, 0, data.Count); + } + using var reader = NetworkReaderPool.GetReader(data); UpdatePrevData(); Deserialize(reader); diff --git a/QSB/WorldSync/IWorldObject.cs b/QSB/WorldSync/IWorldObject.cs index 3e89c0e5..88bf91fb 100644 --- a/QSB/WorldSync/IWorldObject.cs +++ b/QSB/WorldSync/IWorldObject.cs @@ -13,6 +13,9 @@ namespace QSB.WorldSync string ReturnLabel(); void DisplayLines(); + /// + /// called on the host to send over initial state messages + /// void SendInitialState(uint to); } } diff --git a/QSB/WorldSync/RequestInitialStatesMessage.cs b/QSB/WorldSync/RequestInitialStatesMessage.cs index 5cf00235..95c9ed43 100644 --- a/QSB/WorldSync/RequestInitialStatesMessage.cs +++ b/QSB/WorldSync/RequestInitialStatesMessage.cs @@ -6,10 +6,12 @@ using QSB.Utility; namespace QSB.WorldSync { /// - /// sent by non-host clients to get object states + /// sent to the host to get initial object states /// public class RequestInitialStatesMessage : QSBMessage { + public RequestInitialStatesMessage() => To = 0; + public override void OnReceiveRemote() => Delay.RunWhen(() => QSBWorldSync.AllObjectsReady, () => SendInitialStates(From)); @@ -18,24 +20,22 @@ namespace QSB.WorldSync { DebugLog.DebugWrite($"sending initial states to {to}"); - if (QSBCore.IsHost) - { - QSBWorldSync.DialogueConditions.ForEach(condition - => new DialogueConditionMessage(condition.Key, condition.Value) { To = to }.Send()); + QSBWorldSync.DialogueConditions.ForEach(condition + => new DialogueConditionMessage(condition.Key, condition.Value) { To = to }.Send()); - QSBWorldSync.ShipLogFacts.ForEach(fact - => new RevealFactMessage(fact.Id, fact.SaveGame, false) { To = to }.Send()); + QSBWorldSync.ShipLogFacts.ForEach(fact + => new RevealFactMessage(fact.Id, fact.SaveGame, false) { To = to }.Send()); + + var target = to.GetNetworkConnection(); + foreach (var qsbNetworkBehaviour in QSBWorldSync.GetUnityObjects()) + { + qsbNetworkBehaviour.SendInitialState(target); } foreach (var worldObject in QSBWorldSync.GetWorldObjects()) { worldObject.SendInitialState(to); } - - foreach (var qsbNetworkBehaviour in QSBWorldSync.GetUnityObjects()) - { - qsbNetworkBehaviour.SendInitialState(to); - } } } } diff --git a/QSB/ZeroGCaveSync/WorldObjects/QSBSatelliteNode.cs b/QSB/ZeroGCaveSync/WorldObjects/QSBSatelliteNode.cs index c28702ed..a81b9d86 100644 --- a/QSB/ZeroGCaveSync/WorldObjects/QSBSatelliteNode.cs +++ b/QSB/ZeroGCaveSync/WorldObjects/QSBSatelliteNode.cs @@ -9,15 +9,12 @@ namespace QSB.ZeroGCaveSync.WorldObjects { public override void SendInitialState(uint to) { - if (QSBCore.IsHost) + if (!AttachedObject._damaged) { - if (!AttachedObject._damaged) - { - this.SendMessage(new SatelliteNodeRepairedMessage()); - } - - this.SendMessage(new SatelliteNodeRepairTickMessage(AttachedObject._repairFraction)); + this.SendMessage(new SatelliteNodeRepairedMessage()); } + + this.SendMessage(new SatelliteNodeRepairTickMessage(AttachedObject._repairFraction)); } public void SetRepaired() From b3ed3ec7d938fbe0aa0747a74b3c6f445c21a6c4 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 16 Feb 2022 19:36:13 -0800 Subject: [PATCH 07/16] SyncBase: only base.Update after GetFromAttached --- QSB/Syncs/SyncBase.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/QSB/Syncs/SyncBase.cs b/QSB/Syncs/SyncBase.cs index 50edd5b7..6421a99c 100644 --- a/QSB/Syncs/SyncBase.cs +++ b/QSB/Syncs/SyncBase.cs @@ -219,7 +219,6 @@ namespace QSB.Syncs if (_pauseTimer > 0) { _pauseTimer = Mathf.Max(0, _pauseTimer - Time.unscaledDeltaTime); - base.Update(); return; } @@ -230,14 +229,12 @@ namespace QSB.Syncs else if (IsInitialized && !CheckReady()) { SafeUninit(); - base.Update(); return; } IsValid = CheckValid(); if (!IsValid) { - base.Update(); return; } @@ -255,14 +252,13 @@ namespace QSB.Syncs if (hasAuthority) { GetFromAttached(); + base.Update(); } else if (!OnlyApplyOnDeserialize || _shouldApply) { _shouldApply = false; ApplyToAttached(); } - - base.Update(); } private Vector3 SmartSmoothDamp(Vector3 currentPosition, Vector3 targetPosition) From 70d767c706a419daa48193488893d37d8d0fc306 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 16 Feb 2022 19:44:17 -0800 Subject: [PATCH 08/16] PlayerTransformSync: check for null ReferenceTransform --- QSB/Player/TransformSync/PlayerTransformSync.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/QSB/Player/TransformSync/PlayerTransformSync.cs b/QSB/Player/TransformSync/PlayerTransformSync.cs index 7c0b01f1..e4b97afb 100644 --- a/QSB/Player/TransformSync/PlayerTransformSync.cs +++ b/QSB/Player/TransformSync/PlayerTransformSync.cs @@ -89,6 +89,10 @@ namespace QSB.Player.TransformSync protected override void GetFromAttached() { base.GetFromAttached(); + if (!ReferenceTransform) + { + return; + } GetFromChild(_visibleStickPivot, _networkStickPivot); GetFromChild(_visibleStickTip, _networkStickTip); @@ -99,6 +103,10 @@ namespace QSB.Player.TransformSync protected override void ApplyToAttached() { base.ApplyToAttached(); + if (!ReferenceTransform) + { + return; + } ApplyToChild(_visibleStickPivot, _networkStickPivot, ref _pivotPositionVelocity, ref _pivotRotationVelocity); ApplyToChild(_visibleStickTip, _networkStickTip, ref _tipPositionVelocity, ref _tipRotationVelocity); From adb039d34e42e03a4c6ae622d4ae035dc63616c2 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 16 Feb 2022 19:57:31 -0800 Subject: [PATCH 09/16] SyncBase: also do smart smoothing for rotation --- QSB/Syncs/SyncBase.cs | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/QSB/Syncs/SyncBase.cs b/QSB/Syncs/SyncBase.cs index 6421a99c..ef013e26 100644 --- a/QSB/Syncs/SyncBase.cs +++ b/QSB/Syncs/SyncBase.cs @@ -119,7 +119,9 @@ namespace QSB.Syncs + $"{netId}:{GetType().Name} ({Name})"; protected virtual float DistanceLeeway => 5f; - private float _previousDistance; + protected virtual float AngleLeeway => 5f; + private float _prevDistance; + private float _prevAngle; protected const float SmoothTime = 0.1f; private Vector3 _positionSmoothVelocity; private Quaternion _rotationSmoothVelocity; @@ -243,12 +245,6 @@ namespace QSB.Syncs DebugLog.ToConsole($"Warning - {this}'s ReferenceTransform is at (0,0,0). ReferenceTransform:{ReferenceTransform.name}", MessageType.Warning); } - if (!hasAuthority && UseInterpolation) - { - SmoothPosition = SmartSmoothDamp(SmoothPosition, transform.position); - SmoothRotation = QuaternionHelper.SmoothDamp(SmoothRotation, transform.rotation, ref _rotationSmoothVelocity, SmoothTime); - } - if (hasAuthority) { GetFromAttached(); @@ -256,22 +252,25 @@ namespace QSB.Syncs } else if (!OnlyApplyOnDeserialize || _shouldApply) { + Interpolate(); _shouldApply = false; ApplyToAttached(); } } - private Vector3 SmartSmoothDamp(Vector3 currentPosition, Vector3 targetPosition) + private void Interpolate() { - var distance = Vector3.Distance(currentPosition, targetPosition); - if (Mathf.Abs(distance - _previousDistance) > DistanceLeeway) - { - _previousDistance = distance; - return targetPosition; - } + var distance = Vector3.Distance(SmoothPosition, transform.position); + SmoothPosition = Mathf.Abs(distance - _prevDistance) > DistanceLeeway ? + transform.position : + Vector3.SmoothDamp(SmoothPosition, transform.position, ref _positionSmoothVelocity, SmoothTime); + _prevDistance = distance; - _previousDistance = distance; - return Vector3.SmoothDamp(currentPosition, targetPosition, ref _positionSmoothVelocity, SmoothTime); + var angle = Quaternion.Angle(SmoothRotation, transform.rotation); + SmoothRotation = Mathf.Abs(angle - _prevAngle) > AngleLeeway ? + transform.rotation : + QuaternionHelper.SmoothDamp(SmoothRotation, transform.rotation, ref _rotationSmoothVelocity, SmoothTime); + _prevAngle = angle; } public virtual void SetReferenceTransform(Transform referenceTransform) From 2a7d4ad97f6d631d83a7f7d856ab8e573a49e3e7 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 16 Feb 2022 20:00:57 -0800 Subject: [PATCH 10/16] QuaternionHelper: format lol --- QSB/Utility/QuaternionHelper.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/QSB/Utility/QuaternionHelper.cs b/QSB/Utility/QuaternionHelper.cs index f3b4b046..f16e12d2 100644 --- a/QSB/Utility/QuaternionHelper.cs +++ b/QSB/Utility/QuaternionHelper.cs @@ -11,6 +11,7 @@ namespace QSB.Utility { return rot; } + // account for double-cover var dot = Quaternion.Dot(rot, target); var multi = dot > 0f ? 1f : -1f; @@ -36,4 +37,4 @@ namespace QSB.Utility return new Quaternion(result.x, result.y, result.z, result.w); } } -} \ No newline at end of file +} From d53735f1605d34fe86d576d5d2b7440cbb6ac687 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 16 Feb 2022 20:11:05 -0800 Subject: [PATCH 11/16] transform sync: be consistent with position/rotation change threshold --- .../TransformSync/JellyfishTransformSync.cs | 4 +- .../TransformSync/ShipTransformSync.cs | 4 +- .../Occasional/OccasionalTransformSync.cs | 4 +- QSB/Syncs/QSBNetworkTransform.cs | 11 ++-- QSB/Syncs/QSBNetworkTransformChild.cs | 11 ++-- .../Rigidbodies/SectoredRigidbodySync.cs | 56 ++++++------------ .../Rigidbodies/UnsectoredRigidbodySync.cs | 58 ++++++------------- 7 files changed, 55 insertions(+), 93 deletions(-) diff --git a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs index 1d7e52e5..fc009a6c 100644 --- a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs +++ b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs @@ -95,8 +95,8 @@ namespace QSB.JellyfishSync.TransformSync var pos = ReferenceTransform.FromRelPos(transform.position); AttachedRigidbody.SetPosition(pos); AttachedRigidbody.SetRotation(ReferenceTransform.FromRelRot(transform.rotation)); - AttachedRigidbody.SetVelocity(ReferenceRigidbody.FromRelVel(_relativeVelocity, pos)); - AttachedRigidbody.SetAngularVelocity(ReferenceRigidbody.FromRelAngVel(_relativeAngularVelocity)); + AttachedRigidbody.SetVelocity(ReferenceRigidbody.FromRelVel(Velocity, pos)); + AttachedRigidbody.SetAngularVelocity(ReferenceRigidbody.FromRelAngVel(AngularVelocity)); _qsbJellyfish.SetIsRising(_isRising); } diff --git a/QSB/ShipSync/TransformSync/ShipTransformSync.cs b/QSB/ShipSync/TransformSync/ShipTransformSync.cs index 8f0676da..d4dd1bc1 100644 --- a/QSB/ShipSync/TransformSync/ShipTransformSync.cs +++ b/QSB/ShipSync/TransformSync/ShipTransformSync.cs @@ -48,8 +48,8 @@ namespace QSB.ShipSync.TransformSync AttachedRigidbody.SetRotation(targetRot); } - var targetVelocity = ReferenceRigidbody.FromRelVel(_relativeVelocity, targetPos); - var targetAngularVelocity = ReferenceRigidbody.FromRelAngVel(_relativeAngularVelocity); + var targetVelocity = ReferenceRigidbody.FromRelVel(Velocity, targetPos); + var targetAngularVelocity = ReferenceRigidbody.FromRelAngVel(AngularVelocity); SetVelocity(AttachedRigidbody, targetVelocity); AttachedRigidbody.SetAngularVelocity(targetAngularVelocity); diff --git a/QSB/Syncs/Occasional/OccasionalTransformSync.cs b/QSB/Syncs/Occasional/OccasionalTransformSync.cs index cb355295..c90ba326 100644 --- a/QSB/Syncs/Occasional/OccasionalTransformSync.cs +++ b/QSB/Syncs/Occasional/OccasionalTransformSync.cs @@ -72,8 +72,8 @@ namespace QSB.Syncs.Occasional var pos = ReferenceTransform.FromRelPos(transform.position); AttachedRigidbody.SetPosition(pos); AttachedRigidbody.SetRotation(ReferenceTransform.FromRelRot(transform.rotation)); - AttachedRigidbody.SetVelocity(ReferenceRigidbody.FromRelVel(_relativeVelocity, pos)); - AttachedRigidbody.SetAngularVelocity(ReferenceRigidbody.FromRelAngVel(_relativeAngularVelocity)); + AttachedRigidbody.SetVelocity(ReferenceRigidbody.FromRelVel(Velocity, pos)); + AttachedRigidbody.SetAngularVelocity(ReferenceRigidbody.FromRelAngVel(AngularVelocity)); Move(); } diff --git a/QSB/Syncs/QSBNetworkTransform.cs b/QSB/Syncs/QSBNetworkTransform.cs index 240a423e..65165d5f 100644 --- a/QSB/Syncs/QSBNetworkTransform.cs +++ b/QSB/Syncs/QSBNetworkTransform.cs @@ -8,8 +8,11 @@ namespace QSB.Syncs { protected override float SendInterval => 0.05f; - protected Vector3 _prevPosition; - protected Quaternion _prevRotation; + private const float PositionChangeThreshold = 0.05f; + private const float RotationChangeThreshold = 0.05f; + + private Vector3 _prevPosition; + private Quaternion _prevRotation; protected override void UpdatePrevData() { @@ -18,8 +21,8 @@ namespace QSB.Syncs } protected override bool HasChanged() => - Vector3.Distance(transform.position, _prevPosition) > 1E-05f || - Quaternion.Angle(transform.rotation, _prevRotation) > 1E-05f; + Vector3.Distance(transform.position, _prevPosition) > PositionChangeThreshold || + Quaternion.Angle(transform.rotation, _prevRotation) > RotationChangeThreshold; protected override void Serialize(NetworkWriter writer) { diff --git a/QSB/Syncs/QSBNetworkTransformChild.cs b/QSB/Syncs/QSBNetworkTransformChild.cs index e137ad1d..bae71dae 100644 --- a/QSB/Syncs/QSBNetworkTransformChild.cs +++ b/QSB/Syncs/QSBNetworkTransformChild.cs @@ -10,8 +10,11 @@ namespace QSB.Syncs protected override float SendInterval => 0.05f; - protected Vector3 _prevPosition; - protected Quaternion _prevRotation; + private const float PositionChangeThreshold = 0.05f; + private const float RotationChangeThreshold = 0.05f; + + private Vector3 _prevPosition; + private Quaternion _prevRotation; protected override void UpdatePrevData() { @@ -20,8 +23,8 @@ namespace QSB.Syncs } protected override bool HasChanged() => - Vector3.Distance(Target.localPosition, _prevPosition) > 1E-05f || - Quaternion.Angle(Target.localRotation, _prevRotation) > 1E-05f; + Vector3.Distance(Target.localPosition, _prevPosition) > PositionChangeThreshold || + Quaternion.Angle(Target.localRotation, _prevRotation) > RotationChangeThreshold; protected override void Serialize(NetworkWriter writer) { diff --git a/QSB/Syncs/Sectored/Rigidbodies/SectoredRigidbodySync.cs b/QSB/Syncs/Sectored/Rigidbodies/SectoredRigidbodySync.cs index 1e1cb42a..c07fd72d 100644 --- a/QSB/Syncs/Sectored/Rigidbodies/SectoredRigidbodySync.cs +++ b/QSB/Syncs/Sectored/Rigidbodies/SectoredRigidbodySync.cs @@ -6,13 +6,11 @@ namespace QSB.Syncs.Sectored.Rigidbodies { public abstract class SectoredRigidbodySync : BaseSectoredSync { - private const float PositionMovedThreshold = 0.05f; - private const float AngleRotatedThreshold = 0.05f; private const float VelocityChangeThreshold = 0.05f; - private const float AngVelocityChangeThreshold = 0.05f; + private const float AngularVelocityChangeThreshold = 0.05f; - protected Vector3 _relativeVelocity; - protected Vector3 _relativeAngularVelocity; + protected Vector3 Velocity; + protected Vector3 AngularVelocity; private Vector3 _prevVelocity; private Vector3 _prevAngularVelocity; @@ -41,22 +39,22 @@ namespace QSB.Syncs.Sectored.Rigidbodies protected override void UpdatePrevData() { base.UpdatePrevData(); - _prevVelocity = _relativeVelocity; - _prevAngularVelocity = _relativeAngularVelocity; + _prevVelocity = Velocity; + _prevAngularVelocity = AngularVelocity; } protected override void Serialize(NetworkWriter writer) { base.Serialize(writer); - writer.Write(_relativeVelocity); - writer.Write(_relativeAngularVelocity); + writer.Write(Velocity); + writer.Write(AngularVelocity); } protected override void Deserialize(NetworkReader reader) { base.Deserialize(reader); - _relativeVelocity = reader.ReadVector3(); - _relativeAngularVelocity = reader.ReadVector3(); + Velocity = reader.ReadVector3(); + AngularVelocity = reader.ReadVector3(); } protected override void GetFromAttached() @@ -69,8 +67,8 @@ namespace QSB.Syncs.Sectored.Rigidbodies transform.position = ReferenceTransform.ToRelPos(AttachedRigidbody.GetPosition()); transform.rotation = ReferenceTransform.ToRelRot(AttachedRigidbody.GetRotation()); - _relativeVelocity = ReferenceRigidbody.ToRelVel(AttachedRigidbody.GetVelocity(), AttachedRigidbody.GetPosition()); - _relativeAngularVelocity = ReferenceRigidbody.ToRelAngVel(AttachedRigidbody.GetAngularVelocity()); + Velocity = ReferenceRigidbody.ToRelVel(AttachedRigidbody.GetVelocity(), AttachedRigidbody.GetPosition()); + AngularVelocity = ReferenceRigidbody.ToRelAngVel(AttachedRigidbody.GetAngularVelocity()); } protected override void ApplyToAttached() @@ -96,36 +94,16 @@ namespace QSB.Syncs.Sectored.Rigidbodies AttachedRigidbody.MoveToPosition(positionToSet); AttachedRigidbody.MoveToRotation(rotationToSet); - var targetVelocity = ReferenceRigidbody.FromRelVel(_relativeVelocity, targetPos); - var targetAngularVelocity = ReferenceRigidbody.FromRelAngVel(_relativeAngularVelocity); + var targetVelocity = ReferenceRigidbody.FromRelVel(Velocity, targetPos); + var targetAngularVelocity = ReferenceRigidbody.FromRelAngVel(AngularVelocity); AttachedRigidbody.SetVelocity(targetVelocity); AttachedRigidbody.SetAngularVelocity(targetAngularVelocity); } - protected override bool HasChanged() - { - if (Vector3.Distance(transform.position, _prevPosition) > PositionMovedThreshold) - { - return true; - } - - if (Quaternion.Angle(transform.rotation, _prevRotation) > AngleRotatedThreshold) - { - return true; - } - - if (Vector3.Distance(_relativeVelocity, _prevVelocity) > VelocityChangeThreshold) - { - return true; - } - - if (Vector3.Distance(_relativeAngularVelocity, _prevAngularVelocity) > AngVelocityChangeThreshold) - { - return true; - } - - return false; - } + protected override bool HasChanged() => + base.HasChanged() || + Vector3.Distance(Velocity, _prevVelocity) > VelocityChangeThreshold || + Vector3.Distance(AngularVelocity, _prevAngularVelocity) > AngularVelocityChangeThreshold; } } diff --git a/QSB/Syncs/Unsectored/Rigidbodies/UnsectoredRigidbodySync.cs b/QSB/Syncs/Unsectored/Rigidbodies/UnsectoredRigidbodySync.cs index 563f4057..266822e2 100644 --- a/QSB/Syncs/Unsectored/Rigidbodies/UnsectoredRigidbodySync.cs +++ b/QSB/Syncs/Unsectored/Rigidbodies/UnsectoredRigidbodySync.cs @@ -6,17 +6,15 @@ namespace QSB.Syncs.Unsectored.Rigidbodies { public abstract class UnsectoredRigidbodySync : BaseUnsectoredSync { - private const float PositionMovedThreshold = 0.05f; - private const float AngleRotatedThreshold = 0.05f; private const float VelocityChangeThreshold = 0.05f; - private const float AngVelocityChangeThreshold = 0.05f; + private const float AngularVelocityChangeThreshold = 0.05f; - protected Vector3 _relativeVelocity; - protected Vector3 _relativeAngularVelocity; + protected Vector3 Velocity; + protected Vector3 AngularVelocity; private Vector3 _prevVelocity; private Vector3 _prevAngularVelocity; - protected OWRigidbody AttachedRigidbody { get; private set; } + public OWRigidbody AttachedRigidbody { get; private set; } public OWRigidbody ReferenceRigidbody { get; private set; } protected abstract OWRigidbody InitAttachedRigidbody(); @@ -41,30 +39,30 @@ namespace QSB.Syncs.Unsectored.Rigidbodies protected override void UpdatePrevData() { base.UpdatePrevData(); - _prevVelocity = _relativeVelocity; - _prevAngularVelocity = _relativeAngularVelocity; + _prevVelocity = Velocity; + _prevAngularVelocity = AngularVelocity; } protected override void Serialize(NetworkWriter writer) { base.Serialize(writer); - writer.Write(_relativeVelocity); - writer.Write(_relativeAngularVelocity); + writer.Write(Velocity); + writer.Write(AngularVelocity); } protected override void Deserialize(NetworkReader reader) { base.Deserialize(reader); - _relativeVelocity = reader.ReadVector3(); - _relativeAngularVelocity = reader.ReadVector3(); + Velocity = reader.ReadVector3(); + AngularVelocity = reader.ReadVector3(); } protected override void GetFromAttached() { transform.position = ReferenceTransform.ToRelPos(AttachedRigidbody.GetPosition()); transform.rotation = ReferenceTransform.ToRelRot(AttachedRigidbody.GetRotation()); - _relativeVelocity = ReferenceRigidbody.ToRelVel(AttachedRigidbody.GetVelocity(), AttachedRigidbody.GetPosition()); - _relativeAngularVelocity = ReferenceRigidbody.ToRelAngVel(AttachedRigidbody.GetAngularVelocity()); + Velocity = ReferenceRigidbody.ToRelVel(AttachedRigidbody.GetVelocity(), AttachedRigidbody.GetPosition()); + AngularVelocity = ReferenceRigidbody.ToRelAngVel(AttachedRigidbody.GetAngularVelocity()); } protected override void ApplyToAttached() @@ -84,36 +82,16 @@ namespace QSB.Syncs.Unsectored.Rigidbodies AttachedRigidbody.MoveToPosition(positionToSet); AttachedRigidbody.MoveToRotation(rotationToSet); - var targetVelocity = ReferenceRigidbody.FromRelVel(_relativeVelocity, targetPos); - var targetAngularVelocity = ReferenceRigidbody.FromRelAngVel(_relativeAngularVelocity); + var targetVelocity = ReferenceRigidbody.FromRelVel(Velocity, targetPos); + var targetAngularVelocity = ReferenceRigidbody.FromRelAngVel(AngularVelocity); AttachedRigidbody.SetVelocity(targetVelocity); AttachedRigidbody.SetAngularVelocity(targetAngularVelocity); } - protected override bool HasChanged() - { - if (Vector3.Distance(transform.position, _prevPosition) > PositionMovedThreshold) - { - return true; - } - - if (Quaternion.Angle(transform.rotation, _prevRotation) > AngleRotatedThreshold) - { - return true; - } - - if (Vector3.Distance(_relativeVelocity, _prevVelocity) > VelocityChangeThreshold) - { - return true; - } - - if (Vector3.Distance(_relativeAngularVelocity, _prevAngularVelocity) > AngVelocityChangeThreshold) - { - return true; - } - - return false; - } + protected override bool HasChanged() => + base.HasChanged() || + Vector3.Distance(Velocity, _prevVelocity) > VelocityChangeThreshold || + Vector3.Distance(AngularVelocity, _prevAngularVelocity) > AngularVelocityChangeThreshold; } } From 43b4d2888bdf417209c60a5869172b3decea8015 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 16 Feb 2022 20:12:25 -0800 Subject: [PATCH 12/16] comment --- QSB/Syncs/Sectored/BaseSectoredSync.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/QSB/Syncs/Sectored/BaseSectoredSync.cs b/QSB/Syncs/Sectored/BaseSectoredSync.cs index fb582450..e0059acd 100644 --- a/QSB/Syncs/Sectored/BaseSectoredSync.cs +++ b/QSB/Syncs/Sectored/BaseSectoredSync.cs @@ -60,6 +60,9 @@ namespace QSB.Syncs.Sectored SetReferenceSector(_sectorId.GetWorldObject()); } + /// + /// use this instead of SetReferenceTransform + /// public void SetReferenceSector(QSBSector sector) { if (ReferenceSector == sector) From b23c5ac1aa49f07d82e30ac534375500f9a34fdb Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 16 Feb 2022 20:45:49 -0800 Subject: [PATCH 13/16] SyncBase: oops on interpolation, and dont return after SafeUninit --- QSB/Syncs/SyncBase.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/QSB/Syncs/SyncBase.cs b/QSB/Syncs/SyncBase.cs index ef013e26..1bd9b464 100644 --- a/QSB/Syncs/SyncBase.cs +++ b/QSB/Syncs/SyncBase.cs @@ -231,7 +231,6 @@ namespace QSB.Syncs else if (IsInitialized && !CheckReady()) { SafeUninit(); - return; } IsValid = CheckValid(); @@ -245,17 +244,22 @@ namespace QSB.Syncs DebugLog.ToConsole($"Warning - {this}'s ReferenceTransform is at (0,0,0). ReferenceTransform:{ReferenceTransform.name}", MessageType.Warning); } + if (!hasAuthority && UseInterpolation) + { + Interpolate(); + } + if (hasAuthority) { GetFromAttached(); - base.Update(); } else if (!OnlyApplyOnDeserialize || _shouldApply) { - Interpolate(); _shouldApply = false; ApplyToAttached(); } + + base.Update(); } private void Interpolate() From a32c0ce1669a89c892ac06a48b50eb8b67ecad82 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 16 Feb 2022 21:22:04 -0800 Subject: [PATCH 14/16] SyncBase: rename leeway variables --- QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs | 2 +- QSB/Syncs/SyncBase.cs | 12 ++++++------ QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs b/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs index d80e3fdb..a5d11fca 100644 --- a/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs +++ b/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs @@ -16,7 +16,7 @@ namespace QSB.OrbSync.TransformSync protected override bool CheckValid() => AttachedTransform && base.CheckValid(); protected override bool UseInterpolation => true; - protected override float DistanceLeeway => 1f; + protected override float DistanceChangeThreshold => 1f; protected override Transform InitLocalTransform() => _qsbOrb.AttachedObject.transform; protected override Transform InitRemoteTransform() => _qsbOrb.AttachedObject.transform; diff --git a/QSB/Syncs/SyncBase.cs b/QSB/Syncs/SyncBase.cs index 1bd9b464..2cb73c2b 100644 --- a/QSB/Syncs/SyncBase.cs +++ b/QSB/Syncs/SyncBase.cs @@ -118,10 +118,10 @@ namespace QSB.Syncs public override string ToString() => (IsPlayerObject ? $"{Player.PlayerId}." : string.Empty) + $"{netId}:{GetType().Name} ({Name})"; - protected virtual float DistanceLeeway => 5f; - protected virtual float AngleLeeway => 5f; - private float _prevDistance; - private float _prevAngle; + protected virtual float DistanceChangeThreshold => 5f; + private const float AngleChangeThreshold = 90f; + private float _prevDistance = float.MinValue; + private float _prevAngle = float.MinValue; protected const float SmoothTime = 0.1f; private Vector3 _positionSmoothVelocity; private Quaternion _rotationSmoothVelocity; @@ -265,13 +265,13 @@ namespace QSB.Syncs private void Interpolate() { var distance = Vector3.Distance(SmoothPosition, transform.position); - SmoothPosition = Mathf.Abs(distance - _prevDistance) > DistanceLeeway ? + SmoothPosition = Mathf.Abs(distance - _prevDistance) > DistanceChangeThreshold ? transform.position : Vector3.SmoothDamp(SmoothPosition, transform.position, ref _positionSmoothVelocity, SmoothTime); _prevDistance = distance; var angle = Quaternion.Angle(SmoothRotation, transform.rotation); - SmoothRotation = Mathf.Abs(angle - _prevAngle) > AngleLeeway ? + SmoothRotation = Mathf.Abs(angle - _prevAngle) > AngleChangeThreshold ? transform.rotation : QuaternionHelper.SmoothDamp(SmoothRotation, transform.rotation, ref _rotationSmoothVelocity, SmoothTime); _prevAngle = angle; diff --git a/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs b/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs index a85acd3f..f77123be 100644 --- a/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs +++ b/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs @@ -14,7 +14,7 @@ namespace QSB.Tools.ProbeTool.TransformSync /// protected override bool CheckValid() => AttachedTransform && base.CheckValid(); - protected override float DistanceLeeway => 10f; + protected override float DistanceChangeThreshold => 10f; protected override bool UseInterpolation => true; protected override bool AllowInactiveAttachedObject => true; protected override bool IsPlayerObject => true; From 7194140891611aaeea3b3510d015ee8e91f7a477 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 16 Feb 2022 21:46:16 -0800 Subject: [PATCH 15/16] use distance change threshold to change rotation as well --- QSB/Syncs/SyncBase.cs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/QSB/Syncs/SyncBase.cs b/QSB/Syncs/SyncBase.cs index 2cb73c2b..6a97c7e3 100644 --- a/QSB/Syncs/SyncBase.cs +++ b/QSB/Syncs/SyncBase.cs @@ -119,9 +119,7 @@ namespace QSB.Syncs + $"{netId}:{GetType().Name} ({Name})"; protected virtual float DistanceChangeThreshold => 5f; - private const float AngleChangeThreshold = 90f; - private float _prevDistance = float.MinValue; - private float _prevAngle = float.MinValue; + private float _prevDistance; protected const float SmoothTime = 0.1f; private Vector3 _positionSmoothVelocity; private Quaternion _rotationSmoothVelocity; @@ -265,16 +263,18 @@ namespace QSB.Syncs private void Interpolate() { var distance = Vector3.Distance(SmoothPosition, transform.position); - SmoothPosition = Mathf.Abs(distance - _prevDistance) > DistanceChangeThreshold ? - transform.position : - Vector3.SmoothDamp(SmoothPosition, transform.position, ref _positionSmoothVelocity, SmoothTime); - _prevDistance = distance; + if (Mathf.Abs(distance - _prevDistance) > DistanceChangeThreshold) + { + SmoothPosition = transform.position; + SmoothRotation = transform.rotation; + } + else + { + SmoothPosition = Vector3.SmoothDamp(SmoothPosition, transform.position, ref _positionSmoothVelocity, SmoothTime); + SmoothRotation = QuaternionHelper.SmoothDamp(SmoothRotation, transform.rotation, ref _rotationSmoothVelocity, SmoothTime); + } - var angle = Quaternion.Angle(SmoothRotation, transform.rotation); - SmoothRotation = Mathf.Abs(angle - _prevAngle) > AngleChangeThreshold ? - transform.rotation : - QuaternionHelper.SmoothDamp(SmoothRotation, transform.rotation, ref _rotationSmoothVelocity, SmoothTime); - _prevAngle = angle; + _prevDistance = distance; } public virtual void SetReferenceTransform(Transform referenceTransform) From c233fb546ba5177aea7dec5711578ff8e7ddf95b Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 16 Feb 2022 21:50:39 -0800 Subject: [PATCH 16/16] SetReferenceTransform: check for AttachedTransform notnull --- QSB/Syncs/SyncBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QSB/Syncs/SyncBase.cs b/QSB/Syncs/SyncBase.cs index 6a97c7e3..e198ef91 100644 --- a/QSB/Syncs/SyncBase.cs +++ b/QSB/Syncs/SyncBase.cs @@ -286,7 +286,7 @@ namespace QSB.Syncs ReferenceTransform = referenceTransform; - if (!hasAuthority && UseInterpolation) + if (!hasAuthority && UseInterpolation && AttachedTransform) { if (IsPlayerObject) {