public ushort GetStop(int index) { ushort stops = this.m_stops; ushort num = stops; int num2 = 0; while (num != 0) { if (index-- == 0) { return(num); } num = TransportLine.GetNextStop(num); if (num == stops) { break; } if (++num2 >= 32768) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + Environment.StackTrace); break; } } return(0); }
public static int GetStopIndex(ushort lineID, ushort stopID) { ushort stop = Singleton <TransportManager> .instance.m_lines.m_buffer[(int)lineID].m_stops; int num1 = 0; int num2 = 0; while ((int)stop != 0) { if ((int)stopID == (int)stop) { return(num1); } ++num1; stop = TransportLine.GetNextStop(stop); if (++num2 >= 32768) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + System.Environment.StackTrace); break; } } return(0); }
private void OnNextStopClick(UIComponent component, UIMouseEventParameter eventParam) { this.ChangeInstanceID(this.m_InstanceID, new InstanceID() { NetNode = TransportLine.GetNextStop(this.m_InstanceID.NetNode) }); }
private void UpdateBindings() { ushort netNode = this.m_InstanceID.NetNode; byte max; int num1 = PanelExtenderLine.CountWaitingPassengers(netNode, TransportLine.GetNextStop(netNode), out max); byte num2 = (byte)((uint)byte.MaxValue - (uint)max); this.m_PassengerCount.text = string.Format(Localization.Get("STOP_PANEL_WAITING_PEOPLE"), (object)num1); this.m_BoredCountdown.text = string.Format(Localization.Get("STOP_PANEL_BORED_TIMER"), (object)ColorUtility.ToHtmlStringRGB(this.GetColor(num2)), (object)num2); this.m_passengersInCurrent.text = NetManagerMod.m_cachedNodeData[(int)netNode].PassengersIn.ToString(); this.m_passengersInLast.text = NetManagerMod.m_cachedNodeData[(int)netNode].LastWeekPassengersIn.ToString(); this.m_passengersInAverage.text = NetManagerMod.m_cachedNodeData[(int)netNode].AveragePassengersIn.ToString(); this.m_passengersOutCurrent.text = NetManagerMod.m_cachedNodeData[(int)netNode].PassengersOut.ToString(); this.m_passengersOutLast.text = NetManagerMod.m_cachedNodeData[(int)netNode].LastWeekPassengersOut.ToString(); this.m_passengersOutAverage.text = NetManagerMod.m_cachedNodeData[(int)netNode].AveragePassengersOut.ToString(); this.m_passengersTotalCurrent.text = NetManagerMod.m_cachedNodeData[(int)netNode].PassengersTotal.ToString(); this.m_passengersTotalLast.text = NetManagerMod.m_cachedNodeData[(int)netNode].LastWeekPassengersTotal.ToString(); this.m_passengersTotalAverage.text = NetManagerMod.m_cachedNodeData[(int)netNode].AveragePassengersTotal.ToString(); if ((int)ImprovedPublicTransportMod.Settings.IntervalAggressionFactor == 0) { this.m_unbunching.Disable(); this.m_unbunching.isChecked = false; this.m_unbunching.label.text = Localization.Get("UNBUNCHING_DISABLED"); this.m_unbunching.size = new Vector2(this.m_unbunching.label.width + 22f, 16f); this.m_closeStopsUnbunching.Hide(); } else { this.m_unbunching.Enable(); this.m_unbunching.isChecked = NetManagerMod.m_cachedNodeData[(int)netNode].Unbunching; this.m_unbunching.label.text = Localization.Get("UNBUNCHING_ENABLED"); this.m_unbunching.size = new Vector2(this.m_unbunching.label.width + 22f, 16f); this.m_closeStopsUnbunching.Show(); } }
static bool Prefix(ushort lineID) { TransportLine line = Singleton <TransportManager> .instance.m_lines.m_buffer[lineID]; if (lineID == 0 || !line.Info.m_transportType.IsSharedStopTransport()) { return(true); } Log.Debug($"remove line {lineID} with stops {line.m_stops}"); ushort stops = line.m_stops; if (stops == 0) { return(true); } for (int i = 0; i < line.CountStops(lineID); i++) { stops = TransportLine.GetNextStop(stops); uint lane = Singleton <NetManager> .instance.m_nodes.m_buffer[stops].m_lane; ushort segment = Singleton <NetManager> .instance.m_lanes.m_buffer[lane].m_segment; if (lane != 0 && segment != 0) { Log.Debug($"remove stop {stops} on lane {lane} on segment {segment}"); Singleton <SharedStopsTool> .instance.RemoveSharedStop(segment, lineID, lane); } } return(true); }
private bool ArriveAtTarget(ushort vehicleID, ref Vehicle data) { if ((int)data.m_targetBuilding == 0 || (data.m_flags & Vehicle.Flags.DummyTraffic) != ~(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)) { Singleton <VehicleManager> .instance.ReleaseVehicle(vehicleID); return(true); } ushort targetBuilding = data.m_targetBuilding; ushort nextStop = 0; if ((int)data.m_transportLine != 0) { nextStop = TransportLine.GetNextStop(data.m_targetBuilding); } else if ((data.m_flags & (Vehicle.Flags.Importing | Vehicle.Flags.Exporting)) != ~(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)) { nextStop = TransportLine.GetNextStop(data.m_targetBuilding); Vector3 lastFramePosition = data.GetLastFramePosition(); byte max; if ((double)Mathf.Max(Mathf.Abs(lastFramePosition.x), Mathf.Abs(lastFramePosition.z)) > 4800.0 && PanelExtenderLine.CountWaitingPassengers(targetBuilding, nextStop, out max) == 0) { nextStop = (ushort)0; } } ushort transferSize1 = data.m_transferSize; PassengerShipAIMod.UnloadPassengers(data.Info.m_vehicleAI as PassengerShipAI, vehicleID, ref data, targetBuilding, nextStop); ushort num1 = (ushort)((uint)transferSize1 - (uint)data.m_transferSize); VehicleManagerMod.m_cachedVehicleData[(int)vehicleID].LastStopGonePassengers = (int)num1; VehicleManagerMod.m_cachedVehicleData[(int)vehicleID].CurrentStop = targetBuilding; NetManagerMod.m_cachedNodeData[(int)targetBuilding].PassengersOut += (int)num1; if ((int)nextStop == 0) { data.m_waitCounter = (byte)0; data.m_flags |= Vehicle.Flags.WaitingLoading; } else { data.m_targetBuilding = nextStop; if (!this.StartPathFind(vehicleID, ref data)) { return(true); } ushort transferSize2 = data.m_transferSize; PassengerShipAIMod.LoadPassengers(data.Info.m_vehicleAI as PassengerShipAI, vehicleID, ref data, targetBuilding, nextStop); ushort num2 = (ushort)((uint)data.m_transferSize - (uint)transferSize2); int ticketPrice = data.Info.m_vehicleAI.GetTicketPrice(vehicleID, ref data); VehicleManagerMod.m_cachedVehicleData[(int)vehicleID].Add((int)num2, ticketPrice); NetManagerMod.m_cachedNodeData[(int)targetBuilding].PassengersIn += (int)num2; data.m_flags &= 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.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; data.m_flags |= Vehicle.Flags.Stopped; data.m_waitCounter = (byte)0; } return(false); }
private void updateVehiclePosition(UILabel vehicleLabel) { try { DraggableVehicleInfo dvi = vehicleLabel.GetComponentInChildren <DraggableVehicleInfo>(); if (dvi.isDragging) { return; } ushort vehicleId = dvi.vehicleId; ushort stopId = Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_targetBuilding; var labelStation = residentCounters[Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_targetBuilding]; float destX = stationOffsetX[stopId] - labelStation.width; if (Singleton <TransportManager> .instance.m_lines.m_buffer[Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_transportLine].GetStop(0) == stopId && (Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_flags & Vehicle.Flags.Stopped) != 0) { destX = stationOffsetX[TransportLine.GetPrevStop(stopId)]; } float yOffset = vehicleYbaseOffset; int busesOnStation = vehiclesOnStation.ContainsKey(stopId) ? vehiclesOnStation[stopId] : 0; if ((Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_flags & Vehicle.Flags.Stopped) != 0) { ushort prevStop = TransportLine.GetPrevStop(stopId); destX -= labelStation.width / 2; busesOnStation = Math.Max(busesOnStation, vehiclesOnStation.ContainsKey(prevStop) ? vehiclesOnStation[prevStop] : 0); vehiclesOnStation[prevStop] = busesOnStation + 1; } else if ((Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_flags & Vehicle.Flags.Arriving) != 0) { destX += labelStation.width / 4; ushort nextStop = TransportLine.GetNextStop(stopId); busesOnStation = Math.Max(busesOnStation, vehiclesOnStation.ContainsKey(nextStop) ? vehiclesOnStation[nextStop] : 0); vehiclesOnStation[nextStop] = busesOnStation + 1; } else if ((Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_flags & Vehicle.Flags.Leaving) != 0) { destX -= labelStation.width / 4; ushort prevStop = TransportLine.GetPrevStop(stopId); busesOnStation = Math.Max(busesOnStation, vehiclesOnStation.ContainsKey(prevStop) ? vehiclesOnStation[prevStop] : 0); vehiclesOnStation[prevStop] = busesOnStation + 1; } else { ushort prevStop = TransportLine.GetPrevStop(stopId); busesOnStation = Math.Max(busesOnStation, vehiclesOnStation.ContainsKey(prevStop) ? vehiclesOnStation[prevStop] : 0); } yOffset = vehicleYbaseOffset + busesOnStation * vehicleYoffsetIncrement; vehiclesOnStation[stopId] = busesOnStation + 1; vehicleLabel.position = new Vector3(destX, yOffset); } catch (Exception e) { TLMUtils.doLog("ERROR UPDATING VEHICLE!!!"); TLMUtils.doErrorLog(e.ToString()); //redrawLine(); } }
private IEnumerable <KeyValuePair <ushort, int> > GetPositionPopularities() { ushort nextStop = TransportLine.GetNextStop(this.stopId); CitizenManager citizenManager = Singleton <CitizenManager> .instance; NetManager netManager = Singleton <NetManager> .instance; float num1 = 64f; Vector3 stopPosition = netManager.m_nodes.m_buffer[this.stopId].m_position; Vector3 nextStopPosition = netManager.m_nodes.m_buffer[nextStop].m_position; int num2 = Mathf.Max((int)(((double)stopPosition.x - (double)num1) / 8.0 + 1080.0), 0); int num3 = Mathf.Max((int)(((double)stopPosition.z - (double)num1) / 8.0 + 1080.0), 0); int num4 = Mathf.Min((int)(((double)stopPosition.x + (double)num1) / 8.0 + 1080.0), 2159); int num5 = Mathf.Min((int)(((double)stopPosition.z + (double)num1) / 8.0 + 1080.0), 2159); Dictionary <ushort, int> popularities = new Dictionary <ushort, int>(); for (int index1 = num3; index1 <= num5; ++index1) { for (int index2 = num2; index2 <= num4; ++index2) { ushort citizenInstanceId = citizenManager.m_citizenGrid[index1 * 2160 + index2]; while (citizenInstanceId != (ushort)0) { CitizenInstance citizen = citizenManager.m_instances.m_buffer[(int)citizenInstanceId]; ushort nextGridInstance = citizen.m_nextGridInstance; if ( (citizen.m_flags & CitizenInstance.Flags.WaitingTransport) != CitizenInstance.Flags.None && (double)Vector3.SqrMagnitude((Vector3)citizen.m_targetPos - stopPosition) < (double)num1 * (double)num1 && citizen.Info.m_citizenAI.TransportArriveAtSource(citizenInstanceId, ref citizen, stopPosition, nextStopPosition) ) { if (popularities.ContainsKey(citizen.m_targetBuilding)) { int previous = popularities[citizen.m_targetBuilding]; popularities.Remove(citizen.m_targetBuilding); popularities.Add(citizen.m_targetBuilding, previous + 1); } else { popularities.Add(citizen.m_targetBuilding, 1); } } citizenInstanceId = nextGridInstance; } } } return(popularities.OrderByDescending(key => key.Value)); }
private void updateVehiclePosition(ushort vehicleId, UILabel vehicleLabel) { try { ushort stopId = Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_targetBuilding; var labelStation = residentCounters[Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_targetBuilding]; float destX = stationOffsetX[stopId] - labelStation.width / 4 * 3; if (Singleton <TransportManager> .instance.m_lines.m_buffer[Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_transportLine].GetStop(0) == stopId && (Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_flags & Vehicle.Flags.Stopped) != 0) { destX = stationOffsetX[TransportLine.GetPrevStop(stopId)] + labelStation.width / 4; } float yOffset = vehicleYbaseOffset; int busesOnStation = vehiclesOnStation.ContainsKey(stopId) ? vehiclesOnStation[stopId] : 0; if ((Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_flags & Vehicle.Flags.Stopped) != 0) { ushort prevStop = TransportLine.GetPrevStop(stopId); destX = stationOffsetX[prevStop] - labelStation.width / 4; busesOnStation = Math.Max(busesOnStation, vehiclesOnStation.ContainsKey(prevStop) ? vehiclesOnStation[prevStop] : 0); vehiclesOnStation[prevStop] = busesOnStation + 1; } else if ((Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_flags & Vehicle.Flags.Arriving) != 0) { destX += labelStation.width / 4; ushort nextStop = TransportLine.GetNextStop(stopId); busesOnStation = Math.Max(busesOnStation, vehiclesOnStation.ContainsKey(nextStop) ? vehiclesOnStation[nextStop] : 0); vehiclesOnStation[nextStop] = busesOnStation + 1; } else if ((Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_flags & Vehicle.Flags.Leaving) != 0) { destX -= labelStation.width / 4; ushort prevStop = TransportLine.GetPrevStop(stopId); busesOnStation = Math.Max(busesOnStation, vehiclesOnStation.ContainsKey(prevStop) ? vehiclesOnStation[prevStop] : 0); vehiclesOnStation[prevStop] = busesOnStation + 1; } else { ushort prevStop = TransportLine.GetPrevStop(stopId); busesOnStation = Math.Max(busesOnStation, vehiclesOnStation.ContainsKey(prevStop) ? vehiclesOnStation[prevStop] : 0); } yOffset = vehicleYbaseOffset + busesOnStation * vehicleYoffsetIncrement; vehiclesOnStation[stopId] = busesOnStation + 1; vehicleLabel.position = new Vector3(destX, yOffset); } #pragma warning disable CS0168 // Variable is declared but never used catch (Exception e) #pragma warning restore CS0168 // Variable is declared but never used { TLMUtils.doLog("ERROR UPDATING VEHICLE!!!"); redrawLine(); } }
private void RecalculateSharedStopSegments() { foreach (TransportLine line in Singleton <TransportManager> .instance.m_lines.m_buffer) { if (line.Info.m_class.m_subService != ItemClass.SubService.PublicTransportBus && line.Info.m_class.m_subService != ItemClass.SubService.PublicTransportTram && line.Info.m_class.m_subService != ItemClass.SubService.PublicTransportTrolleybus && line.Info.m_class.name != "Sightseeing Bus Line") { continue; } ushort lineID = Singleton <NetManager> .instance.m_nodes.m_buffer[line.m_stops].m_transportLine; if (lineID == 0) { continue; } ushort stops = line.m_stops; if (stops == 0) { continue; } for (int i = 0; i < line.CountStops(lineID); i++) { stops = TransportLine.GetNextStop(stops); uint lane = Singleton <NetManager> .instance.m_nodes.m_buffer[stops].m_lane; ushort segment = Singleton <NetManager> .instance.m_lanes.m_buffer[lane].m_segment; if (lane != 0 && segment != 0) { Singleton <SharedStopsTool> .instance.AddSharedStop(segment, lineID, lane); NetSegment segData = Singleton <NetManager> .instance.m_segments.m_buffer[segment]; if (segData.Info.m_netAI is RoadAI roadAI) { roadAI.UpdateSegmentFlags(segment, ref Singleton <NetManager> .instance.m_segments.m_buffer[segment]); } else if (segData.Info.m_netAI is RoadBridgeAI roadBridgeAI) { roadBridgeAI.UpdateSegmentStopFlags(segment, ref Singleton <NetManager> .instance.m_segments.m_buffer[segment]); } } if (stops == line.m_stops) { break; } } Log.Debug($"Stops found {sharedStopSegments.Count}"); } }
protected static void FillStops(WTSLine lineObj, List <BridgeTLM.DestinationPoco> destinations) { if (destinations.Count == 0) { return; } var firstStop = destinations[0].stopId; var curStop = firstStop; var nextStop = TransportLine.GetNextStop(curStop); ushort prevStop = TransportLine.GetPrevStop(curStop); var destinationId = destinations[1 % destinations.Count].stopId; var destinationStr = destinations[1 % destinations.Count].stopName; var buildingSing = WriteTheSignsMod.Controller.BuildingPropsSingleton; do { var destinationInfo = destinations.Where(x => x.stopId == curStop).FirstOrDefault(); if (!(destinationInfo is null)) { var nextDest = destinations.IndexOf(destinationInfo) + 1; destinationId = destinations[nextDest % destinations.Count].stopId; destinationStr = destinations[nextDest % destinations.Count].stopName; if (destinationStr is null) { destinationStr = WriteTheSignsMod.Controller.ConnectorTLM.GetStopName(destinationId, lineObj); } } buildingSing.m_stopInformation[curStop] = new Xml.StopInformation { m_lineId = (ushort)lineObj.lineId, m_regionalLine = lineObj.regional, m_destinationId = destinationId, m_nextStopId = nextStop, m_previousStopId = prevStop, m_stopId = curStop, m_destinationString = destinationStr }; // LogUtils.DoWarnLog($"([{tl.m_lineNumber}] - {tl.Info}){buildingSing.m_stopInformation[curStop] } || { GetStopName(curStop, lineId)} || FS={firstStop} ({startStation}-{endStation})"); prevStop = curStop; curStop = nextStop; nextStop = TransportLine.GetNextStop(nextStop); } while (curStop != 0 && curStop != firstStop); }
public static void Postfix(ushort __state) { var lineID = __state; if (!CachedTransportLineData._init || (SimulationManager.instance.m_currentFrameIndex & 4095U) >= 3840U || !TransportManager.instance.m_lines.m_buffer[lineID].Complete) { return; } var stops1 = TransportManager.instance.m_lines.m_buffer[lineID].m_stops; var stop1 = stops1; do { CachedNodeData.m_cachedNodeData[stop1].StartNewWeek(); stop1 = TransportLine.GetNextStop(stop1); } while (stops1 != stop1 && stop1 != 0); var itemClass = TransportManager.instance.m_lines.m_buffer[lineID].Info.m_class; var prefabs = VehiclePrefabs.instance.GetPrefabs(itemClass.m_service, itemClass.m_subService, itemClass.m_level); var amount = 0; TransportLineUtil.CountLineActiveVehicles(lineID, out _, (num3) => { var prefabData = Array.Find(prefabs, item => item.PrefabDataIndex == VehicleManager.instance.m_vehicles.m_buffer[num3].Info.m_prefabDataIndex); if (prefabData == null) { return; } amount += prefabData.MaintenanceCost; CachedVehicleData.m_cachedVehicleData[num3].StartNewWeek(prefabData.MaintenanceCost); }); if (amount != 0) { Singleton <EconomyManager> .instance.FetchResource(EconomyManager.Resource.Maintenance, amount, TransportManager.instance.m_lines.m_buffer[lineID].Info.m_class); } }
private int GetStopIndex() { ushort stop = Singleton <TransportManager> .instance.m_lines.m_buffer[this.transportLineId].m_stops; int index = 1; while (stop != 0) { if (this.stopId == (int)stop) { return(index); } ++index; stop = TransportLine.GetNextStop(stop); if (index >= 32768) { break; } } return(0); }
private void UpdateStopButtons(ushort lineID) { ushort stop = Singleton <TransportManager> .instance.m_lines.m_buffer[(int)lineID].m_stops; foreach (UIComponent uiComponent in this.m_stopButtons.items) { uiComponent.Find <UILabel>("PassengerCount").text = Singleton <TransportManager> .instance.m_lines.m_buffer[(int)lineID].CalculatePassengerCount(stop).ToString(); //begin mod(+): add tooltip with stop name var id = InstanceID.Empty; id.NetNode = stop; var name = Singleton <InstanceManager> .instance.GetName(id) ?? string.Empty; if (string.Empty == name) { name = StopListBoxRow.GenerateStopName(name, stop, -1); } uiComponent.tooltip = name; //end mod stop = TransportLine.GetNextStop(stop); } }
private static List <string> GetDistrictsForLine(TransportLine transportLine, NetManager theNetworkManager, DistrictManager theDistrictManager, out int stopCount) { var stop = TransportLine.GetPrevStop(transportLine.m_stops); var firstStop = stop; stopCount = 0; var districts = new List <string>(); while (stop != 0) { stopCount++; var position = theNetworkManager.m_nodes.m_buffer[stop].m_position; var district = theDistrictManager.GetDistrict(position); if (district != 0) { var districtName = theDistrictManager.GetDistrictName(district); districtName = districtName.Trim(); if (districts.Contains(districtName) == false) { districts.Add(districtName); } } else { if (districts.Contains(string.Empty) == false) { districts.Add(string.Empty); } } stop = TransportLine.GetNextStop(stop); if (stop == firstStop) { break; } } return(districts); }
public static void BeforeRemoveStop(ref TransportLine __instance, int index, ushort lineID) { if ((__instance.m_flags & TransportLine.Flags.Temporary) != TransportLine.Flags.None || __instance.m_stops > NetManager.MAX_NODE_COUNT) { return; } ushort num; if (index == -1) { index += __instance.CountStops(lineID); } num = __instance.m_stops; for (int i = 0; i < index && num <= NetManager.MAX_NODE_COUNT; i++) { num = TransportLine.GetNextStop(num); if (num == __instance.m_stops) { break; } } WTSBuildingDataCaches.PurgeStopCache(num); }
public static void SimulationStepImpl(ref TransportLine line, ushort lineID) { if (!line.Complete) { return; } TransportInfo info = line.Info; SimulationManager instance1 = Singleton <SimulationManager> .instance; bool isLineEnabled = !instance1.m_isNightTime ? (line.m_flags & TransportLine.Flags.DisabledDay) == TransportLine.Flags.None : (line.m_flags & TransportLine.Flags.DisabledNight) == TransportLine.Flags.None; bool flag = TransportLineMod.SetLineStatus(lineID, isLineEnabled); int num1 = line.CountVehicles(lineID); int num2 = 0; if (TransportLineMod._lineData[(int)lineID].BudgetControl) { num2 = !isLineEnabled ? 0 : (!flag ? Mathf.CeilToInt((float)((double)TransportLineMod.GetBudget(lineID, instance1.m_isNightTime, info.m_class) * (double)TransportLineMod.GetLength(lineID) / ((double)info.m_defaultVehicleDistance * 100.0))) : num1); TransportLineMod._lineData[(int)lineID].TargetVehicleCount = num2; } else if (isLineEnabled) { num2 = TransportLineMod._lineData[(int)lineID].TargetVehicleCount; } if (num1 < num2) { if ((double)SimHelper.instance.SimulationTime >= (double)TransportLineMod._lineData[(int)lineID].NextSpawnTime) { int index1 = instance1.m_randomizer.Int32((uint)line.CountStops(lineID)); ushort stop = line.GetStop(index1); if (info.m_vehicleReason != TransferManager.TransferReason.None && (int)stop != 0) { TransferManager.TransferOffer offer = new TransferManager.TransferOffer(); offer.Priority = num2 - num1 + 1; offer.TransportLine = lineID; offer.Position = Singleton <NetManager> .instance.m_nodes.m_buffer[(int)stop].m_position; offer.Amount = 1; offer.Active = false; ushort depot = TransportLineMod._lineData[(int)lineID].Depot; if (TransportLineMod.IsLineDepotStillValid(lineID, ref depot)) { BuildingManager instance2 = Singleton <BuildingManager> .instance; if (TransportLineMod.CanAddVehicle(depot, ref instance2.m_buildings.m_buffer[(int)depot])) { string prefabName; if (TransportLineMod.EnqueuedVehiclesCount(lineID) > 0) { prefabName = TransportLineMod.Dequeue(lineID); } else { int num3 = num2 - num1; for (int index2 = 0; index2 < num3; ++index2) { TransportLineMod.EnqueueVehicle(lineID, TransportLineMod.GetRandomPrefab(lineID), false); } prefabName = TransportLineMod.Dequeue(lineID); } if (prefabName != "") { int num4 = (int)DepotAIMod.StartTransfer(depot, ref instance2.m_buildings.m_buffer[(int)depot], info.m_vehicleReason, offer, prefabName); } else { instance2.m_buildings.m_buffer[(int)depot].Info.m_buildingAI.StartTransfer(depot, ref instance2.m_buildings.m_buffer[(int)depot], info.m_vehicleReason, offer); } TransportLineMod._lineData[(int)lineID].NextSpawnTime = SimHelper.instance.SimulationTime + (float)ImprovedPublicTransportMod.Settings.SpawnTimeInterval; } else { TransportLineMod.ClearEnqueuedVehicles(lineID); } } } } } else if (num1 > num2) { TransportLineMod.RemoveRandomVehicle(lineID, false); } if ((instance1.m_currentFrameIndex & 4095U) < 3840U) { return; } line.m_passengers.Update(); Singleton <TransportManager> .instance.m_passengers[(int)info.m_transportType].Add(ref line.m_passengers); line.m_passengers.Reset(); ushort stops = line.m_stops; ushort stop1 = stops; do { NetManagerMod.m_cachedNodeData[(int)stop1].StartNewWeek(); stop1 = TransportLine.GetNextStop(stop1); }while ((int)stops != (int)stop1 && (int)stop1 != 0); VehicleManager instance3 = Singleton <VehicleManager> .instance; PrefabData[] prefabs = VehiclePrefabs.instance.GetPrefabs(info.m_class.m_subService); int amount = 0; for (ushort index = line.m_vehicles; (int)index != 0; index = instance3.m_vehicles.m_buffer[(int)index].m_nextLineVehicle) { Vehicle vehicle = instance3.m_vehicles.m_buffer[(int)index]; PrefabData prefabData = Array.Find <PrefabData>(prefabs, (Predicate <PrefabData>)(item => item.PrefabDataIndex == vehicle.Info.m_prefabDataIndex)); if (prefabData != null) { amount += prefabData.MaintenanceCost; VehicleManagerMod.m_cachedVehicleData[(int)index].StartNewWeek(prefabData.MaintenanceCost); } } if (amount == 0) { return; } Singleton <EconomyManager> .instance.FetchResource(EconomyManager.Resource.Maintenance, amount, info.m_class); }
protected void CustomArriveAtDestination(ushort instanceID, ref CitizenInstance citizenData, bool success) { uint citizenId = citizenData.m_citizen; if (citizenId != 0) { CitizenManager citizenMan = Singleton <CitizenManager> .instance; citizenMan.m_citizens.m_buffer[citizenId].SetVehicle(citizenId, 0, 0u); if ((citizenData.m_flags & CitizenInstance.Flags.TargetIsNode) != CitizenInstance.Flags.None) { if (success) { ushort targetBuildingId = citizenData.m_targetBuilding; if (targetBuildingId != 0) { ushort transportLineId = Singleton <NetManager> .instance.m_nodes.m_buffer[targetBuildingId].m_transportLine; if (transportLineId != 0) { TransportInfo info = Singleton <TransportManager> .instance.m_lines.m_buffer[transportLineId].Info; if (info.m_vehicleType == VehicleInfo.VehicleType.None) { targetBuildingId = (((instanceID & 1) != 0) ? TransportLine.GetPrevStop(targetBuildingId) : TransportLine.GetNextStop(targetBuildingId)); if (targetBuildingId != 0) { citizenData.m_flags |= CitizenInstance.Flags.OnTour; ((CitizenAI)this).SetTarget(instanceID, ref citizenData, targetBuildingId, true); return; } } citizenData.m_flags |= CitizenInstance.Flags.OnTour; this.WaitTouristVehicle(instanceID, ref citizenData, targetBuildingId); return; } } } } else { if (success) { citizenMan.m_citizens.m_buffer[citizenId].SetLocationByBuilding(citizenId, citizenData.m_targetBuilding); // NON-STOCK CODE START Constants.ManagerFactory.ExtCitizenManager.OnArriveAtDestination(citizenId, ref citizenMan.m_citizens.m_buffer[citizenId]); // NON-STOCK CODE END } if (citizenData.m_targetBuilding != 0 && citizenMan.m_citizens.m_buffer[citizenId].CurrentLocation == Citizen.Location.Visit) { BuildingManager buildingMan = Singleton <BuildingManager> .instance; BuildingInfo info = buildingMan.m_buildings.m_buffer[citizenData.m_targetBuilding].Info; info.m_buildingAI.VisitorEnter(citizenData.m_targetBuilding, ref buildingMan.m_buildings.m_buffer[citizenData.m_targetBuilding], citizenId); } } } if ((citizenData.m_flags & CitizenInstance.Flags.HangAround) != 0 && success) { return; } ((CitizenAI)this).SetSource(instanceID, ref citizenData, (ushort)0); ((CitizenAI)this).SetTarget(instanceID, ref citizenData, (ushort)0); citizenData.Unspawn(instanceID); }
public static void SimulationStep(ref TransportLine thisLine, ushort lineID) { //begin mod(+): change for initialization if (!CachedTransportLineData._init) { return; } //end mod TransportInfo info = thisLine.Info; NetManager instance1 = Singleton <NetManager> .instance; SimulationManager instance2 = Singleton <SimulationManager> .instance; Notification.Problem problems1 = Notification.Problem.None; Notification.Problem problem1 = Notification.Problem.None; Notification.Problem problem2 = Notification.Problem.None; Notification.Problem problems2 = Notification.Problem.TooLong | Notification.Problem.MajorProblem; if ((int)thisLine.m_stops != 0) { problem1 = instance1.m_nodes.m_buffer[(int)thisLine.m_stops].m_problems; problems1 = problem1; } bool flag1 = (instance2.m_currentFrameIndex & 4095U) >= 3840U; float num1 = 0.0f; bool flag2 = false; if (thisLine.Complete) { //begin mod(*): moved this section to a separate method int num3 = CountLineActiveVehicles(lineID, out int num2); //end mod bool flag3 = !instance2.m_isNightTime ? (thisLine.m_flags & TransportLine.Flags.DisabledDay) == TransportLine.Flags.None : (thisLine.m_flags & TransportLine.Flags.DisabledNight) == TransportLine.Flags.None; uint range = 0; int num6 = 0; int num7 = 0; int num8 = 0; if ((int)thisLine.m_stops != 0) { CitizenManager instance3 = Singleton <CitizenManager> .instance; ushort stops = thisLine.m_stops; ushort num4 = stops; int num5 = 0; while ((int)num4 != 0) { ushort num9 = 0; if (flag3) { instance1.m_nodes.m_buffer[(int)num4].m_flags &= NetNode.Flags.OneWayOutTrafficLights | NetNode.Flags.UndergroundTransition | NetNode.Flags.Created | NetNode.Flags.Deleted | NetNode.Flags.Original | NetNode.Flags.End | NetNode.Flags.Middle | NetNode.Flags.Bend | NetNode.Flags.Junction | NetNode.Flags.Moveable | NetNode.Flags.Untouchable | NetNode.Flags.Outside | NetNode.Flags.Temporary | NetNode.Flags.Double | NetNode.Flags.Fixed | NetNode.Flags.OnGround | NetNode.Flags.Ambiguous | NetNode.Flags.Water | NetNode.Flags.Sewage | NetNode.Flags.ForbidLaneConnection | NetNode.Flags.LevelCrossing | NetNode.Flags.OneWayIn | NetNode.Flags.Heating | NetNode.Flags.Electricity | NetNode.Flags.Collapsed | NetNode.Flags.DisableOnlyMiddle | NetNode.Flags.AsymForward | NetNode.Flags.AsymBackward | NetNode.Flags.CustomTrafficLights; } else { instance1.m_nodes.m_buffer[(int)num4].m_flags |= NetNode.Flags.Disabled; } problem2 |= (instance1.m_nodes.m_buffer[(int)num4].m_problems ^ problem1) & problems2; for (int index = 0; index < 8; ++index) { ushort segment = instance1.m_nodes.m_buffer[(int)num4].GetSegment(index); if ((int)segment != 0 && (int)instance1.m_segments.m_buffer[(int)segment].m_startNode == (int)num4) { num6 += Mathf.Max((int)instance1.m_segments.m_buffer[(int)segment].m_trafficLightState0, (int)instance1.m_segments.m_buffer[(int)segment].m_trafficLightState1); num1 += instance1.m_segments.m_buffer[(int)segment].m_averageLength; num7 += (int)instance1.m_segments.m_buffer[(int)segment].m_trafficBuffer; num9 = instance1.m_segments.m_buffer[(int)segment].m_endNode; if ((instance1.m_segments.m_buffer[(int)segment].m_flags & NetSegment.Flags.PathLength) == NetSegment.Flags.None) { flag2 = true; break; } break; } } ushort num10 = instance1.m_nodes.m_buffer[(int)num4].m_targetCitizens; int num11 = 0; while ((int)num10 != 0) { ++num8; num10 = instance3.m_instances.m_buffer[(int)num10].m_nextTargetInstance; if (++num11 >= 32768) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + System.Environment.StackTrace); break; } } ++range; num4 = num9; if ((int)num4 != (int)stops) { if (++num5 >= 32768) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + System.Environment.StackTrace); break; } } else { break; } } } if (!flag2) { thisLine.m_totalLength = num1; } if ((int)range != 0) { thisLine.m_averageInterval = (byte)Mathf.Min((float)byte.MaxValue, (float)(((long)num6 + (long)(range >> 1)) / (long)range)); } //begin mod(-): let's count maintenance once a week //end mod TransferManager.TransferReason vehicleReason = info.m_vehicleReason; if (vehicleReason != TransferManager.TransferReason.None) { //begin mod: calculate target vehicle count or read saved value int num4 = 0; if (CachedTransportLineData._lineData[(int)lineID].BudgetControl || info.m_class.m_service == ItemClass.Service.Disaster) { num4 = !flag3 ? 0 : (!flag2 ? thisLine.CalculateTargetVehicleCount() : num3); CachedTransportLineData._lineData[(int)lineID].TargetVehicleCount = num4; } else if (flag3) { num4 = CachedTransportLineData._lineData[(int)lineID].TargetVehicleCount; } //end mod if (range != 0U && num2 < num4) { ushort stop = thisLine.GetStop(instance2.m_randomizer.Int32(range)); if (stop != (ushort)0) { Singleton <TransferManager> .instance.AddIncomingOffer(vehicleReason, new TransferManager.TransferOffer() { Priority = num4 - num2 + 1, TransportLine = lineID, Position = instance1.m_nodes.m_buffer[(int)stop].m_position, Amount = 1, Active = false }); } } else if (num3 > num4) { //begin mod(*): encapsulate into method TransportLineDetour.RemoveActiveVehicle(lineID, false, num3); //end mod } } TransferManager.TransferReason material = info.m_citizenReason; switch (material) { case TransferManager.TransferReason.None: goto label_99; case TransferManager.TransferReason.Entertainment: switch (instance2.m_randomizer.Int32(4U)) { case 0: material = TransferManager.TransferReason.Entertainment; break; case 1: material = TransferManager.TransferReason.EntertainmentB; break; case 2: material = TransferManager.TransferReason.EntertainmentC; break; case 3: material = TransferManager.TransferReason.EntertainmentD; break; } //begin mod: to shut up compiler break; //end mod case TransferManager.TransferReason.TouristA: switch (instance2.m_randomizer.Int32(20U)) { case 0: case 1: case 2: case 3: material = TransferManager.TransferReason.TouristA; break; case 4: case 5: case 6: case 7: material = TransferManager.TransferReason.TouristB; break; case 8: case 9: case 10: case 11: material = TransferManager.TransferReason.TouristC; break; case 12: case 13: case 14: case 15: material = TransferManager.TransferReason.TouristD; break; case 16: material = TransferManager.TransferReason.Entertainment; break; case 17: material = TransferManager.TransferReason.EntertainmentB; break; case 18: material = TransferManager.TransferReason.EntertainmentC; break; case 19: material = TransferManager.TransferReason.EntertainmentD; break; } //begin mod: to shut up compiler break; //end mod } if (vehicleReason == TransferManager.TransferReason.None) { if ((double)thisLine.m_totalLength <= 1920.0) { if (!flag2) { problems1 = Notification.RemoveProblems(problems1, Notification.Problem.TooLong); } } else if ((double)thisLine.m_totalLength <= 3840.0) { if (!flag2) { problems1 = Notification.RemoveProblems(problems1, Notification.Problem.TooLong); } num7 = (num7 * 17 + 10) / 20; } else if ((double)thisLine.m_totalLength <= 5760.0) { if (!flag2) { problems1 = Notification.AddProblems( Notification.RemoveProblems(problems1, Notification.Problem.TooLong), Notification.Problem.TooLong); } num7 = (num7 * 14 + 10) / 20; } else { if (!flag2) { problems1 = Notification.AddProblems(problems1, Notification.Problem.TooLong | Notification.Problem.MajorProblem); } num7 = (num7 * 8 + 10) / 20; } if (flag1) { Singleton <StatisticsManager> .instance.Acquire <StatisticInt32>(StatisticType.WalkingTourLength) .Add(Mathf.RoundToInt(thisLine.m_totalLength)); } } else { num7 = Mathf.Max(0, num7 + 50 - (int)thisLine.m_ticketPrice * 50 / Mathf.Max(1, info.m_ticketPrice)); } int num12; if (flag3) { if (flag2) { num12 = num8; } else { int num4 = Mathf.Max(1, info.m_citizenPullRequirement); num12 = (num7 + num4 - 1) / num4; } } else { num12 = 0; } if ((int)range != 0 && num8 < num12) { ushort stop = thisLine.GetStop(instance2.m_randomizer.Int32(range)); if ((int)stop != 0) { Singleton <TransferManager> .instance.AddOutgoingOffer(material, new TransferManager.TransferOffer() { Priority = Mathf.Max(1, (num12 - num8) * 8 / num12), TransportLine = lineID, Position = Singleton <NetManager> .instance.m_nodes.m_buffer[(int)stop].m_position, Amount = 1, Active = false }); } } } else { if ((int)thisLine.m_stops != 0) { ushort stops = thisLine.m_stops; ushort num2 = stops; int num3 = 0; while ((int)num2 != 0) { ushort num4 = 0; problem2 |= (instance1.m_nodes.m_buffer[(int)num2].m_problems ^ problem1) & problems2; for (int index = 0; index < 8; ++index) { ushort segment = instance1.m_nodes.m_buffer[(int)num2].GetSegment(index); if ((int)segment != 0 && (int)instance1.m_segments.m_buffer[(int)segment].m_startNode == (int)num2) { num1 += instance1.m_segments.m_buffer[(int)segment].m_averageLength; num4 = instance1.m_segments.m_buffer[(int)segment].m_endNode; if ((instance1.m_segments.m_buffer[(int)segment].m_flags & NetSegment.Flags.PathLength) == NetSegment.Flags.None) { flag2 = true; break; } break; } } num2 = num4; if ((int)num2 != (int)stops) { if (++num3 >= 32768) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + System.Environment.StackTrace); break; } } else { break; } } } if (!flag2) { thisLine.m_totalLength = num1; if (info.m_citizenReason != TransferManager.TransferReason.None && info.m_vehicleReason == TransferManager.TransferReason.None) { problems1 = (double)thisLine.m_totalLength > 1920.0 ? ((double)thisLine.m_totalLength > 3840.0 ? ((double)thisLine.m_totalLength > 5760.0 ? Notification.AddProblems(problems1, Notification.Problem.TooLong | Notification.Problem.MajorProblem) : Notification.AddProblems( Notification.RemoveProblems(problems1, Notification.Problem.TooLong), Notification.Problem.TooLong)) : Notification.RemoveProblems(problems1, Notification.Problem.TooLong)) : Notification.RemoveProblems(problems1, Notification.Problem.TooLong); } } } label_99: if ((int)thisLine.m_stops != 0 && (problem2 | problems1 ^ problem1) != Notification.Problem.None) { ushort stops = thisLine.m_stops; ushort num2 = stops; int num3 = 0; while ((int)num2 != 0) { Notification.Problem problems = instance1.m_nodes.m_buffer[(int)num2].m_problems; Notification.Problem problem3 = Notification.RemoveProblems(problems, problems2); if ((problems1 & problems2 & ~(Notification.Problem.MajorProblem | Notification.Problem.FatalProblem)) != Notification.Problem.None) { problem3 = Notification.AddProblems(problem3, problems1 & problems2); } if (problems != problem3) { instance1.m_nodes.m_buffer[(int)num2].m_problems = problem3; instance1.UpdateNodeNotifications(num2, problems, problem3); } num2 = TransportLine.GetNextStop(num2); if ((int)num2 != (int)stops) { if (++num3 >= 32768) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + System.Environment.StackTrace); break; } } else { break; } } } if (!flag1) { return; } thisLine.m_passengers.Update(); Singleton <TransportManager> .instance.m_passengers[(int)info.m_transportType] .Add(ref thisLine.m_passengers); thisLine.m_passengers.Reset(); //begin mod(+): update statistics + fetch maintenance costs if (thisLine.Complete) { ushort stops1 = thisLine.m_stops; ushort stop1 = stops1; do { CachedNodeData.m_cachedNodeData[(int)stop1].StartNewWeek(); stop1 = TransportLine.GetNextStop(stop1); } while ((int)stops1 != (int)stop1 && (int)stop1 != 0); var itemClass = info.m_class; PrefabData[] prefabs = VehiclePrefabs.instance.GetPrefabs(itemClass.m_service, itemClass.m_subService, itemClass.m_level); int amount = 0; CountLineActiveVehicles(lineID, out int _, (num3) => { Vehicle vehicle = VehicleManager.instance.m_vehicles.m_buffer[num3]; PrefabData prefabData = Array.Find(prefabs, item => item.PrefabDataIndex == vehicle.Info.m_prefabDataIndex); if (prefabData != null) { amount += prefabData.MaintenanceCost; CachedVehicleData.m_cachedVehicleData[num3].StartNewWeek(prefabData.MaintenanceCost); } }); if (amount != 0) { Singleton <EconomyManager> .instance.FetchResource(EconomyManager.Resource.Maintenance, amount, info.m_class); } //end mod } }
private bool ArriveAtTarget(ushort vehicleID, ref Vehicle data) { if ((int)data.m_targetBuilding == 0) { Singleton <VehicleManager> .instance.ReleaseVehicle(vehicleID); return(true); } ushort nextStop = 0; if ((int)data.m_transportLine != 0) { nextStop = TransportLine.GetNextStop(data.m_targetBuilding); } ushort targetBuilding = data.m_targetBuilding; //begin mod(+): track stats ushort transferSize1 = data.m_transferSize; //end mod PassengerFerryAIDetour.UnloadPassengers(data.Info.m_vehicleAI as PassengerFerryAI, vehicleID, ref data, targetBuilding, nextStop); //begin mod(+): track stats ushort num1 = (ushort)((uint)transferSize1 - (uint)data.m_transferSize); VehicleManagerMod.m_cachedVehicleData[(int)vehicleID].LastStopGonePassengers = (int)num1; VehicleManagerMod.m_cachedVehicleData[(int)vehicleID].CurrentStop = targetBuilding; NetManagerMod.m_cachedNodeData[(int)targetBuilding].PassengersOut += (int)num1; //end mod if ((int)nextStop == 0) { data.m_flags |= Vehicle.Flags.GoingBack; if (!this.StartPathFind(vehicleID, ref data)) { return(true); } data.m_flags &= 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.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; data.m_flags |= Vehicle.Flags.Stopped; data.m_waitCounter = (byte)0; } else { data.m_targetBuilding = nextStop; if (!this.StartPathFind(vehicleID, ref data)) { return(true); } //begin mod(+): track stats ushort transferSize2 = data.m_transferSize; //end mod PassengerFerryAIDetour.LoadPassengers(data.Info.m_vehicleAI as PassengerFerryAI, vehicleID, ref data, targetBuilding, nextStop); //begin mod(+): track stats ushort num2 = (ushort)((uint)data.m_transferSize - (uint)transferSize2); int ticketPrice = data.Info.m_vehicleAI.GetTicketPrice(vehicleID, ref data); VehicleManagerMod.m_cachedVehicleData[(int)vehicleID].Add((int)num2, ticketPrice); NetManagerMod.m_cachedNodeData[(int)targetBuilding].PassengersIn += (int)num2; //end mod data.m_flags &= 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.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; data.m_flags |= Vehicle.Flags.Stopped; data.m_waitCounter = (byte)0; } return(false); }
public new bool RayCast(Ray ray, float rayLength, out Vector3 hit, out ushort lineIndex, out int stopIndex, out int segmentIndex) { int num = 0; int num2 = 0; int num3 = 0; int num4 = 0; float num5 = 16f; float num6 = 9f; Vector3 vector = Vector3.zero; Vector3 vector2 = Vector3.zero; Vector3 origin = ray.origin; Vector3 normalized = ray.direction.normalized; Vector3 b = ray.origin + normalized * rayLength; Segment3 segment = new Segment3(origin, b); NetManager instance = Singleton <NetManager> .instance; for (int i = 1; i < 256; i++) { if ((this.m_lines.m_buffer[i].m_flags & (TransportLine.Flags.Created | TransportLine.Flags.Temporary)) == TransportLine.Flags.Created && this.m_lines.m_buffer[i].m_bounds.IntersectRay(ray)) { TransportManager.LineSegment[] array = this.m_lineSegments[i]; Bezier3[] array2 = this.m_lineCurves[i]; ushort stops = this.m_lines.m_buffer[i].m_stops; ushort num7 = stops; int num8 = 0; while (num7 != 0) { Vector3 position = instance.m_nodes.m_buffer[(int)num7].m_position; float num9 = Line3.DistanceSqr(ray.direction, ray.origin - position); if (num9 < num5) { num = i; num3 = num8; num5 = num9; vector = position; } if (array.Length > num8 && array[num8].m_bounds.IntersectRay(ray)) { int curveStart = array[num8].m_curveStart; int curveEnd = array[num8].m_curveEnd; for (int j = curveStart; j < curveEnd; j++) { Vector3 min = array2[j].Min() - new Vector3(3f, 3f, 3f); Vector3 max = array2[j].Max() + new Vector3(3f, 3f, 3f); Bounds bounds = default(Bounds); bounds.SetMinMax(min, max); if (bounds.IntersectRay(ray)) { float t; float num10; num9 = array2[j].DistanceSqr(segment, out t, out num10); if (num9 < num6) { num2 = i; num4 = num8; num6 = num9; vector2 = array2[j].Position(t); } } } } num7 = TransportLine.GetNextStop(num7); if (num7 == stops) { break; } if (++num8 >= 32768) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + Environment.StackTrace); break; } } } } if (num != 0) { hit = vector; lineIndex = (ushort)num; stopIndex = num3; segmentIndex = -1; return(true); } if (num2 != 0) { hit = vector2; lineIndex = (ushort)num2; stopIndex = -1; segmentIndex = num4; return(true); } hit = Vector3.zero; lineIndex = 0; stopIndex = -1; segmentIndex = -1; return(false); }
public static void DrawCityMap() { TLMController controller = TLMController.Instance; var linesByType = new Dictionary <TransportInfo.TransportType, List <ushort> >(); foreach (object type in Enum.GetValues(typeof(TransportInfo.TransportType))) { linesByType[(TransportInfo.TransportType)type] = new List <ushort>(); } int nextStationId = 1; for (ushort lineId = 0; lineId < TransportManager.instance.m_lines.m_size; lineId++) { TransportLine t = TransportManager.instance.m_lines.m_buffer[lineId]; if (t.m_lineNumber > 0 && allowedTypesToDraw.Contains(t.Info.m_transportType) && (t.m_flags & TransportLine.Flags.Complete) != TransportLine.Flags.None) { linesByType[t.Info.m_transportType].Add(lineId); } } Func <Vector3, float, Vector2> calc = MapUtils.GridPosition81Tiles; NetManager nm = NetManager.instance; float invPrecision = 35; var stations = new List <TLMMapStation>(); var transportLines = new Dictionary <ushort, TLMMapTransportLine>(); foreach (var tt in linesByType.OrderByDescending(x => GetRangeFromTransportType(x.Key))) { foreach (ushort lineId in tt.Value) { ref TransportLine t = ref TransportManager.instance.m_lines.m_buffer[lineId]; float range = GetRangeFromTransportType(t.Info.m_transportType); int stopsCount = t.CountStops(lineId); if (stopsCount == 0) { continue; } Color color = t.m_color; t.GetActive(out bool day, out bool night); transportLines[lineId] = new TLMMapTransportLine(color, day, night, lineId); ushort startStop = t.m_stops; ushort nextStop = startStop; do { string name = TLMStationUtils.GetStationName(nextStop, lineId, t.Info.m_stationSubService, out ItemClass.Service service, out ItemClass.SubService nil2, out string prefix, out ushort buildingId, out NamingType namingType); Vector3 worldPos = TLMStationUtils.GetStationBuildingPosition(nextStop, t.Info.m_stationSubService); Vector2 pos2D = calc(worldPos, invPrecision); Vector2 gridAdd = Vector2.zero; TLMMapStation idx = stations.FirstOrDefault(x => x.stopsWithWorldPos.ContainsKey(nextStop)); if (idx != null) { transportLines[lineId].AddStation(ref idx); } else { var nearStops = new Dictionary <ushort, Vector3>(); TLMLineUtils.GetNearStopPoints(worldPos, range, ref nearStops, new ItemClass.SubService[] { ItemClass.SubService.PublicTransportShip, ItemClass.SubService.PublicTransportPlane, ItemClass.SubService.PublicTransportTrain, ItemClass.SubService.PublicTransportMonorail, ItemClass.SubService.PublicTransportCableCar, ItemClass.SubService.PublicTransportMetro, ItemClass.SubService.PublicTransportTram, ItemClass.SubService.PublicTransportBus, ItemClass.SubService.PublicTransportTrolleybus }, 15); if (!nearStops.ContainsKey(nextStop)) { nearStops[nextStop] = NetManager.instance.m_nodes.m_buffer[nextStop].m_position; } var thisStation = new TLMMapStation(name, pos2D, worldPos, nearStops, nextStationId++, service, nextStop); stations.Add(thisStation); transportLines[lineId].AddStation(ref thisStation); } nextStop = TransportLine.GetNextStop(nextStop); } while (nextStop != startStop && nextStop != 0); } }
public static void GetQuantityPassengerWaiting(ushort currentStop, out int residents, out int tourists, out int timeTilBored) { ushort nextStop = TransportLine.GetNextStop(currentStop); CitizenManager cm = Singleton <CitizenManager> .instance; NetManager nm = Singleton <NetManager> .instance; Vector3 position = nm.m_nodes.m_buffer[currentStop].m_position; Vector3 position2 = nm.m_nodes.m_buffer[nextStop].m_position; nm.m_nodes.m_buffer[currentStop].m_maxWaitTime = 0; int minX = Mathf.Max((int)((position.x - 32f) / 8f + 1080f), 0); int minZ = Mathf.Max((int)((position.z - 32f) / 8f + 1080f), 0); int maxX = Mathf.Min((int)((position.x + 32f) / 8f + 1080f), 2159); int maxZ = Mathf.Min((int)((position.z + 32f) / 8f + 1080f), 2159); residents = 0; tourists = 0; timeTilBored = 255; int zIterator = minZ; while (zIterator <= maxZ) { int xIterator = minX; while (xIterator <= maxX) { ushort citizenIterator = cm.m_citizenGrid[zIterator * 2160 + xIterator]; int loopCounter = 0; while (citizenIterator != 0) { ushort nextGridInstance = cm.m_instances.m_buffer[citizenIterator].m_nextGridInstance; if ((cm.m_instances.m_buffer[citizenIterator].m_flags & CitizenInstance.Flags.WaitingTransport) != CitizenInstance.Flags.None) { Vector3 a = cm.m_instances.m_buffer[citizenIterator].m_targetPos; float distance = Vector3.SqrMagnitude(a - position); if (distance < 1024f) { CitizenInfo info = cm.m_instances.m_buffer[citizenIterator].Info; if (info.m_citizenAI.TransportArriveAtSource(citizenIterator, ref cm.m_instances.m_buffer[citizenIterator], position, position2)) { if ((cm.m_citizens.m_buffer[citizenIterator].m_flags & Citizen.Flags.Tourist) != Citizen.Flags.None) { tourists++; } else { residents++; } timeTilBored = Math.Min(255 - cm.m_instances.m_buffer[citizenIterator].m_waitCounter, timeTilBored); } } } citizenIterator = nextGridInstance; if (++loopCounter > 65536) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + Environment.StackTrace); break; } } xIterator++; } zIterator++; } }
public void MoveToNextStop() { var nextStop = TransportLine.GetNextStop(this.stopId); this.Show(nextStop); }
public static void SimulationStep(ref TransportLine thisLine, ushort lineID) { //begin mod(+): change for initialization if (!TransportLineMod._init) { return; } //end mod TransportInfo info = thisLine.Info; if (thisLine.Complete) { //begin mod(*): moved this section to a separate method int num2 = CountLineActiveVehicles(lineID); //end mod bool flag1 = !Singleton <SimulationManager> .instance.m_isNightTime ? (thisLine.m_flags & TransportLine.Flags.DisabledDay) == TransportLine.Flags.None : (thisLine.m_flags & TransportLine.Flags.DisabledNight) == TransportLine.Flags.None; uint range = 0; float num5 = 0.0f; int num6 = 0; bool flag2 = false; if ((int)thisLine.m_stops != 0) { NetManager instance = Singleton <NetManager> .instance; ushort stops = thisLine.m_stops; ushort num3 = stops; int num4 = 0; while ((int)num3 != 0) { ushort num7 = 0; if (flag1) { instance.m_nodes.m_buffer[(int)num3].m_flags &= NetNode.Flags.OneWayOutTrafficLights | NetNode.Flags.UndergroundTransition | NetNode.Flags.Created | NetNode.Flags.Deleted | NetNode.Flags.Original | NetNode.Flags.End | NetNode.Flags.Middle | NetNode.Flags.Bend | NetNode.Flags.Junction | NetNode.Flags.Moveable | NetNode.Flags.Untouchable | NetNode.Flags.Outside | NetNode.Flags.Temporary | NetNode.Flags.Double | NetNode.Flags.Fixed | NetNode.Flags.OnGround | NetNode.Flags.Ambiguous | NetNode.Flags.Water | NetNode.Flags.Sewage | NetNode.Flags.ForbidLaneConnection | NetNode.Flags.LevelCrossing | NetNode.Flags.OneWayIn | NetNode.Flags.Heating | NetNode.Flags.Electricity | NetNode.Flags.Collapsed | NetNode.Flags.DisableOnlyMiddle | NetNode.Flags.AsymForward | NetNode.Flags.AsymBackward | NetNode.Flags.CustomTrafficLights; } else { instance.m_nodes.m_buffer[(int)num3].m_flags |= NetNode.Flags.Disabled; } for (int index = 0; index < 8; ++index) { ushort segment = instance.m_nodes.m_buffer[(int)num3].GetSegment(index); if ((int)segment != 0 && (int)instance.m_segments.m_buffer[(int)segment].m_startNode == (int)num3) { num6 += Mathf.Max((int)instance.m_segments.m_buffer[(int)segment].m_trafficLightState0, (int)instance.m_segments.m_buffer[(int)segment].m_trafficLightState1); num5 += instance.m_segments.m_buffer[(int)segment].m_averageLength; num7 = instance.m_segments.m_buffer[(int)segment].m_endNode; if ((instance.m_segments.m_buffer[(int)segment].m_flags & NetSegment.Flags.PathLength) == NetSegment.Flags.None) { flag2 = true; break; } break; } } ++range; num3 = num7; if ((int)num3 != (int)stops) { if (++num4 >= 32768) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + System.Environment.StackTrace); break; } } else { break; } } } if (!flag2) { thisLine.m_totalLength = num5; } if ((int)range != 0) { thisLine.m_averageInterval = (byte)Mathf.Min((float)byte.MaxValue, (float)(((long)num6 + (long)(range >> 1)) / (long)range)); } //begin mod(-): let's count maintenance once a week //end mod TransferManager.TransferReason vehicleReason = info.m_vehicleReason; if (vehicleReason != TransferManager.TransferReason.None) { //begin mod: calculate target vehicle count or read saved value int num3 = 0; if (TransportLineMod._lineData[(int)lineID].BudgetControl || info.m_class.m_service == ItemClass.Service.Disaster) { num3 = !flag1 ? 0 : (!flag2 ? thisLine.CalculateTargetVehicleCount() : num2); TransportLineMod._lineData[(int)lineID].TargetVehicleCount = num3; } else if (flag1) { num3 = TransportLineMod._lineData[(int)lineID].TargetVehicleCount; } //end mod if (range != 0 && num2 < num3) { ushort stop = thisLine.GetStop(Singleton <SimulationManager> .instance.m_randomizer .Int32((uint)thisLine.CountStops(lineID))); if (info.m_vehicleReason != TransferManager.TransferReason.None && (int)stop != 0) { //begin mod(+): save offer as variable and directly invoke spawn if it's not evac line TransferManager.TransferOffer offer = new TransferManager.TransferOffer { Priority = num3 - num2 + 1, TransportLine = lineID, Position = Singleton <NetManager> .instance.m_nodes.m_buffer[(int)stop] .m_position, Amount = 1, Active = false }; if (info.m_class.m_service == ItemClass.Service.Disaster) { Singleton <TransferManager> .instance.AddIncomingOffer(vehicleReason, offer); } else { HandleVehicleSpawn(lineID, info, num3, num2, offer); } //end mod } } else if (num2 > num3) { //begin mod(*): encapsulate into method TransportLineMod.RemoveActiveVehicle(lineID, false, num2); //end mod } } } if ((Singleton <SimulationManager> .instance.m_currentFrameIndex & 4095U) < 3840U) { return; } thisLine.m_passengers.Update(); Singleton <TransportManager> .instance.m_passengers[(int)info.m_transportType].Add(ref thisLine.m_passengers); thisLine.m_passengers.Reset(); //begin mod(+): update statistics + fetch maintenance costs if (thisLine.Complete) { ushort stops1 = thisLine.m_stops; ushort stop1 = stops1; do { NetManagerMod.m_cachedNodeData[(int)stop1].StartNewWeek(); stop1 = TransportLine.GetNextStop(stop1); } while ((int)stops1 != (int)stop1 && (int)stop1 != 0); var itemClass = info.m_class; PrefabData[] prefabs = VehiclePrefabs.instance.GetPrefabs(itemClass.m_service, itemClass.m_subService, itemClass.m_level); int amount = 0; CountLineActiveVehicles(lineID, (num3) => { Vehicle vehicle = VehicleManager.instance.m_vehicles.m_buffer[num3]; PrefabData prefabData = Array.Find(prefabs, item => item.PrefabDataIndex == vehicle.Info.m_prefabDataIndex); if (prefabData != null) { amount += prefabData.MaintenanceCost; VehicleManagerMod.m_cachedVehicleData[num3].StartNewWeek(prefabData.MaintenanceCost); } }); if (amount != 0) { Singleton <EconomyManager> .instance.FetchResource(EconomyManager.Resource.Maintenance, amount, info.m_class); } //end mod } }
private bool GetStopPosition(TransportInfo info, ushort segment, ushort building, ushort firstStop, ref Vector3 hitPos, out bool fixedPlatform) { //begin mod(+): detect key bool alternateMode = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift); //end mod NetManager instance1 = Singleton <NetManager> .instance; BuildingManager instance2 = Singleton <BuildingManager> .instance; TransportManager instance3 = Singleton <TransportManager> .instance; fixedPlatform = false; if (info.m_transportType == TransportInfo.TransportType.Pedestrian) { Vector3 position = Vector3.zero; float laneOffset = 0.0f; uint laneID = 0; int laneIndex; if ((int)segment != 0 && !instance1.m_segments.m_buffer[(int)segment].GetClosestLanePosition(hitPos, NetInfo.LaneType.Pedestrian, VehicleInfo.VehicleType.None, VehicleInfo.VehicleType.None, out position, out laneID, out laneIndex, out laneOffset)) { laneID = 0U; if ((instance1.m_segments.m_buffer[(int)segment].m_flags & NetSegment.Flags.Untouchable) != NetSegment.Flags.None && (int)building == 0) { building = NetSegment.FindOwnerBuilding(segment, 363f); } } if ((int)building != 0) { if (instance2.m_buildings.m_buffer[(int)building].Info.m_hasPedestrianPaths) { laneID = instance2.m_buildings.m_buffer[(int)building].FindLane(NetInfo.LaneType.Pedestrian, VehicleInfo.VehicleType.None, hitPos, out position, out laneOffset); } if ((int)laneID == 0) { Vector3 sidewalkPosition = instance2.m_buildings.m_buffer[(int)building].CalculateSidewalkPosition(); laneID = instance2.m_buildings.m_buffer[(int)building].FindAccessLane(NetInfo.LaneType.Pedestrian, VehicleInfo.VehicleType.None, sidewalkPosition, out position, out laneOffset); } } if ((int)laneID == 0) { return(false); } if ((double)laneOffset < 0.00392156885936856) { laneOffset = 0.003921569f; position = instance1.m_lanes.m_buffer[laneID].CalculatePosition(laneOffset); } else if ((double)laneOffset > 0.996078431606293) { laneOffset = 0.9960784f; position = instance1.m_lanes.m_buffer[laneID].CalculatePosition(laneOffset); } if ((int)this.m_line != 0) { firstStop = instance3.m_lines.m_buffer[(int)this.m_line].m_stops; ushort stop = firstStop; int num = 0; while ((int)stop != 0) { if ((int)instance1.m_nodes.m_buffer[(int)stop].m_lane == (int)laneID) { hitPos = instance1.m_nodes.m_buffer[(int)stop].m_position; fixedPlatform = true; return(true); } stop = TransportLine.GetNextStop(stop); if ((int)stop != (int)firstStop) { if (++num >= 32768) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + System.Environment.StackTrace); break; } } else { break; } } } hitPos = position; fixedPlatform = true; return(true); } if ((int)segment != 0) { if ((instance1.m_segments.m_buffer[(int)segment].m_flags & NetSegment.Flags.Untouchable) != NetSegment.Flags.None) { building = NetSegment.FindOwnerBuilding(segment, 363f); if ((int)building != 0) { BuildingInfo info1 = instance2.m_buildings.m_buffer[(int)building].Info; TransportInfo transportLineInfo1 = info1.m_buildingAI.GetTransportLineInfo(); TransportInfo transportLineInfo2 = info1.m_buildingAI.GetSecondaryTransportLineInfo(); //begin mod(*): check for !alternateMode if (!alternateMode && transportLineInfo1 != null && transportLineInfo1.m_transportType == info.m_transportType || !alternateMode && transportLineInfo2 != null && transportLineInfo2.m_transportType == info.m_transportType) { //end mod segment = (ushort)0; } else { building = (ushort)0; } } } Vector3 position1; uint laneID1; int laneIndex1; float laneOffset1; if ((int)segment != 0 && instance1.m_segments.m_buffer[(int)segment].GetClosestLanePosition(hitPos, NetInfo.LaneType.Pedestrian, VehicleInfo.VehicleType.None, info.m_vehicleType, out position1, out laneID1, out laneIndex1, out laneOffset1)) { if (info.m_vehicleType == VehicleInfo.VehicleType.None) { NetLane.Flags flags1 = (NetLane.Flags)((int)instance1.m_lanes.m_buffer[laneID1].m_flags & 768); NetLane.Flags flags2 = info.m_stopFlag; NetInfo info1 = instance1.m_segments.m_buffer[(int)segment].Info; if (info1.m_vehicleTypes != VehicleInfo.VehicleType.None) { flags2 = NetLane.Flags.None; } if (flags1 != NetLane.Flags.None && flags2 != NetLane.Flags.None && flags1 != flags2) { return(false); } float stopOffset = info1.m_lanes[laneIndex1].m_stopOffset; if ((instance1.m_segments.m_buffer[(int)segment].m_flags & NetSegment.Flags.Invert) != NetSegment.Flags.None) { stopOffset = -stopOffset; } Vector3 direction; instance1.m_lanes.m_buffer[laneID1].CalculateStopPositionAndDirection(0.5019608f, stopOffset, out hitPos, out direction); fixedPlatform = true; return(true); } Vector3 position2; uint laneID2; int laneIndex2; float laneOffset2; if (instance1.m_segments.m_buffer[(int)segment].GetClosestLanePosition(position1, NetInfo.LaneType.Vehicle | NetInfo.LaneType.TransportVehicle, info.m_vehicleType, out position2, out laneID2, out laneIndex2, out laneOffset2)) { NetLane.Flags flags = (NetLane.Flags)((int)instance1.m_lanes.m_buffer[laneID1].m_flags & 768); if (flags != NetLane.Flags.None && info.m_stopFlag != NetLane.Flags.None && flags != info.m_stopFlag) { return(false); } float stopOffset = instance1.m_segments.m_buffer[(int)segment].Info.m_lanes[laneIndex2].m_stopOffset; if ((instance1.m_segments.m_buffer[(int)segment].m_flags & NetSegment.Flags.Invert) != NetSegment.Flags.None) { stopOffset = -stopOffset; } Vector3 direction; instance1.m_lanes.m_buffer[laneID2].CalculateStopPositionAndDirection(0.5019608f, stopOffset, out hitPos, out direction); fixedPlatform = true; return(true); } } } //begin mod(*): check for !alternateMode if (!alternateMode && (int)building != 0) { //end mod ushort num1 = 0; if ((instance2.m_buildings.m_buffer[(int)building].m_flags & Building.Flags.Untouchable) != Building.Flags.None) { num1 = Building.FindParentBuilding(building); } if (this.m_building != 0 && (int)firstStop != 0 && (this.m_building == (int)building || this.m_building == (int)num1)) { hitPos = instance1.m_nodes.m_buffer[(int)firstStop].m_position; return(true); } VehicleInfo randomVehicleInfo = Singleton <VehicleManager> .instance.GetRandomVehicleInfo(ref Singleton <SimulationManager> .instance.m_randomizer, info.m_class.m_service, info.m_class.m_subService, info.m_class.m_level); if (randomVehicleInfo != null) { BuildingInfo info1 = instance2.m_buildings.m_buffer[(int)building].Info; TransportInfo transportLineInfo1 = info1.m_buildingAI.GetTransportLineInfo(); if (transportLineInfo1 == null && (int)num1 != 0) { building = num1; info1 = instance2.m_buildings.m_buffer[(int)building].Info; transportLineInfo1 = info1.m_buildingAI.GetTransportLineInfo(); } TransportInfo transportLineInfo2 = info1.m_buildingAI.GetSecondaryTransportLineInfo(); if (transportLineInfo1 != null && transportLineInfo1.m_transportType == info.m_transportType || transportLineInfo2 != null && transportLineInfo2.m_transportType == info.m_transportType) { Vector3 vector3 = Vector3.zero; int num2 = 1000000; for (int index = 0; index < 12; ++index) { Randomizer randomizer = new Randomizer((ulong)index); Vector3 position; Vector3 target; info1.m_buildingAI.CalculateSpawnPosition(building, ref instance2.m_buildings.m_buffer[(int)building], ref randomizer, randomVehicleInfo, out position, out target); int num3 = 0; if (info.m_avoidSameStopPlatform) { num3 = this.GetLineCount(position, target - position, info.m_transportType); } if (num3 < num2) { vector3 = position; num2 = num3; } else if (num3 == num2 && (double)Vector3.SqrMagnitude(position - hitPos) < (double)Vector3.SqrMagnitude(vector3 - hitPos)) { vector3 = position; } } if ((int)firstStop != 0) { Vector3 position = instance1.m_nodes.m_buffer[(int)firstStop].m_position; if ((double)Vector3.SqrMagnitude(position - vector3) < 16384.0) { uint lane = instance1.m_nodes.m_buffer[(int)firstStop].m_lane; if ((int)lane != 0) { ushort segment1 = instance1.m_lanes.m_buffer[lane].m_segment; if ((int)segment1 != 0 && (instance1.m_segments.m_buffer[(int)segment1].m_flags & NetSegment.Flags.Untouchable) != NetSegment.Flags.None) { ushort ownerBuilding = NetSegment.FindOwnerBuilding(segment1, 363f); if ((int)building == (int)ownerBuilding) { hitPos = position; return(true); } } } } } hitPos = vector3; return(num2 != 1000000); } } } return(false); }
private void UpdateStopButtons(ushort lineID) { if (GetLineType(lineID) != LineType.WalkingTour || m_dirtyNames) { ushort stop = Singleton <TransportManager> .instance.m_lines.m_buffer[lineID].m_stops; foreach (UIPanel uiPanel in m_stopButtons.items) { UILabel uilabel = uiPanel.Find <UILabel>("PassengerCount"); UIButton uibutton = uiPanel.Find <UIButton>("StopButton"); if (m_dirtyNames) { uilabel.prefix = TLMStationUtils.GetFullStationName((ushort)uibutton.objectUserData, lineID, TransportSystemDefinition.GetDefinitionForLine(lineID).SubService); } if (m_dirtyTerminal) { UpdateTerminalStatus(lineID, stop, uibutton); } if (GetLineType(lineID) == LineType.WalkingTour) { continue; } UIPanel connectionPanel = uiPanel.Find <UIPanel>("ConnectionPanel"); if (connectionPanel != null) { connectionPanel.isVisible = m_currentMode == MapMode.CONNECTIONS; } switch (m_currentMode) { case MapMode.WAITING: TLMLineUtils.GetQuantityPassengerWaiting(stop, out int residents, out int tourists, out int timeTillBored); uilabel.text = "\n" + string.Format(Locale.Get("K45_TLM_WAITING_PASSENGERS_RESIDENT_TOURSTS"), residents + tourists, residents, tourists) + "\n"; uibutton.color = Color.Lerp(Color.red, Color.white, timeTillBored / 255f); uilabel.suffix = string.Format(Locale.Get("K45_TLM_TIME_TILL_BORED_TEMPLATE_STATION_MAP"), uibutton.color.ToRGB(), timeTillBored); break; case MapMode.NONE: uibutton.color = Color.white; uilabel.text = ""; uilabel.suffix = ""; uibutton.tooltip = ""; break; case MapMode.CONNECTIONS: uibutton.color = Color.white; uilabel.text = ""; uilabel.suffix = ""; uibutton.tooltip = ""; break; case MapMode.EARNINGS_ALL_TIME: TLMTransportLineStatusesManager.instance.GetStopIncome(stop, out long income); PrintIncomeStop(lineID, uibutton, uilabel, income); break; case MapMode.EARNINGS_CURRENT_WEEK: TLMTransportLineStatusesManager.instance.GetCurrentStopIncome(stop, out long income2); PrintIncomeStop(lineID, uibutton, uilabel, income2); break; case MapMode.EARNINGS_LAST_WEEK: TLMTransportLineStatusesManager.instance.GetLastWeekStopIncome(stop, out long income3); PrintIncomeStop(lineID, uibutton, uilabel, income3); break; } stop = TransportLine.GetNextStop(stop); } m_dirtyNames = false; m_dirtyTerminal = false; } }