revert sector sync, since there's a bug in dev

This commit is contained in:
JohnCorby 2021-12-17 21:32:53 -08:00
parent fbdd719846
commit 83e6d26f44
8 changed files with 82 additions and 48 deletions

View File

@ -99,7 +99,7 @@ namespace QSB.Player.TransformSync
protected override Transform InitLocalTransform() 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 // player body
var player = Locator.GetPlayerTransform(); var player = Locator.GetPlayerTransform();

View File

@ -76,7 +76,8 @@ namespace QSB.SectorSync
private void CheckTransformSyncSector(IBaseSectoredSync transformSync) 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)) if (closestSector == default(QSBSector))
{ {
return; return;

View File

@ -1,4 +1,5 @@
using OWML.Common; using OWML.Common;
using OWML.Utils;
using QSB.SectorSync.WorldObjects; using QSB.SectorSync.WorldObjects;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
@ -12,9 +13,9 @@ namespace QSB.SectorSync
public class SectorSync : MonoBehaviour public class SectorSync : MonoBehaviour
{ {
public bool IsReady { get; private set; } public bool IsReady { get; private set; }
public readonly List<QSBSector> SectorList = new(); public List<QSBSector> SectorList = new();
private OWRigidbody _body; private OWRigidbody _attachedOWRigidbody;
private SectorDetector _sectorDetector; private SectorDetector _sectorDetector;
private TargetType _targetType; private TargetType _targetType;
@ -29,7 +30,7 @@ namespace QSB.SectorSync
IsReady = false; IsReady = false;
} }
public void Init(SectorDetector detector, OWRigidbody body, TargetType type) public void Init(SectorDetector detector, TargetType type)
{ {
if (_sectorDetector != null) if (_sectorDetector != null)
{ {
@ -43,25 +44,44 @@ namespace QSB.SectorSync
return; return;
} }
_body = body;
_sectorDetector = detector; _sectorDetector = detector;
_sectorDetector.OnEnterSector += AddSector; _sectorDetector.OnEnterSector += AddSector;
_sectorDetector.OnExitSector += RemoveSector; _sectorDetector.OnExitSector += RemoveSector;
SectorList.Clear(); _attachedOWRigidbody = _sectorDetector.GetValue<OWRigidbody>("_attachedRigidbody");
_sectorDetector._sectorList.ForEach(AddSector); if (_attachedOWRigidbody == null)
{
DebugLog.ToConsole($"Warning - OWRigidbody for {_sectorDetector.name} is null!", MessageType.Warning);
}
PopulateSectorList();
_targetType = type; _targetType = type;
IsReady = true; IsReady = true;
} }
private void PopulateSectorList()
{
var currentList = _sectorDetector.GetValue<List<Sector>>("_sectorList");
SectorList.Clear();
foreach (var sector in currentList)
{
if (sector == null)
{
continue;
}
AddSector(sector);
}
}
private void AddSector(Sector sector) private void AddSector(Sector sector)
{ {
var worldObject = QSBWorldSync.GetWorldFromUnity<QSBSector>(sector); var worldObject = QSBWorldSync.GetWorldFromUnity<QSBSector>(sector);
if (worldObject == null) if (worldObject == null)
{ {
DebugLog.ToConsole($"Error - Can't find QSBSector for sector {sector.name}!", MessageType.Error); DebugLog.ToConsole($"Error - Can't find QSBSector for sector {sector.name}!", MessageType.Error);
return;
} }
if (SectorList.Contains(worldObject)) if (SectorList.Contains(worldObject))
@ -91,7 +111,7 @@ namespace QSB.SectorSync
SectorList.Remove(worldObject); SectorList.Remove(worldObject);
} }
public QSBSector GetClosestSector() public QSBSector GetClosestSector(Transform trans) // trans rights \o/
{ {
if (QSBSectorManager.Instance == null || !QSBSectorManager.Instance.IsReady) if (QSBSectorManager.Instance == null || !QSBSectorManager.Instance.IsReady)
{ {
@ -100,56 +120,68 @@ namespace QSB.SectorSync
if (!IsReady) 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; return null;
} }
if (_sectorDetector == null) if (_sectorDetector == null || _attachedOWRigidbody == null || _targetType == TargetType.None)
{ {
IsReady = false; IsReady = false;
return null; return null;
} }
var useSectorList = SectorList.Any(x => x.ShouldSyncTo(_targetType)); bool ShouldSyncTo(QSBSector sector, TargetType type)
var listToCheck = useSectorList {
? SectorList if (sector == null)
: QSBWorldSync.GetWorldObjects<QSBSector>().Where(x => !x.IsFakeSector && x.Type != Sector.Name.Unnamed); {
DebugLog.ToConsole($"Warning - Tried to check if we should sync to null sector!", MessageType.Warning);
return false;
}
var goodSectors = listToCheck return sector.ShouldSyncTo(type);
.Where(x => x.ShouldSyncTo(_targetType)) }
.ToList();
if (goodSectors.Count == 0) var numSectorsCurrentlyIn = SectorList.Count(x => ShouldSyncTo(x, _targetType));
var listToCheck = numSectorsCurrentlyIn == 0
? QSBWorldSync.GetWorldObjects<QSBSector>().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; return default;
} }
var closest = goodSectors var ordered = activeNotNullNotBlacklisted
.OrderBy(CalculateSectorScore).First(); .OrderBy(sector => CalculateSectorScore(sector, trans, _attachedOWRigidbody));
if (useSectorList) // TODO : clean up this shit???
{ if (
var pos = _body.GetPosition(); numSectorsCurrentlyIn != 0 &&
// if any fake sectors are *roughly* in the same place as other sectors - we want fake sectors to override other sectors // 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 => QSBSectorManager.Instance.FakeSectors.Any(
OWMath.ApproxEquals(Vector3.Distance(x.Position, pos), Vector3.Distance(closest.Position, pos), 0.01f) && x => OWMath.ApproxEquals(Vector3.Distance(x.Position, trans.position), Vector3.Distance(ordered.FirstOrDefault().Position, trans.position), 0.01f)
goodSectors.Any(y => x.FakeSector.AttachedSector == y.AttachedObject) && activeNotNullNotBlacklisted.Any(
); y => y.AttachedObject == (x.AttachedObject as FakeSector).AttachedSector)))
return fakeSector ?? closest;
}
return closest;
}
private float CalculateSectorScore(QSBSector sector)
{ {
var distance = Vector3.Distance(sector.Position, _body.GetPosition()); // want to be small return QSBSectorManager.Instance.FakeSectors.First(x => OWMath.ApproxEquals(Vector3.Distance(x.Position, trans.position), Vector3.Distance(ordered.FirstOrDefault().Position, trans.position), 0.01f));
}
return ordered.FirstOrDefault();
}
public static float CalculateSectorScore(QSBSector sector, Transform trans, OWRigidbody rigidbody)
{
var distance = Vector3.Distance(sector.Position, trans.position); // want to be small
var radius = GetRadius(sector); // 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); 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) if (sector == null)
{ {
@ -168,12 +200,12 @@ namespace QSB.SectorSync
return 0f; return 0f;
} }
private float GetRelativeVelocity(QSBSector sector) public static float GetRelativeVelocity(QSBSector sector, OWRigidbody rigidbody)
{ {
var sectorRigidBody = sector.AttachedObject.GetOWRigidbody(); 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! var relativeVelocityMagnitude = relativeVelocity.sqrMagnitude; // Remember this is squared for efficiency!
return relativeVelocityMagnitude; return relativeVelocityMagnitude;
} }

View File

@ -2,8 +2,10 @@
{ {
public enum TargetType public enum TargetType
{ {
Player, None = 0,
Probe, Player = 1,
Ship Probe = 2,
Ship = 3,
Other = 4
} }
} }

View File

@ -25,8 +25,7 @@ namespace QSB.SectorSync.WorldObjects
} }
} }
public Vector3 Position => Transform.position; public Vector3 Position => Transform.position;
public bool IsFakeSector => AttachedObject is FakeSector; public bool IsFakeSector => AttachedObject.GetType() == typeof(FakeSector);
public FakeSector FakeSector => (FakeSector)AttachedObject;
public override void Init() public override void Init()
{ {

View File

@ -26,7 +26,7 @@ namespace QSB.ShipSync.TransformSync
protected override OWRigidbody GetRigidbody() protected override OWRigidbody GetRigidbody()
{ {
QSBCore.UnityEvents.RunWhen(() => WorldObjectManager.AllObjectsReady, () => SectorSync.Init(Locator.GetShipDetector().GetComponent<SectorDetector>(), Locator.GetShipBody(), TargetType.Ship)); QSBCore.UnityEvents.RunWhen(() => WorldObjectManager.AllObjectsReady, () => SectorSync.Init(Locator.GetShipDetector().GetComponent<SectorDetector>(), TargetType.Ship));
return Locator.GetShipBody(); return Locator.GetShipBody();
} }

View File

@ -71,7 +71,7 @@ namespace QSB.Syncs.Sectored
private void InitSector() private void InitSector()
{ {
var closestSector = SectorSync.GetClosestSector(); var closestSector = SectorSync.GetClosestSector(AttachedObject.transform);
if (closestSector != null) if (closestSector != null)
{ {
SetReferenceSector(closestSector); SetReferenceSector(closestSector);
@ -212,7 +212,7 @@ namespace QSB.Syncs.Sectored
{ {
if (SectorSync.IsReady) if (SectorSync.IsReady)
{ {
var closestSector = SectorSync.GetClosestSector(); var closestSector = SectorSync.GetClosestSector(AttachedObject.transform);
if (closestSector != null) if (closestSector != null)
{ {
SetReferenceSector(closestSector); SetReferenceSector(closestSector);

View File

@ -23,7 +23,7 @@ namespace QSB.Tools.ProbeTool.TransformSync
protected override Transform InitLocalTransform() 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; var body = Locator.GetProbe().transform;
Player.ProbeBody = body.gameObject; Player.ProbeBody = body.gameObject;