static IEnumerable <CodeInstruction> StopRecursiveCall(IEnumerable <CodeInstruction> e, MethodBase original) { List <CodeInstruction> insts = new List <CodeInstruction>(e); CodeFinder finder = new CodeFinder(original, insts); var voidMethod = AccessTools.Method(typeof(MultiplayerCompatibility), nameof(Void)); var offender = AccessTools.Property(AccessTools.TypeByName("RimWorld.Pawn_PlayerSettings"), "AreaRestriction").GetSetMethod(); int position = new CodeFinder(original, insts). Forward(OpCodes.Callvirt, offender); insts.RemoveAt(position); insts.Insert(position, new CodeInstruction(OpCodes.Call, voidMethod)); position = new CodeFinder(original, insts). Forward(OpCodes.Callvirt, offender). Forward(OpCodes.Callvirt, offender); insts.RemoveAt(position); insts.Insert(position, new CodeInstruction(OpCodes.Call, voidMethod)); position = new CodeFinder(original, insts). Forward(OpCodes.Callvirt, offender). Forward(OpCodes.Callvirt, offender). Forward(OpCodes.Callvirt, offender); insts.RemoveAt(position); insts.Insert(position, new CodeInstruction(OpCodes.Call, voidMethod)); return(insts); }
private HackAssembler CreateSut() { var codeFinder = new CodeFinder(); return(new HackAssembler( codeFinder, new TextCleaner(), new CommandParser(codeFinder))); }
static IEnumerable <CodeInstruction> Transpiler(IEnumerable <CodeInstruction> insts, MethodBase original) { var list = new List <CodeInstruction>(insts); int index = new CodeFinder(original, list).Forward(OpCodes.Stfld, LastFailTicks).Advance(-1); if (list[index].opcode != OpCodes.Ldc_I4_0) { throw new Exception("Wrong code"); } list.RemoveAt(index); list.Insert( index, new CodeInstruction(OpCodes.Ldloc_1), new CodeInstruction(OpCodes.Ldarg_1), new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(StartOrResumeBillPatch), nameof(Value))) ); return(list); }