using System;
using Mono.Cecil;
using Mono.Cecil.Cil;
namespace xMod.Patcher {
class MainClass {
private static AssemblyDefinition xModAssembly;
private static AssemblyDefinition rustAssembly;
private static string version = "1.0.0.0";
private static void BootstrapAttachPatch() {
try {
TypeDefinition xModBootstrap = xModAssembly.MainModule.GetType("xMod.Bootstrap");
TypeDefinition serverInit = rustAssembly.MainModule.GetType("Bootstrap");
MethodDefinition attachBootstrap = xModBootstrap.GetMethod("AttachBootstrap");
MethodDefinition awake = serverInit.GetMethod("Start");
awake.Body.GetILProcessor().InsertAfter(awake.Body.Instructions[0x01], Instruction.Create(OpCodes.Call, rustAssembly.MainModule.Import(attachBootstrap)));
} catch (Exception ex) {
Console.WriteLine("Error at: " + ex.TargetSite.Name);
Console.WriteLine("Error msg: " + ex.Message);
}
}
public static void Main(string[] args) {
rustAssembly = AssemblyDefinition.ReadAssembly("Assembly-CSharp.dll");
xModAssembly = AssemblyDefinition.ReadAssembly("xMod.dll");
bool success = true;
BootstrapAttachPatch();
try {
TypeReference type = AssemblyDefinition.ReadAssembly("mscorlib.dll").MainModule.GetType("System.String");
TypeDefinition item = new TypeDefinition("", "xMod_Patched", TypeAttributes.AnsiClass | TypeAttributes.Public);
rustAssembly.MainModule.Types.Add(item);
TypeReference fieldType = rustAssembly.MainModule.Import(type);
FieldDefinition definition3 = new FieldDefinition("Version", FieldAttributes.CompilerControlled | FieldAttributes.FamANDAssem | FieldAttributes.Family, fieldType);
definition3.HasConstant = true;
definition3.Constant = version;
rustAssembly.MainModule.GetType("xMod_Patched").Fields.Add(definition3);
rustAssembly.Write("Assembly-CSharp.dll");
} catch (Exception ex) {
Console.WriteLine("Error at: " + ex.TargetSite.Name);
Console.WriteLine("Error msg: " + ex.Message);
success = false;
}
if (success) {
Console.WriteLine("Yay!");
Console.ReadKey();
} else {
Console.WriteLine("Darn!");
Console.ReadKey();
}
}
}
}