Esempio n. 1
0
        public void PatchGame()
        {
            var patcher = new dnpatch.Patcher($"{_config.ManagedPath}/Assembly-CSharp.dll");
            var target  = new Target
            {
                Class  = "PermanentManager",
                Method = "Awake"
            };
            var newInstructions = new[]
            {
                Instruction.Create(OpCodes.Call, patcher.BuildCall(typeof(ModLoader.ModLoader), "LoadMods", typeof(void), new Type[] { })),
                Instruction.Create(OpCodes.Ret)
            };
            var instructions = patcher.GetInstructions(target).ToList();

            if (IsPatched(instructions))
            {
                ReplacePatchedInstructions(instructions, newInstructions);
            }
            else
            {
                AddNewInstructions(instructions, newInstructions);
            }
            target.Instructions = instructions.ToArray();
            try
            {
                patcher.Patch(target);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error while patching game assembly: " + ex);
                throw;
            }
            try
            {
                patcher.Save(true);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error while saving patched game assembly: " + ex);
                throw;
            }
        }
Esempio n. 2
0
        private void PatchAssembly()
        {
            var patcher = new dnpatch.Patcher($"{_owmlConfig.ManagedPath}/Assembly-CSharp.dll");

            var target = new Target
            {
                Class  = PatchClass,
                Method = PatchMethod
            };
            var instructions        = patcher.GetInstructions(target).ToList();
            var patchedInstructions = GetPatchedInstructions(instructions);

            if (patchedInstructions.Count == 1)
            {
                _writer.WriteLine($"{PatchClass}.{PatchMethod} is already patched.");
                return;
            }

            if (patchedInstructions.Count > 1)
            {
                _writer.WriteLine($"Removing corrupted patch from {PatchClass}.{PatchMethod}.");
                foreach (var patchedInstruction in patchedInstructions)
                {
                    instructions.Remove(patchedInstruction);
                }
            }

            _writer.WriteLine($"Adding patch in {PatchClass}.{PatchMethod}.");

            var newInstruction = Instruction.Create(OpCodes.Call, patcher.BuildCall(typeof(ModLoader.ModLoader), "LoadMods", typeof(void), new Type[] { }));

            instructions.Insert(instructions.Count - 1, newInstruction);

            target.Instructions = instructions.ToArray();

            Patch(patcher, target);

            Save(patcher);
        }