form collapse event

This commit is contained in:
JohnCorby 2021-12-05 03:41:07 -08:00
parent eb44b9e385
commit 85ef887698
6 changed files with 115 additions and 2 deletions

View File

@ -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);
}
}

View File

@ -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(),

View File

@ -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<BoolWorldObjectMessage>
{
public override bool RequireWorldObjectsReady => true;
public override void SetupListener()
=> GlobalMessenger<QSBTornado, bool>.AddListener(EventNames.QSBJellyfishRising, Handler);
public override void CloseListener()
=> GlobalMessenger<QSBTornado, bool>.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<QSBTornado>(message.ObjectId);
qsbTornado.FormCollapse(message.State);
}
}
}

View File

@ -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<QSBTornado>(__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<OWRigidbody>().GetMass() > 50f)
{
__instance.StartCollapse();
var qsbTornado = QSBWorldSync.GetWorldFromUnity<QSBTornado>(__instance);
QSBEventManager.FireEvent(EventNames.QSBTornadoFormCollapse, qsbTornado, false);
}
return false;
}
}
}

View File

@ -13,6 +13,7 @@ namespace QSB.TornadoSync
{
QSBWorldSync.Init<QSBTornado, TornadoController>();
return;
if (!QSBCore.IsHost)
{
return;

View File

@ -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");
}
}
}
}