Example #1
0
        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
                );
        }
Example #2
0
        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;
        }
Example #4
0
        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)
                );
        }
Example #5
0
        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;
        }
Example #8
0
 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);
     }
 }
Example #9
0
        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");
        }
Example #10
0
        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);
        }
Example #11
0
        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);
        }
Example #12
0
        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);
 }
Example #14
0
 public static void ApplyHooks()
 {
     hookWWWctor = new Hook(typeof(WWW).GetConstructor(new Type[] { typeof(string) }), typeof(WWWHook).GetMethod("WWW_ctor"));
 }