Program.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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.IO;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace BepInEx.Patcher
  11. {
  12. class Program
  13. {
  14. static void Error(string message)
  15. {
  16. Console.WriteLine($"Error: {message}");
  17. Console.WriteLine("Press any key to continue...");
  18. Console.ReadKey();
  19. Environment.Exit(1);
  20. }
  21. static void Main(string[] args)
  22. {
  23. string assemblyDLL = Path.GetFullPath("Assembly-CSharp.dll");
  24. if (!File.Exists(assemblyDLL))
  25. Error("\"Assembly-CSharp.dll\" not found.");
  26. string assemblyOriginalDLL = Path.GetFullPath("Assembly-CSharp.dll.bak");
  27. if (!File.Exists(assemblyOriginalDLL))
  28. File.Copy(assemblyDLL, assemblyOriginalDLL);
  29. string unityOutputDLL = Path.GetFullPath("UnityEngine.dll");
  30. if (!File.Exists(unityOutputDLL))
  31. Error("\"UnityEngine.dll\" not found.");
  32. string unityOriginalDLL = Path.GetFullPath("UnityEngine.dll.bak");
  33. if (!File.Exists(unityOriginalDLL))
  34. File.Copy(unityOutputDLL, unityOriginalDLL);
  35. string injectedDLL = Path.GetFullPath("BepInEx.dll");
  36. if (!File.Exists(unityOutputDLL))
  37. Error("\"BepInEx.dll\" not found.");
  38. string referenceDir = Directory.GetCurrentDirectory();
  39. var defaultResolver = new DefaultAssemblyResolver();
  40. defaultResolver.AddSearchDirectory(referenceDir);
  41. AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(assemblyOriginalDLL, new ReaderParameters {
  42. AssemblyResolver = defaultResolver
  43. });
  44. AssemblyDefinition unity = AssemblyDefinition.ReadAssembly(unityOriginalDLL, new ReaderParameters
  45. {
  46. AssemblyResolver = defaultResolver
  47. });
  48. AssemblyDefinition injected = AssemblyDefinition.ReadAssembly(injectedDLL, new ReaderParameters
  49. {
  50. AssemblyResolver = defaultResolver
  51. });
  52. //IPatchPlugin exitScene = new ExitScenePlugin();
  53. //exitScene.Patch(assembly);
  54. //IPatchPlugin slider = new SliderPlugin();
  55. //slider.Patch(assembly);
  56. //IPatchPlugin title = new TitleScenePlugin();
  57. //title.Patch(assembly);
  58. InjectAssembly(assembly, unity, injected);
  59. assembly.Write(assemblyDLL);
  60. unity.Write(unityOutputDLL);
  61. }
  62. static void InjectAssembly(AssemblyDefinition assembly, AssemblyDefinition unity, AssemblyDefinition injected)
  63. {
  64. var originalInjectMethod = injected.MainModule.Types.First(x => x.Name == "Chainloader").Methods.First(x => x.Name == "Initialize");
  65. var injectMethod = unity.MainModule.Import(originalInjectMethod);
  66. var sceneManager = unity.MainModule.Types.First(x => x.Name == "SceneManager");
  67. foreach (var loadScene in sceneManager.Methods.Where(x => x.Name == "LoadScene"))
  68. {
  69. ILProcessor IL = loadScene.Body.GetILProcessor();
  70. IL.InsertBefore(loadScene.Body.Instructions[0], IL.Create(OpCodes.Call, injectMethod));
  71. }
  72. }
  73. }
  74. }