2021-05-15 11:25:47 +01:00
|
|
|
|
using QSB.SectorSync;
|
|
|
|
|
using QSB.SectorSync.WorldObjects;
|
2021-07-07 22:12:41 +01:00
|
|
|
|
using QSB.Utility;
|
2021-05-15 11:25:47 +01:00
|
|
|
|
using QSB.WorldSync;
|
|
|
|
|
using QuantumUNET.Transport;
|
|
|
|
|
|
|
|
|
|
namespace QSB.Syncs.RigidbodySync
|
|
|
|
|
{
|
|
|
|
|
public abstract class SectoredRigidbodySync : UnparentedBaseRigidbodySync, ISectoredSync<OWRigidbody>
|
|
|
|
|
{
|
|
|
|
|
public QSBSector ReferenceSector { get; set; }
|
|
|
|
|
public SectorSync.SectorSync SectorSync { get; private set; }
|
2021-05-15 14:10:51 +01:00
|
|
|
|
public abstract TargetType Type { get; }
|
2021-05-15 11:25:47 +01:00
|
|
|
|
|
2021-07-11 16:18:47 +01:00
|
|
|
|
public override bool IgnoreDisabledAttachedObject => false;
|
|
|
|
|
public override bool IgnoreNullReferenceTransform => true;
|
|
|
|
|
|
2021-05-15 11:25:47 +01:00
|
|
|
|
public override void Start()
|
|
|
|
|
{
|
|
|
|
|
SectorSync = gameObject.AddComponent<SectorSync.SectorSync>();
|
2021-05-18 15:10:38 +01:00
|
|
|
|
QSBSectorManager.Instance.SectoredRigidbodySyncs.Add(this);
|
2021-05-15 11:25:47 +01:00
|
|
|
|
base.Start();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void OnDestroy()
|
|
|
|
|
{
|
|
|
|
|
base.OnDestroy();
|
2021-05-18 15:10:38 +01:00
|
|
|
|
QSBSectorManager.Instance.SectoredRigidbodySyncs.Remove(this);
|
2021-05-15 11:25:47 +01:00
|
|
|
|
if (SectorSync != null)
|
|
|
|
|
{
|
|
|
|
|
Destroy(SectorSync);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void Init()
|
|
|
|
|
{
|
|
|
|
|
base.Init();
|
|
|
|
|
if (!QSBSectorManager.Instance.IsReady)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
2021-06-18 22:38:32 +01:00
|
|
|
|
|
2021-07-13 15:24:41 +01:00
|
|
|
|
if (!HasAuthority)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-15 11:25:47 +01:00
|
|
|
|
var closestSector = SectorSync.GetClosestSector(AttachedObject.transform);
|
|
|
|
|
if (closestSector != null)
|
|
|
|
|
{
|
|
|
|
|
SetReferenceTransform(closestSector.Transform);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-14 13:05:16 +01:00
|
|
|
|
public override void SerializeTransform(QNetworkWriter writer, bool initialState)
|
2021-05-15 11:25:47 +01:00
|
|
|
|
{
|
|
|
|
|
if (_intermediaryTransform == null)
|
|
|
|
|
{
|
|
|
|
|
_intermediaryTransform = new IntermediaryTransform(transform);
|
|
|
|
|
}
|
2021-06-18 22:38:32 +01:00
|
|
|
|
|
2021-05-15 11:25:47 +01:00
|
|
|
|
if (ReferenceSector != null)
|
|
|
|
|
{
|
|
|
|
|
writer.Write(ReferenceSector.ObjectId);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
writer.Write(-1);
|
|
|
|
|
}
|
2021-06-18 22:38:32 +01:00
|
|
|
|
|
2021-07-14 13:05:16 +01:00
|
|
|
|
base.SerializeTransform(writer, initialState);
|
2021-05-15 11:25:47 +01:00
|
|
|
|
}
|
|
|
|
|
|
2021-07-14 13:05:16 +01:00
|
|
|
|
public override void DeserializeTransform(QNetworkReader reader, bool initialState)
|
2021-05-15 11:25:47 +01:00
|
|
|
|
{
|
|
|
|
|
if (!QSBCore.WorldObjectsReady)
|
|
|
|
|
{
|
|
|
|
|
reader.ReadInt32();
|
|
|
|
|
reader.ReadVector3();
|
|
|
|
|
DeserializeRotation(reader);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var sectorId = reader.ReadInt32();
|
|
|
|
|
var sector = sectorId == -1
|
|
|
|
|
? null
|
|
|
|
|
: QSBWorldSync.GetWorldFromId<QSBSector>(sectorId);
|
|
|
|
|
|
|
|
|
|
if (sector != ReferenceSector)
|
|
|
|
|
{
|
|
|
|
|
SetReferenceSector(sector);
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-14 13:05:16 +01:00
|
|
|
|
base.DeserializeTransform(reader, initialState);
|
2021-05-15 11:25:47 +01:00
|
|
|
|
}
|
|
|
|
|
|
2021-07-11 16:18:47 +01:00
|
|
|
|
protected override bool UpdateTransform()
|
2021-05-15 11:25:47 +01:00
|
|
|
|
{
|
2021-07-13 15:24:41 +01:00
|
|
|
|
if ((ReferenceTransform == null || ReferenceSector == null) && QSBSectorManager.Instance.IsReady && HasAuthority)
|
2021-05-15 11:25:47 +01:00
|
|
|
|
{
|
|
|
|
|
var closestSector = SectorSync.GetClosestSector(AttachedObject.transform);
|
|
|
|
|
if (closestSector != null)
|
|
|
|
|
{
|
|
|
|
|
SetReferenceTransform(closestSector.Transform);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2021-07-11 16:18:47 +01:00
|
|
|
|
return false;
|
2021-05-15 11:25:47 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-11 16:18:47 +01:00
|
|
|
|
return base.UpdateTransform();
|
2021-05-15 11:25:47 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SetReferenceSector(QSBSector sector)
|
|
|
|
|
{
|
|
|
|
|
ReferenceSector = sector;
|
2021-05-19 12:12:13 +01:00
|
|
|
|
SetReferenceTransform(sector?.Transform);
|
2021-05-15 11:25:47 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
2021-07-14 17:06:20 +01:00
|
|
|
|
}
|