コード例 #1
0
        public override void OnUpdate(float realTimeDelta, float simulationTimeDelta)
        {
            if (_terminated)
            {
                return;
            }

            if (!_helper.GameLoaded)
            {
                return;
            }

            try
            {
                if (!_initialized)
                {
                    if (!IsOverwatched())
                    {
                        _helper.NotifyPlayer("Skylines Overwatch not found. Terminating...");
                        _terminated = true;

                        return;
                    }
                    else
                    {
                        _helper.NotifyPlayer($"Skylines Overwatch found, initialising {this.GetType()}");
                    }

                    SkylinesOverwatch.Settings.Instance.Enable.VehicleMonitor  = true;
                    SkylinesOverwatch.Settings.Instance.Enable.HumanMonitor    = true;
                    SkylinesOverwatch.Settings.Instance.Enable.BuildingMonitor = true;

                    _initialized = true;

                    _helper.NotifyPlayer("Initialized");
                }
                else if (!_baselined)
                {
                    remove_init = false;
                    SkylinesOverwatch.Data data = SkylinesOverwatch.Data.Instance;
                    foreach (ushort i in data.Vehicles)
                    {
                        Vehicle v = Singleton <VehicleManager> .instance.m_vehicles.m_buffer[(int)i];

                        bool isBlocked  = Identity.ModConf.RemoveBlockedVehicles && !data.IsCar(i) && v.m_blockCounter >= 64; // we will let the game decide when to remove a blocked car
                        bool isConfused = Identity.ModConf.RemoveConfusedVehicles && v.Info.m_vehicleAI.GetLocalizedStatus(i, ref v, out instanceID) == _vehicle_confused;

                        if (!isBlocked && !isConfused)
                        {
                            continue;
                        }

                        RemoveVehicle(i);
                    }
                    if (Identity.ModConf.RemoveConfusedCitizensVehicles)
                    {
                        deleteSelectedVehicle();
                        foreach (uint i in SkylinesOverwatch.Data.Instance.Humans)
                        {
                            deleteParkedVehicle(i);
                        }
                    }

                    _baselined = true;
                }
                else
                {
                    remove_init = false;
                    if ((Singleton <SimulationManager> .instance.m_currentFrameIndex / 16 % 8) == 0)
                    {
                        SkylinesOverwatch.Data data = SkylinesOverwatch.Data.Instance;

                        foreach (ushort i in data.VehiclesUpdated)
                        {
                            Vehicle v = Singleton <VehicleManager> .instance.m_vehicles.m_buffer[(int)i];

                            bool isBlocked  = Identity.ModConf.RemoveBlockedVehicles && !data.IsCar(i) && v.m_blockCounter >= 64; // we will let the game decide when to remove a blocked car
                            bool isConfused = Identity.ModConf.RemoveConfusedVehicles && v.Info.m_vehicleAI.GetLocalizedStatus(i, ref v, out instanceID) == _vehicle_confused;

                            if (!isBlocked && !isConfused)
                            {
                                continue;
                            }

                            RemoveVehicle(i);
                        }
                    }

                    if (Identity.ModConf.RemoveConfusedCitizensVehicles)
                    {
                        deleteSelectedVehicle();
                        foreach (uint i in SkylinesOverwatch.Data.Instance.HumansUpdated)
                        {
                            deleteParkedVehicle(i);
                        }
                        foreach (ushort j in SkylinesOverwatch.Data.Instance.BuildingsUpdated)
                        {
                            uint num = Singleton <BuildingManager> .instance.m_buildings.m_buffer[j].m_citizenUnits;
                            while (num != 0u)
                            {
                                uint nextUnit = Singleton <CitizenManager> .instance.m_units.m_buffer[(int)((UIntPtr)num)].m_nextUnit;
                                for (int i = 0; i < 5; i++)
                                {
                                    uint citizen = Singleton <CitizenManager> .instance.m_units.m_buffer[(int)((UIntPtr)num)].GetCitizen(i);
                                    if (citizen != 0u)
                                    {
                                        deleteParkedVehicle(citizen);
                                    }
                                }
                                num = nextUnit;
                            }
                        }
                    }

                    if (_helper.ManualRemovalRequests.Any())
                    {
                        _helper.NotifyPlayer($"Removing {_helper.ManualRemovalRequests.Count} manually requested vehicle(s)");
                    }
                    foreach (ushort i in _helper.ManualRemovalRequests)
                    {
                        RemoveVehicle(i, true);
                    }

                    _helper.ManualRemovalRequests.Clear();
                }
            }
            catch (Exception e)
            {
                string error = String.Format("Failed to {0}\r\n", !_initialized ? "initialize" : "update");
                error += String.Format("Error: {0}\r\n", e.Message);
                error += "\r\n";
                error += "==== STACK TRACE ====\r\n";
                error += e.StackTrace;

                _helper.Log(error);
                _helper.NotifyPlayer($"Skylines Stuck Vehicles Remover Terminated:{Environment.NewLine}{error}");

                if (!_initialized)
                {
                    _terminated = true;
                }
            }

            base.OnUpdate(realTimeDelta, simulationTimeDelta);
        }
コード例 #2
0
        public override void OnUpdate(float realTimeDelta, float simulationTimeDelta)
        {
            if (_terminated)
            {
                return;
            }

            if (!_helper.GameLoaded)
            {
                return;
            }

            try
            {
                if (!_initialized)
                {
                    if (!IsOverwatched())
                    {
                        _helper.NotifyPlayer("Skylines Overwatch not found. Terminating...");
                        _terminated = true;

                        return;
                    }

                    SkylinesOverwatch.Settings.Instance.Enable.VehicleMonitor = true;

                    _initialized = true;

                    _helper.NotifyPlayer("Initialized");
                }
                else
                {
                    if (WorldInfoPanel.AnyWorldInfoPanelOpen())
                    {
                        _selected = WorldInfoPanel.GetCurrentInstanceID();

                        if (_selected.IsEmpty || _selected.Vehicle == 0)
                        {
                            _selected = default(InstanceID);
                        }
                    }
                    else
                    {
                        _selected = default(InstanceID);
                    }

                    VehicleManager         instance   = Singleton <VehicleManager> .instance;
                    InstanceID             instanceID = new InstanceID();
                    SkylinesOverwatch.Data data       = SkylinesOverwatch.Data.Instance;

                    foreach (ushort i in data.VehiclesUpdated)
                    {
                        Vehicle v = instance.m_vehicles.m_buffer[(int)i];

                        bool isBlocked  = !data.IsCar(i) && v.m_blockCounter >= 64; // we will let the game decide when to remove a blocked car
                        bool isConfused = v.Info.m_vehicleAI.GetLocalizedStatus(i, ref v, out instanceID) == _confused;

                        if (!isBlocked && !isConfused)
                        {
                            continue;
                        }

                        RemoveVehicle(i);
                    }

                    foreach (ushort i in _helper.ManualRemovalRequests)
                    {
                        RemoveVehicle(i);
                    }

                    _helper.ManualRemovalRequests.Clear();
                }
            }
            catch (Exception e)
            {
                string error = String.Format("Failed to {0}\r\n", !_initialized ? "initialize" : "update");
                error += String.Format("Error: {0}\r\n", e.Message);
                error += "\r\n";
                error += "==== STACK TRACE ====\r\n";
                error += e.StackTrace;

                _helper.Log(error);

                if (!_initialized)
                {
                    _terminated = true;
                }
            }

            base.OnUpdate(realTimeDelta, simulationTimeDelta);
        }