major simplify BaseSectoredSync

This commit is contained in:
JohnCorby 2022-01-16 05:38:06 -08:00
parent 6d130b89eb
commit 5b8f51afdd
7 changed files with 41 additions and 244 deletions

View File

@ -17,36 +17,31 @@ namespace QSB.SectorSync
public bool IsReady { get; private set; }
public readonly List<QSBSector> FakeSectors = new();
public readonly List<BaseSectoredSync> SectoredSyncs = new();
public readonly List<BaseSectoredSync> TransformSyncs = new();
#region repeating timer
private const float TimeInterval = 0.4f;
private float _checkTimer = TimeInterval;
private const float UpdateInterval = 0.4f;
private float _timer = UpdateInterval;
private void Update()
{
_checkTimer += Time.unscaledDeltaTime;
if (_checkTimer < TimeInterval)
_timer += Time.unscaledDeltaTime;
if (_timer < UpdateInterval)
{
return;
}
Invoke();
_checkTimer = 0;
_timer = 0;
UpdateReferenceSectors();
}
#endregion
public void Invoke()
public void UpdateReferenceSectors()
{
if (!Instance.IsReady || !AllObjectsReady)
{
return;
}
foreach (var sync in SectoredSyncs)
foreach (var sync in TransformSyncs)
{
if (sync.AttachedTransform == null)
{
@ -55,10 +50,10 @@ namespace QSB.SectorSync
if (sync.hasAuthority
&& sync.AttachedTransform.gameObject.activeInHierarchy
&& sync.IsReady
&& sync.IsInitialized
&& sync.SectorSync.IsReady)
{
CheckTransformSyncSector(sync);
UpdateReferenceSector(sync);
}
}
}
@ -93,15 +88,10 @@ namespace QSB.SectorSync
IsReady = QSBWorldSync.GetWorldObjects<QSBSector>().Any();
}
private void CheckTransformSyncSector(BaseSectoredSync transformSync)
private static void UpdateReferenceSector(BaseSectoredSync transformSync)
{
var closestSector = transformSync.SectorSync.GetClosestSector();
if (closestSector == default(QSBSector))
{
return;
}
if (closestSector == transformSync.ReferenceSector)
if (closestSector == null)
{
return;
}

View File

@ -118,7 +118,7 @@ namespace QSB.SectorSync
if (goodSectors.Count == 0)
{
return default;
return null;
}
var closest = goodSectors

View File

@ -46,11 +46,6 @@ namespace QSB.ShipSync.TransformSync
protected override bool UpdateTransform()
{
if (!UpdateSectors())
{
return false;
}
// Dont do base... this is a replacement!
if (hasAuthority)

View File

@ -12,22 +12,20 @@ namespace QSB.Syncs.Sectored
public override bool AllowDisabledAttachedObject => false;
public override bool AllowNullReferenceTransform => true;
public QSBSector ReferenceSector { get; set; }
public QSBSector ReferenceSector { get; private set; }
public SectorSync.SectorSync SectorSync { get; private set; }
private int _sectorIdWaitingSlot = int.MinValue;
public override void Start()
{
SectorSync = gameObject.AddComponent<SectorSync.SectorSync>();
QSBSectorManager.Instance.SectoredSyncs.Add(this);
QSBSectorManager.Instance.TransformSyncs.Add(this);
base.Start();
}
protected override void OnDestroy()
{
base.OnDestroy();
QSBSectorManager.Instance.SectoredSyncs.Remove(this);
QSBSectorManager.Instance.TransformSyncs.Remove(this);
if (SectorSync != null)
{
Destroy(SectorSync);
@ -40,73 +38,15 @@ namespace QSB.Syncs.Sectored
SetReferenceSector(null);
}
protected override void Init()
{
base.Init();
if (!QSBSectorManager.Instance.IsReady)
{
return;
}
if (!hasAuthority)
{
return;
}
QSBCore.UnityEvents.RunWhen(() => SectorSync.IsReady, InitSector);
}
private void InitSector()
{
var closestSector = SectorSync.GetClosestSector();
if (closestSector != null)
{
SetReferenceSector(closestSector);
}
else
{
DebugLog.ToConsole($"Warning - {LogName}'s initial sector was null.", MessageType.Warning);
}
}
protected override void Update()
{
if (_sectorIdWaitingSlot == int.MinValue)
if (ReferenceSector != null && ReferenceSector.Transform != ReferenceTransform)
{
if (ReferenceSector != null && ReferenceSector.Transform != ReferenceTransform)
{
DebugLog.ToConsole($"Warning - {LogName} : ReferenceSector.Transform was different to ReferenceTransform. Correcting...", MessageType.Warning);
SetReferenceTransform(ReferenceSector.Transform);
}
base.Update();
return;
DebugLog.ToConsole($"Warning - {LogName} : ReferenceSector.Transform was different to ReferenceTransform. Correcting...", MessageType.Warning);
SetReferenceTransform(ReferenceSector.Transform);
}
if (!WorldObjectManager.AllObjectsReady)
{
base.Update();
return;
}
var sector = _sectorIdWaitingSlot == -1
? null
: _sectorIdWaitingSlot.GetWorldObject<QSBSector>();
if (sector != ReferenceSector)
{
if (sector == null)
{
DebugLog.ToConsole($"Error - {LogName} got sector of ID -1. (From waiting slot.)", MessageType.Error);
base.Update();
return;
}
SetReferenceSector(sector);
}
_sectorIdWaitingSlot = int.MinValue;
// todo all the check in base
base.Update();
}
@ -114,123 +54,38 @@ namespace QSB.Syncs.Sectored
{
base.Serialize(writer);
if (IsPlayerObject)
if (ReferenceSector == null)
{
if (Player == null)
{
// happens once right when you start hosting
writer.Write(-1);
return;
}
if (!Player.IsReady)
{
writer.Write(-1);
return;
}
}
if (ReferenceSector != null)
{
writer.Write(ReferenceSector.ObjectId);
}
else
{
if (IsInitialized)
{
DebugLog.ToConsole($"Warning - ReferenceSector of {LogName} is null.", MessageType.Warning);
}
DebugLog.ToConsole($"Warning - ReferenceSector of {LogName} is null.", MessageType.Warning);
writer.Write(-1);
return;
}
writer.Write(ReferenceSector.ObjectId);
}
protected override void Deserialize(NetworkReader reader)
{
base.Deserialize(reader);
int sectorId;
if (!WorldObjectManager.AllObjectsReady)
var sectorId = reader.ReadInt();
if (sectorId == -1)
{
sectorId = reader.ReadInt();
if (sectorId != -1)
{
_sectorIdWaitingSlot = sectorId;
}
DebugLog.ToConsole($"Error - {LogName} got sector of ID -1. (From deserializing transform.)", MessageType.Error);
return;
}
sectorId = reader.ReadInt();
var sector = sectorId == -1
? null
: sectorId.GetWorldObject<QSBSector>();
if (sector != ReferenceSector)
{
if (sector == null)
{
DebugLog.ToConsole($"Error - {LogName} got sector of ID -1. (From deserializing transform.)", MessageType.Error);
return;
}
SetReferenceSector(sector);
}
var sector = sectorId.GetWorldObject<QSBSector>();
SetReferenceSector(sector);
}
protected bool UpdateSectors()
{
var referenceNull = ReferenceTransform == null || ReferenceSector == null;
var sectorManagerReady = QSBSectorManager.Instance.IsReady;
if (!sectorManagerReady)
{
if (referenceNull && hasAuthority)
{
DebugLog.ToConsole($"Warning - Reference was null, but sector manager wasn't ready. " +
$"Transform:{ReferenceTransform == null}, Sector:{ReferenceSector == null}",
MessageType.Warning);
}
DebugLog.DebugWrite($"{LogName} : Sector Manager not ready.");
return false;
}
if (!hasAuthority)
{
return true;
}
if (referenceNull)
{
if (SectorSync.IsReady)
{
var closestSector = SectorSync.GetClosestSector();
if (closestSector != null)
{
SetReferenceSector(closestSector);
return true;
}
else
{
DebugLog.ToConsole($"Error - No closest sector found to {LogName}!", MessageType.Error);
return false;
}
}
else
{
return false;
}
}
return true;
}
protected override bool UpdateTransform()
=> UpdateSectors();
public void SetReferenceSector(QSBSector sector)
{
if (ReferenceSector == sector)
{
return;
}
ReferenceSector = sector;
SetReferenceTransform(sector?.Transform);
}

View File

@ -19,20 +19,7 @@ namespace QSB.Syncs.Sectored.Rigidbodies
protected Vector3 _prevVelocity;
protected Vector3 _prevAngularVelocity;
/// <summary>
/// The previous position of the VISIBLE object, as if parented to the reference.
/// </summary>
protected Vector3 _localPrevPosition;
/// <summary>
/// The previous rotation of the VISIBLE object, as if parented to the reference.
/// </summary>
protected Quaternion _localPrevRotation;
protected Vector3 _localPrevVelocity;
protected Vector3 _localPrevAngularVelocity;
public OWRigidbody AttachedRigidbody { get; set; }
public OWRigidbody AttachedRigidbody { get; private set; }
protected abstract OWRigidbody InitAttachedRigidbody();
@ -88,11 +75,6 @@ namespace QSB.Syncs.Sectored.Rigidbodies
protected override bool UpdateTransform()
{
if (!base.UpdateTransform())
{
return false;
}
if (hasAuthority)
{
SetValuesToSync();
@ -116,26 +98,6 @@ namespace QSB.Syncs.Sectored.Rigidbodies
rotationToSet = ReferenceTransform.FromRelRot(SmoothRotation);
}
var hasMoved = CustomHasMoved(
transform.position,
_localPrevPosition,
transform.rotation,
_localPrevRotation,
_relativeVelocity,
_localPrevVelocity,
_relativeAngularVelocity,
_localPrevAngularVelocity);
_localPrevPosition = transform.position;
_localPrevRotation = transform.rotation;
_localPrevVelocity = _relativeVelocity;
_localPrevAngularVelocity = _relativeAngularVelocity;
if (!hasMoved)
{
return true;
}
AttachedRigidbody.MoveToPosition(positionToSet);
AttachedRigidbody.MoveToRotation(rotationToSet);

View File

@ -28,11 +28,6 @@ namespace QSB.Syncs.Sectored.Transforms
protected override bool UpdateTransform()
{
if (!base.UpdateTransform())
{
return false;
}
if (hasAuthority)
{
if (ReferenceTransform != null)

View File

@ -53,8 +53,8 @@ namespace QSB.Syncs
public abstract bool DestroyAttachedObject { get; }
public abstract bool IsPlayerObject { get; }
public Transform AttachedTransform { get; set; }
public Transform ReferenceTransform { get; set; }
public Transform AttachedTransform { get; private set; }
public Transform ReferenceTransform { get; private set; }
public string LogName => (IsPlayerObject ? $"{Player.PlayerId}." : string.Empty) + $"{netId}:{GetType().Name}";
protected virtual float DistanceLeeway => 5f;
@ -64,7 +64,7 @@ namespace QSB.Syncs
protected const float SmoothTime = 0.1f;
private Vector3 _positionSmoothVelocity;
private Quaternion _rotationSmoothVelocity;
protected bool IsInitialized;
public bool IsInitialized { get; private set; }
protected Vector3 SmoothPosition;
protected Quaternion SmoothRotation;