diff --git a/QSB/Player/TransformSync/PlayerTransformSync.cs b/QSB/Player/TransformSync/PlayerTransformSync.cs index 6a580600..c0fbc3ba 100644 --- a/QSB/Player/TransformSync/PlayerTransformSync.cs +++ b/QSB/Player/TransformSync/PlayerTransformSync.cs @@ -99,7 +99,7 @@ namespace QSB.Player.TransformSync protected override Transform InitLocalTransform() { - QSBCore.UnityEvents.RunWhen(() => WorldObjectManager.AllObjectsReady, () => SectorSync.Init(Locator.GetPlayerSectorDetector(), Locator.GetPlayerBody(), TargetType.Player)); + QSBCore.UnityEvents.RunWhen(() => WorldObjectManager.AllObjectsReady, () => SectorSync.Init(Locator.GetPlayerSectorDetector(), TargetType.Player)); // player body var player = Locator.GetPlayerTransform(); diff --git a/QSB/SectorSync/QSBSectorManager.cs b/QSB/SectorSync/QSBSectorManager.cs index 1253838a..9083bd7c 100644 --- a/QSB/SectorSync/QSBSectorManager.cs +++ b/QSB/SectorSync/QSBSectorManager.cs @@ -76,7 +76,8 @@ namespace QSB.SectorSync private void CheckTransformSyncSector(IBaseSectoredSync transformSync) { - var closestSector = transformSync.SectorSync.GetClosestSector(); + var attachedObject = transformSync.ReturnObject(); + var closestSector = transformSync.SectorSync.GetClosestSector(attachedObject.transform); if (closestSector == default(QSBSector)) { return; diff --git a/QSB/SectorSync/SectorSync.cs b/QSB/SectorSync/SectorSync.cs index 43b4c314..09ca9ec9 100644 --- a/QSB/SectorSync/SectorSync.cs +++ b/QSB/SectorSync/SectorSync.cs @@ -1,4 +1,5 @@ using OWML.Common; +using OWML.Utils; using QSB.SectorSync.WorldObjects; using QSB.Utility; using QSB.WorldSync; @@ -12,9 +13,9 @@ namespace QSB.SectorSync public class SectorSync : MonoBehaviour { public bool IsReady { get; private set; } - public readonly List SectorList = new(); + public List SectorList = new(); - private OWRigidbody _body; + private OWRigidbody _attachedOWRigidbody; private SectorDetector _sectorDetector; private TargetType _targetType; @@ -29,7 +30,7 @@ namespace QSB.SectorSync IsReady = false; } - public void Init(SectorDetector detector, OWRigidbody body, TargetType type) + public void Init(SectorDetector detector, TargetType type) { if (_sectorDetector != null) { @@ -43,25 +44,44 @@ namespace QSB.SectorSync return; } - _body = body; _sectorDetector = detector; _sectorDetector.OnEnterSector += AddSector; _sectorDetector.OnExitSector += RemoveSector; - SectorList.Clear(); - _sectorDetector._sectorList.ForEach(AddSector); + _attachedOWRigidbody = _sectorDetector.GetValue("_attachedRigidbody"); + if (_attachedOWRigidbody == null) + { + DebugLog.ToConsole($"Warning - OWRigidbody for {_sectorDetector.name} is null!", MessageType.Warning); + } + + PopulateSectorList(); _targetType = type; IsReady = true; } + private void PopulateSectorList() + { + var currentList = _sectorDetector.GetValue>("_sectorList"); + + SectorList.Clear(); + foreach (var sector in currentList) + { + if (sector == null) + { + continue; + } + + AddSector(sector); + } + } + private void AddSector(Sector sector) { var worldObject = QSBWorldSync.GetWorldFromUnity(sector); if (worldObject == null) { DebugLog.ToConsole($"Error - Can't find QSBSector for sector {sector.name}!", MessageType.Error); - return; } if (SectorList.Contains(worldObject)) @@ -91,7 +111,7 @@ namespace QSB.SectorSync SectorList.Remove(worldObject); } - public QSBSector GetClosestSector() + public QSBSector GetClosestSector(Transform trans) // trans rights \o/ { if (QSBSectorManager.Instance == null || !QSBSectorManager.Instance.IsReady) { @@ -100,56 +120,68 @@ namespace QSB.SectorSync if (!IsReady) { - DebugLog.ToConsole($"Warning - Tried to use GetClosestSector() before this SectorSync is ready. Stacktrace:\r\n{Environment.StackTrace}", MessageType.Warning); + DebugLog.ToConsole($"Warning - Tried to use GetClosestSector() before this SectorSync is ready. Transform:{trans.name} Stacktrace:\r\n{Environment.StackTrace}", MessageType.Warning); return null; } - if (_sectorDetector == null) + if (_sectorDetector == null || _attachedOWRigidbody == null || _targetType == TargetType.None) { IsReady = false; return null; } - var useSectorList = SectorList.Any(x => x.ShouldSyncTo(_targetType)); - var listToCheck = useSectorList - ? SectorList - : QSBWorldSync.GetWorldObjects().Where(x => !x.IsFakeSector && x.Type != Sector.Name.Unnamed); + bool ShouldSyncTo(QSBSector sector, TargetType type) + { + if (sector == null) + { + DebugLog.ToConsole($"Warning - Tried to check if we should sync to null sector!", MessageType.Warning); + return false; + } - var goodSectors = listToCheck - .Where(x => x.ShouldSyncTo(_targetType)) - .ToList(); - if (goodSectors.Count == 0) + return sector.ShouldSyncTo(type); + } + + var numSectorsCurrentlyIn = SectorList.Count(x => ShouldSyncTo(x, _targetType)); + + var listToCheck = numSectorsCurrentlyIn == 0 + ? QSBWorldSync.GetWorldObjects().Where(x => !x.IsFakeSector && x.Type != Sector.Name.Unnamed) + : SectorList; + + var activeNotNullNotBlacklisted = listToCheck.Where(sector => sector.AttachedObject != null + && sector.ShouldSyncTo(_targetType)); + if (activeNotNullNotBlacklisted.Count() == 0) { return default; } - var closest = goodSectors - .OrderBy(CalculateSectorScore).First(); + var ordered = activeNotNullNotBlacklisted + .OrderBy(sector => CalculateSectorScore(sector, trans, _attachedOWRigidbody)); - if (useSectorList) - { - var pos = _body.GetPosition(); + // TODO : clean up this shit??? + if ( + numSectorsCurrentlyIn != 0 && // if any fake sectors are *roughly* in the same place as other sectors - we want fake sectors to override other sectors - var fakeSector = QSBSectorManager.Instance.FakeSectors.FirstOrDefault(x => - OWMath.ApproxEquals(Vector3.Distance(x.Position, pos), Vector3.Distance(closest.Position, pos), 0.01f) && - goodSectors.Any(y => x.FakeSector.AttachedSector == y.AttachedObject) - ); - return fakeSector ?? closest; + QSBSectorManager.Instance.FakeSectors.Any( + x => OWMath.ApproxEquals(Vector3.Distance(x.Position, trans.position), Vector3.Distance(ordered.FirstOrDefault().Position, trans.position), 0.01f) + && activeNotNullNotBlacklisted.Any( + y => y.AttachedObject == (x.AttachedObject as FakeSector).AttachedSector))) + { + return QSBSectorManager.Instance.FakeSectors.First(x => OWMath.ApproxEquals(Vector3.Distance(x.Position, trans.position), Vector3.Distance(ordered.FirstOrDefault().Position, trans.position), 0.01f)); } - return closest; + return ordered.FirstOrDefault(); } - private float CalculateSectorScore(QSBSector sector) + public static float CalculateSectorScore(QSBSector sector, Transform trans, OWRigidbody rigidbody) { - var distance = Vector3.Distance(sector.Position, _body.GetPosition()); // want to be small + var distance = Vector3.Distance(sector.Position, trans.position); // want to be small var radius = GetRadius(sector); // want to be small - var velocity = GetRelativeVelocity(sector); // want to be small + var velocity = GetRelativeVelocity(sector, rigidbody); // want to be small return Mathf.Pow(distance, 2) + Mathf.Pow(radius, 2) + Mathf.Pow(velocity, 2); } - private static float GetRadius(QSBSector sector) + public static float GetRadius(QSBSector sector) { if (sector == null) { @@ -168,12 +200,12 @@ namespace QSB.SectorSync return 0f; } - private float GetRelativeVelocity(QSBSector sector) + public static float GetRelativeVelocity(QSBSector sector, OWRigidbody rigidbody) { var sectorRigidBody = sector.AttachedObject.GetOWRigidbody(); - if (sectorRigidBody != null && _body != null) + if (sectorRigidBody != null && rigidbody != null) { - var relativeVelocity = sectorRigidBody.GetRelativeVelocity(_body); + var relativeVelocity = sectorRigidBody.GetRelativeVelocity(rigidbody); var relativeVelocityMagnitude = relativeVelocity.sqrMagnitude; // Remember this is squared for efficiency! return relativeVelocityMagnitude; } @@ -181,4 +213,4 @@ namespace QSB.SectorSync return 0; } } -} +} \ No newline at end of file diff --git a/QSB/SectorSync/TargetType.cs b/QSB/SectorSync/TargetType.cs index 7abef4ad..b463a2eb 100644 --- a/QSB/SectorSync/TargetType.cs +++ b/QSB/SectorSync/TargetType.cs @@ -2,8 +2,10 @@ { public enum TargetType { - Player, - Probe, - Ship + None = 0, + Player = 1, + Probe = 2, + Ship = 3, + Other = 4 } } diff --git a/QSB/SectorSync/WorldObjects/QSBSector.cs b/QSB/SectorSync/WorldObjects/QSBSector.cs index f18884cb..cbb2aabc 100644 --- a/QSB/SectorSync/WorldObjects/QSBSector.cs +++ b/QSB/SectorSync/WorldObjects/QSBSector.cs @@ -25,8 +25,7 @@ namespace QSB.SectorSync.WorldObjects } } public Vector3 Position => Transform.position; - public bool IsFakeSector => AttachedObject is FakeSector; - public FakeSector FakeSector => (FakeSector)AttachedObject; + public bool IsFakeSector => AttachedObject.GetType() == typeof(FakeSector); public override void Init() { diff --git a/QSB/ShipSync/TransformSync/ShipTransformSync.cs b/QSB/ShipSync/TransformSync/ShipTransformSync.cs index 1ba4fc56..e0777495 100644 --- a/QSB/ShipSync/TransformSync/ShipTransformSync.cs +++ b/QSB/ShipSync/TransformSync/ShipTransformSync.cs @@ -26,7 +26,7 @@ namespace QSB.ShipSync.TransformSync protected override OWRigidbody GetRigidbody() { - QSBCore.UnityEvents.RunWhen(() => WorldObjectManager.AllObjectsReady, () => SectorSync.Init(Locator.GetShipDetector().GetComponent(), Locator.GetShipBody(), TargetType.Ship)); + QSBCore.UnityEvents.RunWhen(() => WorldObjectManager.AllObjectsReady, () => SectorSync.Init(Locator.GetShipDetector().GetComponent(), TargetType.Ship)); return Locator.GetShipBody(); } diff --git a/QSB/Syncs/Sectored/BaseSectoredSync.cs b/QSB/Syncs/Sectored/BaseSectoredSync.cs index 67ddfc3e..c2e740cc 100644 --- a/QSB/Syncs/Sectored/BaseSectoredSync.cs +++ b/QSB/Syncs/Sectored/BaseSectoredSync.cs @@ -71,7 +71,7 @@ namespace QSB.Syncs.Sectored private void InitSector() { - var closestSector = SectorSync.GetClosestSector(); + var closestSector = SectorSync.GetClosestSector(AttachedObject.transform); if (closestSector != null) { SetReferenceSector(closestSector); @@ -212,7 +212,7 @@ namespace QSB.Syncs.Sectored { if (SectorSync.IsReady) { - var closestSector = SectorSync.GetClosestSector(); + var closestSector = SectorSync.GetClosestSector(AttachedObject.transform); if (closestSector != null) { SetReferenceSector(closestSector); diff --git a/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs b/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs index 1a29567e..fc880244 100644 --- a/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs +++ b/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs @@ -23,7 +23,7 @@ namespace QSB.Tools.ProbeTool.TransformSync protected override Transform InitLocalTransform() { - QSBCore.UnityEvents.RunWhen(() => WorldObjectManager.AllObjectsReady, () => SectorSync.Init(Locator.GetProbe().GetSectorDetector(), Locator.GetProbe().GetOWRigidbody(), TargetType.Probe)); + QSBCore.UnityEvents.RunWhen(() => WorldObjectManager.AllObjectsReady, () => SectorSync.Init(Locator.GetProbe().GetSectorDetector(), TargetType.Probe)); var body = Locator.GetProbe().transform; Player.ProbeBody = body.gameObject;