95 lines
3.1 KiB
C#
Raw Normal View History

2020-08-09 11:30:30 +02:00
using System.Collections.Generic;
2020-02-13 21:23:12 +01:00
using UnityEngine;
using System.Linq;
2020-08-10 19:24:28 +02:00
using QSB.Events;
using QSB.Utility;
2020-02-13 20:23:26 +01:00
2020-02-21 23:36:07 +01:00
namespace QSB.TransformSync
2020-02-15 20:48:02 +01:00
{
2020-02-21 23:36:07 +01:00
public class SectorSync : MonoBehaviour
2020-02-15 20:48:02 +01:00
{
2020-08-09 11:30:30 +02:00
private readonly List<Sector> _allSectors = new List<Sector>();
2020-08-09 13:54:05 +01:00
public static SectorSync LocalInstance { get; private set; }
2020-07-28 15:59:24 +02:00
2020-08-05 21:59:50 +02:00
private readonly Sector.Name[] _sectorBlacklist =
{
Sector.Name.Unnamed,
Sector.Name.Ship
};
2020-02-13 21:23:12 +01:00
private void Awake()
{
2020-08-09 13:54:05 +01:00
LocalInstance = this;
2020-08-09 11:30:30 +02:00
QSB.Helper.Events.Subscribe<Sector>(OWML.Common.Events.AfterAwake);
QSB.Helper.Events.Event += OnEvent;
}
private void OnEvent(MonoBehaviour behaviour, OWML.Common.Events ev)
{
if (behaviour is Sector sector && ev == OWML.Common.Events.AfterAwake)
{
if (!_allSectors.Contains(sector))
{
_allSectors.Add(sector);
}
}
}
2020-08-08 18:57:39 +02:00
private void SendSector(uint id, Sector sector)
{
2020-08-08 18:57:39 +02:00
DebugLog.ToScreen($"Sending sector {sector.name} for id {id}");
GlobalMessenger<uint, Sector.Name, string>.FireEvent(EventNames.QSBSectorChange, id, sector.GetName(), sector.name);
}
2020-08-09 13:54:05 +01:00
public Sector FindSectorByName(Sector.Name sectorName, string goName)
2020-02-15 20:48:02 +01:00
{
2020-08-09 11:04:50 +01:00
if (_allSectors.Count == 0)
2020-08-09 11:02:59 +01:00
{
2020-08-09 11:06:51 +01:00
DebugLog.ToConsole("Error: _allSectors is empty!", OWML.Common.MessageType.Error);
2020-08-09 11:02:59 +01:00
}
2020-02-13 21:23:12 +01:00
2020-08-09 13:54:05 +01:00
return _allSectors
.FirstOrDefault(sector => sector != null &&
sector.GetName() == sectorName &&
sector.name == goName);
2020-02-13 21:48:23 +01:00
}
2020-08-05 21:59:50 +02:00
private void Update()
2020-02-15 20:48:02 +01:00
{
2020-08-05 21:59:50 +02:00
if (_allSectors == null || !_allSectors.Any())
2020-02-15 20:48:02 +01:00
{
2020-08-05 21:59:50 +02:00
return;
2020-02-13 21:48:23 +01:00
}
2020-08-05 21:59:50 +02:00
PlayerRegistry.LocalTransformSyncs.ForEach(UpdateTransformSync);
2020-02-13 21:48:23 +01:00
}
2020-02-15 20:48:02 +01:00
2020-08-05 21:59:50 +02:00
private void UpdateTransformSync(TransformSync transformSync)
{
var syncedTransform = transformSync.SyncedTransform;
if (syncedTransform == null ||
syncedTransform.position == Vector3.zero ||
syncedTransform.position == Locator.GetAstroObject(AstroObject.Name.Sun).transform.position)
{
return;
}
var closestSector = GetClosestSector(syncedTransform);
if (closestSector.transform == transformSync.ReferenceTransform)
{
return;
}
2020-08-08 18:57:39 +02:00
SendSector(transformSync.netId.Value, closestSector);
2020-08-05 21:59:50 +02:00
transformSync.ReferenceTransform = closestSector.transform;
}
private Sector GetClosestSector(Transform trans)
{
2020-08-09 11:04:50 +01:00
return _allSectors
2020-08-09 11:30:30 +02:00
.Where(sector => sector != null &&
!_sectorBlacklist.Contains(sector.GetName()))
2020-08-08 18:57:39 +02:00
.OrderBy(sector => Vector3.Distance(sector.transform.position, trans.position))
.First();
2020-08-05 21:59:50 +02:00
}
2020-02-13 20:23:26 +01:00
}
}