diff --git a/QSB/Anglerfish/Patches/AnglerPatches.cs b/QSB/Anglerfish/Patches/AnglerPatches.cs index b5c7b1a0..5aafa580 100644 --- a/QSB/Anglerfish/Patches/AnglerPatches.cs +++ b/QSB/Anglerfish/Patches/AnglerPatches.cs @@ -2,6 +2,7 @@ using QSB.Anglerfish.WorldObjects; using QSB.Events; using QSB.Patches; +using QSB.Utility; using QSB.WorldSync; using UnityEngine; @@ -26,6 +27,31 @@ namespace QSB.Anglerfish.Patches return false; } + [HarmonyPrefix] + [HarmonyPatch(typeof(AnglerfishController), nameof(AnglerfishController.OnSectorOccupantsUpdated))] + public static bool OnSectorOccupantsUpdated(AnglerfishController __instance) + { + var qsbAngler = QSBWorldSync.GetWorldFromUnity(__instance); + + if (!__instance.gameObject.activeSelf && __instance._sector.ContainsAnyOccupants(DynamicOccupant.Player | DynamicOccupant.Probe | DynamicOccupant.Ship)) + { + __instance.gameObject.SetActive(true); + __instance._anglerBody.Unsuspend(); + __instance.RaiseEvent(nameof(__instance.OnAnglerUnsuspended), __instance._currentState); + QSBEventManager.FireEvent(EventNames.QSBSuspensionChange, qsbAngler.TransformSync.NetIdentity, false); + return false; + } + if (__instance.gameObject.activeSelf && !__instance._sector.ContainsAnyOccupants(DynamicOccupant.Player | DynamicOccupant.Probe | DynamicOccupant.Ship)) + { + __instance._anglerBody.Suspend(); + __instance.gameObject.SetActive(false); + __instance.RaiseEvent(nameof(__instance.OnAnglerSuspended), __instance._currentState); + QSBEventManager.FireEvent(EventNames.QSBSuspensionChange, qsbAngler.TransformSync.NetIdentity, true); + } + + return false; + } + [HarmonyPrefix] [HarmonyPatch(typeof(AnglerfishController), nameof(AnglerfishController.OnSectorOccupantRemoved))] public static bool OnSectorOccupantRemoved(AnglerfishController __instance, @@ -36,6 +62,7 @@ namespace QSB.Anglerfish.Patches if (qsbAngler.TargetTransform != null && sectorDetector.GetAttachedOWRigidbody().transform == qsbAngler.TargetTransform) { qsbAngler.TargetTransform = null; + QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); } return false; @@ -86,7 +113,6 @@ namespace QSB.Anglerfish.Patches { Locator.GetDeathManager().KillPlayer(DeathType.Digestion); __instance._consumeComplete = true; - qsbAngler.TransformSync = null; return false; } if (qsbAngler.TargetTransform.CompareTag("Ship")) @@ -102,11 +128,15 @@ namespace QSB.Anglerfish.Patches Locator.GetDeathManager().KillPlayer(DeathType.Digestion); } __instance._consumeComplete = true; - qsbAngler.TransformSync = null; return false; } } } + else + { + qsbAngler.TargetTransform = null; + QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); + } break; case AnglerfishController.AnglerState.Stunned: __instance._stunTimer -= Time.deltaTime; @@ -247,9 +277,9 @@ namespace QSB.Anglerfish.Patches if (__instance._currentState != AnglerfishController.AnglerState.Chasing) { __instance.ChangeState(AnglerfishController.AnglerState.Chasing); - QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); - return false; } + QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); + return false; } } else if (__instance._currentState is AnglerfishController.AnglerState.Lurking or AnglerfishController.AnglerState.Investigating) @@ -258,8 +288,8 @@ namespace QSB.Anglerfish.Patches if (__instance._currentState != AnglerfishController.AnglerState.Investigating) { __instance.ChangeState(AnglerfishController.AnglerState.Investigating); - QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); } + QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); } return false; diff --git a/QSB/Anglerfish/WorldObjects/QSBAngler.cs b/QSB/Anglerfish/WorldObjects/QSBAngler.cs index 5e8c78ef..7e60d5a9 100644 --- a/QSB/Anglerfish/WorldObjects/QSBAngler.cs +++ b/QSB/Anglerfish/WorldObjects/QSBAngler.cs @@ -1,5 +1,4 @@ using QSB.Anglerfish.TransformSync; -using QSB.Events; using QSB.Utility; using QSB.WorldSync; using QuantumUNET; @@ -20,12 +19,6 @@ namespace QSB.Anglerfish.WorldObjects ObjectId = id; AttachedObject = attachedObject; - QSBCore.UnityEvents.RunWhen(() => TransformSync, () => - { - AttachedObject.OnAnglerSuspended += OnSuspend; - AttachedObject.OnAnglerUnsuspended += OnUnsuspend; - }); - if (QSBCore.IsHost) { Object.Instantiate(QSBNetworkManager.Instance.AnglerPrefab).SpawnWithServerAuthority(); @@ -34,21 +27,12 @@ namespace QSB.Anglerfish.WorldObjects public override void OnRemoval() { - AttachedObject.OnAnglerSuspended -= OnSuspend; - AttachedObject.OnAnglerUnsuspended -= OnUnsuspend; - if (QSBCore.IsHost) { QNetworkServer.Destroy(TransformSync.gameObject); } } - private void OnSuspend(AnglerfishController.AnglerState _) => - QSBEventManager.FireEvent(EventNames.QSBSuspensionChange, TransformSync.NetIdentity, true); - - private void OnUnsuspend(AnglerfishController.AnglerState _) => - QSBEventManager.FireEvent(EventNames.QSBSuspensionChange, TransformSync.NetIdentity, false); - public void UpdateTargetVelocity() { if (TargetTransform == null) diff --git a/QSB/SuspensionAuthoritySync/SuspensionChangeEvent.cs b/QSB/SuspensionAuthoritySync/SuspensionChangeEvent.cs index 85cc166a..f3340036 100644 --- a/QSB/SuspensionAuthoritySync/SuspensionChangeEvent.cs +++ b/QSB/SuspensionAuthoritySync/SuspensionChangeEvent.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Linq; using QSB.Events; +using QSB.Player; using QSB.Utility; using QuantumUNET; using QuantumUNET.Components; @@ -91,7 +92,7 @@ namespace QSB.SuspensionAuthoritySync identity.AssignClientAuthority(newConn); } - DebugLog.DebugWrite($"{identity.NetId}:{identity.gameObject.name} - set authority to {id}"); + DebugLog.DebugWrite($"{QSBPlayerManager.LocalPlayerId}.{identity.NetId}:{identity.gameObject.name} - set authority to {id}"); } } }