예제 #1
0
        internal void Reset()
        {
#if DEBUG
            bool citDebug = (GlobalConfig.Instance.Debug.CitizenInstanceId == 0 || GlobalConfig.Instance.Debug.CitizenInstanceId == instanceId) &&
                            (GlobalConfig.Instance.Debug.CitizenId == 0 || GlobalConfig.Instance.Debug.CitizenId == GetCitizenId()) &&
                            (GlobalConfig.Instance.Debug.SourceBuildingId == 0 || GlobalConfig.Instance.Debug.SourceBuildingId == Singleton <CitizenManager> .instance.m_instances.m_buffer[instanceId].m_sourceBuilding) &&
                            (GlobalConfig.Instance.Debug.TargetBuildingId == 0 || GlobalConfig.Instance.Debug.TargetBuildingId == Singleton <CitizenManager> .instance.m_instances.m_buffer[instanceId].m_targetBuilding)
            ;
            bool debug     = GlobalConfig.Instance.Debug.Switches[2] && citDebug;
            bool fineDebug = GlobalConfig.Instance.Debug.Switches[4] && citDebug;

            if (fineDebug)
            {
                Log.Warning($"ExtCitizenInstance.Reset({instanceId}): Resetting ext. citizen instance {instanceId}");
            }
#endif
            //Flags = ExtFlags.None;
            pathMode = ExtPathMode.None;
            failedParkingAttempts   = 0;
            parkingSpaceLocation    = ExtParkingSpaceLocation.None;
            parkingSpaceLocationId  = 0;
            lastDistanceToParkedCar = float.MaxValue;
            atOutsideConnection     = false;
            //ParkedVehiclePosition = default(Vector3);
            ReleaseReturnPath();
        }
 internal ExtCitizenInstance(ushort instanceId)
 {
     this.instanceId          = instanceId;
     pathMode                 = ExtPathMode.None;
     failedParkingAttempts    = 0;
     parkingSpaceLocationId   = 0;
     parkingSpaceLocation     = ExtParkingSpaceLocation.None;
     parkingPathStartPosition = null;
     returnPathId             = 0;
     returnPathState          = ExtPathState.None;
     lastDistanceToParkedCar  = 0;
 }
        internal void Reset(bool debugLog = true)
        {
#if DEBUG
            if (debugLog && GlobalConfig.Instance.Debug.Switches[4])
            {
                Log.Warning($"ExtCitizenInstance.Reset({instanceId}): Resetting ext. citizen instance {instanceId}");
            }
#endif
            //Flags = ExtFlags.None;
            pathMode = ExtPathMode.None;
            failedParkingAttempts   = 0;
            parkingSpaceLocation    = ExtParkingSpaceLocation.None;
            parkingSpaceLocationId  = 0;
            lastDistanceToParkedCar = float.MaxValue;
            //ParkedVehiclePosition = default(Vector3);
            ReleaseReturnPath();
        }
예제 #4
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);
        }