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);
        }
示例#2
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);
        }
示例#3
0
 private void OnNextStopClick(UIComponent component, UIMouseEventParameter eventParam)
 {
     this.ChangeInstanceID(this.m_InstanceID, new InstanceID()
     {
         NetNode = TransportLine.GetNextStop(this.m_InstanceID.NetNode)
     });
 }
示例#4
0
        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));
        }
示例#9
0
        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}");
            }
        }
示例#11
0
        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);
        }
示例#12
0
        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);
        }
示例#14
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);
        }
示例#18
0
        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);
        }
示例#19
0
        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);
        }
示例#21
0
        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);
        }
示例#22
0
        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);
                }
            }
示例#23
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);
        }
示例#25
0
        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);
        }
示例#27
0
        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;
            }
        }