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(); }
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(); }