diff --git a/QSB/QuantumSync/Patches/Common/Visibility/VisibilityShapePatches.cs b/QSB/QuantumSync/Patches/Common/Visibility/VisibilityShapePatches.cs deleted file mode 100644 index 64015bf0..00000000 --- a/QSB/QuantumSync/Patches/Common/Visibility/VisibilityShapePatches.cs +++ /dev/null @@ -1,21 +0,0 @@ -using HarmonyLib; -using QSB.Patches; -using QSB.Utility; - -namespace QSB.QuantumSync.Patches.Common.Visibility; - -[HarmonyPatch(typeof(Shape))] -internal class VisibilityShapePatches : QSBPatch -{ - public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; - - [HarmonyPostfix] - [HarmonyPatch(nameof(Shape.OnEnable))] - public static void OnEnable(Shape __instance) - => __instance.RaiseEvent(nameof(__instance.OnShapeActivated), __instance); - - [HarmonyPostfix] - [HarmonyPatch(nameof(Shape.OnDisable))] - public static void OnDisable(Shape __instance) - => __instance.RaiseEvent(nameof(__instance.OnShapeDeactivated), __instance); -} diff --git a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs index a9c1e108..a72e636a 100644 --- a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs @@ -38,11 +38,11 @@ internal abstract class QSBQuantumObject : WorldObject, IQSBQuantumObject return; } - foreach (var shape in GetAttachedShapes()) + /*foreach (var shape in GetAttachedShapes()) { shape.OnShapeActivated -= OnEnable; shape.OnShapeDeactivated -= OnDisable; - } + }*/ } public override async UniTask Init(CancellationToken ct) @@ -64,11 +64,13 @@ internal abstract class QSBQuantumObject : WorldObject, IQSBQuantumObject return; } - foreach (var shape in attachedShapes) + /*foreach (var shape in attachedShapes) { shape.OnShapeActivated += OnEnable; shape.OnShapeDeactivated += OnDisable; - } + }*/ + + AttachedObject._sector.OnSectorOccupantsUpdated += OnSectorOccupantsUpdated; if (attachedShapes.All(x => x.enabled && x.gameObject.activeInHierarchy && x.active)) { @@ -81,6 +83,21 @@ internal abstract class QSBQuantumObject : WorldObject, IQSBQuantumObject } } + private void OnSectorOccupantsUpdated() + { + var playerInSector = AttachedObject._sector.ContainsAnyOccupants(DynamicOccupant.Player); + DebugLog.DebugWrite($"{ObjectId} {AttachedObject.name} SectorOccupantsUpdated : playerInSector:{playerInSector}"); + + if (!IsEnabled && playerInSector && ControllingPlayer == 0) + { + RequestAuthority(); + } + else if (IsEnabled && !playerInSector && ControllingPlayer == QSBPlayerManager.LocalPlayerId) + { + ReleaseAuthority(); + } + } + public override void SendInitialState(uint to) => ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(ControllingPlayer) { To = to }); @@ -124,58 +141,29 @@ internal abstract class QSBQuantumObject : WorldObject, IQSBQuantumObject public VisibilityObject GetVisibilityObject() => AttachedObject; - private void OnEnable(Shape s) + private void RequestAuthority() { - if (IsEnabled) - { - return; - } - IsEnabled = true; if (!QSBWorldSync.AllObjectsReady && !QSBCore.IsHost) { return; } - if (ControllingPlayer != 0) - { - // controlled by another player, dont care that we activate it - return; - } - // no one is controlling this object right now, request authority ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(QSBPlayerManager.LocalPlayerId)); } - private void OnDisable(Shape s) => - // we wait a frame here in case the shapes get disabled as we switch from 1 visibility tracker to another - Delay.RunNextFrame(() => + private void ReleaseAuthority() + { + IsEnabled = false; + if (!QSBWorldSync.AllObjectsReady && !QSBCore.IsHost) { - if (!IsEnabled) - { - return; - } + return; + } - if (GetAttachedShapes().Any(x => x.isActiveAndEnabled)) - { - return; - } - - IsEnabled = false; - if (!QSBWorldSync.AllObjectsReady && !QSBCore.IsHost) - { - return; - } - - if (ControllingPlayer != QSBPlayerManager.LocalPlayerId) - { - // not being controlled by us, don't care if we leave area - return; - } - - // send event to other players that we're releasing authority - ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(0u)); - }); + // send event to other players that we're releasing authority + ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(0u)); + } public void OnTakeProbeSnapshot(PlayerInfo player, ProbeCamera.ID cameraId) { diff --git a/QSB/Utility/DebugGUI.cs b/QSB/Utility/DebugGUI.cs index 995236e5..595ba76f 100644 --- a/QSB/Utility/DebugGUI.cs +++ b/QSB/Utility/DebugGUI.cs @@ -2,6 +2,7 @@ using QSB.EchoesOfTheEye.Ghosts.WorldObjects; using QSB.Player; using QSB.Player.TransformSync; +using QSB.QuantumSync.WorldObjects; using QSB.ShipSync; using QSB.ShipSync.TransformSync; using QSB.ShipSync.WorldObjects; @@ -296,7 +297,6 @@ internal class DebugGUI : MonoBehaviour, IAddComponentOnStart } } - /* #region Column4 - Quantum Object Possesion foreach (var player in QSBPlayerManager.PlayerList) @@ -335,7 +335,6 @@ internal class DebugGUI : MonoBehaviour, IAddComponentOnStart } #endregion - */ } private static void DrawWorldObjectLabels()