add tracker back

This commit is contained in:
Mister_Nebula 2021-02-19 09:40:46 +00:00
parent 38a1bad9bf
commit 82e8c1fdc0
6 changed files with 89 additions and 13 deletions

View File

@ -210,6 +210,7 @@
<Compile Include="Utility\DebugBoxManager.cs" /> <Compile Include="Utility\DebugBoxManager.cs" />
<Compile Include="Utility\DebugZOverride.cs" /> <Compile Include="Utility\DebugZOverride.cs" />
<Compile Include="Utility\Extensions.cs" /> <Compile Include="Utility\Extensions.cs" />
<Compile Include="Utility\OnEnableDisableTracker.cs" />
<Compile Include="Utility\Popcron.Gizmos\Constants.cs" /> <Compile Include="Utility\Popcron.Gizmos\Constants.cs" />
<Compile Include="Utility\Popcron.Gizmos\Drawers\CubeDrawer.cs" /> <Compile Include="Utility\Popcron.Gizmos\Drawers\CubeDrawer.cs" />
<Compile Include="Utility\Popcron.Gizmos\Drawer.cs" /> <Compile Include="Utility\Popcron.Gizmos\Drawer.cs" />

View File

@ -28,8 +28,8 @@ namespace QSB.QuantumSync.Patches
QSBCore.Helper.HarmonyHelper.AddPrefix<QuantumShrine>("OnEntry", typeof(QuantumPatches), nameof(Shrine_OnEntry)); QSBCore.Helper.HarmonyHelper.AddPrefix<QuantumShrine>("OnEntry", typeof(QuantumPatches), nameof(Shrine_OnEntry));
QSBCore.Helper.HarmonyHelper.AddPrefix<QuantumShrine>("OnExit", typeof(QuantumPatches), nameof(Shrine_OnExit)); QSBCore.Helper.HarmonyHelper.AddPrefix<QuantumShrine>("OnExit", typeof(QuantumPatches), nameof(Shrine_OnExit));
QSBCore.Helper.HarmonyHelper.AddPrefix<QuantumMoon>("CheckPlayerFogProximity", typeof(QuantumPatches), nameof(Moon_CheckPlayerFogProximity)); QSBCore.Helper.HarmonyHelper.AddPrefix<QuantumMoon>("CheckPlayerFogProximity", typeof(QuantumPatches), nameof(Moon_CheckPlayerFogProximity));
QSBCore.Helper.HarmonyHelper.AddPostfix<Shape>("OnEnable", typeof(QuantumPatches), nameof(Shape_OnEnable)); //QSBCore.Helper.HarmonyHelper.AddPostfix<Shape>("OnEnable", typeof(QuantumPatches), nameof(Shape_OnEnable));
QSBCore.Helper.HarmonyHelper.AddPostfix<Shape>("OnDisable", typeof(QuantumPatches), nameof(Shape_OnDisable)); //QSBCore.Helper.HarmonyHelper.AddPostfix<Shape>("OnDisable", typeof(QuantumPatches), nameof(Shape_OnDisable));
} }
public override void DoUnpatches() public override void DoUnpatches()
@ -44,10 +44,11 @@ namespace QSB.QuantumSync.Patches
QSBCore.Helper.HarmonyHelper.Unpatch<QuantumShrine>("OnEntry"); QSBCore.Helper.HarmonyHelper.Unpatch<QuantumShrine>("OnEntry");
QSBCore.Helper.HarmonyHelper.Unpatch<QuantumShrine>("OnExit"); QSBCore.Helper.HarmonyHelper.Unpatch<QuantumShrine>("OnExit");
QSBCore.Helper.HarmonyHelper.Unpatch<QuantumMoon>("CheckPlayerFogProximity"); QSBCore.Helper.HarmonyHelper.Unpatch<QuantumMoon>("CheckPlayerFogProximity");
QSBCore.Helper.HarmonyHelper.Unpatch<Shape>("OnEnable"); //QSBCore.Helper.HarmonyHelper.Unpatch<Shape>("OnEnable");
QSBCore.Helper.HarmonyHelper.Unpatch<Shape>("OnDisable"); //QSBCore.Helper.HarmonyHelper.Unpatch<Shape>("OnDisable");
} }
/*
private static IQSBQuantumObject GetWorldObjectFromShape(Shape shape) private static IQSBQuantumObject GetWorldObjectFromShape(Shape shape)
{ {
var obj = QuantumManager.Instance._shapesToTrackers.FirstOrDefault(x => x.Key.Contains(shape)); var obj = QuantumManager.Instance._shapesToTrackers.FirstOrDefault(x => x.Key.Contains(shape));
@ -99,6 +100,7 @@ namespace QSB.QuantumSync.Patches
} }
worldObject.Disable(); worldObject.Disable();
} }
*/
public static bool Socketed_ChangeQuantumState(SocketedQuantumObject __instance) public static bool Socketed_ChangeQuantumState(SocketedQuantumObject __instance)
=> QSBWorldSync.GetWorldObject<QSBSocketedQuantumObject, SocketedQuantumObject>(__instance).ControllingPlayer == QSBPlayerManager.LocalPlayerId; => QSBWorldSync.GetWorldObject<QSBSocketedQuantumObject, SocketedQuantumObject>(__instance).ControllingPlayer == QSBPlayerManager.LocalPlayerId;

View File

@ -16,8 +16,8 @@ namespace QSB.QuantumSync
{ {
public static QuantumManager Instance { get; private set; } public static QuantumManager Instance { get; private set; }
public Dictionary<Shape[], VisibilityTracker> _shapesToTrackers = new Dictionary<Shape[], VisibilityTracker>(); //public Dictionary<Shape[], VisibilityTracker> _shapesToTrackers = new Dictionary<Shape[], VisibilityTracker>();
public Dictionary<VisibilityObject, List<VisibilityTracker>> _objectToTrackers = new Dictionary<VisibilityObject, List<VisibilityTracker>>(); //public Dictionary<VisibilityObject, List<VisibilityTracker>> _objectToTrackers = new Dictionary<VisibilityObject, List<VisibilityTracker>>();
public QuantumShrine Shrine; public QuantumShrine Shrine;
public bool IsReady; public bool IsReady;
@ -40,7 +40,7 @@ namespace QSB.QuantumSync
{ {
Shrine = Resources.FindObjectsOfTypeAll<QuantumShrine>().First(); Shrine = Resources.FindObjectsOfTypeAll<QuantumShrine>().First();
} }
/*
var visibilityObjects = Resources.FindObjectsOfTypeAll<VisibilityObject>().Where( var visibilityObjects = Resources.FindObjectsOfTypeAll<VisibilityObject>().Where(
x => x != null x => x != null
&& x.GetValue<VisibilityTracker[]>("_visibilityTrackers") != null && x.GetValue<VisibilityTracker[]>("_visibilityTrackers") != null
@ -79,6 +79,7 @@ namespace QSB.QuantumSync
}); });
} }
} }
*/
IsReady = true; IsReady = true;
} }

View File

@ -4,8 +4,5 @@
{ {
uint ControllingPlayer { get; set; } uint ControllingPlayer { get; set; }
bool IsEnabled { get; set; } bool IsEnabled { get; set; }
void Enable();
void Disable();
} }
} }

View File

@ -1,5 +1,6 @@
using QSB.Events; using QSB.Events;
using QSB.Player; using QSB.Player;
using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
using UnityEngine; using UnityEngine;
@ -11,9 +12,25 @@ namespace QSB.QuantumSync.WorldObjects
public uint ControllingPlayer { get; set; } public uint ControllingPlayer { get; set; }
public bool IsEnabled { get; set; } public bool IsEnabled { get; set; }
public override void Init(T attachedObject, int id) => ControllingPlayer = 0u; private OnEnableDisableTracker _tracker;
public void Enable() 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; IsEnabled = true;
if (!QSBCore.HasWokenUp && !QSBCore.IsServer) if (!QSBCore.HasWokenUp && !QSBCore.IsServer)
@ -30,7 +47,7 @@ namespace QSB.QuantumSync.WorldObjects
QSBEventManager.FireEvent(EventNames.QSBQuantumAuthority, id, QSBPlayerManager.LocalPlayerId); QSBEventManager.FireEvent(EventNames.QSBQuantumAuthority, id, QSBPlayerManager.LocalPlayerId);
} }
public void Disable() private void OnDisable()
{ {
IsEnabled = false; IsEnabled = false;
if (!QSBCore.HasWokenUp && !QSBCore.IsServer) if (!QSBCore.HasWokenUp && !QSBCore.IsServer)

View File

@ -0,0 +1,58 @@
using OWML.Utils;
using System;
using System.Linq;
using UnityEngine;
namespace QSB.Utility
{
public class OnEnableDisableTracker : MonoBehaviour
{
public event Action OnEnableEvent;
public event Action OnDisableEvent;
public MonoBehaviour AttachedComponent;
private ComponentState _wasEnabled = ComponentState.NotChecked;
public OnEnableDisableTracker()
=> QSBSceneManager.OnSceneLoaded += (OWScene scene, bool inUniverse) => Destroy(this);
private void OnDestroy()
=> QSBSceneManager.OnSceneLoaded -= (OWScene scene, bool inUniverse) => Destroy(this);
private bool GetAnyVisibilityTrackersActive()
{
var visibilityTrackers = AttachedComponent.GetValue<VisibilityTracker[]>("_visibilityTrackers");
return visibilityTrackers.All(x => x.GetValue<Shape[]>("_shapes").All(y => y.enabled));
}
private void Update()
{
if (AttachedComponent == null)
{
DebugLog.ToConsole($"Attached component is null!", OWML.Common.MessageType.Error);
return;
}
var state = AttachedComponent.isActiveAndEnabled && GetAnyVisibilityTrackersActive() ? ComponentState.Enabled : ComponentState.Disabled;
if (_wasEnabled != state)
{
_wasEnabled = state;
if (state == ComponentState.Enabled)
{
OnEnableEvent?.SafeInvoke();
}
else
{
OnDisableEvent?.SafeInvoke();
}
}
}
}
internal enum ComponentState
{
NotChecked = 0,
Enabled = 1,
Disabled = 2
}
}