mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-02-23 06:40:56 +00:00
136 lines
3.2 KiB
C#
136 lines
3.2 KiB
C#
using OWML.Common;
|
|
using OWML.Utils;
|
|
using QSB.Events;
|
|
using QSB.Player;
|
|
using QSB.Utility;
|
|
using QSB.WorldSync;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace QSB.QuantumSync.WorldObjects
|
|
{
|
|
internal abstract class QSBQuantumObject<T> : WorldObject<T>, IQSBQuantumObject
|
|
where T : QuantumObject
|
|
{
|
|
public uint ControllingPlayer { get; set; }
|
|
public bool IsEnabled { get; set; }
|
|
|
|
public override void OnRemoval()
|
|
{
|
|
foreach (var shape in GetAttachedShapes())
|
|
{
|
|
shape.OnShapeActivated -= (Shape s)
|
|
=> QSBCore.UnityEvents.FireOnNextUpdate(() => OnEnable(s));
|
|
|
|
shape.OnShapeDeactivated -= (Shape s)
|
|
=> QSBCore.UnityEvents.FireOnNextUpdate(() => OnDisable(s));
|
|
}
|
|
}
|
|
|
|
public override void Init(T attachedObject, int id)
|
|
{
|
|
foreach (var shape in GetAttachedShapes())
|
|
{
|
|
if (shape == null)
|
|
{
|
|
break;
|
|
}
|
|
// Firing next update to give time for shapes to actually be disabled
|
|
|
|
shape.OnShapeActivated += (Shape s)
|
|
=> QSBCore.UnityEvents.FireOnNextUpdate(() => OnEnable(s));
|
|
|
|
shape.OnShapeDeactivated += (Shape s)
|
|
=> QSBCore.UnityEvents.FireOnNextUpdate(() => OnDisable(s));
|
|
}
|
|
|
|
if (GetAttachedShapes().Any(x => !x.enabled || !x.active))
|
|
{
|
|
ControllingPlayer = 0u;
|
|
IsEnabled = false;
|
|
}
|
|
else
|
|
{
|
|
IsEnabled = true;
|
|
}
|
|
}
|
|
|
|
private List<Shape> GetAttachedShapes()
|
|
{
|
|
if (AttachedObject == null)
|
|
{
|
|
return new List<Shape>();
|
|
}
|
|
|
|
var visibilityTrackers = AttachedObject.GetValue<VisibilityTracker[]>("_visibilityTrackers");
|
|
if (visibilityTrackers == null || visibilityTrackers.Length == 0)
|
|
{
|
|
return new List<Shape>();
|
|
}
|
|
|
|
if (visibilityTrackers.Any(x => x.GetType() == typeof(RendererVisibilityTracker)))
|
|
{
|
|
DebugLog.ToConsole($"Warning - {AttachedObject.name} has a RendererVisibilityTracker!", MessageType.Warning);
|
|
return new List<Shape>();
|
|
}
|
|
|
|
var totalShapes = new List<Shape>();
|
|
foreach (var tracker in visibilityTrackers)
|
|
{
|
|
var shapes = tracker.GetValue<Shape[]>("_shapes");
|
|
totalShapes.AddRange(shapes);
|
|
}
|
|
|
|
return totalShapes;
|
|
}
|
|
|
|
private void OnEnable(Shape s)
|
|
{
|
|
IsEnabled = true;
|
|
if (!QSBCore.WorldObjectsReady && !QSBCore.IsHost)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (ControllingPlayer != 0)
|
|
{
|
|
// controlled by another player, dont care that we activate it
|
|
return;
|
|
}
|
|
|
|
var id = QSBWorldSync.GetIdFromTypeSubset<IQSBQuantumObject>(this);
|
|
// no one is controlling this object right now, request authority
|
|
QSBEventManager.FireEvent(EventNames.QSBQuantumAuthority, id, QSBPlayerManager.LocalPlayerId);
|
|
}
|
|
|
|
private void OnDisable(Shape s)
|
|
{
|
|
if (!IsEnabled)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (GetAttachedShapes().Any(x => x.isActiveAndEnabled))
|
|
{
|
|
return;
|
|
}
|
|
|
|
IsEnabled = false;
|
|
if (!QSBCore.WorldObjectsReady && !QSBCore.IsHost)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (ControllingPlayer != QSBPlayerManager.LocalPlayerId)
|
|
{
|
|
// not being controlled by us, don't care if we leave area
|
|
return;
|
|
}
|
|
|
|
var id = QSBWorldSync.GetIdFromTypeSubset<IQSBQuantumObject>(this);
|
|
// send event to other players that we're releasing authority
|
|
QSBEventManager.FireEvent(EventNames.QSBQuantumAuthority, id, 0u);
|
|
}
|
|
}
|
|
}
|