private static IEnumerable <CodeInstruction> transpilerEntry(IEnumerable <CodeInstruction> instructions)
            {
                Boolean patched = false;

                foreach (CodeInstruction instruction in instructions)
                {
                    if (!patched && instruction.opcode == OpCodes.Callvirt && (MethodInfo)instruction.operand == AccessTools.Method(typeof(IDisplayEvents), "add_RenderingActiveMenu"))
                    {
                        instruction.operand = AccessTools.Method(typeof(IDisplayEvents), "add_RenderedActiveMenu");
                        patched             = true;
                    }

                    yield return(instruction);
                }
                patched.ReportTranspilerStatus();
            }
示例#2
0
            private static IEnumerable <CodeInstruction> transpilerCtor(IEnumerable <CodeInstruction> instructions)
            {
                Boolean patched = false;

                foreach (CodeInstruction instruction in instructions)
                {
                    if (instruction.opcode == OpCodes.Ldsflda && (FieldInfo)instruction.operand == AccessTools.Field(typeof(Game1), "viewport"))
                    {
                        instruction.operand = AccessTools.Field(typeof(Game1), "uiViewport");
                        patched             = true;
                    }

                    yield return(instruction);
                }
                patched.ReportTranspilerStatus();
            }
            private static IEnumerable <CodeInstruction> transpilerHandleClick(IEnumerable <CodeInstruction> instructions)
            {
                Boolean patched = false;

                foreach (CodeInstruction instruction in instructions)
                {
                    if (!patched && instruction.opcode == OpCodes.Callvirt && (MethodInfo)instruction.operand == AccessTools.Method(typeof(ICursorPosition), "get_ScreenPixels"))
                    {
                        yield return(instruction);

                        yield return(new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(Utility), "ModifyCoordinatesForUIScale")));

                        patched = true;
                        continue;
                    }

                    yield return(instruction);
                }
                patched.ReportTranspilerStatus();
            }
            private static IEnumerable <CodeInstruction> transpilerOnRenderedHud(IEnumerable <CodeInstruction> instructions)
            {
                var        target_type = Type.GetType("Pathoschild.Stardew.ChestsAnywhere.Framework.ModConfig, ChestsAnywhere");
                MethodInfo patch_fn    = AccessTools.Method(target_type, "get_ShowHoverTooltips");

                Boolean found_target = false;
                Boolean patched      = false;

                foreach (CodeInstruction instruction in instructions)
                {
                    if (!found_target)
                    {
                        found_target = instruction.opcode == OpCodes.Callvirt && (MethodBase)instruction.operand == patch_fn;
                    }
                    else if (!patched)
                    {
                        if (instruction.opcode == OpCodes.Brfalse)
                        {
                            instruction.opcode = OpCodes.Br;
                            patched            = true;
                        }
                        else if (instruction.opcode == OpCodes.Brfalse_S)
                        {
                            instruction.opcode = OpCodes.Br_S;
                            patched            = true;
                        }

                        if (patched)
                        {
                            yield return(new CodeInstruction(OpCodes.Pop));
                        }
                    }

                    yield return(instruction);
                }
                patched.ReportTranspilerStatus();
            }
        private static IEnumerable <CodeInstruction> transpilerCtor(IEnumerable <CodeInstruction> instructions, ILGenerator ilg)
        {
            ConstructorInfo base_ctor = AccessTools.Constructor(typeof(MenuWithInventory),
                                                                new[] {
                typeof(InventoryMenu.highlightThisItem), typeof(Boolean), typeof(Boolean), typeof(Int32), typeof(Int32), typeof(Int32)
            });
            Boolean patched  = false;
            Label   lbl_skip = ilg.DefineLabel();

            foreach (CodeInstruction instruction in instructions)
            {
                if (!patched && instruction.opcode == OpCodes.Call && (MethodBase)instruction.operand == base_ctor)
                {
                    yield return(new CodeInstruction(OpCodes.Ldarg_2));

                    yield return(new CodeInstruction(OpCodes.Isinst, typeof(CustomItemGrabMenu.MenuWithInventoryCtorParams)));

                    yield return(new CodeInstruction(OpCodes.Brfalse, lbl_skip));

                    // is MenuWithInventoryCtorParams
                    {
                        yield return(new CodeInstruction(OpCodes.Pop));

                        yield return(new CodeInstruction(OpCodes.Pop));

                        yield return(new CodeInstruction(OpCodes.Pop));

                        yield return(new CodeInstruction(OpCodes.Pop));

                        yield return(new CodeInstruction(OpCodes.Pop));

                        yield return(new CodeInstruction(OpCodes.Pop));

                        yield return(new CodeInstruction(OpCodes.Pop));

                        yield return(new CodeInstruction(OpCodes.Ldarg_0));

                        yield return(new CodeInstruction(OpCodes.Ldarg_2));

                        yield return(new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(typeof(CustomItemGrabMenu.MenuWithInventoryCtorParams), "mHighlighterMethod")));

                        yield return(new CodeInstruction(OpCodes.Ldarg_2));

                        yield return(new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(typeof(CustomItemGrabMenu.MenuWithInventoryCtorParams), "mOKButton")));

                        yield return(new CodeInstruction(OpCodes.Ldarg_2));

                        yield return(new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(typeof(CustomItemGrabMenu.MenuWithInventoryCtorParams), "mTrashCan")));

                        yield return(new CodeInstruction(OpCodes.Ldarg_2));

                        yield return(new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(typeof(CustomItemGrabMenu.MenuWithInventoryCtorParams), "mInventoryXOffset")));

                        yield return(new CodeInstruction(OpCodes.Ldarg_2));

                        yield return(new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(typeof(CustomItemGrabMenu.MenuWithInventoryCtorParams), "mInventoryYOffset")));

                        yield return(new CodeInstruction(OpCodes.Ldarg_2));

                        yield return(new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(typeof(CustomItemGrabMenu.MenuWithInventoryCtorParams), "mMenuOffsetHack")));

                        yield return(instruction);

                        yield return(new CodeInstruction(OpCodes.Ret));
                    }

                    // add branching for if condition was not true
                    var jmp = new CodeInstruction(instruction);
                    jmp.labels.Add(lbl_skip);

                    yield return(jmp);

                    patched = true;
                }
                else
                {
                    yield return(instruction);
                }
            }
            patched.ReportTranspilerStatus();
        }
            private static IEnumerable <CodeInstruction> transpilerDrawUi(IEnumerable <CodeInstruction> instructions, ILGenerator ilg)
            {
                ConstructorInfo xna_rectangle_ctor = AccessTools.Constructor(typeof(Rectangle), new[] { typeof(Int32), typeof(Int32), typeof(Int32), typeof(Int32) });

                Boolean patched  = false;
                Label   lbl_skip = ilg.DefineLabel();

                foreach (CodeInstruction instruction in instructions)
                {
                    if (!patched && instruction.opcode == OpCodes.Newobj && (MethodBase)instruction.operand == xna_rectangle_ctor)
                    {
                        yield return(instruction);

                        yield return(new CodeInstruction(OpCodes.Ldarg_0));

                        yield return(new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(sType, "Menu")));

                        yield return(new CodeInstruction(OpCodes.Isinst, typeof(CustomItemGrabMenu)));

                        yield return(new CodeInstruction(OpCodes.Brfalse, lbl_skip));

                        yield return(new CodeInstruction(OpCodes.Pop));

                        yield return(new CodeInstruction(OpCodes.Ldarg_0));

                        yield return(new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(sType, "Menu")));

                        yield return(new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(CustomItemGrabMenu), "get_mRealBounds")));

                        yield return(new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(typeof(Rectangle), "X")));

                        yield return(new CodeInstruction(OpCodes.Ldc_I4, 8));

                        yield return(new CodeInstruction(OpCodes.Add));

                        yield return(new CodeInstruction(OpCodes.Ldarg_0));

                        yield return(new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(sType, "Menu")));

                        yield return(new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(CustomItemGrabMenu), "get_mRealBounds")));

                        yield return(new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(typeof(Rectangle), "Y")));

                        yield return(new CodeInstruction(OpCodes.Ldc_I4, 20));

                        yield return(new CodeInstruction(OpCodes.Add));

                        yield return(new CodeInstruction(OpCodes.Ldarg_0));

                        yield return(new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(sType, "Menu")));

                        yield return(new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(CustomItemGrabMenu), "get_mRealBounds")));

                        yield return(new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(typeof(Rectangle), "Width")));

                        yield return(new CodeInstruction(OpCodes.Ldc_I4, 8));

                        yield return(new CodeInstruction(OpCodes.Sub));

                        yield return(new CodeInstruction(OpCodes.Ldarg_0));

                        yield return(new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(sType, "Menu")));

                        yield return(new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(CustomItemGrabMenu), "get_mRealBounds")));

                        yield return(new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(typeof(Rectangle), "Height")));

                        yield return(new CodeInstruction(OpCodes.Ldc_I4, 20));

                        yield return(new CodeInstruction(OpCodes.Sub));

                        yield return(instruction);

                        var jmp = new CodeInstruction(OpCodes.Nop);
                        jmp.labels.Add(lbl_skip);

                        yield return(jmp);

                        patched = true;

                        continue;
                    }

                    yield return(instruction);
                }
                patched.ReportTranspilerStatus();
            }