diff --git a/MiraAPI.Example/ExampleEventHandlers.cs b/MiraAPI.Example/ExampleEventHandlers.cs index 03eb2d48..231d2022 100644 --- a/MiraAPI.Example/ExampleEventHandlers.cs +++ b/MiraAPI.Example/ExampleEventHandlers.cs @@ -1,5 +1,6 @@ using MiraAPI.Events; using MiraAPI.Events.Mira; +using MiraAPI.Events.Vanilla; using MiraAPI.Example.Buttons.Freezer; using Reactor.Utilities; @@ -12,6 +13,28 @@ public static class ExampleEventHandlers // Register event handlers here MiraEventManager.RegisterEventHandler>(FreezeButtonClickHandler, 1); MiraEventManager.RegisterEventHandler>(FreezeButtonCancelledHandler); + MiraEventManager.RegisterEventHandler(EnterVentHandler); + MiraEventManager.RegisterEventHandler(ExitVentHandler); + } + + public static void EnterVentHandler(EnterVentEvent @event) + { + Logger.Warning("Entering vent!"); + var random = new System.Random(); + if (random.Next(0, 2) == 0) + { + @event.Cancel(); + } + } + + public static void ExitVentHandler(ExitVentEvent @event) + { + Logger.Warning("Exiting vent!"); + var random = new System.Random(); + if (random.Next(0, 2) == 0) + { + @event.Cancel(); + } } // Example event handler diff --git a/MiraAPI.Example/ExamplePlugin.cs b/MiraAPI.Example/ExamplePlugin.cs index be16a94d..4a62da25 100644 --- a/MiraAPI.Example/ExamplePlugin.cs +++ b/MiraAPI.Example/ExamplePlugin.cs @@ -25,6 +25,7 @@ public partial class ExamplePlugin : BasePlugin, IMiraPlugin public ConfigFile GetConfigFile() => Config; public override void Load() { + ExampleEventHandlers.Initialize(); Harmony.PatchAll(); } } diff --git a/MiraAPI/Events/Vanilla/EnterVentEvent.cs b/MiraAPI/Events/Vanilla/EnterVentEvent.cs index eb6ddbb0..63e872c0 100644 --- a/MiraAPI/Events/Vanilla/EnterVentEvent.cs +++ b/MiraAPI/Events/Vanilla/EnterVentEvent.cs @@ -13,14 +13,14 @@ public class EnterVentEvent : MiraCancelableEvent /// /// Gets the vent that the player is entering. /// - public Vent Vent { get; } + public Vent? Vent { get; } /// /// Initializes a new instance of the class. /// /// The player that is entering the vent. /// The vent being entered. - public EnterVentEvent(PlayerControl player, Vent vent) + public EnterVentEvent(PlayerControl player, Vent? vent) { Player = player; Vent = vent; diff --git a/MiraAPI/Events/Vanilla/ExitVentEvent.cs b/MiraAPI/Events/Vanilla/ExitVentEvent.cs index d2851633..1269b8ac 100644 --- a/MiraAPI/Events/Vanilla/ExitVentEvent.cs +++ b/MiraAPI/Events/Vanilla/ExitVentEvent.cs @@ -13,14 +13,14 @@ public class ExitVentEvent : MiraCancelableEvent /// /// Gets the vent that the player is exiting. /// - public Vent Vent { get; } + public Vent? Vent { get; } /// /// Initializes a new instance of the class. /// /// The player who is exiting the vent. /// The vent being exited from. - public ExitVentEvent(PlayerControl player, Vent vent) + public ExitVentEvent(PlayerControl player, Vent? vent) { Player = player; Vent = vent; diff --git a/MiraAPI/Events/Vanilla/UpdateSystemEvent.cs b/MiraAPI/Events/Vanilla/UpdateSystemEvent.cs index 3353c365..1ac8bdaf 100644 --- a/MiraAPI/Events/Vanilla/UpdateSystemEvent.cs +++ b/MiraAPI/Events/Vanilla/UpdateSystemEvent.cs @@ -10,6 +10,11 @@ public class UpdateSystemEvent : MiraCancelableEvent /// public SystemTypes SystemType { get; } + /// + /// Gets the player that is updating the system. + /// + public PlayerControl Player { get; } + /// /// Gets the byte amount the system is being updated by. /// @@ -20,9 +25,10 @@ public class UpdateSystemEvent : MiraCancelableEvent /// /// The SystemType being updated. /// Amount to update System to. - public UpdateSystemEvent(SystemTypes systemType, byte amount) + public UpdateSystemEvent(SystemTypes systemType, PlayerControl player, byte amount) { SystemType = systemType; + Player = player; Amount = amount; } } diff --git a/MiraAPI/Patches/Events/SabotageEventPatches.cs b/MiraAPI/Patches/Events/SabotageEventPatches.cs index b74d81f5..fc93bdd6 100644 --- a/MiraAPI/Patches/Events/SabotageEventPatches.cs +++ b/MiraAPI/Patches/Events/SabotageEventPatches.cs @@ -11,10 +11,10 @@ namespace MiraAPI.Patches.Events; public static class SabotageEventPatches { [HarmonyPrefix] - [HarmonyPatch(typeof(ShipStatus), nameof(ShipStatus.UpdateSystem), typeof(SystemTypes), typeof(byte))] - public static bool ShipStatusUpdateSystemPrefix(ShipStatus __instance, SystemTypes systemType, byte amount) + [HarmonyPatch(typeof(ShipStatus), nameof(ShipStatus.UpdateSystem), typeof(SystemTypes), typeof(PlayerControl), typeof(byte))] + public static bool ShipStatusUpdateSystemPrefix(ShipStatus __instance, SystemTypes systemType, PlayerControl player, byte amount) { - var @event = new UpdateSystemEvent(systemType, amount); + var @event = new UpdateSystemEvent(systemType, player, amount); MiraEventManager.InvokeEvent(@event); return !@event.IsCancelled; } diff --git a/MiraAPI/Patches/Events/VentEventPatches.cs b/MiraAPI/Patches/Events/VentEventPatches.cs index 6b01af91..667f35ad 100644 --- a/MiraAPI/Patches/Events/VentEventPatches.cs +++ b/MiraAPI/Patches/Events/VentEventPatches.cs @@ -1,6 +1,10 @@ -using HarmonyLib; +using System.Linq; +using BepInEx.Unity.IL2CPP.Utils.Collections; +using HarmonyLib; using MiraAPI.Events; using MiraAPI.Events.Vanilla; +using MiraAPI.Utilities; +using Reactor.Utilities; namespace MiraAPI.Patches.Events; @@ -10,19 +14,58 @@ namespace MiraAPI.Patches.Events; [HarmonyPatch] public static class VentEventPatches { - [HarmonyPrefix] - [HarmonyPatch(typeof(Vent), nameof(Vent.EnterVent))] - public static void EnterVentPrefix(Vent __instance, PlayerControl pc) + private static bool _showButtons; + + [HarmonyPostfix] + [HarmonyPatch(typeof(VentButton), nameof(VentButton.DoClick))] + public static void VentUsePostfix(VentButton __instance) { - var @event = new EnterVentEvent(pc, __instance); - MiraEventManager.InvokeEvent(@event); + __instance.currentTarget?.SetButtons(_showButtons); } [HarmonyPrefix] - [HarmonyPatch(typeof(Vent), nameof(Vent.ExitVent))] - public static void ExitVentPrefix(Vent __instance, PlayerControl pc) + [HarmonyPatch(typeof(PlayerPhysics), nameof(PlayerPhysics.CoEnterVent))] + public static bool EnterVentPrefix(PlayerPhysics __instance, int id, ref Il2CppSystem.Collections.IEnumerator __result) { - var @event = new ExitVentEvent(pc, __instance); + var pc = __instance.myPlayer; + var vent = ShipStatus.Instance.AllVents.FirstOrDefault(v => v.Id == id); + + var @event = new EnterVentEvent(pc, vent); MiraEventManager.InvokeEvent(@event); + + if (@event.IsCancelled) + { + Logger.Error("Enter vent event cancelled!"); + __result = Helpers.EmptyCoroutine().WrapToIl2Cpp(); + } + + if (pc.AmOwner) + { + _showButtons = !@event.IsCancelled; + } + return !@event.IsCancelled; + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(PlayerPhysics), nameof(PlayerPhysics.CoExitVent))] + public static bool ExitVentPrefix(PlayerPhysics __instance, int id, ref Il2CppSystem.Collections.IEnumerator __result) + { + var pc = __instance.myPlayer; + var vent = ShipStatus.Instance.AllVents.First(v => v.Id == id); + + var @event = new ExitVentEvent(pc, vent); + MiraEventManager.InvokeEvent(@event); + + if (@event.IsCancelled) + { + Logger.Error("Exit vent event cancelled!"); + __result = Helpers.EmptyCoroutine().WrapToIl2Cpp(); + } + + if (pc.AmOwner) + { + _showButtons = @event.IsCancelled; + } + return !@event.IsCancelled; } } diff --git a/MiraAPI/Utilities/Helpers.cs b/MiraAPI/Utilities/Helpers.cs index fda3e034..24ad24f0 100644 --- a/MiraAPI/Utilities/Helpers.cs +++ b/MiraAPI/Utilities/Helpers.cs @@ -1,4 +1,5 @@ -using MiraAPI.Roles; +using System.Collections; +using MiraAPI.Roles; using System.Collections.Generic; using System.Globalization; using System.Linq; @@ -14,6 +15,15 @@ namespace MiraAPI.Utilities; /// public static class Helpers { + /// + /// Returns an empty coroutine. + /// + /// Empty coroutine. + public static IEnumerator EmptyCoroutine() + { + yield break; + } + /// /// Creates a ContactFilter2D from a layer mask. ///