//based off code in TransportLine.SimulationStep public static void RemoveVehicle(ushort lineID, ushort vehicleID, bool descreaseTargetVehicleCount) { VehicleManager instance = Singleton <VehicleManager> .instance; if ((instance.m_vehicles.m_buffer[(int)vehicleID].m_flags & Vehicle.Flags.GoingBack) == ~(Vehicle.Flags.Created | Vehicle.Flags.Deleted | Vehicle.Flags.Spawned | Vehicle.Flags.Inverted | Vehicle.Flags.TransferToTarget | Vehicle.Flags.TransferToSource | Vehicle.Flags.Emergency1 | Vehicle.Flags.Emergency2 | Vehicle.Flags.WaitingPath | Vehicle.Flags.Stopped | Vehicle.Flags.Leaving | Vehicle.Flags.Arriving | Vehicle.Flags.Reversed | Vehicle.Flags.TakingOff | Vehicle.Flags.Flying | Vehicle.Flags.Landing | Vehicle.Flags.WaitingSpace | Vehicle.Flags.WaitingCargo | Vehicle.Flags.GoingBack | Vehicle.Flags.WaitingTarget | Vehicle.Flags.Importing | Vehicle.Flags.Exporting | Vehicle.Flags.Parking | Vehicle.Flags.CustomName | Vehicle.Flags.OnGravel | Vehicle.Flags.WaitingLoading | Vehicle.Flags.Congestion | Vehicle.Flags.DummyTraffic | Vehicle.Flags.Underground | Vehicle.Flags.Transition | Vehicle.Flags.InsideBuilding | Vehicle.Flags.LeftHandDrive)) { if (descreaseTargetVehicleCount) { CachedTransportLineData.DecreaseTargetVehicleCount(lineID); } instance.m_vehicles.m_buffer[(int)vehicleID].Info.m_vehicleAI.SetTransportLine(vehicleID, ref instance.m_vehicles.m_buffer[(int)vehicleID], (ushort)0); } }
private static bool StartTransferPre( DepotAI __instance, ref ushort buildingID, ref Building data, TransferManager.TransferReason reason, TransferManager.TransferOffer offer) { var lineID = offer.TransportLine; //TODO: fish boats? //TODO: also check reason? - see DepotAI var info = TransportManager.instance.m_lines.m_buffer[lineID].Info; if (lineID <= 0 || info?.m_class == null || info.m_class.m_service == ItemClass.Service.Disaster) { return(true); //if it's not a proper transport line, let's not modify the behavior } var depot = CachedTransportLineData._lineData[lineID].Depot; if (!DepotUtil.ValidateDepotAndFindNewIfNeeded(lineID, ref depot, info)) { if (depot == 0) { Debug.LogWarning($"IPT2: No proper depot was found for line {lineID}!"); CachedTransportLineData.ClearEnqueuedVehicles(lineID); return(false); } Debug.LogWarning($"IPT2: Invalid or no depot was selected for line {lineID}, resetting to : {depot}!"); CachedTransportLineData.ClearEnqueuedVehicles(lineID); return(false); } if (depot == buildingID) { if (SimHelper.SimulationTime < CachedTransportLineData.GetNextSpawnTime(lineID)) { return(false); //if we need to wait before spawn, let's wait } if (!DepotUtil.CanAddVehicle(depot, ref BuildingManager.instance.m_buildings.m_buffer[depot], info)) { CachedTransportLineData.ClearEnqueuedVehicles(lineID); return(false); } CachedTransportLineData.SetNextSpawnTime(lineID, SimHelper.SimulationTime + OptionsWrapper <Settings> .Options.SpawnTimeInterval); } else { Debug.Log("IPT2: Redirecting from " + buildingID + " to " + depot); __instance.StartTransfer(depot, ref BuildingManager.instance.m_buildings.m_buffer[depot], reason, offer); return(false); } return(true); }
public static ushort AutoAssignLineDepot(ushort lineID, out Vector3 stopPosition) { stopPosition = Singleton <NetManager> .instance.m_nodes.m_buffer[(int)TransportManager.instance.m_lines.m_buffer[(int)lineID].GetStop(0)] .m_position; ushort closestDepot = DepotUtil.GetClosestDepot(lineID, stopPosition); if ((int)closestDepot != 0) { CachedTransportLineData.SetDepot(lineID, closestDepot); UnityEngine.Debug.LogWarning($"IPT2: auto assigned depot {closestDepot} to line {lineID}"); } return(closestDepot); }
public static bool Prefix(ushort lineID, ref VehicleInfo __result) { var info = TransportManager.instance.m_lines.m_buffer[lineID].Info; if (lineID <= 0 || info?.m_class == null || info.m_class.m_service == ItemClass.Service.Disaster) { return(true); //if it's not a proper transport line, let's not modify the behavior } var name = CachedTransportLineData.EnqueuedVehiclesCount(lineID) > 0 ? CachedTransportLineData.Dequeue(lineID) : CachedTransportLineData.GetRandomPrefab(lineID); __result = string.IsNullOrEmpty(name) ? null : PrefabCollection <VehicleInfo> .FindLoaded(name); return(false); }
//roughly based on TransportLine.ReplaceVehicles() public static void ReplaceVehicles(ushort lineID) { var instance = Singleton <VehicleManager> .instance; var vehicles = Singleton <VehicleManager> .instance.m_vehicles; for (ushort i = 0; i < vehicles.m_size; i++) { if (instance.m_vehicles.m_buffer[i].m_flags == 0 || instance.m_vehicles.m_buffer[i].Info == null || instance.m_vehicles.m_buffer[i].m_transportLine != lineID) { continue; } if (CachedTransportLineData.GetPrefabs(lineID).Contains(instance.m_vehicles.m_buffer[i].Info.name)) { continue; } RemoveVehicle(lineID, i, false); } }
public override bool CanLeave(ushort vehicleID, ref global::Vehicle vehicleData) { if ((int)vehicleData.m_leadingVehicle == 0 && (int)vehicleData.m_waitCounter < 12 || !base.CanLeave(vehicleID, ref vehicleData)) { //begin mod(+): track if unbunching happens CachedVehicleData.m_cachedVehicleData[(int)vehicleID].IsUnbunchingInProgress = false; //end mod return(false); } //begin mod(+): no unbunching for evac buses or if only 1 bus on line! if (vehicleData.Info?.m_class?.m_service == ItemClass.Service.Disaster || (vehicleData.m_nextLineVehicle == 0 && Singleton <TransportManager> .instance.m_lines .m_buffer[(int)vehicleData.m_transportLine].m_vehicles == vehicleID)) { CachedVehicleData.m_cachedVehicleData[vehicleID].IsUnbunchingInProgress = false; return(true); } //end mod if ((int)vehicleData.m_leadingVehicle == 0 && (int)vehicleData.m_transportLine != 0) { //begin mod(+): Check if unbunching enabled for this line & stop. track if unbunching happens. Don't divide m_waitCounter by 2^4 ushort currentStop = CachedVehicleData.m_cachedVehicleData[vehicleID].CurrentStop; if (currentStop != 0 && CachedNodeData.m_cachedNodeData[currentStop].Unbunching && CachedTransportLineData.GetUnbunchingState(vehicleData.m_transportLine)) { var canLeaveStop = Singleton <TransportManager> .instance.m_lines .m_buffer[(int)vehicleData.m_transportLine] .CanLeaveStop(vehicleData.m_targetBuilding, (int)vehicleData.m_waitCounter); CachedVehicleData.m_cachedVehicleData[vehicleID].IsUnbunchingInProgress = !canLeaveStop; return(canLeaveStop); } //end mod } //begin mod(+): track if unbunching happens CachedVehicleData.m_cachedVehicleData[vehicleID].IsUnbunchingInProgress = false; //end mod return(true); }
public static int CalculateTargetVehicleCount(ushort lineID) { var instance = TransportManager.instance; int targetVehicleCount; if (CachedTransportLineData._lineData[lineID].BudgetControl || instance.m_lines.m_buffer[lineID].Info.m_class.m_service == ItemClass.Service.Disaster) { targetVehicleCount = instance.m_lines.m_buffer[lineID].CalculateTargetVehicleCount(); CachedTransportLineData.SetTargetVehicleCount(lineID, targetVehicleCount); } else { targetVehicleCount = CachedTransportLineData.GetTargetVehicleCount(lineID); } var activeVehicles = TransportLineUtil.CountLineActiveVehicles(lineID, out _); for (var i = activeVehicles; i < targetVehicleCount - CachedTransportLineData.EnqueuedVehiclesCount(lineID); i++) { CachedTransportLineData.EnqueueVehicle(lineID, CachedTransportLineData.GetRandomPrefab(lineID)); } return(targetVehicleCount); }