public static bool Prefix(ref bool __result,
                                  ushort instanceID,
                                  ref CitizenInstance citizenData,
                                  Vector3 startPos,
                                  Vector3 endPos,
                                  VehicleInfo vehicleInfo,
                                  bool enableTransport,
                                  bool ignoreCost)
        {
            IExtCitizenInstanceManager extCitizenInstanceManager = Constants.ManagerFactory.ExtCitizenInstanceManager;
            IExtCitizenManager         extCitizenManager         = Constants.ManagerFactory.ExtCitizenManager;

            __result = extCitizenInstanceManager.StartPathFind(
                instanceID,
                ref citizenData,
                ref extCitizenInstanceManager.ExtInstances[instanceID],
                ref extCitizenManager.ExtCitizens[citizenData.m_citizen],
                startPos,
                endPos,
                vehicleInfo,
                enableTransport,
                ignoreCost);

            return(false);
        }
示例#2
0
        public bool CustomStartPathFind(ushort instanceId,
                                        ref CitizenInstance citizenData,
                                        Vector3 startPos,
                                        Vector3 endPos,
                                        VehicleInfo vehicleInfo,
                                        bool enableTransport,
                                        bool ignoreCost)
        {
            IExtCitizenInstanceManager extCitizenInstanceManager = Constants.ManagerFactory.ExtCitizenInstanceManager;
            IExtCitizenManager         extCitizenManager         = Constants.ManagerFactory.ExtCitizenManager;

            return(extCitizenInstanceManager.StartPathFind(
                       instanceId,
                       ref citizenData,
                       ref extCitizenInstanceManager.ExtInstances[instanceId],
                       ref extCitizenManager.ExtCitizens[citizenData.m_citizen],
                       startPos,
                       endPos,
                       vehicleInfo,
                       enableTransport,
                       ignoreCost));
        }
示例#3
0
        public bool ExtSimulationStep(ushort instanceId,
                                      ref CitizenInstance instanceData,
                                      ref ExtCitizenInstance extInstance,
                                      Vector3 physicsLodRefPos)
        {
            IExtCitizenInstanceManager extCitInstMan = Constants.ManagerFactory.ExtCitizenInstanceManager;

#if DEBUG
            bool citizenDebug
                = (DebugSettings.CitizenInstanceId == 0 ||
                   DebugSettings.CitizenInstanceId == instanceId) &&
                  (DebugSettings.CitizenId == 0 ||
                   DebugSettings.CitizenId == instanceData.m_citizen) &&
                  (DebugSettings.SourceBuildingId == 0 ||
                   DebugSettings.SourceBuildingId == instanceData.m_sourceBuilding) &&
                  (DebugSettings.TargetBuildingId == 0 ||
                   DebugSettings.TargetBuildingId == instanceData.m_targetBuilding);
            bool logParkingAi         = DebugSwitch.BasicParkingAILog.Get() && citizenDebug;
            bool extendedLogParkingAi = DebugSwitch.ExtendedParkingAILog.Get() && citizenDebug;
#else
            var logParkingAi         = false;
            var extendedLogParkingAi = false;
#endif

#if DEBUG
            ExtPathMode logPathMode = extInstance.pathMode;
#else
            var logPathMode = 0;
#endif
            switch (extInstance.pathMode)
            {
            // check if the citizen has reached a parked car or target
            case ExtPathMode.WalkingToParkedCar:
            case ExtPathMode.ApproachingParkedCar: {
                Citizen[] citizensBuffer  = Singleton <CitizenManager> .instance.m_citizens.m_buffer;
                ushort    parkedVehicleId = citizensBuffer[instanceData.m_citizen].m_parkedVehicle;

                if (parkedVehicleId == 0)
                {
                    // citizen is reaching their parked car but does not own a parked car
                    Log._DebugOnlyWarningIf(
                        logParkingAi,
                        () => $"CustomHumanAI.ExtSimulationStep({instanceId}): " +
                        $"Citizen instance {instanceId} was walking to / reaching " +
                        $"their parked car ({logPathMode}) but parked " +
                        "car has disappeared. RESET.");

                    extCitInstMan.Reset(ref extInstance);
                    instanceData.m_flags &= ~CitizenInstance.Flags.WaitingPath;
                    instanceData.m_flags &= ~(CitizenInstance.Flags.HangAround
                                              | CitizenInstance.Flags.Panicking
                                              | CitizenInstance.Flags.SittingDown
                                              | CitizenInstance.Flags.Cheering);
                    InvalidPath(instanceId, ref instanceData);
                    return(true);
                }

                VehicleParked[]        parkedVehicles = Singleton <VehicleManager> .instance.m_parkedVehicles.m_buffer;
                ParkedCarApproachState approachState  =
                    AdvancedParkingManager.Instance.CitizenApproachingParkedCarSimulationStep(
                        instanceId,
                        ref instanceData,
                        ref extInstance,
                        physicsLodRefPos,
                        ref parkedVehicles[parkedVehicleId]);

                switch (approachState)
                {
                case ParkedCarApproachState.None:
                default:
                    break;

                case ParkedCarApproachState.Approaching:
                    // citizen approaches their parked car
                    return(true);

                case ParkedCarApproachState.Approached: {
                    // citizen reached their parked car
                    Log._DebugIf(
                        extendedLogParkingAi,
                        () => $"CustomHumanAI.CustomSimulationStep({instanceId}): " +
                        $"Citizen instance {instanceId} arrived at parked car. " +
                        $"PathMode={logPathMode}");

                    if (instanceData.m_path != 0)
                    {
                        Singleton <PathManager> .instance.ReleasePath(instanceData.m_path);

                        instanceData.m_path = 0;
                    }

                    instanceData.m_flags &= CitizenInstance.Flags.Created
                                            | CitizenInstance.Flags.Cheering
                                            | CitizenInstance.Flags.Deleted
                                            | CitizenInstance.Flags.Underground
                                            | CitizenInstance.Flags.CustomName
                                            | CitizenInstance.Flags.Character
                                            | CitizenInstance.Flags.BorrowCar
                                            | CitizenInstance.Flags.HangAround
                                            | CitizenInstance.Flags.InsideBuilding
                                            | CitizenInstance.Flags.WaitingPath
                                            | CitizenInstance.Flags.TryingSpawnVehicle
                                            | CitizenInstance.Flags.CannotUseTransport
                                            | CitizenInstance.Flags.Panicking
                                            | CitizenInstance.Flags.OnPath
                                            | CitizenInstance.Flags.SittingDown
                                            | CitizenInstance.Flags.AtTarget
                                            | CitizenInstance.Flags.RequireSlowStart
                                            | CitizenInstance.Flags.Transition
                                            | CitizenInstance.Flags.RidingBicycle
                                            | CitizenInstance.Flags.OnBikeLane
                                            | CitizenInstance.Flags.CannotUseTaxi
                                            | CitizenInstance.Flags.CustomColor
                                            | CitizenInstance.Flags.Blown
                                            | CitizenInstance.Flags.Floating
                                            | CitizenInstance.Flags.TargetFlags;

                    if (StartPathFind(instanceId, ref instanceData))
                    {
                        return(true);
                    }
                    else
                    {
                        instanceData.Unspawn(instanceId);
                        extCitInstMan.Reset(ref extInstance);
                        return(true);
                    }
                }

                case ParkedCarApproachState.Failure: {
                    Log._DebugIf(
                        logParkingAi,
                        () => $"CustomHumanAI.ExtSimulationStep({instanceId}): " +
                        $"Citizen instance {instanceId} failed to arrive at " +
                        $"parked car. PathMode={logPathMode}");

                    // repeat path-finding
                    instanceData.m_flags &= ~CitizenInstance.Flags.WaitingPath;
                    instanceData.m_flags &= ~(CitizenInstance.Flags.HangAround
                                              | CitizenInstance.Flags.Panicking
                                              | CitizenInstance.Flags.SittingDown
                                              | CitizenInstance.Flags.Cheering);
                    InvalidPath(instanceId, ref instanceData);
                    return(true);
                }
                }

                break;
            }

            case ExtPathMode.WalkingToTarget:
            case ExtPathMode.TaxiToTarget: {
                AdvancedParkingManager.Instance.CitizenApproachingTargetSimulationStep(
                    instanceId,
                    ref instanceData,
                    ref extInstance);
                break;
            }
            }

            return(false);
        }