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); } }
// 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(); }
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!"); } }
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!"); } }
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!"); } }
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!"); } }
// 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(); }
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!"); } }
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(); }
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!"); } }
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!"); }
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!"); } }
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!"); } }
// 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); }
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); } }