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); }
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); }