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);
        }
Esempio n. 2
0
        private HackAssembler CreateSut()
        {
            var codeFinder = new CodeFinder();

            return(new HackAssembler(
                       codeFinder,
                       new TextCleaner(),
                       new CommandParser(codeFinder)));
        }
Esempio n. 3
0
        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);
        }