mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-02-23 06:40:56 +00:00
fake sectors: treat like normal sectors in sector detector
This commit is contained in:
parent
542bb8f1ce
commit
e0a7bc3f23
@ -30,12 +30,12 @@ public class FakeSector : Sector
|
|||||||
|
|
||||||
go2.AddComponent<OWTriggerVolume>();
|
go2.AddComponent<OWTriggerVolume>();
|
||||||
go2.AddComponent<SphereShape>().radius = fakeSector.Radius;
|
go2.AddComponent<SphereShape>().radius = fakeSector.Radius;
|
||||||
go2.AddComponent<Renderer>().FakeSector = fakeSector;
|
go2.AddComponent<DebugRenderer>().FakeSector = fakeSector;
|
||||||
|
|
||||||
go2.SetActive(true);
|
go2.SetActive(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private class Renderer : MonoBehaviour
|
private class DebugRenderer : MonoBehaviour
|
||||||
{
|
{
|
||||||
[NonSerialized]
|
[NonSerialized]
|
||||||
public FakeSector FakeSector;
|
public FakeSector FakeSector;
|
||||||
|
@ -93,10 +93,11 @@ public class QSBSectorDetector : MonoBehaviour
|
|||||||
{
|
{
|
||||||
var type = _sectorDetector._occupantType;
|
var type = _sectorDetector._occupantType;
|
||||||
|
|
||||||
var validSectors = SectorList.Where(x => x.ShouldSyncTo(type)).ToList();
|
var validSectors = SectorList
|
||||||
var inASector = validSectors.Count > 0;
|
.Where(x => x.ShouldSyncTo(type))
|
||||||
|
.ToList();
|
||||||
|
|
||||||
if (!inASector)
|
if (validSectors.Count == 0)
|
||||||
{
|
{
|
||||||
validSectors = QSBWorldSync.GetWorldObjects<QSBSector>()
|
validSectors = QSBWorldSync.GetWorldObjects<QSBSector>()
|
||||||
.Where(x => x.ShouldSyncTo(type))
|
.Where(x => x.ShouldSyncTo(type))
|
||||||
@ -108,27 +109,7 @@ public class QSBSectorDetector : MonoBehaviour
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var closest = validSectors
|
return validSectors
|
||||||
.MinBy(sector => sector.CalculateScore(_sectorDetector._attachedRigidbody));
|
.MinBy(sector => sector.GetScore(_sectorDetector._attachedRigidbody));
|
||||||
|
|
||||||
if (inASector)
|
|
||||||
{
|
|
||||||
var pos = _sectorDetector._attachedRigidbody.GetPosition();
|
|
||||||
|
|
||||||
bool IsSameDistanceAsClosest(QSBSector fakeSector)
|
|
||||||
=> OWMath.ApproxEquals(
|
|
||||||
Vector3.Distance(fakeSector.Position, pos),
|
|
||||||
Vector3.Distance(closest.Position, pos),
|
|
||||||
0.01f);
|
|
||||||
|
|
||||||
bool IsParentValid(QSBSector fakeSector)
|
|
||||||
=> validSectors.Any(x => x.AttachedObject == fakeSector.FakeSector._parentSector);
|
|
||||||
|
|
||||||
var fakeToSyncTo = QSBSectorManager.Instance.FakeSectors
|
|
||||||
.FirstOrDefault(x => IsSameDistanceAsClosest(x) && IsParentValid(x));
|
|
||||||
return fakeToSyncTo ?? closest;
|
|
||||||
}
|
|
||||||
|
|
||||||
return closest;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,6 @@ public class QSBSectorManager : WorldObjectManager
|
|||||||
|
|
||||||
public static QSBSectorManager Instance { get; private set; }
|
public static QSBSectorManager Instance { get; private set; }
|
||||||
private bool _isReady;
|
private bool _isReady;
|
||||||
public readonly List<QSBSector> FakeSectors = new();
|
|
||||||
|
|
||||||
public readonly List<BaseSectoredSync> SectoredSyncs = new();
|
public readonly List<BaseSectoredSync> SectoredSyncs = new();
|
||||||
|
|
||||||
|
@ -1,17 +1,15 @@
|
|||||||
using Cysharp.Threading.Tasks;
|
using OWML.Common;
|
||||||
using OWML.Common;
|
|
||||||
using QSB.Utility;
|
using QSB.Utility;
|
||||||
using QSB.WorldSync;
|
using QSB.WorldSync;
|
||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
namespace QSB.SectorSync.WorldObjects;
|
namespace QSB.SectorSync.WorldObjects;
|
||||||
|
|
||||||
public class QSBSector : WorldObject<Sector>
|
public class QSBSector : WorldObject<Sector>
|
||||||
{
|
{
|
||||||
public Sector.Name Type => AttachedObject.GetName();
|
private Sector.Name Type => AttachedObject.GetName();
|
||||||
public Transform Transform
|
public Transform Transform
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@ -25,36 +23,11 @@ public class QSBSector : WorldObject<Sector>
|
|||||||
return AttachedObject.transform;
|
return AttachedObject.transform;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public Vector3 Position => Transform.position;
|
|
||||||
|
|
||||||
public bool IsFakeSector => AttachedObject is FakeSector;
|
|
||||||
public FakeSector FakeSector => (FakeSector)AttachedObject;
|
|
||||||
|
|
||||||
public override async UniTask Init(CancellationToken ct)
|
|
||||||
{
|
|
||||||
if (IsFakeSector)
|
|
||||||
{
|
|
||||||
QSBSectorManager.Instance.FakeSectors.Add(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnRemoval()
|
|
||||||
{
|
|
||||||
if (IsFakeSector)
|
|
||||||
{
|
|
||||||
QSBSectorManager.Instance.FakeSectors.Remove(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void SendInitialState(uint to) { }
|
public override void SendInitialState(uint to) { }
|
||||||
|
|
||||||
public bool ShouldSyncTo(DynamicOccupant occupantType)
|
public bool ShouldSyncTo(DynamicOccupant occupantType)
|
||||||
{
|
{
|
||||||
if (IsFakeSector)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (occupantType == DynamicOccupant.Ship && Type == Sector.Name.Ship)
|
if (occupantType == DynamicOccupant.Ship && Type == Sector.Name.Ship)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -106,20 +79,20 @@ public class QSBSector : WorldObject<Sector>
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public float CalculateScore(OWRigidbody rigidbody)
|
public float GetScore(OWRigidbody rigidbody)
|
||||||
{
|
{
|
||||||
var sqrDistance = (Position - rigidbody.GetPosition()).sqrMagnitude;
|
var sqrDistance = (Transform.position - rigidbody.GetPosition()).sqrMagnitude;
|
||||||
var radius = GetRadius();
|
var radius = GetRadius();
|
||||||
var velocity = GetRelativeVelocity(rigidbody);
|
var sqrVelocity = GetSqrVelocity(rigidbody);
|
||||||
|
|
||||||
return sqrDistance + radius * radius + velocity;
|
return sqrDistance + radius * radius + sqrVelocity;
|
||||||
}
|
}
|
||||||
|
|
||||||
private float GetRadius()
|
private float GetRadius()
|
||||||
{
|
{
|
||||||
if (IsFakeSector)
|
if (AttachedObject is FakeSector fakeSector)
|
||||||
{
|
{
|
||||||
return FakeSector.Radius;
|
return fakeSector.Radius;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO : make this work for other stuff, not just shaped triggervolumes
|
// TODO : make this work for other stuff, not just shaped triggervolumes
|
||||||
@ -132,7 +105,7 @@ public class QSBSector : WorldObject<Sector>
|
|||||||
return 0f;
|
return 0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
private float GetRelativeVelocity(OWRigidbody rigidbody)
|
private float GetSqrVelocity(OWRigidbody rigidbody)
|
||||||
{
|
{
|
||||||
var sectorRigidbody = AttachedObject.GetOWRigidbody();
|
var sectorRigidbody = AttachedObject.GetOWRigidbody();
|
||||||
if (sectorRigidbody && rigidbody)
|
if (sectorRigidbody && rigidbody)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user