Example #1
0
        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());
        }
Example #2
0
        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
    }
Example #5
0
        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());
        }
Example #6
0
        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());
        }
Example #7
0
        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();
 }