Пример #1
0
        //based off code in TransportLine.SimulationStep
        public static void RemoveVehicle(ushort lineID, ushort vehicleID, bool descreaseTargetVehicleCount)
        {
            VehicleManager instance = Singleton <VehicleManager> .instance;

            if ((instance.m_vehicles.m_buffer[(int)vehicleID].m_flags & Vehicle.Flags.GoingBack) ==
                ~(Vehicle.Flags.Created | Vehicle.Flags.Deleted | Vehicle.Flags.Spawned | Vehicle.Flags.Inverted |
                  Vehicle.Flags.TransferToTarget | Vehicle.Flags.TransferToSource | Vehicle.Flags.Emergency1 |
                  Vehicle.Flags.Emergency2 | Vehicle.Flags.WaitingPath | Vehicle.Flags.Stopped | Vehicle.Flags.Leaving |
                  Vehicle.Flags.Arriving | Vehicle.Flags.Reversed | Vehicle.Flags.TakingOff | Vehicle.Flags.Flying |
                  Vehicle.Flags.Landing | Vehicle.Flags.WaitingSpace | Vehicle.Flags.WaitingCargo |
                  Vehicle.Flags.GoingBack | Vehicle.Flags.WaitingTarget | Vehicle.Flags.Importing |
                  Vehicle.Flags.Exporting | Vehicle.Flags.Parking | Vehicle.Flags.CustomName | Vehicle.Flags.OnGravel |
                  Vehicle.Flags.WaitingLoading | Vehicle.Flags.Congestion | Vehicle.Flags.DummyTraffic |
                  Vehicle.Flags.Underground | Vehicle.Flags.Transition | Vehicle.Flags.InsideBuilding |
                  Vehicle.Flags.LeftHandDrive))
            {
                if (descreaseTargetVehicleCount)
                {
                    CachedTransportLineData.DecreaseTargetVehicleCount(lineID);
                }

                instance.m_vehicles.m_buffer[(int)vehicleID].Info.m_vehicleAI.SetTransportLine(vehicleID,
                                                                                               ref instance.m_vehicles.m_buffer[(int)vehicleID], (ushort)0);
            }
        }
Пример #2
0
        private static bool StartTransferPre(
            DepotAI __instance,
            ref ushort buildingID, ref Building data,
            TransferManager.TransferReason reason,
            TransferManager.TransferOffer offer)
        {
            var lineID = offer.TransportLine;
            //TODO: fish boats?
            //TODO: also check reason? - see DepotAI
            var info = TransportManager.instance.m_lines.m_buffer[lineID].Info;

            if (lineID <= 0 || info?.m_class == null || info.m_class.m_service == ItemClass.Service.Disaster)
            {
                return(true); //if it's not a proper transport line, let's not modify the behavior
            }

            var depot = CachedTransportLineData._lineData[lineID].Depot;

            if (!DepotUtil.ValidateDepotAndFindNewIfNeeded(lineID, ref depot, info))
            {
                if (depot == 0)
                {
                    Debug.LogWarning($"IPT2: No proper depot was found for line {lineID}!");
                    CachedTransportLineData.ClearEnqueuedVehicles(lineID);
                    return(false);
                }

                Debug.LogWarning($"IPT2: Invalid or no depot was selected for line {lineID}, resetting to : {depot}!");
                CachedTransportLineData.ClearEnqueuedVehicles(lineID);
                return(false);
            }


            if (depot == buildingID)
            {
                if (SimHelper.SimulationTime < CachedTransportLineData.GetNextSpawnTime(lineID))
                {
                    return(false); //if we need to wait before spawn, let's wait
                }

                if (!DepotUtil.CanAddVehicle(depot, ref BuildingManager.instance.m_buildings.m_buffer[depot], info))
                {
                    CachedTransportLineData.ClearEnqueuedVehicles(lineID);
                    return(false);
                }

                CachedTransportLineData.SetNextSpawnTime(lineID, SimHelper.SimulationTime + OptionsWrapper <Settings> .Options.SpawnTimeInterval);
            }
            else
            {
                Debug.Log("IPT2: Redirecting from " + buildingID + " to " + depot);
                __instance.StartTransfer(depot, ref BuildingManager.instance.m_buildings.m_buffer[depot], reason,
                                         offer);
                return(false);
            }

            return(true);
        }
Пример #3
0
        public static ushort AutoAssignLineDepot(ushort lineID, out Vector3 stopPosition)
        {
            stopPosition = Singleton <NetManager> .instance.m_nodes.m_buffer[(int)TransportManager.instance.m_lines.m_buffer[(int)lineID].GetStop(0)]
                           .m_position;
            ushort closestDepot = DepotUtil.GetClosestDepot(lineID, stopPosition);

            if ((int)closestDepot != 0)
            {
                CachedTransportLineData.SetDepot(lineID, closestDepot);
                UnityEngine.Debug.LogWarning($"IPT2: auto assigned depot {closestDepot} to line {lineID}");
            }

            return(closestDepot);
        }
Пример #4
0
        public static bool Prefix(ushort lineID, ref VehicleInfo __result)
        {
            var info = TransportManager.instance.m_lines.m_buffer[lineID].Info;

            if (lineID <= 0 || info?.m_class == null || info.m_class.m_service == ItemClass.Service.Disaster)
            {
                return(true); //if it's not a proper transport line, let's not modify the behavior
            }

            var name = CachedTransportLineData.EnqueuedVehiclesCount(lineID) > 0
                ? CachedTransportLineData.Dequeue(lineID)
                : CachedTransportLineData.GetRandomPrefab(lineID);

            __result = string.IsNullOrEmpty(name) ? null : PrefabCollection <VehicleInfo> .FindLoaded(name);

            return(false);
        }
Пример #5
0
        //roughly based on TransportLine.ReplaceVehicles()
        public static void ReplaceVehicles(ushort lineID)
        {
            var instance = Singleton <VehicleManager> .instance;
            var vehicles = Singleton <VehicleManager> .instance.m_vehicles;

            for (ushort i = 0; i < vehicles.m_size; i++)
            {
                if (instance.m_vehicles.m_buffer[i].m_flags == 0 || instance.m_vehicles.m_buffer[i].Info == null ||
                    instance.m_vehicles.m_buffer[i].m_transportLine != lineID)
                {
                    continue;
                }

                if (CachedTransportLineData.GetPrefabs(lineID).Contains(instance.m_vehicles.m_buffer[i].Info.name))
                {
                    continue;
                }
                RemoveVehicle(lineID, i, false);
            }
        }
        public override bool CanLeave(ushort vehicleID, ref global::Vehicle vehicleData)
        {
            if ((int)vehicleData.m_leadingVehicle == 0 && (int)vehicleData.m_waitCounter < 12 ||
                !base.CanLeave(vehicleID, ref vehicleData))
            {
                //begin mod(+): track if unbunching happens
                CachedVehicleData.m_cachedVehicleData[(int)vehicleID].IsUnbunchingInProgress = false;
                //end mod
                return(false);
            }
            //begin mod(+): no unbunching for evac buses or if only 1 bus on line!
            if (vehicleData.Info?.m_class?.m_service == ItemClass.Service.Disaster || (vehicleData.m_nextLineVehicle == 0 && Singleton <TransportManager> .instance.m_lines
                                                                                       .m_buffer[(int)vehicleData.m_transportLine].m_vehicles == vehicleID))
            {
                CachedVehicleData.m_cachedVehicleData[vehicleID].IsUnbunchingInProgress = false;
                return(true);
            }
            //end mod

            if ((int)vehicleData.m_leadingVehicle == 0 && (int)vehicleData.m_transportLine != 0)
            {
                //begin mod(+): Check if unbunching enabled for this line & stop. track if unbunching happens. Don't divide m_waitCounter by 2^4
                ushort currentStop = CachedVehicleData.m_cachedVehicleData[vehicleID].CurrentStop;
                if (currentStop != 0 && CachedNodeData.m_cachedNodeData[currentStop].Unbunching &&
                    CachedTransportLineData.GetUnbunchingState(vehicleData.m_transportLine))
                {
                    var canLeaveStop = Singleton <TransportManager> .instance.m_lines
                                       .m_buffer[(int)vehicleData.m_transportLine]
                                       .CanLeaveStop(vehicleData.m_targetBuilding, (int)vehicleData.m_waitCounter);
                    CachedVehicleData.m_cachedVehicleData[vehicleID].IsUnbunchingInProgress = !canLeaveStop;
                    return(canLeaveStop);
                }
                //end mod
            }
            //begin mod(+): track if unbunching happens
            CachedVehicleData.m_cachedVehicleData[vehicleID].IsUnbunchingInProgress = false;
            //end mod
            return(true);
        }
Пример #7
0
        public static int CalculateTargetVehicleCount(ushort lineID)
        {
            var instance = TransportManager.instance;
            int targetVehicleCount;

            if (CachedTransportLineData._lineData[lineID].BudgetControl ||
                instance.m_lines.m_buffer[lineID].Info.m_class.m_service == ItemClass.Service.Disaster)
            {
                targetVehicleCount = instance.m_lines.m_buffer[lineID].CalculateTargetVehicleCount();
                CachedTransportLineData.SetTargetVehicleCount(lineID, targetVehicleCount);
            }
            else
            {
                targetVehicleCount = CachedTransportLineData.GetTargetVehicleCount(lineID);
            }

            var activeVehicles = TransportLineUtil.CountLineActiveVehicles(lineID, out _);

            for (var i = activeVehicles; i < targetVehicleCount - CachedTransportLineData.EnqueuedVehiclesCount(lineID); i++)
            {
                CachedTransportLineData.EnqueueVehicle(lineID, CachedTransportLineData.GetRandomPrefab(lineID));
            }
            return(targetVehicleCount);
        }