Program.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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 tmOutputDLL = Path.GetFullPath("TextMeshPro-1.0.55.56.0b12.dll");
  36. if (!File.Exists(tmOutputDLL))
  37. Error("\"TextMeshPro-1.0.55.56.0b12.dll\" not found.");
  38. string tmOriginalDLL = Path.GetFullPath("TextMeshPro-1.0.55.56.0b12.dll.bak");
  39. if (!File.Exists(tmOriginalDLL))
  40. File.Copy(tmOutputDLL, tmOriginalDLL);
  41. string injectedDLL = Path.GetFullPath("BepInEx.dll");
  42. if (!File.Exists(unityOutputDLL))
  43. Error("\"BepInEx.dll\" not found.");
  44. string referenceDir = Directory.GetCurrentDirectory();
  45. var defaultResolver = new DefaultAssemblyResolver();
  46. defaultResolver.AddSearchDirectory(referenceDir);
  47. AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(assemblyOriginalDLL, new ReaderParameters {
  48. AssemblyResolver = defaultResolver
  49. });
  50. AssemblyDefinition unity = AssemblyDefinition.ReadAssembly(unityOriginalDLL, new ReaderParameters
  51. {
  52. AssemblyResolver = defaultResolver
  53. });
  54. AssemblyDefinition tm = AssemblyDefinition.ReadAssembly(tmOriginalDLL, new ReaderParameters
  55. {
  56. AssemblyResolver = defaultResolver
  57. });
  58. AssemblyDefinition injected = AssemblyDefinition.ReadAssembly(injectedDLL, new ReaderParameters
  59. {
  60. AssemblyResolver = defaultResolver
  61. });
  62. //IPatchPlugin exitScene = new ExitScenePlugin();
  63. //exitScene.Patch(assembly);
  64. InjectAssembly(assembly, unity, tm, injected);
  65. assembly.Write(assemblyDLL);
  66. unity.Write(unityOutputDLL);
  67. tm.Write(tmOutputDLL);
  68. }
  69. static void InjectAssembly(AssemblyDefinition assembly, AssemblyDefinition unity, AssemblyDefinition tm, AssemblyDefinition injected)
  70. {
  71. //Entry point
  72. var originalInjectMethod = injected.MainModule.Types.First(x => x.Name == "Chainloader").Methods.First(x => x.Name == "Initialize");
  73. var injectMethod = unity.MainModule.Import(originalInjectMethod);
  74. var sceneManager = unity.MainModule.Types.First(x => x.Name == "SceneManager");
  75. ILProcessor IL;
  76. foreach (var loadScene in sceneManager.Methods.Where(x => x.Name == "LoadScene"))
  77. {
  78. IL = loadScene.Body.GetILProcessor();
  79. IL.InsertBefore(loadScene.Body.Instructions[0], IL.Create(OpCodes.Call, injectMethod));
  80. }
  81. //Text loading
  82. originalInjectMethod = injected.MainModule.Types.First(x => x.Name == "Chainloader").Methods.First(x => x.Name == "TextLoadedHook");
  83. injectMethod = tm.MainModule.Import(originalInjectMethod);
  84. TypeDefinition tmpText = tm.MainModule.Types.First(x => x.Name == "TMP_Text");
  85. var setText = tmpText.Methods.First(x => x.Name == "set_text");
  86. IL = setText.Body.GetILProcessor();
  87. IL.InsertAfter(setText.Body.Instructions[11], IL.Create(OpCodes.Call, injectMethod));
  88. //IL.InsertAfter(setText.Body.Instructions[3], IL.Create(OpCodes.Call, injectMethod));
  89. }
  90. }
  91. }