2021-02-24 10:45:25 +00:00

68 lines
1.7 KiB
C#

using QSB.Events;
using QSB.Player;
using QSB.Utility;
using QSB.WorldSync;
using UnityEngine;
namespace QSB.QuantumSync.WorldObjects
{
internal abstract class QSBQuantumObject<T> : WorldObject<T>, IQSBQuantumObject
where T : MonoBehaviour
{
public uint ControllingPlayer { get; set; }
public bool IsEnabled { get; set; }
private OnEnableDisableTracker _tracker;
public override void OnRemoval()
{
_tracker.OnEnableEvent -= OnEnable;
_tracker.OnDisableEvent -= OnDisable;
Object.Destroy(_tracker);
}
public override void Init(T attachedObject, int id)
{
_tracker = QSBCore.GameObjectInstance.AddComponent<OnEnableDisableTracker>();
_tracker.AttachedComponent = AttachedObject;
_tracker.OnEnableEvent += OnEnable;
_tracker.OnDisableEvent += OnDisable;
ControllingPlayer = 0u;
}
private void OnEnable()
{
IsEnabled = true;
if (!QSBCore.HasWokenUp && !QSBCore.IsServer)
{
return;
}
if (ControllingPlayer != 0)
{
// controlled by another player, dont care that we activate it
return;
}
var id = QSBWorldSync.GetIdFromTypeSubset(this);
// no one is controlling this object right now, request authority
QSBEventManager.FireEvent(EventNames.QSBQuantumAuthority, id, QSBPlayerManager.LocalPlayerId);
}
private void OnDisable()
{
IsEnabled = false;
if (!QSBCore.HasWokenUp && !QSBCore.IsServer)
{
return;
}
if (ControllingPlayer != QSBPlayerManager.LocalPlayerId)
{
// not being controlled by us, don't care if we leave area
return;
}
var id = QSBWorldSync.GetIdFromTypeSubset(this);
// send event to other players that we're releasing authority
QSBEventManager.FireEvent(EventNames.QSBQuantumAuthority, id, 0u);
}
}
}