public GameServerPatch(PatcherData patcherData) : base(patcherData) { var irData = patcherData.IRData; var plData = patcherData.PLData; var irProgramType = irData.Module.GetType("Game.Program"); var pluginInjectorType = plData.Module.GetType("PluginLoader.PluginInjector"); var irPluginInjectorField = CecilHelpers.GetFieldByName(irProgramType.Fields.ToArray(), "PluginInjector"); var irGameServerType = irData.Module.GetType("Game.GameStates.GameServer"); var instructions = new List <Instruction> { Instruction.Create(OpCodes.Ldsfld, irPluginInjectorField), Instruction.Create(OpCodes.Ldarg_0), Instruction.Create(OpCodes.Callvirt, irData.Module.Import(CecilHelpers.GetMethodByName(pluginInjectorType.Methods.ToArray(), "IRInitializeGameServer"))) }; var processor = CecilHelpers.GetMethodByName(irGameServerType.Methods.ToArray(), ".ctor").Body.GetILProcessor(); CecilHelpers.InjectInstructionsToEnd(processor, instructions.ToArray()); instructions.Clear(); instructions.Add(Instruction.Create(OpCodes.Ldsfld, irPluginInjectorField)); instructions.Add(Instruction.Create(OpCodes.Ldarg_0)); instructions.Add(Instruction.Create(OpCodes.Callvirt, CecilHelpers.GetMethodByName(irGameServerType.Methods.ToArray(), "get_TickrateInSeconds"))); instructions.Add(Instruction.Create(OpCodes.Callvirt, irData.Module.Import(CecilHelpers.GetMethodByName(pluginInjectorType.Methods.ToArray(), "IRUpdateGameServer")))); processor = CecilHelpers.GetMethodByName(irGameServerType.Methods.ToArray(), "UpdateOffthread").Body.GetILProcessor(); CecilHelpers.InjectInstructionsToEnd(processor, instructions.ToArray()); instructions.Clear(); instructions.Add(Instruction.Create(OpCodes.Ldsfld, irPluginInjectorField)); instructions.Add(Instruction.Create(OpCodes.Callvirt, irData.Module.Import(CecilHelpers.GetMethodByName(pluginInjectorType.Methods.ToArray(), "IRUnloadGameServer")))); processor = CecilHelpers.GetMethodByName(irGameServerType.Methods.ToArray(), "Unload").Body.GetILProcessor(); CecilHelpers.InjectInstructionsToEnd(processor, instructions.ToArray()); }
public GameEditorPatch(PatcherData patcherData) : base(patcherData) { var irData = patcherData.IRData; var plData = patcherData.PLData; var irProgramType = irData.Module.GetType("Game.Program"); var pluginInjectorType = plData.Module.GetType("PluginLoader.PluginInjector"); var irPluginInjectorField = CecilHelpers.GetFieldByName(irProgramType.Fields.ToArray(), "PluginInjector"); var irGameClientType = irData.Module.GetType("Game.GameStates.GameShipEditor"); var instructions = new List <Instruction>(); instructions.Add(Instruction.Create(OpCodes.Ldsfld, irPluginInjectorField)); instructions.Add(Instruction.Create(OpCodes.Ldarg_0)); instructions.Add(Instruction.Create(OpCodes.Callvirt, irData.Module.Import(CecilHelpers.GetMethodByName(pluginInjectorType.Methods.ToArray(), "IRInitializeGameEditor")))); var processor = CecilHelpers.GetMethodByName(irGameClientType.Methods.ToArray(), ".ctor").Body.GetILProcessor(); CecilHelpers.InjectInstructionsToEnd(processor, instructions.ToArray()); instructions.Clear(); instructions.Add(Instruction.Create(OpCodes.Ldsfld, irPluginInjectorField)); instructions.Add(Instruction.Create(OpCodes.Ldc_R4, 0.01666667f)); instructions.Add(Instruction.Create(OpCodes.Callvirt, irData.Module.Import(CecilHelpers.GetMethodByName(pluginInjectorType.Methods.ToArray(), "IRUpdateGameEditor")))); processor = CecilHelpers.GetMethodByName(irGameClientType.Methods.ToArray(), "UpdateFixedStep").Body.GetILProcessor(); CecilHelpers.InjectInstructionsToEnd(processor, instructions.ToArray()); instructions.Clear(); instructions.Add(Instruction.Create(OpCodes.Ldsfld, irPluginInjectorField)); instructions.Add(Instruction.Create(OpCodes.Callvirt, irData.Module.Import(CecilHelpers.GetMethodByName(pluginInjectorType.Methods.ToArray(), "IRUnloadGameEditor")))); processor = CecilHelpers.GetMethodByName(irGameClientType.Methods.ToArray(), "Unload").Body.GetILProcessor(); CecilHelpers.InjectInstructionsToEnd(processor, instructions.ToArray()); }
public ClientDeviceFactoryPatch(PatcherData patcherData) : base(patcherData) { var irData = patcherData.TargetData[PatcherTarget.InterstellarRift]; var plData = patcherData.TargetData[PatcherTarget.PluginLoader]; var irProgramType = irData.Module.GetType("Game.Program"); var pluginInjectorType = plData.Module.GetType("PluginLoader.PluginInjector"); var irPluginInjectorField = Helpers.GetFieldByName(irProgramType.Fields.ToArray(), "PluginInjector"); var irFactoryType = irData.Module.GetType("Game.Ship.Lockstep.ClientState.Factory"); var instructions = new List <Instruction>(); instructions.Add(Instruction.Create(OpCodes.Ldsfld, irPluginInjectorField)); instructions.Add(Instruction.Create(OpCodes.Ldloc_0)); instructions.Add(Instruction.Create(OpCodes.Callvirt, irData.Module.Import(Helpers.GetMethodByName(pluginInjectorType.Methods.ToArray(), "IRCreateClientDevice")))); var processor = irFactoryType.Methods.First(method => method.Name == "CreateFrom").Body.GetILProcessor(); processor.Body.Instructions.Remove(processor.Body.Instructions.Last().Previous); Helpers.InjectInstructionsToEnd(processor, instructions.ToArray()); instructions.Clear(); instructions.Add(Instruction.Create(OpCodes.Ldsfld, irPluginInjectorField)); instructions.Add(Instruction.Create(OpCodes.Ldloc_0)); instructions.Add(Instruction.Create(OpCodes.Ldarg_2)); instructions.Add(Instruction.Create(OpCodes.Callvirt, irData.Module.Import(Helpers.GetMethodByName(pluginInjectorType.Methods.ToArray(), "IRCreateClientDeviceExterior")))); processor = irFactoryType.Methods.Last(method => method.Name == "CreateFrom").Body.GetILProcessor(); Helpers.InjectInstructionsToEnd(processor, instructions.ToArray()); }
private void Initialize(PatcherData data) { _cache = new UnityCache(data.AppSecret); if (IsCachedBannerAvailable()) { _logger.LogDebug(string.Format("A cached banner image is available at {0}", CachedBannerPath)); LoadBannerImage(CachedBannerPath, OldImage); } var patcher = Patcher.Instance; patcher.AppInfo .SkipWhile(info => info.Id == default(int)) .Select(info => new Data { BannerData = new PatcherBannerData { ImageUrl = info.PatcherBannerImage, Dimensions = info.PatcherBannerImageDimensions, ModificationDate = info.PatcherBannerImageUpdatedAt }, BannerFilePath = Path.Combine(data.AppDataPath, BannerImageFilename) }) .ObserveOnMainThread() .Subscribe(OnBannerDataUpdate); //TODO: Dispose subscription }
public AgosGuiPatch(PatcherData patcherData) : base(patcherData) { var irData = patcherData.TargetData[PatcherTarget.InterstellarRift]; var plData = patcherData.TargetData[PatcherTarget.PluginLoader]; var irProgramType = irData.Module.GetType("Game.Program"); var pluginInjectorType = plData.Module.GetType("PluginLoader.PluginInjector"); var irPluginInjectorField = Helpers.GetFieldByName(irProgramType.Fields.ToArray(), "PluginInjector"); var irAgosGuiType = irData.Module.GetType("Game.Client.AgosGui"); var instructions = new List <Instruction> { Instruction.Create(OpCodes.Ldsfld, irPluginInjectorField), Instruction.Create(OpCodes.Ldarg_0), Instruction.Create(OpCodes.Callvirt, irData.Module.Import(Helpers.GetMethodByName(pluginInjectorType.Methods.ToArray(), "IRInitializeAgosGui"))) }; var processor = Helpers.GetMethodByName(irAgosGuiType.Methods.ToArray(), ".ctor").Body.GetILProcessor(); Helpers.InjectInstructionsToEnd(processor, instructions.ToArray()); }
public DeviceFactoryPatch(PatcherData patcherData) : base(patcherData) { var irData = patcherData.IRData; var plData = patcherData.PLData; var irProgramType = irData.Module.GetType("Game.Program"); var pluginInjectorType = plData.Module.GetType("PluginLoader.PluginInjector"); var irPluginInjectorField = CecilHelpers.GetFieldByName(irProgramType.Fields.ToArray(), "PluginInjector"); var irFactoryType = irData.Module.GetType("Game.Ship.Lockstep.State.Factory"); var instructions = new List <Instruction> { Instruction.Create(OpCodes.Ldsfld, irPluginInjectorField), Instruction.Create(OpCodes.Ldarg_0), Instruction.Create(OpCodes.Callvirt, irData.Module.Import(CecilHelpers.GetMethodByName(pluginInjectorType.Methods.ToArray(), "IRCreateDevice"))) }; var processor = CecilHelpers.GetMethodByName(irFactoryType.Methods.ToArray(), "Create").Body.GetILProcessor(); processor.Remove(processor.Body.Instructions.Last().Previous); CecilHelpers.InjectInstructionsToEnd(processor, instructions.ToArray()); }
public ProgramPatch(PatcherData patcherData) : base(patcherData) { var irData = patcherData.TargetData[PatcherTarget.InterstellarRift]; var plData = patcherData.TargetData[PatcherTarget.PluginLoader]; var irProgramType = irData.Module.GetType("Game.Program"); var irProgramCtor = Helpers.GetMethodByName(irProgramType.Methods.ToArray(), ".cctor"); var pluginInjectorType = plData.Module.GetType("PluginLoader.PluginInjector"); var pluginInjectorCtor = Helpers.GetMethodByName(pluginInjectorType.Methods.ToArray(), ".ctor"); var irPluginInjectorField = new FieldDefinition("PluginInjector", FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.InitOnly, irData.Module.Import(pluginInjectorType)); irProgramType.Fields.Add(irPluginInjectorField); var instructions = new List <Instruction> { Instruction.Create(OpCodes.Ldsfld, Helpers.GetFieldByName(irProgramType.Fields.ToArray(), "log")), Instruction.Create(OpCodes.Newobj, irData.Module.Import(pluginInjectorCtor)), Instruction.Create(OpCodes.Stsfld, irPluginInjectorField) }; var processor = irProgramCtor.Body.GetILProcessor(); Helpers.InjectInstructionsToEnd(processor, instructions.ToArray()); }
public ChatControllerPatch(PatcherData patcherData) : base(patcherData) { var irData = patcherData.IRData; var plData = patcherData.PLData; var irChatControllerType = irData.Module.GetType("Game.Server.ChatController"); var instructions = new List <Instruction>(); var stringType = irData.Module.Import(typeof(string)); var actionType = irData.Module.Import(typeof(Action <,>)); var dictionaryType = irData.Module.Import(typeof(Dictionary <,>)); var irPlayerType = irData.Module.GetType("Game.Server.Player"); var actionInstanceType = new GenericInstanceType(actionType); actionInstanceType.GenericArguments.Add(irPlayerType); actionInstanceType.GenericArguments.Add(stringType); var dictionaryInstanceType = new GenericInstanceType(dictionaryType); dictionaryInstanceType.GenericArguments.Add(stringType); dictionaryInstanceType.GenericArguments.Add(actionInstanceType); var getCommandsMethod = new MethodDefinition("get_Commands", MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName, dictionaryInstanceType); irChatControllerType.Methods.Add(getCommandsMethod); irChatControllerType.Properties.Add(new PropertyDefinition("Commands", PropertyAttributes.None, dictionaryInstanceType) { GetMethod = getCommandsMethod }); instructions.Add(Instruction.Create(OpCodes.Ldarg_0)); instructions.Add(Instruction.Create(OpCodes.Ldfld, CecilHelpers.GetFieldByName(irChatControllerType.Fields.ToArray(), "m_commands"))); instructions.Add(Instruction.Create(OpCodes.Ret)); var processor = getCommandsMethod.Body.GetILProcessor(); instructions.ForEach(instruction => processor.Append(instruction)); }
public AccessModifierPatch(PatcherData patcherData) : base(patcherData) { allTypesPublic(); allNotPublicMethodsProtected(); allPrivateFieldsProtected(); }