mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-04-16 23:43:03 +00:00
revert sector sync, since there's a bug in dev
This commit is contained in:
parent
fbdd719846
commit
83e6d26f44
@ -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();
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,10 @@
|
|||||||
{
|
{
|
||||||
public enum TargetType
|
public enum TargetType
|
||||||
{
|
{
|
||||||
Player,
|
None = 0,
|
||||||
Probe,
|
Player = 1,
|
||||||
Ship
|
Probe = 2,
|
||||||
|
Ship = 3,
|
||||||
|
Other = 4
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
{
|
{
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user