From 85ef88769891f561c5bd32c4aa8f5f05b4d42c91 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Sun, 5 Dec 2021 03:41:07 -0800 Subject: [PATCH] form collapse event --- QSB/Events/EventNames.cs | 1 + QSB/Events/QSBEventManager.cs | 2 + .../Events/TornadoFormCollapseEvent.cs | 32 ++++++++++ QSB/TornadoSync/Patches/TornadoPatches.cs | 64 ++++++++++++++++++- QSB/TornadoSync/TornadoManager.cs | 1 + QSB/TornadoSync/WorldObjects/QSBTornado.cs | 17 ++++- 6 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 QSB/TornadoSync/Events/TornadoFormCollapseEvent.cs diff --git a/QSB/Events/EventNames.cs b/QSB/Events/EventNames.cs index b37d2b4e..dbf91074 100644 --- a/QSB/Events/EventNames.cs +++ b/QSB/Events/EventNames.cs @@ -102,5 +102,6 @@ public const string QSBSatelliteRepaired = nameof(QSBSatelliteRepairTick); public const string QSBAuthorityQueue = nameof(QSBAuthorityQueue); public const string QSBJellyfishRising = nameof(QSBJellyfishRising); + public const string QSBTornadoFormCollapse = nameof(QSBTornadoFormCollapse); } } diff --git a/QSB/Events/QSBEventManager.cs b/QSB/Events/QSBEventManager.cs index 7a8cfe40..536186d3 100644 --- a/QSB/Events/QSBEventManager.cs +++ b/QSB/Events/QSBEventManager.cs @@ -32,6 +32,7 @@ using QSB.Tools.SignalscopeTool.Events; using QSB.Tools.SignalscopeTool.FrequencySync.Events; using QSB.Tools.TranslatorTool.Events; using QSB.Tools.TranslatorTool.TranslationSync.Events; +using QSB.TornadoSync.Events; using QSB.Utility; using QSB.Utility.Events; using QSB.ZeroGCaveSync.Events; @@ -106,6 +107,7 @@ namespace QSB.Events new FragmentDamageEvent(), new FragmentResyncEvent(), new JellyfishRisingEvent(), + new TornadoFormCollapseEvent(), // Conversation/dialogue/exploration new ConversationEvent(), new ConversationStartEndEvent(), diff --git a/QSB/TornadoSync/Events/TornadoFormCollapseEvent.cs b/QSB/TornadoSync/Events/TornadoFormCollapseEvent.cs new file mode 100644 index 00000000..c5b16d81 --- /dev/null +++ b/QSB/TornadoSync/Events/TornadoFormCollapseEvent.cs @@ -0,0 +1,32 @@ +using QSB.Events; +using QSB.TornadoSync.WorldObjects; +using QSB.WorldSync; +using QSB.WorldSync.Events; + +namespace QSB.TornadoSync.Events +{ + public class TornadoFormCollapseEvent : QSBEvent + { + public override bool RequireWorldObjectsReady => true; + + public override void SetupListener() + => GlobalMessenger.AddListener(EventNames.QSBJellyfishRising, Handler); + + public override void CloseListener() + => GlobalMessenger.RemoveListener(EventNames.QSBJellyfishRising, Handler); + + private void Handler(QSBTornado qsbTornado, bool formCollapse) => SendEvent(CreateMessage(qsbTornado, formCollapse)); + + private BoolWorldObjectMessage CreateMessage(QSBTornado qsbTornado, bool formCollapse) => new() + { + ObjectId = qsbTornado.ObjectId, + State = formCollapse + }; + + public override void OnReceiveRemote(bool isHost, BoolWorldObjectMessage message) + { + var qsbTornado = QSBWorldSync.GetWorldFromId(message.ObjectId); + qsbTornado.FormCollapse(message.State); + } + } +} diff --git a/QSB/TornadoSync/Patches/TornadoPatches.cs b/QSB/TornadoSync/Patches/TornadoPatches.cs index d037e165..c2d2e514 100644 --- a/QSB/TornadoSync/Patches/TornadoPatches.cs +++ b/QSB/TornadoSync/Patches/TornadoPatches.cs @@ -1,4 +1,11 @@ -using QSB.Patches; +using HarmonyLib; +using QSB.AuthoritySync; +using QSB.Events; +using QSB.JellyfishSync.WorldObjects; +using QSB.Patches; +using QSB.TornadoSync.WorldObjects; +using QSB.WorldSync; +using UnityEngine; namespace QSB.TornadoSync.Patches { @@ -6,6 +13,61 @@ namespace QSB.TornadoSync.Patches { public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; + [HarmonyPrefix] + [HarmonyPatch(typeof(TornadoController), nameof(TornadoController.FixedUpdate))] + public static bool FixedUpdate(TornadoController __instance) + { + if (QSBCore.IsHost && __instance._secondsUntilFormation > 0f) + { + __instance._secondsUntilFormation -= Time.fixedDeltaTime; + if (__instance._secondsUntilFormation < 0f) + { + __instance.StartFormation(); + var qsbTornado = QSBWorldSync.GetWorldFromUnity(__instance); + QSBEventManager.FireEvent(EventNames.QSBTornadoFormCollapse, qsbTornado, true); + return false; + } + } + else + { + if (__instance._tornadoCollapsing) + { + __instance.UpdateCollapse(); + } + else if (__instance._tornadoForming) + { + __instance.UpdateFormation(); + } + if (__instance._isSectorOccupied) + { + __instance.UpdateAnimation(); + if (__instance._wander) + { + var num = Mathf.PerlinNoise(Time.time * __instance._wanderRate, 0f) * 2f - 1f; + var num2 = Mathf.PerlinNoise(Time.time * __instance._wanderRate, 5f) * 2f - 1f; + var localEulerAngles = new Vector3(num * __instance._wanderDegreesX, 0f, num2 * __instance._wanderDegreesZ); + __instance.transform.localEulerAngles = localEulerAngles; + } + } + } + return false; + } + + + [HarmonyPrefix] + [HarmonyPatch(typeof(TornadoController), nameof(TornadoController.OnEnterCollapseTrigger))] + public static bool OnEnterCollapseTrigger(TornadoController __instance, + GameObject hitObject) + { + if (QSBCore.IsHost && hitObject.GetComponentInParent().GetMass() > 50f) + { + __instance.StartCollapse(); + var qsbTornado = QSBWorldSync.GetWorldFromUnity(__instance); + QSBEventManager.FireEvent(EventNames.QSBTornadoFormCollapse, qsbTornado, false); + } + + return false; + } } } diff --git a/QSB/TornadoSync/TornadoManager.cs b/QSB/TornadoSync/TornadoManager.cs index 5d4eae86..9181beb5 100644 --- a/QSB/TornadoSync/TornadoManager.cs +++ b/QSB/TornadoSync/TornadoManager.cs @@ -13,6 +13,7 @@ namespace QSB.TornadoSync { QSBWorldSync.Init(); + return; if (!QSBCore.IsHost) { return; diff --git a/QSB/TornadoSync/WorldObjects/QSBTornado.cs b/QSB/TornadoSync/WorldObjects/QSBTornado.cs index b29ed573..83293199 100644 --- a/QSB/TornadoSync/WorldObjects/QSBTornado.cs +++ b/QSB/TornadoSync/WorldObjects/QSBTornado.cs @@ -1,4 +1,5 @@ -using QSB.WorldSync; +using QSB.Utility; +using QSB.WorldSync; namespace QSB.TornadoSync.WorldObjects { @@ -9,5 +10,19 @@ namespace QSB.TornadoSync.WorldObjects ObjectId = id; AttachedObject = attachedObject; } + + public void FormCollapse(bool formCollapse) + { + if (formCollapse) + { + AttachedObject.StartFormation(); + DebugLog.DebugWrite($"{LogName} form"); + } + else + { + AttachedObject.StartCollapse(); + DebugLog.DebugWrite($"{LogName} collapse"); + } + } } }