Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 3
0
        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;
        }
Exemplo n.º 9
0
        /// <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();
        }
Exemplo n.º 11
0
        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();
        }
Exemplo n.º 13
0
        [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();
        }
Exemplo n.º 14
0
        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;
            }
        }
Exemplo n.º 17
0
        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();
        }
Exemplo n.º 19
0
        [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);
        }
Exemplo n.º 22
0
        [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();
            }
        }
Exemplo n.º 23
0
        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();
     }
 }
Exemplo n.º 25
0
        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();
        }
Exemplo n.º 26
0
        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);
        }
Exemplo n.º 29
0
        [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;
        }