public override void OnReleased() { base.OnReleased(); if (OptionsWrapper <Options> .Options.ingameTrainMetroConverter) { Patch.Revert(_harmony); } if (!OptionsWrapper <Options> .Options.ghostMode) { _updater = null; if (Container == null) { return; } UnityEngine.Object.Destroy(Container); Container = null; Redirector <RoadsGroupPanelDetour> .Revert(); Redirector <DepotAIDetour> .Revert(); Redirector <MetroTrainAI> .Revert(); Redirector <PassengerTrainAIDetour> .Revert(); } }
public override void OnReleased() { Redirector <TreeToolDetour> .Revert(); Redirector <BeautificationPanelDetour> .Revert(); BeautificationPanelDetour.Dispose(); Redirector <WaterToolDetour> .Revert(); Redirector <TerrainToolDetour> .Revert(); TerrainToolDetour.Dispose(); Redirector <TerrainPanelDetour> .Revert(); Redirector <LandscapingPanelDetour> .Revert(); LandscapingPanelDetour.Dispose(); Redirector <LevelHeightOptionPanelDetour> .Revert(); LevelHeightOptionPanelDetour.Dispose(); Redirector <UndoTerrainOptionPanelDetour> .Revert(); Redirector <BrushOptionPanelDetour> .Revert(); try { Plugins.Dispose(); } catch (Exception e) { UnityEngine.Debug.LogException(e); } }
private static ushort CreateBuilding(BuildingTool _this, BuildingInfo info, Vector3 position, float angle, int relocating, bool needMoney, bool fixedHeight) { Debug.Log("BuildIndex is : " + Singleton <SimulationManager> .instance.m_currentBuildIndex); //call original method try { RICOBuildingManager.AddBuilding(info, Singleton <SimulationManager> .instance.m_currentBuildIndex); } catch (Exception e) { Debug.LogException(e); } CreateBuildingRedirector.Revert(); CreateBuildingAlt(_this, info, position, angle, relocating, needMoney, fixedHeight); CreateBuildingRedirector.Apply(); //Add plopped building to RICOBuildingManager ushort num = 0; return(num); //no clue why it needs to return a ushort, source code doesnt appear to do anything with it. }
public override void OnReleased() { base.OnReleased(); Redirector <PropToolDetour> .Revert(); Redirector <PropInstanceDetour> .Revert(); }
public static void EndColliding(/*ulong[] ___m_collidingSegments1*/) { StackTrace stackTrace = new StackTrace(); ToolController targetInstance = Singleton <ToolManager> .instance.m_properties; if (stackTrace.GetFrame(1).GetMethod().Name == "SimulationStep") { ulong[] ___m_collidingSegments1 = typeof(ToolController).GetField("m_collidingSegments1", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(targetInstance) as ulong[]; //UnityEngine.Debug.Log("EndColliding caller: " + stackTrace.GetFrame(2).GetMethod().GetUnderlyingType() + " " + stackTrace.GetFrame(2).GetMethod().Name + " " + ", count: " + CollidingSegments.Count); CollidingSegments.Clear(); foreach (int segment in NetUtil.SegmentsFromMask(___m_collidingSegments1)) { CollidingSegments.Add((ushort)segment); } CollidingSegmentsCache2 = CollidingSegments.ToArray(); } Redirector <ToolControllerDetour> .Revert(); targetInstance.EndColliding(); Redirector <ToolControllerDetour> .Deploy(); //UnityEngine.Debug.Log("EndColliding: " + CollidingSegmentsCache2.Length); }
public static void RevertDetours() { Redirector <SurfacePanelDetour> .Revert(); SurfacePanelDetour.Dispose(); Redirector <TerrainManagerDetour> .Revert(); }
public override void OnLevelUnloading() { base.OnLevelUnloading(); Redirector <PropManagerDetour> .Revert(); Redirector <TreeManagerDetour> .Revert(); }
public override void OnLevelLoaded(LoadMode mode) { base.OnLevelLoaded(mode); if (mode != LoadMode.LoadAsset && mode != LoadMode.NewAsset) { Reset(); Redirector <PropManagerDetour> .Revert(); Redirector <TreeManagerDetour> .Revert(); return; } if (initialized) { return; } Container.SetupPropColors(); Redirector <BuildingDecorationDetour> .Deploy(); Redirector <PropManagerDetour> .Deploy(); Redirector <TreeManagerDetour> .Deploy(); Redirector <AssetEditorChirpPanelDetour> .Deploy(); Redirector <DecorationPropertiesPanelDetour> .Deploy(); SubBuildingsEnablerFormat.InitializeBuildingsWithSubBuildings(); UIView.GetAView().AddUIComponent(typeof(Panel)); initialized = true; }
/// <summary> /// Fired when we are 'disabled' by the user and \ or when the game exits. /// Note: the C\O call backs must not be static due to the way CO looks for them via reflection. /// </summary> public void OnDisabled() { try { IsEnabled = false; if (IsInited) { un_init(); Redirector <LimitBuildingDecoration> .Revert(); Redirector <LimitNaturalResourceManager> .Revert(); Redirector <LimitTreeTool> .Revert(); Redirector <LimitTreeManager> .Revert(); Redirector <LimitTreeManager.Data> .Revert(); Redirector <LimitCommonBuildingAI> .Revert(); Redirector <LimitDisasterHelpers> .Revert(); Redirector <LimitFireCopterAI> .Revert(); Redirector <LimitForestFireAI> .Revert(); Redirector <LimitWeatherManager> .Revert(); Logger.dbgLog(string.Concat("v", VERSION_BUILD_NUMBER, " Mod has been unloaded, disabled or game exiting.")); } } catch (Exception ex) { Logger.dbgLog("", ex, true); } }
public override void OnReleased() { base.OnReleased(); Redirector <NetAIDetour> .Revert(); Redirector <ShipPathAIDetour> .Revert(); }
private void Deinit() { LoadPassengersPatch.Undo(); UnloadPassengersPatch.Undo(); DepotAIPatch.Undo(); NetManagerPatch.Undo(); VehicleManagerPatch.Undo(); PublicTransportLineVehicleModelSelectorRefreshPatch.Undo(); Redirector <TramAIDetour> .Revert(); Redirector <PassengerTrainAIDetour> .Revert(); Redirector <PassengerShipAIDetour> .Revert(); Redirector <PassengerPlaneAIDetour> .Revert(); Redirector <PassengerFerryAIDetour> .Revert(); Redirector <PassengerBlimpAIDetour> .Revert(); Redirector <BusAIDetour> .Revert(); Redirector <CommonBuildingAIReverseDetour> .Revert(); Redirector <PublicTransportStopButtonDetour> .Revert(); Redirector <PublicTransportVehicleButtonDetour> .Revert(); Redirector <PublicTransportWorldInfoPanelDetour> .Revert(); Redirector <TrolleybusAIDetour> .Revert(); Redirector <PassengerHelicopterAIDetour> .Revert(); Redirector <TransportLineDetour> .Revert(); TransportLineSimulationStepPatch.Undo(); TransportLineGetLineVehiclePatch.Undo(); CachedTransportLineData.Deinit(); BuildingExtension.Deinit(); CachedNodeData.Deinit(); CachedVehicleData.Deinit(); VehiclePrefabs.Deinit(); SerializableDataExtension.instance.Loaded = false; LocaleModifier.Deinit(); if ((UnityEngine.Object) this._iptGameObject != (UnityEngine.Object)null) { UnityEngine.Object.Destroy((UnityEngine.Object) this._iptGameObject); } if (!((UnityEngine.Object) this._worldInfoPanel != (UnityEngine.Object)null)) { return; } UnityEngine.Object.Destroy((UnityEngine.Object) this._worldInfoPanel); }
private static void Reset() { DestroyContainer(); Redirector <BuildingDecorationDetour> .Revert(); Redirector <AssetEditorChirpPanelDetour> .Revert(); Redirector <DecorationPropertiesPanelDetour> .Revert(); }
[RedirectMethod(true)] // Detour reason: Load extra zone data before method is executed public static void UpdateData(TerrainManager _this, SimulationManager.UpdateMode mode) { DataExtension.instance.OnUpdateData(); // Call original method UpdateDataRedirector.Revert(); _this.UpdateData(mode); UpdateDataRedirector.Apply(); }
public static void Deinit() { Redirector <TransportLineMod> .Revert(); TransportLineMod._lineData = (LineData[])null; SerializableDataExtension.instance.EventSaveData -= new SerializableDataExtension.SaveDataEventHandler(TransportLineMod.OnSaveData); TransportLineMod._init = false; }
public override void OnReleased() { base.OnReleased(); if (EuroBuildingsUnlocker.debug) { UnityEngine.Debug.Log("EuroBuildingsUnlocker - OnReleased"); } if (!_bootstrapped) { if (EuroBuildingsUnlocker.debug) { UnityEngine.Debug.Log("EuroBuildingsUnlocker - Mod hasn't been bootstrapped"); } return; } Levels.ResetNativeLevel(); SceneManagerDetour.Revert(); AsyncOperationDetour.Revert(); Redirector <BuildingCollectionDetour> .Revert(); Redirector <PropCollectionDetour> .Revert(); Redirector <NetCollectionDetour> .Revert(); Redirector <CitizenCollectionDetour> .Revert(); Redirector <VehicleCollectionDetour> .Revert(); Redirector <EventCollectionDetour> .Revert(); Redirector <TransportCollectionDetour> .Revert(); Redirector <EffectCollectionDetour> .Revert(); Redirector <MilestoneCollectionDetour> .Revert(); Redirector <ItemClassCollectionDetour> .Revert(); Redirector <TreeCollectionDetour> .Revert(); Redirector <DistrictPolicyCollectionDetour> .Revert(); Redirector <BuildingCommonCollectionDetour> .Revert(); Redirector <LoadingManagerDetour> .Revert(); Redirector <RadioContentCollectionDetour> .Revert(); Redirector <RadioChannelCollectionDetour> .Revert(); Redirector <DisasterCollectionDetour> .Revert(); LoadingManagerDetour.addChildrenToBuiltinStyleHook = null; _bootstrapped = false; }
public override void OnReleased() { base.OnReleased(); Redirector <TransportStationAIDetour> .Revert(); if (tabs != null) { Object.Destroy(tabs.gameObject); tabs = null; } }
protected override void Awake() { this.m_levelMaterial = new Material(Shader.Find("Custom/Overlay/WaterLevel")); this.m_sourceMaterial = new Material(Shader.Find("Custom/Tools/WaterSource")); m_sourceMaterial.color = new Color(48.0f / 255.0f, 140.0f / 255, 1.0f, 54.0f / 255.0f); this.m_sourceMesh = Util.Load <Mesh>("Cylinder01"); Redirector <WaterToolDetour> .Revert(); base.Awake(); Redirector <WaterToolDetour> .Deploy(); }
public override void OnReleased() { base.OnReleased(); Redirector <WildlifeSpawnPointAIDetour> .Revert(); Redirector <LivestockAIDetour> .Revert(); Redirector <WildlifeAIDetour> .Revert(); Redirector <PetAIDetour> .Revert(); }
[RedirectMethod(true)] // Detour reason: Keep cachedBlockIDs in sync public static void ReleaseBlock(ZoneManager _this, ushort block) { if (_this.m_blocks.m_buffer[block].m_flags != 0u) { cachedBlockIDs.Add(block); } // Call original method ReleaseBlockRedirector.Revert(); _this.ReleaseBlock(block); ReleaseBlockRedirector.Apply(); }
public static void Deinit() { if (!VehicleManagerMod._isDeployed) { return; } VehicleManagerMod.m_cachedVehicleData = (VehicleData[])null; Redirector <VehicleManagerMod> .Revert(); SerializableDataExtension.instance.EventSaveData -= new SerializableDataExtension.SaveDataEventHandler(VehicleManagerMod.OnSaveData); VehicleManagerMod._isDeployed = false; }
private void Deinit() { HarmonyInstance?.UnpatchAll(); Redirector <TramAIDetour> .Revert(); Redirector <PassengerTrainAIDetour> .Revert(); Redirector <PassengerShipAIDetour> .Revert(); Redirector <PassengerPlaneAIDetour> .Revert(); Redirector <PassengerFerryAIDetour> .Revert(); Redirector <PassengerBlimpAIDetour> .Revert(); Redirector <BusAIDetour> .Revert(); Redirector <CommonBuildingAIReverseDetour> .Revert(); Redirector <PublicTransportStopButtonDetour> .Revert(); Redirector <PublicTransportVehicleButtonDetour> .Revert(); Redirector <PublicTransportWorldInfoPanelDetour> .Revert(); Redirector <TrolleybusAIDetour> .Revert(); Redirector <PassengerHelicopterAIDetour> .Revert(); Redirector <TransportLineDetour> .Revert(); CachedTransportLineData.Deinit(); BuildingExtension.Deinit(); CachedNodeData.Deinit(); CachedVehicleData.Deinit(); VehiclePrefabs.Deinit(); SerializableDataExtension.instance.Loaded = false; LocaleModifier.Deinit(); if ((UnityEngine.Object) this._iptGameObject != (UnityEngine.Object)null) { UnityEngine.Object.Destroy((UnityEngine.Object) this._iptGameObject); } if (!((UnityEngine.Object) this._worldInfoPanel != (UnityEngine.Object)null)) { return; } UnityEngine.Object.Destroy((UnityEngine.Object) this._worldInfoPanel); }
[RedirectMethod(true)] // Detour reason: Keep cachedBlockIDs in sync private static void SimulationStepImpl(ZoneManager _this, int subStep) { bool blocksUpdated = _this.m_blocksUpdated; // Call original method SimulationStepImplRedirector.Revert(); SimulationStepImplAlt(_this, subStep); SimulationStepImplRedirector.Apply(); if (blocksUpdated) { cachedBlockIDs.Clear(); } }
private void Unpatch() { Redirector <PositionDetour> .Revert(); if (Harmony != null) { try { Harmony.UnpatchAll(HarmonyID); } catch (Exception) { Debug.LogWarning($"Failed unpatching {HarmonyID}, please notify the mod author."); } finally { Harmony = null; } } }
public static void ChangeDeployState(bool state) { if (!Util.IsGameMode()) { return; } if (state) { Redirector <PassengerTrainAIDetour> .Deploy(); } else { Redirector <PassengerTrainAIDetour> .Revert(); } }
public override void OnReleased() { base.OnReleased(); Debugger.Log("ON_RELEASED"); BuildingThemesManager.instance.Reset(); BuildingVariationManager.instance.Reset(); PolicyPanelEnabler.Unregister(); Debugger.Log("Building Themes: Reverting detoured methods..."); try { Detour.BuildingInfoDetour.Revert(); Redirector <BuildingManagerDetour> .Revert(); Debugger.Log("Building Themes: BuildingManager Methods restored!"); Redirector <DistrictManagerDetour> .Revert(); Debugger.Log("Building Themes: DistrictManager Methods restored!"); Redirector <ZoneBlockDetour> .Revert(); Debugger.Log("Building Themes: ZoneBlock Methods restored!"); Detour.ImmaterialResourceManagerDetour.Revert(); Detour.PrivateBuildingAIDetour <ResidentialBuildingAI> .Revert(); Detour.PrivateBuildingAIDetour <CommercialBuildingAI> .Revert(); Detour.PrivateBuildingAIDetour <IndustrialBuildingAI> .Revert(); Detour.PrivateBuildingAIDetour <OfficeBuildingAI> .Revert(); Detour.PoliciesPanelDetour.Revert(); Redirector <DistrictWorldInfoPanelDetour> .Revert(); Debugger.Log("Building Themes: DistrictWorldInfoPanel Methods restored!"); } catch (Exception e) { Debugger.LogException(e); } Debugger.Log("Building Themes: Done!"); Debugger.Deinitialize(); }
private static void disable_anarchy() { DebugUtils.Log("Disabling anarchy"); Redirector <NetToolDetour> .Revert(); Redirector <BuildingToolDetour> .Revert(); Redirector <RoadAIDetour> .Revert(); Redirector <PedestrianPathAIDetour> .Revert(); Redirector <TrainTrackAIDetour> .Revert(); Redirector <NetAIDetour> .Revert(); if (chirperButton != null && chirperAtlasNormal != null) { chirperButton.atlas = chirperAtlasNormal; } }
public static void ReleaseSegment(NetManager _this, ushort segmentID, bool keepNodes) { var segment = _this.m_segments.m_buffer[segmentID]; int columnCount = 0; FindColumnCount(segment.m_blockEndLeft, ref columnCount); FindColumnCount(segment.m_blockEndRight, ref columnCount); FindColumnCount(segment.m_blockStartLeft, ref columnCount); FindColumnCount(segment.m_blockStartRight, ref columnCount); var caller = new System.Diagnostics.StackFrame(1).GetMethod().Name; //Debug.Log($"ReleaseSegment called by {caller}, id: {segmentID}, type: {segment.Info.name}"); switch (caller) { case "MoveMiddleNode": // segment that was modified because user added network, keep data until replacement segments were created // Save segment id MoveMiddleNode_releasedColumnCount = columnCount; break; case "SplitSegment": // segment that was split by new node, keep data until replacement segments were created // Save segment id SplitSegment_releasedColumnCount = columnCount; break; default: // unknown caller break; } // Call original method ReleaseSegmentRedirector.Revert(); _this.ReleaseSegment(segmentID, keepNodes); ReleaseSegmentRedirector.Apply(); }
public static bool CreateSegment(NetManager _this, out ushort segmentID, ref Randomizer randomizer, NetInfo info, ushort startNode, ushort endNode, Vector3 startDirection, Vector3 endDirection, uint buildIndex, uint modifiedIndex, bool invert) { var ai = info.m_netAI as RoadAI; if (ai != null && ai.m_enableZoning) { var caller = new System.Diagnostics.StackFrame(1).GetMethod().Name; switch (caller) { case "MoveMiddleNode": // segment that was modified because user added network, apply style of previous segment newBlockColumnCount = MoveMiddleNode_releasedColumnCount >= 0 ? MoveMiddleNode_releasedColumnCount : InputThreadingExtension.userSelectedColumnCount; break; case "SplitSegment": // segment that was split by new node, apply style of previous segment newBlockColumnCount = SplitSegment_releasedColumnCount >= 0 ? SplitSegment_releasedColumnCount : InputThreadingExtension.userSelectedColumnCount; break; default: // unknown caller (e.g. new road placed), set to depth selected by user newBlockColumnCount = InputThreadingExtension.userSelectedColumnCount; SplitSegment_releasedColumnCount = -1; MoveMiddleNode_releasedColumnCount = -1; break; } } // Call original method CreateSegmentRedirector.Revert(); var success = _this.CreateSegment(out segmentID, ref randomizer, info, startNode, endNode, startDirection, endDirection, buildIndex, modifiedIndex, invert); CreateSegmentRedirector.Apply(); return(success); }
[RedirectMethod(true)] // Detour Reason: Deeper zones data storage, custom depth public static bool CreateBlock(ZoneManager _this, out ushort block, ref Randomizer randomizer, Vector3 position, float angle, int rows, uint buildIndex) { bool result; var columns = NetManagerDetour.newBlockColumnCount; if (columns == 0) // create no blocks if desired zone depth is 0 { block = 0; result = false; } else { // Call original method CreateBlockRedirector.Revert(); result = _this.CreateBlock(out block, ref randomizer, position, angle, rows, buildIndex); CreateBlockRedirector.Apply(); if (result) { // --- support for larger zones --- if (DataExtension.zones3 != null) { DataExtension.zones3[block] = 0UL; } if (DataExtension.zones4 != null) { DataExtension.zones4[block] = 0UL; } // --- dynamic column count --- // TODO should only affect new roads, not ones replaced or splitted by the game (see Network Skins source code) ZoneBlockDetour.SetColumnCount(ref _this.m_blocks.m_buffer[(int)block], columns); } } return(result); }
public void OnDestroy() { Redirector <NetInfoDetour> .Revert(); anarchy = false; }