using ABI.CCK.Components; using ABI_RC.Core.Player; using ABI_RC.Systems.IK; using System; using System.Reflection; namespace ml_lme { static class GameEvents { internal class GameEvent { event Action m_action; public void AddListener(Action p_listener) => m_action += p_listener; public void RemoveListener(Action p_listener) => m_action -= p_listener; public void Invoke() => m_action?.Invoke(); } internal class GameEvent { event Action m_action; public void AddListener(Action p_listener) => m_action += p_listener; public void RemoveListener(Action p_listener) => m_action -= p_listener; public void Invoke(T1 p_obj) => m_action?.Invoke(p_obj); } public static readonly GameEvent OnAvatarReuse = new GameEvent(); public static readonly GameEvent OnRayScale = new GameEvent(); public static readonly GameEvent OnPlayspaceScale = new GameEvent(); public static readonly GameEvent OnPickupGrab = new GameEvent(); internal static void Init(HarmonyLib.Harmony p_instance) { try { p_instance.Patch( typeof(IKSystem).GetMethod(nameof(IKSystem.ReinitializeAvatar), BindingFlags.Instance | BindingFlags.Public), null, new HarmonyLib.HarmonyMethod(typeof(GameEvents).GetMethod(nameof(OnAvatarReinitialize_Postfix), BindingFlags.Static | BindingFlags.NonPublic)) ); p_instance.Patch( typeof(PlayerSetup).GetMethod("SetControllerRayScale", BindingFlags.Instance | BindingFlags.NonPublic), null, new HarmonyLib.HarmonyMethod(typeof(GameEvents).GetMethod(nameof(OnRayScale_Postfix), BindingFlags.Static | BindingFlags.NonPublic)) ); p_instance.Patch( typeof(PlayerSetup).GetMethod("SetPlaySpaceScale", BindingFlags.Instance | BindingFlags.NonPublic), null, new HarmonyLib.HarmonyMethod(typeof(GameEvents).GetMethod(nameof(OnPlayspaceScale_Postfix), BindingFlags.Static | BindingFlags.NonPublic)) ); p_instance.Patch( typeof(CVRPickupObject).GetMethod(nameof(CVRPickupObject.Grab), BindingFlags.Instance | BindingFlags.Public), null, new HarmonyLib.HarmonyMethod(typeof(GameEvents).GetMethod(nameof(OnPickupGrab_Postfix), BindingFlags.Static | BindingFlags.NonPublic)) ); } catch(Exception e) { MelonLoader.MelonLogger.Error(e); } } static void OnAvatarReinitialize_Postfix() { try { OnAvatarReuse.Invoke(); } catch(Exception e) { MelonLoader.MelonLogger.Error(e); } } static void OnRayScale_Postfix(float scale) { try { OnRayScale.Invoke(scale); } catch(Exception e) { MelonLoader.MelonLogger.Error(e); } } static void OnPlayspaceScale_Postfix(float ____avatarScaleRelation) { try { OnPlayspaceScale.Invoke(____avatarScaleRelation); } catch(Exception e) { MelonLoader.MelonLogger.Error(e); } } static void OnPickupGrab_Postfix(ref CVRPickupObject __instance) { try { OnPickupGrab.Invoke(__instance); } catch(Exception e) { MelonLoader.MelonLogger.Error(e); } } } }