public new virtual void InitializePrefab()
 {
     try
     {
         PreInitializeHook(this);
     }
     catch
     {
         isGrowable     = false;
         previousPrefab = null;
     }
     RedirectionHelper.RevertRedirect(_InitializePrefab_original, _InitializePrefab_state);
     try
     {
         base.InitializePrefab();
     }
     finally
     {
         RedirectionHelper.RedirectCalls(_InitializePrefab_original, _InitializePrefab_detour);
     }
     try
     {
         PostInitializeHook(this);
     }
     catch (Exception e)
     {
         UnityEngine.Debug.LogException(e);
     }
 }
示例#2
0
        // Detours

        public void SetParentButton(UIButton button)
        {
            if (button == null)
            {
                return;
            }

            // We have to remove the custom tab before the original SetParentButton method is called
            // SetParentButton() is searching for a TutorialUITag component which our tab does not have
            GUI.ThemePolicyTab.RemoveThemesTab();

            // Call the original method
            RedirectionHelper.RevertRedirect(_PoliciesPanel_SetParentButton_original, _PoliciesPanel_SetParentButton_state);
            try
            {
                _PoliciesPanel_SetParentButton_original.Invoke(this, new object[] { button });
            }
            catch (Exception e)
            {
                Debug.LogException(e);
                // ignore this error, seems harmless
            }
            RedirectionHelper.RedirectCalls(_PoliciesPanel_SetParentButton_original, _PoliciesPanel_SetParentButton_detour);

            // After the method call, add our custom tab again
            GUI.ThemePolicyTab.AddThemesTab();
        }
示例#3
0
        public static void Deploy()
        {
            if (!deployed)
            {
                _GetUpgradeInfo_original = typeof(A).GetMethod("GetUpgradeInfo", BindingFlags.Instance | BindingFlags.Public);
                _GetUpgradeInfo_detour   = typeof(PrivateBuildingAIDetour <A>).GetMethod("GetUpgradeInfo", BindingFlags.Instance | BindingFlags.Public);
                _GetUpgradeInfo_state    = RedirectionHelper.RedirectCalls(_GetUpgradeInfo_original, _GetUpgradeInfo_detour);

                deployed = true;

                Debugger.LogFormat("Building Themes: {0} Methods detoured!", typeof(A).Name);
            }
        }
        public static void Deploy()
        {
            if (!deployed)
            {
                _BuildingManager_GetRandomBuildingInfo_original = typeof(BuildingManager).GetMethod("GetRandomBuildingInfo", BindingFlags.Instance | BindingFlags.Public);
                _BuildingManager_GetRandomBuildingInfo_detour   = typeof(BuildingManagerDetour).GetMethod("GetRandomBuildingInfo", BindingFlags.Instance | BindingFlags.Public);
                _BuildingManager_GetRandomBuildingInfo_state    = RedirectionHelper.RedirectCalls(_BuildingManager_GetRandomBuildingInfo_original, _BuildingManager_GetRandomBuildingInfo_detour);

                deployed = true;

                Debugger.Log("Building Themes: BuildingManager Methods detoured!");
            }
        }
示例#5
0
        public static void Deploy()
        {
            if (!deployed)
            {
                _InitializePrefab_original = typeof(BuildingInfo).GetMethod("InitializePrefab", BindingFlags.Instance | BindingFlags.Public);
                _InitializePrefab_detour   = typeof(BuildingInfoDetour).GetMethod("InitializePrefab", BindingFlags.Instance | BindingFlags.Public);
                _InitializePrefab_state    = RedirectionHelper.RedirectCalls(_InitializePrefab_original, _InitializePrefab_detour);

                deployed = true;

                Debugger.Log("Building Themes: BuildingInfo Methods detoured!");
            }
        }
示例#6
0
        public static void Deploy()
        {
            if (!deployed)
            {
                _DistrictManager_ReleaseDistrictImplementation_original = typeof(DistrictManager).GetMethod("ReleaseDistrictImplementation", BindingFlags.Instance | BindingFlags.NonPublic);
                _DistrictManager_ReleaseDistrictImplementation_detour = typeof(DistrictManagerDetour).GetMethod("ReleaseDistrictImplementation", BindingFlags.Instance | BindingFlags.NonPublic);
                _DistrictManager_ReleaseDistrictImplementation_state = RedirectionHelper.RedirectCalls(_DistrictManager_ReleaseDistrictImplementation_original, _DistrictManager_ReleaseDistrictImplementation_detour);

                deployed = true;

                Debugger.Log("Building Themes: DistrictManager Methods detoured!");
            }
        }
示例#7
0
        public static void Deploy()
        {
            if (!deployed)
            {
                _original = typeof(DistrictWorldInfoPanel).GetMethod("OnPoliciesClick", BindingFlags.Instance | BindingFlags.Public);
                _detour   = typeof(DistrictWorldInfoPanelDetour).GetMethod("OnPoliciesClick", BindingFlags.Instance | BindingFlags.Public);
                _state    = RedirectionHelper.RedirectCalls(_original, _detour);

                deployed = true;

                Debugger.Log("Building Themes: DistrictWorldInfoPanel Methods detoured!");
            }
        }
示例#8
0
        // Detours

        public void SetParentButton(UIButton button)
        {
            // We have to remove the custom tab before the original SetParentButton method is called
            // SetParentButton() is searching for a TutorialUITag component which our tab does not have
            GUI.ThemePolicyTab.RemoveThemesTab();

            // Call the original method
            RedirectionHelper.RevertRedirect(_PoliciesPanel_SetParentButton_original, _PoliciesPanel_SetParentButton_state);
            _PoliciesPanel_SetParentButton_original.Invoke(this, new object[] { button });
            RedirectionHelper.RedirectCalls(_PoliciesPanel_SetParentButton_original, _PoliciesPanel_SetParentButton_detour);

            // After the method call, add our custom tab again
            GUI.ThemePolicyTab.AddThemesTab();
        }
示例#9
0
        public static void Deploy()
        {
            if (!deployed)
            {
                _ImmaterialResourceManager_AddResource_original = typeof(ImmaterialResourceManager).GetMethod("AddResource",
                                                                                                              new[] { typeof(ImmaterialResourceManager.Resource), typeof(int), typeof(Vector3), typeof(float) });
                _ImmaterialResourceManager_AddResource_detour = typeof(ImmaterialResourceManagerDetour).GetMethod("AddResource", BindingFlags.Instance | BindingFlags.Public);
                _ImmaterialResourceManager_AddResource_state  = RedirectionHelper.RedirectCalls(_ImmaterialResourceManager_AddResource_original, _ImmaterialResourceManager_AddResource_detour);

                deployed = true;

                Debugger.Log("Building Themes: ImmaterialResourceManager Methods detoured!");
            }
        }
示例#10
0
        private void RefreshPanel()
        {
            // We have to remove the custom tab before the original RefreshPanel method is called
            // RefreshPanel() checks for every policy button if the assigned policy is loaded
            // Our fake policy buttons are not related to a game policy
            GUI.ThemePolicyTab.RemoveThemesTab();

            // Call the original method
            RedirectionHelper.RevertRedirect(_PoliciesPanel_RefreshPanel_original, _PoliciesPanel_RefreshPanel_state);
            _PoliciesPanel_RefreshPanel_original.Invoke(this, new object[] { });
            RedirectionHelper.RedirectCalls(_PoliciesPanel_RefreshPanel_original, _PoliciesPanel_RefreshPanel_detour);

            // After the method call, add our custom tab again
            GUI.ThemePolicyTab.AddThemesTab();
        }
示例#11
0
        public static void Deploy()
        {
            if (!deployed)
            {
                _ZoneBlock_SimulationStep_original = typeof(ZoneBlock).GetMethod("SimulationStep", BindingFlags.Public | BindingFlags.Instance);
                _ZoneBlock_SimulationStep_detour   = typeof(ZoneBlockDetour).GetMethod("SimulationStep", BindingFlags.Instance | BindingFlags.Public);
                _ZoneBlock_SimulationStep_state    = RedirectionHelper.RedirectCalls(_ZoneBlock_SimulationStep_original, _ZoneBlock_SimulationStep_detour);

                _CheckBlock  = typeof(ZoneBlock).GetMethod("CheckBlock", BindingFlags.NonPublic | BindingFlags.Instance);
                _IsGoodPlace = typeof(ZoneBlock).GetMethod("IsGoodPlace", BindingFlags.NonPublic | BindingFlags.Instance);

                deployed = true;

                Debugger.Log("Building Themes: ZoneBlock Methods detoured!");
            }
        }
示例#12
0
        public static void Deploy()
        {
            if (deployed || Util.IsModActive(BuildingThemesMod.EIGHTY_ONE_MOD))
            {
                Debugger.Log("Building Themes: ImmaterialResourceManager Methods won't be detoured: 81 Tiles detected");
                return;
            }
            _ImmaterialResourceManager_AddResource_original = typeof(ImmaterialResourceManager).GetMethod("AddResource",
                                                                                                          new[] { typeof(ImmaterialResourceManager.Resource), typeof(int), typeof(Vector3), typeof(float) });
            _ImmaterialResourceManager_AddResource_detour = typeof(ImmaterialResourceManagerDetour).GetMethod("AddResource", BindingFlags.Instance | BindingFlags.Public);
            _ImmaterialResourceManager_AddResource_state  = RedirectionHelper.RedirectCalls(_ImmaterialResourceManager_AddResource_original, _ImmaterialResourceManager_AddResource_detour);

            deployed = true;

            Debugger.Log("Building Themes: ImmaterialResourceManager Methods detoured!");
        }
示例#13
0
        public static void Deploy()
        {
            if (!deployed)
            {
                _PoliciesPanel_RefreshPanel_original = typeof(PoliciesPanel).GetMethod("RefreshPanel", BindingFlags.Instance | BindingFlags.NonPublic);
                _PoliciesPanel_RefreshPanel_detour   = typeof(PoliciesPanelDetour).GetMethod("RefreshPanel", BindingFlags.Instance | BindingFlags.NonPublic);
                _PoliciesPanel_RefreshPanel_state    = RedirectionHelper.RedirectCalls(_PoliciesPanel_RefreshPanel_original, _PoliciesPanel_RefreshPanel_detour);

                _PoliciesPanel_SetParentButton_original = typeof(PoliciesPanel).GetMethod("SetParentButton", BindingFlags.Instance | BindingFlags.Public);
                _PoliciesPanel_SetParentButton_detour   = typeof(PoliciesPanelDetour).GetMethod("SetParentButton", BindingFlags.Instance | BindingFlags.Public);
                _PoliciesPanel_SetParentButton_state    = RedirectionHelper.RedirectCalls(_PoliciesPanel_SetParentButton_original, _PoliciesPanel_SetParentButton_detour);

                deployed = true;

                Debugger.Log("Building Themes: PoliciesPanel Methods detoured!");
            }
        }
        public static void Deploy()
        {
            if (!deployed)
            {
                if (Util.IsModActive("Prefab Hook"))
                {
                    var type = Util.FindType("BuildingInfoHookReflective");
                    if (type == null)
                    {
                        UnityEngine.Debug.LogError("Building Themes - type 'BuildingInfoHookReflective' not found. Update Prefab Hook!");
                    }
                    else
                    {
                        type.GetMethod("RegisterPreInitializationHook", BindingFlags.Public | BindingFlags.Static)
                        .Invoke(null, new object[]
                        {
                            new Action <BuildingInfo>(PreInitializeHook),
                        });
                        type.GetMethod("RegisterPostInitializationHook", BindingFlags.Public | BindingFlags.Static)
                        .Invoke(null, new object[]
                        {
                            new Action <BuildingInfo>(PostInitializeHook),
                        });
                        type.GetMethod("Deploy", BindingFlags.Public | BindingFlags.Static)
                        .Invoke(null, new object[]
                        {
                        });
                    }
                }
                else
                {
                    _InitializePrefab_original = typeof(BuildingInfo).GetMethod("InitializePrefab", BindingFlags.Instance | BindingFlags.Public);
                    _InitializePrefab_detour   = typeof(BuildingInfoDetour).GetMethod("InitializePrefab", BindingFlags.Instance | BindingFlags.Public);
                    _InitializePrefab_state    = RedirectionHelper.RedirectCalls(_InitializePrefab_original, _InitializePrefab_detour);
                }
                deployed = true;

                Debugger.Log("Building Themes: BuildingInfo Methods detoured!");
            }
        }
示例#15
0
        public static void Deploy()
        {
            if (!deployed)
            {
                _ZoneBlock_SimulationStep_original = typeof(ZoneBlock).GetMethod("SimulationStep", BindingFlags.Public | BindingFlags.Instance);
                _ZoneBlock_SimulationStep_detour   = typeof(ZoneBlockDetour).GetMethod("SimulationStep", BindingFlags.Static | BindingFlags.Public);
                _ZoneBlock_SimulationStep_state    = RedirectionHelper.RedirectCalls(_ZoneBlock_SimulationStep_original, _ZoneBlock_SimulationStep_detour);

                _CheckBlock  = typeof(ZoneBlock).GetMethod("CheckBlock", BindingFlags.NonPublic | BindingFlags.Instance);
                _IsGoodPlace = typeof(ZoneBlock).GetMethod("IsGoodPlace", BindingFlags.NonPublic | BindingFlags.Instance);

                if (Util.IsModActive(BuildingThemesMod.EIGHTY_ONE_MOD))
                {
                    _zoneGridResolution     = EIGHTY_ONE_ZONEGRID_RESOLUTION;
                    _zoneGridHalfResolution = EIGHTY_ONE_HALF_ZONEGRID_RESOLUTION;
                }

                deployed = true;

                Debugger.Log("Building Themes: ZoneBlock Methods detoured!");
            }
        }
示例#16
0
        // Detours

        public int AddResource(ImmaterialResourceManager.Resource resource, int rate, Vector3 positionArg, float radius)
        {
            if (Debugger.Enabled && debugCounter < 10)
            {
                debugCounter++;
                Debugger.Log("Building Themes: Detoured ImmaterialResource.AddResource was called.");
            }

            // Catch the position of the abandoned building
            if (resource == ImmaterialResourceManager.Resource.Abandonment)
            {
                BuildingThemesMod.position = positionArg;
            }

            // Call the original method
            RedirectionHelper.RevertRedirect(_ImmaterialResourceManager_AddResource_original, _ImmaterialResourceManager_AddResource_state);
            var result = Singleton <ImmaterialResourceManager> .instance.AddResource(resource, rate, positionArg, radius);

            RedirectionHelper.RedirectCalls(_ImmaterialResourceManager_AddResource_original, _ImmaterialResourceManager_AddResource_detour);

            return(result);
        }
示例#17
0
        public new virtual void InitializePrefab()
        {
            bool growable = this.m_class.GetZone() != ItemClass.Zone.None;

            if (growable)
            {
                //Debugger.Log("InitializePrefab called: " + this.name);
            }

            RedirectionHelper.RevertRedirect(_InitializePrefab_original, _InitializePrefab_state);
            base.InitializePrefab();
            RedirectionHelper.RedirectCalls(_InitializePrefab_original, _InitializePrefab_detour);

            if (growable)
            {
                var prefabVariations = Singleton <BuildingVariationManager> .instance.CreateVariations(this).Values.ToArray <BuildingInfo>();

                if (prefabVariations.Length > 0)
                {
                    PrefabCollection <BuildingInfo> .InitializePrefabs("BetterUpgrade", prefabVariations, null);
                }
                //Debugger.Log("InitializePrefab done:   " + this.name);
            }
        }