Program.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. using BepInEx.Patcher.Internal;
  2. using Mono.Cecil;
  3. using Mono.Cecil.Cil;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace BepInEx.Patcher
  10. {
  11. class Program
  12. {
  13. const string originalDLL = @"M:\koikatu\KoikatuTrial_Data\Managed\Assembly-CSharp-original.dll";
  14. const string outputDLL = @"M:\koikatu\KoikatuTrial_Data\Managed\Assembly-CSharp.dll";
  15. const string unityOriginalDLL = @"M:\koikatu\KoikatuTrial_Data\Managed\UnityEngine-original.dll";
  16. const string unityOutputDLL = @"M:\koikatu\KoikatuTrial_Data\Managed\UnityEngine.dll";
  17. const string injectedDLL = @"M:\koikatu\KoikatuTrial_Data\Managed\BepInEx.dll";
  18. const string referenceDir = @"M:\koikatu\KoikatuTrial_Data\Managed\";
  19. static void Main(string[] args)
  20. {
  21. var defaultResolver = new DefaultAssemblyResolver();
  22. defaultResolver.AddSearchDirectory(referenceDir);
  23. AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(originalDLL, new ReaderParameters {
  24. AssemblyResolver = defaultResolver
  25. });
  26. AssemblyDefinition unity = AssemblyDefinition.ReadAssembly(unityOriginalDLL, new ReaderParameters
  27. {
  28. AssemblyResolver = defaultResolver
  29. });
  30. AssemblyDefinition injected = AssemblyDefinition.ReadAssembly(injectedDLL, new ReaderParameters
  31. {
  32. AssemblyResolver = defaultResolver
  33. });
  34. IPatchPlugin exitScene = new ExitScenePlugin();
  35. exitScene.Patch(assembly);
  36. IPatchPlugin slider = new SliderPlugin();
  37. slider.Patch(assembly);
  38. IPatchPlugin title = new TitleScenePlugin();
  39. title.Patch(assembly);
  40. InjectAssembly(assembly, unity, injected);
  41. assembly.Write(outputDLL);
  42. unity.Write(unityOutputDLL);
  43. }
  44. static void InjectAssembly(AssemblyDefinition assembly, AssemblyDefinition unity, AssemblyDefinition injected)
  45. {
  46. ILProcessor IL;
  47. //Initialize
  48. var originalInjectMethod = injected.MainModule.Types.First(x => x.Name == "Target").Methods.First(x => x.Name == "Initialize");
  49. var injectMethod = unity.MainModule.Import(originalInjectMethod);
  50. var sceneManager = unity.MainModule.Types.First(x => x.Name == "SceneManager");
  51. foreach (var loadScene in sceneManager.Methods.Where(x => x.Name == "LoadScene"))
  52. {
  53. IL = loadScene.Body.GetILProcessor();
  54. IL.InsertBefore(loadScene.Body.Instructions[0], IL.Create(OpCodes.Call, injectMethod));
  55. }
  56. //CustomInitializer
  57. originalInjectMethod = injected.MainModule.Types.First(x => x.Name == "Target").Methods.First(x => x.Name == "InitializeCustomBase");
  58. injectMethod = assembly.MainModule.Import(originalInjectMethod);
  59. var customControl = assembly.MainModule.Types.First(x => x.Name == "CustomControl");
  60. var customInitialize = customControl.Methods.First(x => x.Name == "Initialize");
  61. IL = customInitialize.Body.GetILProcessor();
  62. //IL.Replace(customInitialize.Body.Instructions[169], IL.Create(OpCodes.Call, customControl.Properties[4].GetMethod));
  63. //IL.Append(IL.Create(OpCodes.Call, injectMethod));
  64. IL.Replace(customInitialize.Body.Instructions[169], IL.Create(OpCodes.Call, injectMethod));
  65. customInitialize.Body.Instructions[169].Offset = 0x01f0;
  66. IL.Append(IL.Create(OpCodes.Ret));
  67. //injected.MainModule.Import(assembly.MainModule.Types.First(x => x.Name == "CustomBase"));
  68. }
  69. }
  70. }