internal static void Load() { On.Celeste.Player.Jump += Player_Jump; // Oh. hooking methods that return an `IEnumerator` (used in Coroutines) need some special treatment, see hooking method for details. On.Celeste.Strawberry.CollectRoutine += Strawberry_CollectRoutine; // Manually construct an On. hook // This is useful when the method you're trying to hook isn't parsed by MonoMod.RuntimeDetour.HookGen (it isn't available using the regular method) // This applies to Property accessors (as shown here), Compiler generated methods (as shown further down) or methods defined in other assemblies. hook_Player_get_MaxDashes = new Hook( typeof(Player).GetProperty("MaxDashes").GetGetMethod(), typeof(Hooks).GetMethod("Player_get_MaxDashes", BindingFlags.NonPublic | BindingFlags.Static) ); IL.Celeste.Player.ClimbHop += Player_ClimbHop; // This constructs a new IL. hook similarly to the manually constructed On. hook above. // Since DashCoroutine is an iterator method, there are some behind-the-scenes things done that make it so we can't directly modify Player.DashCoroutine // Instead we are modifying a compiler generated method, which can be easily retrieved using GetStateMachineTarget (provided by MonoMod) // To explore these methods and learn how they work, enable "View -> Show all types and members" (ILSpy) OR // disable "View -> Options -> Decompiler -> Show hidden compiler generated types and methods" (DnSpy). hook_Player_DashCoroutine = new ILHook( typeof(Player).GetMethod("DashCoroutine", BindingFlags.NonPublic | BindingFlags.Instance).GetStateMachineTarget(), Player_DashCoroutine ); }
public void _Remove(Delegate hookDelegate) { if (hookDelegate == null) { return; } // Note: A hook delegate can be applied multiple times. // The following code removes the last hook of that delegate type. if (!HookMap.TryGetValue(hookDelegate, out Stack <IDetour> hooks)) { return; } IDetour hook = hooks.Pop(); hook.Dispose(); if (hooks.Count == 0) { HookMap.Remove(hookDelegate); } HookList.Remove(hook); }
public static void Load() { On.Celeste.Player.ctor += Player_ctor; On.Celeste.Player.DashBegin += Player_DashBegin; On.Celeste.Player.CreateTrail += Player_CreateTrail; On.Celeste.Player.OnCollideH += Player_OnCollideH; On.Celeste.Player.OnCollideV += Player_OnCollideV; On.Celeste.Player.DreamDashCheck += Player_DreamDashCheck; On.Celeste.Player.Update += Player_Update; On.Celeste.Player.Die += Player_Die; hook_Player_DashCoroutine = new ILHook( typeof(Player).GetMethod("DashCoroutine", BindingFlags.NonPublic | BindingFlags.Instance).GetStateMachineTarget(), Player_DashCoroutine); IL.Celeste.Player.IsRiding_Solid += State_DreamDashEqual; IL.Celeste.Player.IsRiding_JumpThru += Player_IsRiding_JumpThru; IL.Celeste.Player.OnCollideH += State_DreamDashEqual; IL.Celeste.Player.OnCollideV += State_DreamDashEqual; hook_Player_orig_Update = new ILHook( typeof(Player).GetMethod("orig_Update"), Player_orig_Update); hook_Player_orig_UpdateSprite = new ILHook( typeof(Player).GetMethod("orig_UpdateSprite", BindingFlags.NonPublic | BindingFlags.Instance), State_DreamDashEqual); On.Celeste.Level.EnforceBounds += Level_EnforceBounds; On.Celeste.Player.OnBoundsH += Player_OnBoundsH; On.Celeste.Player.OnBoundsV += Player_OnBoundsV; IL.Celeste.FakeWall.Update += State_DreamDashNotEqual; IL.Celeste.Spring.OnCollide += State_DreamDashEqual; IL.Celeste.Solid.Update += State_DreamDashNotEqual_And; }
public override void Load() { On.Celeste.OuiChapterPanel.Reset += CustomiseChapterPanel; On.Celeste.OuiChapterPanel.IsStart += FixReturnFromAltSide; On.Celeste.OuiChapterPanel.UpdateStats += FixSettingAltSideStats; On.Celeste.OuiChapterPanel.SetStatsPosition += FixSettingAltSideStatPositions; On.Celeste.AreaData.Load += PostAreaLoad; On.Celeste.OuiChapterSelect.Added += HideAltSides; On.Celeste.OuiChapterSelect.IsStart += ReturnToAltSide; On.Celeste.Poem.ctor += SetPoemColour; On.Celeste.DeathsCounter.SetMode += SetDeathsCounterIcon; On.Celeste.HeartGem.Awake += SetCrystalHeartSprite; On.Celeste.AreaComplete.GetCustomCompleteScreenTitle += SetAltSideEndScreenTitle; //IL.Celeste.OuiJournalProgress.ctor += OnJournalProgressPageConstruct; hook_OuiChapterPanel_set_option = new Hook( typeof(OuiChapterPanel).GetProperty("option", BindingFlags.NonPublic | BindingFlags.Instance).GetSetMethod(true), typeof(AltSidesHelperModule).GetMethod("OnChapterPanelChangeOption", BindingFlags.NonPublic | BindingFlags.Static) ); hook_OuiChapterPanel_get_option = new Hook( typeof(OuiChapterPanel).GetProperty("option", BindingFlags.NonPublic | BindingFlags.Instance).GetGetMethod(true), typeof(AltSidesHelperModule).GetMethod("OnChapterPanelGetOption", BindingFlags.NonPublic | BindingFlags.Static) ); hook_OuiChapterSelect_get_area = new Hook( typeof(OuiChapterSelect).GetProperty("area", BindingFlags.NonPublic | BindingFlags.Instance).GetGetMethod(true), typeof(AltSidesHelperModule).GetMethod("OnChapterSelectGetArea", BindingFlags.NonPublic | BindingFlags.Static) ); hook_LevelSetStats_get_MaxArea = new Hook( typeof(LevelSetStats).GetProperty("MaxArea", BindingFlags.Public | BindingFlags.Instance).GetGetMethod(), typeof(AltSidesHelperModule).GetMethod("OnLevelSetStatsGetMaxArea", BindingFlags.NonPublic | BindingFlags.Static) ); }
public static void Unhook() { ControllerHook.Dispose(); ControllerHook = null; On.Celeste.MoveBlock.UpdateColors -= MoveBlock_UpdateColors; On.Monocle.Scene.BeforeUpdate -= Scene_BeforeUpdate; }
internal bool UnregisterDetour(IDetour _detour) { if (DetourOwners.TryGetValue(_detour, out Assembly owner)) { DetourOwners.Remove(_detour); OwnedDetourLists[owner].Remove(_detour); } return(true); }
internal void TrackDetour(Assembly owner, IDetour detour) { if (!OwnedDetourLists.TryGetValue(owner, out List <IDetour> list)) { OwnedDetourLists[owner] = list = new List <IDetour>(); } list.Add(detour); DetourOwners[detour] = owner; }
private static void InstallInternalEx(List <DestAndOri> destAndOris) { foreach (DestAndOri destAndOri in destAndOris) { MethodInfo src = destAndOri.Src; MethodInfo dest = destAndOri.Dest; MethodInfo ori = destAndOri.Ori; IDetour engine = DetourFactory.CreateDetourEngine(); engine.Patch(src, dest, ori); } }
public static void Hook() { // For replacing the active color (green -> custom) On.Celeste.MoveBlock.UpdateColors += MoveBlock_UpdateColors; // For syncing movement On.Monocle.Scene.BeforeUpdate += Scene_BeforeUpdate; // For custom speed and syncing movement ControllerHook = new ILHook(Controller, MoveBlock_Controller); Logger.Log("Nyah Helper", "Synced Move Block hooks executed"); }
private void _Add <TDelegate>(Func <MethodBase, TDelegate, IDetour> gen, TDelegate hookDelegate) where TDelegate : Delegate { if (hookDelegate == null) { return; } if (!HookMap.TryGetValue(hookDelegate, out Stack <IDetour> hooks)) { HookMap[hookDelegate] = hooks = new Stack <IDetour>(); } IDetour hook = gen(Method, hookDelegate); hooks.Push(hook); HookList.Add(hook); }
public override void Load() { On.Celeste.OuiChapterPanel.Reset += CustomiseChapterPanel; On.Celeste.OuiChapterPanel.IsStart += FixReturnFromAltSide; On.Celeste.OuiChapterPanel.UpdateStats += FixSettingAltSideStats; On.Celeste.OuiChapterPanel.SetStatsPosition += FixSettingAltSideStatPositions; On.Celeste.AreaData.Load += PostAreaLoad; On.Celeste.AreaData.AreaComparison += SortAltSidesLast; On.Celeste.OuiChapterSelect.Added += HideAltSides; On.Celeste.OuiChapterSelect.IsStart += ReturnToAltSide; On.Celeste.Poem.ctor += SetPoemColour; On.Celeste.DeathsCounter.SetMode += SetDeathsCounterIcon; On.Celeste.HeartGem.Awake += SetCrystalHeartSprite; On.Celeste.AreaComplete.GetCustomCompleteScreenTitle += SetAltSideEndScreenTitle; On.Celeste.LevelEnter.Routine += AddAltSideRemixTitle; IL.Celeste.OuiJournalProgress.ctor += ModJournalProgressPageConstruct; hook_OuiChapterPanel_set_option = new Hook( typeof(OuiChapterPanel).GetProperty("option", BindingFlags.NonPublic | BindingFlags.Instance).GetSetMethod(true), typeof(AltSidesHelperModule).GetMethod("OnChapterPanelChangeOption", BindingFlags.NonPublic | BindingFlags.Static) ); hook_OuiChapterPanel_get_option = new Hook( typeof(OuiChapterPanel).GetProperty("option", BindingFlags.NonPublic | BindingFlags.Instance).GetGetMethod(true), typeof(AltSidesHelperModule).GetMethod("OnChapterPanelGetOption", BindingFlags.NonPublic | BindingFlags.Static) ); hook_OuiChapterSelect_get_area = new Hook( typeof(OuiChapterSelect).GetProperty("area", BindingFlags.NonPublic | BindingFlags.Instance).GetGetMethod(true), typeof(AltSidesHelperModule).GetMethod("OnChapterSelectGetArea", BindingFlags.NonPublic | BindingFlags.Static) ); hook_Session_get_FullClear = new Hook( typeof(Session).GetProperty("FullClear", BindingFlags.Public | BindingFlags.Instance).GetGetMethod(), typeof(AltSidesHelperModule).GetMethod("OnSessionGetFullClear", BindingFlags.NonPublic | BindingFlags.Static) ); mod_OuiFileSelectSlot_orig_Render = new ILHook( typeof(OuiFileSelectSlot).GetMethod("orig_Render", BindingFlags.Public | BindingFlags.Instance), ModFileSelectSlotRender ); Logger.SetLogLevel("AltSidesHelper", LogLevel.Info); }
public override void Load() { IL.Celeste.Player.ctor += Player_ctor; //On.Celeste.Player.ctor += Player_ctor; IL.Celeste.Actor.IsRiding_JumpThru += Actor_IsRiding; IL.Celeste.Actor.IsRiding_Solid += Actor_IsRiding; IL.Celeste.Actor.MoveVExact += Actor_MoveVExact; On.Celeste.Actor.OnGround_int += Actor_OnGround_int; On.Celeste.Player.Update += Player_Update; hook_Player_orig_Update = new ILHook(typeof(Player).GetMethod("orig_Update"), Player_orig_Update); IL.Celeste.Player.ClimbUpdate += Player_ClimbUpdate; IL.Celeste.Player.ClimbHopBlockedCheck += Player_ClimbHopBlockedCheck; On.Celeste.Player.TransitionTo += Player_TransitionTo; //On.Celeste.Level.TransitionRoutine += Level_TransitionRoutine; IL.Celeste.Player.BeforeDownTransition += Player_BeforeDownTransition; //IL.Celeste.Player.BeforeUpTransition += Player_BeforeUpTransition; IL.Celeste.Solid.GetPlayerOnTop += Solid_GetPlayerOnTop; On.Celeste.Solid.MoveVExact += Solid_MoveVExact; }
internal new static void Load() { hook_Level_orig_LoadLevel = new ILHook(typeof(Level).GetMethod("orig_LoadLevel"), Level_orig_LoadLevel); }
public static void ApplyHooks() { hookWWWctor = new Hook(typeof(WWW).GetConstructor(new Type[] { typeof(string) }), typeof(WWWHook).GetMethod("WWW_ctor")); }