From eac41a7c9e706e61fecf0d90ce883f1329e06df1 Mon Sep 17 00:00:00 2001 From: XtraCube <72575280+XtraCube@users.noreply.github.com> Date: Sun, 24 Nov 2024 18:27:14 -0500 Subject: [PATCH] events 2 electric boogaloo --- MiraAPI.Example/ExamplePlugin.cs | 24 ++++++++++------ .../Events/Mira/MiraButtonCancelledEvent.cs | 13 ++++++++- MiraAPI/Events/Mira/MiraButtonClickEvent.cs | 13 ++++++++- MiraAPI/Events/MiraCancelableEvent.cs | 28 +++++++++++++++++++ MiraAPI/Events/MiraEvent.cs | 18 ++---------- MiraAPI/Events/MiraEventManager.cs | 11 +++++++- MiraAPI/Events/Vanilla/BeforeMurderEvent.cs | 23 ++++++++++++++- MiraAPI/Hud/CustomActionButton.cs | 17 ++++++----- 8 files changed, 112 insertions(+), 35 deletions(-) create mode 100644 MiraAPI/Events/MiraCancelableEvent.cs diff --git a/MiraAPI.Example/ExamplePlugin.cs b/MiraAPI.Example/ExamplePlugin.cs index 45309eb..06adad0 100644 --- a/MiraAPI.Example/ExamplePlugin.cs +++ b/MiraAPI.Example/ExamplePlugin.cs @@ -3,11 +3,13 @@ using BepInEx.Configuration; using BepInEx.Unity.IL2CPP; using HarmonyLib; using MiraAPI.Events; -using MiraAPI.Events.Vanilla; +using MiraAPI.Events.Mira; +using MiraAPI.Example.Buttons.Freezer; using MiraAPI.PluginLoading; using Reactor; using Reactor.Networking; using Reactor.Networking.Attributes; +using Reactor.Utilities; namespace MiraAPI.Example; @@ -23,14 +25,18 @@ public partial class ExamplePlugin : BasePlugin, IMiraPlugin public ConfigFile GetConfigFile() => Config; public override void Load() { - MiraEventManager.RegisterEventHandler( - e => - { - if (e.Source.PlayerId == PlayerControl.LocalPlayer.PlayerId) - { - e.Cancel(); - } - }); + MiraEventManager.RegisterEventHandler>(e=> + { + Logger.Warning("Freeze button clicked!"); + e.Cancel(); + e.Button.SetTimer(5f); + }); + + MiraEventManager.RegisterEventHandler>(e=> + { + Logger.Warning("Freeze button cancelled!"); + e.Button.OverrideName("Freeze Canceled"); + }); Harmony.PatchAll(); } } diff --git a/MiraAPI/Events/Mira/MiraButtonCancelledEvent.cs b/MiraAPI/Events/Mira/MiraButtonCancelledEvent.cs index cb0e0e1..41c8bba 100644 --- a/MiraAPI/Events/Mira/MiraButtonCancelledEvent.cs +++ b/MiraAPI/Events/Mira/MiraButtonCancelledEvent.cs @@ -2,10 +2,21 @@ namespace MiraAPI.Events.Mira; -public class MiraButtonCancelledEvent : MiraEvent where T : CustomActionButton +/// +/// Invoked when a Mira Button click is cancelled. Do not use for vanilla buttons. +/// +/// The Mira Button type. +public sealed class MiraButtonCancelledEvent : MiraEvent where T : CustomActionButton { + /// + /// Gets Mira Button whose click was cancelled. + /// public T Button { get; } + /// + /// Initializes a new instance of the class. + /// + /// The Mira Button whose click was cancelled. public MiraButtonCancelledEvent(T button) { Button = button; diff --git a/MiraAPI/Events/Mira/MiraButtonClickEvent.cs b/MiraAPI/Events/Mira/MiraButtonClickEvent.cs index 8553760..c517f5c 100644 --- a/MiraAPI/Events/Mira/MiraButtonClickEvent.cs +++ b/MiraAPI/Events/Mira/MiraButtonClickEvent.cs @@ -2,10 +2,21 @@ namespace MiraAPI.Events.Mira; -public class MiraButtonClickEvent : MiraCancelableEvent where T : CustomActionButton +/// +/// Button click event for Mira Buttons only. Do not use for vanilla buttons. +/// +/// The Mira Button type. +public sealed class MiraButtonClickEvent : MiraCancelableEvent where T : CustomActionButton { + /// + /// Gets Mira Button that was clicked. + /// public T Button { get; } + /// + /// Initializes a new instance of the class. + /// + /// The Mira Button that was clicked. public MiraButtonClickEvent(T button) { Button = button; diff --git a/MiraAPI/Events/MiraCancelableEvent.cs b/MiraAPI/Events/MiraCancelableEvent.cs new file mode 100644 index 0000000..b4d3f05 --- /dev/null +++ b/MiraAPI/Events/MiraCancelableEvent.cs @@ -0,0 +1,28 @@ +namespace MiraAPI.Events; + +/// +/// Abstract class for Mira Events that can be cancelled. +/// +public abstract class MiraCancelableEvent : MiraEvent +{ + /// + /// Gets a value indicating whether the event is cancelled. + /// + public bool IsCancelled { get; private set; } + + /// + /// Cancels the event. + /// + public void Cancel() + { + IsCancelled = true; + } + + /// + /// Uncancels the event. + /// + public void UnCancel() + { + IsCancelled = false; + } +} diff --git a/MiraAPI/Events/MiraEvent.cs b/MiraAPI/Events/MiraEvent.cs index dc5d484..f0f49bd 100644 --- a/MiraAPI/Events/MiraEvent.cs +++ b/MiraAPI/Events/MiraEvent.cs @@ -1,18 +1,6 @@ namespace MiraAPI.Events; +/// +/// Abstract class for Mira Events. +/// public abstract class MiraEvent; - -public abstract class MiraCancelableEvent : MiraEvent -{ - public bool IsCancelled { get; private set; } - - public void Cancel() - { - IsCancelled = true; - } - - public void UnCancel() - { - IsCancelled = false; - } -} diff --git a/MiraAPI/Events/MiraEventManager.cs b/MiraAPI/Events/MiraEventManager.cs index 7d6b044..e76f512 100644 --- a/MiraAPI/Events/MiraEventManager.cs +++ b/MiraAPI/Events/MiraEventManager.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Reactor.Utilities; namespace MiraAPI.Events; @@ -17,7 +18,14 @@ public static class MiraEventManager /// Type of Event. public static void InvokeEvent(T eventInstance) where T : MiraEvent { - foreach (var handler in EventHandlers[typeof(T)]) + EventHandlers.TryGetValue(typeof(T), out var handlers); + if (handlers == null) + { + Logger.Warning("No handlers for event " + typeof(T).Name); + return; + } + + foreach (var handler in handlers) { ((Action)handler).Invoke(eventInstance); } @@ -35,5 +43,6 @@ public static class MiraEventManager EventHandlers.Add(typeof(T), []); } EventHandlers[typeof(T)].Add(handler); + Logger.Info("Registered event handler for " + typeof(T).Name); } } diff --git a/MiraAPI/Events/Vanilla/BeforeMurderEvent.cs b/MiraAPI/Events/Vanilla/BeforeMurderEvent.cs index a58aa80..f4f2be3 100644 --- a/MiraAPI/Events/Vanilla/BeforeMurderEvent.cs +++ b/MiraAPI/Events/Vanilla/BeforeMurderEvent.cs @@ -1,7 +1,28 @@ namespace MiraAPI.Events.Vanilla; -public class BeforeMurderEvent : MiraCancelableEvent +/// +/// Event that is invoked before a player is murdered. This event is cancelable. +/// +public sealed class BeforeMurderEvent : MiraCancelableEvent { + /// + /// Gets the player that is killing the target. + /// public PlayerControl Source { get; } + + /// + /// Gets the player that is being killed. + /// public PlayerControl Target { get; } + + /// + /// Initializes a new instance of the class. + /// + /// The player that is killing the target. + /// The player that is being killed. + public BeforeMurderEvent(PlayerControl source, PlayerControl target) + { + Source = source; + Target = target; + } } diff --git a/MiraAPI/Hud/CustomActionButton.cs b/MiraAPI/Hud/CustomActionButton.cs index 64d4eb0..c1abbb6 100644 --- a/MiraAPI/Hud/CustomActionButton.cs +++ b/MiraAPI/Hud/CustomActionButton.cs @@ -1,9 +1,11 @@ -using MiraAPI.Events; +using System; +using MiraAPI.Events; using MiraAPI.Events.Mira; using MiraAPI.Utilities.Assets; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; +using Object = UnityEngine.Object; namespace MiraAPI.Hud; @@ -99,17 +101,18 @@ public abstract class CustomActionButton pb.OnClick = new Button.ButtonClickedEvent(); pb.OnClick.AddListener((UnityAction)(() => { - var @event = new MiraButtonClickEvent(this); + var eventType = typeof(MiraButtonClickEvent<>).MakeGenericType(GetType()); + var @event = (MiraCancelableEvent)Activator.CreateInstance(eventType, this)!; MiraEventManager.InvokeEvent(@event); - if (!@event.IsCancelled) - { - ClickHandler(); - } - else + if (@event.IsCancelled) { var cancelledEvent = new MiraButtonCancelledEvent(this); MiraEventManager.InvokeEvent(cancelledEvent); } + else + { + ClickHandler(); + } })); }