Program.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. var originalInjectMethod = injected.MainModule.Types.First(x => x.Name == "Chainloader").Methods.First(x => x.Name == "Initialize");
  47. var injectMethod = unity.MainModule.Import(originalInjectMethod);
  48. var sceneManager = unity.MainModule.Types.First(x => x.Name == "SceneManager");
  49. foreach (var loadScene in sceneManager.Methods.Where(x => x.Name == "LoadScene"))
  50. {
  51. ILProcessor IL = loadScene.Body.GetILProcessor();
  52. IL.InsertBefore(loadScene.Body.Instructions[0], IL.Create(OpCodes.Call, injectMethod));
  53. }
  54. }
  55. }
  56. }