quantum-space-buddies/QSB/Syncs/TransformSync/SectoredTransformSync.cs

130 lines
3.1 KiB
C#
Raw Normal View History

2021-07-07 09:02:23 +01:00
using QSB.SectorSync;
using QSB.SectorSync.WorldObjects;
2021-07-06 16:28:12 +01:00
using QSB.Utility;
2021-04-28 00:22:08 +01:00
using QSB.WorldSync;
using QuantumUNET.Transport;
using UnityEngine;
2021-04-28 00:22:08 +01:00
2021-05-02 13:59:39 +01:00
namespace QSB.Syncs.TransformSync
2021-04-28 00:22:08 +01:00
{
public abstract class SectoredTransformSync : BaseTransformSync, ISectoredSync<Transform>
2021-04-28 00:22:08 +01:00
{
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-04-28 00:22:08 +01:00
public override void Start()
{
SectorSync = gameObject.AddComponent<SectorSync.SectorSync>();
QSBSectorManager.Instance.SectoredTransformSyncs.Add(this);
2021-04-28 00:22:08 +01:00
base.Start();
}
protected override void OnDestroy()
{
base.OnDestroy();
QSBSectorManager.Instance.SectoredTransformSyncs.Remove(this);
2021-04-28 00:22:08 +01:00
if (SectorSync != null)
{
Destroy(SectorSync);
}
}
protected override void Init()
{
base.Init();
2021-05-08 12:53:09 +01:00
if (!QSBSectorManager.Instance.IsReady)
{
return;
}
2021-06-18 22:38:32 +01:00
var closestSector = SectorSync.GetClosestSector(AttachedObject.transform);
if (closestSector != null)
{
2021-07-06 21:11:14 +01:00
// TODO : should this be set reference sector?
SetReferenceTransform(closestSector.Transform);
}
2021-07-06 21:11:14 +01:00
else
{
DebugLog.DebugWrite($"INIT - {PlayerId}.{GetType().Name}'s closest sector is null!");
}
2021-04-28 00:22:08 +01:00
}
public override void SerializeTransform(QNetworkWriter writer)
{
if (_intermediaryTransform == null)
{
_intermediaryTransform = new IntermediaryTransform(transform);
}
2021-06-18 22:38:32 +01:00
2021-04-28 00:22:08 +01:00
if (ReferenceSector != null)
{
writer.Write(ReferenceSector.ObjectId);
}
else
{
2021-07-06 22:29:47 +01:00
DebugLog.ToConsole($"Warning - ReferenceSector of {PlayerId}.{GetType().Name} is null.");
2021-04-28 00:22:08 +01:00
writer.Write(-1);
}
2021-06-18 22:38:32 +01:00
2021-04-28 00:22:08 +01:00
base.SerializeTransform(writer);
}
public override void DeserializeTransform(QNetworkReader reader)
{
2021-05-08 16:57:01 +01:00
if (!QSBCore.WorldObjectsReady)
2021-04-28 00:22:08 +01:00
{
reader.ReadInt32();
reader.ReadVector3();
DeserializeRotation(reader);
return;
}
var sectorId = reader.ReadInt32();
var sector = sectorId == -1
? null
: QSBWorldSync.GetWorldFromId<QSBSector>(sectorId);
if (sector != ReferenceSector)
{
2021-07-06 22:29:47 +01:00
if (sector == null)
{
DebugLog.ToConsole($"Error - {PlayerId}.{GetType().Name} got sector of ID -1.", OWML.Common.MessageType.Error);
base.DeserializeTransform(reader);
return;
}
2021-07-07 09:09:34 +01:00
2021-04-28 00:22:08 +01:00
SetReferenceSector(sector);
}
base.DeserializeTransform(reader);
}
protected override void UpdateTransform()
{
if ((ReferenceTransform == null || ReferenceSector == null) && QSBSectorManager.Instance.IsReady)
{
var closestSector = SectorSync.GetClosestSector(AttachedObject.transform);
if (closestSector != null)
{
SetReferenceTransform(closestSector.Transform);
}
else
{
2021-07-06 22:29:47 +01:00
DebugLog.ToConsole($"Error - No closest sector found to {PlayerId}.{GetType().Name}!", OWML.Common.MessageType.Error);
return;
}
}
base.UpdateTransform();
}
2021-04-28 00:22:08 +01:00
public void SetReferenceSector(QSBSector sector)
{
2021-07-06 16:28:12 +01:00
DebugLog.DebugWrite($"{Player.PlayerId}.{GetType().Name} set reference sector to {sector.Name}");
2021-04-28 00:22:08 +01:00
ReferenceSector = sector;
SetReferenceTransform(sector?.Transform);
2021-04-28 00:22:08 +01:00
}
}
}