// ***************************************************************************************** // ***************************************************************************************** // // MISSION NAME : Nigel2.sc // AUTHOR : Ahron Mason // DESCRIPTION : Trevor helps Nigel and Mrs Thornhill kidnap a celebrity // Car chase // // ***************************************************************************************** // ***************************************************************************************** //Compile out Title Update changes to header functions. //Must be before includes. //CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R. USING "rage_builtins.sch" USING "globals.sch" USING "building_control_public.sch" USING "chase_hint_cam.sch" CHASE_HINT_CAM_STRUCT localChaseHintCamStruct USING "event_public.sch" USING "initial_scenes_Nigel.sch" //needed for call to SetupScene_NIGEL_2 to setup scene again when z / p skipping back to start of the mission USING "taxi_functions.sch" USING "commands_recording.sch" #IF IS_DEBUG_BUILD USING "select_mission_stage.sch" #ENDIF //------------------------------------------------------------------------------------------------------------------------------------------------- // CONSTANTS FOR UBER PLAYBACK //USING "traffic_default_values.sch" // this must be included before traffic.sch NOTE: when using uber, revert to below Constants instead // total should not exceed 225 CONST_INT TOTAL_NUMBER_OF_TRAFFIC_CARS 85 CONST_INT TOTAL_NUMBER_OF_PARKED_CARS 70 CONST_INT TOTAL_NUMBER_OF_SET_PIECE_CARS 70 // total should not exceed 12 CONST_INT MAX_NUMBER_OF_TRAFFIC_CARS_PLAYING_BACK 15 CONST_INT MAX_NUMBER_OF_SET_PIECE_CARS_PLAYING_BACK 11 CONST_INT MAX_NUMBER_OF_PARKED_CARS_PLAYING_BACK 10 USING "traffic.sch" //------------------------------------------------------------------------------------------------------------------------------------------------- // :ENUMS: //------------------------------------------------------------------------------------------------------------------------------------------------- /// PURPOSE: Mission stages ENUM MISSION_STAGE MISSION_STAGE_INTRO_MOCAP_SCENE, MISSION_STAGE_CHASE_TARGET_IN_VEHICLE, MISSION_STAGE_GET_CLOSE_TO_TARGET_FOR_CUTSCENE, MISSION_STAGE_END_CUTSCENE_MOCAP, MISSION_STAGE_MISSION_PASSED, //Additional stages MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE, //debug stages MISSION_STAGE_DEBUG_RECORD_CHASE_ROUTE, MISSION_STAGE_DEBUG_PLAYBACK_CHASE_ROUTE, MISSION_STAGE_DEBUG, MISSION_STAGE_DEBUG_HOPSITAL, MISSION_STAGE_DEBUG_HOPSITAL_DOORS ENDENUM /// PURPOSE: each mission stage uses these substages ENUM SUB_STAGE SS_SETUP, SS_UPDATE, SS_CLEANUP ENDENUM /// PURPOSE: cutscene stages ENUM CUTSCENE_ENUM CE_START_CUTSCENE, CE_CAMERA_1, CE_CAMERA_2, CE_CAMERA_3, CE_CAMERA_4, CE_CAMERA_5, CE_SKIPPED_SCENE ENDENUM /// PURPOSE: fail conditions ENUM FAILED_REASON_ENUM FAILED_DEFAULT = 0, FAILED_TARGET_DIED, FAILED_TARGET_ESCAPED, FAILED_NIGEL_VEHICLE_WRECKED, FAILED_NIGEL_ATTACKED, FAILED_NIGEL_DIED, FAILED_MRS_THORNHILL_ATTACKED, FAILED_MRS_THORNHILL_DIED, FAILED_LEFT_NIGEL_AND_MRS_T_BEHIND, FAILED_LEFT_NIGEL_BEHIND, FAILED_LEFT_MRS_T_BEHIND ENDENUM /// PURPOSE: used to update the scripted peds on the chase routes behaviour ENUM SCRIPTED_PED_STATE SPS_INIT, SPS_BEGIN_ROUTINE, SPS_AWARE_OF_TARGET, SPS_AWARE_OF_PLAYER, SPS_REACT_TO_TARGET, SPS_REACT_TO_PLAYER, SPS_READY_FOR_CLEANUP, SPS_CLEANED_UP ENDENUM /// PURPOSE: state machine for handling the interior for the chase ENUM HOSPITAL_INTERIOR_STATE HIS_SET_INTERIOR_IPLS_FOR_CHASE, HIS_PIN_INTERIOR_IN_MEMORY, HIS_SET_ENTITY_SET_FOR_CHASE, HIS_REFRESH_INTERIOR, //HIS_REQUEST_NEW_LOAD_SCENE_AT_INTERIOR, //HIS_ACTIVE_NEW_LOAD_SCENE_AT_INTERIOR, //HIS_CLEANUP_NEW_LOAD_SCENE_AT_INTERIOR, HIS_READY, HIS_END ENDENUM /// PURPOSE: used for hospital door object state machine ENUM HOSPITAL_DOORS_OBJECT_STATE HDO_CREATE, HDO_WAIT_FOR_DELETE, HDO_END ENDENUM //------------------------------------------------------------------------------------------------------------------------------------------------- // :STRUCTS //------------------------------------------------------------------------------------------------------------------------------------------------- /// PURPOSE: used by main scripted vehicles in the mission STRUCT STRUCT_MISSION_VEHICLE VEHICLE_INDEX vehicle MODEL_NAMES model BLIP_INDEX blip VECTOR vSpawn FLOAT fSpawnHeading ENDSTRUCT /// PURPOSE: used by all the main scripted peds in the mission STRUCT STRUCT_MISSION_PED PED_INDEX ped MODEL_NAMES model BLIP_INDEX blip VECTOR vSpawn FLOAT fSpawnHeading ENDSTRUCT /// PURPOSE: used by the scripted peds who are seen along the chase route STRUCT STRUCT_SIMPLE_MISSION_PED PED_INDEX ped SCRIPTED_PED_STATE eState = SPS_INIT ENDSTRUCT /// PURPOSE: used by the scripted vehicle who are seen along the chase route STRUCT STRUCT_SIMPLE_MISSION_VEHICLE VEHICLE_INDEX vehicle MODEL_NAMES model ENDSTRUCT STRUCT STRUCT_MISSION_OBJECT OBJECT_INDEX objectIndex VECTOR vPos VECTOR vRot MODEL_NAMES modelName = DUMMY_MODEL_FOR_SCRIPT ENDSTRUCT //------------------------------------------------------------------------------------------------------------------------------------------------- // :CONSTANTS //------------------------------------------------------------------------------------------------------------------------------------------------- CONST_FLOAT NIGEL2_FLASH_CHASE_BLIP_PERCENTAGE 0.7 // targets blip flashes when he gets further than this percentage away to NIGEL2_TARGET_ESCAPED_DISTANCE CONST_FLOAT NIGEL2_TARGET_ESCAPED_DISTANCE 200.0 // fail distance for target escaping CONST_FLOAT NIGEL2_PLAYER_CLOSE_TO_TARGET_CRASHED 25.0 // dist check player to target for going to park alongside Di Napoli stage CONST_FLOAT PLAYER_LEFT_NIGEL_AND_MRS_T_BEHIND_DISTANCE 100.0 // fail distance for leaving nigel and mrs t behind CONST_FLOAT PLAYER_LEFT_NIGEL_AND_MRS_T_WARN_DISTANCE 60.0 // fail warning distance for leaving nigel and mrs t behind CONST_FLOAT RESET_LEFT_NIGEL_AND_MRS_T_WARN_DISTANCE 30.0 // reset fail distance message for leaving nigel and mrs t behind CONST_FLOAT NIGEL2_START_AREA_PEDS_TRIGGER_TIME 500.0 // point in the uber playback we setup the ambient scripted peds aroudn the chase start area CONST_FLOAT NIGEL2_HOSPITAL_PEDS_TRIGGER_TIME 111161.0 // point in the uber playback we setup the ambient scripted peds in the hospital CONST_FLOAT NIGEL2_RAYFIRE_HOSPITAL_DOORS_TRIGGER_POINT 114436.0 // point in the uber playback we play the rayfire hospital doors anim CONST_FLOAT NIGEL2_HOSPITAL_WALL_SMASH_01_TRIGGER_POINT 117166.0 // point in the uber playback we trigger wall smash 01 sfx CONST_FLOAT NIGEL2_HOSPITAL_WALL_SMASH_02_TRIGGER_POINT 117736.0 // point in the uber playback we trigger wall smash 02 sfx CONST_FLOAT NIGEL2_HOSPITAL_WALL_SMASH_03_TRIGGER_POINT 118496.0 // point in the uber playback we trigger wall smash 03 sfx CONST_FLOAT NIGEL2_HOSPITAL_WINDOW_SMASH_TRIGGER_POINT 120986.0 // point in the uber playback we trigger window smash sfx CONST_FLOAT NIGEL2_HOSPITAL_CRASH_SCREAMS_01_TRIGGER_POINT 114936.0 // point in the uber playback we trigger scream 01 sfx CONST_FLOAT NIGEL2_HOSPITAL_CRASH_SCREAMS_02_TRIGGER_POINT 118186.0 // point in the uber playback we trigger scream 02 sfx CONST_FLOAT NIGEL2_TARGET_VEHICLE_VISUAL_DAMAGE_POINT 124136.0 // point in the uber playback we apply damage to the target vehicle for smashing into the wall at the crash site CONST_FLOAT NIGEL2_DEFAULT_UBER_PLAYBACK_SPEED 1.0 // can be tweaked to change the overal speed of the uber playback CONST_FLOAT NIGEL2_UBER_TIME_STEP_01 43.5 // time to change veh rec start times to accomidate change rec for tunnel section CONST_FLOAT NIGEL2_UBER_TIME_STEP_02 78.5 // time to change veh rec start times to accomidate change rec for cross roads CONST_FLOAT NIGEL2_UBER_PLAYBACK_TIME_STEP_POINT_01 41011.0 // playeback time in original rec first step occured CONST_FLOAT NIGEL2_UBER_PLAYBACK_TIME_STEP_POINT_02 77018.5 // playeback time in original rec first step occured CONST_INT NIGEL2_TOTAL_DIALOGUE_LINES_GET_IN_NIGEL_CAR 2 // max dialogue lines / convos for initial state get in car CONST_INT NIGEL2_TOTAL_IMPORTANT_DIALOGUE_DURING_CHASE 8 // max dialogue lines / convos during car chase which are important CONST_INT NIGEL2_TOTAL_CATCH_UP_DIALOGUE_DURING_CHASE 3 // max dialogue lines / convos for catch up dialogue CONST_INT NIGEL2_TOTAL_BANTER_DIALOGUE_DURING_CHASE 7 // max dialogue lines / convos for banter during chase CONST_INT NIGEL2_MISSION_VEHICLES_HEALTH 2000 // initial vehicle health set on Nigel and target's vehicle CONST_INT NIGEL2_TOTAL_UBER_VEHICLE_HORNS_TO_PROCESS 12 // horns done in script CONST_INT NIGEL2_TOTAL_START_AREA_SCRIPTED_VEHICLES 3 // scripted vehicles at the start area, not part of the uber recording CONST_INT TOTAL_HOSPITAL_PEDS 9 // scripted peds at the hospital CONST_INT TOTAL_START_AREA_PEDS 4 // scripted peds at the start area CONST_INT CP_NIGEL2_START_CHASE 0 // 1st mission replay checkpoint CONST_INT CP_NIGEL2_MISSION_PASSED 1 // 2nd mission replay checkpoint - used by shitskip CONST_INT Z_SKIP_INTRO_MOCAP 0 CONST_INT Z_SKIP_START_CHASE 1 CONST_INT Z_SKIP_PARK_CAR_NEXT_TO_TARGET 2 CONST_INT Z_SKIP_OUTRO_CUTSCENE 3 CONST_INT Z_SKIP_MISSION_PASSED 4 CONST_INT NIGEL2_MUSIC_EVENT_START 0 CONST_INT NIGEL2_MUSIC_EVENT_CAR 1 CONST_INT NIGEL2_MUSIC_EVENT_JUMP 2 CONST_INT NIGEL2_MUSIC_EVENT_STOP 3 CONST_INT NIGEL2_TOTAL_SCENARIO_BLOCKING_AREAS_CHASE_ROUTE 5 //------------------------------------------------------------------------------------------------------------------------------------------------- // :VARIABLES: //------------------------------------------------------------------------------------------------------------------------------------------------- MISSION_STAGE eMissionStage = MISSION_STAGE_INTRO_MOCAP_SCENE // MISSION_STAGE_INTRO_MOCAP_SCENE // MISSION_STAGE_INTRO_MOCAP_SCENE MISSION_STAGE_DEBUG_RECORD_CHASE_ROUTE MISSION_STAGE_DEBUG_PLAYBACK_CHASE_ROUTE MISSION_STAGE_DEBUG MISSION_STAGE_DEBUG_HOPSITAL MISSION_STAGE eMissionSkipTargetStage //used in mission checkpoint setup and debug stage skipping SUB_STAGE eSubStage = SS_SETUP g_structRCScriptArgs sRCLauncherDataLocal #IF IS_DEBUG_BUILD//stage skipping CONST_INT MAX_SKIP_MENU_LENGTH 5 MissionStageMenuTextStruct mSkipMenu[MAX_SKIP_MENU_LENGTH] #ENDIF BOOL bFinishedStageSkipping = TRUE //used to determine if we are mission replay checkpoint skipping or debug skipping BOOL bLoadedWorldForStageSkipping = FALSE // flag to say if we haveloaded the world around the player when stage skipping BOOL bDoneDialogue_BanterChase[NIGEL2_TOTAL_BANTER_DIALOGUE_DURING_CHASE] BOOL bDoneDialogue_CatchUp[NIGEL2_TOTAL_CATCH_UP_DIALOGUE_DURING_CHASE] BOOL bDoneDialogue_WrongWaySpecialFail BOOL bDoneDialogue_Chase[NIGEL2_TOTAL_IMPORTANT_DIALOGUE_DURING_CHASE] BOOL bDoneDialogue_InitialInstruction BOOL bDoneDialogue_GetInNigelsVehicle[NIGEL2_TOTAL_DIALOGUE_LINES_GET_IN_NIGEL_CAR] BOOL bDoneDialogue_WarnRamming BOOL bDoneDialogue_TrevorGetsWantedLevel BOOL bDoneDialogue_CopsSeenChasing BOOL bDoneDialogue_DrivingOnWrongSideRoad BOOL bDoneDialogue_UpsideDownOrAirbourne BOOL bDoneObjective_GetBackInVehicle BOOL bDoneObjective_Initial_GetInNigelsVehicle //BOOL bDoneObjective_WaitForNigelAndMrsT BOOL bDoneObjective_WarnLeavingNigelAndMrsT BOOL bDoneCleanup_JumpOutHospitalWindow BOOL bDoneOneTime_JumpOutHospitalWindow BOOL bDone_KillConvoForOutTheVehicleDialogue BOOL bDone_PlayerInNigelVehicle_FirstTime BOOL bDone_RequestHospitalAudio BOOL bDone_StartLocationVehicleHorn BOOL bDone_TargetStartChaseRoute BOOL bDone_TurnEngineOnForPlayer BOOL bDone_UberRecordingCleanupForChaseEnd BOOL bDone_UpdateTrashTruckPedModel BOOL bDone_UpdateBMXPedModel BOOL bDone_UberVehicleHorn[NIGEL2_TOTAL_UBER_VEHICLE_HORNS_TO_PROCESS] BOOL bDone_VisualDamageForTargetVehicle BOOL bDone_HospitalJumpPaperTrailFX BOOL bHadToFadeOutToLoadMissionAssets BOOL bHasPTFX_ForHospitalDebrisBeenRequested BOOL bIsImportantDialoguePlaying BOOL bIsInterruptDialoguePlaying BOOL bIsHospitalDebrisEffectActive BOOL bStartedPlayBack_ScriptedVehicleAtStartLocation BOOL bStatTracker_HasPlayerKeptCloseToDiNapoli BOOL bStatTracker_IsNigelVehicleDamageStatActive BOOL bStatTracker_HasPlayerInjuredPedWhilstInHospital //BOOL bSetHospital_IPL_InteriorLoadedState BOOL bHasSetExitStateFromOutroMocapForGameplayCam BOOL bRequestedOutroMocap BOOL bForceTargetblipFlashThisFrame BOOL bSetNigelVehicleHDForMocapExit BOOL bTriggerLandingFromJumpSFX CAMERA_INDEX camHospitalJump FAILED_REASON_ENUM eN2_MissionFailedReason INT iHospitalSoundFX_Progress INT iPreLoadRecordingsTimer INT iRayfireProgress_HospitalDoors INT iTimer_DialogueDelay INT iTimer_TrevorGetBackInCarDialogue INT iTimer_NigelVehicleJumpsTimer INT iTriggerScriptedPedestriansTimer INT iUpdateUberVehicleTweaksTimer INT iMissionMusicEventTriggerCounter INT iTimer_NigelVehicleStuckOnRoofFail INT iSoundID_UberVehicleFakeRevs INT iMainCarRecID INT iScenarioBlockingAreaStage INT iTimer_MissionPassedDelay // added because Nigel has to use waypoint rec to drive off which needs a little time INT iTimer_OutroMocapDelay INTERIOR_INSTANCE_INDEX HospitalInteriorIndex HOSPITAL_INTERIOR_STATE eHospitalInteriorState FLOAT fCimematicCamOvverideZoneDepth FLOAT fCurrentChaseDistance FLOAT fCurrentPlaybackTime FLOAT fDistPlayerToNigelVehicle FLOAT fMainPlaybackSpeed FLOAT fTimeScale_HospitalJump MODEL_NAMES mnDefaultPedForVehicle MODEL_NAMES mnDoctorMale MODEL_NAMES mnScrubsFemale MODEL_NAMES mnFemaleStartArea STRUCT_MISSION_OBJECT sObjectHospitalDoors PED_INDEX pedIndexDialogueInterrupter PTFX_ID HospitalDebris_PTFX_ID PTFX_ID HospitalJump_PTFX_ID RAYFIRE_INDEX rfHospitalDoors REL_GROUP_HASH relGroupEnemy REL_GROUP_HASH relGroupFriendly SCENARIO_BLOCKING_INDEX scenarioBlockingIntroArea SCENARIO_BLOCKING_INDEX scenarioBlockingOutroArea SCENARIO_BLOCKING_INDEX scenarioBlockingChaseRoute[NIGEL2_TOTAL_SCENARIO_BLOCKING_AREAS_CHASE_ROUTE] STRING sNigel2_UberRecordingName = "Nigel2U" STRING sNigel2_CarRecNigelOutro = "Nigel2Outro" STRING sSceneHandle_MrsThornhill = "Mrs_Thornhill" STRING sSceneHandle_Nigel = "Nigel" STRING sSceneHandle_Trevor = "Trevor" STRING sSceneHandle_AlDiNapoli = GET_AL_DI_NAPOLI_SCENE_HANDLE() STRING sSceneHandle_NigelVehicle = "Showroom_Car" STRING sSceneHandle_AlDiNapoliVehicle = "EXL_2_abandoned_car" structPedsForConversation sDialogue STRUCT_MISSION_PED sMrsThornhillPed STRUCT_MISSION_PED sNigelPed STRUCT_MISSION_PED sTargetPed STRUCT_MISSION_VEHICLE sNigelVehicle STRUCT_MISSION_VEHICLE sTargetVehicle //STRUCT_SIMPLE_MISSION_PED sDogPedSimple STRUCT_SIMPLE_MISSION_PED sDefaultPedForScriptedVehicle STRUCT_SIMPLE_MISSION_PED sHospitalPedSimple[TOTAL_HOSPITAL_PEDS] STRUCT_SIMPLE_MISSION_PED sStartAreaPedSimple[TOTAL_START_AREA_PEDS] STRUCT_SIMPLE_MISSION_VEHICLE sStartLocationVehicle[NIGEL2_TOTAL_START_AREA_SCRIPTED_VEHICLES] STRUCT_SIMPLE_MISSION_VEHICLE sVehicleForPlayerOnMissionPassed HOSPITAL_DOORS_OBJECT_STATE eHospitalDoorsObjectState //TEXT_LABEL_23 tl23_CurrentConversation TEXT_LABEL_23 tlOutroMocapName = "NMT_2_MCS_2" VECTOR vCinematicCamOverrideZone01 VECTOR vCinematicCamOverrideZone02 VECTOR vPlayerPos //VECTOR vCoords_IPL_PILLBOX_HILL_INTERIOR //VECTOR vCoords_IPL_PILLBOX_HILL VECTOR vJumpOutHospitalCamCoords VECTOR vJumpOutHospitalCamLookAtOffset //------------------------------------------------------------------------------------------------------------------------------------------------- // :DEBUG FUNCS / PROCS / WIDGETS //------------------------------------------------------------------------------------------------------------------------------------------------- #IF IS_DEBUG_BUILD WIDGET_GROUP_ID widgetGroup BOOL bDebug_PrintMissionInfoToTTY = FALSE // needs to be false for submit! BOOL bDebug_PrintMissionRubberbandInfoToTTY = FALSE // needs to be false for submit! BOOL bDebug_PrintHospitalStatTrackInfoToTTY = FALSE // needs to be false for submit! BOOL bOutputTargetPlaybackTime = FALSE BOOL bDebug_OpenNigelCarBoot = FALSE BOOL bDebug_CloseNigelCarBoot = FALSE BOOL bDebug_ResetForPlaceInBoot = FALSE BOOL bDebug_UnFreezePedInBootPos = FALSE VECTOR vDebug_PositionPedInBoot VECTOR vDebug_PositionPedInBootOffset = <<-0.2000, -1.8000, -1.0000>> VECTOR vDebug_RotationPedInBoot = <<15.0000, -85.0000, 0.0000>> BOOL bDebug_OutputPedInBootValues = FALSE BOOL bDebug_JustUpdatePedInBootPosAndRot = FALSE BOOL bDebug_ApplyGameplayCam_HeadingAndPitch = FALSE FLOAT fDebug_GameplayCam_Heading = 0.0 FLOAT fDebug_GameplayCam_Pitch = 0.0 BOOL bDebug_GetCurrentGameplayHeadingAndPitch = FALSE BOOL bDebug_DoneDeformCar = FALSE VECTOR vDebug_CarDamageCoords = << 0.0, 0.0, 0.0 >> FLOAT fDebug_CarDamageAmount = 1.0 FLOAT fDebug_CarDeformationAmount = 1.0 BOOL bDebug_PrintPlayerVehicleInfo = FALSE INT iDebug_TrafficCarToTurnCollisionOffOn = 0 INT iDebug_SetPieceCarToTurnCollisionOffOn = 0 BOOL bDebug_SelectedTrafficCarHasCollision = TRUE BOOL bDebug_SelectedSetPieceCarHasCollision = TRUE VECTOR vDebug_TempPlayerVehicleSetPosition = << 0.0, 0.0, 0.0 >> BOOL bDebug_ApplyPositionValueToPlayerVehicle = FALSE FLOAT fDebug_TempPlayerVehicleQuatX FLOAT fDebug_TempPlayerVehicleQuatY FLOAT fDebug_TempPlayerVehicleQuatZ FLOAT fDebug_TempPlayerVehicleQuatW BOOL bDebug_ApplyQuaternionValuesToPlayerVehicle = FALSE BOOL bDebug_SnapPlayerVehicleToGround = FALSE PTFX_ID DEBUG_HospitalDebris_PTFX_ID VEHICLE_INDEX vehDebug_Ghost //FLOAT fDebug_CatchUpMultiplier INT iDebug_AdditionalAIDriveTime = 0 BOOL bDebug_ToggleGhostCarVisible = FALSE BOOL bDebug_StartHospitalDebris_PTFX_ID = FALSE BOOL bDebug_OutputRayfireHospitalDoorsProgress = FALSE BOOL bDebug_OutputRayfireHospitalDoorsCurrentState = FALSE BOOL bDebug_DisplayStatTrackerInfo_PlayerCloseToTarget = FALSE BOOL bDebug_OverrideStatTracker_PlayerCloseToTargetRange = FALSE FLOAT fDebug_StatTracker_PlayerCloseToTargetRange = 100 BOOl bDebug_CheckPlayerInsideHospital = FALSE INT iDebug_IPL_PillBox_State = 0 BOOL bDebug_Set_IPL_PillBox_State = FALSE INT iDebug_ES_PillBox_State = 0 BOOL bDebug_Set_ES_PillBox_State = FALSE VECTOR vDebug_HospitalJumpFXOffset = << 0.0, -1.5, -0.4 >> VECTOR vDebug_HospitalJumpFXRotation = << 0.0, 0.0, 0.0 >> FLOAT fDebug_HospitalJumpFXScale = 0.3 BOOL bDebug_StartHospitalJumpFX = FALSE BOOL bDebug_SetupMission_DebugStage = FALSE FLOAT fDebug_OverrideMinTimeScale = 0.25 BOOL bDebug_OverrideMinTimeScale = FALSE FLOAT fDebug_TimeScaleStep_ModifierDecrease = 0.9 BOOL bDebug_OverrideTimeScaleStepModifier_Decrease = FALSE FLOAT fDebug_TimeScaleStep_ModifierIncrease = 2.0 BOOL bDebug_OverrideTimeScaleStepModifier_Increase = FALSE /// PURPOSE: /// My debug mission widget groups, which get created in RAG->SCRIPT PROC SETUP_MISSION_WIDGET() widgetGroup = START_WIDGET_GROUP("NIGEL 2 WIDGETS") START_WIDGET_GROUP("General") ADD_WIDGET_BOOL("TTY Toggle - Print Mission Debug Info", bDebug_PrintMissionInfoToTTY) ADD_WIDGET_BOOL("TTY Toggle - Print Rubberbanding Debug Info", bDebug_PrintMissionRubberbandInfoToTTY) ADD_WIDGET_BOOL("TTY Toggle - Print hospital stat track Debug Info", bDebug_PrintHospitalStatTrackInfoToTTY) ADD_WIDGET_BOOL("Debug Output Rayfire Hospital Doors Progress", bDebug_OutputRayfireHospitalDoorsProgress) ADD_WIDGET_BOOL("Debug Output Rayfire Hospital Doors Current state every frame", bDebug_OutputRayfireHospitalDoorsCurrentState) ADD_WIDGET_BOOL("Apply Gameplay Cam Heading And Pitch", bDebug_ApplyGameplayCam_HeadingAndPitch) ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Heading -", fDebug_GameplayCam_Heading, -360.0, 360.0, 0.1) ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Pitch -", fDebug_GameplayCam_Pitch, -360.0, 360.0, 0.1) ADD_WIDGET_BOOL("Print Current Gameplay Cam Heading and Pitch", bDebug_GetCurrentGameplayHeadingAndPitch) ADD_WIDGET_BOOL("Test player inside hospital interior", bDebug_CheckPlayerInsideHospital) ADD_WIDGET_BOOL("Debug Display Stat Tracker Info - Player Close To Target Range", bDebug_DisplayStatTrackerInfo_PlayerCloseToTarget) ADD_WIDGET_BOOL("Debug Override Stat Tracker - Player Close To Target Range", bDebug_OverrideStatTracker_PlayerCloseToTargetRange) ADD_WIDGET_FLOAT_SLIDER("Debug Stat Tracker Player Close To Target Range = ", fDebug_StatTracker_PlayerCloseToTargetRange, 0.0, 300.0, 0.1) ADD_WIDGET_INT_SLIDER("Traffic Car To Turn Off Collision On ID - ", iDebug_TrafficCarToTurnCollisionOffOn, 0, 150, 1) ADD_WIDGET_BOOL("Toggle Selected Traffic Car's Collision - ", bDebug_SelectedTrafficCarHasCollision) ADD_WIDGET_INT_SLIDER("Set Piece Car To Turn Off Collision On ID - ", iDebug_SetPieceCarToTurnCollisionOffOn, 0, 150, 1) ADD_WIDGET_BOOL("Toggle Selected Set Piece Car's Collision - ", bDebug_SelectedSetPieceCarHasCollision) ADD_WIDGET_BOOL("Start hospital debris PTFX", bDebug_StartHospitalDebris_PTFX_ID) ADD_WIDGET_INT_SLIDER("iDebug_IPL_PillBox_State : ", iDebug_IPL_PillBox_State, 0, 150, 1) ADD_WIDGET_BOOL("bDebug_Set_IPL_PillBox_State", bDebug_Set_IPL_PillBox_State) ADD_WIDGET_INT_SLIDER("iDebug_ES_PillBox_State : ", iDebug_ES_PillBox_State, 0, 150, 1) ADD_WIDGET_BOOL("bDebug_Set_ES_PillBox_State", bDebug_Set_ES_PillBox_State) ADD_WIDGET_FLOAT_SLIDER("Force Cinematic Cam Zone Depth - ", fCimematicCamOvverideZoneDepth, -360.0, 360.0, 0.1) ADD_WIDGET_VECTOR_SLIDER("Force Cinematic Cam Zone Pos 1 - ", vCinematicCamOverrideZone01, -1000, 1000, 0.1) ADD_WIDGET_VECTOR_SLIDER("Force Cinematic Cam Zone Pos 2 - ", vCinematicCamOverrideZone02, -1000, 1000, 0.1) ADD_WIDGET_BOOL("bDebug_StartHospitalJumpFX", bDebug_StartHospitalJumpFX) ADD_WIDGET_VECTOR_SLIDER("vDebug_HospitalJumpFXOffset : ", vDebug_HospitalJumpFXOffset, -1000, 1000, 0.1) ADD_WIDGET_VECTOR_SLIDER("vDebug_HospitalJumpFXRotation : ", vDebug_HospitalJumpFXRotation, -1000, 1000, 0.1) ADD_WIDGET_FLOAT_SLIDER("fDebug_HospitalJumpFXScale : ", fDebug_HospitalJumpFXScale, 0.0, 5.0, 0.001) STOP_WIDGET_GROUP() START_WIDGET_GROUP("Hospital Window Jump") ADD_WIDGET_BOOL("Set Mission To Debug Window Jump Stage", bDebug_SetupMission_DebugStage) ADD_WIDGET_VECTOR_SLIDER("vJumpOutHospitalCamCoords : ", vJumpOutHospitalCamCoords, -1000, 1000, 0.1) ADD_WIDGET_VECTOR_SLIDER("vJumpOutHospitalCamLookAtOffset : ", vJumpOutHospitalCamLookAtOffset, -1000, 1000, 0.1) ADD_WIDGET_FLOAT_SLIDER("Set value : Min Time Scale Override (1.0 is normal) : ", fDebug_OverrideMinTimeScale, 0.0, 1.0, 0.001) ADD_WIDGET_BOOL("Toggle - use Min time scale override", bDebug_OverrideMinTimeScale) ADD_WIDGET_FLOAT_SLIDER("Set value : Time Scale Step Modifier (to min scale) : ", fDebug_TimeScaleStep_ModifierDecrease, 0.0, 5.0, 0.001) ADD_WIDGET_BOOL("Toggle - use time scale modifier (to min scale)", bDebug_OverrideTimeScaleStepModifier_Decrease) ADD_WIDGET_FLOAT_SLIDER("Set value : Time Scale Step Modifier (back to normal scale) : ", fDebug_TimeScaleStep_ModifierIncrease, 0.0, 5.0, 0.001) ADD_WIDGET_BOOL("Toggle - use time scale modifier (back to normal scale)", bDebug_OverrideTimeScaleStepModifier_Increase) STOP_WIDGET_GROUP() /* START_WIDGET_GROUP("Rerecord main car") ADD_WIDGET_BOOL("TTY Toggle - toggle ghost car visible", bDebug_ToggleGhostCarVisible) ADD_WIDGET_INT_SLIDER("iDebug_AdditionalAIDriveTime : ", iDebug_AdditionalAIDriveTime, -5000, 5000, 1) STOP_WIDGET_GROUP()*/ /* START_WIDGET_GROUP("Placement of Ped in Boot") ADD_WIDGET_BOOL("Open Nigel's car boot", bDebug_OpenNigelCarBoot) ADD_WIDGET_BOOL("Close Nigel's car boot", bDebug_CloseNigelCarBoot) ADD_WIDGET_BOOL("Reset for ped positioning in boot", bDebug_ResetForPlaceInBoot) ADD_WIDGET_BOOL("Unfreeze ped", bDebug_UnFreezePedInBootPos) ADD_WIDGET_BOOL("Just update pos and rot", bDebug_JustUpdatePedInBootPosAndRot) ADD_WIDGET_VECTOR_SLIDER("Position Offset from car of ped", vDebug_PositionPedInBootOffset, -4000.0, 4000.0, 0.1) ADD_WIDGET_VECTOR_SLIDER("Rotation of ped", vDebug_RotationPedInBoot, -4000.0, 4000.0, 0.1) ADD_WIDGET_BOOL("print ped in boot info to Temp_debug.txt", bDebug_OutputPedInBootValues) STOP_WIDGET_GROUP() */ /* START_WIDGET_GROUP("Configure Damage applied to target vehicle in crash scene") ADD_WIDGET_BOOL("Apply deform the target car.", bDebug_DoneDeformCar) ADD_WIDGET_VECTOR_SLIDER("Car Damage Coords - ", vDebug_CarDamageCoords, -1000.0, 1000.0, 0.1) ADD_WIDGET_FLOAT_SLIDER("Car Damage amount - ", fDebug_CarDamageAmount, -50.0, 10000.0, 1.0) ADD_WIDGET_FLOAT_SLIDER("Car Deformation amount - ", fDebug_CarDeformationAmount, -50.0, 10000.0, 1.0) STOP_WIDGET_GROUP() */ START_WIDGET_GROUP("Player vehicle positioning stuff") ADD_WIDGET_VECTOR_SLIDER("Set player vehicle position vector - ", vDebug_TempPlayerVehicleSetPosition, -10000, 10000, 0.0001) ADD_WIDGET_BOOL("Apply above position to player's vehicle", bDebug_ApplyPositionValueToPlayerVehicle) ADD_WIDGET_FLOAT_SLIDER("Set player vehicle quaternion X value -", fDebug_TempPlayerVehicleQuatX, -3.0, 3.0, 0.0001) ADD_WIDGET_FLOAT_SLIDER("Set player vehicle quaternion Y value -", fDebug_TempPlayerVehicleQuatY, -3.0, 3.0, 0.0001) ADD_WIDGET_FLOAT_SLIDER("Set player vehicle quaternion Z value -", fDebug_TempPlayerVehicleQuatZ, -3.0, 3.0, 0.0001) ADD_WIDGET_FLOAT_SLIDER("Set player vehicle quaternion W value -", fDebug_TempPlayerVehicleQuatW, -3.0, 3.0, 0.0001) ADD_WIDGET_BOOL("Apply above quaternion to player's vehicle", bDebug_ApplyQuaternionValuesToPlayerVehicle) ADD_WIDGET_BOOL("Snap the player's current vehicle to the ground", bDebug_SnapPlayerVehicleToGround) ADD_WIDGET_BOOL("Print player's current vehicle info, pos, quat and heading", bDebug_PrintPlayerVehicleInfo) STOP_WIDGET_GROUP() SET_UBER_PARENT_WIDGET_GROUP(widgetGroup) STOP_WIDGET_GROUP() ENDPROC /// PURPOSE: /// updates my mission widgets, based off RAG input PROC MAINTAIN_MISSION_WIDGETS() FLOAT fDebug_PlaybackTime TEXT_LABEL_63 tlTemp /* // debug fail IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_0)) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PRESSED KEY 0") ENDIF #ENDIF IF IS_PED_UNINJURED(sTargetPed.ped) SET_ENTITY_HEALTH(sTargetPed.ped, 0) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - KILLED sTargetPed PED") ENDIF #ENDIF ENDIF ELIF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_9)) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PRESSED KEY 9") ENDIF #ENDIF IF IS_PED_UNINJURED(PLAYER_PED_ID()) SET_ENTITY_HEALTH(PLAYER_PED_ID(), 0) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - KILLED Player PED") ENDIF #ENDIF ENDIF ENDIF */ BUILDING_STATE_ENUM eTempBuildingState // toggle the build swap states IF bDebug_Set_IPL_PillBox_State eTempBuildingState = INT_TO_ENUM(BUILDING_STATE_ENUM, iDebug_IPL_PillBox_State) SET_BUILDING_STATE(BUILDINGNAME_IPL_PILLBOX_HILL, eTempBuildingState) bDebug_Set_IPL_PillBox_State = FALSE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG WIDGET: bDebug_Set_IPL_PillBox_State set to : ", eTempBuildingState) ENDIF #ENDIF ENDIF IF bDebug_Set_ES_PillBox_State eTempBuildingState = INT_TO_ENUM(BUILDING_STATE_ENUM, iDebug_ES_PillBox_State) SET_BUILDING_STATE(BUILDINGNAME_ES_PILLBOX_HILL, eTempBuildingState) // contains the rayfire for the front door bDebug_Set_ES_PillBox_State = FALSE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG WIDGET: bDebug_Set_ES_PillBox_State set to : ", eTempBuildingState) ENDIF #ENDIF ENDIF IF DOES_ENTITY_EXIST(sNigelVehicle.vehicle) AND NOT IS_ENTITY_DEAD(sNigelVehicle.vehicle) IF bDebug_StartHospitalJumpFX REQUEST_PTFX_ASSET() IF HAS_PTFX_ASSET_LOADED() IF DOES_PARTICLE_FX_LOOPED_EXIST(HospitalJump_PTFX_ID) STOP_PARTICLE_FX_LOOPED(HospitalJump_PTFX_ID) ENDIF HospitalJump_PTFX_ID = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_rcn2_debris_trail", sNigelVehicle.vehicle, vDebug_HospitalJumpFXOffset, vDebug_HospitalJumpFXRotation, fDebug_HospitalJumpFXScale) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG : PTFX hospital jump started FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF bDebug_StartHospitalJumpFX = FALSE ENDIF ENDIF //DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sNigelVehicle.vehicle, vDebug_HospitalJumpFXOffset), 0.25, 0, 50, 0, 100) ENDIF IF bDebug_ToggleGhostCarVisible IF IS_VEHICLE_OK(vehDebug_Ghost) IF IS_ENTITY_VISIBLE(vehDebug_Ghost) SET_ENTITY_VISIBLE(vehDebug_Ghost, FALSE) ELSE SET_ENTITY_VISIBLE(vehDebug_Ghost, TRUE) ENDIF bDebug_ToggleGhostCarVisible = FALSE ENDIF ENDIF //SET_DEBUG_ACTIVE(TRUE) //SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE) IF bDebug_OpenNigelCarBoot IF DOES_ENTITY_EXIST(sNigelVehicle.vehicle) AND NOT IS_ENTITY_DEAD(sNigelVehicle.vehicle) //IF NOT IS_VEHICLE_DOOR_FULLY_OPEN(sNigelVehicle.vehicle, SC_DOOR_BOOT) SET_VEHICLE_DOOR_OPEN(sNigelVehicle.vehicle, SC_DOOR_BOOT) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG WIDGET: nigel vehicle foot set open") ENDIF #ENDIF //ENDIF bDebug_OpenNigelCarBoot = FALSE ENDIF ENDIF IF bDebug_CloseNigelCarBoot IF DOES_ENTITY_EXIST(sNigelVehicle.vehicle) AND NOT IS_ENTITY_DEAD(sNigelVehicle.vehicle) //IF IS_VEHICLE_DOOR_FULLY_OPEN(sNigelVehicle.vehicle, SC_DOOR_BOOT) SET_VEHICLE_DOOR_SHUT(sNigelVehicle.vehicle, SC_DOOR_BOOT) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG WIDGET: nigel vehicle door set closed") ENDIF #ENDIF //ENDIF bDebug_CloseNigelCarBoot = FALSE ENDIF ENDIF IF bDebug_ResetForPlaceInBoot IF DOES_ENTITY_EXIST(sTargetPed.ped) AND NOT IS_PED_INJURED(sTargetPed.ped) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG WIDGET: about to detach player and celeb") ENDIF #ENDIF IF NOT IS_PED_IN_ANY_VEHICLE(sTargetPed.ped) IF IS_ENTITY_ATTACHED_TO_ANY_PED(sTargetPed.ped) DETACH_ENTITY(sTargetPed.ped) ENDIF ENDIF SET_PED_GRAVITY(sTargetPed.ped, FALSE) SET_ENTITY_COLLISION(sTargetPed.ped, FALSE) FREEZE_ENTITY_POSITION(sTargetPed.ped, FALSE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sTargetPed.ped, TRUE) CLEAR_PED_TASKS_IMMEDIATELY(sTargetPed.ped) //TASK_PLAY_ANIM(sTargetPed.ped, "ped", "nm_foetal", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_HOLD_LAST_FRAME) //AF_HOLD_LAST_FRAME|AF_NOT_INTERRUPTABLE, 1.0) //vDebug_PositionPedInBoot = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sNigelVehicle.vehicle, vDebug_PositionPedInBootOffset) SET_ENTITY_COORDS(sTargetPed.ped, vDebug_PositionPedInBoot) SET_ENTITY_ROTATION(sTargetPed.ped, vDebug_RotationPedInBoot) //IF NOT IS_ENTITY_PLAYING_ANIM(sTargetPed.ped, "ped", "nm_foetal") //TASK_PLAY_ANIM_ADVANCED(sTargetPed.ped, "ped", "nm_foetal", vDebug_PositionPedInBoot, vDebug_RotationPedInBoot, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_HOLD_LAST_FRAME|AF_NOT_INTERRUPTABLE, 1.0) //ENDIF //FREEZE_ENTITY_POSITION(sTargetPed.ped, TRUE) bDebug_ResetForPlaceInBoot = FALSE ENDIF ENDIF IF bDebug_UnFreezePedInBootPos IF DOES_ENTITY_EXIST(sTargetPed.ped) AND NOT IS_PED_INJURED(sTargetPed.ped) FREEZE_ENTITY_POSITION(sTargetPed.ped, FALSE) //SET_PED_GRAVITY(sTargetPed.ped, TRUE) //SET_ENTITY_COLLISION(sTargetPed.ped, TRUE) bDebug_UnFreezePedInBootPos = FALSE ENDIF ENDIF IF bDebug_JustUpdatePedInBootPosAndRot SET_ENTITY_COORDS(sTargetPed.ped, vDebug_PositionPedInBoot) SET_ENTITY_ROTATION(sTargetPed.ped, vDebug_RotationPedInBoot) FREEZE_ENTITY_POSITION(sTargetPed.ped, TRUE) bDebug_JustUpdatePedInBootPosAndRot = FALSE ENDIF IF bDebug_OutputPedInBootValues OPEN_DEBUG_FILE() SAVE_NEWLINE_TO_DEBUG_FILE() tlTemp = "vPositionOffsetFromCarOfPedForBoot " SAVE_STRING_TO_DEBUG_FILE(tlTemp) SAVE_VECTOR_TO_DEBUG_FILE(vDebug_PositionPedInBootOffset) SAVE_NEWLINE_TO_DEBUG_FILE() tlTemp = "vRotationOfPedForBoot " SAVE_STRING_TO_DEBUG_FILE(tlTemp) SAVE_VECTOR_TO_DEBUG_FILE(vDebug_RotationPedInBoot) SAVE_NEWLINE_TO_DEBUG_FILE() CLOSE_DEBUG_FILE() #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "BOOT PED INFO PRINTED") ENDIF #ENDIF bDebug_OutputPedInBootValues = FALSE ENDIF IF bOutputTargetPlaybackTime AND IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO) IF NOT IS_ENTITY_DEAD(sTargetVehicle.vehicle) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) fDebug_PlaybackTime = GET_TIME_POSITION_IN_RECORDING(sTargetVehicle.vehicle) OPEN_DEBUG_FILE() SAVE_NEWLINE_TO_DEBUG_FILE() tlTemp = "TARGET'S PLAYBACK TIME : " SAVE_STRING_TO_DEBUG_FILE(tlTemp) SAVE_FLOAT_TO_DEBUG_FILE(fDebug_PlaybackTime) SAVE_NEWLINE_TO_DEBUG_FILE() CLOSE_DEBUG_FILE() #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TARGET pLAYBACK INFO PRINTED") ENDIF #ENDIF ENDIF ENDIF ENDIF IF bDebug_ApplyGameplayCam_HeadingAndPitch SET_GAMEPLAY_CAM_RELATIVE_HEADING(fDebug_GameplayCam_Heading) SET_GAMEPLAY_CAM_RELATIVE_PITCH(fDebug_GameplayCam_Pitch) bDebug_ApplyGameplayCam_HeadingAndPitch = FALSE ENDIF IF bDebug_GetCurrentGameplayHeadingAndPitch FLOAT fTemp_Heading = GET_GAMEPLAY_CAM_RELATIVE_HEADING() FLOAT fTemp_Pitch = GET_GAMEPLAY_CAM_RELATIVE_PITCH() OPEN_DEBUG_FILE() SAVE_NEWLINE_TO_DEBUG_FILE() tlTemp = "Current Gameplay Cam Relative Heading : " SAVE_STRING_TO_DEBUG_FILE(tlTemp) SAVE_FLOAT_TO_DEBUG_FILE(fTemp_Heading) SAVE_NEWLINE_TO_DEBUG_FILE() tlTemp = "Current Gameplay Cam Relative Pitch : " SAVE_STRING_TO_DEBUG_FILE(tlTemp) SAVE_FLOAT_TO_DEBUG_FILE(fTemp_Pitch) SAVE_NEWLINE_TO_DEBUG_FILE() CLOSE_DEBUG_FILE() bDebug_GetCurrentGameplayHeadingAndPitch = FALSE ENDIF IF bDebug_DoneDeformCar IF DOES_ENTITY_EXIST(sTargetVehicle.vehicle) //SET_ENTITY_HEALTH(sTargetVehicle.vehicle, 1000) FREEZE_ENTITY_POSITION(sTargetVehicle.vehicle, FALSE) WAIT(0) IF NOT IS_ENTITY_DEAD(sTargetVehicle.vehicle) SET_VEHICLE_DAMAGE(sTargetVehicle.vehicle, vDebug_CarDamageCoords, fDebug_CarDamageAmount, fDebug_CarDeformationAmount, TRUE) INT iDebug_VehicleHealth = GET_ENTITY_HEALTH(sTargetVehicle.vehicle) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Vehicle damage applied, health now at - ", iDebug_VehicleHealth) ENDIF #ENDIF bDebug_DoneDeformCar = FALSE ENDIF ENDIF ENDIF IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) VEHICLE_INDEX vehDebug = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) IF NOT IS_ENTITY_DEAD(vehDebug) IF bDebug_ApplyPositionValueToPlayerVehicle SET_ENTITY_COORDS_NO_OFFSET(vehDebug, vDebug_TempPlayerVehicleSetPosition) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG AZ WIDGETS - UPDATED PLAYER VEHICLE POS") ENDIF #ENDIF bDebug_ApplyPositionValueToPlayerVehicle = FALSE ENDIF IF bDebug_ApplyQuaternionValuesToPlayerVehicle SET_ENTITY_QUATERNION(vehDebug, fDebug_TempPlayerVehicleQuatX, fDebug_TempPlayerVehicleQuatY, fDebug_TempPlayerVehicleQuatZ, fDebug_TempPlayerVehicleQuatW) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG AZ WIDGETS - UPDATED PLAYER VEHICLE QUATERNION") ENDIF #ENDIF bDebug_ApplyQuaternionValuesToPlayerVehicle = FALSE ENDIF IF bDebug_SnapPlayerVehicleToGround SET_VEHICLE_ON_GROUND_PROPERLY(vehDebug) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG AZ WIDGETS - PLAYER VEHICLE SET ON GROUND PROPERLY") ENDIF #ENDIF bDebug_SnapPlayerVehicleToGround = FALSE ENDIF IF bDebug_PrintPlayerVehicleInfo OPEN_DEBUG_FILE() SAVE_NEWLINE_TO_DEBUG_FILE() tlTemp = "Vehicle Position = " VECTOR vDebug_VehiclePos = GET_ENTITY_COORDS(vehDebug) SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE(tlTemp) SAVE_VECTOR_TO_DEBUG_FILE(vDebug_VehiclePos) SAVE_NEWLINE_TO_DEBUG_FILE() FLOAT fDebug_VehicleQuaternion_X, fDebug_VehicleQuaternion_Y, fDebug_VehicleQuaternion_Z, fDebug_VehicleQuaternion_W GET_ENTITY_QUATERNION(vehDebug, fDebug_VehicleQuaternion_X, fDebug_VehicleQuaternion_Y, fDebug_VehicleQuaternion_Z, fDebug_VehicleQuaternion_W) tlTemp = "Vehicle Quaternion X = " SAVE_STRING_TO_DEBUG_FILE(tlTemp) SAVE_FLOAT_TO_DEBUG_FILE(fDebug_VehicleQuaternion_X) SAVE_NEWLINE_TO_DEBUG_FILE() tlTemp = "Vehicle Quaternion Y = " SAVE_STRING_TO_DEBUG_FILE(tlTemp) SAVE_FLOAT_TO_DEBUG_FILE(fDebug_VehicleQuaternion_Y) SAVE_NEWLINE_TO_DEBUG_FILE() tlTemp = "Vehicle Quaternion Z = " SAVE_STRING_TO_DEBUG_FILE(tlTemp) SAVE_FLOAT_TO_DEBUG_FILE(fDebug_VehicleQuaternion_Z) SAVE_NEWLINE_TO_DEBUG_FILE() tlTemp = "Vehicle Quaternion W = " SAVE_STRING_TO_DEBUG_FILE(tlTemp) SAVE_FLOAT_TO_DEBUG_FILE(fDebug_VehicleQuaternion_W) SAVE_NEWLINE_TO_DEBUG_FILE() tlTemp = "Vehicle Heading = " FLOAT fDebug_VehicleHeading = GET_ENTITY_HEADING(vehDebug) SAVE_STRING_TO_DEBUG_FILE(tlTemp) SAVE_FLOAT_TO_DEBUG_FILE(fDebug_VehicleHeading) SAVE_NEWLINE_TO_DEBUG_FILE() CLOSE_DEBUG_FILE() bDebug_PrintPlayerVehicleInfo = FALSE ENDIF ENDIF ENDIF IF DOES_ENTITY_EXIST(TrafficCarID[iDebug_TrafficCarToTurnCollisionOffOn]) AND NOT IS_ENTITY_DEAD(TrafficCarID[iDebug_TrafficCarToTurnCollisionOffOn]) IF bDebug_SelectedTrafficCarHasCollision SET_ENTITY_COLLISION(TrafficCarID[iDebug_TrafficCarToTurnCollisionOffOn], TRUE) ELSE SET_ENTITY_COLLISION(TrafficCarID[iDebug_TrafficCarToTurnCollisionOffOn], FALSE) ENDIF ENDIF IF DOES_ENTITY_EXIST(SetPieceCarID[iDebug_SetPieceCarToTurnCollisionOffOn]) AND NOT IS_ENTITY_DEAD(SetPieceCarID[iDebug_SetPieceCarToTurnCollisionOffOn]) IF bDebug_SelectedSetPieceCarHasCollision SET_ENTITY_COLLISION(SetPieceCarID[iDebug_SetPieceCarToTurnCollisionOffOn], TRUE) ELSE SET_ENTITY_COLLISION(SetPieceCarID[iDebug_SetPieceCarToTurnCollisionOffOn], FALSE) ENDIF ENDIF IF bDebug_StartHospitalDebris_PTFX_ID IF HAS_PTFX_ASSET_LOADED() IF DOES_PARTICLE_FX_LOOPED_EXIST(DEBUG_HospitalDebris_PTFX_ID) STOP_PARTICLE_FX_LOOPED(DEBUG_HospitalDebris_PTFX_ID) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "REMOVED EXISTING PARTICLE FX") ENDIF #ENDIF ENDIF IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(DEBUG_HospitalDebris_PTFX_ID) DEBUG_HospitalDebris_PTFX_ID = START_PARTICLE_FX_LOOPED_AT_COORD("scr_rcn2_ceiling_debris", << 325.0, -589.0, 45.0 >>, << 0.0, 0.0, 0.0 >>) // scr_rcn2_ceiling_debris // scr_trev2_heli_wreck ripped from another mission to check my script setup is ok. #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PTFX EFFECT HOSPITAL DEBRIS STARTED") ENDIF #ENDIF ENDIF ELSE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PTFX ASSET NOT LOADED !") ENDIF #ENDIF ENDIF bDebug_StartHospitalDebris_PTFX_ID = FALSE ENDIF ENDPROC /// PURPOSE: /// removes my debug mission widget group PROC CLEANUP_MISSION_WIDGETS() IF DOES_WIDGET_GROUP_EXIST(widgetGroup) DELETE_WIDGET_GROUP(widgetGroup) ENDIF SET_DEBUG_ACTIVE(FALSE) SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE) ENDPROC #ENDIF //------------------------------------------------------------------------------------------------------------------------------------------------- // :FUNCTIONS AND PROCEEDURES //------------------------------------------------------------------------------------------------------------------------------------------------- /// PURPOSE: /// contains all the data needed for the uber recording PROC LOAD_UBER_DATA() // **** UBER RECORDED TRAFFIC **** TrafficCarPos[0] = <<-1189.9189, -864.3419, 13.5062>> TrafficCarQuatX[0] = 0.0110 TrafficCarQuatY[0] = -0.0057 TrafficCarQuatZ[0] = -0.4728 TrafficCarQuatW[0] = 0.8811 TrafficCarRecording[0] = 3 TrafficCarStartime[0] = 12794.0000 TrafficCarModel[0] = f620 TrafficCarPos[1] = <<-1168.0251, -846.5394, 13.8245>> TrafficCarQuatX[1] = 0.0067 TrafficCarQuatY[1] = 0.0025 TrafficCarQuatZ[1] = 0.3507 TrafficCarQuatW[1] = 0.9364 TrafficCarRecording[1] = 4 TrafficCarStartime[1] = 12926.0000 TrafficCarModel[1] = washington TrafficCarPos[2] = <<-1052.3594, -730.7704, 18.7290>> TrafficCarQuatX[2] = -0.0125 TrafficCarQuatY[2] = -0.0121 TrafficCarQuatZ[2] = 0.9079 TrafficCarQuatW[2] = 0.4187 TrafficCarRecording[2] = 14 TrafficCarStartime[2] = 19594.9609 TrafficCarModel[2] = serrano TrafficCarPos[3] = <<-1050.4532, -743.3076, 18.7718>> TrafficCarQuatX[3] = -0.0019 TrafficCarQuatY[3] = -0.0002 TrafficCarQuatZ[3] = -0.3894 TrafficCarQuatW[3] = 0.9211 TrafficCarRecording[3] = 6 TrafficCarStartime[3] = 20400.0000 TrafficCarModel[3] = washington //car drives up second hill outside lane (causing issue currently as doesn't always playout) TrafficCarPos[4] = <<-1032.5537, -734.0855, 19.1223>> TrafficCarQuatX[4] = 0.0233 TrafficCarQuatY[4] = -0.0077 TrafficCarQuatZ[4] = -0.4212 TrafficCarQuatW[4] = 0.9066 TrafficCarRecording[4] = 16 TrafficCarStartime[4] = 19960.8496 // 20460.8496 made it kick off a little ealier to hopefully get out way! TrafficCarModel[4] = serrano TrafficCarPos[5] = <<-865.4848, -623.9280, 28.3187>> TrafficCarQuatX[5] = 0.0038 TrafficCarQuatY[5] = -0.0257 TrafficCarQuatZ[5] = 0.9893 TrafficCarQuatW[5] = -0.1433 TrafficCarRecording[5] = 7 TrafficCarStartime[5] = 28417.0000 TrafficCarModel[5] = washington TrafficCarPos[6] = <<-869.6063, -612.9931, 28.5539>> TrafficCarQuatX[6] = 0.0050 TrafficCarQuatY[6] = -0.0119 TrafficCarQuatZ[6] = 0.9777 TrafficCarQuatW[6] = -0.2094 TrafficCarRecording[6] = 8 TrafficCarStartime[6] = 28417.0000 TrafficCarModel[6] = serrano TrafficCarPos[7] = <<-853.7338, -652.7806, 27.3348>> TrafficCarQuatX[7] = -0.0022 TrafficCarQuatY[7] = -0.0021 TrafficCarQuatZ[7] = 0.7085 TrafficCarQuatW[7] = 0.7057 TrafficCarRecording[7] = 9 TrafficCarStartime[7] = 28549.0000 TrafficCarModel[7] = serrano //!!! Pos and quaternion will need update as vehicle model had to change, FELTZER2010 removed from the game !!! /// !!! ALSO may need re-record if wheels dont sit on the ground now TrafficCarPos[8] = <<-797.3943, -667.4530, 28.1434>> TrafficCarQuatX[8] = 0.0434 TrafficCarQuatY[8] = 0.0031 TrafficCarQuatZ[8] = -0.7039 TrafficCarQuatW[8] = 0.7090 TrafficCarRecording[8] = 10 TrafficCarStartime[8] = 30654.0000 TrafficCarModel[8] = feltzer2 TrafficCarPos[9] = <<-728.5153, -661.8074, 29.8396>> TrafficCarQuatX[9] = -0.0017 TrafficCarQuatY[9] = 0.0032 TrafficCarQuatZ[9] = -0.7028 TrafficCarQuatW[9] = 0.7114 TrafficCarRecording[9] = 11 TrafficCarStartime[9] = 33027.0000 TrafficCarModel[9] = RapidGT TrafficCarPos[10] = <<-595.1748, -661.9557, 31.8497>> TrafficCarQuatX[10] = 0.0098 TrafficCarQuatY[10] = -0.0088 TrafficCarQuatZ[10] = -0.7017 TrafficCarQuatW[10] = 0.7123 TrafficCarRecording[10] = 15 TrafficCarStartime[10] = 48186.0000 TrafficCarModel[10] = sultan TrafficCarPos[11] = <<-477.1852, -644.7173, 32.0538>> TrafficCarQuatX[11] = -0.0087 TrafficCarQuatY[11] = 0.0318 TrafficCarQuatZ[11] = 0.0461 TrafficCarQuatW[11] = 0.9984 TrafficCarRecording[11] = 17 TrafficCarStartime[11] = 55765.8516 TrafficCarModel[11] = serrano TrafficCarPos[12] = <<-489.0458, -666.3751, 32.3303>> TrafficCarQuatX[12] = 0.0113 TrafficCarQuatY[12] = 0.0176 TrafficCarQuatZ[12] = -0.7063 TrafficCarQuatW[12] = 0.7076 TrafficCarRecording[12] = 23 TrafficCarStartime[12] = 58613.0000 TrafficCarModel[12] = asterope // heading towards the player, bunny hops over seats TrafficCarPos[13] = <<-487.5655, -744.9453, 32.6015>> TrafficCarQuatX[13] = -0.0937 TrafficCarQuatY[13] = 0.0450 TrafficCarQuatZ[13] = 0.8793 TrafficCarQuatW[13] = 0.4648 TrafficCarRecording[13] = 19 TrafficCarStartime[13] = 60459.3203 // 59006.3203 TrafficCarModel[13] = BMX TrafficCarPos[14] = <<-478.1905, -835.1024, 29.9746>> TrafficCarQuatX[14] = -0.0021 TrafficCarQuatY[14] = -0.0021 TrafficCarQuatZ[14] = 0.7008 TrafficCarQuatW[14] = 0.7134 TrafficCarRecording[14] = 18 TrafficCarStartime[14] = 64923.8516 TrafficCarModel[14] = serrano TrafficCarPos[15] = <<-430.6053, -816.6718, 36.8249>> TrafficCarQuatX[15] = -0.0001 TrafficCarQuatY[15] = 0.0048 TrafficCarQuatZ[15] = 0.9993 TrafficCarQuatW[15] = 0.0373 TrafficCarRecording[15] = 28 TrafficCarStartime[15] = 68551.0000 TrafficCarModel[15] = asterope TrafficCarPos[16] = <<-427.4086, -762.0120, 36.6573>> TrafficCarQuatX[16] = 0.0001 TrafficCarQuatY[16] = 0.0049 TrafficCarQuatZ[16] = 1.0000 TrafficCarQuatW[16] = 0.0047 TrafficCarRecording[16] = 30 TrafficCarStartime[16] = 70333.0000 TrafficCarModel[16] = sultan //target cuts across in front of this vehicle on carpark exit TrafficCarPos[17] = <<-476.9606, -664.9507, 31.9901>> TrafficCarQuatX[17] = -0.0030 TrafficCarQuatY[17] = -0.0083 TrafficCarQuatZ[17] = 0.7264 TrafficCarQuatW[17] = -0.6872 TrafficCarRecording[17] = 70 TrafficCarStartime[17] = 77000.0000 TrafficCarModel[17] = sultan //on carpark exit goes across front of target TrafficCarPos[18] = <<-436.3420, -650.5261, 30.4239>> TrafficCarQuatX[18] = 0.0056 TrafficCarQuatY[18] = 0.0224 TrafficCarQuatZ[18] = 0.7071 TrafficCarQuatW[18] = 0.7068 TrafficCarRecording[18] = 13 TrafficCarStartime[18] = 77590.0000 TrafficCarModel[18] = sultan //third vehicle to go across exit from carpark TrafficCarPos[19] = <<-420.9600, -656.3897, 30.5754>> TrafficCarQuatX[19] = 0.0112 TrafficCarQuatY[19] = 0.0112 TrafficCarQuatZ[19] = 0.7070 TrafficCarQuatW[19] = 0.7070 TrafficCarRecording[19] = 12 TrafficCarStartime[19] = 78000.0000 TrafficCarModel[19] = Packer TrafficCarPos[20] = <<-455.2408, -535.8500, 24.7102>> TrafficCarQuatX[20] = -0.0022 TrafficCarQuatY[20] = 0.0022 TrafficCarQuatZ[20] = -0.7070 TrafficCarQuatW[20] = 0.7072 TrafficCarRecording[20] = 31 TrafficCarStartime[20] = 80849.0000 TrafficCarModel[20] = sultan TrafficCarPos[21] = <<-421.8391, -535.8503, 24.7099>> TrafficCarQuatX[21] = -0.0024 TrafficCarQuatY[21] = 0.0024 TrafficCarQuatZ[21] = -0.7071 TrafficCarQuatW[21] = 0.7071 TrafficCarRecording[21] = 32 TrafficCarStartime[21] = 80849.0000 TrafficCarModel[21] = sultan TrafficCarPos[22] = <<-323.2696, -519.5041, 24.7690>> TrafficCarQuatX[22] = -0.0086 TrafficCarQuatY[22] = -0.0166 TrafficCarQuatZ[22] = -0.7001 TrafficCarQuatW[22] = 0.7138 TrafficCarRecording[22] = 34 TrafficCarStartime[22] = 85280.0000 TrafficCarModel[22] = asterope TrafficCarPos[23] = <<-384.7831, -496.5516, 24.8060>> TrafficCarQuatX[23] = -0.0022 TrafficCarQuatY[23] = -0.0022 TrafficCarQuatZ[23] = 0.7072 TrafficCarQuatW[23] = 0.7071 TrafficCarRecording[23] = 33 TrafficCarStartime[23] = 85722.0000 TrafficCarModel[23] = landstalker TrafficCarPos[24] = <<-299.8336, -519.6835, 24.8040>> TrafficCarQuatX[24] = -0.0071 TrafficCarQuatY[24] = -0.0166 TrafficCarQuatZ[24] = -0.7047 TrafficCarQuatW[24] = 0.7093 TrafficCarRecording[24] = 35 TrafficCarStartime[24] = 86195.0000 TrafficCarModel[24] = asterope // highway vehicle TrafficCarPos[25] = <<-296.6222, -496.0120, 24.8684>> TrafficCarQuatX[25] = -0.0026 TrafficCarQuatY[25] = -0.0022 TrafficCarQuatZ[25] = 0.7084 TrafficCarQuatW[25] = 0.7058 TrafficCarRecording[25] = 21 TrafficCarStartime[25] = 87170.8516 TrafficCarModel[25] = landstalker TrafficCarPos[26] = <<-242.5362, -502.0159, 25.6451>> TrafficCarQuatX[26] = -0.0096 TrafficCarQuatY[26] = -0.0094 TrafficCarQuatZ[26] = 0.7194 TrafficCarQuatW[26] = 0.6945 TrafficCarRecording[26] = 36 TrafficCarStartime[26] = 88537.0000 TrafficCarModel[26] = landstalker TrafficCarPos[27] = <<-234.2082, -530.1547, 25.9344>> TrafficCarQuatX[27] = -0.0058 TrafficCarQuatY[27] = 0.0064 TrafficCarQuatZ[27] = 0.7091 TrafficCarQuatW[27] = -0.7050 TrafficCarRecording[27] = 39 TrafficCarStartime[27] = 90066.0000 TrafficCarModel[27] = RapidGT TrafficCarPos[28] = <<-204.8521, -534.9627, 26.6094>> TrafficCarQuatX[28] = 0.0281 TrafficCarQuatY[28] = 0.0002 TrafficCarQuatZ[28] = -0.6936 TrafficCarQuatW[28] = 0.7198 TrafficCarRecording[28] = 37 TrafficCarStartime[28] = 91140.0000 TrafficCarModel[28] = asterope TrafficCarPos[29] = <<-186.2448, -518.6406, 27.3221>> TrafficCarQuatX[29] = -0.0061 TrafficCarQuatY[29] = -0.0197 TrafficCarQuatZ[29] = -0.7053 TrafficCarQuatW[29] = 0.7086 TrafficCarRecording[29] = 41 TrafficCarStartime[29] = 91890.0000 TrafficCarModel[29] = fq2 TrafficCarPos[30] = <<-181.6259, -523.8001, 27.2923>> TrafficCarQuatX[30] = 0.0116 TrafficCarQuatY[30] = -0.0124 TrafficCarQuatZ[30] = -0.7029 TrafficCarQuatW[30] = 0.7111 TrafficCarRecording[30] = 38 TrafficCarStartime[30] = 92230.0000 TrafficCarModel[30] = sultan // highway car TrafficCarPos[31] = <<-152.8287, -489.4706, 28.3269>> TrafficCarQuatX[31] = -0.0213 TrafficCarQuatY[31] = 0.0018 TrafficCarQuatZ[31] = 0.7254 TrafficCarQuatW[31] = 0.6880 TrafficCarRecording[31] = 24 TrafficCarStartime[31] = 92554.8516 TrafficCarModel[31] = landstalker TrafficCarPos[32] = <<-172.1277, -500.8638, 27.8326>> TrafficCarQuatX[32] = -0.0252 TrafficCarQuatY[32] = -0.0296 TrafficCarQuatZ[32] = 0.7083 TrafficCarQuatW[32] = 0.7048 TrafficCarRecording[32] = 40 TrafficCarStartime[32] = 94528.0000 TrafficCarModel[32] = fq2 //highway vehicle TrafficCarPos[33] = <<-114.8660, -500.2346, 29.8111>> TrafficCarQuatX[33] = -0.0104 TrafficCarQuatY[33] = -0.0098 TrafficCarQuatZ[33] = 0.7021 TrafficCarQuatW[33] = 0.7119 TrafficCarRecording[33] = 78 TrafficCarStartime[33] = 95865.4375 TrafficCarModel[33] = asterope TrafficCarPos[34] = <<-129.1858, -505.6940, 29.2420>> TrafficCarQuatX[34] = -0.0150 TrafficCarQuatY[34] = -0.0163 TrafficCarQuatZ[34] = 0.7139 TrafficCarQuatW[34] = 0.6999 TrafficCarRecording[34] = 42 TrafficCarStartime[34] = 95886.0000 TrafficCarModel[34] = asterope //highway TrafficCarPos[35] = <<-55.6079, -499.5939, 31.8493>> TrafficCarQuatX[35] = -0.0116 TrafficCarQuatY[35] = -0.0112 TrafficCarQuatZ[35] = 0.7134 TrafficCarQuatW[35] = 0.7006 TrafficCarRecording[35] = 25 TrafficCarStartime[35] = 96787.8516 TrafficCarModel[35] = landstalker TrafficCarPos[36] = <<-87.1120, -504.9880, 30.9077>> TrafficCarQuatX[36] = -0.0159 TrafficCarQuatY[36] = -0.0149 TrafficCarQuatZ[36] = 0.7118 TrafficCarQuatW[36] = 0.7020 TrafficCarRecording[36] = 43 TrafficCarStartime[36] = 97140.0000 TrafficCarModel[36] = fq2 TrafficCarPos[37] = <<26.5103, -499.3918, 34.2088>> TrafficCarQuatX[37] = -0.0005 TrafficCarQuatY[37] = -0.0002 TrafficCarQuatZ[37] = 0.7186 TrafficCarQuatW[37] = 0.6954 TrafficCarRecording[37] = 79 TrafficCarStartime[37] = 100001.3984 TrafficCarModel[37] = Packer /* drives up slip road ahead of target. commented out because he now slams the brakes on in front of the player TrafficCarPos[38] = <<39.6029, -533.6916, 33.5574>> TrafficCarQuatX[38] = -0.0111 TrafficCarQuatY[38] = 0.0144 TrafficCarQuatZ[38] = 0.7909 TrafficCarQuatW[38] = -0.6116 TrafficCarRecording[38] = 45 TrafficCarStartime[38] = 101958.0000 TrafficCarModel[38] = bati */ //more than likely needs a re-record as comet model has been removed from game! TrafficCarPos[39] = <<70.5888, -526.8503, 33.7031>> TrafficCarQuatX[39] = -0.0004 TrafficCarQuatY[39] = -0.0004 TrafficCarQuatZ[39] = -0.7039 TrafficCarQuatW[39] = 0.7103 TrafficCarRecording[39] = 46 TrafficCarStartime[39] = 102948.0000 TrafficCarModel[39] = ninef2 TrafficCarPos[40] = <<99.8609, -521.5526, 33.5624>> TrafficCarQuatX[40] = 0.0145 TrafficCarQuatY[40] = -0.0145 TrafficCarQuatZ[40] = 0.7070 TrafficCarQuatW[40] = -0.7069 TrafficCarRecording[40] = 47 TrafficCarStartime[40] = 104004.0000 TrafficCarModel[40] = landstalker TrafficCarPos[41] = <<196.1974, -526.9512, 33.5498>> TrafficCarQuatX[41] = 0.0178 TrafficCarQuatY[41] = -0.0178 TrafficCarQuatZ[41] = 0.7069 TrafficCarQuatW[41] = -0.7068 TrafficCarRecording[41] = 48 TrafficCarStartime[41] = 107502.0000 TrafficCarModel[41] = landstalker TrafficCarPos[42] = <<230.2825, -516.1511, 33.5591>> TrafficCarQuatX[42] = -0.0023 TrafficCarQuatY[42] = 0.0023 TrafficCarQuatZ[42] = -0.7071 TrafficCarQuatW[42] = 0.7071 TrafficCarRecording[42] = 49 TrafficCarStartime[42] = 108624.0000 TrafficCarModel[42] = landstalker /*// car on slip road next to hospital FLOATS!!! TrafficCarPos[43] = <<304.4125, -550.3855, 43.4028>> TrafficCarQuatX[43] = -0.0250 TrafficCarQuatY[43] = -0.0155 TrafficCarQuatZ[43] = 0.7199 TrafficCarQuatW[43] = -0.6934 TrafficCarRecording[43] = 26 TrafficCarStartime[43] = 110670.8516 TrafficCarModel[43] = asterope*/ TrafficCarPos[44] = <<301.1906, -521.5500, 33.4621>> TrafficCarQuatX[44] = 0.0001 TrafficCarQuatY[44] = -0.0001 TrafficCarQuatZ[44] = 0.7071 TrafficCarQuatW[44] = -0.7071 TrafficCarRecording[44] = 50 TrafficCarStartime[44] = 111198.0000 TrafficCarModel[44] = sultan // **** UBER RECORDED PARKED CARS **** //!!! Pos and quaternion will need update as vehicle model had to change, cogsport removed from the game !!! ParkedCarPos[0] = <<-1200.0914, -849.0596, 13.5431>> ParkedCarQuatX[0] = -0.0171 ParkedCarQuatY[0] = -0.0063 ParkedCarQuatZ[0] = 0.8800 ParkedCarQuatW[0] = 0.4747 ParkedCarModel[0] = feltzer2 //!!! Pos and quaternion will need update as vehicle model had to change, cogsport removed from the game !!! ParkedCarPos[1] = <<-1058.3451, -772.2757, 18.8924>> ParkedCarQuatX[1] = -0.0028 ParkedCarQuatY[1] = 0.0149 ParkedCarQuatZ[1] = 0.3553 ParkedCarQuatW[1] = 0.9346 ParkedCarModel[1] = feltzer2 //!!! Pos and quaternion will need update as vehicle model had to change, cogsport removed from the game !!! ParkedCarPos[2] = <<-1070.6639, -739.6081, 18.8482>> ParkedCarQuatX[2] = -0.0111 ParkedCarQuatY[2] = 0.0192 ParkedCarQuatZ[2] = 0.9254 ParkedCarQuatW[2] = 0.3784 ParkedCarModel[2] = feltzer2 ParkedCarPos[3] = <<-1121.0957, -880.1656, 7.6752>> ParkedCarQuatX[3] = 0.0021 ParkedCarQuatY[3] = -0.0011 ParkedCarQuatZ[3] = -0.4944 ParkedCarQuatW[3] = 0.8692 ParkedCarModel[3] = serrano ParkedCarPos[4] = <<-1115.6182, -807.3134, 16.6315>> ParkedCarQuatX[4] = -0.0414 ParkedCarQuatY[4] = -0.0257 ParkedCarQuatZ[4] = 0.8471 ParkedCarQuatW[4] = -0.5292 ParkedCarModel[4] = serrano ParkedCarPos[5] = <<-1112.4027, -774.3158, 18.3801>> ParkedCarQuatX[5] = -0.0097 ParkedCarQuatY[5] = -0.0319 ParkedCarQuatZ[5] = 0.5058 ParkedCarQuatW[5] = 0.8620 ParkedCarModel[5] = serrano //!!! Pos and quaternion will need update as vehicle model had to change, cogsport removed from the game !!! ParkedCarPos[6] = <<-1130.5292, -792.3233, 16.5972>> ParkedCarQuatX[6] = -0.0307 ParkedCarQuatY[6] = -0.0293 ParkedCarQuatZ[6] = 0.9133 ParkedCarQuatW[6] = 0.4051 ParkedCarModel[6] = feltzer2 ParkedCarPos[7] = <<-1045.3898, -778.9995, 18.3863>> ParkedCarQuatX[7] = 0.0118 ParkedCarQuatY[7] = 0.0370 ParkedCarQuatZ[7] = 0.5106 ParkedCarQuatW[7] = 0.8590 ParkedCarModel[7] = serrano ParkedCarPos[8] = <<-1034.8263, -739.7039, 18.8810>> ParkedCarQuatX[8] = 0.0195 ParkedCarQuatY[8] = 0.0190 ParkedCarQuatZ[8] = -0.4353 ParkedCarQuatW[8] = 0.8999 ParkedCarModel[8] = radi //!!! Pos and quaternion will need update as vehicle model had to change, cogsport removed from the game !!! ParkedCarPos[9] = <<-1033.9292, -712.6562, 19.4857>> ParkedCarQuatX[9] = -0.0193 ParkedCarQuatY[9] = -0.0194 ParkedCarQuatZ[9] = 0.9056 ParkedCarQuatW[9] = 0.4231 ParkedCarModel[9] = serrano ParkedCarPos[10] = <<-1005.5381, -715.5715, 20.3848>> ParkedCarQuatX[10] = -0.0440 ParkedCarQuatY[10] = -0.1329 ParkedCarQuatZ[10] = -0.3895 ParkedCarQuatW[10] = 0.9103 ParkedCarModel[10] = bati //!!! Pos and quaternion will need update as vehicle model had to change, cogsport removed from the game !!! ParkedCarPos[11] = <<-980.4462, -670.3936, 22.8034>> ParkedCarQuatX[11] = -0.0432 ParkedCarQuatY[11] = -0.0121 ParkedCarQuatZ[11] = 0.8701 ParkedCarQuatW[11] = 0.4908 ParkedCarModel[11] = washington ParkedCarPos[12] = <<-969.1606, -664.5714, 23.8870>> ParkedCarQuatX[12] = -0.0460 ParkedCarQuatY[12] = -0.0213 ParkedCarQuatZ[12] = 0.8534 ParkedCarQuatW[12] = 0.5187 ParkedCarModel[12] = RapidGT ParkedCarPos[13] = <<-928.2644, -652.7425, 26.6901>> ParkedCarQuatX[13] = -0.0303 ParkedCarQuatY[13] = -0.0054 ParkedCarQuatZ[13] = 0.7573 ParkedCarQuatW[13] = 0.6524 ParkedCarModel[13] = RapidGT //!!! Pos and quaternion will need update as vehicle model had to change, FELTZER2010 removed from the game !!! ParkedCarPos[14] = <<-916.6693, -650.6878, 27.0863>> ParkedCarQuatX[14] = -0.0240 ParkedCarQuatY[14] = 0.0101 ParkedCarQuatZ[14] = 0.7742 ParkedCarQuatW[14] = 0.6324 ParkedCarModel[14] = feltzer2 ParkedCarPos[15] = <<-790.8272, -667.5106, 28.4613>> ParkedCarQuatX[15] = -0.0369 ParkedCarQuatY[15] = -0.0050 ParkedCarQuatZ[15] = 0.7209 ParkedCarQuatW[15] = -0.6921 ParkedCarModel[15] = RapidGT //!!! Pos and quaternion will need update as vehicle model had to change, FELTZER2010 removed from the game !!! ParkedCarPos[16] = <<-790.0645, -647.0408, 28.4882>> ParkedCarQuatX[16] = -0.0370 ParkedCarQuatY[16] = 0.0003 ParkedCarQuatZ[16] = 0.7201 ParkedCarQuatW[16] = 0.6929 ParkedCarModel[16] = feltzer2 ParkedCarPos[17] = <<-716.8614, -667.7233, 29.6724>> ParkedCarQuatX[17] = -0.0267 ParkedCarQuatY[17] = -0.0106 ParkedCarQuatZ[17] = 0.7068 ParkedCarQuatW[17] = -0.7068 ParkedCarModel[17] = sultan ParkedCarPos[18] = <<-653.5672, -605.7774, 32.8442>> ParkedCarQuatX[18] = 0.0008 ParkedCarQuatY[18] = -0.0298 ParkedCarQuatZ[18] = 0.9991 ParkedCarQuatW[18] = 0.0310 ParkedCarModel[18] = radi ParkedCarPos[19] = <<-598.4409, -647.7642, 31.2207>> ParkedCarQuatX[19] = 0.0659 ParkedCarQuatY[19] = -0.1257 ParkedCarQuatZ[19] = 0.6417 ParkedCarQuatW[19] = 0.7537 ParkedCarModel[19] = bati //inside carpark ParkedCarPos[20] = <<-457.3376, -774.9608, 29.9679>> ParkedCarQuatX[20] = -0.0002 ParkedCarQuatY[20] = 0.0000 ParkedCarQuatZ[20] = 0.7033 ParkedCarQuatW[20] = 0.7109 ParkedCarModel[20] = sultan //car park exit from tunnel ParkedCarPos[21] = <<-506.0643, -614.7634, 29.6699>> ParkedCarQuatX[21] = -0.0131 ParkedCarQuatY[21] = -0.1302 ParkedCarQuatZ[21] = -0.0218 ParkedCarQuatW[21] = 0.9912 ParkedCarModel[21] = bati ParkedCarPos[22] = <<-487.6026, -614.8040, 30.5800>> ParkedCarQuatX[22] = 0.0002 ParkedCarQuatY[22] = 0.0000 ParkedCarQuatZ[22] = 0.9999 ParkedCarQuatW[22] = 0.0166 ParkedCarModel[22] = sultan //parked at junction before turn for tunnel ParkedCarPos[23] = <<-856.7647, -679.0630, 27.2491>> ParkedCarQuatX[23] = -0.0080 ParkedCarQuatY[23] = 0.0277 ParkedCarQuatZ[23] = 0.0148 ParkedCarQuatW[23] = 0.9995 ParkedCarModel[23] = sultan //on road approach to tunnel ParkedCarPos[24] = <<-750.8827, -607.8928, 29.5466>> ParkedCarQuatX[24] = 0.0609 ParkedCarQuatY[24] = 0.0021 ParkedCarQuatZ[24] = 0.9978 ParkedCarQuatW[24] = -0.0261 ParkedCarModel[24] = sultan //inside car park ParkedCarPos[25] = <<-477.1844, -757.5135, 30.1527>> ParkedCarQuatX[25] = -0.0022 ParkedCarQuatY[25] = -0.0021 ParkedCarQuatZ[25] = 0.7233 ParkedCarQuatW[25] = 0.6905 ParkedCarModel[25] = RapidGT //parked next to tunnel exit area ParkedCarPos[26] = <<-471.0100, -624.5500, 30.5800>> ParkedCarQuatX[26] = 0.0001 ParkedCarQuatY[26] = -0.0002 ParkedCarQuatZ[26] = -0.0144 ParkedCarQuatW[26] = 0.9999 ParkedCarModel[26] = sultan //underground tunnel carpark ParkedCarPos[27] = <<-679.3469, -593.3812, 24.7059>> ParkedCarQuatX[27] = -0.0011 ParkedCarQuatY[27] = 0.0004 ParkedCarQuatZ[27] = 0.6772 ParkedCarQuatW[27] = 0.7358 ParkedCarModel[27] = sultan //end area ParkedCarPos[28] = <<433.6576, -608.7065, 27.7732>> ParkedCarQuatX[28] = -0.0003 ParkedCarQuatY[28] = 0.0005 ParkedCarQuatZ[28] = 0.7774 ParkedCarQuatW[28] = -0.6290 ParkedCarModel[28] = sultan //end area ParkedCarPos[29] = <<416.3534, -638.7431, 27.8704>> ParkedCarQuatX[29] = 0.0891 ParkedCarQuatY[29] = -0.0957 ParkedCarQuatZ[29] = 0.7111 ParkedCarQuatW[29] = 0.6908 ParkedCarModel[29] = bati //end area ParkedCarPos[30] = <<433.9501, -603.2841, 27.8743>> ParkedCarQuatX[30] = 0.0794 ParkedCarQuatY[30] = -0.1039 ParkedCarQuatZ[30] = 0.6505 ParkedCarQuatW[30] = 0.7482 ParkedCarModel[30] = bati //Ambulance outside hospital entrance ParkedCarPos[31] = <<291.0103, -589.8865, 42.9593>> ParkedCarQuatX[31] = 0.0053 ParkedCarQuatY[31] = -0.0026 ParkedCarQuatZ[31] = 0.9489 ParkedCarQuatW[31] = 0.3156 ParkedCarModel[31] = AMBULANCE // **** UBER RECORDED SET PIECE CARS **** //!!! Pos and quaternion will need update as vehicle model had to change, FELTZER2010 removed from the game !!! /// !!! ALSO may need re-record if wheels dont sit on the ground now //may need to remain here as could drop out as traffic vehicle SetPieceCarPos[0] = <<-1104.2826, -775.1389, 18.8468>> SetPieceCarQuatX[0] = -0.0068 SetPieceCarQuatY[0] = -0.0121 SetPieceCarQuatZ[0] = 0.9186 SetPieceCarQuatW[0] = 0.3949 SetPieceCarRecording[0] = 52 SetPieceCarStartime[0] = 16000.0000 SetPieceCarRecordingSpeed[0] = 1.0000 SetPieceCarModel[0] = feltzer2 //set here in hope it starts playing SetPieceCarPos[1] = <<-1129.4855, -805.7412, 15.9592>> SetPieceCarQuatX[1] = 0.0303 SetPieceCarQuatY[1] = -0.0208 SetPieceCarQuatZ[1] = -0.3298 SetPieceCarQuatW[1] = 0.9433 SetPieceCarRecording[1] = 5 SetPieceCarStartime[1] = 16488.0000 SetPieceCarRecordingSpeed[1] = 1.0000 SetPieceCarModel[1] = washington //!!! Pos and quaternion will need update as vehicle model had to change, FELTZER2010 removed from the game !!! /// !!! ALSO may need re-record if wheels dont sit on the ground now //incidental vehicle can be converted back to traffic eventually SetPieceCarPos[2] = <<-998.2445, -692.8199, 21.5328>> SetPieceCarQuatX[2] = -0.0136 SetPieceCarQuatY[2] = -0.0158 SetPieceCarQuatZ[2] = 0.8929 SetPieceCarQuatW[2] = 0.4498 SetPieceCarRecording[2] = 53 SetPieceCarStartime[2] = 21412.0000 SetPieceCarRecordingSpeed[2] = 1.0000 SetPieceCarModel[2] = feltzer2 //!!! Pos and quaternion will need update as vehicle model had to change, FELTZER2010 removed from the game !!! /// !!! ALSO may need re-record if wheels dont sit on the ground now //vehicle swerves in front of target as he cuts across the wrong side of the road, in the lead up to the tunnel SetPieceCarPos[3] = <<-883.8546, -655.3506, 27.5493>> SetPieceCarQuatX[3] = 0.0032 SetPieceCarQuatY[3] = -0.0018 SetPieceCarQuatZ[3] = 0.7120 SetPieceCarQuatW[3] = 0.7021 SetPieceCarRecording[3] = 54 SetPieceCarStartime[3] = 25000.0000 SetPieceCarRecordingSpeed[3] = 1.0000 SetPieceCarModel[3] = feltzer2 //incidental vehicle can be made traffic eventually SetPieceCarPos[4] = <<-850.7409, -661.5627, 27.3668>> SetPieceCarQuatX[4] = -0.0015 SetPieceCarQuatY[4] = 0.0017 SetPieceCarQuatZ[4] = -0.6912 SetPieceCarQuatW[4] = 0.7227 SetPieceCarRecording[4] = 55 SetPieceCarStartime[4] = 28500.0000 SetPieceCarRecordingSpeed[4] = 1.0000 SetPieceCarModel[4] = serrano //vehicle swerves in front of target as he turns left to head for the tunnel SetPieceCarPos[5] = <<-721.2928, -652.8879, 29.8160>> SetPieceCarQuatX[5] = -0.0024 SetPieceCarQuatY[5] = -0.0102 SetPieceCarQuatZ[5] = 0.6908 SetPieceCarQuatW[5] = 0.7230 SetPieceCarRecording[5] = 56 SetPieceCarStartime[5] = 32500.0000 SetPieceCarRecordingSpeed[5] = 1.0000 SetPieceCarModel[5] = serrano // can be converted back to traffic SetPieceCarPos[6] = <<-724.7061, -648.6400, 29.7668>> SetPieceCarQuatX[6] = -0.0212 SetPieceCarQuatY[6] = 0.0050 SetPieceCarQuatZ[6] = 0.7061 SetPieceCarQuatW[6] = 0.7078 SetPieceCarRecording[6] = 57 SetPieceCarStartime[6] = 32750.0000 SetPieceCarRecordingSpeed[6] = 1.0000 SetPieceCarModel[6] = washington //vehicle driving along tunnel same direction as target SetPieceCarPos[7] = <<-688.4173, -579.6989, 24.8499>> SetPieceCarQuatX[7] = 0.0026 SetPieceCarQuatY[7] = -0.0029 SetPieceCarQuatZ[7] = 0.7397 SetPieceCarQuatW[7] = -0.6730 SetPieceCarRecording[7] = 58 SetPieceCarStartime[7] = 40273.0000 SetPieceCarRecordingSpeed[7] = 1.0000 SetPieceCarModel[7] = washington //vehicle down tunnel coming towards target SetPieceCarPos[8] = <<-563.1786, -579.4122, 25.3124>> SetPieceCarQuatX[8] = 0.0020 SetPieceCarQuatY[8] = 0.0021 SetPieceCarQuatZ[8] = 0.7032 SetPieceCarQuatW[8] = 0.7110 SetPieceCarRecording[8] = 59 SetPieceCarStartime[8] = 43500.0000 SetPieceCarRecordingSpeed[8] = 1.0000 SetPieceCarModel[8] = Trash //bmx rider who will eventually be performing bunny hops / tricks SetPieceCarPos[9] = <<-556.1506, -631.2017, 30.5620>> SetPieceCarQuatX[9] = -0.0352 SetPieceCarQuatY[9] = 0.0378 SetPieceCarQuatZ[9] = -0.6805 SetPieceCarQuatW[9] = 0.7309 SetPieceCarRecording[9] = 60 SetPieceCarStartime[9] = 51889.0000 SetPieceCarRecordingSpeed[9] = 1.0000 SetPieceCarModel[9] = BMX //vehicle screeches to a halt as target cuts across road on tunnel exit SetPieceCarPos[10] = <<-445.0543, -655.1606, 31.3466>> SetPieceCarQuatX[10] = 0.0076 SetPieceCarQuatY[10] = 0.0093 SetPieceCarQuatZ[10] = 0.7136 SetPieceCarQuatW[10] = 0.7005 SetPieceCarRecording[10] = 61 SetPieceCarStartime[10] = 56772.0000 SetPieceCarRecordingSpeed[10] = 1.0000 SetPieceCarModel[10] = sultan //second vehicle to swerve where target cuts across road from tunnel SetPieceCarPos[11] = <<-519.4122, -666.3391, 32.7365>> SetPieceCarQuatX[11] = 0.0105 SetPieceCarQuatY[11] = 0.0179 SetPieceCarQuatZ[11] = -0.6817 SetPieceCarQuatW[11] = 0.7313 SetPieceCarRecording[11] = 62 SetPieceCarStartime[11] = 57772.0000 SetPieceCarRecordingSpeed[11] = 1.0000 SetPieceCarModel[11] = washington //bmx kid jump down stairs SetPieceCarPos[12] = <<-491.8959, -716.5375, 32.5585>> SetPieceCarQuatX[12] = 0.1433 SetPieceCarQuatY[12] = 0.0787 SetPieceCarQuatZ[12] = 0.9609 SetPieceCarQuatW[12] = -0.2234 SetPieceCarRecording[12] = 63 SetPieceCarStartime[12] = 60800.00 // 60084.00 SetPieceCarRecordingSpeed[12] = 1.2000 SetPieceCarModel[12] = BMX SetPieceCarPos[13] = <<-492.3147, -827.8944, 29.9952>> SetPieceCarQuatX[13] = -0.0050 SetPieceCarQuatY[13] = 0.0046 SetPieceCarQuatZ[13] = 0.0169 SetPieceCarQuatW[13] = 0.9998 SetPieceCarRecording[13] = 64 SetPieceCarStartime[13] = 64030.0000 SetPieceCarRecordingSpeed[13] = 1.0000 SetPieceCarModel[13] = washington //to be converted to traffic car SetPieceCarPos[14] = <<-518.8372, -756.7956, 31.5421>> SetPieceCarQuatX[14] = -0.0147 SetPieceCarQuatY[14] = -0.0264 SetPieceCarQuatZ[14] = 0.9686 SetPieceCarQuatW[14] = -0.2467 SetPieceCarRecording[14] = 65 SetPieceCarStartime[14] = 64230.0000 SetPieceCarRecordingSpeed[14] = 1.0000 SetPieceCarModel[14] = washington //vehicle coming out carpark, blocking other entrance SetPieceCarPos[15] = <<-477.6166, -806.7344, 30.0523>> SetPieceCarQuatX[15] = 0.0000 SetPieceCarQuatY[15] = 0.0025 SetPieceCarQuatZ[15] = -0.7010 SetPieceCarQuatW[15] = 0.7132 SetPieceCarRecording[15] = 66 SetPieceCarStartime[15] = 66084.0000 SetPieceCarRecordingSpeed[15] = 1.0000 SetPieceCarModel[15] = washington //truck skiding as target cuts back into carpark SetPieceCarPos[16] = <<-417.4774, -836.1498, 31.4420>> SetPieceCarQuatX[16] = -0.0077 SetPieceCarQuatY[16] = -0.0047 SetPieceCarQuatZ[16] = 0.7025 SetPieceCarQuatW[16] = 0.7117 SetPieceCarRecording[16] = 67 SetPieceCarStartime[16] = 65384.0000 SetPieceCarRecordingSpeed[16] = 1.0000 SetPieceCarModel[16] = Benson //second vehicle to skid at carpark entrance SetPieceCarPos[17] = <<-413.1984, -831.7321, 30.8216>> SetPieceCarQuatX[17] = -0.0237 SetPieceCarQuatY[17] = 0.0144 SetPieceCarQuatZ[17] = 0.7088 SetPieceCarQuatW[17] = 0.7049 SetPieceCarRecording[17] = 68 SetPieceCarStartime[17] = 67078.0000 SetPieceCarRecordingSpeed[17] = 1.0000 SetPieceCarModel[17] = sultan //follows bus towards carpark turn SetPieceCarPos[18] = <<-528.5989, -840.7145, 29.4130>> SetPieceCarQuatX[18] = -0.0237 SetPieceCarQuatY[18] = 0.0236 SetPieceCarQuatZ[18] = 0.7098 SetPieceCarQuatW[18] = -0.7036 SetPieceCarRecording[18] = 69 SetPieceCarStartime[18] = 64606.3203 SetPieceCarRecordingSpeed[18] = 1.0000 SetPieceCarModel[18] = sultan //vehicle in the carpark with lights on SetPieceCarPos[19] = <<-446.0574, -767.6522, 29.9676>> SetPieceCarQuatX[19] = -0.0002 SetPieceCarQuatY[19] = 0.0001 SetPieceCarQuatZ[19] = 0.7110 SetPieceCarQuatW[19] = 0.7032 SetPieceCarRecording[19] = 51 SetPieceCarStartime[19] = 70071.8516 SetPieceCarRecordingSpeed[19] = 1.0000 SetPieceCarModel[19] = sultan //first car to react on the highway as target gets on SetPieceCarPos[20] = <<-488.5203, -523.8471, 24.8363>> SetPieceCarQuatX[20] = -0.0010 SetPieceCarQuatY[20] = 0.0015 SetPieceCarQuatZ[20] = 0.7208 SetPieceCarQuatW[20] = -0.6931 SetPieceCarRecording[20] = 71 SetPieceCarStartime[20] = 81355.8516 SetPieceCarRecordingSpeed[20] = 1.0000 SetPieceCarModel[20] = landstalker //landstalker on highway driving normally towards target (whilst on opposite side) SetPieceCarPos[21] = <<-305.7855, -508.7270, 24.7583>> SetPieceCarQuatX[21] = 0.0168 SetPieceCarQuatY[21] = -0.0137 SetPieceCarQuatZ[21] = 0.7019 SetPieceCarQuatW[21] = 0.7119 SetPieceCarRecording[21] = 72 SetPieceCarStartime[21] = 86290.8516 SetPieceCarRecordingSpeed[21] = 1.0000 SetPieceCarModel[21] = landstalker //Ambulance coming out hospital SetPieceCarPos[22] = <<294.6554, -576.5358, 42.9547>> SetPieceCarQuatX[22] = 0.0001 SetPieceCarQuatY[22] = 0.0078 SetPieceCarQuatZ[22] = 0.2262 SetPieceCarQuatW[22] = 0.9740 SetPieceCarRecording[22] = 73 SetPieceCarStartime[22] = 109000.0 //576.0000 SetPieceCarRecordingSpeed[22] = 1.0000 SetPieceCarModel[22] = AMBULANCE //truck target cuts in front of on highway SetPieceCarPos[23] = <<-393.8603, -503.4236, 25.4432>> SetPieceCarQuatX[23] = 0.0016 SetPieceCarQuatY[23] = 0.0018 SetPieceCarQuatZ[23] = 0.7075 SetPieceCarQuatW[23] = 0.7067 SetPieceCarRecording[23] = 74 SetPieceCarStartime[23] = 82431.8516 SetPieceCarRecordingSpeed[23] = 1.0000 SetPieceCarModel[23] = Packer //bus guides player to the left just before full turn back into car park SetPieceCarPos[24] = <<-527.6368, -846.5891, 29.9361>> SetPieceCarQuatX[24] = 0.0422 SetPieceCarQuatY[24] = -0.0031 SetPieceCarQuatZ[24] = -0.7009 SetPieceCarQuatW[24] = 0.7120 SetPieceCarRecording[24] = 75 SetPieceCarStartime[24] = 62500.0 //63000.0000 SetPieceCarRecordingSpeed[24] = 1.0000 SetPieceCarModel[24] = bus //car target swerves around back off when exiting highway onto slip road. SetPieceCarPos[25] = <<3.4457, -533.8352, 33.2443>> SetPieceCarQuatX[25] = 0.0232 SetPieceCarQuatY[25] = 0.0045 SetPieceCarQuatZ[25] = -0.6929 SetPieceCarQuatW[25] = 0.7206 SetPieceCarRecording[25] = 80 SetPieceCarStartime[25] = 100001.3984 SetPieceCarRecordingSpeed[25] = 1.0000 SetPieceCarModel[25] = asterope //moved here in hope it appears from traffic section SetPieceCarPos[26] = <<-483.5551, -531.6314, 24.8571>> SetPieceCarQuatX[26] = 0.0034 SetPieceCarQuatY[26] = -0.0031 SetPieceCarQuatZ[26] = -0.6972 SetPieceCarQuatW[26] = 0.7168 SetPieceCarRecording[26] = 76 SetPieceCarStartime[26] = 81217.4375 SetPieceCarRecordingSpeed[26] = 1.0000 SetPieceCarModel[26] = asterope //moved here in hope it appears from traffic section. Highway SetPieceCarPos[27] = <<-277.6243, -508.3559, 24.9767>> SetPieceCarQuatX[27] = 0.0108 SetPieceCarQuatY[27] = -0.0139 SetPieceCarQuatZ[27] = 0.7117 SetPieceCarQuatW[27] = 0.7023 SetPieceCarRecording[27] = 77 SetPieceCarStartime[27] = 87256.4375 SetPieceCarRecordingSpeed[27] = 1.0000 SetPieceCarModel[27] = asterope //first truck on highway where target reaches wrong side of the road SetPieceCarPos[28] = <<-201.7354, -496.1847, 27.3531>> SetPieceCarQuatX[28] = -0.0125 SetPieceCarQuatY[28] = -0.0117 SetPieceCarQuatZ[28] = 0.7296 SetPieceCarQuatW[28] = 0.6837 SetPieceCarRecording[28] = 82 SetPieceCarStartime[28] = 90798.3203 SetPieceCarRecordingSpeed[28] = 1.0000 SetPieceCarModel[28] = Packer //as target goes off the highway, swerves around him SetPieceCarPos[29] = <<-118.4835, -529.6654, 29.6739>> SetPieceCarQuatX[29] = 0.0116 SetPieceCarQuatY[29] = -0.0127 SetPieceCarQuatZ[29] = -0.6860 SetPieceCarQuatW[29] = 0.7274 SetPieceCarRecording[29] = 44 SetPieceCarStartime[29] = 94954.8594 SetPieceCarRecordingSpeed[29] = 1.0000 SetPieceCarModel[29] = landstalker // add extra time to recording start times for main car re record INT i = 0 INT iNumSetPieceVehicles = COUNT_OF(SetPieceCarID) INT iNumTrafficVehicles = COUNT_OF(TrafficCarID) REPEAT iNumSetPieceVehicles i IF SetPieceCarStartime[i] >= NIGEL2_UBER_PLAYBACK_TIME_STEP_POINT_01 SetPieceCarStartime[i] -= NIGEL2_UBER_TIME_STEP_01 //CPRINTLN(DEBUG_MISSION, "LOAD_UBER_DATA : updated for NIGEL2_UBER_TIME_STEP_01 - - SetPieceCarStartime[", i, "] = ", SetPieceCarStartime[i]) ENDIF IF SetPieceCarStartime[i] >= NIGEL2_UBER_PLAYBACK_TIME_STEP_POINT_02 SetPieceCarStartime[i] -= NIGEL2_UBER_TIME_STEP_02 //CPRINTLN(DEBUG_MISSION, "LOAD_UBER_DATA : updated for NIGEL2_UBER_TIME_STEP_02 - - SetPieceCarStartime[", i, "] = ", SetPieceCarStartime[i]) ENDIF ENDREPEAT i = 0 REPEAT iNumTrafficVehicles i IF TrafficCarStartime[i] >= NIGEL2_UBER_PLAYBACK_TIME_STEP_POINT_01 TrafficCarStartime[i] -= NIGEL2_UBER_TIME_STEP_01 //CPRINTLN(DEBUG_MISSION, "LOAD_UBER_DATA : updated for NIGEL2_UBER_TIME_STEP_01 - TrafficCarStartime[", i, "] = ", TrafficCarStartime[i]) ENDIF IF TrafficCarStartime[i] >= NIGEL2_UBER_PLAYBACK_TIME_STEP_POINT_02 TrafficCarStartime[i] -= NIGEL2_UBER_TIME_STEP_02 //CPRINTLN(DEBUG_MISSION, "LOAD_UBER_DATA : updated for NIGEL2_UBER_TIME_STEP_02 - - TrafficCarStartime[", i, "] = ", TrafficCarStartime[i]) ENDIF ENDREPEAT ENDPROC /// PURPOSE: /// remove object from the game /// PARAMS: /// objectIndex - object to remove /// bDelete - if true delete it, else set as no longer needed PROC SAFE_REMOVE_OBJECT(OBJECT_INDEX &objectIndex, BOOL bDelete = FALSE) IF bDelete SAFE_DELETE_OBJECT(objectIndex) ELSE SAFE_RELEASE_OBJECT(objectIndex) ENDIF ENDPROC /// PURPOSE: /// removes vehicle from the world /// PARAMS: /// vehIndex - vehicle to be removed /// bDelete - if true AND player isn't inside it delete it, else set as no longer needed PROC SAFE_REMOVE_VEHICLE(VEHICLE_INDEX &vehIndex, BOOL bDelete = FALSE) IF bDelete SAFE_DELETE_VEHICLE(vehIndex) ELSE SAFE_RELEASE_VEHICLE(vehIndex) ENDIF ENDPROC /// PURPOSE: /// removes ped from the game /// PARAMS: /// ped - ped to be removed /// bDelete - if true delete it, else set as no longer needed /// bDetach - if true ped will be detached if attached, and no in a vehicle or getting into a vehicle PROC SAFE_REMOVE_PED(PED_INDEX &ped, BOOL bDelete = FALSE) IF bDelete SAFE_DELETE_PED(ped) ELSE SAFE_RELEASE_PED(ped) ENDIF ENDPROC /// PURPOSE: /// teleport a ped to a new location /// PARAMS: /// pedIndex - ped to teleport /// vPosition - position to teleport to /// fHeading - heading to give the ped at the new location /// bSnapToGround - if true ped will be positioned at ground level, else drops in a meter above /// bForcePedAiAndAnimUpdate - if true FORCE_PED_AI_AND_ANIMATION_UPDATE is applied on the ped PROC SAFE_TELEPORT_PED(PED_INDEX pedIndex, VECTOR vPosition, FLOAT fHeading = 0.0, BOOL bSnapToGround = FALSE, BOOL bForcePedAiAndAnimUpdate = FALSE) IF IS_ENTITY_ALIVE(pedIndex) IF bSnapToGround vPosition.Z = INVALID_WORLD_Z ENDIF SET_ENTITY_COORDS(pedIndex, vPosition) SET_ENTITY_HEADING(pedIndex, fHeading) IF bForcePedAiAndAnimUpdate FORCE_PED_AI_AND_ANIMATION_UPDATE(pedIndex) ENDIF ENDIF ENDPROC /// PURPOSE: /// teleport a vehicle to a new location /// PARAMS: /// vehIndex - vehicle to teleport /// vPosition - position to teleport to /// fHeading - heading to give the vehicle at the new location /// bSnapToGround - if true ped will be positioned at ground level, else drops in a meter above PROC SAFE_TELEPORT_VEHICLE(VEHICLE_INDEX &vehIndex, VECTOR vPosition, FLOAT fHeading = 0.0, BOOL bSnapToGround = FALSE) IF IS_ENTITY_ALIVE(vehIndex) IF bSnapToGround vPosition.Z = INVALID_WORLD_Z ENDIF SET_ENTITY_COORDS(vehIndex, vPosition) SET_ENTITY_HEADING(vehIndex, fHeading) ENDIF ENDPROC /// PURPOSE: /// teleports a ped out of their vehicle. /// NOTE: proc waits until GET_SAFE_COORD_FOR_PED returns true /// PARAMS: /// pedIndex - ped to Teleport PROC SAFE_TELEPORT_PED_OUT_OF_THEIR_VEHICLE(PED_INDEX pedIndex) VECTOR vRespotCoords = << 0.0, 0.0, 0.0 >> FLOAT fRespotHeading = 0.0 IF IS_ENTITY_ALIVE(pedIndex) IF IS_PED_SITTING_IN_ANY_VEHICLE(pedIndex) vRespotCoords = GET_ENTITY_COORDS(pedIndex) WHILE NOT GET_SAFE_COORD_FOR_PED(vRespotCoords, FALSE, vRespotCoords) WAIT(0) vRespotCoords.x += 2.0 #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SAFE_TELEPORT_PED_OUT_OF_THEIR_VEHICLE - looking for safe coords") ENDIF #ENDIF ENDWHILE fRespotHeading = GET_ENTITY_HEADING(pedIndex) SAFE_TELEPORT_PED(pedIndex, vRespotCoords, fRespotHeading, TRUE, TRUE) ENDIF ENDIF ENDPROC /// PURPOSE: /// Checks ped and vehicle are ok before putting the ped in the vehicle /// If the seat is already occupied by a ped, it gets deleted. /// PARAMS: /// pedIndex - ped to put in the vehicle /// vehIndex - vehicle ped is going into /// seat - seat ped is to sit in PROC SAFE_PUT_PED_INTO_VEHICLE(PED_INDEX pedIndex, VEHICLE_INDEX &vehIndex, VEHICLE_SEAT seat = VS_DRIVER) IF IS_ENTITY_ALIVE(pedIndex) AND IS_VEHICLE_OK(vehIndex) IF IS_VEHICLE_SEAT_FREE(vehIndex, seat) SAFE_SET_PED_INTO_VEHICLE(pedIndex, vehIndex, seat) ELSE PED_INDEX pedTemp_AlreadyInSeat = GET_PED_IN_VEHICLE_SEAT(vehIndex, seat) //check the ped we want to put in the vehicle isn't already in the vehicle IF pedTemp_AlreadyInSeat != pedIndex IF IS_ENTITY_ALIVE(pedTemp_AlreadyInSeat) SAFE_TELEPORT_PED_OUT_OF_THEIR_VEHICLE(pedTemp_AlreadyInSeat) SAFE_PUT_PED_INTO_VEHICLE(pedIndex, vehIndex, seat) ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// check if iTimeAmount has passed since iTimer was set /// PARAMS: /// iTimer - the timer /// iTimeAmount - the amount of time to check has passed /// RETURNS: /// True is the specified amount of time has passed for the specified timer. FUNC BOOL HAS_TIME_PASSED(INT iTimer, INT iTimeAmount) RETURN (GET_GAME_TIMER() - iTimer) > iTimeAmount ENDFUNC /// PURPOSE: /// Test for if two coords are within fRange metres of each other /// PARAMS: /// v1 - first coord /// v2 - second coord /// fRange - distance /// RETURNS: /// TRUE if two coords are withing fRange of each other FUNC BOOL IS_COORD_IN_RANGE_OF_COORD(VECTOR v1, VECTOR v2, FLOAT fRange) RETURN VDIST2(v1, v2) <= (fRange*fRange) ENDFUNC /// PURPOSE: /// Checks if a specific conversation root is currently playing /// PARAMS: /// sConversationRoot - the conversation root to test /// bReturnTrueIfStringIsNull - checks against the issue where GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT can return "NULL" the first few frames after CREATE_CONVERSATION has returned true /// RETURNS: /// TRUE - if there is an ongoing or queued conversation with a root matching the passed in string or "NULL" if bReturnTrueIfNULL FUNC BOOL IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING(STRING sConversationRoot, BOOL bReturnTrueIfStringIsNull = TRUE) TEXT_LABEL_23 tlTempRoot IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() tlTempRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT() //if current root matches passed in string return true IF ARE_STRINGS_EQUAL(tlTempRoot, sConversationRoot) RETURN TRUE ENDIF IF bReturnTrueIfStringIsNull //if current root matches null, return true //because if the correct root isn't returned the first frame or so after CREATE_CONVERSATION has return true. IF ARE_STRINGS_EQUAL(tlTempRoot, "NULL") RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Attempts to start dialogue using CREATE_CONVERSATION, but first checks that no message is being displayed or that the subtitles are off in the profile settings /// PARAMS: /// YourPedStruct - the mission's conversation struct /// WhichBlockOfTextToLoad - Thr text block the convo lives in /// WhichRootLabel - The text root the convo lives in /// PassedConversationPriority - the priority level of the convo /// ShouldDisplaySubtitles - if subtitles should be displayed NOTE: if set to FALSE we don't check for a message being displayed /// ShouldAddToBriefScreen - if the convo should print to the brief screen /// cloneConversation - ? /// RETURNS: /// TRUE if the convo was created successfully FUNC BOOL NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(structPedsForConversation &YourPedStruct, STRING WhichBlockOfTextToLoad, STRING WhichRootLabel, enumConversationPriority PassedConversationPriority, enumSubtitlesState ShouldDisplaySubtitles = DISPLAY_SUBTITLES, enumBriefScreenState ShouldAddToBriefScreen = DO_ADD_TO_BRIEF_SCREEN, BOOL cloneConversation = FALSE) IF ShouldDisplaySubtitles = DISPLAY_SUBTITLES IF IS_MESSAGE_BEING_DISPLAYED() IF GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) <> 0 RETURN FALSE ENDIF ENDIF ENDIF IF CREATE_CONVERSATION(YourPedStruct, WhichBlockOfTextToLoad, WhichRootLabel, PassedConversationPriority, ShouldDisplaySubtitles, ShouldAddToBriefScreen, cloneConversation) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Attempts to start dialogue using CREATE_CONVERSATION, but first checks that no message is being displayed or that the subtitles are off in the profile settings /// PARAMS: /// YourPedStruct - the mission's conversation struct /// WhichBlockOfTextToLoad - Thr text block the convo lives in /// WhichRootLabel - The text root the convo lives in /// WhichSpecificLabel - Which line of dialogue to start from /// PassedConversationPriority - the priority level of the convo /// ShouldDisplaySubtitles - if subtitles should be displayed NOTE: if set to FALSE we don't check for a message being displayed /// ShouldAddToBriefScreen - if the convo should print to the brief screen /// RETURNS: /// TRUE if the convo was created successfully FUNC BOOL NIG2_CREATE_CONVERSATION_FROM_SPECIFIC_LINE_WITH_MESSAGE_DISPLAYED_CHECK(structPedsForConversation &YourPedStruct, STRING WhichBlockOfTextToLoad, STRING WhichRootLabel, STRING WhichSpecificLabel, enumConversationPriority PassedConversationPriority, enumSubtitlesState ShouldDisplaySubtitles = DISPLAY_SUBTITLES, enumBriefScreenState ShouldAddToBriefScreen = DO_ADD_TO_BRIEF_SCREEN) IF ShouldDisplaySubtitles = DISPLAY_SUBTITLES IF IS_MESSAGE_BEING_DISPLAYED() IF GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) <> 0 RETURN FALSE ENDIF ENDIF ENDIF IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(YourPedStruct, WhichBlockOfTextToLoad, WhichRootLabel, WhichSpecificLabel, PassedConversationPriority, ShouldDisplaySubtitles, ShouldAddToBriefScreen) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Attempts to start dialogue using PLAY_SINGLE_LINE_FROM_CONVERSATION, but first checks that no message is being displayed or that the subtitles are off in the profile settings /// PARAMS: /// YourPedStruct - the mission's conversation struct /// WhichBlockOfTextToLoad - Thr text block the convo lives in /// WhichRootLabel - The text root the convo lives in /// WhichSpecificLabel - the specific line we want to play /// PassedConversationPriority - the priority level of the convo /// ShouldDisplaySubtitles - if subtitles should be displayed NOTE: if set to FALSE we don't check for a message being displayed /// ShouldAddToBriefScreen - if the convo should print to the brief screen /// RETURNS: /// TRUE if the convo was created successfully FUNC BOOL NIG2_PLAY_SINGLE_LINE_FROM_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(structPedsForConversation &YourPedStruct, STRING WhichBlockOfTextToLoad, STRING WhichRootLabel, STRING WhichSpecificLabel, enumConversationPriority PassedConversationPriority, enumSubtitlesState ShouldDisplaySubtitles = DISPLAY_SUBTITLES, enumBriefScreenState ShouldAddToBriefScreen = DO_ADD_TO_BRIEF_SCREEN) IF ShouldDisplaySubtitles = DISPLAY_SUBTITLES IF IS_MESSAGE_BEING_DISPLAYED() IF GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) <> 0 RETURN FALSE ENDIF ENDIF ENDIF IF PLAY_SINGLE_LINE_FROM_CONVERSATION(YourPedStruct, WhichBlockOfTextToLoad, WhichRootLabel, WhichSpecificLabel, PassedConversationPriority, ShouldDisplaySubtitles, ShouldAddToBriefScreen) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// safely check if a ped is playing ambient speech /// PARAMS: /// pedIndex - to check /// RETURNS: /// TRUE if uninjured and playing ambient speech FUNC BOOL SAFE_IS_PED_PLAYING_AMBIENT_SPEECH(PED_INDEX &pedIndex) IF IS_PED_UNINJURED(pedIndex) IF IS_AMBIENT_SPEECH_PLAYING(pedIndex) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// trigger a music event, whilst first checking it has been prepared (if required) /// PARAMS: /// sMusicEvent - the music event name /// bRequiresPrepare - if TRUE PREPARE_MUSIC_EVENT is setup before the event can be trigger. Check the doc to see if an event needs preloading /// RETURNS: /// TRUE if the event is trigger successfully FUNC BOOL SAFE_TRIGGER_MISSION_MUSIC_EVENT(STRING sMusicEvent, BOOL bRequiresPrepare = FALSE) IF bRequiresPrepare IF NOT PREPARE_MUSIC_EVENT(sMusicEvent) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SAFE_TRIGGER_MISSION_MUSIC_EVENT - returning FALSE, not yet prepared for = ", sMusicEvent) ENDIF #ENDIF RETURN FALSE ENDIF ENDIF IF TRIGGER_MUSIC_EVENT(sMusicEvent) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SAFE_TRIGGER_MISSION_MUSIC_EVENT - returning TRUE for = ", sMusicEvent) ENDIF #ENDIF RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// check if Trevor is driving on the wrong side of the road /// NOTE: used to trigger dialogue /// RETURNS: /// TRUE if he is FUNC BOOL IS_TREVOR_DRIVING_ON_ROAD_WRONG_WAY() IF GET_IS_PLAYER_DRIVING_WRECKLESS(PLAYER_ID(), WT_DROVE_AGAINST_TRAFFIC) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// checks to see if vehIndex is in a settled upright position ready to stop for a cutscene /// NOTE: doesn't safe check vehIndex /// PARAMS: /// vehIndex - the vehicle to check /// RETURNS: /// TRUE if ready to rock FUNC BOOL IS_VEHICLE_SETTLED_FOR_CUTSCENE(VEHICLE_INDEX &vehIndex) IF IS_ENTITY_IN_AIR(vehIndex) // B*1370588 - abrupt stop - wait until landed now CPRINTLN(DEBUG_MISSION, " IS_VEHICLE_SETTLED_FOR_CUTSCENE : return FALSE : IS_ENTITY_IN_AIR check FC = ", GET_FRAME_COUNT()) RETURN FALSE ENDIF IF NOT IS_ENTITY_UPRIGHT(vehIndex, 5.0) CPRINTLN(DEBUG_MISSION, " IS_VEHICLE_SETTLED_FOR_CUTSCENE : return FALSE : IS_ENTITY_UPRIGHT check FC = ", GET_FRAME_COUNT()) RETURN FALSE ENDIF // if the vehicle is on all wheels are this point accept as ok IF IS_VEHICLE_ON_ALL_WHEELS(vehIndex) CPRINTLN(DEBUG_MISSION, " IS_VEHICLE_SETTLED_FOR_CUTSCENE : return TRUE : IS_VEHICLE_ON_ALL_WHEELS check FC = ", GET_FRAME_COUNT()) RETURN TRUE ENDIF VECTOR vRotVelocity vRotVelocity = GET_ENTITY_ROTATION_VELOCITY(vehIndex) //CPRINTLN(DEBUG_MISSION, " IS_VEHICLE_SETTLED_FOR_CUTSCENE : rvRotVelocity.X = ", vRotVelocity.X, " vRotVelocity.Y = ", vRotVelocity.Y, " FC = ", GET_FRAME_COUNT()) IF vRotVelocity.X > 0.2 OR vRotVelocity.X < -0.2 PRINTLN(DEBUG_MISSION, " IS_VEHICLE_SETTLED_FOR_CUTSCENE : return FALSE : vRotVelocity.X = ", vRotVelocity.X, " check FC = ", GET_FRAME_COUNT()) RETURN FALSE ENDIF IF vRotVelocity.Y > 0.2 OR vRotVelocity.Y < -0.2 PRINTLN(DEBUG_MISSION, " IS_VEHICLE_SETTLED_FOR_CUTSCENE : return FALSE : vRotVelocity.Y = ", vRotVelocity.Y, " check FC = ", GET_FRAME_COUNT()) RETURN FALSE ENDIF RETURN TRUE ENDFUNC /// PURPOSE: /// used to apply specific changes to certain vehicles in the uber recording PROC UPDATE_CHASE_VEHICLES_FROM_UBER_RECORDING() IF GET_GAME_TIMER() - iUpdateUberVehicleTweaksTimer > 50 //car target swerves around on way up hill IF IS_VEHICLE_OK(SetPieceCarID[3]) IF fCurrentPlaybackTime > 28750.0 AND fCurrentPlaybackTime < 29750.0 SET_VEHICLE_LIGHTS(SetPieceCarID[3], FORCE_VEHICLE_LIGHTS_ON) SET_VEHICLE_LIGHT_MULTIPLIER(SetPieceCarID[3], 2.0) IF NOT bDone_UberVehicleHorn[0] START_VEHICLE_HORN(SetPieceCarID[3], 3500, GET_HASH_KEY("HELDDOWN")) bDone_UberVehicleHorn[0] = TRUE ENDIF ELSE SET_VEHICLE_LIGHTS(SetPieceCarID[3], FORCE_VEHICLE_LIGHTS_OFF) SET_VEHICLE_LIGHT_MULTIPLIER(SetPieceCarID[3], 1.0) ENDIF ENDIF //car target turns in front off when heading to tunnel IF IS_VEHICLE_OK(SetPieceCarID[5]) IF fCurrentPlaybackTime > 34500.0 AND fCurrentPlaybackTime < 35500.0 SET_VEHICLE_LIGHTS(SetPieceCarID[5], FORCE_VEHICLE_LIGHTS_ON) SET_VEHICLE_LIGHT_MULTIPLIER(SetPieceCarID[5], 2.0) IF NOT bDone_UberVehicleHorn[1] START_VEHICLE_HORN(SetPieceCarID[5], 3000, GET_HASH_KEY("HELDDOWN")) bDone_UberVehicleHorn[1] = TRUE ENDIF ELSE SET_VEHICLE_LIGHTS(SetPieceCarID[5], FORCE_VEHICLE_LIGHTS_OFF) SET_VEHICLE_LIGHT_MULTIPLIER(SetPieceCarID[5], 1.0) ENDIF ENDIF //truck in the tunnel IF IS_VEHICLE_OK(SetPieceCarID[8]) //ensure garbage truck has acceptable ped model as driver IF NOT bDone_UpdateTrashTruckPedModel bDone_UpdateTrashTruckPedModel = OVERRIDE_VEHICLE_DRIVER_MODEL(SetPieceCarID[8], S_M_Y_GARBAGE) ENDIF IF fCurrentPlaybackTime > 46000.0 AND fCurrentPlaybackTime < 47000.0 SET_VEHICLE_LIGHTS(SetPieceCarID[8], FORCE_VEHICLE_LIGHTS_ON) SET_VEHICLE_LIGHT_MULTIPLIER(SetPieceCarID[8], 2.0) IF NOT bDone_UberVehicleHorn[2] START_VEHICLE_HORN(SetPieceCarID[8], 3500, GET_HASH_KEY("HELDDOWN")) bDone_UberVehicleHorn[2] = TRUE ENDIF ELIF fCurrentPlaybackTime > 47500.0 AND fCurrentPlaybackTime < 48500.0 SET_VEHICLE_LIGHTS(SetPieceCarID[8], FORCE_VEHICLE_LIGHTS_ON) SET_VEHICLE_LIGHT_MULTIPLIER(SetPieceCarID[8], 2.0) ELSE SET_VEHICLE_LIGHTS(SetPieceCarID[8], FORCE_VEHICLE_LIGHTS_OFF) SET_VEHICLE_LIGHT_MULTIPLIER(SetPieceCarID[8], 1.0) ENDIF ENDIF //bmx kids IF IS_VEHICLE_OK(SetPieceCarID[9]) //ensure bmx rider has acceptable ped model as driver IF NOT bDone_UpdateBMXPedModel bDone_UpdateBMXPedModel = OVERRIDE_VEHICLE_DRIVER_MODEL(SetPieceCarID[9], A_M_Y_Cyclist_01) ENDIF ENDIF //truck when doing u turn into carpark IF IS_VEHICLE_OK(SetPieceCarID[16]) IF fCurrentPlaybackTime > 69000.0 AND fCurrentPlaybackTime < 71000.0 SET_VEHICLE_LIGHTS(SetPieceCarID[16], FORCE_VEHICLE_LIGHTS_ON) SET_VEHICLE_LIGHT_MULTIPLIER(SetPieceCarID[16], 2.0) IF NOT bDone_UberVehicleHorn[3] START_VEHICLE_HORN(SetPieceCarID[16], 3500, GET_HASH_KEY("HELDDOWN")) bDone_UberVehicleHorn[3] = TRUE ENDIF ELSE SET_VEHICLE_LIGHTS(SetPieceCarID[16], FORCE_VEHICLE_LIGHTS_OFF) SET_VEHICLE_LIGHT_MULTIPLIER(SetPieceCarID[16], 1.0) ENDIF ENDIF //car handbrake turns on exit from carpark IF IS_VEHICLE_OK(TrafficCarID[17]) IF NOT bDone_UberVehicleHorn[4] IF fCurrentPlaybackTime > 78700.0 AND fCurrentPlaybackTime < 79300.0 START_VEHICLE_HORN(TrafficCarID[17], 3000, GET_HASH_KEY("HELDDOWN")) bDone_UberVehicleHorn[4] = TRUE ENDIF ENDIF ENDIF //Truck on exit from carpark IF IS_VEHICLE_OK(TrafficCarID[19]) IF NOT bDone_UberVehicleHorn[4] IF fCurrentPlaybackTime > 79950.0 AND fCurrentPlaybackTime < 82300.0 START_VEHICLE_HORN(TrafficCarID[19], 3000, GET_HASH_KEY("HELDDOWN")) bDone_UberVehicleHorn[4] = TRUE ENDIF ENDIF ENDIF //first car to react on the highway as target gets on IF IS_VEHICLE_OK(SetPieceCarID[20]) IF NOT bDone_UberVehicleHorn[5] IF fCurrentPlaybackTime > 84000.0 AND fCurrentPlaybackTime < 84750.0 START_VEHICLE_HORN(SetPieceCarID[20], 3000, GET_HASH_KEY("HELDDOWN")) bDone_UberVehicleHorn[5] = TRUE ENDIF ENDIF ENDIF //landstalker on highway driving normally towards target (whilst on opposite side) IF IS_VEHICLE_OK(SetPieceCarID[21]) IF fCurrentPlaybackTime > 88000.0 AND fCurrentPlaybackTime < 90502.0 SET_VEHICLE_LIGHTS(SetPieceCarID[21], FORCE_VEHICLE_LIGHTS_ON) SET_VEHICLE_LIGHT_MULTIPLIER(SetPieceCarID[21], 2.0) IF NOT bDone_UberVehicleHorn[6] START_VEHICLE_HORN(SetPieceCarID[21], 3500, GET_HASH_KEY("HELDDOWN")) bDone_UberVehicleHorn[6] = TRUE ENDIF ELSE SET_VEHICLE_LIGHTS(SetPieceCarID[21], FORCE_VEHICLE_LIGHTS_OFF) SET_VEHICLE_LIGHT_MULTIPLIER(SetPieceCarID[21], 1.0) ENDIF ENDIF //truck target cuts in front of on highway entrance IF IS_VEHICLE_OK(SetPieceCarID[23]) IF fCurrentPlaybackTime > 84800.0 AND fCurrentPlaybackTime < 87000.0 SET_VEHICLE_LIGHTS(SetPieceCarID[23], FORCE_VEHICLE_LIGHTS_ON) SET_VEHICLE_LIGHT_MULTIPLIER(SetPieceCarID[23], 2.0) IF NOT bDone_UberVehicleHorn[7] START_VEHICLE_HORN(SetPieceCarID[23], 3500, GET_HASH_KEY("HELDDOWN")) bDone_UberVehicleHorn[7] = TRUE ENDIF ELSE SET_VEHICLE_LIGHTS(SetPieceCarID[23], FORCE_VEHICLE_LIGHTS_OFF) SET_VEHICLE_LIGHT_MULTIPLIER(SetPieceCarID[23], 1.0) ENDIF ENDIF //vehicle where target reverts to correct side of highway IF IS_VEHICLE_OK(TrafficCarID[21]) IF NOT bDone_UberVehicleHorn[8] IF fCurrentPlaybackTime > 98800.0 AND fCurrentPlaybackTime < 99400.0 START_VEHICLE_HORN(TrafficCarID[21], 2000, GET_HASH_KEY("HELDDOWN")) bDone_UberVehicleHorn[8] = TRUE ENDIF ENDIF ENDIF //range rover on highway target swerves in front of IF IS_VEHICLE_OK(TrafficCarID[23]) IF fCurrentPlaybackTime > 91200.0 AND fCurrentPlaybackTime < 92200.0 SET_VEHICLE_LIGHTS(TrafficCarID[23], FORCE_VEHICLE_LIGHTS_ON) SET_VEHICLE_LIGHT_MULTIPLIER(TrafficCarID[23], 2.0) IF NOT bDone_UberVehicleHorn[9] START_VEHICLE_HORN(TrafficCarID[23], 2000, GET_HASH_KEY("HELDDOWN")) bDone_UberVehicleHorn[9] = TRUE ENDIF ELSE SET_VEHICLE_LIGHTS(TrafficCarID[23], FORCE_VEHICLE_LIGHTS_OFF) SET_VEHICLE_LIGHT_MULTIPLIER(TrafficCarID[23], 1.0) ENDIF ENDIF //first truck on highway where target reaches wrong side of the road IF IS_VEHICLE_OK(SetPieceCarID[28]) IF fCurrentPlaybackTime > 93500.0 AND fCurrentPlaybackTime < 95000.0 SET_VEHICLE_LIGHTS(SetPieceCarID[28], FORCE_VEHICLE_LIGHTS_ON) SET_VEHICLE_LIGHT_MULTIPLIER(SetPieceCarID[28], 2.0) IF NOT bDone_UberVehicleHorn[10] START_VEHICLE_HORN(SetPieceCarID[28], 3500, GET_HASH_KEY("HELDDOWN")) bDone_UberVehicleHorn[10] = TRUE ENDIF ELSE SET_VEHICLE_LIGHTS(SetPieceCarID[28], FORCE_VEHICLE_LIGHTS_OFF) SET_VEHICLE_LIGHT_MULTIPLIER(SetPieceCarID[28], 1.0) ENDIF ENDIF //range rover on highway target goes around when heading for slip road IF IS_VEHICLE_OK(SetPieceCarID[29]) IF NOT bDone_UberVehicleHorn[11] IF fCurrentPlaybackTime > 104500.0 AND fCurrentPlaybackTime < 105000.0 START_VEHICLE_HORN(SetPieceCarID[29], 2000, GET_HASH_KEY("HELDDOWN")) bDone_UberVehicleHorn[11] = TRUE ENDIF ENDIF ENDIF //open doors on ambulance and turn sirens on IF IS_VEHICLE_OK(ParkedCarID[31]) IF NOT IS_VEHICLE_DOOR_FULLY_OPEN(ParkedCarID[31], SC_DOOR_REAR_LEFT) SET_VEHICLE_DOOR_OPEN(ParkedCarID[31], SC_DOOR_REAR_LEFT) ENDIF IF NOT IS_VEHICLE_DOOR_FULLY_OPEN(ParkedCarID[31], SC_DOOR_REAR_RIGHT) SET_VEHICLE_DOOR_OPEN(ParkedCarID[31], SC_DOOR_REAR_RIGHT) ENDIF IF NOT IS_VEHICLE_SIREN_ON(ParkedCarID[31]) SET_VEHICLE_SIREN(ParkedCarID[31], TRUE) ENDIF ENDIF //ambulance sirens on coming out the hospital IF IS_VEHICLE_OK(SetPieceCarID[22]) IF NOT IS_VEHICLE_SIREN_ON(SetPieceCarID[22]) SET_VEHICLE_SIREN(SetPieceCarID[22], TRUE) ENDIF ENDIF //car inside the carpark, parked up set Lights on and fake engine revs IF IS_VEHICLE_OK(SetPieceCarID[19]) INT iVehicleLightState = -1 INT iVehicleBeamState = -1 GET_VEHICLE_LIGHTS_STATE(SetPieceCarID[19], iVehicleLightState, iVehicleBeamState) IF iVehicleLightState != 1 SET_VEHICLE_LIGHTS(SetPieceCarID[19], FORCE_VEHICLE_LIGHTS_ON) SET_VEHICLE_LIGHT_MULTIPLIER(SetPieceCarID[19], 2.0) ENDIF IF iSoundID_UberVehicleFakeRevs = -1 // not yet been assigned a sound_id IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[19]) iSoundID_UberVehicleFakeRevs = GET_SOUND_ID() PLAY_SOUND_FROM_ENTITY(iSoundID_UberVehicleFakeRevs, "FAKE_REVS_VEHICLE_02", SetPieceCarID[19], "NIGEL_02_SOUNDSET") #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_CHASE_VEHICLES_FROM_UBER_RECORDING - set fake rev for set piece car 19, FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ELSE IF NOT HAS_SOUND_FINISHED(iSoundID_UberVehicleFakeRevs) IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[19]) STOP_SOUND(iSoundID_UberVehicleFakeRevs) RELEASE_SOUND_ID(iSoundID_UberVehicleFakeRevs) iSoundID_UberVehicleFakeRevs = -1 // reset #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_CHASE_VEHICLES_FROM_UBER_RECORDING - cleaned up fake rev for set piece car 19, FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF iUpdateUberVehicleTweaksTimer = GET_GAME_TIMER() ENDIF ENDPROC /// PURPOSE: /// deals with requesting and removing the vehicle recordings /// used by ther set piece and traffic vehicles in the uber recording PROC PRELOAD_UBER_RECORDINGS_DURING_PLAYBACK() IF GET_GAME_TIMER() - iPreLoadRecordingsTimer > 3 INT i = 0 INT iNumSetPieceVehicles = COUNT_OF(SetPieceCarID) INT iNumTrafficVehicles = COUNT_OF(TrafficCarID) REPEAT iNumSetPieceVehicles i IF SetPieceCarRecording[i] > 0 IF (fCurrentPlaybackTime > (SetPieceCarStartime[i] - 5000.0)) REQUEST_VEHICLE_RECORDING(SetPieceCarRecording[i], sNigel2_UberRecordingName) ELIF (fCurrentPlaybackTime > (SetPieceCarStartime[i] + 3000.0)) IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[i]) REMOVE_VEHICLE_RECORDING(SetPieceCarRecording[i], sNigel2_UberRecordingName) ENDIF ENDIF ENDIF ENDREPEAT REPEAT iNumTrafficVehicles i IF TrafficCarRecording[i] > 0 IF (fCurrentPlaybackTime > (TrafficCarStartime[i] - 5000.0)) REQUEST_VEHICLE_RECORDING(TrafficCarRecording[i], sNigel2_UberRecordingName) ELIF (fCurrentPlaybackTime > (TrafficCarStartime[i] + 3000.0)) IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(TrafficCarID[i]) REMOVE_VEHICLE_RECORDING(TrafficCarRecording[i], sNigel2_UberRecordingName) ENDIF ENDIF ENDIF ENDREPEAT iPreLoadRecordingsTimer = GET_GAME_TIMER() ENDIF ENDPROC /// PURPOSE: /// removes all of the set piece and traiffic car recordingd which may be loaded PROC REMOVE_ALL_CAR_RECORDINGS_FOR_UBER_CHASE() INT iNumTrafficCars = COUNT_OF(TrafficCarID) INT iNumSetPieceCars = COUNT_OF(SetPieceCarID) INT i = 0 REPEAT iNumTrafficCars i IF TrafficCarRecording[i] > 0 REMOVE_VEHICLE_RECORDING(TrafficCarRecording[i], sNigel2_UberRecordingName) ENDIF ENDREPEAT i = 0 REPEAT iNumSetPieceCars i IF SetPieceCarRecording[i] > 0 REMOVE_VEHICLE_RECORDING(SetPieceCarRecording[i], sNigel2_UberRecordingName) ENDIF ENDREPEAT ENDPROC /// PURPOSE: /// all the common setup needed to initialise the uber playback /// PARAMS: /// bAllowUberInitToClearVehicles - if TRUE call to INITIALISE_UBER_PLAYBACK() will clear all ambient vehicles PROC SETUP_UBER_PLAYBACK(BOOL bAllowUberInitToClearVehicles = TRUE) //for uber playback INITIALISE_UBER_PLAYBACK(sNigel2_UberRecordingName, iMainCarRecID, bAllowUberInitToClearVehicles) LOAD_UBER_DATA() SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE) SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02) CREATE_ALL_WAITING_UBER_CARS() fUberPlaybackDensitySwitchOffRange = 250.0 // fail dist is 200 so this should be plenty switch_SetPieceCar_to_ai_on_collision = true SET_RELEASED_DRIVERS_TO_EXIT_VEHICLES_ON_FLEE(TRUE) // B* 1490105 - stop peds driving the uber cars interfering with uber chase because of reaction to player shooting allow_veh_to_stop_on_any_veh_impact = TRUE //bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE //might help with some traffic failing to spawn? //fPlaybackCarStreamingDistance = 160.0 // 120.0 // is default traffic_block_vehicle_colour(true, traffic_black) SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_DRIVING) CPRINTLN(DEBUG_MISSION, " SETUP_UBER_PLAYBACK - done : bAllowUberInitToClearVehicles = ", bAllowUberInitToClearVehicles, " : frame count :", GET_FRAME_COUNT()) ENDPROC /// PURPOSE: /// check if the specified position is inside the hospital using /// IS_COLLISION_MARKED_OUTSIDE check /// PARAMS: /// vPos - the position to test /// RETURNS: /// TRUE if the position is inside the music club interior FUNC BOOL IS_POSITION_INSIDE_HOSPITAL_INTERIOR(VECTOR vPos) // make sure the handle to the hospital is valid first IF NOT IS_VALID_INTERIOR(HospitalInteriorIndex) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " IS_POSITION_INSIDE_HOSPITAL_INTERIOR - return FALSE unable to test HospitalInteriorIndex ins't valid interior : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF RETURN FALSE ENDIF IF NOT IS_COLLISION_MARKED_OUTSIDE(vPos) INTERIOR_INSTANCE_INDEX interiorInstanceIndex = GET_INTERIOR_FROM_COLLISION(vPos) IF interiorInstanceIndex = HospitalInteriorIndex #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_POSITION_INSIDE_HOSPITAL_INTERIOR - return TRUE - for pos : ", vPos) ENDIF #ENDIF RETURN TRUE ELSE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_POSITION_INSIDE_HOSPITAL_INTERIOR - not hospital interior index! return FALSE - for pos : ", vPos) ENDIF #ENDIF ENDIF ELSE //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_POSITION_INSIDE_HOSPITAL_INTERIOR - collision marked outside at coords! return FALSE - for pos : ", vPos) ENDIF #ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Cycles through hospital room hash keys to see if parameter matches /// RETURNS: /// TRUE if specified iHashKeyToTest matches a hospital room's hash key FUNC BOOL IS_HASH_KEY_A_HOSPITAL_ROOM(INT iHashKeyToTest) IF (iHashKeyToTest = GET_HASH_KEY("v_40_Room1")) // entrance OR (iHashKeyToTest = GET_HASH_KEY("v_40_Room2")) // corridor between two broken walls OR (iHashKeyToTest = GET_HASH_KEY("v_40_Room3")) // ward (near broken wall) OR (iHashKeyToTest = GET_HASH_KEY("v_40_Room4")) // ward area (past final broken wall) OR (iHashKeyToTest = GET_HASH_KEY("V_40_Room005")) // entrance from shop to first broken wall RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// check if a ped is inside the hospital interior /// NOTE: if ped isn't alive results aren't completely accurate see bug 1008508 /// PARAMS: /// pedIndex - ped to test /// RETURNS: /// true if the ped is inside the hosptial interior and isn't injured /// RETURNS false if bDoDeathCheck was set TRUE and the ped was dead FUNC BOOL IS_PED_INSIDE_HOSPITAL_INTERIOR(PED_INDEX pedIndex) // make sure the handle to the hospital is valid first IF NOT IS_VALID_INTERIOR(HospitalInteriorIndex) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " IS_PED_INSIDE_HOSPITAL_INTERIOR - return FALSE unable to test HospitalInteriorIndex ins't valid interior : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF RETURN FALSE ENDIF IF IS_ENTITY_ALIVE(pedIndex) INT iHaskKey_PedCurrentRoom iHaskKey_PedCurrentRoom = GET_KEY_FOR_ENTITY_IN_ROOM(pedIndex) IF IS_HASH_KEY_A_HOSPITAL_ROOM(iHaskKey_PedCurrentRoom) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " IS_PED_INSIDE_HOSPITAL_INTERIOR - return TRUE with room check : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF RETURN TRUE ENDIF ELSE // check is returning inaccurate results, see bug 1008508 VECTOR vPos = GET_ENTITY_COORDS(pedIndex, FALSE) IF (GET_INTERIOR_AT_COORDS(vPos) = HospitalInteriorIndex) //unfortunately this check on its own can return true if stood outside interior closeby #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " IS_PED_INSIDE_HOSPITAL_INTERIOR - return TRUE basic check : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF RETURN TRUE ENDIF ENDIF //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " IS_PED_INSIDE_HOSPITAL_INTERIOR - return FALSE:", GET_FRAME_COUNT()) ENDIF #ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// check if a vehicle is inside the hospital interior /// PARAMS: /// vehicleIndex - vehicle to test /// RETURNS: /// true if the vehicle is inside the hospital interior FUNC BOOL IS_VEHICLE_INSIDE_HOSPITAL_INTERIOR(VEHICLE_INDEX vehicleIndex) // make sure the handle to the hospital is valid first IF NOT IS_VALID_INTERIOR(HospitalInteriorIndex) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " IS_VEHICLE_INSIDE_HOSPITAL_INTERIOR - return FALSE unable to test HospitalInteriorIndex ins't valid interior : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF RETURN FALSE ENDIF IF IS_VEHICLE_DRIVEABLE(vehicleIndex) VECTOR vPos = GET_ENTITY_COORDS(vehicleIndex) IF (GET_INTERIOR_AT_COORDS(vPos) = HospitalInteriorIndex) //unfortunately this check on its own can return true if stood outside interior closeby INT iHaskKey_VehicleCurrentRoom iHaskKey_VehicleCurrentRoom = GET_KEY_FOR_ENTITY_IN_ROOM(vehicleIndex) IF IS_HASH_KEY_A_HOSPITAL_ROOM(iHaskKey_VehicleCurrentRoom) RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Check the musician has seen the player attack a specific ped /// RETURNS: /// true if player has injured a ped inside the hospital FUNC BOOL HAS_PLAYER_INJURED_A_PED_INSIDE_THE_HOSPITAL() //IF HAS_PLAYER_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID()) // #IF IS_DEBUG_BUILD IF bDebug_PrintHospitalStatTrackInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_PLAYER_INJURED_A_PED_INSIDE_THE_HOSPITAL - HAS_PLAYER_DAMAGED_AT_LEAST_ONE_PED - true : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF INT i = 0 PED_INDEX mPed IF Has_Ped_Been_Killed() //#IF IS_DEBUG_BUILD IF bDebug_PrintHospitalStatTrackInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_PLAYER_INJURED_A_PED_INSIDE_THE_HOSPITAL - Has_Ped_Been_Killed - true : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF INT iNumPedKilledEvents = Get_Number_Of_Ped_Killed_Events() IF iNumPedKilledEvents <> 0 //#IF IS_DEBUG_BUILD IF bDebug_PrintHospitalStatTrackInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_PLAYER_INJURED_A_PED_INSIDE_THE_HOSPITAL - iNumPedKilledEvents =, ", iNumPedKilledEvents, " : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF BOOL bWasPedKilledInsideHopsital = FALSE i = 0 REPEAT iNumPedKilledEvents i mPed = GET_PED_INDEX_FROM_ENTITY_INDEX(Get_Index_Of_Killed_Ped(i)) IF DOES_ENTITY_EXIST(mPed) #IF IS_DEBUG_BUILD IF bDebug_PrintHospitalStatTrackInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_PLAYER_INJURED_A_PED_INSIDE_THE_HOSPITAL - step 0 :, Killed ped found Count = ", i, " : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF IF IS_POSITION_INSIDE_HOSPITAL_INTERIOR(GET_ENTITY_COORDS(mPed, FALSE)) //OR IS_PED_INSIDE_HOSPITAL_INTERIOR(mPed) //#IF IS_DEBUG_BUILD IF bDebug_PrintHospitalStatTrackInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_PLAYER_INJURED_A_PED_INSIDE_THE_HOSPITAL - step 1 : Killed ped is INSIDE the hospital interior Count = ", i, " : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(mPed, PLAYER_PED_ID()) //#IF IS_DEBUG_BUILD IF bDebug_PrintHospitalStatTrackInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_PLAYER_INJURED_A_PED_INSIDE_THE_HOSPITAL - step 2 : Killed ped has been DAMAGED by player Count = ", i, " : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF bWasPedKilledInsideHopsital = TRUE ENDIF ELSE //#IF IS_DEBUG_BUILD IF bDebug_PrintHospitalStatTrackInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_PLAYER_INJURED_A_PED_INSIDE_THE_HOSPITAL - step 1 : killed ped position is NOT inside the hospital interior Count = ", i, " : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDREPEAT IF bWasPedKilledInsideHopsital #IF IS_DEBUG_BUILD IF bDebug_PrintHospitalStatTrackInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_PLAYER_INJURED_A_PED_INSIDE_THE_HOSPITAL - step 3 : killed ", " returning TRUE : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF //CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID()) RETURN TRUE ENDIF ENDIF ENDIF IF Has_Ped_Been_Injured() //#IF IS_DEBUG_BUILD IF bDebug_PrintHospitalStatTrackInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_PLAYER_INJURED_A_PED_INSIDE_THE_HOSPITAL - Has_Ped_Been_Injured - true : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF INT iNumPedInjuredEvents = Get_Number_Of_Ped_Injured_Events() IF iNumPedInjuredEvents <> 0 //#IF IS_DEBUG_BUILD IF bDebug_PrintHospitalStatTrackInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_PLAYER_INJURED_A_PED_INSIDE_THE_HOSPITAL - iNumPedInjuredEvents =, ", iNumPedInjuredEvents, " : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF BOOL bWasPedInjuredInsideHopsital = FALSE i = 0 REPEAT iNumPedInjuredEvents i mPed = GET_PED_INDEX_FROM_ENTITY_INDEX(Get_Index_Of_Injured_Ped(i)) IF DOES_ENTITY_EXIST(mPed) #IF IS_DEBUG_BUILD IF bDebug_PrintHospitalStatTrackInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_PLAYER_INJURED_A_PED_INSIDE_THE_HOSPITAL - step 0 :, Injuredped found Count = ", i, " : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF IF IS_POSITION_INSIDE_HOSPITAL_INTERIOR(GET_ENTITY_COORDS(mPed, FALSE)) //OR IS_PED_INSIDE_HOSPITAL_INTERIOR(mPed) //#IF IS_DEBUG_BUILD IF bDebug_PrintHospitalStatTrackInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_PLAYER_INJURED_A_PED_INSIDE_THE_HOSPITAL - step 1 : Injuredped is INSIDE the hospital interior Count = ", i, " : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(mPed, PLAYER_PED_ID()) //#IF IS_DEBUG_BUILD IF bDebug_PrintHospitalStatTrackInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_PLAYER_INJURED_A_PED_INSIDE_THE_HOSPITAL - step 2 :, Injuredped has been DAMAGED by player Count = ", i, " : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF bWasPedInjuredInsideHopsital = TRUE ENDIF ELSE //#IF IS_DEBUG_BUILD IF bDebug_PrintHospitalStatTrackInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_PLAYER_INJURED_A_PED_INSIDE_THE_HOSPITAL - step 1 : Injured ped position is NOT inside the hospital interior Count = ", i, " : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDREPEAT IF bWasPedInjuredInsideHopsital #IF IS_DEBUG_BUILD IF bDebug_PrintHospitalStatTrackInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_PLAYER_INJURED_A_PED_INSIDE_THE_HOSPITAL - step 3 : injured ", " returning TRUE : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF //CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID()) RETURN TRUE ENDIF ENDIF ENDIF //IF HAS_PLAYER_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID()) // #IF IS_DEBUG_BUILD IF bDebug_PrintHospitalStatTrackInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_PLAYER_INJURED_A_PED_INSIDE_THE_HOSPITAL - HAS_PLAYER_DAMAGED_AT_LEAST_ONE_PED - true : frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF // CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID()) //ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// this proc tracks the mission stat - /// INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(NI2_HARM_IN_HOSPITAL_DRIVE_THROUGH) PROC NIG2_TRACK_STAT_HAS_PLAYER_INJURED_PED_WHILST_IN_HOSPITAL() IF NOT bStatTracker_HasPlayerInjuredPedWhilstInHospital // only test when the player gets close to the hosiptal IF IS_COORD_IN_RANGE_OF_COORD(vPlayerPos, << 307.3065, -589.9595, 42.3020 >>, 200.0) IF HAS_PLAYER_INJURED_A_PED_INSIDE_THE_HOSPITAL() INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(NI2_HARM_IN_HOSPITAL_DRIVE_THROUGH) bStatTracker_HasPlayerInjuredPedWhilstInHospital = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintHospitalStatTrackInfoToTTY CPRINTLN(DEBUG_MISSION, "NIG2_TRACK_STAT_HAS_PLAYER_INJURED_PED_WHILST_IN_HOSPITAL - INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(NI2_HARM_IN_HOSPITAL_DRIVE_THROUGH) ") ENDIF #ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// this proc tracks the mission stat - /// INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(NI2_GOT_TOO_FAR_AWAY_FROM_NAPOLI) PROC NIG2_TRACK_STAT_PLAYER_KEEPS_CLOSE_TO_TARGET() FLOAT fInRangeDist = 100.0 #IF IS_DEBUG_BUILD IF bDebug_OverrideStatTracker_PlayerCloseToTargetRange fInRangeDist = fDebug_StatTracker_PlayerCloseToTargetRange ENDIF IF bDebug_DisplayStatTrackerInfo_PlayerCloseToTarget IF IS_ENTITY_ALIVE(sTargetPed.ped) //SET_DEBUG_ACTIVE(TRUE) //SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE) VECTOR vDebugPos = GET_ENTITY_COORDS(sTargetPed.ped) DRAW_DEBUG_SPHERE(vDebugPos, fInRangeDist, 200, 100, 0, 150) ENDIF ENDIF #ENDIF //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "NIG2_TRACK_STAT_PLAYER_KEEPS_CLOSE_TO_TARGET - current dist = ", fCurrentChaseDistance, " : point in uber = ", fCurrentPlaybackTime) ENDIF #ENDIF IF bStatTracker_HasPlayerKeptCloseToDiNapoli IF fCurrentChaseDistance > fInRangeDist INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(NI2_GOT_TOO_FAR_AWAY_FROM_NAPOLI) bStatTracker_HasPlayerKeptCloseToDiNapoli = FALSE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "NIG2_TRACK_STAT_PLAYER_KEEPS_CLOSE_TO_TARGET - INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(NI2_GOT_TOO_FAR_AWAY_FROM_NAPOLI) range was = ", fCurrentChaseDistance) ENDIF #ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Rubberbands the chase speed of Trevor to Target's vehicle /// uses UPDATE_CURRENT_PLAYBACK_SPEED_WITH_SMOOTHING and CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR /// NOTE: having to override the standard uber recording behaviour a bit as the player needs to be able to get along side Miranda comfortably /// PARAMS: /// fCurrentChaseSpeed - the main chase speed which is to be updated /// fPlaybackTime - the main car's current playback time PROC UPDATE_UBER_CHASE_SPEED(FLOAT &fCurrentChaseSpeed, FLOAT fPlaybackTime) BOOL bUseNewRubberbandingSystem = TRUE IF bUseNewRubberbandingSystem IF IS_VEHICLE_OK(sNigelVehicle.vehicle) // new commands only take vehicles in parameter instead player ped, so need ot check Nigel's car for use // variables used by CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR FLOAT fDesiredPlaybackSpeed = fCurrentChaseSpeed // Stores the calculated speed. FLOAT fClosestDist = 9.0 // fClosestDist - The minimum distance the player should be behind the trigger. FLOAT fIdealDist = 20.0 // fIdealDist - The ideal distance you want the player to be behind the trigger. FLOAT fMaxDist = 36.0 // fMaxDist - The max distance the player should be behind the trigger. // point where the flashing blip kicks in for escaping FLOAT fLosingTriggerDist = (NIGEL2_TARGET_ESCAPED_DISTANCE / 100) * (NIGEL2_FLASH_CHASE_BLIP_PERCENTAGE * 100) // At this distance or greater extra slowdown will be applied if safe to do so. FLOAT fMaxDistInFront = 30.0 // If the player is ahead the speed is increased, the max speed is achieved at this distance. FLOAT fMinSpeedIfBehind = 0.7 // The minimum playback speed allowed if behind, values lower than 0.7 may be too noticeable. FLOAT fMinSpeedIfLosingTrigger = 0.45 // The minimum playback speed allowed if the player is really far behind (this value is only used if the trigger is not visible). FLOAT fMaxSpeedIfTooClose = 1.6 // The max speed allowed if the player gets too close. // variables used by UPDATE_CURRENT_PLAYBACK_SPEED_WITH_SMOOTHING FLOAT fAccel = 0.04 // fAccel - D = 0.01 - Modify this to increase/decrease the rate that the current speed changes to achieve the desired speed. Changing this can help if you see the trigger car noticeably speed off during a chase. //*** Rubberbanding tweaks during the chase based of the main car's playback progress - // start, heading past Trevor into the first turning (keep this slow to give the player plenty of time to get in the car. IF (fPlaybackTime > 0.0 AND fPlaybackTime < 6000.0) fClosestDist = 1.0 fIdealDist = 10.0 fMaxDist = 22.0 fMaxDistInFront = 45.0 fMaxSpeedIfTooClose = 1.0 fAccel = 0.02 // turn out of pedestrian area onto the main road again ELIF (fPlaybackTime > 12000.0 AND fPlaybackTime < 20000.0) fClosestDist = 10.5 // fClosestDist - The minimum distance the player should be behind the trigger. fIdealDist = 22.0 // fIdealDist - The ideal distance you want the player to be behind the trigger. fMaxDistInFront = 15.0 // If the player is ahead the speed is increased, the max speed is achieved at this distance. fAccel = 0.05 // fAccel - D = 0.01 - Modify this to increase/decrease the rate that the current speed changes to achieve the desired speed. Changing this can help if you see the trigger car noticeably speed off during a chase. // left turn of main road heading towards tunnel entrance turning ELIF (fPlaybackTime > 31000.0 AND fPlaybackTime < 35500.0) fClosestDist = 9.0 // fClosestDist - The minimum distance the player should be behind the trigger. fIdealDist = 20.0 // fIdealDist - The ideal distance you want the player to be behind the trigger. fMaxDistInFront = 20.0 // If the player is ahead the speed is increased, the max speed is achieved at this distance. fMaxSpeedIfTooClose = 1.8 // The max speed allowed if the player gets too close. //turn into underground tunnel ELIF (fPlaybackTime > 37000.0 AND fPlaybackTime < 42500.0) fClosestDist = 8.0 // fClosestDist - The minimum distance the player should be behind the trigger. fIdealDist = 21.0 // fIdealDist - The ideal distance you want the player to be behind the trigger. //turn out of the undeground section ELIF (fPlaybackTime > 54500.0 AND fPlaybackTime < 58000.0) fClosestDist = 8.0 // fClosestDist - The minimum distance the player should be behind the trigger. fIdealDist = 22.0 // fIdealDist - The ideal distance you want the player to be behind the trigger. // crossing road down pedestrian section. ELIF (fPlaybackTime > 58000.0 AND fPlaybackTime < 63500.0) fClosestDist = 15.0 // fClosestDist - The minimum distance the player should be behind the trigger. fIdealDist = 22.0 // fIdealDist - The ideal distance you want the player to be behind the trigger. fAccel = 0.35 // Modify this to increase/decrease the rate that the current speed changes to achieve the desired speed. Changing this can help if you see the trigger car noticeably speed off during a chase. // jump down the stairs to the turn into carpark ELIF (fPlaybackTime > 63500.0 AND fPlaybackTime < 72500.0) fClosestDist = 10.0 // fClosestDist - The minimum distance the player should be behind the trigger. fIdealDist = 20.0 // fIdealDist - The ideal distance you want the player to be behind the trigger. fMaxDist = 30.0 // fMaxDist - The max distance the player should be behind the trigger. // through the car park onto the highway ELIF (fPlaybackTime > 72500.0 AND fPlaybackTime < 81500.0) fMaxDist = 30.0 // fMaxDist - The max distance the player should be behind the trigger. // jump leading on to highway ELIF (fPlaybackTime > 81500.0 AND fPlaybackTime < 84000.0) fMaxDist = 25.0 // fMaxDist - The max distance the player should be behind the trigger. // highway - speed up if player is driving on wrong side of the highway. ELIF (fPlaybackTime > 88000.0 AND fPlaybackTime < 96500.0) fMaxDist = 30.0 // fMaxDist - The max distance the player should be behind the trigger. fMaxDistInFront = 20.0 // If the player is ahead the speed is increased, the max speed is achieved at this distance. //override settings if player is traveling up opposite side of highway to napoli IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-423.235077,-528.185303,22.334507>>, <<-234.671829,-527.774048,30.579157>>, 27.000000) fClosestDist = 20.0 // fClosestDist - The minimum distance the player should be behind the trigger. fIdealDist = 35.0 // fIdealDist - The ideal distance you want the player to be behind the trigger. fMaxDist = 60.0 // fMaxDist - The max distance the player should be behind the trigger. fMaxDistInFront = 15.0 // If the player is ahead the speed is increased, the max speed is achieved at this distance. #IF IS_DEBUG_BUILD IF bDebug_PrintMissionRubberbandInfoToTTY CPRINTLN(DEBUG_MISSION, "rubberbanding >>>> player on wrong side of freeway") ENDIF #ENDIF ENDIF // highway ELIF (fPlaybackTime > 96500.0 AND fPlaybackTime < 102500.0) fClosestDist = 15.0 // fClosestDist - The minimum distance the player should be behind the trigger. fIdealDist = 20.0 // fIdealDist - The ideal distance you want the player to be behind the trigger. fMaxDist = 25.0 // fMaxDist - The max distance the player should be behind the trigger. fMaxDistInFront = 20.0 // If the player is ahead the speed is increased, the max speed is achieved at this distance. fAccel = 0.35 // fAccel - D = 0.01 - Modify this to increase/decrease the rate that the current speed changes to achieve the desired speed. Changing this can help if you see the trigger car noticeably speed off during a chase. // skid leading off highway up sliproad ELIF (fPlaybackTime > 102500.0 AND fPlaybackTime < 107500.0) fClosestDist = 15.0 // fClosestDist - The minimum distance the player should be behind the trigger. fIdealDist = 25.0 // fIdealDist - The ideal distance you want the player to be behind the trigger. fMaxDist = 40.0 // fMaxDist - The max distance the player should be behind the trigger. // up the slip road ELIF (fPlaybackTime > 107500.0 AND fPlaybackTime < 110500.0) fClosestDist = 17.0 // fClosestDist - The minimum distance the player should be behind the trigger. fIdealDist = 30.0 // fIdealDist - The ideal distance you want the player to be behind the trigger. fMaxDist = 50.0 // fMaxDist - The max distance the player should be behind the trigger. fMaxSpeedIfTooClose = 1.9 // The max speed allowed if the player gets too close. // run up to the hospital ELIF (fPlaybackTime > 110500.0 AND fPlaybackTime < 114000.0) fClosestDist = 20.0 // fClosestDist - The minimum distance the player should be behind the trigger. fIdealDist = 35.0 // fIdealDist - The ideal distance you want the player to be behind the trigger. fMaxDist = 55.0 // fMaxDist - The max distance the player should be behind the trigger. fMaxSpeedIfTooClose = 1.9 // The max speed allowed if the player gets too close. // inside hospital up till wall smashes ELIF (fPlaybackTime > 114500.0 AND fPlaybackTime < 118000.0) fClosestDist = 22.0 // fClosestDist - The minimum distance the player should be behind the trigger. fIdealDist = 37.0 // fIdealDist - The ideal distance you want the player to be behind the trigger. fMaxDist = 60.0 // fMaxDist - The max distance the player should be behind the trigger. fMaxSpeedIfTooClose = 2.0 // The max speed allowed if the player gets too close. // inside hospital after wall smashes ELIF (fPlaybackTime > 118000.0) fClosestDist = 27.0 // fClosestDist - The minimum distance the player should be behind the trigger. fIdealDist = 45.0 // fIdealDist - The ideal distance you want the player to be behind the trigger. fMaxDist = 70.0 // fMaxDist - The max distance the player should be behind the trigger. fMaxSpeedIfTooClose = 2.0 // The max speed allowed if the player gets too close.*/ ENDIF CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, sNigelVehicle.vehicle, sTargetVehicle.vehicle, fClosestDist, // fClosestDist - The minimum distance the player should be behind the trigger. fIdealDist, // fIdealDist - The ideal distance you want the player to be behind the trigger. fMaxDist, // fMaxDist - The max distance the player should be behind the trigger. fLosingTriggerDist, // fLosingTriggerDist - At this distance or greater extra slowdown will be applied if safe to do so. fMaxDistInFront, // fMaxDistInFront D = 30.0 - If the player is ahead the speed is increased, the max speed is achieved at this distance. NIGEL2_DEFAULT_UBER_PLAYBACK_SPEED, // fDefaultPlaybackSpeed D = 1.0 - The default playback speed: when at the ideal distance the chase will run around this speed. fMinSpeedIfBehind, // fMinSpeedIfBehind D = 0.7 - The minimum playback speed allowed if behind, values lower than 0.7 may be too noticeable. fMinSpeedIfLosingTrigger, // fMinSpeedIfLosingTrigger D = 0.5 - The minimum playback speed allowed if the player is really far behind (this value is only used if the trigger is not visible). fMaxSpeedIfTooClose, // fMaxSpeedIfTooClose D = 2.0 - The max speed allowed if the player gets too close. TRUE) // bApplySlowdownToPlayer - If TRUE slowdown will be applied to the player based on playback speed (using MODIFY_VEHICLE_TOP_SPEED). //0.0, // fMaxPlayerSlowdownPercent D = 0.0 - The maximum percentage of top speed that can be removed from the player. //15.0, // fMaxPlayerSlowdownPercent D = 15.0 - The maximum percentage of top speed that can be removed from the player. //TRUE) // bAccountForSpecialAbility - If TRUE then extra adjustments are made when Franklin's special ability is active. //override playback speed for section driving through the hospital IF (fPlaybackTime > 114500.0) //override if player goes around hospital on highway sliproad IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<290.124298,-545.218384,38.397015>>, <<448.905365,-554.200134,48.652863>>, 19.250000) fDesiredPlaybackSpeed = 1.2 #IF IS_DEBUG_BUILD IF bDebug_PrintMissionRubberbandInfoToTTY CPRINTLN(DEBUG_MISSION, "rubberbanding >>>> override player watching crash from highway") ENDIF #ENDIF ELSE //only use fast speed whilst hidden in the interior, return to a normal speed for jump IF (fPlaybackTime < 120000.0) // 118000.0) fDesiredPlaybackSpeed = 2.2 fAccel = 1.0 #IF IS_DEBUG_BUILD IF bDebug_PrintMissionRubberbandInfoToTTY CPRINTLN(DEBUG_MISSION, "rubberbanding >>>> override target trigving through the interor, fCurrentChaseSpeed = ", fCurrentChaseSpeed) ENDIF #ENDIF ENDIF ENDIF ENDIF UPDATE_CURRENT_PLAYBACK_SPEED_WITH_SMOOTHING(fCurrentChaseSpeed, fDesiredPlaybackSpeed, fAccel) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionRubberbandInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_UBER_CHASE_SPEED - New System - fPlaybackTime = ", fPlaybackTime, " fAccel = ", fAccel, " fDesiredPlaybackSpeed = ", fDesiredPlaybackSpeed, " returning playback speed is = ", fCurrentChaseSpeed, " frame count = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ELSE // original rubberbanding setup - to be removed once the new system has been bedded in FLOAT fDesiredPlaybackSpeed = fCurrentChaseSpeed // Stores the calculated speed. FLOAT fMinDist_Local = 6.0 FLOAT fIdealDist_Local = 18.0 FLOAT fSlowDownDist_Local = 35.0 FLOAT fMaxPlaybackSpeedMultiplier_Local = 1.5 //tweak values depending where the target is in the chase IF (fPlaybackTime > 37000.0 AND fPlaybackTime < 42500.0)//turn into underground tunnel fMinDist_Local = 8.0 fIdealDist_Local = 22.0 fMaxPlaybackSpeedMultiplier_Local = 1.6 ELIF (fPlaybackTime > 54500.0 AND fPlaybackTime < 58000.0)//turn out of the undeground section fMinDist_Local = 8.0 fIdealDist_Local = 20.0 fMaxPlaybackSpeedMultiplier_Local = 1.6 ELIF (fPlaybackTime > 58000.0 AND fPlaybackTime < 63500.0) // crossing road down pedestrian section. fIdealDist_Local = 15.0 fSlowDownDist_Local = 22.0 ELIF (fPlaybackTime > 63500.0 AND fPlaybackTime < 72500.0)//jump down the stairs to the turn into carpark fMinDist_Local = 10.0 fIdealDist_Local = 20.0 fSlowDownDist_Local = 30.0 fMaxPlaybackSpeedMultiplier_Local = 1.6 ELIF (fPlaybackTime > 72500.0 AND fPlaybackTime < 81500.0)//through the car park onto the highway fSlowDownDist_Local = 30.0 fMaxPlaybackSpeedMultiplier_Local = 1.6 ELIF (fPlaybackTime > 81500.0 AND fPlaybackTime < 84000.0) //jump leading on to highway fSlowDownDist_Local = 25 //20 fMaxPlaybackSpeedMultiplier_Local = 1.6 ELIF (fPlaybackTime > 88000.0 AND fPlaybackTime < 96500.0)// highway - speed up if player is driving on wrong side of the highway. fSlowDownDist_Local = 20.0 fMaxPlaybackSpeedMultiplier_Local = 1.6 //override settings if player is traveling up opposite side of highway to napoli IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-423.235077,-528.185303,22.334507>>, <<-234.671829,-527.774048,30.579157>>, 27.000000) fMinDist_Local = 12.0 fIdealDist_Local = 30.0 fSlowDownDist_Local = 45.0 fMaxPlaybackSpeedMultiplier_Local = 1.6 //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "rubberbanding >>>> player on wrong side of freeway") ENDIF #ENDIF ENDIF ELIF (fPlaybackTime > 96500.0 AND fPlaybackTime < 102500.0)// highway fSlowDownDist_Local = 20 fMaxPlaybackSpeedMultiplier_Local = 1.6 ELIF (fPlaybackTime > 102500.0 AND fPlaybackTime < 107500.0)//skid leading off highway up sliproad fMinDist_Local = 12.0 fIdealDist_Local = 25.0 fSlowDownDist_Local = 40.0 fMaxPlaybackSpeedMultiplier_Local = 1.6 ELIF (fPlaybackTime > 107500.0 AND fPlaybackTime < 110500.0)//up the slip road fMinDist_Local = 14.0 fIdealDist_Local = 30.0 fSlowDownDist_Local = 50.0 fMaxPlaybackSpeedMultiplier_Local = 1.6 ELIF (fPlaybackTime > 110500.0 AND fPlaybackTime < 114000.0) //run up to the hospital fMinDist_Local = 20.0 fIdealDist_Local = 35.0 fSlowDownDist_Local = 55.0 fMaxPlaybackSpeedMultiplier_Local = 1.9 ELIF (fPlaybackTime > 114500.0 AND fPlaybackTime < 118000.0) // inside hospital up till wall smashes fMinDist_Local = 40.0 fIdealDist_Local = 50.0 fSlowDownDist_Local = 70.0 fMaxPlaybackSpeedMultiplier_Local = 3.0 //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " RUBBBBBBER BANNNNNDDDDING IN HOSPITAL xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx") ENDIF #ENDIF ELIF (fPlaybackTime > 118000.0) // inside hospital after wall smashes fMinDist_Local = 20.0 fIdealDist_Local = 35.0 fSlowDownDist_Local = 65.0 fMaxPlaybackSpeedMultiplier_Local = 2.0 ENDIF CALCULATE_NEW_PLAYBACK_SPEED_FROM_CHAR(sTargetVehicle.vehicle, PLAYER_PED_ID(), fDesiredPlaybackSpeed, 1, fMinDist_Local, fIdealDist_Local, fSlowDownDist_Local, fMaxPlaybackSpeedMultiplier_Local) IF (fPlaybackTime > 114500.0 AND fPlaybackTime < 118000.0) //override playback speed for section driving through the hospital fDesiredPlaybackSpeed = 2.2 ENDIF IF (fPlaybackTime > 114500.0) //override if player goes around hospital on highway sliproad IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<290.124298,-545.218384,38.397015>>, <<448.905365,-554.200134,48.652863>>, 19.250000) fDesiredPlaybackSpeed = 1.2 ENDIF ENDIF fCurrentChaseSpeed = fDesiredPlaybackSpeed #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_UBER_CHASE_SPEED - OLD SYSTEM - returning playback speed is - ", fCurrentChaseSpeed) ENDIF #ENDIF ENDIF ENDPROC /// PURPOSE: /// handles creation, updating and removal of scripted peds that feature on the chase route /// PARAMS: /// vPlayerCurrentPos - player's current position to perform checks with PROC MANAGE_PEDESTRIANS_ON_CHASE_ROUTE(VECTOR vPlayerCurrentPos) BOOL bCreatedPedThisFrame = FALSE MODEL_NAMES mnTempPedModel VECTOR vTempSpawnPos FLOAT fTempSpawnHeading INT iAIUpdateDelay = 250 INT i SEQUENCE_INDEX sSeqIndex #IF IS_DEBUG_BUILD TEXT_LABEL tDebugName #ENDIF IF IS_ENTITY_ALIVE(sTargetPed.ped) //peds around the start of the car chase, busy shopping streets FOR i = 0 TO (TOTAL_START_AREA_PEDS - 1) // create the peds (limit to one ped create per frame to help framerate IF sStartAreaPedSimple[i].eState = SPS_INIT IF NOT bCreatedPedThisFrame IF (fCurrentPlaybackTime >= NIGEL2_START_AREA_PEDS_TRIGGER_TIME) SWITCH i CASE 0 mnTempPedModel = mnDefaultPedForVehicle vTempSpawnPos = << -1262.53, -731.25, 21.88 >> fTempSpawnHeading = 47.38 BREAK CASE 1 mnTempPedModel = mnFemaleStartArea vTempSpawnPos = << -1300.17, -704.10, 24.61 >> fTempSpawnHeading = -87.53 BREAK CASE 2 mnTempPedModel = mnFemaleStartArea vTempSpawnPos = << -1298.33, -704.16, 24.53 >> fTempSpawnHeading = 83.96 BREAK CASE 3 mnTempPedModel = mnFemaleStartArea vTempSpawnPos = << -1209.92, -817.51, 15.62 >> fTempSpawnHeading = 15.06 BREAK ENDSWITCH REQUEST_MODEL(mnTempPedModel) IF HAS_MODEL_LOADED(mnTempPedModel) sStartAreaPedSimple[i].ped = CREATE_PED(PEDTYPE_MISSION, mnTempPedModel, vTempSpawnPos, fTempSpawnHeading) IF IS_PED_UNINJURED(sStartAreaPedSimple[i].ped) sStartAreaPedSimple[i].eState = SPS_BEGIN_ROUTINE SET_PED_RANDOM_COMPONENT_VARIATION(sStartAreaPedSimple[i].ped) SET_PED_KEEP_TASK(sStartAreaPedSimple[i].ped, TRUE) #IF IS_DEBUG_BUILD tDebugName = "StartAreaPed: " tDebugName += i SET_PED_NAME_DEBUG(sStartAreaPedSimple[i].ped, tDebugName) #ENDIF ENDIF IF i != 0 // 0 don't bin off the standard ped model used in the uber chase SET_MODEL_AS_NO_LONGER_NEEDED(mnTempPedModel) ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "StartArea PEDS CREATED index = ", i, " fc = ", GET_FRAME_COUNT()) ENDIF #ENDIF bCreatedPedThisFrame = TRUE ENDIF ENDIF ENDIF ELSE // don't update their AI every frame IF GET_GAME_TIMER() - iTriggerScriptedPedestriansTimer > iAIUpdateDelay IF IS_PED_UNINJURED(sStartAreaPedSimple[i].ped) SWITCH sStartAreaPedSimple[i].eState CASE SPS_BEGIN_ROUTINE IF IS_ENTITY_IN_RANGE_ENTITY(sTargetPed.ped, sStartAreaPedSimple[i].ped, 150.0) IF i = 0 OR i = 3 TASK_USE_MOBILE_PHONE(sStartAreaPedSimple[i].ped, TRUE) SET_PED_KEEP_TASK(sStartAreaPedSimple[i].ped, FALSE) sStartAreaPedSimple[i].eState = SPS_REACT_TO_TARGET #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Start Area Peds Begin Routine - ", i) ENDIF #ENDIF ELSE // these guys have to wait for each other to spawn IF i = 1 IF IS_PED_UNINJURED(sStartAreaPedSimple[i+1].ped) TASK_CHAT_TO_PED(sStartAreaPedSimple[i].ped, sStartAreaPedSimple[i+1].ped, CF_IS_INITIATOR | CF_AUTO_CHAT, <<0.0, 0.0, 0.0>>, 0.0, 0.0) SET_PED_KEEP_TASK(sStartAreaPedSimple[i].ped, FALSE) sStartAreaPedSimple[i].eState = SPS_REACT_TO_TARGET #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Start Area Peds Begin Routine - ", i) ENDIF #ENDIF ENDIF ELIF i = 2 IF IS_PED_UNINJURED(sStartAreaPedSimple[i-1].ped) TASK_CHAT_TO_PED(sStartAreaPedSimple[i].ped, sStartAreaPedSimple[i-1].ped, CF_AUTO_CHAT, <<0.0, 0.0, 0.0>>, 0.0, 0.0) SET_PED_KEEP_TASK(sStartAreaPedSimple[i].ped, FALSE) sStartAreaPedSimple[i].eState = SPS_REACT_TO_TARGET #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Start Area Peds Begin Routine - ", i) ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE SPS_REACT_TO_TARGET IF IS_ENTITY_IN_RANGE_ENTITY(sTargetPed.ped, sStartAreaPedSimple[i].ped, 3.0) CLEAR_PED_TASKS(sStartAreaPedSimple[i].ped) OPEN_SEQUENCE_TASK(sSeqIndex) TASK_TURN_PED_TO_FACE_ENTITY(NULL, sTargetPed.ped, -1) //TASK_LOOK_AT_ENTITY(NULL, sTargetPed.ped, -1) CLOSE_SEQUENCE_TASK(sSeqIndex) TASK_PERFORM_SEQUENCE(sStartAreaPedSimple[i].ped, sSeqIndex) CLEAR_SEQUENCE_TASK(sSeqIndex) sStartAreaPedSimple[i].eState = SPS_READY_FOR_CLEANUP ENDIF IF NOT IS_ENTITY_IN_RANGE_COORDS(sStartAreaPedSimple[i].ped, vPlayerCurrentPos, 300.0) //cleanup the peds player far away SAFE_REMOVE_PED(sStartAreaPedSimple[i].ped) sStartAreaPedSimple[i].eState = SPS_CLEANED_UP #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "StartArea PED REMOVED - ", i) ENDIF #ENDIF ENDIF BREAK CASE SPS_READY_FOR_CLEANUP IF NOT IS_ENTITY_IN_RANGE_COORDS(sStartAreaPedSimple[i].ped, vPlayerCurrentPos, 150.0) //cleanup the peds player far away SAFE_REMOVE_PED(sStartAreaPedSimple[i].ped) sStartAreaPedSimple[i].eState = SPS_CLEANED_UP #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "StartArea PED REMOVED - ", i) ENDIF #ENDIF ENDIF BREAK ENDSWITCH ENDIF ENDIF ENDIF ENDFOR //Hospital peds FOR i = 0 TO (TOTAL_HOSPITAL_PEDS - 1) IF sHospitalPedSimple[i].eState = SPS_INIT IF NOT bCreatedPedThisFrame IF (fCurrentPlaybackTime >= NIGEL2_HOSPITAL_PEDS_TRIGGER_TIME) AND eHospitalInteriorState > HIS_PIN_INTERIOR_IN_MEMORY // ensure the hospital has been requested beofre checking it's ready IF IS_VALID_INTERIOR(HospitalInteriorIndex) AND IS_INTERIOR_READY(HospitalInteriorIndex) SWITCH i // peds near entrance CASE 0 mnTempPedModel = mnScrubsFemale vTempSpawnPos = << 309.34, -596.87, 43.31 >> fTempSpawnHeading = 14.8 BREAK CASE 1 mnTempPedModel = mnScrubsFemale vTempSpawnPos = << 309.52, -594.85, 43.31 >> fTempSpawnHeading = 153.4102 BREAK CASE 2 mnTempPedModel = mnScrubsFemale vTempSpawnPos = << 316.00, -588.77, 42.30 >> fTempSpawnHeading = 207.5560 BREAK CASE 3 mnTempPedModel = mnDoctorMale vTempSpawnPos = << 317.1715, -590.0840, 42.3020 >> fTempSpawnHeading = 60.6 BREAK //ped in corridor CASE 4 mnTempPedModel = mnScrubsFemale vTempSpawnPos = << 332.54, -588.50, 43.30 >> fTempSpawnHeading = 70.64 BREAK CASE 5 mnTempPedModel = mnScrubsFemale vTempSpawnPos = << 331.68, -578.60, 43.32 >> fTempSpawnHeading = 234.5983 BREAK CASE 6 mnTempPedModel = mnScrubsFemale vTempSpawnPos = << 362.56, -589.32, 43.33 >> fTempSpawnHeading = -21.77 BREAK CASE 7 mnTempPedModel = mnScrubsFemale vTempSpawnPos = << 363.3849, -587.8508, 42.3275 >> fTempSpawnHeading = 161.2689 BREAK CASE 8 mnTempPedModel = mnDoctorMale vTempSpawnPos = << 358.5161, -586.0200, 42.3275 >> fTempSpawnHeading = 67.7037 BREAK ENDSWITCH REQUEST_MODEL(mnTempPedModel) IF HAS_MODEL_LOADED(mnTempPedModel) sHospitalPedSimple[i].ped = CREATE_PED(PEDTYPE_MISSION, mnTempPedModel, vTempSpawnPos, fTempSpawnHeading) IF IS_PED_UNINJURED(sHospitalPedSimple[i].ped) sHospitalPedSimple[i].eState = SPS_REACT_TO_TARGET SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sHospitalPedSimple[i].ped, TRUE) SET_PED_FLEE_ATTRIBUTES(sHospitalPedSimple[i].ped, FA_CAN_SCREAM, TRUE) SET_PED_KEEP_TASK(sHospitalPedSimple[i].ped, TRUE) //RETAIN_ENTITY_IN_INTERIOR(sHospitalPedSimple[i].ped, HospitalInteriorIndex) // don't do this for now as it's making the peds invisible inside the interior!!! #IF IS_DEBUG_BUILD tDebugName = "HospitalP: " tDebugName += i SET_PED_NAME_DEBUG(sHospitalPedSimple[i].ped, tDebugName) #ENDIF SWITCH i CASE 0 SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[i].ped, INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[i].ped, INT_TO_ENUM(PED_COMPONENT,2), 0, 0, 0) //(hair) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[i].ped, INT_TO_ENUM(PED_COMPONENT,3), 0, 1, 0) //(uppr) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[i].ped, INT_TO_ENUM(PED_COMPONENT,4), 0, 0, 0) //(lowr) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[i].ped, INT_TO_ENUM(PED_COMPONENT,5), 0, 0, 0) //(hand) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[i].ped, INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs) BREAK CASE 1 SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[i].ped, INT_TO_ENUM(PED_COMPONENT,0), 1, 0, 0) //(head) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[i].ped, INT_TO_ENUM(PED_COMPONENT,2), 0, 0, 0) //(hair) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[i].ped, INT_TO_ENUM(PED_COMPONENT,3), 0, 0, 0) //(uppr) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[i].ped, INT_TO_ENUM(PED_COMPONENT,4), 0, 0, 0) //(lowr) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[i].ped, INT_TO_ENUM(PED_COMPONENT,5), 0, 0, 0) //(hand) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[i].ped, INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs) BREAK CASE 2 SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[2].ped, INT_TO_ENUM(PED_COMPONENT,0), 1, 0, 0) //(head) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[2].ped, INT_TO_ENUM(PED_COMPONENT,2), 0, 0, 0) //(hair) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[2].ped, INT_TO_ENUM(PED_COMPONENT,3), 0, 1, 0) //(uppr) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[2].ped, INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[2].ped, INT_TO_ENUM(PED_COMPONENT,5), 0, 1, 0) //(hand) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[2].ped, INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs) BREAK CASE 3 SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[3].ped, INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[3].ped, INT_TO_ENUM(PED_COMPONENT,3), 0, 0, 0) //(uppr) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[3].ped, INT_TO_ENUM(PED_COMPONENT,4), 0, 0, 0) //(lowr) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[3].ped, INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[3].ped, INT_TO_ENUM(PED_COMPONENT,11), 0, 0, 0) //(jbib) BREAK CASE 4 SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[4].ped, INT_TO_ENUM(PED_COMPONENT,0), 1, 0, 0) //(head) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[4].ped, INT_TO_ENUM(PED_COMPONENT,2), 1, 1, 0) //(hair) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[4].ped, INT_TO_ENUM(PED_COMPONENT,3), 1, 0, 0) //(uppr) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[4].ped, INT_TO_ENUM(PED_COMPONENT,4), 0, 0, 0) //(lowr) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[4].ped, INT_TO_ENUM(PED_COMPONENT,5), 1, 1, 0) //(hand) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[4].ped, INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs) BREAK CASE 5 SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[5].ped, INT_TO_ENUM(PED_COMPONENT,0), 1, 0, 0) //(head) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[5].ped, INT_TO_ENUM(PED_COMPONENT,2), 1, 1, 0) //(hair) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[5].ped, INT_TO_ENUM(PED_COMPONENT,3), 0, 2, 0) //(uppr) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[5].ped, INT_TO_ENUM(PED_COMPONENT,4), 0, 0, 0) //(lowr) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[5].ped, INT_TO_ENUM(PED_COMPONENT,5), 0, 2, 0) //(hand) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[5].ped, INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs) BREAK CASE 6 SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[6].ped, INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[6].ped, INT_TO_ENUM(PED_COMPONENT,2), 0, 1, 0) //(hair) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[6].ped, INT_TO_ENUM(PED_COMPONENT,3), 1, 1, 0) //(uppr) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[6].ped, INT_TO_ENUM(PED_COMPONENT,4), 0, 0, 0) //(lowr) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[6].ped, INT_TO_ENUM(PED_COMPONENT,5), 0, 0, 0) //(hand) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[6].ped, INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs) BREAK CASE 7 SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[7].ped, INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[7].ped, INT_TO_ENUM(PED_COMPONENT,2), 1, 0, 0) //(hair) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[7].ped, INT_TO_ENUM(PED_COMPONENT,3), 0, 0, 0) //(uppr) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[7].ped, INT_TO_ENUM(PED_COMPONENT,4), 0, 0, 0) //(lowr) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[7].ped, INT_TO_ENUM(PED_COMPONENT,5), 0, 0, 0) //(hand) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[7].ped, INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs) BREAK CASE 8 SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[8].ped, INT_TO_ENUM(PED_COMPONENT,0), 1, 1, 0) //(head) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[8].ped, INT_TO_ENUM(PED_COMPONENT,3), 0, 0, 0) //(uppr) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[8].ped, INT_TO_ENUM(PED_COMPONENT,4), 1, 2, 0) //(lowr) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[8].ped, INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs) SET_PED_COMPONENT_VARIATION(sHospitalPedSimple[8].ped, INT_TO_ENUM(PED_COMPONENT,11), 1, 2, 0) //(jbib) BREAK ENDSWITCH //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "hospital PEDS CREATED") ENDIF #ENDIF //Setup talkers //TASK_CHAT_TO_PED(sHospitalPedSimple[0].ped, sHospitalPedSimple[1].ped, CF_AUTO_CHAT, <<0.0, 0.0, 0.0>>, 0.0, 0.0) //TASK_CHAT_TO_PED(sHospitalPedSimple[2].ped, sHospitalPedSimple[3].ped, CF_IS_INITIATOR | CF_AUTO_CHAT, <<0.0, 0.0, 0.0>>, 0.0, 0.0) //TASK_CHAT_TO_PED(sHospitalPedSimple[6].ped, sHospitalPedSimple[7].ped, CF_AUTO_CHAT, <<0.0, 0.0, 0.0>>, 0.0, 0.0) //setup guys walk //TASK_FOLLOW_NAV_MESH_TO_COORD(sHospitalPedSimple[4].ped, << 338.3217, -592.5885, 42.2918 >>, PEDMOVEBLENDRATIO_WALK) //TASK_FOLLOW_NAV_MESH_TO_COORD(sHospitalPedSimple[5].ped, << 347.9706, -588.3258, 42.3275 >>, PEDMOVEBLENDRATIO_WALK) ENDIF SET_MODEL_AS_NO_LONGER_NEEDED(mnTempPedModel) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " Hospital PEDS CREATED index = ", i, " fc = ", GET_FRAME_COUNT()) ENDIF #ENDIF bCreatedPedThisFrame = TRUE ENDIF ENDIF ENDIF ENDIF ELSE // don't update their AI every frame IF GET_GAME_TIMER() - iTriggerScriptedPedestriansTimer > iAIUpdateDelay IF IS_PED_UNINJURED(sHospitalPedSimple[i].ped) //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "hospital ped - ", i) ENDIF #ENDIF //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "the square of distance between the two points is ", fDistBetweenPlayerAndHospitalPed) ENDIF #ENDIF SWITCH sHospitalPedSimple[i].eState CASE SPS_REACT_TO_TARGET IF IS_ENTITY_IN_RANGE_COORDS(sHospitalPedSimple[i].ped, vPlayerCurrentPos, 5.0) OR IS_ENTITY_IN_RANGE_ENTITY(sTargetPed.ped, sHospitalPedSimple[i].ped, 8.0) //TASK_SMART_FLEE_PED(sHospitalPedSimple[i].ped, PLAYER_PED_ID(), 100.0, -1) TASK_COWER(sHospitalPedSimple[i].ped, -1) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sHospitalPedSimple[i].ped, TRUE) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HOSPITAL PED COWER- ", i) ENDIF #ENDIF sHospitalPedSimple[i].eState = SPS_READY_FOR_CLEANUP ENDIF BREAK CASE SPS_REACT_TO_PLAYER /*IF IS_ENTITY_IN_RANGE_COORDS(sHospitalPedSimple[i].ped, vPlayerCurrentPos, 2.5) SET_ENTITY_HEALTH(sHospitalPedSimple[i].ped, 0) CLEAR_PED_TASKS(sHospitalPedSimple[i].ped) sHospitalPedSimple[i].eState = SPS_READY_FOR_CLEANUP ENDIF*/ BREAK CASE SPS_READY_FOR_CLEANUP IF IS_PED_SHOOTING(PLAYER_PED_ID()) OR IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), sHospitalPedSimple[i].ped) OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sHospitalPedSimple[i].ped) IF GET_SCRIPT_TASK_STATUS(sHospitalPedSimple[i].ped, SCRIPT_TASK_COWER) != PERFORMING_TASK AND GET_SCRIPT_TASK_STATUS(sHospitalPedSimple[i].ped, SCRIPT_TASK_COWER) != WAITING_TO_START_TASK TASK_COWER(sHospitalPedSimple[i].ped, -1) ENDIF ELIF NOT IS_ENTITY_IN_RANGE_COORDS(sHospitalPedSimple[i].ped, vPlayerCurrentPos, 250.0) //cleanup the peds player far away SAFE_REMOVE_PED(sHospitalPedSimple[i].ped) sHospitalPedSimple[i].eState = SPS_CLEANED_UP #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HOSPITAL PED REMOVED - ", i) ENDIF #ENDIF ENDIF BREAK ENDSWITCH ENDIF ENDIF ENDIF ENDFOR ENDIF //don't do this every frame IF GET_GAME_TIMER() - iTriggerScriptedPedestriansTimer > iAIUpdateDelay iTriggerScriptedPedestriansTimer = GET_GAME_TIMER() ENDIF ENDPROC /// PURPOSE: /// triggers dialogue during the chase /// uses mission global var - fCurrentPlaybackTime /// PARAMS: /// bReturnOverrideTargetBlipFlashThisFrame - dialogue dictates if the blip flash needs to be overriden each frame for special case PROC MANAGE_DIALOGUE_DURING_CHASE(BOOL &bReturnOverrideTargetBlipFlashThisFrame) INT iTempRandomLine TEXT_LABEL_31 tl31TempDialogueRoot enumSubtitlesState eDisplaySubtitles IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() iTimer_DialogueDelay = GET_GAME_TIMER() //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - IS_ANY_CONVERSATION_ONGOING_OR_QUEUED timer set fc = ", GET_FRAME_COUNT()) ENDIF #ENDIF ELSE bIsImportantDialoguePlaying = FALSE ENDIF // detect when a interrupt line has finished so we can free up for another interrupt IF bIsInterruptDialoguePlaying IF IS_PED_UNINJURED(pedIndexDialogueInterrupter) IF NOT IS_AMBIENT_SPEECH_PLAYING(pedIndexDialogueInterrupter) pedIndexDialogueInterrupter = NULL bIsInterruptDialoguePlaying = FALSE //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - ped finished interrupt - reset bIsInterruptDialoguePlaying reset fc = ", GET_FRAME_COUNT()) ENDIF #ENDIF ELSE //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - IS_AMBIENT_SPEECH_PLAYING delay bIsInterruptDialoguePlaying fc = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ELSE pedIndexDialogueInterrupter = NULL bIsInterruptDialoguePlaying = FALSE ENDIF ENDIF IF NOT IS_ENTITY_IN_AIR(sNigelVehicle.vehicle) // IF IS_VEHICLE_ON_ALL_WHEELS(sNigelVehicle.vehicle) iTimer_NigelVehicleJumpsTimer = GET_GAME_TIMER() ENDIF //GET_CURRENT_UNRESOLVED_SCRIPTED_CONVERSATION_LINE // only play the chase dialogue during that stage IF eMissionStage = MISSION_STAGE_CHASE_TARGET_IN_VEHICLE IF fCurrentChaseDistance < ((NIGEL2_TARGET_ESCAPED_DISTANCE / 100) * (NIGEL2_FLASH_CHASE_BLIP_PERCENTAGE * 100)) // same time the chase blip will kick in // Important dialogue which will trigger when conditions are met // first turn into the highstreet IF (fCurrentPlaybackTime > 3000.0 AND fCurrentPlaybackTime < 7500.0) IF NOT bDoneDialogue_InitialInstruction IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // Don't display subtitles if objective is on screen eDisplaySubtitles = DISPLAY_SUBTITLES IF IS_MESSAGE_BEING_DISPLAYED() eDisplaySubtitles = DO_NOT_DISPLAY_SUBTITLES ENDIF IF NIG2_PLAY_SINGLE_LINE_FROM_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_INSTR", "NIG2_INSTR_13", CONV_PRIORITY_HIGH, eDisplaySubtitles) // He's taking a left turn down the high street, Jock. bIsImportantDialoguePlaying = TRUE bDoneDialogue_InitialInstruction = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - important dialogue - NIG2_INSTR_13 fc = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF //turn when leaving highstreet IF (fCurrentPlaybackTime > 15500.0 AND fCurrentPlaybackTime < 16000.0) IF NOT bDoneDialogue_Chase[0] //check player vehicle is an area where where it would see di napoli turn IF IS_ENTITY_IN_ANGLED_AREA(sNigelVehicle.vehicle, <<-1237.778442,-763.467896,26.422665>>, <<-1186.702759,-829.477234,10.580473>>, 31.000000) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() //ONLY DO THIS ONE IF THE FIRST CONVO HAS FINISHED IF NIG2_PLAY_SINGLE_LINE_FROM_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_INSTR", "NIG2_INSTR_1", CONV_PRIORITY_HIGH) // He's turning left! bIsImportantDialoguePlaying = TRUE bDoneDialogue_Chase[0] = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - important dialogue - NIG2_INSTR_1 fc = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF //Tunnel section IF (fCurrentPlaybackTime > 45500.0 AND fCurrentPlaybackTime < 47500.0) // B*1545310 - reduced from 46500 to make it trigger sooner IF NOT bDoneDialogue_Chase[1] //check player vehicle is in area where he'd see the truck IF IS_ENTITY_IN_ANGLED_AREA(sNigelVehicle.vehicle, <<-664.53711, -580.79431, 29.308285>>, <<-590.720276,-581.193237,23.308285>>, 13.500000) // B*1545310 - prev <<-661.360962,-581.020081,29.308285>> IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG_SP1", CONV_PRIORITY_HIGH) REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_LOWEST) // Oh my word! Jock! Do you see that lorry? // What the fuck's a lorry? // Have a little faith. Anyone'd think this was my first kidnapping. bIsImportantDialoguePlaying = TRUE bDoneDialogue_Chase[1] = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - important dialogue - NIG_SP1 fc = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF //entrance to carpark IF (fCurrentPlaybackTime > 69000.0 AND fCurrentPlaybackTime < 71000.0) //68500.0 AND fCurrentPlaybackTime < 70000.0) IF NOT bDoneDialogue_Chase[2] //check player vehicle is in area where he'd him head into the carpark IF IS_ENTITY_IN_ANGLED_AREA(sNigelVehicle.vehicle, <<-440.785736,-828.323730,35.735603>>, <<-511.811157,-826.655945,27.668936>>, 60.000000) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG_SP2", CONV_PRIORITY_HIGH) REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_LOWEST) // Mind out! // He's going into the car park! // The car park. No worries, mate. bIsImportantDialoguePlaying = TRUE bDoneDialogue_Chase[2] = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - important dialogue - NIG_SP2 fc = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF //entrance to highway IF (fCurrentPlaybackTime > 85000.0 AND fCurrentPlaybackTime < 89000.0) IF NOT bDoneDialogue_Chase[3] //check player vehicle has entered the highway IF IS_ENTITY_IN_ANGLED_AREA(sNigelVehicle.vehicle, <<-432.327759,-540.988037,44.071632>>, <<-433.248322,-485.564941,22.470394>>, 60.000000) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG_SP3", CONV_PRIORITY_HIGH) // Oh my giddy aunt! // Everything okay there, Earl Crazycakes? // My prostate has taken quite a beating. // Do you have to lower the tone? bIsImportantDialoguePlaying = TRUE bDoneDialogue_Chase[3] = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - important dialogue - NIG_SP3 FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF //slip road highway exit IF (fCurrentPlaybackTime > 104000.0 AND fCurrentPlaybackTime < 110000.0) IF NOT bDoneDialogue_Chase[4] IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // B*1392677 - moaning about dialogue getting cut off //check player vehicle is on highway following napoli IF IS_ENTITY_IN_ANGLED_AREA(sNigelVehicle.vehicle, <<81.946068,-518.602417,38.074284>>, <<-107.368584,-519.744385,27.815357>>, 60.000000) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() //KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() KILL_ANY_CONVERSATION() // B*1392677 - moaning about dialogue getting cut off ENDIF IF NIG2_PLAY_SINGLE_LINE_FROM_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_INSTR", "NIG2_INSTR_12", CONV_PRIORITY_HIGH) // Take the slip road Jock. bIsImportantDialoguePlaying = TRUE bDoneDialogue_Chase[4] = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - important dialogue - NIG2_INSTR_12 FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF //entrance to hospital IF (fCurrentPlaybackTime > 113000.0 AND fCurrentPlaybackTime < 116000.0) IF NOT bDoneDialogue_Chase[5] //check player vehicle could see hospital IF IS_ENTITY_IN_ANGLED_AREA(sNigelVehicle.vehicle, <<254.999435,-594.382629,49.602520>>, <<270.464294,-527.226013,39.682480>>, 70.000000) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_HOSP01", CONV_PRIORITY_HIGH) REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_LOWEST) // Is he going through the hospital? // Oh my lord! // Hold on to your corsets. bIsImportantDialoguePlaying = TRUE bDoneDialogue_Chase[5] = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - important dialogue - NIG2_HOSP01 FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF IF fCurrentPlaybackTime > 118000.0 //only do these checks towards end of the chase //go out the window comment IF NOT bDoneDialogue_Chase[6] //lead up to window IF IS_ENTITY_IN_ANGLED_AREA(sNigelVehicle.vehicle, <<338.011139,-581.905457,41.577534>>, <<350.986938,-586.752930,46.077515>>, 6.750000) //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "inside do hospital window dialogue") ENDIF #ENDIF IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_HWH", CONV_PRIORITY_HIGH) // Uh, seems rude not to follow him through the window. bIsImportantDialoguePlaying = TRUE bDoneDialogue_Chase[6] = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - important dialogue - NIG2_HWH FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDIF //go out the window comment IF NOT bDoneDialogue_Chase[7] IF IS_ENTITY_IN_ANGLED_AREA(sNigelVehicle.vehicle, <<368.571442,-594.946655,45.542202>>, <<389.501495,-614.127930,27.117891>>, 20.750000) IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG2_HWH") // // Uh, seems rude not to follow him through the window. IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_HWS", CONV_PRIORITY_HIGH) // Bloody hell! bIsImportantDialoguePlaying = TRUE bDoneDialogue_Chase[7] = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - important dialogue - NIG2_HWS FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT bIsInterruptDialoguePlaying // Nigel's vehicle jumps and/or flips over IF NOT bDoneDialogue_UpsideDownOrAirbourne IF IS_VEHICLE_STUCK_ON_ROOF(sNigelVehicle.vehicle) OR IS_VEHICLE_STUCK_TIMER_UP(sNigelVehicle.vehicle, VEH_STUCK_ON_ROOF, 1000) // IS_VEHICLE_STUCK_ON_ROOF didn't seem to work for this OR IS_VEHICLE_STUCK_TIMER_UP(sNigelVehicle.vehicle, VEH_STUCK_ON_SIDE, 1000) OR HAS_TIME_PASSED(iTimer_NigelVehicleStuckOnRoofFail, 500) //IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() //ENDIF // random dialogue, so only one line will be selected tl31TempDialogueRoot = "NIG2_FLIP_" iTempRandomLine = GET_RANDOM_INT_IN_RANGE(1, 3) // selection 1-2 tl31TempDialogueRoot += iTempRandomLine // B*1366130 - use INTERRUPT_CONVERSATION instead since dialogue doesn't play otherwise IF iTempRandomLine = 1 // context uses to key geenrated in AmericanDialogueFiles e.g. - [NIG2_FLIP_1A:NIG2AUD] NIG2_CCAA INTERRUPT_CONVERSATION(sNigelPed.ped, "NIG2_CCAA", "NIGEL") // A little rusty on the old stunts, Jock. bDoneDialogue_UpsideDownOrAirbourne = TRUE pedIndexDialogueInterrupter = sNigelPed.ped bIsInterruptDialoguePlaying = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - nigel's vehicle flipped dialogue : NIG2_CCAA FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF EXIT ELSE // context uses to key geenrated in AmericanDialogueFiles e.g. - [NIG2_FLIP_2A:NIG2AUD] NIG2_CCAB INTERRUPT_CONVERSATION(sMrsThornhillPed.ped, "NIG2_CCAB", "MRSTHORNHILL") // It's all gone topsy-turvy upside down cake. bDoneDialogue_UpsideDownOrAirbourne = TRUE pedIndexDialogueInterrupter = sMrsThornhillPed.ped bIsInterruptDialoguePlaying = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - Mrs Thornhill's vehicle flipped dialogue : NIG2_CCAB FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF EXIT ENDIF // airborne - only do if we aren't currently doing the upside down dialogue ELIF IS_ENTITY_IN_AIR(sNigelVehicle.vehicle) // IF NOT IS_VEHICLE_ON_ALL_WHEELS(sNigelVehicle.vehicle) IF HAS_TIME_PASSED(iTimer_NigelVehicleJumpsTimer, 500) //make sure Nigel's car has been in the air for a decent chunk of time, iTimer_NigelVehicleJumpsTimer is reset at top of proc IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG2_HWH") // bDoneDialogue_Chase[6] // prevent this playing if inital jump out window dialogue is waiting to trigger AND NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG2_HWS") // bDoneDialogue_Chase[7] // prevent this playing if inital jump out window dialogue is waiting to trigger // allows current conversations to be interrupted with the specific comments // random select between Nigel and Mrs Thornhill comments IF (GET_RANDOM_INT_IN_RANGE(0, 11) > 5) // context uses to key geenrated in AmericanDialogueFiles e.g. - [NIG2_JUMP_1A:NIG2AUD] NIG2_CDAA tl31TempDialogueRoot = "NIG2_CDAA" // Just like in the films! INTERRUPT_CONVERSATION(sNigelPed.ped, tl31TempDialogueRoot, "NIGEL") pedIndexDialogueInterrupter = sNigelPed.ped ELSE // context uses to key geenrated in AmericanDialogueFiles e.g. - [NIG2_JUMP_2A:NIG2AUD] NIG2_CDAB tl31TempDialogueRoot = "NIG2_CDAB" // Mercy me, we're airborne! INTERRUPT_CONVERSATION(sMrsThornhillPed.ped, tl31TempDialogueRoot, "MRSTHORNHILL") pedIndexDialogueInterrupter = sMrsThornhillPed.ped ENDIF iTimer_NigelVehicleJumpsTimer = GET_GAME_TIMER() bIsInterruptDialoguePlaying = TRUE bDoneDialogue_UpsideDownOrAirbourne = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - nigel's vehicle jump dialogue, context = ", tl31TempDialogueRoot, " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF EXIT ENDIF ENDIF ENDIF ELSE // reset dialogue trigger when vehicle is back on the ground IF NOT IS_ENTITY_IN_AIR(sNigelVehicle.vehicle) IF IS_VEHICLE_ON_ALL_WHEELS(sNigelVehicle.vehicle) OR (NOT IS_VEHICLE_STUCK_ON_ROOF(sNigelVehicle.vehicle) AND NOT IS_VEHICLE_STUCK_TIMER_UP(sNigelVehicle.vehicle, VEH_STUCK_ON_ROOF, 1000) // IS_VEHICLE_STUCK_ON_ROOF didn't seem to work for this AND NOT IS_VEHICLE_STUCK_TIMER_UP(sNigelVehicle.vehicle, VEH_STUCK_ON_SIDE, 1000)) bDoneDialogue_UpsideDownOrAirbourne = FALSE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - reset bDoneDialogue_UpsideDownOrAirbourne") ENDIF #ENDIF ENDIF ENDIF ENDIF // temp wrap to until code fix for bug 1443371 & 1443404 IF NOT bIsImportantDialoguePlaying // Trevor drives into a ped IF (GET_TIME_SINCE_PLAYER_HIT_PED(PLAYER_ID()) >= 0) // looks to be initially set to -1 so need to check from 0 AND (GET_TIME_SINCE_PLAYER_HIT_PED(PLAYER_ID()) < 500) // allows current conversations to be interrupted with the specific comments // random select between Nigel and Mrs Thornhill comments IF (GET_RANDOM_INT_IN_RANGE(0, 11) > 5) // context uses to key geenrated in AmericanDialogueFiles e.g. - [NIG2_PEDA:NIG2AUD] NIG2_CQAA tl31TempDialogueRoot = "NIG2_CQAA" // It's okay, they all have private healthcare. // Jock, I think you just hit someone! // Mrs. Thornhill was throwing herself under cars earlier. INTERRUPT_CONVERSATION(sNigelPed.ped, tl31TempDialogueRoot, "NIGEL") pedIndexDialogueInterrupter = sNigelPed.ped ELSE // context uses to key geenrated in AmericanDialogueFiles e.g. - [NIG2_PED2A:NIG2AUD] NIG2_CPAA tl31TempDialogueRoot = "NIG2_CPAA" // That's right, Jock, no prisoners! // Just a scratch! INTERRUPT_CONVERSATION(sMrsThornhillPed.ped, tl31TempDialogueRoot, "MRSTHORNHILL") pedIndexDialogueInterrupter = sMrsThornhillPed.ped ENDIF bIsInterruptDialoguePlaying = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - player hit ped dialogue, context = ", tl31TempDialogueRoot, " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF EXIT ENDIF // collide dialogue IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(sNigelVehicle.vehicle) // allows current conversations to be interrupted with the specific comments // random select between Nigel and Mrs Thornhill comments IF (GET_RANDOM_INT_IN_RANGE(0, 11) > 5) // context uses to key geenrated in AmericanDialogueFiles e.g. - [NIG2_CRASHA:NIG2AUD] NIG2_COAA tl31TempDialogueRoot = "NIG2_COAA" // Careful! // Oh, the hernia! // Maybe I should have driven. INTERRUPT_CONVERSATION(sNigelPed.ped, tl31TempDialogueRoot, "NIGEL") pedIndexDialogueInterrupter = sNigelPed.ped ELSE // context uses to key geenrated in AmericanDialogueFiles e.g. - [NIG2_CRASH2A:NIG2AUD] NIG2_CNAA tl31TempDialogueRoot = "NIG2_CNAA" // Mind out! // The hire car! // We'll never get that deposit back! INTERRUPT_CONVERSATION(sMrsThornhillPed.ped, tl31TempDialogueRoot, "MRSTHORNHILL") pedIndexDialogueInterrupter = sMrsThornhillPed.ped ENDIF bIsInterruptDialoguePlaying = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - vehicle collides dialogue, context = ", tl31TempDialogueRoot, " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF EXIT ENDIF ENDIF ENDIF // Medium important dialogue - will only trigger if no other dialogue of same importance of higher is playing. IF NOT bIsImportantDialoguePlaying AND NOT bIsInterruptDialoguePlaying //warn player about shooting at target IF DOES_ENTITY_EXIST(sTargetVehicle.vehicle) IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sTargetVehicle.vehicle, PLAYER_PED_ID()) AND IS_PED_SHOOTING(PLAYER_PED_ID()) IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG2_SHOOTS") AND NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG2_SHOOTSN") IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF // random pick between nigel or mrs t line IF GET_RANDOM_INT_IN_RANGE(0, 11) > 5 IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_SHOOTS", CONV_PRIORITY_HIGH) // We didn't say kill the poor man! // Stop shooting! I can't hear myself think! CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sTargetVehicle.vehicle) bIsInterruptDialoguePlaying = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - warn shooting dialogue mrs t - NIG2_SHOOTS") ENDIF #ENDIF EXIT ENDIF ELSE IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_SHOOTSN", CONV_PRIORITY_HIGH) // Why do you Americans have to shoot at everything? // He's not much use to us in a body bag, Jock! // He thinks he's on one of those drive-bys, Mrs Thornhill! CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sTargetVehicle.vehicle) bIsInterruptDialoguePlaying = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - warn shooting dialogue nigel - NIG2_SHOOTSN") ENDIF #ENDIF EXIT ENDIF ENDIF ENDIF CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sTargetVehicle.vehicle) ENDIF //warn player about ramming target IF NOT bDoneDialogue_WarnRamming IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sTargetVehicle.vehicle, PLAYER_PED_ID()) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_CHASE01", CONV_PRIORITY_HIGH) // Don't go crazy, we'd prefer him in one piece! // Oh yeah, nobody here go crazy. Heaven forbid. CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sTargetVehicle.vehicle) bIsImportantDialoguePlaying = TRUE bDoneDialogue_WarnRamming = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - rammin dialogue - NIG2_CHASE01") ENDIF #ENDIF EXIT ENDIF ENDIF ENDIF ENDIF // trevor gets a wanted level IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) IF NOT bDoneDialogue_TrevorGetsWantedLevel IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION() ENDIF IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_WANTED", CONV_PRIORITY_HIGH) // Is that the old bill? // The police, what terrible luck. bDoneDialogue_TrevorGetsWantedLevel = TRUE bIsImportantDialoguePlaying = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - wanted dialogue - NIG2_WANTED") ENDIF #ENDIF ENDIF ELIF NOT bDoneDialogue_CopsSeenChasing IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG2_WANTED") //IF IS_COP_VEHICLE_IN_AREA_3D(vTemp1, vTemp2) // not found a cheap way to detect cop car on screen yet IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_POLICE", CONV_PRIORITY_HIGH) // Do you think we'll be on one of those cop chase programmes? // The LSPD, how glamorous! bDoneDialogue_CopsSeenChasing = TRUE bIsImportantDialoguePlaying = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - cops seen dialogue - NIG2_POLICE") ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF // Low priority dialogue - only plays if no other dialogue is playing // only play the chase dialogue during that stage IF eMissionStage = MISSION_STAGE_CHASE_TARGET_IN_VEHICLE IF fCurrentChaseDistance < ((NIGEL2_TARGET_ESCAPED_DISTANCE / 100) * (NIGEL2_FLASH_CHASE_BLIP_PERCENTAGE * 100)) // same time the chase blip will kick in IF NOT bIsImportantDialoguePlaying AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF HAS_TIME_PASSED(iTimer_DialogueDelay, 500) // general banter dialogue IF (fCurrentPlaybackTime < 116000.0) // DONT ALLOW BANTER FROM HOSPTIAL SECTION ONWARDS // driving wrong side of the road IF NOT bDoneDialogue_DrivingOnWrongSideRoad IF fCurrentPlaybackTime > 20000.0 // got out of pedestrian area first IF IS_TREVOR_DRIVING_ON_ROAD_WRONG_WAY() IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_LEFT", CONV_PRIORITY_HIGH) // Glad to see you on the proper side of the road, dear boy. bDoneDialogue_DrivingOnWrongSideRoad = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - driving wrong side of the road dialogue - NIG2_LEFT") ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF //BANTER IF NOT bDoneDialogue_BanterChase[0] IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_CHASE02", CONV_PRIORITY_HIGH) // Did you ever imagine we might get a private audience with Al Di Napoli? // Only in my wildest dreams. // All those nights spent roleplaying in mother's utility room, // if only we'd known! bDoneDialogue_BanterChase[0] = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - banter dialogue - NIG2_CHASE02") ENDIF #ENDIF ENDIF ENDIF IF NOT bDoneDialogue_BanterChase[1] IF bDoneDialogue_Chase[0] //after first left dialogue OR (fCurrentPlaybackTime > 16500.0) // ahalf second after its bDoneDialogue_Chase[0] trigger time IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_CHASE05", CONV_PRIORITY_HIGH) // I loved him in The Redeemer. Oh, Nigel, do your Al Di Napoli line! // "This is turban warfare, motherfucker!" // It's uncanny! // Oh dear, poor Jock must think we're batty! // Oh, don't be silly. bDoneDialogue_BanterChase[1] = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - banter dialogue - NIG2_CHASE05") ENDIF #ENDIF ENDIF ENDIF ELIF NOT bDoneDialogue_BanterChase[2] IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_CHASE08", CONV_PRIORITY_HIGH) // I hear that behind his charitable public face, he's remarkably right-wing. // One can but hope. // Liberal in the bedroom, conservative at the border, Mrs Thornhill! // I love this country! bDoneDialogue_BanterChase[2] = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - banter dialogue - NIG2_CHASE08") ENDIF #ENDIF ENDIF ELIF NOT bDoneDialogue_BanterChase[3] IF bDoneDialogue_Chase[1] //only trigger after tunnel OR (fCurrentPlaybackTime > 52500.0) // half a second after its bDoneDialogue_Chase[1] trigger time IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_CHASE06", CONV_PRIORITY_HIGH) // What on earth will we feed the man? // I hadn't even thought of that. He probably eats sushi or quinoa. Is that even how you even say it? // What if he wants meth? // Don't get flustered again, Nigel. bDoneDialogue_BanterChase[3] = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - banter dialogue - NIG2_CHASE06") ENDIF #ENDIF ENDIF ENDIF ELIF NOT bDoneDialogue_BanterChase[4] IF bDoneDialogue_Chase[2] // trigger after going in car park OR (fCurrentPlaybackTime > 71500.0) // half a second after its bDoneDialogue_Chase[2] trigger time IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_CHASE03", CONV_PRIORITY_HIGH) // Oh, I hope he likes us! // How could he not? This lock-up you've prepared sounds charming. // Just be yourself, Mrs Thornhill. bDoneDialogue_BanterChase[4] = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - banter dialogue - NIG2_CHASE03") ENDIF #ENDIF ENDIF ENDIF ELIF NOT bDoneDialogue_BanterChase[5] IF bDoneDialogue_Chase[3] //after highway dialogue OR (fCurrentPlaybackTime > 89500.0) // half a second after its bDoneDialogue_Chase[3] trigger time IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_CHASE04", CONV_PRIORITY_HIGH) // This must be second nature to you, Jock. All those stunts you used to do. // And we saw you're up for governor of San Andreas! // That's right. In between openly attacking celebrities all over town, I'm running for public office. // Such simplistic and uninhibited people. Marvelous. bDoneDialogue_BanterChase[5] = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - banter dialogue - NIG2_CHASE04") ENDIF #ENDIF ENDIF ENDIF ELIF NOT bDoneDialogue_BanterChase[6] IF NOT bDoneDialogue_Chase[5] // don't trigger this after the hospital entrance comment IF bDoneDialogue_Chase[4] //after slip road instruction OR (fCurrentPlaybackTime > 106500.0) // half a second after its bDoneDialogue_Chase[4] trigger time //check player vehicle isn't still on highway waiting for sliproad comment IF NOT IS_ENTITY_IN_ANGLED_AREA(sNigelVehicle.vehicle, <<81.946068,-518.602417,38.074284>>, <<-107.368584,-519.744385,27.815357>>, 60.000000) IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_CHASE07", CONV_PRIORITY_HIGH) // This level of derangement, I'm impressed. // Little by little I'm tip-toeing out of the comfort zone. // Before I met Mrs Thornhill I was so vanilla. // I had a very confined upbringing. // Well let me assure you there's no comfort in this zone. bDoneDialogue_BanterChase[6] = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - banter dialogue - NIG2_CHASE07") ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF // dialogue for target escaping IF fCurrentChaseDistance > ((NIGEL2_TARGET_ESCAPED_DISTANCE / 100) * (NIGEL2_FLASH_CHASE_BLIP_PERCENTAGE * 100)) // catch up dialogue - Al Di Napoli escaping IF NOT bIsImportantDialoguePlaying IF NOT bDoneDialogue_CatchUp[2] IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION() ELSE IF NOT bDoneDialogue_CatchUp[0] IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_CU01", CONV_PRIORITY_HIGH) // Can't you go any faster? // Blame Nigel for renting this shitheap of a car. bIsImportantDialoguePlaying = TRUE bDoneDialogue_CatchUp[0] = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - catch up dialogue - NIG2_CU03") ENDIF #ENDIF ENDIF ELIF NOT bDoneDialogue_CatchUp[1] IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_CU02", CONV_PRIORITY_HIGH) // We can't lose him, Jock! // How will we all become the best of friends? bIsImportantDialoguePlaying = TRUE bDoneDialogue_CatchUp[1] = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - catch up dialogue - NIG2_CU03") ENDIF #ENDIF ENDIF ELIF NOT bDoneDialogue_CatchUp[2] IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_CU03", CONV_PRIORITY_HIGH) // Hurry up! We can't let him get away! bIsImportantDialoguePlaying = TRUE bDoneDialogue_CatchUp[2] = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - catch up dialogue - NIG2_CU03") ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF // B*1513201 - when target goes down the tunnel and player doesn't follow // needs to match up with UPDATE_FAIL_REASON ELIF fCurrentPlaybackTime > 40000.0 // enter tunnel IF fCurrentPlaybackTime < 58000.0 // exit tunnel IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-731.689087,-657.824158,26.269114>>, <<-448.393585,-657.125000,40.717342>>, 40.000000) // the road area IF NOT bDoneDialogue_WrongWaySpecialFail IF NOT bDoneDialogue_CatchUp[1] IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_CU02", CONV_PRIORITY_HIGH) // We can't lose him, Jock! // How will we all become the best of friends? bIsImportantDialoguePlaying = TRUE bDoneDialogue_CatchUp[1] = TRUE bDoneDialogue_WrongWaySpecialFail = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - special case Wrong way dialogue - NIG2_CU03") ENDIF #ENDIF ENDIF ELSE IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF // make sure this back is used IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_CU03", CONV_PRIORITY_HIGH) // Hurry up! We can't let him get away! bIsImportantDialoguePlaying = TRUE bDoneDialogue_CatchUp[2] = TRUE bDoneDialogue_WrongWaySpecialFail = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - special case Wrong way dialogue - NIG2_CU03") ENDIF #ENDIF ENDIF ENDIF ENDIF bReturnOverrideTargetBlipFlashThisFrame = TRUE // set to ensure blip flash is forced on for this situation ENDIF ENDIF ENDIf ENDPROC /// PURPOSE: /// deals with pinning the hospital interior to memory, setting the interior active and setting the IPL groups /// B*1504088 - need to request the ipl changes really early otherwise rayfire doesn't kick in quick enough PROC MANAGE_HOSPITAL_STATE_DURING_CHASE() // make sure the IPL swaps are done first of all IF eHospitalInteriorState = HIS_SET_INTERIOR_IPLS_FOR_CHASE SET_BUILDING_STATE(BUILDINGNAME_IPL_PILLBOX_HILL, BUILDINGSTATE_DESTROYED) // sets the window to destroyed so player/target can drive through it SET_BUILDING_STATE(BUILDINGNAME_IPL_PILLBOX_HILL_INTERIOR, BUILDINGSTATE_NORMAL) // sets the interior to stream HospitalInteriorIndex = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 307.3065, -589.9595, 43.3020 >>, "v_hospital") //get handle to hospital interior eHospitalInteriorState = HIS_PIN_INTERIOR_IN_MEMORY CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE - done HIS_SET_INTERIOR_IPLS_FOR_CHASE : FC = ", GET_FRAME_COUNT()) // interior needs to be pinned into memory really early ELIF eHospitalInteriorState = HIS_PIN_INTERIOR_IN_MEMORY IF NOT IS_REPLAY_BEING_SET_UP() IF IS_VALID_INTERIOR(HospitalInteriorIndex) IF NOT IS_INTERIOR_READY(HospitalInteriorIndex) PIN_INTERIOR_IN_MEMORY(HospitalInteriorIndex) ELSE SET_INTERIOR_ACTIVE(HospitalInteriorIndex, TRUE) eHospitalInteriorState = HIS_SET_ENTITY_SET_FOR_CHASE CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE - done HIS_PIN_INTERIOR_IN_MEMORY : FC = ", GET_FRAME_COUNT()) ENDIF ELSE HospitalInteriorIndex = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 307.3065, -589.9595, 43.3020 >>, "v_hospital") //get handle to hospital interior CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE getting handle to valid interior : FC = ", GET_FRAME_COUNT()) ENDIF ENDIF // set the entity set once we know the interior is pinned in memory ELIF eHospitalInteriorState = HIS_SET_ENTITY_SET_FOR_CHASE IF IS_VALID_INTERIOR(HospitalInteriorIndex) IF IS_INTERIOR_READY(HospitalInteriorIndex) SET_BUILDING_STATE(BUILDINGNAME_ES_PILLBOX_HILL, BUILDINGSTATE_NORMAL) // sets entity set for the rayfire doors eHospitalInteriorState = HIS_REFRESH_INTERIOR CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE - SKIPPED done HIS_SET_ENTITY_SET_FOR_CHASE : FC = ", GET_FRAME_COUNT()) ELSE eHospitalInteriorState = HIS_PIN_INTERIOR_IN_MEMORY CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE : HIS_SET_ENTITY_SET_FOR_CHASE - error interior no longer ready! : FC = ", GET_FRAME_COUNT()) ENDIF ELSE eHospitalInteriorState = HIS_PIN_INTERIOR_IN_MEMORY CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE : HIS_SET_ENTITY_SET_FOR_CHASE - error interior no longer valid! : FC = ", GET_FRAME_COUNT()) ENDIF // refresh the interior once everything should be setup correctly ELIF eHospitalInteriorState = HIS_REFRESH_INTERIOR IF NOT IS_REPLAY_BEING_SET_UP() IF IS_VALID_INTERIOR(HospitalInteriorIndex) IF IS_INTERIOR_READY(HospitalInteriorIndex) REFRESH_INTERIOR(HospitalInteriorIndex) eHospitalInteriorState = HIS_READY // HIS_REQUEST_NEW_LOAD_SCENE_AT_INTERIOR // CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE - SKIPPED ^ done HIS_REFRESH_INTERIOR : FC = ", GET_FRAME_COUNT()) ELSE PIN_INTERIOR_IN_MEMORY(HospitalInteriorIndex) CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE : HIS_REFRESH_INTERIOR - re pinnning in memory : FC = ", GET_FRAME_COUNT()) //eHospitalInteriorState = HIS_PIN_INTERIOR_IN_MEMORY //CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE : HIS_REFRESH_INTERIOR - error interior no longer ready! : FC = ", GET_FRAME_COUNT()) ENDIF ELSE HospitalInteriorIndex = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 307.3065, -589.9595, 43.3020 >>, "v_hospital") //get handle to hospital interior CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE : HIS_REFRESH_INTERIOR - getting handle to valid interior : FC = ", GET_FRAME_COUNT()) //eHospitalInteriorState = HIS_PIN_INTERIOR_IN_MEMORY //CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE : HIS_REFRESH_INTERIOR - error interior no longer valid! : FC = ", GET_FRAME_COUNT()) ENDIF ENDIF /* removed for now as Ian thinks it shouldn't be needed anymore because the interior is pinned so early // load the scene at the interior (5m inside the interior apparenlt not too expensive and should do the job) ELIF eHospitalInteriorState = HIS_REQUEST_NEW_LOAD_SCENE_AT_INTERIOR IF NOT IS_REPLAY_BEING_SET_UP() IF IS_COORD_IN_RANGE_OF_COORD(vPlayerPos, << 308.96793, -591.07501, 43.29187 >>, 350.0) // 550.0) //350.0) NEW_LOAD_SCENE_STOP() IF NOT IS_NEW_LOAD_SCENE_ACTIVE() NEW_LOAD_SCENE_START_SPHERE(<< 308.96793, -591.07501, 43.29187 >>, 5.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION) // pos more in the middle of the interior eHospitalInteriorState = HIS_ACTIVE_NEW_LOAD_SCENE_AT_INTERIOR CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE NEW_LOAD_SCENE_START_SPHERE(<< 326.36642, -590.09155, 42.29188 >>, 5.0 : FC = ", GET_FRAME_COUNT()) ENDIF ENDIF ENDIF // check for the new load scene completing ELIF eHospitalInteriorState = HIS_ACTIVE_NEW_LOAD_SCENE_AT_INTERIOR IF NOT IS_REPLAY_BEING_SET_UP() IF IS_NEW_LOAD_SCENE_ACTIVE() IF IS_NEW_LOAD_SCENE_LOADED() eHospitalInteriorState = HIS_CLEANUP_NEW_LOAD_SCENE_AT_INTERIOR CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE - done HIS_ACTIVE_NEW_LOAD_SCENE_AT_INTERIOR : FC = ", GET_FRAME_COUNT()) // if player moves away before load is completed bin it off ELIF NOT IS_COORD_IN_RANGE_OF_COORD(vPlayerPos, << 308.96793, -591.07501, 43.29187 >>, 650.0) // 550.0) //350.0) NEW_LOAD_SCENE_STOP() eHospitalInteriorState = HIS_REQUEST_NEW_LOAD_SCENE_AT_INTERIOR CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE - binned off HIS_ACTIVE_NEW_LOAD_SCENE_AT_INTERIOR for range check : FC = ", GET_FRAME_COUNT()) ENDIF ENDIF ENDIF // bin off the new load scene once chase has reached the area ELIF eHospitalInteriorState = HIS_CLEANUP_NEW_LOAD_SCENE_AT_INTERIOR IF NOT IS_REPLAY_BEING_SET_UP() //IF IS_NEW_LOAD_SCENE_ACTIVE() // NEW_LOAD_SCENE_STOP() // eHospitalInteriorState = HIS_READY // CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE - done HIS_CLEANUP_NEW_LOAD_SCENE_AT_INTERIOR : FC = ", GET_FRAME_COUNT()) //ENDIF IF NOT IS_COORD_IN_RANGE_OF_COORD(vPlayerPos, << 308.96793, -591.07501, 43.29187 >>, 650.0) // 550.0) //350.0) NEW_LOAD_SCENE_STOP() eHospitalInteriorState = HIS_REQUEST_NEW_LOAD_SCENE_AT_INTERIOR CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE - binned off HIS_CLEANUP_NEW_LOAD_SCENE_AT_INTERIOR for range check : FC = ", GET_FRAME_COUNT()) ENDIF ENDIF */ // everything should be setup by this point, just monitor things going wrong ELIF eHospitalInteriorState = HIS_READY IF IS_VALID_INTERIOR(HospitalInteriorIndex) IF NOT IS_INTERIOR_READY(HospitalInteriorIndex) PIN_INTERIOR_IN_MEMORY(HospitalInteriorIndex) CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE : HIS_READY - re pinnning in memory : FC = ", GET_FRAME_COUNT()) //eHospitalInteriorState = HIS_PIN_INTERIOR_IN_MEMORY //CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE : HIS_READY - error interior no longer ready! : FC = ", GET_FRAME_COUNT()) ENDIF ELSE HospitalInteriorIndex = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 307.3065, -589.9595, 43.3020 >>, "v_hospital") //get handle to hospital interior CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE : HIS_READY - getting handle to valid interior : FC = ", GET_FRAME_COUNT()) //eHospitalInteriorState = HIS_PIN_INTERIOR_IN_MEMORY //CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE : HIS_READY - error interior no longer valid! : FC = ", GET_FRAME_COUNT()) ENDIF //ELIF eHospitalInteriorState = HIS_ENDIF ENDIF ENDPROC /// PURPOSE: /// handles rayfire doors triggering /// uses mission global var - fCurrentPlaybackTime PROC MANAGE_RAYFIRE_HOSPITAL_DOORS() IF NOT IS_REPLAY_BEING_SET_UP() // don't allow during replay setup / stage skips AND bFinishedStageSkipping // B*1572752 - now creating doors object in script to display until rayfire anim kicks in - rayfire object always struggled to stream prior to start state IF eHospitalDoorsObjectState = HDO_CREATE IF (fCurrentPlaybackTime >= 99000.0) // point shortly after object normal exists IF IS_COORD_IN_RANGE_OF_COORD(vPlayerPos, << 308.96793, -591.07501, 43.29187 >>, 500.0) // dist player from rayfire object IF NOT DOES_ENTITY_EXIST(sObjectHospitalDoors.objectIndex) REQUEST_MODEL(sObjectHospitalDoors.modelName) IF HAS_MODEL_LOADED(sObjectHospitalDoors.modelName) sObjectHospitalDoors.objectIndex = CREATE_OBJECT(sObjectHospitalDoors.modelName, sObjectHospitalDoors.vPos) IF IS_ENTITY_ALIVE(sObjectHospitalDoors.objectindex) SET_ENTITY_ROTATION(sObjectHospitalDoors.objectindex, sObjectHospitalDoors.vRot) SET_ENTITY_COORDS_NO_OFFSET(sObjectHospitalDoors.objectindex, sObjectHospitalDoors.vPos) FREEZE_ENTITY_POSITION(sObjectHospitalDoors.objectindex, TRUE) SET_MODEL_AS_NO_LONGER_NEEDED(sObjectHospitalDoors.modelName) eHospitalDoorsObjectState = HDO_WAIT_FOR_DELETE CPRINTLN(DEBUG_MISSION, "OBJECT Hospital Doors Progress, created doors : eHospitalDoorsObjectState > HDO_WAIT_FOR_DELETE") ENDIF ENDIF ENDIF ENDIF ENDIF // same frame the rayfire object begins to playback from this object ELIF eHospitalDoorsObjectState = HDO_WAIT_FOR_DELETE IF (fCurrentPlaybackTime >= NIGEL2_RAYFIRE_HOSPITAL_DOORS_TRIGGER_POINT) IF DOES_ENTITY_EXIST(sObjectHospitalDoors.objectIndex) SAFE_DELETE_OBJECT(sObjectHospitalDoors.objectIndex) eHospitalDoorsObjectState = HDO_END CPRINTLN(DEBUG_MISSION, "OBJECT Hospital Doors Progress, doors deleted for rayfire : eHospitalDoorsObjectState > HDO_END") ENDIF ENDIF ELIF eHospitalDoorsObjectState = HDO_END ENDIF // grab the rayfire_index IF iRayfireProgress_HospitalDoors = 0 IF (fCurrentPlaybackTime >= 99000.0) // point shortly after object normal exists IF IS_COORD_IN_RANGE_OF_COORD(vPlayerPos, << 308.96793, -591.07501, 43.29187 >>, 500.0) // dist player from rayfire object IF eHospitalInteriorState > HIS_REFRESH_INTERIOR // point before dist checks kick in rfHospitalDoors = GET_RAYFIRE_MAP_OBJECT(<< 299.4302, -584.8925, 42.2629 >>, 100, "DES_hospitaldoors") IF DOES_RAYFIRE_MAP_OBJECT_EXIST(rfHospitalDoors) SET_STATE_OF_RAYFIRE_MAP_OBJECT(rfHospitalDoors, RFMO_STATE_RESET) iRayfireProgress_HospitalDoors++ CPRINTLN(DEBUG_MISSION, "RAYFIRE Hospital Doors Progress, DOES_RAYFIRE_MAP_OBJECT_EXIST and RFMO_STATE_RESET at playback time = ", fCurrentPlaybackTime) ELSE #IF IS_DEBUG_BUILD IF bDebug_OutputRayfireHospitalDoorsProgress CPRINTLN(DEBUG_MISSION, "RAYFIRE Hospital Doors Progress, in priming stage - Rayfire Object doesn't exist") ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF ELIF iRayfireProgress_HospitalDoors = 1 IF DOES_RAYFIRE_MAP_OBJECT_EXIST(rfHospitalDoors) IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rfHospitalDoors) = RFMO_STATE_PRIMED IF (fCurrentPlaybackTime >= NIGEL2_RAYFIRE_HOSPITAL_DOORS_TRIGGER_POINT) SET_STATE_OF_RAYFIRE_MAP_OBJECT(rfHospitalDoors, RFMO_STATE_START_ANIM) CPRINTLN(DEBUG_MISSION, "RAYFIRE Hospital Doors Progress, in start anim stage - Rayfire Object Anim Started", fCurrentPlaybackTime) iRayfireProgress_HospitalDoors++ ENDIF ELSE IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rfHospitalDoors) != RFMO_STATE_PRIMING SET_STATE_OF_RAYFIRE_MAP_OBJECT(rfHospitalDoors, RFMO_STATE_PRIMING) #IF IS_DEBUG_BUILD IF bDebug_OutputRayfireHospitalDoorsProgress CPRINTLN(DEBUG_MISSION, "RAYFIRE Hospital Doors Progress, priming") ENDIF #ENDIF ENDIF ENDIF ELSE #IF IS_DEBUG_BUILD IF bDebug_OutputRayfireHospitalDoorsProgress CPRINTLN(DEBUG_MISSION, "RAYFIRE Hospital Doors Progress, in start anim stage - Rayfire object no longer exists so going back to priming stage") ENDIF #ENDIF iRayfireProgress_HospitalDoors-- ENDIF /*ELIF iRayfireProgress_HospitalDoors = 2 // New building swap setup - commented out whilst window isn't working...also calling this here causes the interior to reset, so it's a visible stream issue IF DOES_RAYFIRE_MAP_OBJECT_EXIST(rfHospitalDoors) IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rfHospitalDoors) = RFMO_STATE_END // need to set the es building state to destroyed when after the rayfire has finished SET_BUILDING_STATE(BUILDINGNAME_ES_PILLBOX_HILL, BUILDINGSTATE_DESTROYED) // contains the rayfire for the front door iRayfireProgress_HospitalDoors++ #IF IS_DEBUG_BUILD IF bDebug_OutputRayfireHospitalDoorsProgress #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "RAYFIRE Hospital Doors Progress, rayfire ended - set BUILDINGNAME_ES_PILLBOX_HILL to BUILDINGSTATE_DESTROYED : pbtime = ", fCurrentPlaybackTime) ENDIF #ENDIF ENDIF #ENDIF ENDIF ELSE // need to set the es building state to destroyed when after the rayfire has finished SET_BUILDING_STATE(BUILDINGNAME_ES_PILLBOX_HILL, BUILDINGSTATE_DESTROYED) // contains the rayfire for the front door iRayfireProgress_HospitalDoors++ #IF IS_DEBUG_BUILD IF bDebug_OutputRayfireHospitalDoorsProgress #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "RAYFIRE Hospital Doors Progress, object doesn't exist - set BUILDINGNAME_ES_PILLBOX_HILL to BUILDINGSTATE_DESTROYED : pbtime = ", fCurrentPlaybackTime) ENDIF #ENDIF ENDIF #ENDIF ENDIF*/ ENDIF #IF IS_DEBUG_BUILD IF bDebug_OutputRayfireHospitalDoorsCurrentState IF DOES_RAYFIRE_MAP_OBJECT_EXIST(rfHospitalDoors) RAY_FIRE_MAP_OBJECT_STATE rfsTemp rfsTemp = GET_STATE_OF_RAYFIRE_MAP_OBJECT(rfHospitalDoors) SWITCH rfsTemp CASE RFMO_STATE_ANIMATING //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_ANIMATING = ", fCurrentPlaybackTime) ENDIF #ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_ANIMATING ") ENDIF #ENDIF BREAK CASE RFMO_STATE_END //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_END = ", fCurrentPlaybackTime) ENDIF #ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_END ") ENDIF #ENDIF BREAK CASE RFMO_STATE_ENDING //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_ENDING = ", fCurrentPlaybackTime) ENDIF #ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_ENDING ") ENDIF #ENDIF BREAK CASE RFMO_STATE_INIT //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_INIT = ", fCurrentPlaybackTime) ENDIF #ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_INIT ") ENDIF #ENDIF BREAK CASE RFMO_STATE_INVALID //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_INVALID = ", fCurrentPlaybackTime) ENDIF #ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_INVALID ") ENDIF #ENDIF BREAK CASE RFMO_STATE_PAUSE //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_PAUSE = ", fCurrentPlaybackTime) ENDIF #ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_PAUSE ") ENDIF #ENDIF BREAK CASE RFMO_STATE_PRIMED //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_PRIMED = ", fCurrentPlaybackTime) ENDIF #ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_PRIMED ") ENDIF #ENDIF BREAK CASE RFMO_STATE_PRIMING //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_PRIMING = ", fCurrentPlaybackTime) ENDIF #ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_PRIMING ") ENDIF #ENDIF BREAK CASE RFMO_STATE_RESET //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_RESET = ", fCurrentPlaybackTime) ENDIF #ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_RESET ") ENDIF #ENDIF BREAK CASE RFMO_STATE_RESUME //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_RESUME = ", fCurrentPlaybackTime) ENDIF #ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_RESUME ") ENDIF #ENDIF BREAK CASE RFMO_STATE_START //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_START = ", fCurrentPlaybackTime) ENDIF #ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_START ") ENDIF #ENDIF BREAK CASE RFMO_STATE_START_ANIM //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_START_ANIM = ", fCurrentPlaybackTime) ENDIF #ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_START_ANIM ") ENDIF #ENDIF BREAK CASE RFMO_STATE_STARTING //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_STARTING = ", fCurrentPlaybackTime) ENDIF #ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_STARTING ") ENDIF #ENDIF BREAK CASE RFMO_STATE_SYNC_ENDING //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_SYNC_ENDING = ", fCurrentPlaybackTime) ENDIF #ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_SYNC_ENDING ") ENDIF #ENDIF BREAK CASE RFMO_STATE_SYNC_STARTING //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_SYNC_STARTING = ", fCurrentPlaybackTime) ENDIF #ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - RFMO_STATE_SYNC_STARTING ") ENDIF #ENDIF BREAK DEFAULT //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - UNKNOWN = ", fCurrentPlaybackTime) ENDIF #ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "------- RAYFIRE HOSPITAL DOORS STATE - UNKNOWN ") ENDIF #ENDIF BREAK ENDSWITCH ENDIF ENDIF #ENDIF ENDIF ENDPROC /// PURPOSE: /// Handles requesting and triggering of audio in the hospital /// uses mission global var - fCurrentPlaybackTime PROC MANAGE_HOSPITAL_SOUND_FX() IF NOT bDone_RequestHospitalAudio IF (fCurrentPlaybackTime > (NIGEL2_RAYFIRE_HOSPITAL_DOORS_TRIGGER_POINT - 4000.0)) REQUEST_SCRIPT_AUDIO_BANK("NIGEL_02_CRASH_A") REQUEST_SCRIPT_AUDIO_BANK("NIGEL_02_CRASH_B") REQUEST_SCRIPT_AUDIO_BANK("PANIC_WALLA_INTERIOR") IF REQUEST_SCRIPT_AUDIO_BANK("NIGEL_02_CRASH_A") AND REQUEST_SCRIPT_AUDIO_BANK("NIGEL_02_CRASH_B") AND REQUEST_SCRIPT_AUDIO_BANK("PANIC_WALLA_INTERIOR") bDone_RequestHospitalAudio = TRUE //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "AUDIO BANKS LOADED FOR HOSPITAL AT ", fCurrentPlaybackTime) ENDIF #ENDIF ELSE //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "WAITING FOR AUDIO BANKS TO LOAD FOR HOSPITAL") ENDIF #ENDIF ENDIF ENDIF ELSE //sounds triggered by the vehicle driving through SWITCH iHospitalSoundFX_Progress CASE 0 IF (fCurrentPlaybackTime >= NIGEL2_RAYFIRE_HOSPITAL_DOORS_TRIGGER_POINT) PLAY_SOUND_FROM_COORD(-1,"DOOR_CRASH" , << 299.5664, -584.6757, 42.3020 >>, "NIGEL_02_SOUNDSET") #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " SFX - DOOR_CRASH TRIGGERED and walla") ENDIF #ENDIF iHospitalSoundFX_Progress++ ENDIF BREAK CASE 1 IF (fCurrentPlaybackTime >= NIGEL2_HOSPITAL_CRASH_SCREAMS_01_TRIGGER_POINT) PLAY_SOUND_FROM_COORD(-1, "SCREAMS", << 310.5149, -595.4158, 42.3020 >>, "NIGEL_02_SOUNDSET") FORCE_PED_PANIC_WALLA() // added in attempt to make the peds scream PLAY_SOUND_FROM_COORD(-1, "PANIC_WALLA", << 316.4345, -589.3902, 42.2919 >>, "NIGEL_02_SOUNDSET") // tuck shop area #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " SFX - SCREAMS 01 TRIGGERED") ENDIF #ENDIF iHospitalSoundFX_Progress++ ENDIF BREAK CASE 2 IF (fCurrentPlaybackTime >= NIGEL2_HOSPITAL_WALL_SMASH_01_TRIGGER_POINT) PLAY_SOUND_FROM_COORD(-1,"WALL_CRASH" , << 325.66, -589.01, 42.30 >>, "NIGEL_02_SOUNDSET") #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " SFX - WALL_CRASH 1 TRIGGERED") ENDIF #ENDIF iHospitalSoundFX_Progress++ ENDIF BREAK CASE 3 IF (fCurrentPlaybackTime >= NIGEL2_HOSPITAL_WALL_SMASH_02_TRIGGER_POINT) PLAY_SOUND_FROM_COORD(-1,"WALL_CRASH" , << 330.13, -585.72, 42.42 >>, "NIGEL_02_SOUNDSET") #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " SFX - WALL_CRASH 2 TRIGGERED") ENDIF #ENDIF iHospitalSoundFX_Progress++ ENDIF BREAK CASE 4 IF (fCurrentPlaybackTime >= NIGEL2_HOSPITAL_CRASH_SCREAMS_02_TRIGGER_POINT) PLAY_SOUND_FROM_COORD(-1, "SCREAMS", << 331.7845, -578.5184, 42.3167 >>, "NIGEL_02_SOUNDSET") PLAY_SOUND_FROM_COORD(-1, "PANIC_WALLA", <<354.6585, -584.2177, 42.3150>>, "NIGEL_02_SOUNDSET") // near window #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " SFX - SCREAMS 02 TRIGGERED") ENDIF #ENDIF iHospitalSoundFX_Progress++ ENDIF BREAK CASE 5 IF (fCurrentPlaybackTime >= NIGEL2_HOSPITAL_WALL_SMASH_03_TRIGGER_POINT) PLAY_SOUND_FROM_COORD(-1,"WALL_CRASH" , << 337.89, -582.38, 42.33 >>, "NIGEL_02_SOUNDSET") #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " SFX - WALL_CRASH 3 TRIGGERED") ENDIF #ENDIF iHospitalSoundFX_Progress++ ENDIF BREAK CASE 6 IF (fCurrentPlaybackTime >= NIGEL2_HOSPITAL_WINDOW_SMASH_TRIGGER_POINT) //NOTE: recording finishes before window so this value isn't exact. PLAY_SOUND_FROM_COORD(-1,"WINDOW_CRASH" , << 364.64, -595.43, 42.54 >>, "NIGEL_02_SOUNDSET") #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " SFX - WINDOW_CRASH TRIGGERED") ENDIF #ENDIF iHospitalSoundFX_Progress++ ENDIF BREAK DEFAULT BREAK ENDSWITCH ENDIF ENDPROC /// PURPOSE: /// Handles particle fx inside the hospital /// uses mission global var - fCurrentPlaybackTime PROC MANAGE_HOSPITAL_DEBRIS_EFFECT() FLOAT fTriggerTime = 115225.0 IF NOT bIsHospitalDebrisEffectActive IF NOT bHasPTFX_ForHospitalDebrisBeenRequested IF fCurrentPlaybackTime > (fTriggerTime - 5000.0) REQUEST_PTFX_ASSET() bHasPTFX_ForHospitalDebrisBeenRequested = TRUE ENDIF ELSE IF fCurrentPlaybackTime > fTriggerTime IF HAS_PTFX_ASSET_LOADED() IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(HospitalDebris_PTFX_ID) HospitalDebris_PTFX_ID = START_PARTICLE_FX_LOOPED_AT_COORD("scr_rcn2_ceiling_debris", << 325.0, -589.0, 45.0 >>, << 0.0, 0.0, 0.0 >>) //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PTFX EFFECT HOSPITAL DEBRIS STARTED") ENDIF #ENDIF bIsHospitalDebrisEffectActive = TRUE ENDIF ENDIF ENDIF IF NOT HAS_PTFX_ASSET_LOADED() REQUEST_PTFX_ASSET() //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "REQUESTING SCRIPT PTFX") ENDIF #ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Handle triggering the FX paper trail on Nigel's car when it jumps out the hospital window PROC MANAGE_HOSPITAL_JUMP_FX() IF NOT bDone_HospitalJumpPaperTrailFX FLOAT fTriggerTime = 115225.0 // wait until chase has got close to the hospital (using same value as debris FX) IF fCurrentPlaybackTime > (fTriggerTime) REQUEST_PTFX_ASSET() IF HAS_PTFX_ASSET_LOADED() IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(HospitalJump_PTFX_ID) IF GET_ENTITY_SPEED(sNigelVehicle.vehicle) > 8.0 IF IS_ENTITY_IN_ANGLED_AREA(sNigelVehicle.vehicle, <<368.910980,-599.172546,41.238842>>, <<366.015289,-596.099976,44.985764>>, 6.500000) //<<368.14462, -600.03833,40.5>>, <<365.451416,-595.751282,45.0>>, 6.500000, TRUE) HospitalJump_PTFX_ID = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_rcn2_debris_trail", sNigelVehicle.vehicle, << 0.0, -1.5, -0.4 >>, << 0.0, 0.0, 0.0 >>, 0.3) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_HOSPITAL_JUMP_FX : PTFX hospital jump started FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF bDone_HospitalJumpPaperTrailFX = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ELSE IF DOES_PARTICLE_FX_LOOPED_EXIST(HospitalJump_PTFX_ID) IF GET_ENTITY_SPEED(sNigelVehicle.vehicle) < 4.0 OR NOT IS_ENTITY_IN_ANGLED_AREA(sNigelVehicle.vehicle, <<368.910980,-599.172546,41.238842>>, <<366.015289,-596.099976,44.985764>>, 6.500000) STOP_PARTICLE_FX_LOOPED(HospitalJump_PTFX_ID) bDone_HospitalJumpPaperTrailFX = FALSE // TEMP! #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_HOSPITAL_JUMP_FX : PTFX hospital jump stopped FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// makes target vehicle use horn or show brake lights /// Helps to warn player of up coming hazards. Needs to be called every frame /// uses mission global var - fCurrentPlaybackTime PROC MANAGE_TARGET_BRAKING_AND_USING_HORN() //Brake lights IF (fCurrentPlaybackTime > 3000.0 AND fCurrentPlaybackTime < 3800.0) //first turn at start location down the highstreet OR (fCurrentPlaybackTime > 14750.0 AND fCurrentPlaybackTime < 15250.0) //left turn out of the highstreet OR (fCurrentPlaybackTime > 28500.0 AND fCurrentPlaybackTime < 29400.0) //swerve around on coming vehicle up the first hill section OR (fCurrentPlaybackTime > 34000.0 AND fCurrentPlaybackTime < 35250.0) //left turn toward tunnel entrance OR (fCurrentPlaybackTime > 38800.0 AND fCurrentPlaybackTime < 41000.0) //turn into tunnel OR (fCurrentPlaybackTime > 47000.0 AND fCurrentPlaybackTime < 48300.0) //right turn in the tunnel OR (fCurrentPlaybackTime > 56000.0 AND fCurrentPlaybackTime < 57200.0) //right turn out of tunnel section OR (fCurrentPlaybackTime > 66750.0 AND fCurrentPlaybackTime < 67250.0) //slight brake when taking the left turn just before the U turn OR (fCurrentPlaybackTime > 68500.0 AND fCurrentPlaybackTime < 70500.0) //going around truck on highway entrance. OR (fCurrentPlaybackTime > 101500.0 AND fCurrentPlaybackTime < 102500.0) //swerving around vehicle at slip road exit OR (fCurrentPlaybackTime > 114500.0 AND fCurrentPlaybackTime < 116500.0) //from hospital doors to first right turn. SET_VEHICLE_BRAKE_LIGHTS(sTargetVehicle.vehicle, TRUE) ENDIF //Horn IF (fCurrentPlaybackTime > 6500.0 AND fCurrentPlaybackTime < 7000.0) //shopping area, first stretch OR (fCurrentPlaybackTime > 7500.0 AND fCurrentPlaybackTime < 8500.0) //shopping area, first stretch OR (fCurrentPlaybackTime > 10500.0 AND fCurrentPlaybackTime < 11250.0) //shopping area, second stretch OR (fCurrentPlaybackTime > 11750.0 AND fCurrentPlaybackTime < 12250.0) //shopping area, first stretch OR (fCurrentPlaybackTime > 13250.0 AND fCurrentPlaybackTime < 13500.0) //shopping area, third stretch OR (fCurrentPlaybackTime > 14000.0 AND fCurrentPlaybackTime < 14500.0) //shopping area, first stretch SET_HORN_PERMANENTLY_ON(sTargetVehicle.vehicle) ENDIF ENDPROC /// PURPOSE: /// damage the target's vehicle when he crashes /// uses mission global var - fCurrentPlaybackTime PROC APPLY_VISUAL_DAMAGE_TO_TARGET_VEHICLE() IF NOT bDone_VisualDamageForTargetVehicle IF (fCurrentPlaybackTime > NIGEL2_TARGET_VEHICLE_VISUAL_DAMAGE_POINT) //B*1476195 - set Al Di Napoli health higher for this damage so it doesn't kill him. IF IS_PED_UNINJURED(sTargetPed.ped) IF (GET_ENTITY_HEALTH(sTargetPed.ped) < 200) SET_ENTITY_HEALTH(sTargetPed.ped, 200) ENDIF ENDIF IF IS_VEHICLE_OK(sTargetVehicle.vehicle) SET_ENTITY_HEALTH(sTargetVehicle.vehicle, 1000) IF NOT IS_VEHICLE_DOOR_DAMAGED(sTargetVehicle.vehicle, SC_DOOR_BONNET) SET_VEHICLE_DOOR_BROKEN(sTargetVehicle.vehicle, SC_DOOR_BONNET, TRUE) ENDIF SET_VEHICLE_TYRES_CAN_BURST(sTargetVehicle.vehicle, TRUE) //SET_VEHICLE_TYRE_BURST(sTargetVehicle.vehicle, SC_WHEEL_CAR_FRONT_LEFT) causes wheel to clip through the floor SMASH_VEHICLE_WINDOW(sTargetVehicle.vehicle, SC_WINDOW_FRONT_LEFT) SMASH_VEHICLE_WINDOW(sTargetVehicle.vehicle, SC_WINDOW_FRONT_RIGHT) //SET_VEHICLE_DIRT_LEVEL(sTargetVehicle.vehicle, 10.0) need proper colours setting up first. POP_OUT_VEHICLE_WINDSCREEN(sTargetVehicle.vehicle) SET_VEHICLE_DAMAGE(sTargetVehicle.vehicle, << 0.0, 1.0, 0.1 >>, 800.0, 1850.0, TRUE) SET_VEHICLE_DAMAGE(sTargetVehicle.vehicle, << -0.2, 1.0, 0.5 >>, 50.0, 650.0, TRUE) SET_VEHICLE_DAMAGE(sTargetVehicle.vehicle, << -0.7, -0.2, 0.3 >>, 50.0, 500.0, TRUE) CPRINTLN(DEBUG_MISSION, "VISUAL DAMAGE APPLIED TO TARGET VEHICLE FC = ", GET_FRAME_COUNT()) bDone_VisualDamageForTargetVehicle = TRUE ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// handles triggering the requested mission music events /// Since these cues need to be sequental, request event will only trigger if the previous event has triggered /// PARAMS: /// iMusicEvent - the event we want to trigger PROC MANAGE_TRIGGER_MUSIC_EVENTS_DURING_CHASE(INT iMusicEvent) IF NOT IS_REPLAY_BEING_SET_UP() // don't allow music events to trigger during replay setup / stage skips AND bFinishedStageSkipping IF iMusicEvent = iMissionMusicEventTriggerCounter SWITCH iMissionMusicEventTriggerCounter CASE NIGEL2_MUSIC_EVENT_START IF SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL2_START") iMissionMusicEventTriggerCounter++ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_TRIGGER_MUSIC_EVENTS_DURING_CHASE : ", "NIGEL2_START") ENDIF #ENDIF ENDIF BREAK CASE NIGEL2_MUSIC_EVENT_CAR IF SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL2_CAR") PREPARE_MUSIC_EVENT("NIGEL2_JUMP") iMissionMusicEventTriggerCounter++ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_TRIGGER_MUSIC_EVENTS_DURING_CHASE : ", "NIGEL2_CAR") ENDIF #ENDIF ENDIF BREAK CASE NIGEL2_MUSIC_EVENT_JUMP IF SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL2_JUMP", TRUE) iMissionMusicEventTriggerCounter++ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_TRIGGER_MUSIC_EVENTS_DURING_CHASE : ", "NIGEL2_JUMP") ENDIF #ENDIF ENDIF BREAK CASE NIGEL2_MUSIC_EVENT_STOP IF SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL2_STOP") iMissionMusicEventTriggerCounter++ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_TRIGGER_MUSIC_EVENTS_DURING_CHASE : ", "NIGEL2_STOP") ENDIF #ENDIF ENDIF BREAK DEFAULT BREAK ENDSWITCH ELSE //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_TRIGGER_MUSIC_EVENTS_DURING_CHASE : ERROR - iMusicEvent = ", iMusicEvent, " but iMissionMusicEventTriggerCounter = ", iMissionMusicEventTriggerCounter) ENDIF #ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// handles trigger correct music events after a skip has occured. Replay system sets it's own music scene which /// we can't interupr /// PARAMS: /// eCurrentStage - which mission stage we are returning to PROC SET_MUSIC_EVENTS_FOR_MISSION_STAGE_SKIPS(MISSION_STAGE eCurrentStage) SWITCH eCurrentStage CASE MISSION_STAGE_GET_CLOSE_TO_TARGET_FOR_CUTSCENE IF iMissionMusicEventTriggerCounter = NIGEL2_MUSIC_EVENT_START WHILE NOT SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL2_START") #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_MUSIC_EVENTS_FOR_MISSION_STAGE_SKIPS : MISSION_STAGE_GET_CLOSE_TO_TARGET_FOR_CUTSCENE ", "triggering NIGEL2_START", " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF WAIT(0) ENDWHILE iMissionMusicEventTriggerCounter++ ENDIF IF iMissionMusicEventTriggerCounter = NIGEL2_MUSIC_EVENT_CAR WHILE NOT SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL2_CAR") #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_MUSIC_EVENTS_FOR_MISSION_STAGE_SKIPS : MISSION_STAGE_GET_CLOSE_TO_TARGET_FOR_CUTSCENE ", "triggering NIGEL2_MUSIC_EVENT_CAR", " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF WAIT(0) ENDWHILE iMissionMusicEventTriggerCounter++ ENDIF IF iMissionMusicEventTriggerCounter = NIGEL2_MUSIC_EVENT_JUMP WHILE NOT SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL2_JUMP", TRUE) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_MUSIC_EVENTS_FOR_MISSION_STAGE_SKIPS : MISSION_STAGE_GET_CLOSE_TO_TARGET_FOR_CUTSCENE ", "triggering NIGEL2_MUSIC_EVENT_JUMP", " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF WAIT(0) ENDWHILE iMissionMusicEventTriggerCounter++ ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// set target's anim when recording ends and he has crashed PROC SET_TARGET_PLAY_HEAD_ON_WHEEL_ANIM(FLOAT fBlendInTime = NORMAL_BLEND_IN) IF IS_PED_UNINJURED(sTargetPed.ped) IF NOT IS_ENTITY_PLAYING_ANIM(sTargetPed.ped, "rcmnigel2", "die_horn") REQUEST_ANIM_DICT("rcmnigel2") IF HAS_ANIM_DICT_LOADED("rcmnigel2") TASK_PLAY_ANIM(sTargetPed.ped, "rcmnigel2", "die_horn", fBlendInTime, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME, 0.9) CPRINTLN(DEBUG_MISSION, "SET_TARGET_PLAY_HEAD_ON_WHEEL_ANIM - set this frame : ", GET_FRAME_COUNT()) ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// gets the target and his vehicle into position for the cutscene PROC SETUP_TARGET_FOR_CRASH() #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "in SETUP_TARGET_FOR_CRASH *****") ENDIF #ENDIF REQUEST_ANIM_DICT("rcmnigel2") //to play head on horn anim on target in truck IF IS_ENTITY_ALIVE(sTargetVehicle.vehicle) SET_VEHICLE_ON_GROUND_PROPERLY(sTargetVehicle.vehicle) REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(sTargetVehicle.vehicle) FREEZE_ENTITY_POSITION(sTargetVehicle.vehicle, TRUE) SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sTargetVehicle.vehicle, FALSE) SET_DISABLE_VEHICLE_ENGINE_FIRES(sTargetVehicle.vehicle, TRUE) SET_VEHICLE_ENGINE_ON(sTargetVehicle.vehicle, TRUE, TRUE) // B*1557148 - engine needs to be on for damage sfx SET_VEHICLE_AUDIO_BODY_DAMAGE_FACTOR(sTargetVehicle.vehicle, 1.0) // B*1557148 - make damage engine sound louder SET_VEHICLE_ENGINE_HEALTH(sTargetVehicle.vehicle, 0.0) // B*1069508 - Smoking engine is not visible until after the end cutscene #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SETUP_TARGET_FOR_CRASH - set target vehicle to 0.0 health *****") ENDIF #ENDIF // no longer need to set position as we'll use the last pos of the vehicle recording // NOTE: has the new position and quaternion values //FREEZE_ENTITY_POSITION(sTargetVehicle.vehicle, FALSE) //SET_ENTITY_COORDS(sTargetVehicle.vehicle, <<393.4298, -621.3337, 28.4891>>) //SET_ENTITY_QUATERNION(sTargetVehicle.vehicle, -0.0081, -0.0061, 0.7994, -0.6007) //FREEZE_ENTITY_POSITION(sTargetVehicle.vehicle, TRUE) ENDIF IF IS_PED_UNINJURED(sTargetPed.ped) SET_TARGET_PLAY_HEAD_ON_WHEEL_ANIM() //set Al Di Napoli health to low so he will die if shot. IF (GET_ENTITY_HEALTH(sTargetPed.ped) > 110) SET_ENTITY_HEALTH(sTargetPed.ped, 110) SET_PED_SUFFERS_CRITICAL_HITS(sTargetPed.ped, TRUE) ENDIF ENDIF //stop peds appearing at the crash site IF NOT IS_SPHERE_VISIBLE(<< 393.38, -617.53, 27.91 >>, 30.0) CLEAR_AREA_OF_PEDS(<< 393.38, -617.53, 27.91 >>, 35.0) CLEAR_AREA_OF_OBJECTS(<< 393.38, -617.53, 27.91 >>, 8.0) ENDIF ENDPROC /// PURPOSE: /// Changes the time scale and follow vehicle cam view mode, to force a cinematic camera shot /// for the jump out the hospital window /// PARAMS: /// bApplyChanges - if true time scale is slowed and cinematic cam applied /// if false time scale reset to 1.0 and third person cam applied PROC SET_CHANGES_FOR_FORCED_CINEMATIC_JUMP_OUT_HOSPITAL_WINDOW(BOOL bApplyChanges) IF bApplyChanges IF NOT DOES_CAM_EXIST(camHospitalJump) camHospitalJump = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE) ENDIF IF DOES_CAM_EXIST(camHospitalJump) RENDER_SCRIPT_CAMS(TRUE, FALSE) SET_CAM_COORD(camHospitalJump, vJumpOutHospitalCamCoords) //SET_CAM_DOF_STRENGTH(camHospitalJump, 0.2) SET_CAM_FOV(camHospitalJump, 14.0) POINT_CAM_AT_ENTITY(camHospitalJump, sNigelVehicle.vehicle, vJumpOutHospitalCamLookAtOffset) //, << 0.0,2.0,0.0 >>) ACTIVATE_AUDIO_SLOWMO_MODE("NIGEL_02_SLOWMO_SETTING") //SHAKE_SCRIPT_GLOBAL("HAND_SHAKE", 0.3) ENDIF //SET_FOLLOW_VEHICLE_CAM_VIEW_MODE(CAM_VIEW_MODE_CINEMATIC) /*SET_TIME_SCALE(0.5) IF IS_ENTITY_ALIVE(sNigelVehicle.vehicle) IF NOT IS_CINEMATIC_SHOT_ACTIVE(SHOTTYPE_HELI_CHASE) CREATE_CINEMATIC_SHOT(SHOTTYPE_HELI_CHASE, 30000, NULL, sNigelVehicle.vehicle) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_CHANGES_FOR_FORCED_CINEMATIC_JUMP_OUT_HOSPITAL_WINDOW : CREATE_CINEMATIC_SHOT, frame count : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF*/ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_CHANGES_FOR_FORCED_CINEMATIC_JUMP_OUT_HOSPITAL_WINDOW - TRUE") ENDIF #ENDIF ELSE STOP_SCRIPT_GLOBAL_SHAKING() IF DOES_CAM_EXIST(camHospitalJump) IF IS_CAM_ACTIVE(camHospitalJump) SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() SET_CAM_ACTIVE(camHospitalJump, FALSE) ENDIF DESTROY_CAM (camHospitalJump) ENDIF RENDER_SCRIPT_CAMS(FALSE, FALSE) //SET_FOLLOW_VEHICLE_CAM_VIEW_MODE(CAM_VIEW_MODE_THIRD_PERSON) /*IF IS_CINEMATIC_SHOT_ACTIVE(SHOTTYPE_HELI_CHASE) STOP_CINEMATIC_SHOT(SHOTTYPE_HELI_CHASE) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_CHANGES_FOR_FORCED_CINEMATIC_JUMP_OUT_HOSPITAL_WINDOW : STOP_CINEMATIC_SHOT, frame count : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF*/ SET_TIME_SCALE(1.0) DEACTIVATE_AUDIO_SLOWMO_MODE("NIGEL_02_SLOWMO_SETTING") bDoneOneTime_JumpOutHospitalWindow = TRUE #IF IS_DEBUG_BUILD // override for debug testing IF eMissionStage = MISSION_STAGE_DEBUG_HOPSITAL_DOORS bDoneOneTime_JumpOutHospitalWindow = FALSE ENDIF #ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_CHANGES_FOR_FORCED_CINEMATIC_JUMP_OUT_HOSPITAL_WINDOW - FALSE") ENDIF #ENDIF ENDIF ENDPROC /// PURPOSE: /// trigger scripted sfx for nigel vehicle landing PROC TRIGGER_LANDING_JUMP_SFX() IF bTriggerLandingFromJumpSFX IF IS_VEHICLE_OK(sNigelVehicle.vehicle) VECTOR vTemp = GET_ENTITY_COORDS(sNigelVehicle.vehicle, FALSE) IF vTemp.Z < 35.0 IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(sNigelVehicle.vehicle) OR IS_VEHICLE_ON_ALL_WHEELS(sNigelVehicle.vehicle) PLAY_SOUND_FROM_ENTITY(-1, "CAR_DROP_WRAP", sNigelVehicle.vehicle) bTriggerLandingFromJumpSFX = FALSE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TRIGGER_LANDING_JUMP_SFX - sfx triggered") ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// handles the player jumping out of the hospital window in a vehicle /// sets scripted camera and time scale override /// NOTE: doesn't check Nigel's vehicle is OK PROC MANAGE_JUMP_OUT_HOSPITAL_WINDOW() IF NOT bDoneOneTime_JumpOutHospitalWindow // only do this first time player jumps out the window - gets set FALSE in SET_CHANGES_FOR_FORCED_CINEMATIC_JUMP_OUT_HOSPITAL_WINDOW when set FALSE IF IS_VEHICLE_OK(sNigelVehicle.vehicle) IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sNigelVehicle.vehicle) //managed forced cinematic cam and sloowed time during hospital jump IF NOT IS_ENTITY_IN_ANGLED_AREA(sNigelVehicle.vehicle, <<373.288605,-580.871033,37.239483>>, <<359.660248,-605.220703,29.138260>>, 20.000000) // B*1538706 - exclusion area under window on platform AND (IS_ENTITY_IN_ANGLED_AREA(sNigelVehicle.vehicle, vCinematicCamOverrideZone01, vCinematicCamOverrideZone02, fCimematicCamOvverideZoneDepth) OR IS_ENTITY_IN_ANGLED_AREA(sNigelVehicle.vehicle, <<370.705353,-596.143677,45.439484>>, <<361.383423,-600.700012,33.239487>>, 6.000000)) // B*1533197 MANAGE_TRIGGER_MUSIC_EVENTS_DURING_CHASE(NIGEL2_MUSIC_EVENT_JUMP) IF bDoneCleanup_JumpOutHospitalWindow SET_CHANGES_FOR_FORCED_CINEMATIC_JUMP_OUT_HOSPITAL_WINDOW(TRUE) KILL_CHASE_HINT_CAM(localChaseHintCamStruct) // B*1557320 - don't allow hint cam during this shot (renabled by main loop checking bDoneCleanup_JumpOutHospitalWindow = true bDoneCleanup_JumpOutHospitalWindow = FALSE bTriggerLandingFromJumpSFX = TRUE // allow custom sfx to trigger for vehicle landing on the floor fTimeScale_HospitalJump = 1.0 // set initial value REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOWEST) // B*1841676 - record the jump out of the hospital window ENDIF IF bStatTracker_IsNigelVehicleDamageStatActive // stop tracking when you jump out the window INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL,NI2_VEHICLE_DAMAGE) // end tracking nigel's vehicle damage for stats bStatTracker_IsNigelVehicleDamageStatActive = FALSE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_JUMP_OUT_HOSPITAL_WINDOW - INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL)") ENDIF #ENDIF ENDIF // jump area - bottom of window Z height 42.4, road below Z height 27.9 / dist = 14.5 halfway 35.15 VECTOR vVehicleCoords = GET_ENTITY_COORDS(sNigelVehicle.vehicle) FLOAT fDesiredMinTimeScale = 0.2 // 0.5 #IF IS_DEBUG_BUILD IF bDebug_OverrideMinTimeScale fDesiredMinTimeScale = fDebug_OverrideMinTimeScale ENDIF #ENDIF FLOAT fTimeScaleStepDecrease = 0.9 #IF IS_DEBUG_BUILD IF bDebug_OverrideTimeScaleStepModifier_Decrease fTimeScaleStepDecrease = fDebug_TimeScaleStep_ModifierDecrease ENDIF #ENDIF FLOAT fTimeScaleStepIncrease = 2.0 #IF IS_DEBUG_BUILD IF bDebug_OverrideTimeScaleStepModifier_Increase fTimeScaleStepIncrease = fDebug_TimeScaleStep_ModifierIncrease ENDIF #ENDIF // ramp the time scale down to 0.5 as we fly out the window IF vVehicleCoords.z > 35.25 IF fTimeScale_HospitalJump > fDesiredMinTimeScale fTimeScale_HospitalJump = fTimeScale_HospitalJump -@ fTimeScaleStepDecrease // cap to 0.5 IF fTimeScale_HospitalJump < fDesiredMinTimeScale fTimeScale_HospitalJump = fDesiredMinTimeScale ENDIF SET_TIME_SCALE(fTimeScale_HospitalJump) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_JUMP_OUT_HOSPITAL_WINDOW - ramping time scale down = ", fTimeScale_HospitalJump) ENDIF #ENDIF ENDIF // when we approach the ground ramp the time scale back up to 1.0 ELIF vVehicleCoords.z < 35.0 IF fTimeScale_HospitalJump < 1.0 fTimeScale_HospitalJump = fTimeScale_HospitalJump +@ fTimeScaleStepIncrease // cap to 1.0 IF fTimeScale_HospitalJump > 1.0 fTimeScale_HospitalJump = 1.0 ENDIF SET_TIME_SCALE(fTimeScale_HospitalJump) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_JUMP_OUT_HOSPITAL_WINDOW - ramping time scale up = ", fTimeScale_HospitalJump) ENDIF #ENDIF ENDIF ENDIF // fallen on roof of hospital entrance IF vVehicleCoords.z < 40.0 IF IS_VEHICLE_ON_ALL_WHEELS(sNigelVehicle.vehicle) IF NOT bDoneCleanup_JumpOutHospitalWindow SET_CHANGES_FOR_FORCED_CINEMATIC_JUMP_OUT_HOSPITAL_WINDOW(FALSE) REPLAY_STOP_EVENT() // B*1841676 - cleanup the record jump out of the hospital window bDoneCleanup_JumpOutHospitalWindow = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_JUMP_OUT_HOSPITAL_WINDOW - bDoneCleanup_JumpOutHospitalWindow veh landed on all wheels whilst still in the activation area") ENDIF #ENDIF ENDIF ENDIF ENDIF ELSE IF NOT bDoneCleanup_JumpOutHospitalWindow SET_CHANGES_FOR_FORCED_CINEMATIC_JUMP_OUT_HOSPITAL_WINDOW(FALSE) REPLAY_STOP_EVENT() // B*1841676 - cleanup the record jump out of the hospital window bDoneCleanup_JumpOutHospitalWindow = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_JUMP_OUT_HOSPITAL_WINDOW - bDoneCleanup_JumpOutHospitalWindow done") ENDIF #ENDIF ENDIF ENDIF ELSE IF NOT bDoneCleanup_JumpOutHospitalWindow SET_CHANGES_FOR_FORCED_CINEMATIC_JUMP_OUT_HOSPITAL_WINDOW(FALSE) REPLAY_STOP_EVENT() // B*1841676 - cleanup the record jump out of the hospital window bTriggerLandingFromJumpSFX = FALSE // skip in this instance bDoneCleanup_JumpOutHospitalWindow = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_JUMP_OUT_HOSPITAL_WINDOW - bDoneCleanup_JumpOutHospitalWindow early for player not sat in nigel's vehicle being wrecked") ENDIF #ENDIF ENDIF ENDIF ELSE IF NOT bDoneCleanup_JumpOutHospitalWindow SET_CHANGES_FOR_FORCED_CINEMATIC_JUMP_OUT_HOSPITAL_WINDOW(FALSE) REPLAY_STOP_EVENT() // B*1841676 - cleanup the record jump out of the hospital window bTriggerLandingFromJumpSFX = FALSE // skip in this instance bDoneCleanup_JumpOutHospitalWindow = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_JUMP_OUT_HOSPITAL_WINDOW - bDoneCleanup_JumpOutHospitalWindow early for nigel's vehicle being wrecked") ENDIF #ENDIF ENDIF ENDIF ENDIF TRIGGER_LANDING_JUMP_SFX() ENDPROC /// PURPOSE: /// Sets up the vehicle parked nearby to the outro for the player to use on mission passed PROC CREATE_VEHICLE_FOR_PLAYER_TO_USE_ON_MISSION_PASSED(BOOL bWaitForModelToLoad = FALSE, BOOL UseUberRecordingToDetermineSpawnTime = TRUE) IF NOT DOES_ENTITY_EXIST(sVehicleForPlayerOnMissionPassed.vehicle) FLOAT fSpawnTimeInUberRecording_Min = 115000.0 // which is just after NIGEL2_RAYFIRE_HOSPITAL_DOORS_TRIGGER_POINT FLOAT fSpawnTimeInUberRecording_Max = 116821 //if we are using the uber recording to decide the spawn time, exit if we are too early to start requesting the model IF UseUberRecordingToDetermineSpawnTime IF fCurrentPlaybackTime < (fSpawnTimeInUberRecording_Min - 3000.0) EXIT ENDIF ENDIF REQUEST_MODEL(sVehicleForPlayerOnMissionPassed.model) IF bWaitForModelToLoad WHILE NOT HAS_MODEL_LOADED(sVehicleForPlayerOnMissionPassed.model) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CREATE_VEHICLE_FOR_PLAYER_TO_USE_ON_MISSION_PASSED - LOADING VEHICLE ASSET") ENDIF #ENDIF WAIT(0) ENDWHILE ENDIF //if we are using the uber recording to decide the spawn time, exit if we are too early or late to create the vehicle IF UseUberRecordingToDetermineSpawnTime IF fCurrentPlaybackTime < fSpawnTimeInUberRecording_Min // which is just after NIGEL2_RAYFIRE_HOSPITAL_DOORS_TRIGGER_POINT OR fCurrentPlaybackTime > fSpawnTimeInUberRecording_Max EXIT ENDIF ENDIF IF HAS_MODEL_LOADED(sVehicleForPlayerOnMissionPassed.model) sVehicleForPlayerOnMissionPassed.vehicle = CREATE_VEHICLE(sVehicleForPlayerOnMissionPassed.model, <<419.3891, -604.8867, 27.7732>>, 0) #IF IS_DEBUG_BUILD TEXT_LABEL tDebugName = "PlayerVMP" SET_VEHICLE_NAME_DEBUG(sVehicleForPlayerOnMissionPassed.vehicle, tDebugName) #ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CREATE_VEHICLE_FOR_PLAYER_TO_USE_ON_MISSION_PASSED - VEHICLE CREATED") ENDIF #ENDIF ENDIF IF IS_VEHICLE_OK(sVehicleForPlayerOnMissionPassed.vehicle) SET_MODEL_AS_NO_LONGER_NEEDED(sVehicleForPlayerOnMissionPassed.model) SET_ENTITY_QUATERNION(sVehicleForPlayerOnMissionPassed.vehicle, 0.0000, 0.0006, 0.9996, -0.0275) SET_VEHICLE_DOORS_LOCKED(sVehicleForPlayerOnMissionPassed.vehicle, VEHICLELOCK_UNLOCKED) ENDIF ENDIF ENDPROC /// PURPOSE: /// The cars around the start of the uber chase, have to be scripted because the don't start in time /// PARAMS: /// fLocalMainPlaybackSpeed - basically takes the value of fCurrentPlaybackTime /// vPlayerCurrentPos - used for cleanup PROC UPDATE_SCRIPTED_VEHICLES_AROUND_START_LOCATION(FLOAT fLocalMainPlaybackSpeed, VECTOR vPlayerCurrentPos) FLOAT fDistFromScriptedVehicle //truck IF IS_VEHICLE_OK(sStartLocationVehicle[0].vehicle) //Set hazard lights on SET_VEHICLE_INDICATOR_LIGHTS(sStartLocationVehicle[0].vehicle, TRUE, TRUE) SET_VEHICLE_INDICATOR_LIGHTS(sStartLocationVehicle[0].vehicle, FALSE, TRUE) //cleanup IF fCurrentPlaybackTime > 10000.0 //wait until car chase has gone past the start area fDistFromScriptedVehicle = VDIST2(GET_ENTITY_COORDS(sStartLocationVehicle[0].vehicle), vPlayerCurrentPos) IF fDistFromScriptedVehicle > 14400.0 //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANED UP SCRIPTED VEHICLE [0]") ENDIF #ENDIF SAFE_REMOVE_VEHICLE(sStartLocationVehicle[0].vehicle) ENDIF ENDIF ENDIF //parked car IF IS_VEHICLE_OK(sStartLocationVehicle[1].vehicle) //cleanup IF fCurrentPlaybackTime > 10000.0 //wait until car chase has gone past the start area fDistFromScriptedVehicle = VDIST2(GET_ENTITY_COORDS(sStartLocationVehicle[1].vehicle), vPlayerCurrentPos) IF fDistFromScriptedVehicle > 14400.0 //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANED UP SCRIPTED VEHICLE [1]") ENDIF #ENDIF SAFE_REMOVE_VEHICLE(sStartLocationVehicle[1].vehicle) ENDIF ENDIF ENDIF //car which pulls out on target to force him down highstreet IF IS_VEHICLE_OK(sStartLocationVehicle[2].vehicle) IF sDefaultPedForScriptedVehicle.eState = SPS_INIT REQUEST_MODEL(mnDefaultPedForVehicle) IF HAS_MODEL_LOADED(mnDefaultPedForVehicle) IF NOT DOES_ENTITY_EXIST(sDefaultPedForScriptedVehicle.ped) sDefaultPedForScriptedVehicle.ped = CREATE_PED_INSIDE_VEHICLE(sStartLocationVehicle[2].vehicle, PEDTYPE_MISSION, mnDefaultPedForVehicle) SET_MODEL_AS_NO_LONGER_NEEDED(mnDefaultPedForVehicle) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sDefaultPedForScriptedVehicle.ped, TRUE) sDefaultPedForScriptedVehicle.eState = SPS_BEGIN_ROUTINE ENDIF ENDIF IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sStartLocationVehicle[2].vehicle) //have to redo this as CREATE_PED_INSIDE_VEHICLE interfers with vehicle quaternion SET_ENTITY_QUATERNION(sStartLocationVehicle[2].vehicle, 0.0269, 0.0079, -0.4791, 0.8773) ENDIF ENDIF IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sStartLocationVehicle[2].vehicle) IF NOT bStartedPlayBack_ScriptedVehicleAtStartLocation IF fCurrentPlaybackTime >= 200.0 START_PLAYBACK_RECORDED_VEHICLE(sStartLocationVehicle[2].vehicle, 2, sNigel2_UberRecordingName) SET_PLAYBACK_SPEED(sStartLocationVehicle[2].vehicle, fLocalMainPlaybackSpeed) //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "~~~~~~~~~~ STARTED VEHICLE PLAYBACK AT TIME = ", fCurrentPlaybackTime) ENDIF #ENDIF bStartedPlayBack_ScriptedVehicleAtStartLocation = TRUE ENDIF ENDIF ELSE SET_PLAYBACK_SPEED(sStartLocationVehicle[2].vehicle, fLocalMainPlaybackSpeed) IF NOT bDone_StartLocationVehicleHorn IF fCurrentPlaybackTime > 3500.0 AND fCurrentPlaybackTime < 4500.0 START_VEHICLE_HORN(sStartLocationVehicle[2].vehicle, 2000, GET_HASH_KEY("HELDDOWN")) bDone_StartLocationVehicleHorn = TRUE ENDIF ENDIF ENDIF //cleanup IF fCurrentPlaybackTime > 10000.0 //wait until car chase has gone past the start area fDistFromScriptedVehicle = VDIST2(GET_ENTITY_COORDS(sStartLocationVehicle[2].vehicle), vPlayerCurrentPos) IF fDistFromScriptedVehicle > 14400.0 IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sStartLocationVehicle[2].vehicle) STOP_PLAYBACK_RECORDED_VEHICLE(sStartLocationVehicle[2].vehicle) ENDIF REMOVE_VEHICLE_RECORDING(2, sNigel2_UberRecordingName) //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CLEANED UP SCRIPTED VEHICLE [2]") ENDIF #ENDIF SET_MODEL_AS_NO_LONGER_NEEDED(mnDefaultPedForVehicle) SAFE_REMOVE_PED(sDefaultPedForScriptedVehicle.ped) SAFE_REMOVE_VEHICLE(sStartLocationVehicle[2].vehicle) ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// requests the assets for the outro mocap cutscene entities so SET_CUTSCENE_PED_COMPONENT_VARIATION_... can be called PROC SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP() IF IS_ENTITY_ALIVE(sNigelPed.ped) IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED(sSceneHandle_Nigel, sNigelPed.ped) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP - set Nigel - Frame Count : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF IF IS_ENTITY_ALIVE(sMrsThornhillPed.ped) IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED(sSceneHandle_MrsThornhill, sMrsThornhillPed.ped) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP - set Mrs Thornhill - Frame Count : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF IF IS_ENTITY_ALIVE(sTargetPed.ped) IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED(sSceneHandle_AlDiNapoli, sTargetPed.ped) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP - set Al Di Napoli - Frame Count : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// handles requesting mocap on player approach and releasing outro mocap if player moves away PROC MANAGE_OUTRO_MOCAP_LOADING() VECTOR vMocapPosition = <<392.9445, -619.5032, 27.9764>> IF IS_COORD_IN_RANGE_OF_COORD(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMocapPosition, DEFAULT_CUTSCENE_LOAD_DIST) IF NOT IS_PLAYER_CHANGING_CLOTHES() REQUEST_CUTSCENE(tlOutroMocapName) SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP() bRequestedOutroMocap = TRUE ENDIF ELSE IF bRequestedOutroMocap IF NOT IS_COORD_IN_RANGE_OF_COORD(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMocapPosition, DEFAULT_CUTSCENE_UNLOAD_DIST) IF HAS_CUTSCENE_LOADED() REMOVE_CUTSCENE() bRequestedOutroMocap = FALSE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_OUTRO_MOCAP_LOADING - unloaded ", tlOutroMocapName, " Frame Count : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ELSE SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP() ENDIF ENDIF ENDIF // B*1521921 - have to bin off the mocap if requested to start over IF bRequestedOutroMocap IF IS_PLAYER_CHANGING_CLOTHES() REMOVE_CUTSCENE() bRequestedOutroMocap = FALSE CPRINTLN(DEBUG_MISSION, "MANAGE_OUTRO_MOCAP_LOADING - unloaded ", tlOutroMocapName, " player changing clothes! Frame Count : ", GET_FRAME_COUNT()) ENDIF ENDIF ENDPROC /// PURPOSE: /// Changes the mission's current stage /// PARAMS: /// msStage - the mission stage PROC SET_STAGE(MISSION_STAGE msStage) emissionStage = msStage eSubStage = SS_SETUP ENDPROC /// PURPOSE: /// sets the initial values for all the variables used on the mission /// also sets up relationship groups PROC SET_MISSION_VARIABLES() INT i FOR i = 0 TO (NIGEL2_TOTAL_IMPORTANT_DIALOGUE_DURING_CHASE - 1) bDoneDialogue_Chase[i] = FALSE ENDFOR FOR i = 0 TO (NIGEL2_TOTAL_BANTER_DIALOGUE_DURING_CHASE - 1) bDoneDialogue_BanterChase[i] = FALSE ENDFOR FOR i = 0 TO (NIGEL2_TOTAL_CATCH_UP_DIALOGUE_DURING_CHASE - 1) bDoneDialogue_CatchUp[i] = FALSE ENDFOR bDoneDialogue_InitialInstruction = FALSE bDoneDialogue_WarnRamming = FALSE bDoneObjective_WarnLeavingNigelAndMrsT = FALSE bDoneDialogue_UpsideDownOrAirbourne = FALSE bDoneObjective_GetBackInVehicle = FALSE bDoneDialogue_TrevorGetsWantedLevel = FALSE bDoneDialogue_CopsSeenChasing = FALSE bDoneDialogue_DrivingOnWrongSideRoad = FALSE bDone_UberRecordingCleanupForChaseEnd = FALSE bDone_TargetStartChaseRoute = FALSE bDone_PlayerInNigelVehicle_FirstTime = FALSE bDoneObjective_Initial_GetInNigelsVehicle = FALSE FOR i = 0 TO (NIGEL2_TOTAL_DIALOGUE_LINES_GET_IN_NIGEL_CAR - 1) bDoneDialogue_GetInNigelsVehicle[i] = FALSE ENDFOR bIsHospitalDebrisEffectActive = FALSE bHasPTFX_ForHospitalDebrisBeenRequested = FALSE //bDoneObjective_WaitForNigelAndMrsT = FALSE bIsImportantDialoguePlaying = FALSE bIsInterruptDialoguePlaying = FALSE bStartedPlayBack_ScriptedVehicleAtStartLocation = FALSE //bTracker_SeemlessCameraTransition = FALSE bStatTracker_HasPlayerKeptCloseToDiNapoli = TRUE bStatTracker_IsNigelVehicleDamageStatActive = FALSE bStatTracker_HasPlayerInjuredPedWhilstInHospital = FALSE //bSetHospital_IPL_InteriorLoadedState = FALSE FOR i = 0 TO (NIGEL2_TOTAL_UBER_VEHICLE_HORNS_TO_PROCESS - 1) bDone_UberVehicleHorn[i] = FALSE ENDFOR bDone_StartLocationVehicleHorn = FALSE bDone_TurnEngineOnForPlayer = FALSE bDoneCleanup_JumpOutHospitalWindow = TRUE bDoneOneTime_JumpOutHospitalWindow = FALSE bDone_RequestHospitalAudio = FALSE bDone_KillConvoForOutTheVehicleDialogue = FALSE bHadToFadeOutToLoadMissionAssets = FALSE bDone_VisualDamageForTargetVehicle = FALSE bDone_HospitalJumpPaperTrailFX = FALSE bDone_UpdateTrashTruckPedModel = FALSE bDone_UpdateBMXPedModel = FALSE bHasSetExitStateFromOutroMocapForGameplayCam = FALSE bRequestedOutroMocap = FALSE bForceTargetblipFlashThisFrame = FALSE bSetNigelVehicleHDForMocapExit = FALSE bTriggerLandingFromJumpSFX = FALSE eN2_MissionFailedReason = FAILED_DEFAULT //used in Script_Failed() to see if a fail reason needs displaying iTriggerScriptedPedestriansTimer = 0 iPreLoadRecordingsTimer = 0 iUpdateUberVehicleTweaksTimer = 0 iMissionMusicEventTriggerCounter = 0 iTimer_NigelVehicleStuckOnRoofFail = 0 iRayfireProgress_HospitalDoors = 0 iTimer_DialogueDelay = 0 iHospitalSoundFX_Progress = 0 iTimer_TrevorGetBackInCarDialogue = 0 iTimer_NigelVehicleJumpsTimer = 0 iSoundID_UberVehicleFakeRevs = -1 // initialise to -1 so I can test when a sound_id has been assigned iMainCarRecID = 1 // 1 iScenarioBlockingAreaStage = 0 fCurrentChaseDistance = 0.0 fCurrentPlaybackTime = 0.0 //fMainPlaybackSpeed = 1.0 // moved - initial set when uber recording beings fCimematicCamOvverideZoneDepth = 20.750000 fDistPlayerToNigelVehicle = 0.0 vCinematicCamOverrideZone01 = <<368.571442,-594.946655,45.542202>> vCinematicCamOverrideZone02 = <<389.501495,-614.127930,29.618>> // get the coords being used for the building swaps //BUILDING_DATA_STRUCT sTempBuildingData //GET_BUILDING_DATA(sTempBuildingData, BUILDINGNAME_IPL_PILLBOX_HILL) //vCoords_IPL_PILLBOX_HILL = sTempBuildingData.coords //GET_BUILDING_DATA(sTempBuildingData, BUILDINGNAME_IPL_PILLBOX_HILL_INTERIOR) //vCoords_IPL_PILLBOX_HILL_INTERIOR = sTempBuildingData.coords eHospitalInteriorState = HIS_SET_INTERIOR_IPLS_FOR_CHASE //tl23_CurrentConversation = "NULL" //two uber models // sStartLocationVehicle[0].model = BOXVILLE3 //Compilation fix. BOXVILLE3 removed from project. Ben R sStartLocationVehicle[0].model = BOXVILLE2 sStartLocationVehicle[1].model = WASHINGTON sStartLocationVehicle[2].model = WASHINGTON sVehicleForPlayerOnMissionPassed.model = SULTAN mnDefaultPedForVehicle = A_M_Y_BUSINESS_01 //same as one of the start location peds to cut memory also used by ped on foot near start area mnDoctorMale = S_M_M_Doctor_01 mnScrubsFemale = S_F_Y_Scrubs_01 mnFemaleStartArea = A_F_Y_BevHills_03 sTargetVehicle.model = DUBSTA // DUBSTA doesn't fit through hospital window currently sTargetVehicle.vSpawn = << -1290.73, -634.603, 26.1004 >> // from uber recording sTargetVehicle.fSpawnHeading = 126.961 // QUATERNION -0.0248, 0.0004, 0.8949, 0.4456 for uber chase (don't reset this now as you see a movement) rotation << -0.453279, 2.26519, 126.961 >> sNigelVehicle.model = GET_NIGEL_VEHICLE_MODEL() sNigelVehicle.vSpawn = << -1304.01, -644.58, 25.91 >> // << -1303.42, -644.04, 25.89 >> //had to tweak position because of crate causing pad rumble sNigelVehicle.fSpawnHeading = 127.67 // 128.45 sTargetPed.model = GET_AL_DI_NAPOLI_PED_MODEL() sTargetPed.vSpawn = << -1290.0477, -631.4590, 25.6863 >> sTargetPed.fSpawnHeading = 121.5060 sMrsThornhillPed.model = GET_NPC_PED_MODEL(CHAR_MRS_THORNHILL) sMrsThornhillPed.vSpawn = << -1309.61, -640.33, 26.53 >> sMrsThornhillPed.fSpawnHeading = -124.00 sNigelPed.model = GET_NPC_PED_MODEL(CHAR_NIGEL) sNigelPed.vSpawn = << -1310.24, -640.19, 26.53 >> sNigelPed.fSpawnHeading = -73.78 sObjectHospitalDoors.vPos = << 299.48, -584.84, 41.445 >> sObjectHospitalDoors.vRot = << 0.00, 0.00, -20.00 >> sObjectHospitalDoors.modelName = PROP_HOSPITALDOORS_START eHospitalDoorsObjectState = HDO_CREATE vJumpOutHospitalCamCoords = << 394.5, -619.1, 28.2 >> vJumpOutHospitalCamLookAtOffset = << 0.0, 0.0, 0.0 >> ADD_RELATIONSHIP_GROUP("ENEMIES", relGroupEnemy) relGroupFriendly = GET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID()) //ADD_RELATIONSHIP_GROUP("FRIENDLIES", relGroupFriendly) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relGroupEnemy, RELGROUPHASH_PLAYER) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, relGroupEnemy) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relGroupEnemy, relGroupFriendly) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relGroupFriendly, relGroupEnemy) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupFriendly, RELGROUPHASH_PLAYER) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, relGroupFriendly) ENDPROC /// PURPOSE: /// Initialization of the mission PROC INIT_MISSION() SET_MISSION_VARIABLES() #IF IS_DEBUG_BUILD SETUP_MISSION_WIDGET() //this needs setting up first to ensure debug print can be displayed when loading assets // stage skipping mSkipMenu[Z_SKIP_INTRO_MOCAP].sTxtLabel = "Mocap: NMT_2_RCM" mSkipMenu[Z_SKIP_START_CHASE].sTxtLabel = "Chase after the Al Di Napoli" mSkipMenu[Z_SKIP_PARK_CAR_NEXT_TO_TARGET].sTxtLabel = "Park alongside Al Di Napoli" mSkipMenu[Z_SKIP_OUTRO_CUTSCENE].sTxtLabel = "Mocap: NMT_2_MCS_2" mSkipMenu[Z_SKIP_MISSION_PASSED].sTxtLabel = "Mission Passed" #ENDIF //INFORM_MISSION_STATS_OF_MISSION_START_NIGEL_2() ADD_CONTACT_TO_PHONEBOOK(CHAR_NIGEL, TREVOR_BOOK, FALSE) SET_WANTED_LEVEL_MULTIPLIER(0.2) //ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE) ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, FALSE) ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE) ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, FALSE) ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE) SET_AGGRESSIVE_HORNS(TRUE) DISABLE_TAXI_HAILING(TRUE) // don't allow taxis on mission REGISTER_SCRIPT_WITH_AUDIO() SET_START_CHECKPOINT_AS_FINAL() // tells replay controller to display "skip mission" for shitskips ENDPROC //----------------------------------------------------------------------------------------------------- -------------------------------------------- // Script Terminated Functions //------------------------------------------------------------------------------------------------------------------------------------------------- /// PURPOSE: /// Deletes all of the blips used in the mission, checking if they exist. PROC DELETE_ALL_MISSION_BLIPS() SAFE_REMOVE_BLIP(sTargetPed.blip) SAFE_REMOVE_BLIP(sNigelVehicle.blip) SAFE_REMOVE_BLIP(sNigelPed.blip) SAFE_REMOVE_BLIP(sMrsThornhillPed.blip) ENDPROC /// PURPOSE: /// Removes all the assets loaded by the mission, used in mission cleanup and reset mission functions. /// PARAMS: /// bClearTextSlots - if true CLEAR_ADDITIONAL_TEXT will be called for MISSION_TEXT_SLOT PROC UNLOAD_ALL_MISSION_ASSETS(BOOL bClearTextSlots = TRUE) INT i = 0 //hospital interior IF IS_VALID_INTERIOR(HospitalInteriorIndex) IF IS_INTERIOR_READY(HospitalInteriorIndex) SET_INTERIOR_ACTIVE(HospitalInteriorIndex, FALSE) UNPIN_INTERIOR(HospitalInteriorIndex) ENDIF ENDIF //rayfire hospital doors IF DOES_RAYFIRE_MAP_OBJECT_EXIST(rfHospitalDoors) IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(rfHospitalDoors) != RFMO_STATE_END SET_STATE_OF_RAYFIRE_MAP_OBJECT(rfHospitalDoors, RFMO_STATE_ENDING) ENDIF ENDIF //uber recording stuff REMOVE_VEHICLE_RECORDING(iMainCarRecID, sNigel2_UberRecordingName) //main car REMOVE_VEHICLE_RECORDING(2, sNigel2_UberRecordingName) //used by sStartLocationVehicle[2].vehicle REMOVE_VEHICLE_RECORDING(1, sNigel2_CarRecNigelOutro) // used to make Nigel blend out the outro mocap as he drives away REMOVE_ALL_CAR_RECORDINGS_FOR_UBER_CHASE() CLEANUP_UBER_PLAYBACK() //hospital debris cleanup IF DOES_PARTICLE_FX_LOOPED_EXIST(HospitalDebris_PTFX_ID) STOP_PARTICLE_FX_LOOPED(HospitalDebris_PTFX_ID) ENDIF IF DOES_PARTICLE_FX_LOOPED_EXIST(HospitalJump_PTFX_ID) STOP_PARTICLE_FX_LOOPED(HospitalJump_PTFX_ID) ENDIF REMOVE_PTFX_ASSET() IF IS_VEHICLE_OK(sTargetVehicle.vehicle) REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(sTargetVehicle.vehicle) ENDIF IF IS_AUDIO_SCENE_ACTIVE("NIGEL_02_CHASE") STOP_AUDIO_SCENE("NIGEL_02_CHASE") //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UNLOAD_ALL_MISSION_ASSETS : STOP_AUDIO_SCENE : NIGEL_02_CHASE ", "***") ENDIF #ENDIF ENDIF RELEASE_SOUND_ID(iSoundID_UberVehicleFakeRevs) RELEASE_SCRIPT_AUDIO_BANK() UNREGISTER_SCRIPT_WITH_AUDIO() REMOVE_ANIM_DICT("rcmnigel2") SET_MODEL_AS_NO_LONGER_NEEDED(sObjectHospitalDoors.modelName) SET_MODEL_AS_NO_LONGER_NEEDED(sTargetVehicle.model) SET_MODEL_AS_NO_LONGER_NEEDED(sNigelVehicle.model) SET_MODEL_AS_NO_LONGER_NEEDED(sTargetPed.model) SET_MODEL_AS_NO_LONGER_NEEDED(sMrsThornhillPed.model) SET_MODEL_AS_NO_LONGER_NEEDED(sNigelPed.model) SET_MODEL_AS_NO_LONGER_NEEDED(mnDefaultPedForVehicle) SET_MODEL_AS_NO_LONGER_NEEDED(mnDoctorMale) SET_MODEL_AS_NO_LONGER_NEEDED(mnScrubsFemale) SET_MODEL_AS_NO_LONGER_NEEDED(mnFemaleStartArea) REPEAT NIGEL2_TOTAL_START_AREA_SCRIPTED_VEHICLES i SET_MODEL_AS_NO_LONGER_NEEDED(sStartLocationVehicle[i].model) ENDREPEAT SET_MODEL_AS_NO_LONGER_NEEDED(sVehicleForPlayerOnMissionPassed.model) IF bClearTextSlots CLEAR_ADDITIONAL_TEXT(MISSION_TEXT_SLOT, TRUE) ENDIF ENDPROC /// PURPOSE: /// Deletes all of the mission entities checking if they exist /// Used in Mission Failed, when faded out. /// PARAMS: /// bDelete - if true all entities will be deleted, else released PROC CLEANUP_ALL_MISSION_ENTITIES(BOOL bDelete = FALSE) INT i = 0 REPEAT TOTAL_HOSPITAL_PEDS i SAFE_REMOVE_PED(sHospitalPedSimple[i].ped, bDelete) ENDREPEAT REPEAT TOTAL_START_AREA_PEDS i SAFE_REMOVE_PED(sStartAreaPedSimple[i].ped, bDelete) ENDREPEAT //SAFE_REMOVE_PED(sDogPedSimple.ped) IF IS_ENTITY_ALIVE(sTargetPed.ped) SET_ENTITY_LOAD_COLLISION_FLAG(sTargetPed.ped, FALSE) //unsure if this is needed, might be costly? IF NOT IS_PED_INJURED(sTargetPed.ped) SET_PED_KEEP_TASK(sTargetPed.ped, TRUE) ENDIF ENDIF SET_PED_MODEL_IS_SUPPRESSED(sTargetPed.model, FALSE) SAFE_REMOVE_PED(sTargetPed.ped, bDelete) SET_PED_MODEL_IS_SUPPRESSED(sMrsThornhillPed.model, FALSE) IF IS_PED_UNINJURED(sMrsThornhillPed.ped) SET_PED_KEEP_TASK(sMrsThornhillPed.ped, TRUE) ENDIF SAFE_REMOVE_PED(sMrsThornhillPed.ped, bDelete) SET_PED_MODEL_IS_SUPPRESSED(sNigelPed.model, FALSE) IF IS_PED_UNINJURED(sNigelPed.ped) SET_PED_KEEP_TASK(sNigelPed.ped, TRUE) ENDIF SAFE_REMOVE_PED(sNigelPed.ped, bDelete) SAFE_DELETE_OBJECT(sObjectHospitalDoors.objectIndex) IF IS_VEHICLE_OK(sNigelVehicle.vehicle) SET_VEHICLE_CAN_LEAK_OIL(sNigelVehicle.vehicle, TRUE) SET_VEHICLE_CAN_LEAK_PETROL(sNigelVehicle.vehicle, TRUE) SET_DISABLE_PRETEND_OCCUPANTS(sNigelVehicle.vehicle, TRUE) // reset flag once player is in the vehice IF bSetNigelVehicleHDForMocapExit SET_FORCE_HD_VEHICLE(sNigelVehicle.vehicle, FALSE) // B*1546501 - stops vehicle pop after mocap bSetNigelVehicleHDForMocapExit = FALSE ENDIF ENDIF IF DOES_ENTITY_EXIST(sNigelVehicle.vehicle) REMOVE_VEHICLE_UPSIDEDOWN_CHECK(sNigelVehicle.vehicle) ENDIF SAFE_REMOVE_VEHICLE(sNigelVehicle.vehicle, bDelete) IF IS_VEHICLE_OK(sTargetVehicle.vehicle) SET_ENTITY_PROOFS(sTargetVehicle.vehicle, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE) // B*1954082 - stop window smash during transition to cutscene RESETTING SET_DISABLE_VEHICLE_ENGINE_FIRES(sTargetVehicle.vehicle, FALSE) SET_VEHICLE_CAN_LEAK_OIL(sTargetVehicle.vehicle, TRUE) SET_VEHICLE_CAN_LEAK_PETROL(sTargetVehicle.vehicle, TRUE) SET_DISABLE_PRETEND_OCCUPANTS(sTargetVehicle.vehicle, TRUE) IF bDone_UberRecordingCleanupForChaseEnd SET_VEHICLE_ENGINE_HEALTH(sTargetVehicle.vehicle, 0.0) ENDIF ENDIF SAFE_REMOVE_VEHICLE(sTargetVehicle.vehicle, bDelete) REPEAT NIGEL2_TOTAL_START_AREA_SCRIPTED_VEHICLES i SAFE_REMOVE_VEHICLE(sStartLocationVehicle[i].vehicle, bDelete) ENDREPEAT SAFE_REMOVE_VEHICLE(sVehicleForPlayerOnMissionPassed.vehicle, bDelete) SAFE_REMOVE_PED(sDefaultPedForScriptedVehicle.ped, bDelete) ENDPROC /// PURPOSE: /// Mission cleanup /// PARAMS: /// bDeleteAll - if TRUE all entities are deleted, else released /// bClearTextSlots - if TRUE CLEAR_ADDITIONAL_TEXT on MISSION_TEXT_SLOT PROC MISSION_CLEANUP(BOOL bDeleteAll = FALSE, BOOL bClearTextSlots = TRUE) INT i CLEAR_PRINTS() IF IS_HELP_MESSAGE_BEING_DISPLAYED() CLEAR_HELP(TRUE) ENDIF KILL_ANY_CONVERSATION() SET_WANTED_LEVEL_MULTIPLIER(1.0) DISABLE_CELLPHONE(FALSE) //RENDER_SCRIPT_CAMS(FALSE, FALSE) //this brakes my interpolate camera when mission ends normally. RC_END_CUTSCENE_MODE() STOP_SCRIPT_GLOBAL_SHAKING() SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE) SET_CHANGES_FOR_FORCED_CINEMATIC_JUMP_OUT_HOSPITAL_WINDOW(FALSE) IF NOT bDoneCleanup_JumpOutHospitalWindow REPLAY_STOP_EVENT() // B*1841676 - cleanup the record jump out of the hospital window ENDIF //reset roads and peds SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<-1415.903931,-732.548889,17.545492>>, <<-1236.628174,-601.026489,31.153446>>, 23.000000) // match with values when turned on - intro SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<418.283752,-571.662903,24.697943>>, <<362.025787,-663.139771,38.339985>>, 28.000000) //match with values when turned on - outro // turn back on road from Road leading to tunnel exit SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<-668.363464,-658.380066,27.433815>>, <<-440.021973,-657.423767,40.251266>>, 40.000000) // cover exit from tunnel SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<< -1409.34351, -756.38098, 17.59896 >>, << -1239.14758, -587.12195, 31.25266 >>, TRUE) // match with values when turned on - intro SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<< 341.2, -645.83, 25.0 >>, << 429.1, -572.89, 35.0 >>, TRUE) // match with values when turned on - outro REMOVE_SCENARIO_BLOCKING_AREA(scenarioBlockingIntroArea) REMOVE_SCENARIO_BLOCKING_AREA(scenarioBlockingOutroArea) FOR i = 0 TO (NIGEL2_TOTAL_SCENARIO_BLOCKING_AREAS_CHASE_ROUTE - 1) REMOVE_SCENARIO_BLOCKING_AREA(scenarioBlockingChaseRoute[i]) ENDFOR SET_PED_PATHS_BACK_TO_ORIGINAL(<< -1318.50049, -678.88257, 23.0 >>, << -1296.62781, -631.54492, 28.0 >>) // intro SET_PED_PATHS_BACK_TO_ORIGINAL(<< -496.28848, -681.55994, 25.0 >>, << -481.59882, -668.74115, 38.0 >>) // chase - second pedestrian area SET_PED_PATHS_BACK_TO_ORIGINAL(<< -463.21530, -829.04749, 22.48120 >>, << -445.46454, -813.10107, 36.56588 >>) // chase - entrance to car park SET_PED_PATHS_BACK_TO_ORIGINAL(<< 341.2, -645.83, 25.0 >>, << 429.1, -572.89, 35.0 >>) // outro CLEAR_PED_NON_CREATION_AREA() SET_AGGRESSIVE_HORNS(FALSE) DISABLE_TAXI_HAILING(FALSE) IF NOT IS_REPLAY_BEING_SET_UP() // don't allow music events to trigger during replay setup / stage skips AND bFinishedStageSkipping SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL2_MISSION_FAIL") ENDIF IF IS_PLAYER_PLAYING(PLAYER_ID()) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_ForceDirectEntry, FALSE) // reset flag for ensure player uses direct door access as per bug 1044490 ENDIF IF DOES_CAM_EXIST(camHospitalJump) SET_CAM_ACTIVE(camHospitalJump, FALSE) DESTROY_CAM(camHospitalJump) ENDIF WAIT_FOR_CUTSCENE_TO_STOP() REMOVE_PED_FOR_DIALOGUE(sDialogue, 2) // "TREVOR" REMOVE_PED_FOR_DIALOGUE(sDialogue, 3) // "DINAPOLI" REMOVE_PED_FOR_DIALOGUE(sDialogue, 4) // "NIGEL" REMOVE_PED_FOR_DIALOGUE(sDialogue, 5) // "MRSTHORNHILL" KILL_CHASE_HINT_CAM(localChaseHintCamStruct) SET_FOLLOW_VEHICLE_CAM_VIEW_MODE(CAM_VIEW_MODE_THIRD_PERSON) SET_TIME_SCALE(1.0) REMOVE_RELATIONSHIP_GROUP(relGroupEnemy) //REMOVE_RELATIONSHIP_GROUP(relGroupFriendly) no longer doing this to resolve B*512565 SET_VEHICLE_MODEL_IS_SUPPRESSED(sNigelVehicle.model, FALSE) SET_VEHICLE_MODEL_IS_SUPPRESSED(sTargetVehicle.model, FALSE) DELETE_ALL_MISSION_BLIPS() CLEANUP_ALL_MISSION_ENTITIES(bDeleteAll) UNLOAD_ALL_MISSION_ASSETS(bClearTextSlots) IF eMissionStage = MISSION_STAGE_MISSION_PASSED SET_BUILDING_STATE(BUILDINGNAME_IPL_PILLBOX_HILL, BUILDINGSTATE_CLEANUP, TRUE) // set the building swaps to the intial state #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_CLEANUP - set building swaps BUILDINGNAME_IPL_PILLBOX_HILL -> BUILDINGSTATE_CLEANUP with delay for leave area") ENDIF #ENDIF SET_BUILDING_STATE(BUILDINGNAME_IPL_PILLBOX_HILL_INTERIOR, BUILDINGSTATE_DESTROYED, TRUE) // unloaded version of the interior #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_CLEANUP - set building swaps BUILDINGNAME_IPL_PILLBOX_HILL_INTERIOR -> BUILDINGSTATE_DESTROYED with delay for leave area") ENDIF #ENDIF SET_BUILDING_STATE(BUILDINGNAME_ES_PILLBOX_HILL, BUILDINGSTATE_CLEANUP, TRUE) // boarded up doors state #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_CLEANUP - set building swaps BUILDINGNAME_ES_PILLBOX_HILL -> BUILDINGSTATE_CLEANUP ith delay for leave area") ENDIF #ENDIF ELSE SET_BUILDING_STATE(BUILDINGNAME_IPL_PILLBOX_HILL, BUILDINGSTATE_NORMAL) // set the building swaps to the intial state #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_CLEANUP - set building swaps BUILDINGNAME_IPL_PILLBOX_HILL -> BUILDINGSTATE_NORMAL") ENDIF #ENDIF SET_BUILDING_STATE(BUILDINGNAME_IPL_PILLBOX_HILL_INTERIOR, BUILDINGSTATE_DESTROYED) // unloaded version of the interior #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_CLEANUP - set building swaps BUILDINGNAME_IPL_PILLBOX_HILL_INTERIOR -> BUILDINGSTATE_DESTROYED") ENDIF #ENDIF SET_BUILDING_STATE(BUILDINGNAME_ES_PILLBOX_HILL, BUILDINGSTATE_DESTROYED) // contains the rayfire for the front door #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_CLEANUP - set building swaps BUILDINGNAME_ES_PILLBOX_HILL -> BUILDINGSTATE_DESTROYED (default) since mission was failed") ENDIF #ENDIF ENDIF /*// release new load scene IF eHospitalInteriorState = HIS_ACTIVE_NEW_LOAD_SCENE_AT_INTERIOR OR eHospitalInteriorState = HIS_CLEANUP_NEW_LOAD_SCENE_AT_INTERIOR IF IS_NEW_LOAD_SCENE_ACTIVE() NEW_LOAD_SCENE_STOP() CPRINTLN(DEBUG_MISSION, "MISSION_CLEANUP : NEW_LOAD_SCENE_STOP() : FC = ", GET_FRAME_COUNT()) ENDIF ENDIF*/ #IF IS_DEBUG_BUILD CLEANUP_MISSION_WIDGETS() STOP_RECORDING_ALL_VEHICLES() SET_DEBUG_ACTIVE(FALSE) SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE) #ENDIF CPRINTLN(DEBUG_MISSION, "MISSION_CLEANUP - done") ENDPROC /// PURPOSE: /// Handles call to MISSION_CLEANUP and terminates the thread PROC Script_Cleanup() // Ensure launcher is cleaned up RC_CLEANUP_LAUNCHER() // If the mission was triggered then additional mission cleanup will be required. IF (Random_Character_Cleanup_If_Triggered()) PRINTSTRING("...Random Character Script was triggered so additional cleanup required") PRINTNL() MISSION_CLEANUP() ENDIF //Cleanup the scene created by the launcher RC_CleanupSceneEntities(sRCLauncherDataLocal) TERMINATE_THIS_THREAD() ENDPROC /// PURPOSE: /// Mission Passed PROC Script_Passed() IF HAS_TIME_PASSED(iTimer_MissionPassedDelay, 1000) // shorten once this veh rec is working! CPRINTLN(DEBUG_MISSION, "Script_Passed()") IF IS_PED_UNINJURED(sNigelPed.ped) AND IS_VEHICLE_OK(sNigelVehicle.vehicle) IF IS_PED_IN_VEHICLE(sNigelPed.ped, sNigelVehicle.vehicle) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sNigelVehicle.vehicle) STOP_PLAYBACK_RECORDED_VEHICLE(sNigelVehicle.vehicle) REMOVE_VEHICLE_RECORDING(1, sNigel2_CarRecNigelOutro) ENDIF IF NOT IsPedPerformingTask(sNigelPed.ped, SCRIPT_TASK_VEHICLE_DRIVE_WANDER) //SET_VEHICLE_ENGINE_ON(sNigelVehicle.vehicle, TRUE, TRUE) //SET_VEHICLE_FORWARD_SPEED(sNigelVehicle.vehicle, 30) TASK_VEHICLE_DRIVE_WANDER(sNigelPed.ped, sNigelVehicle.vehicle, 60.0, DRIVINGMODE_AVOIDCARS) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sNigelPed.ped, TRUE) SET_PED_KEEP_TASK(sNigelPed.ped, TRUE) CPRINTLN(DEBUG_MISSION, "Script_Passed - set Nigel with wander task - Frame Count : ", GET_FRAME_COUNT()) ENDIF ENDIF ENDIF SAFE_FADE_SCREEN_IN_FROM_BLACK() Random_Character_Passed(CP_RAND_C_NIG2) Script_Cleanup() ELSE CPRINTLN(DEBUG_MISSION, "Script_Passed() delay for Nigel driving") ENDIF ENDPROC /// PURPOSE: /// updates the reason for mission failed /// in order of most important fail reason so if multiple fails conditions have been set, we use the most important PROC UPDATE_FAIL_REASON() IF DOES_ENTITY_EXIST(sNigelPed.ped) AND DOES_ENTITY_EXIST(sMrsThornhillPed.ped) IF IS_ENTITY_DEAD(sNigelPed.ped) OR IS_PED_INJURED(sNigelPed.ped) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_NIGEL_DIED") ENDIF #ENDIF eN2_MissionFailedReason = FAILED_NIGEL_DIED EXIT ENDIF IF IS_ENTITY_DEAD(sMrsThornhillPed.ped) OR IS_PED_INJURED(sMrsThornhillPed.ped) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_MRS_THORNHILL_DIED") ENDIF #ENDIF eN2_MissionFailedReason = FAILED_MRS_THORNHILL_DIED EXIT ENDIF IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sNigelPed.ped, PLAYER_PED_ID()) CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID()) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_NIGEL_ATTACKED") ENDIF #ENDIF eN2_MissionFailedReason = FAILED_NIGEL_ATTACKED EXIT ENDIF IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sMrsThornhillPed.ped, PLAYER_PED_ID()) CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID()) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_MRS_THORNHILL_ATTACKED") ENDIF #ENDIF eN2_MissionFailedReason = FAILED_MRS_THORNHILL_ATTACKED EXIT ENDIF ENDIF IF DOES_ENTITY_EXIST(sTargetPed.ped) IF IS_ENTITY_DEAD(sTargetPed.ped) OR IS_PED_INJURED(sTargetPed.ped) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_TARGET_DIED") ENDIF #ENDIF eN2_MissionFailedReason = FAILED_TARGET_DIED EXIT ELSE //Kill off Di Napoli, if his vehicle is set on fire IF DOES_ENTITY_EXIST(sTargetVehicle.vehicle) IF NOT IS_ENTITY_DEAD(sTargetVehicle.vehicle) AND IS_ENTITY_ON_FIRE(sTargetVehicle.vehicle) EXPLODE_VEHICLE(sTargetVehicle.vehicle) ENDIF ENDIF ENDIF ENDIF IF DOES_ENTITY_EXIST(sNigelVehicle.vehicle) //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "NIGEL VEHICLE IS_VEHICLE_STUCK_ON_ROOF CHECKED ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^") ENDIF #ENDIF IF IS_ENTITY_DEAD(sNigelVehicle.vehicle) OR IS_ENTITY_IN_WATER(sNigelVehicle.vehicle) OR NOT IS_VEHICLE_DRIVEABLE(sNigelVehicle.vehicle) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_NIGEL_VEHICLE_WRECKED") ENDIF #ENDIF eN2_MissionFailedReason = FAILED_NIGEL_VEHICLE_WRECKED EXIT ELSE IF eMissionStage != MISSION_STAGE_INTRO_MOCAP_SCENE // don't worry during the mocaps // setup a grace period for this to fix instant fail, B*1080979 IF IS_VEHICLE_STUCK_ON_ROOF(sNigelVehicle.vehicle) IF HAS_TIME_PASSED(iTimer_NigelVehicleStuckOnRoofFail, 3000) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - stuck on the roof FAILED_NIGEL_VEHICLE_WRECKED") ENDIF #ENDIF eN2_MissionFailedReason = FAILED_NIGEL_VEHICLE_WRECKED EXIT ENDIF ELSE iTimer_NigelVehicleStuckOnRoofFail = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF //if one of these fails has already been set, don't worry about retesting it IF eN2_MissionFailedReason = FAILED_LEFT_NIGEL_AND_MRS_T_BEHIND OR eN2_MissionFailedReason = FAILED_LEFT_NIGEL_BEHIND OR eN2_MissionFailedReason = FAILED_LEFT_MRS_T_BEHIND OR eN2_MissionFailedReason = FAILED_TARGET_ESCAPED EXIT ENDIF IF eMissionStage = MISSION_STAGE_CHASE_TARGET_IN_VEHICLE OR eMissionStage = MISSION_STAGE_GET_CLOSE_TO_TARGET_FOR_CUTSCENE //check for target escaping / left behind IF IS_PED_UNINJURED(sTargetPed.ped) IF fCurrentChaseDistance > NIGEL2_TARGET_ESCAPED_DISTANCE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_TARGET_ESCAPED") ENDIF #ENDIF eN2_MissionFailedReason = FAILED_TARGET_ESCAPED EXIT ENDIF // B*1513201 - when target goes down the tunnel and player doesn't follow // needs to match up with MANAGE_DIALOGUE_DURING_CHASE IF fCurrentPlaybackTime > 50000.0 // 40000.0 // enter tunnel AND fCurrentPlaybackTime < 58000.0 // exit tunnel IF bDoneDialogue_WrongWaySpecialFail OR NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sNigelVehicle.vehicle) IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-668.363464,-658.380066,27.433815>>, <<-440.021973,-657.423767,40.251266>>, 40.000000) // smaller area covering exit #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_TARGET_ESCAPED") ENDIF #ENDIF eN2_MissionFailedReason = FAILED_TARGET_ESCAPED EXIT ENDIF ENDIF ENDIF ENDIF //check if the player leaves Nigel and Mrs Thornhill behind IF IS_VEHICLE_OK(sNigelVehicle.vehicle) AND IS_ENTITY_ALIVE(sNigelPed.ped) AND IS_ENTITY_ALIVE(sMrsThornhillPed.ped) VECTOR vTempPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) // check for player leaving Nigel or Mrs Thornhill behind on foot IF NOT IS_PED_SITTING_IN_VEHICLE(sNigelPed.ped, sNigelVehicle.vehicle) IF NOT IS_PED_SITTING_IN_VEHICLE(sMrsThornhillPed.ped, sNigelVehicle.vehicle) // nigel and mrs T out of the vehicle IF NOT bDoneObjective_WarnLeavingNigelAndMrsT IF NOT IS_ENTITY_IN_RANGE_COORDS(sNigelPed.ped, vTempPlayerPos, PLAYER_LEFT_NIGEL_AND_MRS_T_WARN_DISTANCE) OR NOT IS_ENTITY_IN_RANGE_COORDS(sMrsThornhillPed.ped, vTempPlayerPos, PLAYER_LEFT_NIGEL_AND_MRS_T_WARN_DISTANCE) KILL_ANY_CONVERSATION() PRINT_NOW("NIGEL2_08", DEFAULT_GOD_TEXT_TIME, 1) // Return to ~b~Nigel~s~ and ~b~Mrs Thornhill.~s~ bDoneObjective_WarnLeavingNigelAndMrsT = TRUE ENDIF ELSE IF IS_ENTITY_IN_RANGE_COORDS(sNigelPed.ped, vTempPlayerPos, RESET_LEFT_NIGEL_AND_MRS_T_WARN_DISTANCE) AND IS_ENTITY_IN_RANGE_COORDS(sMrsThornhillPed.ped, vTempPlayerPos, RESET_LEFT_NIGEL_AND_MRS_T_WARN_DISTANCE) IF IS_THIS_PRINT_BEING_DISPLAYED("NIGEL2_08") CLEAR_THIS_PRINT("NIGEL2_08") // Return to ~b~Nigel~s~ and ~b~Mrs Thornhill.~s~ ENDIF bDoneObjective_WarnLeavingNigelAndMrsT = FALSE ELIF NOT IS_ENTITY_IN_RANGE_COORDS(sNigelPed.ped, vTempPlayerPos, PLAYER_LEFT_NIGEL_AND_MRS_T_BEHIND_DISTANCE) AND NOT IS_ENTITY_IN_RANGE_COORDS(sMrsThornhillPed.ped, vTempPlayerPos, PLAYER_LEFT_NIGEL_AND_MRS_T_BEHIND_DISTANCE) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_LEFT_NIGEL_AND_MRS_T_BEHIND on foot") ENDIF #ENDIF eN2_MissionFailedReason = FAILED_LEFT_NIGEL_AND_MRS_T_BEHIND EXIT ENDIF ENDIF ELSE // just Nigel out of the vehicle IF NOT bDoneObjective_WarnLeavingNigelAndMrsT IF NOT IS_ENTITY_IN_RANGE_COORDS(sNigelPed.ped, vTempPlayerPos, PLAYER_LEFT_NIGEL_AND_MRS_T_WARN_DISTANCE) KILL_ANY_CONVERSATION() PRINT_NOW("NIGEL2_05", DEFAULT_GOD_TEXT_TIME, 1) // Return to ~b~Nigel.~s~ bDoneObjective_WarnLeavingNigelAndMrsT = TRUE ENDIF ELSE IF IS_ENTITY_IN_RANGE_COORDS(sNigelPed.ped, vTempPlayerPos, RESET_LEFT_NIGEL_AND_MRS_T_WARN_DISTANCE) IF IS_THIS_PRINT_BEING_DISPLAYED("NIGEL2_05") CLEAR_THIS_PRINT("NIGEL2_05") // Return to ~b~Nigel.~s~ ENDIF bDoneObjective_WarnLeavingNigelAndMrsT = FALSE ELIF NOT IS_ENTITY_IN_RANGE_COORDS(sNigelPed.ped, vTempPlayerPos, PLAYER_LEFT_NIGEL_AND_MRS_T_BEHIND_DISTANCE) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_LEFT_NIGEL_BEHIND on foot") ENDIF #ENDIF eN2_MissionFailedReason = FAILED_LEFT_NIGEL_BEHIND EXIT ENDIF ENDIF ENDIF ELIF NOT IS_PED_SITTING_IN_VEHICLE(sMrsThornhillPed.ped, sNigelVehicle.vehicle) // just mrs T out of the vehicle IF NOT bDoneObjective_WarnLeavingNigelAndMrsT IF NOT IS_ENTITY_IN_RANGE_COORDS(sMrsThornhillPed.ped, vTempPlayerPos, PLAYER_LEFT_NIGEL_AND_MRS_T_WARN_DISTANCE) KILL_ANY_CONVERSATION() PRINT_NOW("NIGEL2_09", DEFAULT_GOD_TEXT_TIME, 1) // Return to ~b~Mrs. Thornhill.~s~ bDoneObjective_WarnLeavingNigelAndMrsT = TRUE ENDIF ELSE IF IS_ENTITY_IN_RANGE_COORDS(sMrsThornhillPed.ped, vTempPlayerPos, RESET_LEFT_NIGEL_AND_MRS_T_WARN_DISTANCE) IF IS_THIS_PRINT_BEING_DISPLAYED("NIGEL2_09") CLEAR_THIS_PRINT("NIGEL2_09") // Return to ~b~Mrs. Thornhill.~s~ ENDIF bDoneObjective_WarnLeavingNigelAndMrsT = FALSE ELIF NOT IS_ENTITY_IN_RANGE_COORDS(sMrsThornhillPed.ped, vTempPlayerPos, PLAYER_LEFT_NIGEL_AND_MRS_T_BEHIND_DISTANCE) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_LEFT_MRS_T_BEHIND on foot") ENDIF #ENDIF eN2_MissionFailedReason = FAILED_LEFT_MRS_T_BEHIND EXIT ENDIF ENDIF ELSE // if player leaves Nigel and Mrs Thornhill in the car IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sNigelVehicle.vehicle) VECTOR vTempGetNigelVehiclePos = GET_ENTITY_COORDS(sNigelVehicle.vehicle) fDistPlayerToNigelVehicle = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), vTempGetNigelVehiclePos) //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "dist between player and nigel Vehicle = ", fDistPlayerToNigelVehicle) ENDIF #ENDIF IF NOT bDoneObjective_WarnLeavingNigelAndMrsT IF fDistPlayerToNigelVehicle > PLAYER_LEFT_NIGEL_AND_MRS_T_WARN_DISTANCE KILL_ANY_CONVERSATION() PRINT_NOW("NIGEL2_08", DEFAULT_GOD_TEXT_TIME, 1) // Return to ~b~Nigel~s~ and ~b~Mrs Thornhill.~s~ bDoneObjective_WarnLeavingNigelAndMrsT = TRUE ENDIF ELSE IF fDistPlayerToNigelVehicle > PLAYER_LEFT_NIGEL_AND_MRS_T_BEHIND_DISTANCE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_LEFT_NIGEL_AND_MRS_T_BEHIND in the car") ENDIF #ENDIF eN2_MissionFailedReason = FAILED_LEFT_NIGEL_AND_MRS_T_BEHIND EXIT ELIF fDistPlayerToNigelVehicle < RESET_LEFT_NIGEL_AND_MRS_T_WARN_DISTANCE IF IS_THIS_PRINT_BEING_DISPLAYED("NIGEL2_08") CLEAR_THIS_PRINT("NIGEL2_08") // Return to ~b~Nigel~s~ and ~b~Mrs Thornhill.~s~ ENDIF bDoneObjective_WarnLeavingNigelAndMrsT = FALSE ENDIF ENDIF //seperate check if Al Di Napoli is in crashed state and the player ditches nigel's vehicle in the hospital to approach him on foot. IF bDone_UberRecordingCleanupForChaseEnd IF (fCurrentChaseDistance < 35.0) //distance from crashed Al di Napoli to just outside hospital window IF IS_VEHICLE_INSIDE_HOSPITAL_INTERIOR(sNigelVehicle.vehicle) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed Checks - FAILED_LEFT_NIGEL_AND_MRS_T_BEHIND") ENDIF #ENDIF eN2_MissionFailedReason = FAILED_LEFT_NIGEL_AND_MRS_T_BEHIND EXIT ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// cycles through the conditions to see if the player has failed PROC MISSION_FAILED_CHECKS() // don't allow mission failed checks during stage skips IF bFinishedStageSkipping IF eMissionStage != MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE // don't do the checks if we are already in the waiting for fade during fail stage AND eMissionStage != MISSION_STAGE_INTRO_MOCAP_SCENE AND eMissionStage != MISSION_STAGE_END_CUTSCENE_MOCAP AND eMissionStage != MISSION_STAGE_MISSION_PASSED UPDATE_FAIL_REASON() IF eN2_MissionFailedReason <> FAILED_DEFAULT SET_STAGE(MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE) ENDIF ENDIF ENDIF ENDPROC //------------------------------------------------------------------------------------------------------------------------------------------------- // Mission Setup //------------------------------------------------------------------------------------------------------------------------------------------------- /// PURPOSE: /// handles all the mission asset requests /// PARAMS: /// bWaitForAssetsToLoad - if true game waits for all requests to be loaded PROC LOAD_MISSION_ASSETS(BOOL bWaitForAssetsToLoad = FALSE) REQUEST_ADDITIONAL_TEXT("NIGEL2", MISSION_TEXT_SLOT) REQUEST_VEHICLE_RECORDING(iMainCarRecID, sNigel2_UberRecordingName) //main uber recording REQUEST_MODEL(sTargetVehicle.model) REQUEST_MODEL(sNigelVehicle.model) REQUEST_MODEL(sTargetPed.model) REQUEST_MODEL(sMrsThornhillPed.model) REQUEST_MODEL(sNigelPed.model) REQUEST_MODEL(sStartLocationVehicle[0].model) REQUEST_MODEL(sStartLocationVehicle[1].model) REQUEST_MODEL(sStartLocationVehicle[2].model) REQUEST_VEHICLE_RECORDING(2, sNigel2_UberRecordingName) //vehicle at start which pulls out on target vehicle //wait until loaded IF bWaitForAssetsToLoad WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT) OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(iMainCarRecID, sNigel2_UberRecordingName) //MAIN CAR FOR UBER RECORDING OR NOT HAS_MODEL_LOADED(sTargetVehicle.model) OR NOT HAS_MODEL_LOADED(sNigelVehicle.model) OR NOT HAS_MODEL_LOADED(sTargetPed.model) OR NOT HAS_MODEL_LOADED(sMrsThornhillPed.model) OR NOT HAS_MODEL_LOADED(sNigelPed.model) OR NOT HAS_MODEL_LOADED(sStartLocationVehicle[0].model) OR NOT HAS_MODEL_LOADED(sStartLocationVehicle[1].model) OR NOT HAS_MODEL_LOADED(sStartLocationVehicle[2].model) OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(2, sNigel2_UberRecordingName) //vehicle at start which pulls out on target vehicle IF bFinishedStageSkipping //don't fade if we are stage skipping IF NOT IS_SCREEN_FADED_OUT() SAFE_FADE_SCREEN_OUT_TO_BLACK(0, TRUE) // backup fade in, mainly for repeat play purposes. bHadToFadeOutToLoadMissionAssets = TRUE //stored so I only fade back up if, I faded down #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SCREEN FADED BECAUSE ASSETS WEREN'T LOADED IN TIME") ENDIF #ENDIF ENDIF ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "waiting for asset to load ") ENDIF #ENDIF WAIT(0) ENDWHILE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION ASSETS LOADED - GO GO GO ") ENDIF #ENDIF ENDIF ENDPROC /// PURPOSE: /// sets up the Nigel's vehicle for the start of in game play PROC SETUP_NIGEL_VEHICLE_FOR_IN_GAME_START() IF IS_VEHICLE_OK(sNigelVehicle.vehicle) SET_VEHICLE_FIXED(sNigelVehicle.vehicle) SET_VEHICLE_DOORS_LOCKED(sNigelVehicle.vehicle, VEHICLELOCK_UNLOCKED) //SET_VEHICLE_ON_GROUND_PROPERLY(sNigelVehicle.vehicle) stops a visible snap SET_VEHICLE_COLOURS(sNigelVehicle.vehicle, 65, 0) //bluey black, ripped from Tom Nigel 3. //88, 88) //YELLOW //SET_VEHICLE_TYRES_CAN_BURST(sNigelVehicle.vehicle, FALSE) SET_VEHICLE_HAS_STRONG_AXLES(sNigelVehicle.vehicle, TRUE) SET_VEHICLE_STRONG(sNigelVehicle.vehicle, TRUE) SET_ENTITY_HEALTH(sNigelVehicle.vehicle, NIGEL2_MISSION_VEHICLES_HEALTH) SET_VEHICLE_CAN_LEAK_OIL(sNigelVehicle.vehicle, FALSE) SET_VEHICLE_CAN_LEAK_PETROL(sNigelVehicle.vehicle, FALSE) SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sNigelVehicle.vehicle, SC_DOOR_BOOT, FALSE) SET_VEHICLE_MODEL_IS_SUPPRESSED(sNigelVehicle.model, TRUE) ADD_VEHICLE_UPSIDEDOWN_CHECK(sNigelVehicle.vehicle) SET_VEHICLE_AS_RESTRICTED(sNigelVehicle.vehicle, 0) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SETUP_NIGEL_VEHICLE_FOR_IN_GAME_START done") ENDIF #ENDIF ENDIF ENDPROC /// PURPOSE: /// sets up the target's vehicle for the start of in game play PROC SETUP_TARGET_VEHICLE_FOR_IN_GAME_START() IF IS_VEHICLE_OK(sTargetVehicle.vehicle) SET_VEHICLE_FIXED(sTargetVehicle.vehicle) SET_VEHICLE_DOORS_LOCKED(sTargetVehicle.vehicle, VEHICLELOCK_UNLOCKED) SET_VEHICLE_COLOURS(sTargetVehicle.vehicle, 0, 0) //BLACK SET_VEHICLE_ENGINE_ON(sTargetVehicle.vehicle, TRUE, TRUE) SET_VEHICLE_TYRES_CAN_BURST(sTargetVehicle.vehicle, FALSE) SET_VEHICLE_HAS_STRONG_AXLES(sTargetVehicle.vehicle, TRUE) SET_VEHICLE_STRONG(sTargetVehicle.vehicle, TRUE) SET_ENTITY_HEALTH(sTargetVehicle.vehicle, NIGEL2_MISSION_VEHICLES_HEALTH) SET_DISABLE_VEHICLE_ENGINE_FIRES(sTargetVehicle.vehicle, TRUE) SET_VEHICLE_CAN_LEAK_OIL(sTargetVehicle.vehicle, FALSE) SET_VEHICLE_CAN_LEAK_PETROL(sTargetVehicle.vehicle, FALSE) SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sTargetVehicle.vehicle, FALSE) SET_VEHICLE_DOOR_SHUT(sTargetVehicle.vehicle, SC_DOOR_FRONT_LEFT, TRUE) SET_VEHICLE_DOORS_LOCKED(sTargetVehicle.vehicle, VEHICLELOCK_LOCKOUT_PLAYER_ONLY) SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sTargetVehicle.vehicle, SC_DOOR_FRONT_LEFT, FALSE) //added this so player rips him out in the cutscene SET_VEHICLE_MODEL_IS_SUPPRESSED(sTargetVehicle.model, TRUE) SET_VEHICLE_AS_RESTRICTED(sTargetVehicle.vehicle, 1) SET_ENTITY_COORDS(sTargetVehicle.vehicle, sTargetVehicle.vSpawn) // from uber recording SET_ENTITY_QUATERNION(sTargetVehicle.vehicle, -0.0248, 0.0004, 0.8949, 0.4456) // from uber recording // heading 126.961 // rotation << -0.453279, 2.26519, 126.961 >> FREEZE_ENTITY_POSITION(sTargetVehicle.vehicle, TRUE) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SETUP_TARGET_VEHICLE_FOR_IN_GAME_START done") ENDIF #ENDIF ENDIF ENDPROC /// PURPOSE: /// sets up Mrs Thornhill for the start of in game play PROC SETUP_MRS_THORNHILL_FOR_IN_GAME_START() IF IS_PED_UNINJURED(sMrsThornhillPed.ped) SET_PED_DEFAULT_COMPONENT_VARIATION(sMrsThornhillPed.ped) SET_PED_MODEL_IS_SUPPRESSED(sMrsThornhillPed.model, TRUE) SET_PED_CAN_BE_TARGETTED(sMrsThornhillPed.ped, FALSE) SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(sMrsThornhillPed.ped, FALSE) SET_PED_CONFIG_FLAG(sMrsThornhillPed.ped, PCF_WillFlyThroughWindscreen, FALSE) SET_PED_CONFIG_FLAG(sMrsThornhillPed.ped, PCF_KeepRelationshipGroupAfterCleanUp, TRUE) SET_PED_CONFIG_FLAG(sMrsThornhillPed.ped, PCF_GetOutUndriveableVehicle, FALSE) // //stop ped leaving undriveable vehicle SET_PED_CONFIG_FLAG(sMrsThornhillPed.ped, PCF_GetOutBurningVehicle, FALSE) // //stop ped leaving undriveable vehicle IF IS_PED_IN_GROUP(sMrsThornhillPed.ped) REMOVE_PED_FROM_GROUP(sMrsThornhillPed.ped) ENDIF SET_PED_RELATIONSHIP_GROUP_HASH(sMrsThornhillPed.ped, relGroupFriendly) ADD_PED_FOR_DIALOGUE(sDialogue, 5, sMrsThornhillPed.ped, "MRSTHORNHILL") SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(sMrsThornhillPed.ped, TRUE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sMrsThornhillPed.ped, TRUE) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SETUP_MRS_THORNHILL_FOR_IN_GAME_START done") ENDIF #ENDIF ENDIF ENDPROC /// PURPOSE: /// sets up Nigel for the start of in game play PROC SETUP_NIGEL_FOR_IN_GAME_START() IF IS_PED_UNINJURED(sNigelPed.ped) SET_PED_DEFAULT_COMPONENT_VARIATION(sNigelPed.ped) SET_PED_MODEL_IS_SUPPRESSED(sNigelPed.model, TRUE) SET_PED_CAN_BE_TARGETTED(sNigelPed.ped, FALSE) SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(sNigelPed.ped, FALSE) SET_PED_CONFIG_FLAG(sNigelPed.ped, PCF_WillFlyThroughWindscreen, FALSE) SET_PED_CONFIG_FLAG(sNigelPed.ped, PCF_KeepRelationshipGroupAfterCleanUp, TRUE) SET_PED_CONFIG_FLAG(sNigelPed.ped, PCF_GetOutUndriveableVehicle, FALSE) // //stop ped leaving undriveable vehicle SET_PED_CONFIG_FLAG(sNigelPed.ped, PCF_GetOutBurningVehicle, FALSE) // //stop ped leaving undriveable vehicle IF IS_PED_IN_GROUP(sNigelPed.ped) REMOVE_PED_FROM_GROUP(sNigelPed.ped) ENDIF SET_PED_RELATIONSHIP_GROUP_HASH(sNigelPed.ped, relGroupFriendly) ADD_PED_FOR_DIALOGUE(sDialogue, 4, sNigelPed.ped, "NIGEL") SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(sNigelPed.ped, TRUE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sNigelPed.ped, TRUE) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SETUP_NIGEL_FOR_IN_GAME_START done") ENDIF #ENDIF ENDIF ENDPROC /// PURPOSE: /// sets up Target for the start of in game play PROC SETUP_TARGET_PED_FOR_IN_GAME_START() IF IS_PED_UNINJURED(sTargetPed.ped) SET_PED_COMPONENT_VARIATION(sTargetPed.ped, PED_COMP_LEG, 0, 0) // default now has pants on show! SET_PED_MODEL_IS_SUPPRESSED(sTargetPed.model, TRUE) SET_PED_CAN_BE_TARGETTED(sTargetPed.ped, FALSE) SET_PED_CAN_BE_DRAGGED_OUT(sTargetPed.ped, FALSE) SET_PED_CONFIG_FLAG(sTargetPed.ped, PCF_WillFlyThroughWindscreen, FALSE) SET_PED_CONFIG_FLAG(sTargetPed.ped, PCF_GetOutUndriveableVehicle, FALSE) // //stop ped leaving undriveable vehicle SET_PED_CONFIG_FLAG(sTargetPed.ped, PCF_GetOutBurningVehicle, FALSE) // //stop ped leaving undriveable vehicle SET_PED_DIES_WHEN_INJURED(sTargetPed.ped, TRUE) SET_ENTITY_LOAD_COLLISION_FLAG(sTargetPed.ped, TRUE) //unsure if this is needed, might be costly? IF IS_PED_IN_GROUP(sTargetPed.ped) REMOVE_PED_FROM_GROUP(sTargetPed.ped) ENDIF SET_PED_RELATIONSHIP_GROUP_HASH(sTargetPed.ped, relGroupEnemy) ADD_PED_FOR_DIALOGUE(sDialogue, 3, sTargetPed.ped, "DINAPOLI") SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(sTargetPed.ped, TRUE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sTargetPed.ped, TRUE) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SETUP_TARGET_PED_FOR_IN_GAME_START done") ENDIF #ENDIF ENDIF ENDPROC /// PURPOSE: /// sets everything up for the start of the mission. /// Called at the end of the intro mocap PROC SETUP_FOR_START_OF_MISSION() // Setup Nigel's Vehicle SAFE_DELETE_VEHICLE(sRCLauncherDataLocal.vehID[0]) // from initial setup IF NOT DOES_ENTITY_EXIST(sNigelVehicle.vehicle) CLEAR_AREA(sNigelVehicle.vSpawn, 2.0, TRUE) CREATE_NIGEL_VEHICLE(sNigelVehicle.vehicle, sNigelVehicle.vSpawn, sNigelVehicle.fSpawnHeading, FALSE, TRUE) CPRINTLN(DEBUG_MISSION, "created Nigel's vehicle in script, not mocap FC = ", GET_FRAME_COUNT()) SETUP_NIGEL_VEHICLE_FOR_IN_GAME_START() ENDIF SET_MODEL_AS_NO_LONGER_NEEDED(sNigelVehicle.model) // Setup Target's Vehicle SAFE_DELETE_VEHICLE(sRCLauncherDataLocal.vehID[1]) // from initial setup IF NOT DOES_ENTITY_EXIST(sTargetVehicle.vehicle) CLEAR_AREA(sTargetVehicle.vSpawn, 2.0, TRUE) sTargetVehicle.vehicle = CREATE_VEHICLE(sTargetVehicle.model, sTargetVehicle.vSpawn, sTargetVehicle.fSpawnHeading) IF IS_VEHICLE_OK(sTargetVehicle.vehicle) SET_ENTITY_COORDS(sTargetVehicle.vehicle, sTargetVehicle.vSpawn) // from uber recording SET_ENTITY_QUATERNION(sTargetVehicle.vehicle, -0.0248, 0.0004, 0.8949, 0.4456) // from uber recording // heading 126.961 // rotation << -0.453279, 2.26519, 126.961 >> ENDIF CPRINTLN(DEBUG_MISSION, "created Target's vehicle in script, not mocap FC = ", GET_FRAME_COUNT()) SETUP_TARGET_VEHICLE_FOR_IN_GAME_START() ENDIF SET_MODEL_AS_NO_LONGER_NEEDED(sTargetVehicle.model) // Setup Nigel and Mrs Thornhill (start in Nigel's vehicle) IF IS_VEHICLE_OK(sNigelVehicle.vehicle) // Mrs T IF NOT DOES_ENTITY_EXIST(sMrsThornhillPed.ped) sMrsThornhillPed.ped = CREATE_PED_INSIDE_VEHICLE(sNigelVehicle.vehicle, PEDTYPE_MISSION, sMrsThornhillPed.model, VS_BACK_RIGHT) CPRINTLN(DEBUG_MISSION, "created Mrs T in script, not mocap FC = ", GET_FRAME_COUNT()) SETUP_MRS_THORNHILL_FOR_IN_GAME_START() ENDIF // Nigel SAFE_DELETE_PED(sRCLauncherDataLocal.pedID[0]) // from initial setup IF NOT DOES_ENTITY_EXIST(sNigelPed.ped) sNigelPed.ped = CREATE_PED_INSIDE_VEHICLE(sNigelVehicle.vehicle, PEDTYPE_MISSION, sNigelPed.model, VS_FRONT_RIGHT) CPRINTLN(DEBUG_MISSION, "created Nigel in script, not mocap FC = ", GET_FRAME_COUNT()) SETUP_NIGEL_FOR_IN_GAME_START() ENDIF ENDIF SET_MODEL_AS_NO_LONGER_NEEDED(sMrsThornhillPed.model) SET_MODEL_AS_NO_LONGER_NEEDED(sNigelPed.model) // Setup Target (start in Target's vehicle) IF IS_VEHICLE_OK(sTargetVehicle.vehicle) IF NOT DOES_ENTITY_EXIST(sTargetPed.ped) sTargetPed.ped = CREATE_PED_INSIDE_VEHICLE(sTargetVehicle.vehicle, PEDTYPE_MISSION, sTargetPed.model, VS_DRIVER) CPRINTLN(DEBUG_MISSION, "created Target ped in script, not mocap FC = ", GET_FRAME_COUNT()) SETUP_TARGET_PED_FOR_IN_GAME_START() ENDIF ENDIF SET_MODEL_AS_NO_LONGER_NEEDED(sTargetPed.model) IF IS_PED_UNINJURED(PLAYER_PED_ID()) ADD_PED_FOR_DIALOGUE(sDialogue, 2, PLAYER_PED_ID(), "TREVOR") SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(PLAYER_PED_ID(), TRUE) ENDIF //truck unloading at start location IF NOT DOES_ENTITY_EXIST(sStartLocationVehicle[0].vehicle) CLEAR_AREA(<< -1329.7417, -665.3537, 26.3413 >>, 2.0, TRUE) sStartLocationVehicle[0].vehicle = CREATE_VEHICLE(sStartLocationVehicle[0].model, << -1329.7417, -665.3537, 26.3413 >>, 126.9722) ENDIF IF IS_VEHICLE_OK(sStartLocationVehicle[0].vehicle) SET_ENTITY_QUATERNION(sStartLocationVehicle[0].vehicle, -0.0318, 0.0067, 0.8936, 0.4476) IF NOT IS_VEHICLE_DOOR_FULLY_OPEN(sStartLocationVehicle[0].vehicle, SC_DOOR_REAR_LEFT) SET_VEHICLE_DOOR_OPEN(sStartLocationVehicle[0].vehicle, SC_DOOR_REAR_LEFT) ENDIF IF NOT IS_VEHICLE_DOOR_FULLY_OPEN(sStartLocationVehicle[0].vehicle, SC_DOOR_REAR_RIGHT) SET_VEHICLE_DOOR_OPEN(sStartLocationVehicle[0].vehicle, SC_DOOR_REAR_RIGHT) ENDIF SET_VEHICLE_INDICATOR_LIGHTS(sStartLocationVehicle[0].vehicle, TRUE, TRUE) SET_VEHICLE_INDICATOR_LIGHTS(sStartLocationVehicle[0].vehicle, FALSE, TRUE) ENDIF //car parked at start location IF NOT DOES_ENTITY_EXIST(sStartLocationVehicle[1].vehicle) CLEAR_AREA(<< -1329.7509, -676.4864, 25.8557 >>, 2.0, TRUE) sStartLocationVehicle[1].vehicle = CREATE_VEHICLE(sStartLocationVehicle[1].model, << -1329.7509, -676.4864, 25.8557 >>, 307.7227) ENDIF IF IS_VEHICLE_OK(sStartLocationVehicle[1].vehicle) SET_ENTITY_QUATERNION(sStartLocationVehicle[1].vehicle, 0.0248, 0.0142, -0.4405, 0.8973) ENDIF //car pulls out at start location IF NOT DOES_ENTITY_EXIST(sStartLocationVehicle[2].vehicle) CLEAR_AREA(<<-1336.3171, -680.9752, 25.5144>>, 2.0, TRUE) sStartLocationVehicle[2].vehicle = CREATE_VEHICLE(sStartLocationVehicle[2].model, <<-1336.3171, -680.9752, 25.5144>>, 307.7227) ENDIF IF IS_VEHICLE_OK(sStartLocationVehicle[2].vehicle) SET_ENTITY_QUATERNION(sStartLocationVehicle[2].vehicle, 0.0269, 0.0079, -0.4791, 0.8773) ENDIF INT i = 0 REPEAT NIGEL2_TOTAL_START_AREA_SCRIPTED_VEHICLES i IF IS_VEHICLE_OK(sStartLocationVehicle[i].vehicle) SET_MODEL_AS_NO_LONGER_NEEDED(sStartLocationVehicle[i].model) #IF IS_DEBUG_BUILD TEXT_LABEL tDebugName = "sStartLV" tDebugName += i SET_VEHICLE_NAME_DEBUG(sStartLocationVehicle[i].vehicle, tDebugName) #ENDIF ENDIF ENDREPEAT UPDATE_SCRIPTED_VEHICLES_AROUND_START_LOCATION(fMainPlaybackSpeed, vPlayerPos) //back up fade in, if we had to fade out during loading of assets IF bFinishedStageSkipping //however, don't fade if we are stage skipping IF bHadToFadeOutToLoadMissionAssets IF NOT IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN() SAFE_FADE_SCREEN_IN_FROM_BLACK(DEFAULT_FADE_TIME, FALSE) // backup fade in, mainly for repeat play purposes. #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SETUP_FOR_START_OF_MISSION - SAFE_FADE_SCREEN_IN_FROM_BLACK called as bHadToFadeOutToLoadMissionAssets and finished stage skipping", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// setup the state at the crash site, turning off peds vehicles in the area /// PARAMS: /// bCallClearArea - if TRUE clear areas will be called PROC SETUP_CRASH_SITE_FOR_OUTRO_MOCAP(BOOL bCallClearArea = FALSE) INT i VECTOR vAreaMin = << 341.2, -645.83, 25.0 >> VECTOR vAreaMax = << 429.1, -572.89, 35.0 >> SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vAreaMin, vAreaMax, FALSE) // match the cleanup call coords SET_ROADS_IN_ANGLED_AREA(<<418.283752,-571.662903,24.697943>>, <<362.025787,-663.139771,38.339985>>, 28.000000, FALSE, FALSE) // match the cleanup call coords - outro IF bCallClearArea REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(vAreaMin, vAreaMax) CLEAR_ANGLED_AREA_OF_VEHICLES(<<418.283752,-571.662903,24.697943>>, <<362.025787,-663.139771,38.339985>>, 28.000000) ENDIF SET_PED_PATHS_IN_AREA(vAreaMin, vAreaMax, FALSE) SET_PED_NON_CREATION_AREA(vAreaMin, vAreaMax) // clean up the blocking area from earlier in the chase (stops global limit being pushed up) FOR i = 0 TO (NIGEL2_TOTAL_SCENARIO_BLOCKING_AREAS_CHASE_ROUTE - 1) IF i != 1 // don't remove the one at front of the hospital for now REMOVE_SCENARIO_BLOCKING_AREA(scenarioBlockingChaseRoute[i]) ENDIF ENDFOR scenarioBlockingOutroArea = ADD_SCENARIO_BLOCKING_AREA(vAreaMin, vAreaMax) IF bCallClearArea CLEAR_AREA_OF_OBJECTS(<< 395.24756, -615.01337, 27.87107 >>, 20.0) CLEAR_AREA(<< 395.24756, -615.01337, 27.87107 >>, 20.0, TRUE) ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SETUP_CRASH_SITE_FOR_OUTRO_MOCAP - done with bCallClearArea = ", bCallClearArea, " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDPROC /// PURPOSE: /// handles setting up the scenario blocking area during the chase /// prevent target driving through peds without collision PROC UPDATE_SCENARIO_BLOCKING_ON_CHASE_ROUTE(FLOAT fLocal_CurrentPlaybackTime) INT i SWITCH iScenarioBlockingAreaStage //SET_PED_PATHS_IN_AREA(<< -1318.50049, -678.88257, 23.0 >>, << -1296.62781, -631.54492, 29.0 >>, FALSE) //SET_PED_NON_CREATION_AREA(<< -1318.50049, -678.88257, 23.0 >>, << -1296.62781, -631.54492, 29.0 >>) //scenarioBlockingIntroArea = ADD_SCENARIO_BLOCKING_AREA(<< -1318.50049, -678.88257, 23.0 >>, << -1296.62781, -631.54492, 29.0 >>) CASE 0 // target just entering the pedestrian road IF fLocal_CurrentPlaybackTime > 5000.0 SET_PED_NON_CREATION_AREA(<< -1332.35083, -763.45764, 10.0 >>, << -1229.14221, -654.35461, 42.0 >>) iScenarioBlockingAreaStage++ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_SCENARIO_BLOCKING_ON_CHASE_ROUTE - iScenarioBlockingAreaStage++ =", iScenarioBlockingAreaStage, " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF BREAK CASE 1 // target just entering second half of the pedestrian road IF fLocal_CurrentPlaybackTime > 10000.0 SET_PED_NON_CREATION_AREA(<< -1274.14758, -842.63574, 10.0 >>, << -1139.83557, -703.74365, 42.0 >>) iScenarioBlockingAreaStage++ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_SCENARIO_BLOCKING_ON_CHASE_ROUTE - iScenarioBlockingAreaStage++ =", iScenarioBlockingAreaStage, " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF BREAK CASE 2 // stop uber cars continuing up the road and interfering with chase again on tunnel exit IF fLocal_CurrentPlaybackTime > 40000.0 // cleanup the blocking areas for the pedestrian area at the start of the chase - setup in SETUP_CLEAR_AREAS_AND_VEHICLE_RESOLVE_FOR_INTRO_MOCAP() FOR i = 0 TO (NIGEL2_TOTAL_SCENARIO_BLOCKING_AREAS_CHASE_ROUTE - 1) REMOVE_SCENARIO_BLOCKING_AREA(scenarioBlockingChaseRoute[i]) ENDFOR SET_ROADS_IN_ANGLED_AREA(<<-668.363464,-658.380066,27.433815>>, <<-440.021973,-657.423767,40.251266>>, 40.000000, FALSE, FALSE) // cover exit from tunnel iScenarioBlockingAreaStage++ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_SCENARIO_BLOCKING_ON_CHASE_ROUTE - iScenarioBlockingAreaStage++ =", iScenarioBlockingAreaStage, " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF BREAK CASE 3 // sets up the entrance to the second pedestrian area where Di Napoli cuts over the road from the tunnel IF fLocal_CurrentPlaybackTime > 54000.0 // cleanup the blocking areas for the pedestrian area at the start of the chase - setup in SETUP_CLEAR_AREAS_AND_VEHICLE_RESOLVE_FOR_INTRO_MOCAP() FOR i = 0 TO (NIGEL2_TOTAL_SCENARIO_BLOCKING_AREAS_CHASE_ROUTE - 1) REMOVE_SCENARIO_BLOCKING_AREA(scenarioBlockingChaseRoute[i]) ENDFOR // make sure ambient cars on this stretch get deleted if player in the underground to ensure veh don't smash into chase IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-513.487732,-598.495544,30.898241>>, <<-695.000977,-593.838440,19.307816>>, 60.000000) // covers majority of underground section OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-518.404114,-622.829346,32.301056>>, <<-608.405396,-622.358826,26.787561>>, 11.000000) CLEAR_ANGLED_AREA_OF_VEHICLES(<<-668.363464,-658.380066,27.433815>>, <<-440.021973,-657.423767,40.251266>>, 40.000000, FALSE) // cover exit from tunnel #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_SCENARIO_BLOCKING_ON_CHASE_ROUTE : cleared exit from tunnel area of vehicles") ENDIF #ENDIF // B*1789860 - clear peds in pedestrian area who keep spawning - can' set non creation area earler since it's used in diff pos CLEAR_AREA_OF_PEDS(<< -497.22577, -710.61609, 32.22013 >>, 5.85) // North on the path - side of underground CLEAR_AREA_OF_PEDS(<< -498.18228, -719.31335, 32.21197 >>, 2.15) // near scenario bin CLEAR_AREA_OF_PEDS(<< -497.90323, -724.97406, 32.21197 >>, 3.8) // south of above spot CLEAR_AREA_OF_PEDS(<< -499.56677, -731.96655, 32.21197 >>, 7.3) // further south again CPRINTLN(DEBUG_MISSION, "UPDATE_SCENARIO_BLOCKING_ON_CHASE_ROUTE : cleared peds at pedestrian area near underground!") ENDIF SET_PED_PATHS_IN_AREA(<< -496.28848, -681.55994, 25.0 >>, << -481.59882, -668.74115, 38.0 >>, FALSE) SET_PED_NON_CREATION_AREA(<< -496.28848, -681.55994, 25.0 >>, << -481.59882, -668.74115, 38.0 >>) // pedestrian area where player cuts across over the road from the tunnel scenarioBlockingChaseRoute[0] = ADD_SCENARIO_BLOCKING_AREA(<< -497.21988, -679.97705, 22.01260 >>, << -486.81241, -672.01343, 41.80794 >>) // continuing in that pedestrian along the chase route scenarioBlockingChaseRoute[1] = ADD_SCENARIO_BLOCKING_AREA(<< -489.72855, -680.74554, 22.01260 >>, << -497.19778, -690.00702, 41.80794 >>) iScenarioBlockingAreaStage++ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_SCENARIO_BLOCKING_ON_CHASE_ROUTE - iScenarioBlockingAreaStage++ =", iScenarioBlockingAreaStage, " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF BREAK CASE 4 // sets up the exit from second pedestrian area where Di Napoli cuts over the road from the tunnel IF fLocal_CurrentPlaybackTime > 61000.0 // cleanup previous blocking areas FOR i = 0 TO (NIGEL2_TOTAL_SCENARIO_BLOCKING_AREAS_CHASE_ROUTE - 1) REMOVE_SCENARIO_BLOCKING_AREA(scenarioBlockingChaseRoute[i]) ENDFOR // turn back on road from Road leading to tunnel exit SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<-668.363464,-658.380066,27.433815>>, <<-440.021973,-657.423767,40.251266>>, 40.000000) // cover exit from tunnel // B* 1481336 - area where the ramp is leaving the pedestrian area //SET_PED_PATHS_IN_AREA(<< -508.79080, -764.63538, 28.0 >>, << -488.04373, -711.80060, 38.0 >>, FALSE) SET_PED_NON_CREATION_AREA(<< -508.79080, -764.63538, 28.0 >>, << -488.04373, -702.80060, 38.0 >>) // slimer section covering the ramp scenarioBlockingChaseRoute[0] = ADD_SCENARIO_BLOCKING_AREA(<< -503.09494, -754.96472, 29.0 >>, << -494.79437, -730.12964, 37.0 >>) iScenarioBlockingAreaStage++ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_SCENARIO_BLOCKING_ON_CHASE_ROUTE - iScenarioBlockingAreaStage++ =", iScenarioBlockingAreaStage, " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF BREAK CASE 5 // sets up area where Di Napoli goes into the car park IF fLocal_CurrentPlaybackTime > 65000.0 // cleanup previous blocking areas FOR i = 0 TO (NIGEL2_TOTAL_SCENARIO_BLOCKING_AREAS_CHASE_ROUTE - 1) REMOVE_SCENARIO_BLOCKING_AREA(scenarioBlockingChaseRoute[i]) ENDFOR SET_PED_PATHS_BACK_TO_ORIGINAL(<< -496.28848, -681.55994, 25.0 >>, << -481.59882, -668.74115, 38.0 >>) SET_PED_PATHS_IN_AREA(<< -463.21530, -829.04749, 22.48120 >>, << -445.46454, -813.10107, 36.56588 >>, FALSE) SET_PED_NON_CREATION_AREA(<< -463.21530, -829.04749, 22.48120 >>, << -445.46454, -813.10107, 36.56588 >>) scenarioBlockingChaseRoute[0] = ADD_SCENARIO_BLOCKING_AREA(<< -497.21988, -679.97705, 22.01260 >>, << -486.81241, -672.01343, 41.80794 >>) iScenarioBlockingAreaStage++ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_SCENARIO_BLOCKING_ON_CHASE_ROUTE - iScenarioBlockingAreaStage++ =", iScenarioBlockingAreaStage, " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF BREAK CASE 6 // B*1533193 - block guards at hospital entrance IF fLocal_CurrentPlaybackTime > 75000.0 // cleanup previous stage SET_PED_PATHS_BACK_TO_ORIGINAL(<< -463.21530, -829.04749, 22.48120 >>, << -445.46454, -813.10107, 36.56588 >>) // covering area in front of hospital doors [0] already used above, update SETUP_CRASH_SITE_FOR_OUTRO_MOCAP if index changes scenarioBlockingChaseRoute[1] = ADD_SCENARIO_BLOCKING_AREA(<< 291.58481, -588.88062, 37.0 >>, << 303.76028, -579.58820, 48.0 >>) iScenarioBlockingAreaStage++ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_SCENARIO_BLOCKING_ON_CHASE_ROUTE - iScenarioBlockingAreaStage++ =", iScenarioBlockingAreaStage, " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF BREAK CASE 7 // heading through the hospital - setup crash site IF fLocal_CurrentPlaybackTime > 114500.0 // cleanup previous stage SETUP_CRASH_SITE_FOR_OUTRO_MOCAP(TRUE) iScenarioBlockingAreaStage++ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_SCENARIO_BLOCKING_ON_CHASE_ROUTE - iScenarioBlockingAreaStage++ =", iScenarioBlockingAreaStage, " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// handles everything which needs to happen after END_REPLAY_SETUP() has been called /// PARAMS: /// eCurrentStage - which mission stage we are returning to PROC REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY(MISSION_STAGE eReturnToStage) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SWITCH eReturnToStage CASE MISSION_STAGE_CHASE_TARGET_IN_VEHICLE SET_GAMEPLAY_CAM_RELATIVE_HEADING(22.0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY : ", "MISSION_STAGE_CHASE_TARGET_IN_VEHICLE set gameplay cam heading 15.0 ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF BREAK CASE MISSION_STAGE_END_CUTSCENE_MOCAP // preload the mocap do it kicks in straight away IF eMissionSkipTargetStage = MISSION_STAGE_END_CUTSCENE_MOCAP SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sNigelVehicle.vehicle) SAFE_TELEPORT_VEHICLE(sNigelVehicle.vehicle, << 391.08, -615.87, 28.33 >>, 333.66) // pos in outro mocap) RC_REQUEST_MID_MISSION_CUTSCENE(tlOutroMocapName) // can't use RC_REQUEST_CUTSCENE in this instance, as it causes bug 1000899 #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY : ", "RC_REQUEST_MID_MISSION_CUTSCENE : NMT_2_MCS_2 ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP() WHILE NOT RC_IS_CUTSCENE_OK_TO_START(TRUE) RC_REQUEST_MID_MISSION_CUTSCENE(tlOutroMocapName) // can't use RC_REQUEST_CUTSCENE in this instance, as it causes bug 1000899 #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY : ", "waiting on HAS_CUTSCENE_LOADED : NMT_2_MCS_2 ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP() WAIT(0) ENDWHILE ENDIF BREAK ENDSWITCH ENDIF ENDPROC /// PURPOSE: /// Handles setup game to fulfil mission stage criteria so it can advance to the next stage PROC SKIP_STAGE() IF IS_PED_UNINJURED(PLAYER_PED_ID()) //implement switch statement based of eMissionStage //which takes care of cleanup and setup for next stage. VECTOR vTempPos KILL_ANY_CONVERSATION() CLEAR_PRINTS() SWITCH eMissionStage CASE MISSION_STAGE_INTRO_MOCAP_SCENE IF eSubStage = SS_UPDATE //in script skips where we change the eSubStage, need to safe gaurd that the SS_SETUP has already had chance to run. IF IS_CUTSCENE_PLAYING() STOP_CUTSCENE() ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_INTRO_MOCAP_SCENE : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF BREAK CASE MISSION_STAGE_CHASE_TARGET_IN_VEHICLE IF eSubStage = SS_UPDATE //in script skips where we change the eSubStage, need to safe gaurd that the SS_SETUP has already had chance to run. bDone_TargetStartChaseRoute = TRUE //stops playback getting started SAFE_PUT_PED_INTO_VEHICLE(sNigelPed.ped, sNigelVehicle.vehicle, VS_FRONT_RIGHT) SAFE_PUT_PED_INTO_VEHICLE(sMrsThornhillPed.ped, sNigelVehicle.vehicle, VS_BACK_RIGHT) SAFE_PUT_PED_INTO_VEHICLE(sTargetPed.ped, sTargetVehicle.vehicle) IF IS_VEHICLE_OK(sTargetVehicle.vehicle) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) STOP_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle) ENDIF SET_ENTITY_COORDS_NO_OFFSET(sTargetVehicle.vehicle, <<393.4298, -621.3337, 28.4891>>) SET_ENTITY_QUATERNION(sTargetVehicle.vehicle, -0.0081, -0.0061, 0.7994, -0.6007) SET_VEHICLE_ON_GROUND_PROPERLY(sTargetVehicle.vehicle) ENDIF REQUEST_ANIM_DICT("rcmnigel2") //to play head on horn anim on target in truck WHILE NOT HAS_ANIM_DICT_LOADED("rcmnigel2") #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_CHASE_TARGET_IN_VEHICLE : ", "loading anim dict - rcmnigel2 ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF WAIT(0) ENDWHILE CREATE_VEHICLE_FOR_PLAYER_TO_USE_ON_MISSION_PASSED(TRUE, FALSE) CLEAR_AREA_OF_VEHICLES(<< 393.38, -617.53, 27.91 >>, 50.0) //stops cars appearing at outro location when warping there IF NOT IS_REPLAY_BEING_SET_UP() SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sNigelVehicle.vehicle) SAFE_TELEPORT_VEHICLE(sNigelVehicle.vehicle, <<364.7079, -608.3558, 27.7364>>, 246.4916) // << 384.26, -609.65, 28.51 >>, 227.32) SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() // load world if target stage is the next one IF bLoadedWorldForStageSkipping = FALSE IF eMissionSkipTargetStage = MISSION_STAGE_GET_CLOSE_TO_TARGET_FOR_CUTSCENE IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()), 25.0, FLAG_COLLISIONS_MOVER | FLAG_MAPDATA) bLoadedWorldForStageSkipping = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_CHASE_TARGET_IN_VEHICLE : ", "LOADED WORLD", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF // Added because info from Matt, uber recording isn't updated each frame in the skip because of waits so ambient traffic could appear. SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 150, FALSE) eSubStage = SS_CLEANUP #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_CHASE_TARGET_IN_VEHICLE : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF BREAK CASE MISSION_STAGE_GET_CLOSE_TO_TARGET_FOR_CUTSCENE IF eSubStage = SS_UPDATE //in script skips where we change the eSubStage, need to safe gaurd that the SS_SETUP has already had chance to run. SAFE_PUT_PED_INTO_VEHICLE(sNigelPed.ped, sNigelVehicle.vehicle, VS_FRONT_RIGHT) SAFE_PUT_PED_INTO_VEHICLE(sMrsThornhillPed.ped, sNigelVehicle.vehicle, VS_BACK_RIGHT) IF NOT IS_REPLAY_BEING_SET_UP() SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sNigelVehicle.vehicle) vTempPos = << 391.08, -615.87, 28.33 >> // GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sTargetVehicle.vehicle, << 0.0, -5.0, 0.0 >>) SAFE_TELEPORT_VEHICLE(sNigelVehicle.vehicle, vTempPos, 333.66) // pos in outro mocap) // load world if target stage is the next one IF bLoadedWorldForStageSkipping = FALSE IF eMissionSkipTargetStage = MISSION_STAGE_END_CUTSCENE_MOCAP IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()), 25.0, FLAG_COLLISIONS_MOVER | FLAG_MAPDATA) bLoadedWorldForStageSkipping = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_GET_CLOSE_TO_TARGET_FOR_CUTSCENE : ", "LOADED WORLD", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF eSubStage = SS_CLEANUP #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_GET_CLOSE_TO_TARGET_FOR_CUTSCENE : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF BREAK CASE MISSION_STAGE_END_CUTSCENE_MOCAP IF eSubStage = SS_UPDATE //in script skips where we change the eSubStage, need to safe gaurd that the SS_SETUP has already had chance to run. IF IS_CUTSCENE_PLAYING() STOP_CUTSCENE() ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_END_CUTSCENE_MOCAP : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF BREAK DEFAULT BREAK ENDSWITCH ENDIF ENDPROC /// PURPOSE: /// Jumps to the stage selected /// PARAMS: /// eNewStage - stage to jump to PROC JUMP_TO_STAGE(MISSION_STAGE eNewStage) IF eMissionStage = eNewStage // end skip stage IF IS_REPLAY_BEING_SET_UP() VEHICLE_INDEX vehReplayPlayer = NULL IF eMissionStage = MISSION_STAGE_GET_CLOSE_TO_TARGET_FOR_CUTSCENE OR eMissionStage = MISSION_STAGE_END_CUTSCENE_MOCAP vehReplayPlayer = sNigelVehicle.vehicle ENDIF END_REPLAY_SETUP(vehReplayPlayer, VS_DRIVER, FALSE) ENDIF REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY(eMissionStage) SET_MUSIC_EVENTS_FOR_MISSION_STAGE_SKIPS(eMissionStage) //B* 1468238 - don't fade back in here when skipping to mocap (let the mocap stage handle it) IF eMissionStage = MISSION_STAGE_END_CUTSCENE_MOCAP RC_END_Z_SKIP(DEFAULT, FALSE) // don't reset the gameplay cams if we are coming out of the mocap ELIF eMissionStage = MISSION_STAGE_CHASE_TARGET_IN_VEHICLE RC_END_Z_SKIP(FALSE) ELSE RC_END_Z_SKIP() ENDIF bFinishedStageSkipping = TRUE bLoadedWorldForStageSkipping = FALSE // ensure we are fully faded in if we have skipped to the mission passed stage, since the mission passed GUI doesn't display if not (seems to need a frame wait too) IF eMissionStage = MISSION_STAGE_MISSION_PASSED SAFE_FADE_SCREEN_IN_FROM_BLACK() ENDIF ELSE SKIP_STAGE() ENDIF ENDPROC /// PURPOSE: /// Reset the mission, cleanups the current state and set's the mission up again /// USED by the mission replay checkpoint setup and Debug skips PROC RESET_MISSION() MISSION_CLEANUP(TRUE, FALSE) IF NOT IS_REPLAY_BEING_SET_UP() // don't allow music events to trigger during replay setup / stage skips AND bFinishedStageSkipping WHILE NOT SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL2_MISSION_FAIL") #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "RESET_MISSION - killing music cues") ENDIF #ENDIF WAIT(0) ENDWHILE ENDIF RENDER_SCRIPT_CAMS(FALSE, FALSE) //not done in normal cleanup as this brakes my interpolate camera when mission ends. IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF NOT IS_REPLAY_BEING_SET_UP() CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) ENDIF SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) ENDIF #IF IS_DEBUG_BUILD // should only get called in debug //set the initial scene back up eInitialSceneStage = IS_REQUEST_SCENE WHILE NOT SetupScene_NIGEL_2(sRCLauncherDataLocal) CPRINTLN(DEBUG_MISSION, " RESET_MISSION - waiting on SetupScene_NIGEL_2") WAIT(0) ENDWHILE RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE) RC_TakeEntityOwnership(sRCLauncherDataLocal) SETUP_AREA_FOR_MISSION(RC_NIGEL_2, FALSE) // need to turn this off in this instance since launcher cleanup won't get called to do it #ENDIF //re do mission initialization INIT_MISSION() SET_STAGE(MISSION_STAGE_INTRO_MOCAP_SCENE) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "RESET_MISSION - done") ENDIF #ENDIF ENDPROC /// PURPOSE: /// Perform a Z skip. Used by the mission checkpoints and the debug Z skip function /// PARAMS: /// iNewStage - Mission stage we want to skip to /// bResetMission - used when we go backwards in mission flow. If false we also don't stop the active cutscene in RC_START_Z_SKIP, instead handled in SKIP_STAGE to fix bug 1006740 PROC DO_Z_SKIP(INT iNewStage, BOOL bResetMission = FALSE) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DO_Z_SKIP with parameters - iNewStage = ", iNewStage, " bResetMission = ", bResetMission) ENDIF #ENDIF RC_START_Z_SKIP(bResetMission) // knock out any active music event IF NOT IS_REPLAY_BEING_SET_UP() SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL2_MISSION_FAIL") ENDIF IF bResetMission RESET_MISSION() ENDIF eMissionSkipTargetStage = INT_TO_ENUM(MISSION_STAGE, iNewStage) bFinishedStageSkipping = FALSE IF IS_REPLAY_BEING_SET_UP() bLoadedWorldForStageSkipping = TRUE ELSE bLoadedWorldForStageSkipping = FALSE ENDIF // load world for the mission start area if we are resetting the mission to the intro mocap. Moved here from script skip stage to fix bug 1006740 - mocap exit states not getting set as game is waiting on world to load before getting to check // basically if you press CROSS to confirm which stage in the z menu, it skipped the mocap but couldn't sent exit states as it was waiting for world to load first. IF NOT IS_REPLAY_BEING_SET_UP() IF eMissionSkipTargetStage = MISSION_STAGE_INTRO_MOCAP_SCENE IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) SAFE_TELEPORT_PED(PLAYER_PED_ID(), <<-1309.0155, -641.8671, 25.5017>>, 242.3463) //setup player in spot which matches mocap end WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()), 50.0, FLAG_COLLISIONS_MOVER | FLAG_MAPDATA) bLoadedWorldForStageSkipping = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DO_Z_SKIP - LOADED WORLD ready at mission start area framecount : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DO_Z_SKIP") ENDIF #ENDIF JUMP_TO_STAGE(eMissionSkipTargetStage) ENDPROC //------------------------------------------------------------------------------------------------------------------------------------------------- // DEBUG - J,P and Z skip stuff //------------------------------------------------------------------------------------------------------------------------------------------------- #IF IS_DEBUG_BUILD /// PURPOSE: /// Check for S, F, J and P skips PROC DEBUG_Check_Debug_Keys() INT iNewStage // Check for Pass IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)) WAIT_FOR_CUTSCENE_TO_STOP() WHILE NOT SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL2_MISSION_FAIL") #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "RESET_MISSION - killing music cues") ENDIF #ENDIF WAIT(0) ENDWHILE IF IS_PED_UNINJURED(PLAYER_PED_ID()) CLEAR_PED_TASKS(PLAYER_PED_ID()) ENDIF SET_STAGE(MISSION_STAGE_MISSION_PASSED) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "S SKIP") ENDIF #ENDIF Script_Passed() ENDIF // Check for Fail IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)) WAIT_FOR_CUTSCENE_TO_STOP() #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "F SKIP") ENDIF #ENDIF SET_STAGE(MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE) ENDIF // Check for Skip forward IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)) iNewStage = ENUM_TO_INT(eMissionStage) + 1 DO_Z_SKIP(iNewStage, FALSE) //perform a Z skip to the next stage, without the mission reset //SKIP_STAGE() ENDIF // Check for Skip backwards IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)) iNewStage = ENUM_TO_INT(eMissionStage)-1 IF iNewStage > - 1 #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "new stage = ", iNewStage) ENDIF #ENDIF DO_Z_SKIP(iNewStage, TRUE) ENDIF ENDIF // Z skip menu IF LAUNCH_MISSION_STAGE_MENU(mSkipMenu, iNewStage) // if we are skipping forward in the mission stages, just J skip rather than a full mission reset // make sure additional stages are handled here! These sit at the end of the enum so need to be dealt with differently. IF (iNewStage <= ENUM_TO_INT(eMissionStage)) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Z SKIP : new stage = ", iNewStage, " ResetMission = ", TRUE) ENDIF #ENDIF DO_Z_SKIP(iNewStage, TRUE) ELSE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Z SKIP : new stage = ", iNewStage, " ResetMission = ", FALSE) ENDIF #ENDIF DO_Z_SKIP(iNewStage, FALSE) ENDIF ENDIF ENDPROC #ENDIF /// PURPOSE: /// setups up the scenario blocking area, and clear areas needed when the mocap starts /// Also performs the player vehicle resolves for the intro PROC SETUP_CLEAR_AREAS_AND_VEHICLE_RESOLVE_FOR_INTRO_MOCAP() CPRINTLN(DEBUG_MISSION, "DOES SNAPSHOT VEHICLE EXIST = ", DOES_ENTITY_EXIST(g_startSnapshot.mVehicleIndex)) VECTOR vPlayerLastVehicleRespotPosition = << -1290.00, -646.10, 26.05 >> Float fPlayerLastVehicleRespotHeading = 307.66 //GET_CAR_RESPOT_POS_FOR_NEAREST_SAVEHOUSE(GET_ENTITY_COORDS(PLAYER_PED_ID()), CHAR_TREVOR, vPlayerLastVehicleRespotPosition, fPlayerLastVehicleRespotHeading) // back at safehouse setup // main road mission triggers on including Nigel's position RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<-1311.409424,-648.413330,24.925262>>, <<-1289.027588,-632.042969,29.552197>>, 17.5, vPlayerLastVehicleRespotPosition, fPlayerLastVehicleRespotHeading, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR(), TRUE, FALSE) // pedestrian road at the start of the chase RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<-1319.689819,-655.777344,29.458387>>, <<-1184.461304,-834.820068,12.343782>>, 30.0, vPlayerLastVehicleRespotPosition, fPlayerLastVehicleRespotHeading, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR(), TRUE, FALSE) CPRINTLN(DEBUG_MISSION, "SETUP_CLEAR_AREAS_AND_VEHICLE_RESOLVE_FOR_INTRO_MOCAP - finished vehicle resolves - DOES SNAPSHOT VEHICLE EXIST = ", DOES_ENTITY_EXIST(g_startSnapshot.mVehicleIndex), " framecount : ", GET_FRAME_COUNT()) // set the vehicle the player triggered the mission in to regenerate IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(<<0,0,0>>, TRUE) SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(vPlayerLastVehicleRespotPosition, fPlayerLastVehicleRespotHeading, FALSE) //SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(vPlayerLastVehicleRespotPosition, fPlayerLastVehicleRespotHeading, TRUE, CHAR_TREVOR) // back at safehouse setup #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "* SETUP_CLEAR_AREAS_AND_VEHICLE_RESOLVE_FOR_INTRO_MOCAP - vehicle gen setup framecount : ", GET_FRAME_COUNT()) ENDIF #ENDIF ELSE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "* SETUP_CLEAR_AREAS_AND_VEHICLE_RESOLVE_FOR_INTRO_MOCAP - vehicle to big to setup vehicle gen! framecount : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF //Intro Cutscene area SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<< -1409.34351, -756.38098, 17.59896 >>, << -1239.14758, -587.12195, 31.25266 >>, FALSE) // match the cleanup call coords REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(<< -1409.34351, -756.38098, 17.59896 >>, << -1239.14758, -587.12195, 31.25266 >>) SET_ROADS_IN_ANGLED_AREA(<<-1415.903931,-732.548889,17.545492>>, <<-1236.628174,-601.026489,31.153446>>, 23.000000, FALSE, FALSE) // match the cleanup call coords CLEAR_ANGLED_AREA_OF_VEHICLES(<<-1415.903931,-732.548889,17.545492>>, <<-1236.628174,-601.026489,31.153446>>, 23.000000, FALSE, FALSE, FALSE, TRUE, TRUE) // near side of the main road SET_PED_PATHS_IN_AREA(<< -1318.50049, -678.88257, 23.0 >>, << -1296.62781, -631.54492, 29.0 >>, FALSE) SET_PED_NON_CREATION_AREA(<< -1318.50049, -678.88257, 23.0 >>, << -1296.62781, -631.54492, 29.0 >>) scenarioBlockingIntroArea = ADD_SCENARIO_BLOCKING_AREA(<< -1318.50049, -678.88257, 23.0 >>, << -1296.62781, -631.54492, 29.0 >>) CLEAR_AREA_OF_OBJECTS(<< -1297.80, -637.42, 25.55 >>, 16.0) // pedestrian area at start of the chase - first section (middle road when you turn onto shopping street scenarioBlockingChaseRoute[0] = ADD_SCENARIO_BLOCKING_AREA(<< -1315.67981, -682.76141, 23.24123 >>, << -1295.26648, -670.37604, 27.97680 >>) CLEAR_AREA(<< -1305.33203, -676.37390, 25.79325 >>, 10.0, TRUE) // pedestrian area at start of the chase - part way down first section on east side road scenarioBlockingChaseRoute[1] = ADD_SCENARIO_BLOCKING_AREA(<< -1286.90613, -697.55927, 21.73920 >>, << -1279.69836, -691.58759, 26.33636 >>) CLEAR_AREA(<< -1287.70203, -698.19574, 27.50166 >>, 10.0, TRUE) // pedestrian area at start of the chase - first open section scenarioBlockingChaseRoute[2] = ADD_SCENARIO_BLOCKING_AREA(<< -1270.72009, -723.89026, 19.46898 >>, << -1262.89795, -718.27856, 24.43682 >>) CLEAR_AREA(<< -1269.86023, -722.46637, 21.54627 >>, 8.0, TRUE) // pedestrian area at start of the chase - infront of second section scenarioBlockingChaseRoute[3] = ADD_SCENARIO_BLOCKING_AREA(<< -1268.05750, -731.51825, 18.92047 >>, << -1263.57446, -727.55023, 24.05783 >>) CLEAR_AREA(<< -1266.43066, -728.92267, 21.08542 >>, 2.5, TRUE) // pedestrian area at start of the chase - second open section (not including bottom clusters) scenarioBlockingChaseRoute[3] = ADD_SCENARIO_BLOCKING_AREA(<< -1237.02380, -777.42224, 15.58289 >>, << -1221.88904, -764.59692, 20.58871 >>) CLEAR_AREA(<< -1231.44055, -770.94794, 17.70891 >>, 8.5, TRUE) // pedestrian area at start of the chase - bottom of second open section scenarioBlockingChaseRoute[4] = ADD_SCENARIO_BLOCKING_AREA(<< -1222.44775, -786.73486, 13.60073 >>, << -1215.77295, -780.20215, 20.43715 >>) CLEAR_AREA(<< -1222.00769, -783.68341, 16.73119 >>, 7.5, TRUE) // B*1763717 - clear area at junction of vehicles sine these turn into the road where nodes are blocked CLEAR_AREA_OF_VEHICLES(<< -1459.2, -736.9, 23.6 >>, 50.0, FALSE, FALSE, FALSE, TRUE) // Junction turning left onto scene road from North West CLEAR_AREA_OF_VEHICLES(<< -1332.2, -537.6, 31.5 >>, 30.0, FALSE, FALSE, FALSE, TRUE) // road behind where Nigel is (North) ENDPROC //------------------------------------------------------------------------------------------------------------------------------------------------- // Mission Stages //------------------------------------------------------------------------------------------------------------------------------------------------- /// PURPOSE: /// Trevors spots Nigel on the street, Mrs Thornhill has seen Al Di Napoli. /// Nigel asks Trevor to help them get Al Di Napoli "somewhere prviate so they can talk" PROC INTRO_MOCAP_SCENE() SWITCH eSubStage // ------------------------------------------ CASE SS_SETUP // don't request the mocap if we are skipping past this stage IF NOT bFinishedStageSkipping IF NOT IS_REPLAY_BEING_SET_UP() SAFE_TELEPORT_PED(PLAYER_PED_ID(), <<-1309.0155, -641.8671, 25.5017>>, 242.3463) //setup player in spot which matches mocap end // load world if target stage is the next stage IF bLoadedWorldForStageSkipping = FALSE IF eMissionSkipTargetStage = MISSION_STAGE_CHASE_TARGET_IN_VEHICLE IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()), 50.0, FLAG_COLLISIONS_MOVER | FLAG_MAPDATA) bLoadedWorldForStageSkipping = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE : SS_SETUP - bFinishedStageSkipping - LOADED WORLD framecount : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDIF SAFE_TELEPORT_PED(PLAYER_PED_ID(), <<-1309.0155, -641.8671, 25.5017>>, 242.3463, TRUE, TRUE) //second attempt put the player on the floor B* 1076463 ENDIF // remove the temporary RC entities which were in the initial scene SAFE_DELETE_PED(sRCLauncherDataLocal.pedID[0]) SAFE_DELETE_VEHICLE(sRCLauncherDataLocal.vehID[0]) SAFE_DELETE_VEHICLE(sRCLauncherDataLocal.vehID[1]) SETUP_CLEAR_AREAS_AND_VEHICLE_RESOLVE_FOR_INTRO_MOCAP() LOAD_MISSION_ASSETS(TRUE) SETUP_FOR_START_OF_MISSION() IF IS_VEHICLE_OK(sNigelVehicle.vehicle) SET_VEHICLE_ON_GROUND_PROPERLY(sNigelVehicle.vehicle) // ensure it's positioned correctly to match mocap cut ENDIF UPDATE_SCRIPTED_VEHICLES_AROUND_START_LOCATION(fMainPlaybackSpeed, vPlayerPos) SETUP_UBER_PLAYBACK() CPRINTLN(DEBUG_MISSION, "INTRO_MOCAP_SCENE - SS_SETUP done for bFinishedStageSkipping FC = ", GET_FRAME_COUNT()) eSubStage = SS_CLEANUP ELSE RC_REQUEST_CUTSCENE("NMT_2_RCM") // B*1347748 - set Di Napoli to trouser's variation IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() SET_CUTSCENE_PED_COMPONENT_VARIATION(sSceneHandle_AlDiNapoli, PED_COMP_LEG, 0, 0, sTargetPed.model) // default now has pants on show! so set trousers version for mocap #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - SET_CUTSCENE_PED_COMPONENT_VARIATION Di Napoli trousers FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF IF RC_IS_CUTSCENE_OK_TO_START(TRUE) // reset the vehicles positions from the initial scene incase the player had tampered with them B*1079638 // nigel's car IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.vehID[0]) ASSIGN_VEHICLE_INDEX(sNigelVehicle.vehicle, sRCLauncherDataLocal.vehID[0]) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "INTRO_MOCAP_SCENE - SS_SETUP assigned sRCLauncherData.vehID[0] as Nigel vehicle") ENDIF #ENDIF ENDIF IF IS_ENTITY_ALIVE(sNigelVehicle.vehicle) SET_VEHICLE_FIXED(sNigelVehicle.vehicle) SET_ENTITY_PROOFS(sNigelVehicle.vehicle, FALSE, FALSE, FALSE, FALSE, FALSE) // B*1281090 - initial scene set on, but turned back off when getting handle #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "INTRO_MOCAP_SCENE - SS_SETUP reset Nigel vehicle") ENDIF #ENDIF ENDIF //Target vehicle IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.vehID[1]) ASSIGN_VEHICLE_INDEX(sTargetVehicle.vehicle, sRCLauncherDataLocal.vehID[1]) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "INTRO_MOCAP_SCENE - SS_SETUP assigned sRCLauncherData.vehID[1] as Target vehicle") ENDIF #ENDIF ENDIF IF IS_ENTITY_ALIVE(sTargetVehicle.vehicle) SET_VEHICLE_FIXED(sTargetVehicle.vehicle) // potentially need to remove this and just have the mocap create me some new vehicles! SET_ENTITY_PROOFS(sTargetVehicle.vehicle, FALSE, FALSE, FALSE, FALSE, FALSE) // B*1281090 - initial scene set on, but turned back off when getting handle #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "INTRO_MOCAP_SCENE - SS_SETUP reset Target's vehicle") ENDIF #ENDIF ENDIF REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), sSceneHandle_Trevor, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) REGISTER_ENTITY_FOR_CUTSCENE(sNigelPed.ped, sSceneHandle_Nigel, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, sNigelPed.model) REGISTER_ENTITY_FOR_CUTSCENE(sMrsThornhillPed.ped, sSceneHandle_MrsThornhill, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, sMrsThornhillPed.model) REGISTER_ENTITY_FOR_CUTSCENE(sTargetPed.ped, sSceneHandle_AlDiNapoli, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, sTargetPed.model) IF IS_VEHICLE_OK(sNigelVehicle.vehicle) REGISTER_ENTITY_FOR_CUTSCENE(sNigelVehicle.vehicle, sSceneHandle_NigelVehicle, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) CPRINTLN(DEBUG_MISSION, "INTRO_MOCAP_SCENE - registering Nigel's vehicle existing entity to be animated by mocap") ELSE SAFE_DELETE_VEHICLE(sRCLauncherDataLocal.vehID[0]) SAFE_DELETE_VEHICLE(sNigelVehicle.vehicle) REGISTER_ENTITY_FOR_CUTSCENE(sNigelVehicle.vehicle, sSceneHandle_NigelVehicle, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, sNigelVehicle.model) CPRINTLN(DEBUG_MISSION, "INTRO_MOCAP_SCENE - registering Nigel's vehicle new entity to be created by mocap") ENDIF IF IS_VEHICLE_OK(sTargetVehicle.vehicle) REGISTER_ENTITY_FOR_CUTSCENE(sTargetVehicle.vehicle, sSceneHandle_AlDiNapoliVehicle, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) CPRINTLN(DEBUG_MISSION, "INTRO_MOCAP_SCENE - registering Target's vehicle existing entity to be animated by mocap") ELSE SAFE_DELETE_VEHICLE(sRCLauncherDataLocal.vehID[1]) SAFE_DELETE_VEHICLE(sTargetVehicle.vehicle) REGISTER_ENTITY_FOR_CUTSCENE(sTargetVehicle.vehicle, sSceneHandle_AlDiNapoliVehicle, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, sTargetVehicle.model) CPRINTLN(DEBUG_MISSION, "INTRO_MOCAP_SCENE - registering Target's vehicle new entity to be created by mocap") ENDIF SAFE_FADE_SCREEN_IN_FROM_BLACK(DEFAULT_FADE_TIME, FALSE) // backup fade in, mainly for repeat play purposes. REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW) START_CUTSCENE() WAIT(0) //added because the cutscene doesn't start straight away. This ensures peds / cars aren't visibly cleared. RC_CLEANUP_LAUNCHER() // ensure called same frame as mission blocking area are setup RC_START_CUTSCENE_MODE(<< -1310.70, -640.22, 26.54 >>, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE) //has to be after start_cutscene and wait(0) SETUP_CLEAR_AREAS_AND_VEHICLE_RESOLVE_FOR_INTRO_MOCAP() // remove the temporary RC entities which were in the initial scene SAFE_DELETE_PED(sRCLauncherDataLocal.pedID[0]) //SAFE_DELETE_VEHICLE(sRCLauncherDataLocal.vehID[0]) //SAFE_DELETE_VEHICLE(sRCLauncherDataLocal.vehID[1]) // B*1247905 - limit density for framerate rest of the scene SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.3) SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.3) LOAD_MISSION_ASSETS() UPDATE_SCRIPTED_VEHICLES_AROUND_START_LOCATION(fMainPlaybackSpeed, vPlayerPos) CPRINTLN(DEBUG_MISSION, "INTRO_MOCAP_SCENE - SS_SETUP done") eSubStage = SS_UPDATE ELSE //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "WAITING FOR INTRO MOCAP TO LOAD - NMT_2_RCM") ENDIF #ENDIF ENDIF ENDIF BREAK // ------------------------------------------ CASE SS_UPDATE UPDATE_SCRIPTED_VEHICLES_AROUND_START_LOCATION(fMainPlaybackSpeed, vPlayerPos) // Get handle to Nigel ped in the mocap IF NOT DOES_ENTITY_EXIST(sNigelPed.ped) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_Nigel)) sNigelPed.ped = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_Nigel)) CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - sNigelPed.ped - got handle to mocap registered entity FC = ", GET_FRAME_COUNT()) ENDIF ENDIF // Get handle to Nigel ped in the mocap IF NOT DOES_ENTITY_EXIST(sMrsThornhillPed.ped) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_MrsThornhill)) sMrsThornhillPed.ped = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_MrsThornhill)) CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - sMrsThornhillPed.ped - got handle to mocap registered entity FC = ", GET_FRAME_COUNT()) ENDIF ENDIF // Get handle to target ped in the mocap IF NOT DOES_ENTITY_EXIST(sTargetPed.ped) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_AlDiNapoli)) sTargetPed.ped = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_AlDiNapoli)) CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - sTargetPed.ped - got handle to mocap registered entity FC = ", GET_FRAME_COUNT()) ENDIF ENDIF // Get handle to Nigel's vehicle in the mocap IF NOT DOES_ENTITY_EXIST(sNigelVehicle.vehicle) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_NigelVehicle)) sNigelVehicle.vehicle = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_NigelVehicle)) CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - sNigelVehicle.vehicle - got handle to mocap registered entity FC = ", GET_FRAME_COUNT()) ENDIF ENDIF // Get handle to target's vehicle in the mocap IF NOT DOES_ENTITY_EXIST(sTargetVehicle.vehicle) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_AlDiNapoliVehicle)) sTargetVehicle.vehicle = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandle_AlDiNapoliVehicle)) CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - sTargetVehicle.vehicle - got handle to mocap registered entity FC = ", GET_FRAME_COUNT()) ENDIF ENDIF // Set exit state for Nigel, Mrs T and Nigel's vehicle IF IS_VEHICLE_OK(sNigelVehicle.vehicle) AND IS_PED_UNINJURED(sNigelPed.ped) AND IS_PED_UNINJURED(sMrsThornhillPed.ped) IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_Nigel) REPLAY_STOP_EVENT() IF NOT IS_PED_SITTING_IN_VEHICLE(sNigelPed.ped, sNigelVehicle.vehicle) SET_PED_INTO_VEHICLE(sNigelPed.ped, sNigelVehicle.vehicle, VS_FRONT_RIGHT) //FORCE_PED_AI_AND_ANIMATION_UPDATE(sNigelPed.ped) //FORCE_PED_MOTION_STATE(sNigelPed.ped, MS_DO_NOTHING, FALSE, FAUS_CUTSCENE_EXIT) CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - ", " set exit state for Nigel put in his car in ss_update Frame Count : ", GET_FRAME_COUNT()) ENDIF CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - ", " set exit state for Nigel in ss_update Frame Count : ", GET_FRAME_COUNT()) SETUP_NIGEL_FOR_IN_GAME_START() ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_MrsThornhill) IF NOT IS_PED_SITTING_IN_VEHICLE(sMrsThornhillPed.ped, sNigelVehicle.vehicle) SET_PED_INTO_VEHICLE(sMrsThornhillPed.ped, sNigelVehicle.vehicle, VS_BACK_RIGHT) //FORCE_PED_AI_AND_ANIMATION_UPDATE(sMrsThornhillPed.ped) //FORCE_PED_MOTION_STATE(sMrsThornhillPed.ped, MS_DO_NOTHING, FALSE, FAUS_CUTSCENE_EXIT) CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - ", " set exit state for Mrs T put in his car in ss_update Frame Count : ", GET_FRAME_COUNT()) ENDIF CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - ", " set exit state for Mrs T in ss_update Frame Count : ", GET_FRAME_COUNT()) SETUP_MRS_THORNHILL_FOR_IN_GAME_START() ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_NigelVehicle) CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - ", " set exit state for Nigel vehicle wcTF in ss_update Frame Count : ", GET_FRAME_COUNT()) SETUP_NIGEL_VEHICLE_FOR_IN_GAME_START() SET_VEHICLE_DOORS_SHUT(sNigelVehicle.vehicle, TRUE) SET_VEHICLE_ON_GROUND_PROPERLY(sNigelVehicle.vehicle) FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(sNigelVehicle.vehicle) // B*1404500 - stops doors staying open ENDIF // B*1546501 - stops vehicle pop after mocap - set this everyframe as soon as possible before exit state / end of mocap until a little while after SET_FORCE_HD_VEHICLE(sNigelVehicle.vehicle, TRUE) bSetNigelVehicleHDForMocapExit = TRUE ENDIF // Set exit state for Al Di Napoli IF IS_VEHICLE_OK(sTargetVehicle.vehicle) AND IS_PED_UNINJURED(sTargetPed.ped) IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_AlDiNapoli) IF NOT IS_PED_SITTING_IN_VEHICLE(sTargetPed.ped, sTargetVehicle.vehicle) SET_PED_INTO_VEHICLE(sTargetPed.ped, sTargetVehicle.vehicle, VS_DRIVER) CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - ", " set exit state for Al Di Napoli put in his car in ss_update Frame Count : ", GET_FRAME_COUNT()) ENDIF SETUP_TARGET_PED_FOR_IN_GAME_START() CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - ", " set exit state for Al Di Napoli in ss_update Frame Count : ", GET_FRAME_COUNT()) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_AlDiNapoliVehicle) CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - ", " set exit state for Al Di Napoli vehicle in ss_update Frame Count : ", GET_FRAME_COUNT()) SETUP_TARGET_VEHICLE_FOR_IN_GAME_START() SET_VEHICLE_DOORS_SHUT(sTargetVehicle.vehicle, TRUE) FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(sTargetVehicle.vehicle) // B*1404500 - stops doors staying open ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_CAMERA() SET_GAMEPLAY_CAM_RELATIVE_HEADING(22.0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) CPRINTLN(DEBUG_MISSION, "STAGE_INTRO_MOCAP_SCENE - ", " set exit state for camera (H = 15.0 | P = 0.0) in ss_update Frame Count : ", GET_FRAME_COUNT()) ENDIF IF WAS_CUTSCENE_SKIPPED() AND IS_SCREEN_FADED_OUT() // NOTE: if this gets removed consider moving SETUP_UBER_PLAYBACK() call or at least making sure vehicle are cleared for a skipped cutscene CLEAR_AREA_OF_VEHICLES(<<-1312.5560, -664.3428, 25.5716>>, 150) //larger area for skipping since we are faded down anyway #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Clear cars - skipped over the mocap FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF IF NOT IS_CUTSCENE_PLAYING() CPRINTLN(DEBUG_MISSION, "INTRO_MOCAP_SCENE - SS_UPDATE - mocap cutscene finished FC = ", GET_FRAME_COUNT()) LOAD_MISSION_ASSETS(TRUE) SETUP_FOR_START_OF_MISSION() SETUP_UBER_PLAYBACK(FALSE) eSubStage = SS_CLEANUP ELSE // B*1366548 - prevent cutscene skip during blend out IF GET_CUTSCENE_TIME() >= 104000 DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE) ENDIF // B*1359637 - prevent ambient cars spawning in distance during some shots // B*1506934 - prevent ambient peds spawning in distance during same shots IF GET_CUTSCENE_TIME() > 900 AND GET_CUTSCENE_TIME() < 1480 SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0) ELSE // B*1247905 - limit density for framerate rest of the scene SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.3) SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.3) ENDIF LOAD_MISSION_ASSETS() ENDIF BREAK // ------------------------------------------ CASE SS_CLEANUP IF IS_VEHICLE_OK(sNigelVehicle.vehicle) // B*1546501 - stops vehicle pop after mocap - set this everyframe as soon as possible before exit state / end of mocap until a little while after SET_FORCE_HD_VEHICLE(sNigelVehicle.vehicle, TRUE) bSetNigelVehicleHDForMocapExit = TRUE ENDIF IF IS_CUTSCENE_PLAYING() STOP_CUTSCENE() ELSE IF HAS_CUTSCENE_LOADED() REMOVE_CUTSCENE() ENDIF IF bFinishedStageSkipping //only do this if we aren't stage skipping RC_END_CUTSCENE_MODE() SET_MULTIHEAD_SAFE(FALSE) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "RC Nigel 2 : ", "INTRO_MOCAP_SCENE - SS_CLEANUP - RC_END_CUTSCENE_MODE() called as not skipping stage") ENDIF #ENDIF ENDIF bForceTargetblipFlashThisFrame = FALSE // initial set to false RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE) UPDATE_SCRIPTED_VEHICLES_AROUND_START_LOCATION(fMainPlaybackSpeed, vPlayerPos) SET_STAGE(MISSION_STAGE_CHASE_TARGET_IN_VEHICLE) // MISSION_STAGE_CHASE_TARGET_IN_VEHICLE //MISSION_STAGE_DEBUG CPRINTLN(DEBUG_MISSION, "INTRO_MOCAP_SCENE - SS_CLEANUP done") ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// car chases where Trevor, Nigel and Mrs Thornhill drives after Al Di Napoli PROC CHASE_TARGET_IN_VEHICLE() SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.3) // lower chance of peds interfering in route SWITCH eSubStage // ------------------------------------------ CASE SS_SETUP IF IS_PED_UNINJURED(sTargetPed.ped) AND IS_VEHICLE_OK(sTargetVehicle.vehicle) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sTargetPed.ped, TRUE) //BUT HE STILL GETS OUT OF THE VEHICLE IF ITS NOT DRIVEABLE! SET_PED_RESET_FLAG(sTargetPed.ped, PRF_UseFastEnterExitVehicleRates, TRUE) ADD_ENTITY_TO_AUDIO_MIX_GROUP(sTargetVehicle.vehicle, "NIGEL_02_CHASE_CAR_MG") #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " NIGEL 02 - AUDIO_SCENE target vehicle added : NIGEL_02_CHASE ", "***") ENDIF #ENDIF ENDIF IF IS_PED_UNINJURED(sMrsThornhillPed.ped) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sMrsThornhillPed.ped, TRUE) ENDIF IF IS_PED_UNINJURED(sNigelPed.ped) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sNigelPed.ped, TRUE) ENDIF IF IS_VEHICLE_OK(sNigelVehicle.vehicle) IF NOT bStatTracker_IsNigelVehicleDamageStatActive INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(sNigelVehicle.vehicle,NI2_VEHICLE_DAMAGE) // begin tracking nigel's vehicle damage for stats bStatTracker_IsNigelVehicleDamageStatActive = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHASE_TARGET_IN_VEHICLE - INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(sNigelVehicle.vehicle)") ENDIF #ENDIF ENDIF // B*1546501 - stops vehicle pop after mocap - set this everyframe as soon as possible before exit state / end of mocap until a little while after SET_FORCE_HD_VEHICLE(sNigelVehicle.vehicle, TRUE) bSetNigelVehicleHDForMocapExit = TRUE ENDIF REPLAY_RECORD_BACK_FOR_TIME(0.0, 15.0, REPLAY_IMPORTANCE_LOW) UPDATE_SCRIPTED_VEHICLES_AROUND_START_LOCATION(fMainPlaybackSpeed, vPlayerPos) SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_ForceDirectEntry, TRUE) // ensure player uses direct door access as per bug 1044490 CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID()) // clear this ready to be used by player injuring / killing someone inside the hospital checks CPRINTLN(DEBUG_MISSION, "CHASE_TARGET_IN_VEHICLE - SS_SETUP done") eSubStage = SS_UPDATE BREAK // ------------------------------------------ CASE SS_UPDATE MANAGE_TRIGGER_MUSIC_EVENTS_DURING_CHASE(NIGEL2_MUSIC_EVENT_START) MANAGE_HOSPITAL_STATE_DURING_CHASE() bForceTargetblipFlashThisFrame = FALSE // initial set to false // used by mission fail checks, dialogue triggers, uber recording rubberbanding IF DOES_ENTITY_EXIST(sTargetVehicle.vehicle) fCurrentChaseDistance = VDIST(vPlayerPos, GET_ENTITY_COORDS(sTargetVehicle.vehicle, FALSE)) ENDIF IF IS_PED_UNINJURED(sTargetPed.ped) IF IS_VEHICLE_OK(sTargetVehicle.vehicle) /* IF IS_VEHICLE_OK(sNigelVehicle.vehicle) IF (GET_VEHICLE_ENGINE_HEALTH(sNigelVehicle.vehicle) < 800.0) SET_VEHICLE_ENGINE_HEALTH(sNigelVehicle.vehicle, 800.0) //ensure the nigrl vehicle doesn't get wrecked. ENDIF ENDIF */ IF NOT bDone_TargetStartChaseRoute SET_PED_RESET_FLAG(sTargetPed.ped, PRF_UseFastEnterExitVehicleRates, TRUE) IF IS_PED_SITTING_IN_VEHICLE(sTargetPed.ped, sTargetVehicle.vehicle) AND (GET_PED_IN_VEHICLE_SEAT(sTargetVehicle.vehicle, VS_DRIVER) = sTargetPed.ped) IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) FREEZE_ENTITY_POSITION(sTargetVehicle.vehicle, FALSE) START_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle, iMainCarRecID, sNigel2_UberRecordingName) FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sTargetVehicle.vehicle) fCurrentPlaybackTime = GET_TIME_POSITION_IN_RECORDING(sTargetVehicle.vehicle) //fMainPlaybackSpeed = 0.85 // 1.0 reduce speed to begin with to allow player chance to get in the car fMainPlaybackSpeed = 0.85 // 1.0 // REMOVE BEFORE SUBMIT SET_PLAYBACK_SPEED(sTargetVehicle.vehicle, fMainPlaybackSpeed) PRELOAD_UBER_RECORDINGS_DURING_PLAYBACK() UPDATE_UBER_PLAYBACK(sTargetVehicle.vehicle, fMainPlaybackSpeed) UPDATE_CHASE_VEHICLES_FROM_UBER_RECORDING() IF NOT IS_AUDIO_SCENE_ACTIVE("NIGEL_02_CHASE") IF NOT IS_REPLAY_BEING_SET_UP() // don't allow music events to trigger during replay setup / stage skips AND bFinishedStageSkipping START_AUDIO_SCENE("NIGEL_02_CHASE") #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " NIGEL 02 - START_AUDIO_SCENE : NIGEL_02_CHASE ", "***") ENDIF #ENDIF ELSE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " NIGEL 02 - START_AUDIO_SCENE : skipped for replay being active NIGEL_02_CHASE ", "***") ENDIF #ENDIF ENDIF ENDIF /*// B* 1490105 - currently only reliable way to stop peds drivign the uber cars interfering with uber chase because of reaction to player shooting looks pretty gash since no one reacts...would of been better if uber veh don't react until released and when released have the can't use veh flee flag set so they just dive out the car IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS_FOR_AMBIENT_PEDS_THIS_FRAME(TRUE) ENDIF*/ bDone_TargetStartChaseRoute = TRUE CPRINTLN(DEBUG_MISSION, "bDone_TargetStartChaseRoute - UBER CHASE started FC : ", GET_FRAME_COUNT()) ENDIF ENDIF ELSE IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) fCurrentPlaybackTime = GET_TIME_POSITION_IN_RECORDING(sTargetVehicle.vehicle) UPDATE_UBER_CHASE_SPEED(fMainPlaybackSpeed, fCurrentPlaybackTime) SET_PLAYBACK_SPEED(sTargetVehicle.vehicle, fMainPlaybackSpeed) PRELOAD_UBER_RECORDINGS_DURING_PLAYBACK() UPDATE_UBER_PLAYBACK(sTargetVehicle.vehicle, fMainPlaybackSpeed) UPDATE_CHASE_VEHICLES_FROM_UBER_RECORDING() MANAGE_TARGET_BRAKING_AND_USING_HORN() APPLY_VISUAL_DAMAGE_TO_TARGET_VEHICLE() CREATE_VEHICLE_FOR_PLAYER_TO_USE_ON_MISSION_PASSED() IF fCurrentPlaybackTime > 82000.0 // attempt to get cars on the highway to reliably spawn in AND fCurrentPlaybackTime < 105000.0 //fUberPlaybackMinCreationDistance = 80.0 //The minimum distance a car has to be from the player to be allowed to create. FROM traffic.sch CREATE_ALL_WAITING_UBER_CARS() ENDIF /*// B* 1490105 - currently only reliable way to stop peds drivign the uber cars interfering with uber chase because of reaction to player shooting looks pretty gash since no one reacts...would of been better if uber veh don't react until released and when released have the can't use veh flee flag set so they just dive out the car IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS_FOR_AMBIENT_PEDS_THIS_FRAME(TRUE) ENDIF*/ //NOTE: temp as cars are taking far more damage in latest build IF (GET_VEHICLE_ENGINE_HEALTH(sTargetVehicle.vehicle) < 800.0) SET_VEHICLE_ENGINE_HEALTH(sTargetVehicle.vehicle, 800.0) //ensure the target vehicle doesn't get wrecked. ENDIF ELSE IF NOT bDone_UberRecordingCleanupForChaseEnd //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "END PLAYBACK TIME IS - ", fCurrentPlaybackTime) ENDIF #ENDIF CLEANUP_UBER_PLAYBACK() REMOVE_ALL_CAR_RECORDINGS_FOR_UBER_CHASE() //main car recording REMOVE_VEHICLE_RECORDING(iMainCarRecID, sNigel2_UberRecordingName) REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(sTargetVehicle.vehicle) IF IS_AUDIO_SCENE_ACTIVE("NIGEL_02_CHASE") STOP_AUDIO_SCENE("NIGEL_02_CHASE") #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " NIGEL 02 - STOP_AUDIO_SCENE : NIGEL_02_CHASE ", "***") ENDIF #ENDIF ENDIF SETUP_CRASH_SITE_FOR_OUTRO_MOCAP() SETUP_TARGET_FOR_CRASH() IF fCurrentPlaybackTime < NIGEL2_TARGET_VEHICLE_VISUAL_DAMAGE_POINT //mainly for debug skip purpose, it sets time pass point the damage can be applied fCurrentPlaybackTime = (NIGEL2_TARGET_VEHICLE_VISUAL_DAMAGE_POINT + 1000.0) //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "INCREASED PLAYBACK TIME MANUALLY FOR VISUAL DAMAGE IN SS_CLEANUP") ENDIF #ENDIF ENDIF APPLY_VISUAL_DAMAGE_TO_TARGET_VEHICLE() #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UBER RECORDING ENDED, set up for crash scene") ENDIF #ENDIF bDone_UberRecordingCleanupForChaseEnd = TRUE ELSE SET_TARGET_PLAY_HEAD_ON_WHEEL_ANIM() ENDIF ENDIF ENDIF ENDIF IF bDoneCleanup_JumpOutHospitalWindow // B*1557320 - don't allow during scripted camera jump out the window CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, sTargetPed.ped) ENDIF MANAGE_RAYFIRE_HOSPITAL_DOORS() MANAGE_HOSPITAL_SOUND_FX() UPDATE_SCENARIO_BLOCKING_ON_CHASE_ROUTE(fCurrentPlaybackTime) MANAGE_PEDESTRIANS_ON_CHASE_ROUTE(vPlayerPos) MANAGE_HOSPITAL_DEBRIS_EFFECT() NIG2_TRACK_STAT_PLAYER_KEEPS_CLOSE_TO_TARGET() UPDATE_SCRIPTED_VEHICLES_AROUND_START_LOCATION(fMainPlaybackSpeed, vPlayerPos) //this needs to be below uber stuff as it uses fPlaybackTime IF IS_VEHICLE_OK(sNigelVehicle.vehicle) AND IS_PED_UNINJURED(sNigelPed.ped) AND IS_PED_UNINJURED(sMrsThornhillPed.ped) IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sNigelVehicle.vehicle) IF IS_THIS_PRINT_BEING_DISPLAYED("NIGEL2_03") CLEAR_THIS_PRINT("NIGEL2_03") ENDIF IF IS_THIS_PRINT_BEING_DISPLAYED("NIGEL2_04") CLEAR_THIS_PRINT("NIGEL2_04") // Get back in ~b~Nigel's car.~s~ ENDIF SAFE_REMOVE_BLIP(sNigelVehicle.blip) // reset flag once player is in the vehice IF bSetNigelVehicleHDForMocapExit SET_FORCE_HD_VEHICLE(sNigelVehicle.vehicle, FALSE) // B*1546501 - stops vehicle pop after mocap bSetNigelVehicleHDForMocapExit = FALSE ENDIF // check if nigel and mrs T are in the car IF NOT IS_PED_SITTING_IN_VEHICLE(sNigelPed.ped, sNigelVehicle.vehicle) OR NOT IS_PED_SITTING_IN_VEHICLE(sMrsThornhillPed.ped, sNigelVehicle.vehicle) SAFE_REMOVE_BLIP(sTargetPed.blip) IF IS_THIS_PRINT_BEING_DISPLAYED("NIGEL2_04") CLEAR_THIS_PRINT("NIGEL2_04") //Chase after ~r~Al Di Napoli.~w~ ENDIF //IF NOT bDoneObjective_WaitForNigelAndMrsT // PRINT_NOW("NIGEL2_05", DEFAULT_GOD_TEXT_TIME, 1) //Wait for ~b~Nigel and Mrs Thornhill.~w~ // bDoneObjective_WaitForNigelAndMrsT = TRUE //ENDIF ELSE //get the engine on quicker for the player at the start of the chase IF NOT bDone_TurnEngineOnForPlayer IF (GET_PED_IN_VEHICLE_SEAT(sNigelVehicle.vehicle, VS_DRIVER) = PLAYER_PED_ID()) SET_VEHICLE_ENGINE_ON(sNigelVehicle.vehicle, TRUE, FALSE) //!!! comment out for now as something changed in v189.1 making it really quick, too fast for the target bDone_TurnEngineOnForPlayer = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TURNED ENGINE ON FOR THE PLAYER") ENDIF #ENDIF ENDIF ENDIF MANAGE_TRIGGER_MUSIC_EVENTS_DURING_CHASE(NIGEL2_MUSIC_EVENT_CAR) IF NOT bDone_PlayerInNigelVehicle_FirstTime PRINT_NOW("NIGEL2_01", DEFAULT_GOD_TEXT_TIME, 1) //Chase after ~r~Al Di Napoli.~w~ bDone_PlayerInNigelVehicle_FirstTime = TRUE ENDIF bDone_KillConvoForOutTheVehicleDialogue = FALSE //reset bool used to stop dialogue when player gets out the car IF IS_THIS_PRINT_BEING_DISPLAYED("NIGEL2_05") CLEAR_THIS_PRINT("NIGEL2_05") //return to ~b~Nigel~w~ ENDIF IF IS_THIS_PRINT_BEING_DISPLAYED("NIGEL2_08") CLEAR_THIS_PRINT("NIGEL2_08") //return to ~b~Nigel~s~ and ~b~Mrs. Thornhill.~s~ ENDIF IF IS_THIS_PRINT_BEING_DISPLAYED("NIGEL2_09") CLEAR_THIS_PRINT("NIGEL2_09") //Return to ~b~Mrs. Thornhill.~s~ ENDIF MANAGE_DIALOGUE_DURING_CHASE(bForceTargetblipFlashThisFrame) // needs to come before UPDATE_CHASE_BLIP since it sets bForceTargetblipFlashThisFrame IF NOT DOES_BLIP_EXIST(sTargetPed.blip) sTargetPed.blip = CREATE_PED_BLIP(sTargetPed.ped, TRUE, FALSE) ELSE IF IS_PED_IN_ANY_VEHICLE(sTargetPed.ped) SET_BLIP_SCALE(sTargetPed.blip, 1.0) //TEMP: added as per bug 241312 ENDIF // must come after MANAGE_DIALOGUE_DURING_CHASE since this controls bForceTargetblipFlashThisFrame override UPDATE_CHASE_BLIP(sTargetPed.blip, sTargetPed.ped, NIGEL2_TARGET_ESCAPED_DISTANCE, NIGEL2_FLASH_CHASE_BLIP_PERCENTAGE, bForceTargetblipFlashThisFrame) ENDIF //Check for player close to target at end of the chase. IF bDone_TargetStartChaseRoute IF bDone_UberRecordingCleanupForChaseEnd //DRAW_DEBUG_SPHERE(GET_ENTITY_COORDS(sTargetPed.ped), NIGEL2_PLAYER_CLOSE_TO_TARGET_CRASHED, 0, 0, 255, 120) IF(fCurrentChaseDistance < NIGEL2_PLAYER_CLOSE_TO_TARGET_CRASHED) CPRINTLN(DEBUG_MISSION, "CHASE_TARGET_IN_VEHICLE - SS_UPDATE - PLAYER CLOSE TO CRASHED AL DI NAPOLI - GO TO PUT IN BOOT SECTION") eSubStage = SS_CLEANUP ENDIF ENDIF ENDIF ENDIF MANAGE_HOSPITAL_JUMP_FX() ELSE // B*1546501 - stops vehicle pop after mocap - keep applying everyframe whilst it has initially been applied IF bSetNigelVehicleHDForMocapExit SET_FORCE_HD_VEHICLE(sNigelVehicle.vehicle, TRUE) bSetNigelVehicleHDForMocapExit = TRUE ENDIF SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_ForceDirectEntry, FALSE) // reset flag for ensure player uses direct door access as per bug 1044490 SAFE_REMOVE_BLIP(sTargetPed.blip) IF NOT DOES_BLIP_EXIST(sNigelVehicle.blip) sNigelVehicle.blip = CREATE_VEHICLE_BLIP(sNigelVehicle.vehicle, TRUE, BLIPPRIORITY_HIGH) ENDIF IF NOT bDone_PlayerInNigelVehicle_FirstTime IF NOT bDoneDialogue_GetInNigelsVehicle[0] IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_DAWDM", CONV_PRIORITY_MEDIUM) // Come on Jock, get in! bDoneDialogue_GetInNigelsVehicle[0] = TRUE ENDIF ELIF NOT bDoneObjective_Initial_GetInNigelsVehicle IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() PRINT_NOW("NIGEL2_03", DEFAULT_GOD_TEXT_TIME, 1) //Get into ~b~Nigel's car.~w~ bDoneObjective_Initial_GetInNigelsVehicle = TRUE ENDIF ELIF NOT bDoneDialogue_GetInNigelsVehicle[1] //IF NOT IS_THIS_PRINT_BEING_DISPLAYED("NIGEL2_03") //*commented out for new display message check with subtitle profile settings IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IS_PED_SITTING_IN_VEHICLE(sNigelPed.ped, sNigelVehicle.vehicle) AND IS_PED_SITTING_IN_VEHICLE(sMrsThornhillPed.ped, sNigelVehicle.vehicle) IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_SPOTSP", CONV_PRIORITY_HIGH) // Hurry, we're going to lose him! bDoneDialogue_GetInNigelsVehicle[1] = TRUE ENDIF ENDIF ENDIF ELSE //kill off any dialogue which is based on the player being in the car IF NOT bDone_KillConvoForOutTheVehicleDialogue IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF bDone_KillConvoForOutTheVehicleDialogue = TRUE ENDIF IF NOT bDoneObjective_GetBackInVehicle PRINT_NOW("NIGEL2_04", DEFAULT_GOD_TEXT_TIME, 1) //Get back into ~b~Nigel's car.~w~ iTimer_TrevorGetBackInCarDialogue = GET_GAME_TIMER() bDoneObjective_GetBackInVehicle = TRUE ELSE //IF NOT IS_THIS_PRINT_BEING_DISPLAYED("NIGEL2_04") //Get back into ~b~Nigel's car.~w~ //*commented out for new display message check with subtitle profile settings IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF (fDistPlayerToNigelVehicle < 20.0) //fDistPlayerToNigelVehicle is calculated in MISSION_FAILED_CHECKS() IF (GET_GAME_TIMER() - iTimer_TrevorGetBackInCarDialogue) > GET_RANDOM_INT_IN_RANGE(4500, 6500) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sNigelVehicle.vehicle) //needed to test him in getting in car state //Do additional dialogue telling player to get back in the car // random select between Nigel and Mrs Thornhill comments IF (GET_RANDOM_INT_IN_RANGE(0, 11) > 5) // Nigel lines IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_GIC", CONV_PRIORITY_HIGH) // Jock, what are you doing? // Where are you going? // We've come this far, don't desert us now! #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - trevor leaving N & MRS T behind - NIG2_GIC") ENDIF #ENDIF ENDIF ELSE // Mrs Thornhill lines IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_GIC2", CONV_PRIORITY_HIGH) // Jock! Please! We need you! // We'll never catch him on foot, not with Nigel's hip! #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE -trevor leaving N & MRS T behind - NIG2_GIC2") ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ELSE iTimer_TrevorGetBackInCarDialogue = GET_GAME_TIMER() ENDIF //ENDIF ENDIF ENDIF HANDLE_BUDDY_HEAD_TRACK_WHILE_ENTERING_VEHICLE() // make buddy's look at the player as he enters the vehicle. ENDIF ENDIF ENDIF MANAGE_JUMP_OUT_HOSPITAL_WINDOW() NIG2_TRACK_STAT_HAS_PLAYER_INJURED_PED_WHILST_IN_HOSPITAL() BREAK // ------------------------------------------ CASE SS_CLEANUP IF NOT bDone_UberRecordingCleanupForChaseEnd CLEANUP_UBER_PLAYBACK() REMOVE_ALL_CAR_RECORDINGS_FOR_UBER_CHASE() IF IS_ENTITY_ALIVE(sTargetVehicle.vehicle) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) //check if its at the end time wise, if so freeze its pos? STOP_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle) // SKIP_TO_END_AND_STOP_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle) ENDIF FREEZE_ENTITY_POSITION(sTargetVehicle.vehicle, TRUE) ENDIF REMOVE_VEHICLE_RECORDING(iMainCarRecID, sNigel2_UberRecordingName) SETUP_CRASH_SITE_FOR_OUTRO_MOCAP() IF IS_AUDIO_SCENE_ACTIVE("NIGEL_02_CHASE") STOP_AUDIO_SCENE("NIGEL_02_CHASE") #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHASE_TARGET_IN_VEHICLE : SS_CLEANUP : STOP_AUDIO_SCENE : NIGEL_02_CHASE ", "***") ENDIF #ENDIF ENDIF IF fCurrentPlaybackTime < NIGEL2_TARGET_VEHICLE_VISUAL_DAMAGE_POINT //mainly for debug skip purpose, it sets time pass point the damage can be applied fCurrentPlaybackTime = (NIGEL2_TARGET_VEHICLE_VISUAL_DAMAGE_POINT + 1000.0) //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "INCREASED PLAYBACK TIME MANUALLY FOR VISUAL DAMAGE IN SS_CLEANUP") ENDIF #ENDIF ENDIF APPLY_VISUAL_DAMAGE_TO_TARGET_VEHICLE() SETUP_TARGET_FOR_CRASH() //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UBER RECORDING ENDED IN SS_CLEANUP") ENDIF #ENDIF bDone_UberRecordingCleanupForChaseEnd = TRUE ENDIF IF IS_ENTITY_ALIVE(sTargetPed.ped) IF bDoneCleanup_JumpOutHospitalWindow // B*1557320 - don't allow during scripted camera jump out the window CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, sTargetPed.ped) ENDIF ENDIF MANAGE_JUMP_OUT_HOSPITAL_WINDOW() IF bStatTracker_IsNigelVehicleDamageStatActive INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL,NI2_VEHICLE_DAMAGE) // end tracking nigel's vehicle damage for stats bStatTracker_IsNigelVehicleDamageStatActive = FALSE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHASE_TARGET_IN_VEHICLE - SS_CLEANUP - INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL)") ENDIF #ENDIF ENDIF /*IF NOT IS_REPLAY_BEING_SET_UP() IF eHospitalInteriorState = HIS_ACTIVE_NEW_LOAD_SCENE_AT_INTERIOR OR eHospitalInteriorState = HIS_CLEANUP_NEW_LOAD_SCENE_AT_INTERIOR IF IS_NEW_LOAD_SCENE_ACTIVE() NEW_LOAD_SCENE_STOP() eHospitalInteriorState = HIS_END CPRINTLN(DEBUG_MISSION, " CHASE_TARGET_IN_VEHICLE : IS_NEW_LOAD_SCENE_ACTIVE - NEW_LOAD_SCENE_STOP() : FC = ", GET_FRAME_COUNT()) ENDIF ENDIF ENDIF*/ SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE) //KILL_ANY_CONVERSATION() IF bDone_HospitalJumpPaperTrailFX IF DOES_PARTICLE_FX_LOOPED_EXIST(HospitalJump_PTFX_ID) STOP_PARTICLE_FX_LOOPED(HospitalJump_PTFX_ID) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PTFX hospital jump stopped FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF //hospital sfx cleanup RELEASE_SCRIPT_AUDIO_BANK() SET_STAGE(MISSION_STAGE_GET_CLOSE_TO_TARGET_FOR_CUTSCENE) CPRINTLN(DEBUG_MISSION, "CHASE_TARGET_IN_VEHICLE - SS_CLEANUP done") BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Al Di Napoli has crashed and the player has got close to him. /// Player instructed to park alongside An Di Napoli PROC GET_CLOSE_TO_TARGET_FOR_CUTSCENE() SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.3) // lower chance of peds interfering in route REQUEST_VEHICLE_RECORDING(1, sNigel2_CarRecNigelOutro) // make sure the recording for Nigel driving off in the outro mocap is loaded ready MANAGE_OUTRO_MOCAP_LOADING() SET_TARGET_PLAY_HEAD_ON_WHEEL_ANIM() SWITCH eSubStage // ------------------------------------------ CASE SS_SETUP MANAGE_JUMP_OUT_HOSPITAL_WINDOW() iTimer_OutroMocapDelay = GET_GAME_TIMER() IF IS_PED_UNINJURED(sTargetPed.ped) IF bDoneCleanup_JumpOutHospitalWindow // B*1557320 - don't allow during scripted camera jump out the window CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, sTargetPed.ped) ENDIF ENDIF eSubStage = SS_UPDATE CPRINTLN(DEBUG_MISSION, "GET_CLOSE_TO_TARGET_FOR_CUTSCENE - SS_SETUP done") BREAK // ------------------------------------------ CASE SS_UPDATE IF IS_PED_UNINJURED(sTargetPed.ped) IF bDoneCleanup_JumpOutHospitalWindow // B*1557320 - don't allow during scripted camera jump out the window CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, sTargetPed.ped) ENDIF IF DOES_ENTITY_EXIST(sTargetVehicle.vehicle) fCurrentChaseDistance = VDIST(vPlayerPos, GET_ENTITY_COORDS(sTargetVehicle.vehicle, FALSE)) ENDIF IF IS_VEHICLE_OK(sNigelVehicle.vehicle) AND IS_PED_UNINJURED(sNigelPed.ped) AND IS_PED_UNINJURED(sMrsThornhillPed.ped) IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sNigelVehicle.vehicle) IF IS_THIS_PRINT_BEING_DISPLAYED("NIGEL2_04") CLEAR_THIS_PRINT("NIGEL2_04") // Get back in ~b~Nigel's car.~s~ ENDIF bDone_KillConvoForOutTheVehicleDialogue = FALSE //reset bool used to stop dialogue when player gets out the car SAFE_REMOVE_BLIP(sNigelVehicle.blip) MANAGE_DIALOGUE_DURING_CHASE(bForceTargetblipFlashThisFrame) // needs to come before UPDATE_CHASE_BLIP since it sets bForceTargetblipFlashThisFrame IF NOT DOES_BLIP_EXIST(sTargetPed.blip) sTargetPed.blip = CREATE_PED_BLIP(sTargetPed.ped, TRUE, FALSE) ELSE IF IS_PED_IN_ANY_VEHICLE(sTargetPed.ped) SET_BLIP_SCALE(sTargetPed.blip, 1.0) //TEMP: added as per bug 241312 ENDIF // must come after MANAGE_DIALOGUE_DURING_CHASE since this controls bForceTargetblipFlashThisFrame override UPDATE_CHASE_BLIP(sTargetPed.blip, sTargetPed.ped, NIGEL2_TARGET_ESCAPED_DISTANCE, NIGEL2_FLASH_CHASE_BLIP_PERCENTAGE, bForceTargetblipFlashThisFrame) ENDIF IF IS_ENTITY_IN_ANGLED_AREA(sNigelVehicle.vehicle, <<381.915619,-628.101440,22.932293>>, <<394.477234,-606.126953,35.774826>>, 18.500000) IF IS_VEHICLE_SETTLED_FOR_CUTSCENE(sNigelVehicle.vehicle) // must be settle up min 500 ms IF HAS_TIME_PASSED(iTimer_OutroMocapDelay, 500) eSubStage = SS_CLEANUP CPRINTLN(DEBUG_MISSION, "GET_CLOSE_TO_TARGET_FOR_CUTSCENE - SS_UPDATE - in range and not in air to trigger cutscene") ENDIF ELSE iTimer_OutroMocapDelay = GET_GAME_TIMER() ENDIF ELSE iTimer_OutroMocapDelay = GET_GAME_TIMER() ENDIF ELSE SAFE_REMOVE_BLIP(sTargetPed.blip) IF NOT DOES_BLIP_EXIST(sNigelVehicle.blip) sNigelVehicle.blip = CREATE_VEHICLE_BLIP(sNigelVehicle.vehicle, TRUE, BLIPPRIORITY_HIGH) ENDIF //kill off any dialogue which is based on the player being in the car IF NOT bDone_KillConvoForOutTheVehicleDialogue IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF bDone_KillConvoForOutTheVehicleDialogue = TRUE ENDIF IF NOT bDoneObjective_GetBackInVehicle PRINT_NOW("NIGEL2_04", DEFAULT_GOD_TEXT_TIME, 1) //Get back into ~b~Nigel's car.~w~ iTimer_TrevorGetBackInCarDialogue = GET_GAME_TIMER() bDoneObjective_GetBackInVehicle = TRUE ELSE //IF NOT IS_THIS_PRINT_BEING_DISPLAYED("NIGEL2_04") //Get back into ~b~Nigel's car.~w~ //*commented out for new display message check with subtitle profile settings IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF (fDistPlayerToNigelVehicle < 20.0) //fDistPlayerToNigelVehicle is calculated in MISSION_FAILED_CHECKS() IF (GET_GAME_TIMER() - iTimer_TrevorGetBackInCarDialogue) > GET_RANDOM_INT_IN_RANGE(4500, 6500) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sNigelVehicle.vehicle) //needed to test him in getting in car state //Do additional dialogue telling player to get back in the car // random select between Nigel and Mrs Thornhill comments IF (GET_RANDOM_INT_IN_RANGE(0, 11) > 5) // Nigel lines IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_GIC", CONV_PRIORITY_HIGH) // Jock, what are you doing? // Where are you going? // We've come this far, don't desert us now! #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE - trevor leaving N & MRS T behind - NIG2_GIC") ENDIF #ENDIF ENDIF ELSE // Mrs Thornhill lines IF NIG2_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG2AUD", "NIG2_GIC2", CONV_PRIORITY_HIGH) // Jock! Please! We need you! // We'll never catch him on foot, not with Nigel's hip! #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_DIALOGUE_DURING_CHASE -trevor leaving N & MRS T behind - NIG2_GIC2") ENDIF #ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ELSE iTimer_TrevorGetBackInCarDialogue = GET_GAME_TIMER() ENDIF //ENDIF ENDIF HANDLE_BUDDY_HEAD_TRACK_WHILE_ENTERING_VEHICLE() // make buddy's look at the player as he enters the vehicle. iTimer_OutroMocapDelay = GET_GAME_TIMER() ENDIF ENDIF NIG2_TRACK_STAT_PLAYER_KEEPS_CLOSE_TO_TARGET() ENDIF MANAGE_JUMP_OUT_HOSPITAL_WINDOW() NIG2_TRACK_STAT_HAS_PLAYER_INJURED_PED_WHILST_IN_HOSPITAL() BREAK // ------------------------------------------ CASE SS_CLEANUP SAFE_REMOVE_BLIP(sNigelVehicle.blip) SAFE_REMOVE_BLIP(sTargetPed.blip) CLEAR_PRINTS() CLEAR_HELP() KILL_CHASE_HINT_CAM(localChaseHintCamStruct) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION() ENDIF IF NOT bDoneCleanup_JumpOutHospitalWindow SET_CHANGES_FOR_FORCED_CINEMATIC_JUMP_OUT_HOSPITAL_WINDOW(FALSE) REPLAY_STOP_EVENT() // B*1841676 - cleanup the record jump out of the hospital window bDoneCleanup_JumpOutHospitalWindow = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_JUMP_OUT_HOSPITAL_WINDOW - bDoneCleanup_JumpOutHospitalWindow early for nigel's vehicle being wrecked") ENDIF #ENDIF ENDIF //hospital debris cleanup IF DOES_PARTICLE_FX_LOOPED_EXIST(HospitalDebris_PTFX_ID) STOP_PARTICLE_FX_LOOPED(HospitalDebris_PTFX_ID) ENDIF eHospitalDoorsObjectState = HDO_END SAFE_DELETE_OBJECT(sObjectHospitalDoors.objectIndex) REMOVE_PTFX_ASSET() IF NOT IS_REPLAY_BEING_SET_UP() // don't allow music events to trigger during replay setup / stage skips AND bFinishedStageSkipping SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL2_STOP") ENDIF MANAGE_TRIGGER_MUSIC_EVENTS_DURING_CHASE(NIGEL2_MUSIC_EVENT_STOP) SET_STAGE(MISSION_STAGE_END_CUTSCENE_MOCAP) CPRINTLN(DEBUG_MISSION, "GET_CLOSE_TO_TARGET_FOR_CUTSCENE - SS_CLEANUP done") BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Trevor throws Al Di Napoli in the boot of Nigel's car PROC STAGE_END_CUTSCENE_MOCAP() SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.3) // lower chance of peds interfering in route SWITCH eSubStage // ------------------------------------------ CASE SS_SETUP // don't request the mocap if we are skipping past this stage IF NOT bFinishedStageSkipping IF NOT IS_REPLAY_BEING_SET_UP() //SAFE_TELEPORT_PED_OUT_OF_THEIR_VEHICLE(PLAYER_PED_ID()) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) ENDIF CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP setup done for skip, heading to SS_CLEANUP = Frame Count :", GET_FRAME_COUNT()) eSubStage = SS_CLEANUP ELSE DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT) // B*1521637 - dive off car for cutscene RC_REQUEST_MID_MISSION_CUTSCENE(tlOutroMocapName) // can't use RC_REQUEST_CUTSCENE in this instance, as it causes bug 1000899 REQUEST_VEHICLE_RECORDING(1, sNigel2_CarRecNigelOutro) // make sure the recording for Nigel driving off in the outro mocap is loaded ready #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP ; RC_REQUEST_MID_MISSION_CUTSCENE : NMT_2_MCS_2 - Frame Count : ", GET_FRAME_COUNT()) ENDIF #ENDIF SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP() IF IS_ENTITY_ALIVE(sTargetVehicle.vehicle) SET_ENTITY_PROOFS(sTargetVehicle.vehicle, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE) // B*1954082 - stop window smash during transition to cutscene CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP ; setting target veh collision proof this frame : ", GET_FRAME_COUNT()) ENDIF IF HAS_VEHICLE_RECORDING_BEEN_LOADED(1, sNigel2_CarRecNigelOutro) AND NOT SAFE_IS_PED_PLAYING_AMBIENT_SPEECH(sMrsThornhillPed.ped) // don't cut of Nig or Mrs T ambient comments AND NOT SAFE_IS_PED_PLAYING_AMBIENT_SPEECH(sNigelPed.ped) IF RC_IS_CUTSCENE_OK_TO_START(TRUE) REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), sSceneHandle_Trevor, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) IF IS_ENTITY_ALIVE(sNigelPed.ped) REGISTER_ENTITY_FOR_CUTSCENE(sNigelPed.ped, sSceneHandle_Nigel, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF IS_ENTITY_ALIVE(sMrsThornhillPed.ped) REGISTER_ENTITY_FOR_CUTSCENE(sMrsThornhillPed.ped, sSceneHandle_MrsThornhill, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF IS_ENTITY_ALIVE(sTargetPed.ped) REGISTER_ENTITY_FOR_CUTSCENE(sTargetPed.ped, sSceneHandle_AlDiNapoli, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF IS_ENTITY_ALIVE(sNigelVehicle.vehicle) REGISTER_ENTITY_FOR_CUTSCENE(sNigelVehicle.vehicle, sSceneHandle_NigelVehicle, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF IS_ENTITY_ALIVE(sTargetVehicle.vehicle) REGISTER_ENTITY_FOR_CUTSCENE(sTargetVehicle.vehicle, sSceneHandle_AlDiNapoliVehicle, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) // B*1954082 - stop sparks from vehicle on transition to cutscene REMOVE_PARTICLE_FX_IN_RANGE(GET_ENTITY_COORDS(sTargetVehicle.vehicle, FALSE), 4.0) ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - ", "REGISTER_ENTITY_FOR_CUTSCENE done Frame Count : ", GET_FRAME_COUNT()) ENDIF #ENDIF REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW) START_CUTSCENE() WAIT(0) //needed because cutscene doesn't start straight away, causing player to see vehicles getting removed. SAFE_FADE_SCREEN_IN_FROM_BLACK(DEFAULT_FADE_TIME, FALSE) // //B*1481353 - when skipping to mocap (let the mocap stage handle fade in) tried just before START_CUTSCENE but issue still occured CLEAR_ANGLED_AREA_OF_VEHICLES(<<418.283752,-571.662903,24.697943>>, <<362.025787,-663.139771,38.339985>>, 28.000000, FALSE, FALSE, FALSE, TRUE, TRUE) // B*1564102 make sure no vehicles are in the area where the nodes are turned off RC_START_CUTSCENE_MODE(<< 392.86, -621.04, 27.97 >>, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE) SETUP_CRASH_SITE_FOR_OUTRO_MOCAP(TRUE) // B*1322009 - limit density for framerate in the scene SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) // prevent ambient cars interfering with the scene SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.3) eSubStage = SS_UPDATE CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - SS_SETUP - Frame Count : ", GET_FRAME_COUNT()) ENDIF ELSE IF IS_VEHICLE_OK(sNigelVehicle.vehicle) BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(sNigelVehicle.vehicle, DEFAULT_VEH_STOPPING_DISTANCE, 1, 0.0) ENDIF DISABLE_CELLPHONE_THIS_FRAME_ONLY() DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_AIM) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER) CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - SS_SETUP waiting on veh rec load and ambient speech - Frame Count : ", GET_FRAME_COUNT()) ENDIF ENDIF BREAK // ------------------------------------------ CASE SS_UPDATE // setup Trevor's exit state IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_Trevor) REPLAY_STOP_EVENT() IF WAS_CUTSCENE_SKIPPED() AND IS_SCREEN_FADED_OUT() SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - ", "SS_UPDATE - Camera - set skipped mocap Frame Count : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF bHasSetExitStateFromOutroMocapForGameplayCam = TRUE // stop setting the gameplay cam now. //FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) //FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_DO_NOTHING, FALSE, FAUS_CUTSCENE_EXIT) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - ", "CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY Trevor - Frame Count : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF // handle exit state for Nigel, Mrs Thornhill and Nigel's vehicle IF IS_PED_UNINJURED(sNigelPed.ped) AND IS_PED_UNINJURED(sMrsThornhillPed.ped) AND IS_VEHICLE_OK(sNigelVehicle.vehicle) IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_Nigel) IF NOT IS_PED_SITTING_IN_VEHICLE(sNigelPed.ped, sNigelVehicle.vehicle) SET_PED_INTO_VEHICLE(sNigelPed.ped, sNigelVehicle.vehicle, VS_DRIVER) CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - ", " set exit state for Nigel put in his vehicle ss_update Frame Count : ", GET_FRAME_COUNT()) ENDIF //TASK_VEHICLE_DRIVE_WANDER(sNigelPed.ped, sNigelVehicle.vehicle, 60.0, DRIVINGMODE_AVOIDCARS) //SET_DRIVE_TASK_CRUISE_SPEED(sNigelPed.ped, 60.0) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sNigelPed.ped, TRUE) //SET_PED_KEEP_TASK(sNigelPed.ped, TRUE) CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - ", "CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY Nigel - Frame Count : ", GET_FRAME_COUNT()) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_MrsThornhill) IF NOT IS_PED_SITTING_IN_VEHICLE(sMrsThornhillPed.ped, sNigelVehicle.vehicle) SET_PED_INTO_VEHICLE(sMrsThornhillPed.ped, sNigelVehicle.vehicle, VS_FRONT_RIGHT) CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - ", " set exit state for Mrs T put in his vehicle ss_update Frame Count : ", GET_FRAME_COUNT()) ENDIF SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sMrsThornhillPed.ped, TRUE) SET_PED_KEEP_TASK(sMrsThornhillPed.ped, TRUE) CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - ", "CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY Mrs T - Frame Count : ", GET_FRAME_COUNT()) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_NigelVehicle) SET_VEHICLE_ENGINE_ON(sNigelVehicle.vehicle, TRUE, TRUE) SET_VEHICLE_FORWARD_SPEED(sNigelVehicle.vehicle, 17) SET_VEHICLE_DOORS_SHUT(sNigelVehicle.vehicle, TRUE) IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sNigelVehicle.vehicle) START_PLAYBACK_RECORDED_VEHICLE_USING_AI(sNigelVehicle.vehicle, 1, sNigel2_CarRecNigelOutro, 35, DRIVINGMODE_AVOIDCARS_RECKLESS) //SET_PLAYBACK_SPEED(sCelebVehicle.vehicle, fMainPlaybackSpeed) CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - ", "CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY Nigel - set veh rec going for outro blend - Frame Count : ", GET_FRAME_COUNT()) ENDIF CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - ", "CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY Nigel's vehicle - Frame Count : ", GET_FRAME_COUNT()) ENDIF ENDIF // handle Al Di Napoli's exit state IF IS_PED_UNINJURED(sTargetPed.ped) IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_AlDiNapoli) SET_ENTITY_LOAD_COLLISION_FLAG(sTargetPed.ped, FALSE) //unsure if this is needed, might be costly? SAFE_REMOVE_PED(sTargetPed.ped, TRUE) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - ", "CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY Al Di Napoli - deleted - Frame Count : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF // unfortunately the only way to ensure the mocap camera blends out to gameplay cam at a sensible position is to spam this until the player's character exit state has fired IF NOT bHasSetExitStateFromOutroMocapForGameplayCam SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) ENDIF IF NOT IS_CUTSCENE_PLAYING() eSubStage = SS_CLEANUP CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - ", " SS_UPDATE done mocap ended Frame Count : ", GET_FRAME_COUNT()) ELSE // B*1322009 - limit density for framerate in the scene SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) // prevent ambient cars interfering with the scene SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.3) ENDIF BREAK // ------------------------------------------ CASE SS_CLEANUP IF IS_CUTSCENE_PLAYING() STOP_CUTSCENE() ELSE IF HAS_CUTSCENE_LOADED() REMOVE_CUTSCENE() ENDIF IF IS_ENTITY_ALIVE(sTargetPed.ped) SET_ENTITY_LOAD_COLLISION_FLAG(sTargetPed.ped, FALSE) //unsure if this is needed, might be costly? ENDIF SAFE_REMOVE_PED(sTargetPed.ped, TRUE) IF IS_VEHICLE_OK(sNigelVehicle.vehicle) IF IS_PED_UNINJURED(sNigelPed.ped) IF NOT IsPedPerformingTask(sNigelPed.ped, SCRIPT_TASK_VEHICLE_DRIVE_WANDER) IF IS_PED_SITTING_IN_VEHICLE(sNigelPed.ped, sNigelVehicle.vehicle) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sNigelPed.ped, TRUE) //SET_PED_KEEP_TASK(sNigelPed.ped, TRUE) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - ", "SS_CLEANUP set Nigel's drive task Frame Count : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF ENDIF IF IS_PED_UNINJURED(sMrsThornhillPed.ped) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sMrsThornhillPed.ped, TRUE) SET_PED_KEEP_TASK(sMrsThornhillPed.ped, TRUE) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - ", "SS_CLEANUP set Mrs T task Frame Count : ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDIF IF IS_ENTITY_ALIVE(sTargetVehicle.vehicle) SET_ENTITY_PROOFS(sTargetVehicle.vehicle, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE) // B*1954082 - stop window smash during transition to cutscene CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP ; turning off target veh collision proof this frame : ", GET_FRAME_COUNT()) ENDIF /*// setup emergency services to appear at the crash scene after the mission ends IF DOES_ENTITY_EXIST(sTargetVehicle.vehicle) CREATE_INCIDENT_WITH_ENTITY(DT_AMBULANCE_DEPARTMENT, sTargetVehicle.vehicle, 2.0, 3.0, tempIncidentIndex) ENDIF*/ IF bFinishedStageSkipping //only do this if we aren't stage skipping RC_END_CUTSCENE_MODE() ENDIF iTimer_MissionPassedDelay = GET_GAME_TIMER() // delay for Nigel switching to wander task on mission passed SET_STAGE(MISSION_STAGE_MISSION_PASSED) CPRINTLN(DEBUG_MISSION, "STAGE_END_CUTSCENE_MOCAP - SS_CLEANUP done Frame Count : ", GET_FRAME_COUNT()) ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Mission has already failed at this point, but this handles /// having to update the fail reason if the player does something more /// serious during the fade. PROC MISSION_FAILED_WAIT_FOR_FADE() STRING sFailReason = NULL SWITCH eSubStage // ------------------------------------------ CASE SS_SETUP IF SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL2_MISSION_FAIL") CLEAR_PRINTS() CLEAR_HELP() IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_ANY_CONVERSATION() ENDIF DELETE_ALL_MISSION_BLIPS() SEQUENCE_INDEX seqIndex //implemented to ensure Nigel and Mrs Thornhill get out the car on mission failed, IF IS_VEHICLE_OK(sNigelVehicle.vehicle) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sNigelVehicle.vehicle) OR IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID()) BRING_VEHICLE_TO_HALT(sNigelVehicle.vehicle, 6.0, 2) //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "player vehicle halted IN FAILED SETUP $$$") ENDIF #ENDIF ENDIF ENDIF IF IS_PED_UNINJURED(sNigelPed.ped) IF IS_PED_IN_GROUP(sNigelPed.ped) REMOVE_PED_FROM_GROUP(sNigelPed.ped) ENDIF CLEAR_PED_TASKS(sNigelPed.ped) //cant do CLEAR_PED_TASKS_IMMEDIATELY because it teleports them out the car IF eN2_MissionFailedReason = FAILED_MRS_THORNHILL_DIED OR eN2_MissionFailedReason = FAILED_MRS_THORNHILL_ATTACKED OR eN2_MissionFailedReason = FAILED_NIGEL_ATTACKED //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET NIGEL UP TO FLEE PLAYER IN FAILED SETUP $$$") ENDIF #ENDIF SET_PED_FLEE_ATTRIBUTES(sNigelPed.ped, FA_USE_VEHICLE, FALSE) OPEN_SEQUENCE_TASK(seqIndex) IF IS_PED_IN_ANY_VEHICLE(sNigelPed.ped) TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_CLOSE_DOOR | ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP) ENDIF TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 300.0, -1) CLOSE_SEQUENCE_TASK(seqIndex) TASK_PERFORM_SEQUENCE(sNigelPed.ped, seqIndex) CLEAR_SEQUENCE_TASK(seqIndex) SET_PED_KEEP_TASK(sNigelPed.ped, TRUE) ENDIF ENDIF IF IS_PED_UNINJURED(sMrsThornhillPed.ped) IF IS_PED_IN_GROUP(sMrsThornhillPed.ped) REMOVE_PED_FROM_GROUP(sMrsThornhillPed.ped) ENDIF CLEAR_PED_TASKS(sMrsThornhillPed.ped) //cant do CLEAR_PED_TASKS_IMMEDIATELY because it teleports them out the car IF eN2_MissionFailedReason = FAILED_NIGEL_DIED OR eN2_MissionFailedReason = FAILED_NIGEL_ATTACKED OR eN2_MissionFailedReason = FAILED_MRS_THORNHILL_ATTACKED //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET MRS THORNHILL UP TO FLEE PLAYER IN FAILED SETUP $$$") ENDIF #ENDIF SET_PED_FLEE_ATTRIBUTES(sMrsThornhillPed.ped, FA_USE_VEHICLE, FALSE) IF IS_PED_IN_ANY_VEHICLE(sMrsThornhillPed.ped) OPEN_SEQUENCE_TASK(seqIndex) TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_CLOSE_DOOR | ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP) TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 300.0, -1) CLOSE_SEQUENCE_TASK(seqIndex) TASK_PERFORM_SEQUENCE(sMrsThornhillPed.ped, seqIndex) CLEAR_SEQUENCE_TASK(seqIndex) SET_PED_KEEP_TASK(sMrsThornhillPed.ped, TRUE) ELSE TASK_SMART_FLEE_PED(sMrsThornhillPed.ped, PLAYER_PED_ID(), 300.0, -1) SET_PED_KEEP_TASK(sMrsThornhillPed.ped, TRUE) ENDIF ENDIF ENDIF //Stop Di Napoli's car recording AND uber recording if not already done so in script IF IS_VEHICLE_OK(sTargetVehicle.vehicle) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) STOP_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "NIGEL 2 : ", "target vehicle recording stopped in failed mission stage") ENDIF #ENDIF ENDIF IF NOT bDone_UberRecordingCleanupForChaseEnd #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "NIGEL 2 : ", "uber recording cleaned up in failed mission stage") ENDIF #ENDIF CLEANUP_UBER_PLAYBACK() ENDIF ENDIF //setup Al Di Napoli behaviour on mission failed IF IS_PED_UNINJURED(sTargetPed.ped) IF bDone_UberRecordingCleanupForChaseEnd SET_PED_KEEP_TASK(sTargetPed.ped, TRUE) //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET TARGET UP TO KEEP TASKS AND HE IS CRASHED IN FAILED SETUP $$$") ENDIF #ENDIF ELSE CLEAR_PED_TASKS(sTargetPed.ped) //cant do CLEAR_PED_TASKS_IMMEDIATELY because it teleports them out the car SET_PED_FLEE_ATTRIBUTES(sTargetPed.ped, FA_USE_VEHICLE, TRUE) SET_PED_FLEE_ATTRIBUTES(sTargetPed.ped, FA_PREFER_PAVEMENTS, FALSE) SET_PED_FLEE_ATTRIBUTES(sTargetPed.ped, FA_USE_COVER, FALSE) SET_PED_FLEE_ATTRIBUTES(sTargetPed.ped, FA_LOOK_FOR_CROWDS, FALSE) SET_PED_FLEE_ATTRIBUTES(sTargetPed.ped, FA_RETURN_TO_ORIGNAL_POSITION_AFTER_FLEE, FALSE) IF IS_VEHICLE_OK(sTargetVehicle.vehicle) AND IS_PED_IN_VEHICLE(sTargetPed.ped, sTargetVehicle.vehicle) AND IS_VEHICLE_OK(sNigelVehicle.vehicle) OPEN_SEQUENCE_TASK(seqIndex) TASK_VEHICLE_MISSION_PED_TARGET(NULL, sTargetVehicle.vehicle, PLAYER_PED_ID(), MISSION_FLEE, 80.0, DRIVINGMODE_AVOIDCARS_RECKLESS, 500.0, -1.0) CLOSE_SEQUENCE_TASK(seqIndex) TASK_PERFORM_SEQUENCE(sTargetPed.ped, seqIndex) CLEAR_SEQUENCE_TASK(seqIndex) ELSE OPEN_SEQUENCE_TASK(seqIndex) TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 300.0, -1) CLOSE_SEQUENCE_TASK(seqIndex) TASK_PERFORM_SEQUENCE(sTargetPed.ped, seqIndex) CLEAR_SEQUENCE_TASK(seqIndex) ENDIF SET_PED_KEEP_TASK(sTargetPed.ped, TRUE) //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET TARGET UP TO FLEE PLAYER IN FAILED SETUP $$$") ENDIF #ENDIF ENDIF ENDIF // Set the fail reason SWITCH eN2_MissionFailedReason CASE FAILED_TARGET_DIED sFailReason = "NIGEL2_F1" //~r~Al Di Napoli died.~w~ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: AL DI NAPOLI DIED") ENDIF #ENDIF BREAK CASE FAILED_TARGET_ESCAPED sFailReason = "NIGEL2_F2" //~r~Al Di Napoli escaped.~w~ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: AL DI NAPOLI ESCAPED") ENDIF #ENDIF BREAK CASE FAILED_NIGEL_VEHICLE_WRECKED sFailReason = "NIGEL2_F3" //~r~Nigel's car was wrecked.~w~ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: NIGEL'S CAR WRECKED") ENDIF #ENDIF BREAK CASE FAILED_NIGEL_ATTACKED sFailReason = "NIGEL2_F7" //~w~Nigel was injured.~s~ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: NIGEL ATTACKED") ENDIF #ENDIF BREAK CASE FAILED_NIGEL_DIED sFailReason = "NIGEL2_F4" //~r~Nigel died.~w~ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: NIGEL DIED") ENDIF #ENDIF BREAK CASE FAILED_MRS_THORNHILL_ATTACKED sFailReason = "NIGEL2_F8" //~w~Mrs. Thornhill was injured.~s~ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: MRS THORNHILL ATTACKED") ENDIF #ENDIF BREAK CASE FAILED_MRS_THORNHILL_DIED sFailReason = "NIGEL2_F5" //~r~Mrs. Thornhill died.~w~ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: MRS THORNHILL DIED") ENDIF #ENDIF BREAK CASE FAILED_LEFT_NIGEL_AND_MRS_T_BEHIND sFailReason = "NIGEL2_F6" //~w~Nigel and Mrs. Thornhill were abandoned.~s~ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: Nigel and Mrs Thorton were abandoned.") ENDIF #ENDIF BREAK CASE FAILED_LEFT_NIGEL_BEHIND sFailReason = "NIGEL2_F10" //~w~Nigel was abandoned.~s~ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: Nigel was left abandoned.") ENDIF #ENDIF BREAK CASE FAILED_LEFT_MRS_T_BEHIND sFailReason = "NIGEL2_F9" //~w~Mrs. Thornhill was abandoned.~s~ #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: Mrs Thorton was abandoned.") ENDIF #ENDIF BREAK DEFAULT #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: generic") ENDIF #ENDIF BREAK ENDSWITCH //Check if fail reason needs to be displayed IF eN2_MissionFailedReason = FAILED_DEFAULT Random_Character_Failed() ELSE Random_Character_Failed_With_Reason(sFailReason) ENDIF eSubStage = SS_UPDATE CPRINTLN(DEBUG_MISSION, "MISSION_FAILED_WAIT_FOR_FADE - SS_SETUP done") ENDIF BREAK // ------------------------------------------ CASE SS_UPDATE IF GET_MISSION_FLOW_SAFE_TO_CLEANUP() //---- Do any specific cleanup here---- // Do a check here to see if we need to warp the player at all // (only set the fail warp locations if we can't leave the player where he was) // get the player out of the hospital IF IS_PED_INSIDE_HOSPITAL_INTERIOR(PLAYER_PED_ID()) // required true check to use GET_KEY_FOR_ENTITY_IN_ROOM check to work, and need ot use this to prevent inaccurate results CPRINTLN(DEBUG_MISSION, "Player in hosp") #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MISSION_FAILED_WAIT_FOR_FADE - player in hospital interior, warp setup") ENDIF #ENDIF MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<279.4137, -585.8815, 42.3102>>, 48.8028) SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<<276.27, -584.00, 42.73>>, 337.40) ENDIF CLEANUP_ALL_MISSION_ENTITIES(TRUE) Script_Cleanup() CPRINTLN(DEBUG_MISSION, "MISSION_FAILED_WAIT_FOR_FADE - SS_CLEANUP done") ELSE // not finished fading out // you may want to handle dialogue etc here. ENDIF BREAK ENDSWITCH ENDPROC //------------------------------------------------------------------------------------------------------------------------------------------------- // DEBUG STAGES //------------------------------------------------------------------------------------------------------------------------------------------------- #IF IS_DEBUG_BUILD FUNC BOOL IS_CAR_PAUSED_AT_START_OF_RECORDING(VEHICLE_INDEX inCar, INT iRec) FLOAT fTemp IF IS_VEHicle_DRIVEABLE(inCar) IF NOT IS_PLAYBACK_GOING_ON_FOR_vehicle(inCar) START_PLAYBACK_RECORDED_vehicle(inCar, iRec, sNigel2_UberRecordingName) ELSE fTemp = get_TIME_POSITION_IN_RECORDING(inCar) SKIP_TIME_IN_PLAYBACK_RECORDED_vehicle(inCar, (0.0 - fTemp)) PAUSE_PLAYBACK_RECORDED_vehicle(inCar) RETURN(TRUE) ENDIF ENDIF RETURN(FALSE) ENDFUNC PROC RECORD_CHASE_ROUTE() SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0) INT iRecNumTarget, iRecNumGhost iRecNumTarget = 1 //999 iRecNumGhost = 888 VECTOR vRecordingPosition VECTOR vRecordingStartPos FLOAT fRecordedTime FLOAT fGhostCarPlaybackTime FLOAT fTimeDiff SWITCH eSubStage // ------------------------------------------ CASE SS_SETUP SET_CLOCK_TIME(10, 0, 0) LOAD_MISSION_ASSETS(TRUE) SETUP_FOR_START_OF_MISSION() SAFE_FADE_SCREEN_IN_FROM_BLACK() IF IS_VEHICLE_OK(sTargetVehicle.vehicle) //for uber recording SET_VEHICLE_DOORS_LOCKED(sTargetVehicle.vehicle, VEHICLELOCK_UNLOCKED) SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sTargetVehicle.vehicle, TRUE) SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sTargetVehicle.vehicle) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0) SET_VEHICLE_ENGINE_ON(sTargetVehicle.vehicle, TRUE, TRUE) //SET_ENTITY_COORDS(sTargetVehicle.vehicle, << -1290.7233, -634.5989, 26.1005 >>) //SET_ENTITY_QUATERNION(sTargetVehicle.vehicle, -0.0248, 0.0004, 0.8949, 0.4456) REQUEST_VEHICLE_RECORDING(iRecNumGhost, sNigel2_UberRecordingName) WHILE NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(iRecNumGhost, sNigel2_UberRecordingName) CPRINTLN(DEBUG_MISSION, "LOADING THE VEHICLE RECORDING 1 Nigel2U") WAIT(0) ENDWHILE REQUEST_VEHICLE_RECORDING(iRecNumTarget, sNigel2_UberRecordingName) WHILE NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(iRecNumTarget, sNigel2_UberRecordingName) CPRINTLN(DEBUG_MISSION, "LOADING THE VEHICLE RECORDING 1 Nigel2U") WAIT(0) ENDWHILE IF IS_VEHICLE_OK(sTargetVehicle.vehicle) AND IS_VEHICLE_OK(vehDebug_Ghost) SET_ENTITY_COLLISION(vehDebug_Ghost, FALSE) FREEZE_ENTITY_POSITION(sTargetVehicle.vehicle, FALSE) FREEZE_ENTITY_POSITION(vehDebug_Ghost, FALSE) vRecordingStartPos = GET_POSITION_OF_vehicle_RECORDING_AT_TIME(iRecNumTarget, 0.0, sNigel2_UberRecordingName) SET_ENTITY_COORDS(sTargetVehicle.vehicle, vRecordingStartPos) vRecordingStartPos = GET_POSITION_OF_vehicle_RECORDING_AT_TIME(iRecNumGhost, 0.0, sNigel2_UberRecordingName) SET_ENTITY_COORDS(vehDebug_Ghost, vRecordingStartPos) //FREEZE_ENTITY_POSITION(sTargetVehicle.vehicle, TRUE) //FREEZE_ENTITY_POSITION(vehDebug_Ghost, TRUE) ENDIF WHILE NOT IS_car_PAUSED_AT_START_OF_RECORDING(sTargetVehicle.vehicle, iRecNumTarget) OR NOT IS_car_PAUSED_AT_START_OF_RECORDING(vehDebug_Ghost, iRecNumGhost) CPRINTLN(DEBUG_MISSION, "DEBUG : RECORD_CHASE_ROUTE : SS_SETUP pausing cars at start of recording...") WAIT(0) ENDWHILE //INIT_UBER_RECORDING(sNigel2_UberRecordingName) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) eSubStage = SS_UPDATE CPRINTLN(DEBUG_MISSION, "DEBUG : RECORD_CHASE_ROUTE : SS_SETUP done") ENDIF BREAK // ------------------------------------------ CASE SS_UPDATE // for uber recording //UPDATE_UBER_RECORDING() IF IS_VEHICLE_OK(sTargetVehicle.vehicle) AND IS_VEHICLE_OK(vehDebug_Ghost) IF IS_RECORDING_GOING_ON_FOR_vehicle(sTargetVehicle.vehicle) fRecordedTime = GET_TIME_POSITION_IN_RECORDED_RECORDING(sTargetVehicle.vehicle) ENDIF fMainPlaybackSpeed = 1.0 IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehDebug_Ghost) fGhostCarPlaybackTime = GET_TIME_POSITION_IN_RECORDING(vehDebug_Ghost) DISPLAY_PLAYBACK_RECORDED_vehicle(vehDebug_Ghost, RDM_WHOLELINE) SET_PLAYBACK_SPEED(vehDebug_Ghost, fMainPlaybackSpeed) endif IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) fCurrentPlaybackTime = GET_TIME_POSITION_IN_RECORDING(sTargetVehicle.vehicle) SET_PLAYBACK_SPEED(sTargetVehicle.vehicle, fMainPlaybackSpeed) endif vRecordingPosition = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(iRecNumTarget, fCurrentPlaybackTime, sNigel2_UberRecordingName) IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT) /* IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehDebug_Ghost) FREEZE_ENTITY_POSITION(sTargetVehicle.vehicle, FALSE) FREEZE_ENTITY_POSITION(vehDebug_Ghost, FALSE) START_PLAYBACK_RECORDED_vehicle(vehDebug_Ghost, iRecNumGhost, sNigel2_UberRecordingName) FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehDebug_Ghost) SET_PLAYBACK_SPEED(vehDebug_Ghost, fMainPlaybackSpeed) START_PLAYBACK_RECORDED_vehicle(sTargetVehicle.vehicle, iRecNumTarget, sNigel2_UberRecordingName) FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sTargetVehicle.vehicle) SET_PLAYBACK_SPEED(sTargetVehicle.vehicle, fMainPlaybackSpeed) CPRINTLN(DEBUG_MISSION, "DEBUG : RECORD_CHASE_ROUTE : SS_UPDATE : PLAYBACK OF RECORDING STARTED FC = ", GET_FRAME_COUNT()) ENDIF*/ //START_RECORDING_VEHICLE(sTargetVehicle.vehicle, 999, sNigel2_UberRecordingName, TRUE) //CPRINTLN(DEBUG_MISSION, "DEBUG : RECORD_CHASE_ROUTE : SS_UPDATE : PLAYBACK OF RECORDING STARTED FC = ", GET_FRAME_COUNT()) //WAIT(0) IF IS_PLAYBACK_GOING_ON_FOR_vehicle(vehDebug_Ghost) UNPAUSE_PLAYBACK_RECORDED_vehicle(vehDebug_Ghost) CPRINTLN(DEBUG_MISSION, "DEBUG : RECORD_CHASE_ROUTE : SS_UPDATE : unpaused ghost car fGhostCarPlaybackTime = ", fGhostCarPlaybackTime, "FC = ", GET_FRAME_COUNT(), " game timer = ", GET_GAME_TIMER()) ENDIF IF IS_PLAYBACK_GOING_ON_FOR_vehicle(sTargetVehicle.vehicle) UNPAUSE_PLAYBACK_RECORDED_vehicle(sTargetVehicle.vehicle) CPRINTLN(DEBUG_MISSION, "DEBUG : RECORD_CHASE_ROUTE : SS_UPDATE : unpaused target car fCurrentPlaybackTime = ", fCurrentPlaybackTime, " FC = ", GET_FRAME_COUNT()) ENDIF ENDIF IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) // RECORD SECTIONS /*IF fCurrentPlaybackTime > 10000.160 AND fCurrentPlaybackTime < 11000.490 IF NOT IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) SET_PLAYBACK_TO_USE_AI_TRY_TO_REVERT_BACK_LATER(sTargetVehicle.vehicle, (iDebug_AdditionalAIDriveTime + ROUND(11000.490 - fCurrentPlaybackTime)), DRIVINGMODE_PLOUGHTHROUGH) CPRINTLN(DEBUG_MISSION, "DEBUG : RECORD_CHASE_ROUTE : SS_UPDATE : SET_PLAYBACK_TO_USE_AI_TRY_TO_REVERT_BACK_LATER this fCurrentPlaybackTime = ", fCurrentPlaybackTime) ENDIF ENDIF*/ IF fCurrentPlaybackTime > 41000.0 // 41410.0 AND fCurrentPlaybackTime < 43500.00 // 43250.960 IF NOT IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) //IF NOT IS_RECORDING_GOING_ON_FOR_vehicle(sTargetVehicle.vehicle) // START_RECORDING_VEHICLE_TRANSITION_FROM_PLAYBACK(sTargetVehicle.vehicle, 985, sNigel2_UberRecordingName, TRUE) // CPRINTLN(DEBUG_MISSION, "DEBUG : RECORD_CHASE_ROUTE : SS_UPDATE : START_RECORDING_VEHICLE_TRANSITION_FROM_PLAYBACK STARTED FC = ", GET_FRAME_COUNT(), " game timer = ", GET_GAME_TIMER()) // WAIT(0) // IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) // START_PLAYBACK_RECORDED_vehicle(sTargetVehicle.vehicle, iRecNumTarget, sNigel2_UberRecordingName) // CPRINTLN(DEBUG_MISSION, "DEBUG : RECORD_CHASE_ROUTE : SS_UPDATE : START_PLAYBACK_RECORDED_vehicle STARTED FC = ", GET_FRAME_COUNT(), " game timer = ", GET_GAME_TIMER()) SET_PLAYBACK_TO_USE_AI_TRY_TO_REVERT_BACK_LATER(sTargetVehicle.vehicle, (iDebug_AdditionalAIDriveTime + 175 +(ROUND(43500.00 - fCurrentPlaybackTime))), DRIVINGMODE_PLOUGHTHROUGH) CPRINTLN(DEBUG_MISSION, "DEBUG : RECORD_CHASE_ROUTE : SS_UPDATE : SET_PLAYBACK_TO_USE_AI_TRY_TO_REVERT_BACK_LATER this fCurrentPlaybackTime = ", fCurrentPlaybackTime, " game timer = ", GET_GAME_TIMER()) // ENDIF //ENDIF ENDIF ENDIF IF fCurrentPlaybackTime > 77000.0 AND fCurrentPlaybackTime < 81263.80 IF NOT IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) SET_PLAYBACK_TO_USE_AI_TRY_TO_REVERT_BACK_LATER(sTargetVehicle.vehicle, (iDebug_AdditionalAIDriveTime +(ROUND(81263.80 - fCurrentPlaybackTime))), DRIVINGMODE_PLOUGHTHROUGH) CPRINTLN(DEBUG_MISSION, "DEBUG : RECORD_CHASE_ROUTE : SS_UPDATE : SET_PLAYBACK_TO_USE_AI_TRY_TO_REVERT_BACK_LATER this fCurrentPlaybackTime = ", fCurrentPlaybackTime) ENDIF ENDIF fTimeDiff = fCurrentPlaybackTime fTimeDiff -= fGhostCarPlaybackTime IF IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) CPRINTLN(DEBUG_MISSION, "DEBUG : RECORD_CHASE_ROUTE : SS_UPDATE : IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE this fCurrentPlaybackTime = ", fCurrentPlaybackTime, " fGhostCarPlaybackTime = ", fGhostCarPlaybackTime, " fTimeDiff = ", fTimeDiff, " fRecordedTime = ", fRecordedTime) ENDIF ENDIF fTimeDiff = fCurrentPlaybackTime fTimeDiff -= fGhostCarPlaybackTime CPRINTLN(DEBUG_MISSION, "DEBUG : RECORD_CHASE_ROUTE : SS_UPDATE : STANDARD CHECKS : fCurrentPlaybackTime = ", fCurrentPlaybackTime, " fGhostCarPlaybackTime = ", fGhostCarPlaybackTime, " fTimeDiff = ", fTimeDiff, " fRecordedTime = ", fRecordedTime, " vRecordingPosition = ", vRecordingPosition) ENDIF // drop out IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LEFT) eSubStage = SS_CLEANUP ENDIF BREAK // ------------------------------------------ CASE SS_CLEANUP IF IS_VEHICLE_OK(sTargetVehicle.vehicle) IF IS_RECORDING_GOING_ON_FOR_vehicle(sTargetVehicle.vehicle) STOP_RECORDING_VEHICLE(sTargetVehicle.vehicle) CPRINTLN(DEBUG_MISSION, "DEBUG : RECORD_CHASE_ROUTE : SS_UPDATE : STOP_RECORDING_VEHICLE") ENDIF IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) STOP_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle) ENDIF ENDIF IF IS_VEHICLE_OK(vehDebug_Ghost) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehDebug_Ghost) STOP_PLAYBACK_RECORDED_VEHICLE(vehDebug_Ghost) ENDIF ENDIF CPRINTLN(DEBUG_MISSION, "DEBUG : RECORD_CHASE_ROUTE : SS_CLEANUP") eSubStage = SS_SETUP BREAK ENDSWITCH ENDPROC PROC PLAYBACK_CHASE_ROUTE() SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) eSubStage = SS_CLEANUP SWITCH eSubStage // ------------------------------------------ CASE SS_SETUP LOAD_MISSION_ASSETS(TRUE) SETUP_FOR_START_OF_MISSION() IF IS_VEHICLE_OK(sTargetVehicle.vehicle) IF IS_VEHICLE_OK(sNigelVehicle.vehicle) SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sNigelVehicle.vehicle) ENDIF SET_GAMEPLAY_CAM_RELATIVE_HEADING() IF IS_PED_UNINJURED(sTargetPed.ped) AND IS_VEHICLE_OK(sTargetVehicle.vehicle) IF NOT IS_PED_IN_ANY_VEHICLE(sTargetPed.ped) CLEAR_PED_TASKS(sTargetPed.ped) SAFE_PUT_PED_INTO_VEHICLE(sTargetPed.ped, sTargetVehicle.vehicle) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TARGET WARPED INTO VEHICLE USING SAFETY NET") ENDIF #ENDIF ENDIF IF NOT DOES_BLIP_EXIST(sTargetPed.blip) sTargetPed.blip = CREATE_PED_BLIP(sTargetPed.ped, TRUE, FALSE) SET_BLIP_SCALE(sTargetPed.blip, 1.0) //TEMP: added as per bug 241312 ENDIF SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sTargetPed.ped, TRUE) ENDIF //for uber playback INITIALISE_UBER_PLAYBACK(sNigel2_UberRecordingName, iMainCarRecID) LOAD_UBER_DATA() CREATE_ALL_WAITING_UBER_CARS() switch_SetPieceCar_to_ai_on_collision = true allow_veh_to_stop_on_any_veh_impact = TRUE bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE //might help with some traffic failing to spawn? //fPlaybackCarStreamingDistance = 160.0 // 120.0 // is default traffic_block_vehicle_colour(true, traffic_black) //deactivate_SetPieceCars_up_to_time(77000) IF IS_VEHICLE_OK(sTargetVehicle.vehicle) IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) START_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle, iMainCarRecID, sNigel2_UberRecordingName) //DISPLAY_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle, RDM_WHOLELINE) //PAUSE_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle) ENDIF ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYBACK CHASE ROUTE SETUP DONE") ENDIF #ENDIF /* //for normal play SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sTargetVehicle.vehicle, VS_FRONT_RIGHT) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) SET_VEHICLE_ENGINE_ON(sTargetVehicle.vehicle, TRUE, TRUE) SET_ENTITY_COORDS(sTargetVehicle.vehicle, << -1363.1553, -596.5627, 28.6889 >>) //601 = << -1355.8376, -590.6566, 28.6889 >> SET_ENTITY_QUATERNION(sTargetVehicle.vehicle, -0.0197, -0.0202, 0.9972, -0.0693) //601 = 0.0160, 0.0349, 0.4617, 0.8862 IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) FREEZE_ENTITY_POSITION(sTargetVehicle.vehicle, FALSE) START_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle, iMainCarRecID, sNigel2_UberRecordingName) DISPLAY_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle, RDM_WHOLELINE) PAUSE_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle) ENDIF */ /* //debug crash setup IF IS_PED_UNINJURED(sTargetPed.ped) SAFE_PUT_PED_INTO_VEHICLE(sTargetPed.ped, sTargetVehicle.vehicle) SET_ENTITY_COORDS(sTargetVehicle.vehicle, << 394.8243, -621.0986, 27.9387 >>) SET_ENTITY_HEADING(sTargetVehicle.vehicle, 235.1330) ENDIF IF IS_VEHICLE_OK(sNigelVehicle.vehicle) SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sNigelVehicle.vehicle) SET_ENTITY_COORDS(sNigelVehicle.vehicle, << 333.4894, -580.4035, 42.3070 >>) SET_ENTITY_HEADING(sNigelVehicle.vehicle, 251.8706) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) SET_VEHICLE_ENGINE_ON(sTargetVehicle.vehicle, TRUE, TRUE) ENDIF */ SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) eSubStage = SS_UPDATE ENDIF BREAK // ------------------------------------------ CASE SS_UPDATE //for uber playback IF IS_VEHICLE_OK(sTargetVehicle.vehicle) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) fCurrentChaseDistance = VDIST(vPlayerPos, GET_ENTITY_COORDS(sTargetVehicle.vehicle, FALSE)) fCurrentPlaybackTime = GET_TIME_POSITION_IN_RECORDING(sTargetVehicle.vehicle) //CALCULATE_NEW_PLAYBACK_SPEED_FROM_CHAR(sTargetVehicle.vehicle, PLAYER_PED_ID(), fMainPlaybackSpeed, 1, 5, 20, 100, 2, 1) //UPDATE_UBER_CHASE_SPEED(fMainPlaybackSpeed, fCurrentPlaybackTime) fMainPlaybackSpeed = 1.0 bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE //might help with some traffic failing to spawn? SET_PLAYBACK_SPEED(sTargetVehicle.vehicle, fMainPlaybackSpeed) PRELOAD_UBER_RECORDINGS_DURING_PLAYBACK() UPDATE_CHASE_VEHICLES_FROM_UBER_RECORDING() CREATE_ALL_WAITING_UBER_CARS() //might help with some traffic failing to spawn? UPDATE_UBER_PLAYBACK(sTargetVehicle.vehicle, fMainPlaybackSpeed) CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, sTargetVehicle.vehicle) /* IF fCurrentPlaybackTime >= 113836.0 //target just about to enter hospital eSubStage = SS_CLEANUP ENDIF */ //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CURRENT PLAYBACK TIME = ", fCurrentPlaybackTime) ENDIF #ENDIF //UPDATE_UBER_CHASE_SPEED(fMainPlaybackSpeed, fCurrentPlaybackTime) //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "fMainPlaybackSpeed = ", fMainPlaybackSpeed) ENDIF #ENDIF ENDIF ENDIF /* //for normal playback IF IS_VEHICLE_OK(sTargetVehicle.vehicle) //for normal play IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) UNPAUSE_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYBACK OF RECORDING UNPAUSED") ENDIF #ENDIF ENDIF ELIF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) PAUSE_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYBACK OF RECORDING PAUSED") ENDIF #ENDIF ENDIF ENDIF MANAGE_PEDESTRIANS_ON_CHASE_ROUTE() ENDIF */ BREAK // ------------------------------------------ CASE SS_CLEANUP //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYBACK CHASE ROUTE CLEANUP") ENDIF #ENDIF //for uber playback //CLEANUP_UBER_PLAYBACK() BREAK ENDSWITCH ENDPROC PROC DEBUG_STATE() SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SWITCH eSubStage // ------------------------------------------ CASE SS_SETUP LOAD_MISSION_ASSETS(TRUE) SETUP_FOR_START_OF_MISSION() IF IS_VEHICLE_OK(sNigelVehicle.vehicle) SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sNigelVehicle.vehicle) IF IS_PED_UNINJURED(sNigelPed.ped) SAFE_PUT_PED_INTO_VEHICLE(sNigelPed.ped, sNigelVehicle.vehicle, VS_FRONT_RIGHT) ENDIF IF IS_PED_UNINJURED(sMrsThornhillPed.ped) SAFE_PUT_PED_INTO_VEHICLE(sMrsThornhillPed.ped, sNigelVehicle.vehicle, VS_BACK_RIGHT) ENDIF ENDIF IF IS_VEHICLE_OK(sTargetVehicle.vehicle) IF IS_PED_UNINJURED(sTargetPed.ped) //SAFE_PUT_PED_INTO_VEHICLE(sTargetPed.ped, sTargetVehicle.vehicle) ENDIF //SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sTargetVehicle.vehicle) ENDIF SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_BUILDING_STATE(BUILDINGNAME_IPL_PILLBOX_HILL, BUILDINGSTATE_DESTROYED) // sets the window to destroyed so player/target can drive through it SET_BUILDING_STATE(BUILDINGNAME_IPL_PILLBOX_HILL_INTERIOR, BUILDINGSTATE_NORMAL) //SAFE_TELEPORT_VEHICLE(sTargetVehicle.vehicle, << 285.5170, -571.1989, 42.1589 >>, 221.0) /* //hospital debris trials REQUEST_PTFX_ASSET() WHILE NOT HAS_PTFX_ASSET_LOADED() #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "REQUESTING SCRIPT PTFX") ENDIF #ENDIF WAIT(0) ENDWHILE */ //SET_ENTITY_COORDS(PLAYER_PED_ID(), << 285.5170, -571.1989, 42.1589 >>) //SET_ENTITY_HEADING(PLAYER_PED_ID(), 221.0036) //SET_GAMEPLAY_CAM_RELATIVE_HEADING() //outside hospital SAFE_TELEPORT_VEHICLE(sNigelVehicle.vehicle, << 337.2605, -581.4758, 42.3258 >>, 254.3901) SET_DEBUG_ACTIVE(TRUE) SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE) /* REQUEST_VEHICLE_RECORDING(9, "Nigel2R") WHILE NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(9, "Nigel2R") #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "LOADING THE NEW CAR REC") ENDIF #ENDIF WAIT(0) ENDWHILE IF IS_VEHICLE_OK(sTargetVehicle.vehicle) IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) FREEZE_ENTITY_POSITION(sTargetVehicle.vehicle, FALSE) START_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle, 9, "Nigel2R") DISPLAY_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle, RDM_WHOLELINE) //PAUSE_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle) ENDIF ENDIF */ SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) eSubStage = SS_UPDATE BREAK // ------------------------------------------ CASE SS_UPDATE MANAGE_HOSPITAL_STATE_DURING_CHASE() /* IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO) SET_FOLLOW_VEHICLE_CAM_VIEW_MODE(CAM_VIEW_MODE_CINEMATIC) ELIF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO) SET_FOLLOW_VEHICLE_CAM_VIEW_MODE(CAM_VIEW_MODE_FIRST_PERSON) ELIF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_HORN) SET_FOLLOW_VEHICLE_CAM_VIEW_MODE(CAM_VIEW_MODE_THIRD_PERSON) ENDIF */ /* //for playback IF IS_VEHICLE_OK(sTargetVehicle.vehicle) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) CALCULATE_NEW_PLAYBACK_SPEED_FROM_CHAR(sTargetVehicle.vehicle, PLAYER_PED_ID(), fMainPlaybackSpeed, 1, 8, 25, 80, 1.4, 1) SET_PLAYBACK_SPEED(sTargetVehicle.vehicle, fMainPlaybackSpeed) ENDIF ENDIF */ BREAK // ------------------------------------------ CASE SS_CLEANUP BREAK ENDSWITCH ENDPROC //for testing hospital section! PROC DEBUG_HOSPITAL_STATE() SWITCH eSubStage // ------------------------------------------ CASE SS_SETUP #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bosh") ENDIF #ENDIF LOAD_MISSION_ASSETS(TRUE) SETUP_FOR_START_OF_MISSION() IF IS_VEHICLE_OK(sNigelVehicle.vehicle) SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sNigelVehicle.vehicle) IF IS_PED_UNINJURED(sNigelPed.ped) SAFE_PUT_PED_INTO_VEHICLE(sNigelPed.ped, sNigelVehicle.vehicle, VS_FRONT_RIGHT) ENDIF IF IS_PED_UNINJURED(sMrsThornhillPed.ped) SAFE_PUT_PED_INTO_VEHICLE(sMrsThornhillPed.ped, sNigelVehicle.vehicle, VS_BACK_RIGHT) ENDIF SAFE_TELEPORT_VEHICLE(sNigelVehicle.vehicle, << -413.1205, -503.5363, 24.3236 >>, 258.4841) // << -469.2073, -836.5956, 29.5250 >>, 315.1508) SET_VEHICLE_ENGINE_ON(sNigelVehicle.vehicle, TRUE, TRUE) ENDIF IF IS_PED_UNINJURED(sTargetPed.ped) AND IS_VEHICLE_OK(sTargetVehicle.vehicle) IF NOT IS_PED_SITTING_IN_VEHICLE(sTargetPed.ped, sTargetVehicle.vehicle) CLEAR_PED_TASKS(sTargetPed.ped) SAFE_PUT_PED_INTO_VEHICLE(sTargetPed.ped, sTargetVehicle.vehicle) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TARGET WARPED INTO VEHICLE USING SAFETY NET") ENDIF #ENDIF ENDIF IF NOT DOES_BLIP_EXIST(sTargetPed.blip) sTargetPed.blip = CREATE_PED_BLIP(sTargetPed.ped, TRUE, FALSE) SET_BLIP_SCALE(sTargetPed.blip, 1.0) //TEMP: added as per bug 241312 ENDIF SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sTargetPed.ped, TRUE) ENDIF //for uber playback INITIALISE_UBER_PLAYBACK(sNigel2_UberRecordingName, iMainCarRecID) LOAD_UBER_DATA() CREATE_ALL_WAITING_UBER_CARS() switch_SetPieceCar_to_ai_on_collision = true allow_veh_to_stop_on_any_veh_impact = TRUE //bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE //might help with some traffic failing to spawn? //fPlaybackCarStreamingDistance = 160.0 // 120.0 // is default traffic_block_vehicle_colour(true, traffic_black) IF IS_VEHICLE_OK(sTargetVehicle.vehicle) AND IS_PED_UNINJURED(sTargetPed.ped) IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) FREEZE_ENTITY_POSITION(sTargetVehicle.vehicle, FALSE) START_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle, iMainCarRecID, sNigel2_UberRecordingName) #IF IS_DEBUG_BUILD DISPLAY_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle, RDM_WHOLELINE) #ENDIF SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle, 88006.860) // 70000.0) // SET_UBER_PLAYBACK_TO_TIME_NOW(sTargetVehicle.vehicle, 88006.860) // 70000.0) // //PAUSE_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle) ENDIF ENDIF SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) SET_BUILDING_STATE(BUILDINGNAME_IPL_PILLBOX_HILL, BUILDINGSTATE_DESTROYED) SET_BUILDING_STATE(BUILDINGNAME_IPL_PILLBOX_HILL_INTERIOR, BUILDINGSTATE_NORMAL) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG_HOSPITAL_STATE - SS_SETUP - set BUILDINGNAME_IPL_PILLBOX_HILL swaps to BUILDINGSTATE_DESTROYED") ENDIF #ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " TESTER IT BUILT $$$$$$$$$$$$$$") ENDIF #ENDIF eSubStage = SS_UPDATE BREAK // ------------------------------------------ CASE SS_UPDATE NIG2_TRACK_STAT_HAS_PLAYER_INJURED_PED_WHILST_IN_HOSPITAL() IF IS_PED_UNINJURED(sTargetPed.ped) AND IS_VEHICLE_OK(sTargetVehicle.vehicle) fCurrentChaseDistance = VDIST(vPlayerPos, GET_ENTITY_COORDS(sTargetVehicle.vehicle, FALSE)) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) fCurrentPlaybackTime = GET_TIME_POSITION_IN_RECORDING(sTargetVehicle.vehicle) //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CURRENT PLAYBACK TIME = ", fCurrentPlaybackTime) ENDIF #ENDIF UPDATE_UBER_CHASE_SPEED(fMainPlaybackSpeed, fCurrentPlaybackTime) //#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "fMainPlaybackSpeed = ", fMainPlaybackSpeed) ENDIF #ENDIF SET_PLAYBACK_SPEED(sTargetVehicle.vehicle, fMainPlaybackSpeed) bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE //might help with some traffic failing to spawn? PRELOAD_UBER_RECORDINGS_DURING_PLAYBACK() CREATE_ALL_WAITING_UBER_CARS() //might help with some traffic failing to spawn? UPDATE_CHASE_VEHICLES_FROM_UBER_RECORDING() UPDATE_UBER_PLAYBACK(sTargetVehicle.vehicle, fMainPlaybackSpeed) MANAGE_RAYFIRE_HOSPITAL_DOORS() MANAGE_HOSPITAL_STATE_DURING_CHASE() CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, sTargetVehicle.vehicle) MANAGE_TARGET_BRAKING_AND_USING_HORN() APPLY_VISUAL_DAMAGE_TO_TARGET_VEHICLE() ELSE IF NOT bDone_UberRecordingCleanupForChaseEnd CLEANUP_UBER_PLAYBACK() REMOVE_ALL_CAR_RECORDINGS_FOR_UBER_CHASE() //main car recording REMOVE_VEHICLE_RECORDING(iMainCarRecID, sNigel2_UberRecordingName) REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(sTargetVehicle.vehicle) IF IS_AUDIO_SCENE_ACTIVE("NIGEL_02_CHASE") STOP_AUDIO_SCENE("NIGEL_02_CHASE") #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " NIGEL 02 - STOP_AUDIO_SCENE : NIGEL_02_CHASE ", "***") ENDIF #ENDIF ENDIF SETUP_TARGET_FOR_CRASH() #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UBER RECORDING ENDED, set up for crash scene") ENDIF #ENDIF bDone_UberRecordingCleanupForChaseEnd = TRUE ENDIF ENDIF MANAGE_HOSPITAL_SOUND_FX() MANAGE_PEDESTRIANS_ON_CHASE_ROUTE(vPlayerPos) MANAGE_HOSPITAL_DEBRIS_EFFECT() MANAGE_DIALOGUE_DURING_CHASE(bForceTargetblipFlashThisFrame) // needs to come before UPDATE_CHASE_BLIP since it sets bForceTargetblipFlashThisFrame MANAGE_JUMP_OUT_HOSPITAL_WINDOW() //Checl for player close to target at end of the chase. IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) //DRAW_DEBUG_SPHERE(GET_ENTITY_COORDS(sTargetPed.ped), NIGEL2_PLAYER_CLOSE_TO_TARGET_CRASHED, 0, 0, 255, 120) IF(GET_DISTANCE_BETWEEN_COORDS(vPlayerPos, GET_ENTITY_COORDS(sTargetPed.ped)) < NIGEL2_PLAYER_CLOSE_TO_TARGET_CRASHED) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYER CLOSE TO CRASHED AL DI NAPOLI - GO TO PUT IN BOOT SECTION") ENDIF #ENDIF eSubStage = SS_CLEANUP ENDIF ENDIF ENDIF BREAK // ------------------------------------------ CASE SS_CLEANUP IF bDoneCleanup_JumpOutHospitalWindow SET_CHANGES_FOR_FORCED_CINEMATIC_JUMP_OUT_HOSPITAL_WINDOW(FALSE) bDoneCleanup_JumpOutHospitalWindow = FALSE ENDIF IF NOT bDone_UberRecordingCleanupForChaseEnd CLEANUP_UBER_PLAYBACK() REMOVE_ALL_CAR_RECORDINGS_FOR_UBER_CHASE() IF IS_VEHICLE_OK(sTargetVehicle.vehicle) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) //check if its at the end time wise, if so freeze its pos? STOP_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle) ENDIF //SKIP_TO_END_AND_STOP_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle) FREEZE_ENTITY_POSITION(sTargetVehicle.vehicle, TRUE) ENDIF REMOVE_VEHICLE_RECORDING(iMainCarRecID, sNigel2_UberRecordingName) SETUP_TARGET_FOR_CRASH() #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UBER RECORDING ENDED IN SS_CLEANUP") ENDIF #ENDIF bDone_UberRecordingCleanupForChaseEnd = TRUE ENDIF KILL_CHASE_HINT_CAM(localChaseHintCamStruct) //KILL_ANY_CONVERSATION() SET_STAGE(MISSION_STAGE_GET_CLOSE_TO_TARGET_FOR_CUTSCENE) BREAK ENDSWITCH ENDPROC PROC DEBUG_HOSPITAL_DOORS_STATE() SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SWITCH eSubStage // ------------------------------------------ CASE SS_SETUP bDebug_PrintMissionInfoToTTY = TRUE LOAD_MISSION_ASSETS(TRUE) SETUP_FOR_START_OF_MISSION() /* IF IS_VEHICLE_OK(sTargetVehicle.vehicle) SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sTargetVehicle.vehicle) ENDIF IF IS_VEHICLE_OK(sTargetVehicle.vehicle) IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) FREEZE_ENTITY_POSITION(sTargetVehicle.vehicle, FALSE) START_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle, iMainCarRecID, sNigel2_UberRecordingName) #IF IS_DEBUG_BUILD DISPLAY_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle, RDM_WHOLELINE) #ENDIF SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle, 109072.500) PAUSE_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle) ENDIF ENDIF */ IF IS_VEHICLE_OK(sNigelVehicle.vehicle) SAFE_PUT_PED_INTO_VEHICLE(PLAYER_PED_ID(), sNigelVehicle.vehicle) SAFE_TELEPORT_VEHICLE(sNigelVehicle.vehicle, <<337.6252, -582.2834, 42.3174>>, 252.3868) // for window // << 293.3672, -579.1942, 42.1950 >>, 223.0003) // for hospital doors SET_VEHICLE_ENGINE_ON(sNigelVehicle.vehicle, TRUE, TRUE) ENDIF //for ray fire test only < //SET_ENTITY_COORDS(PLAYER_PED_ID(), << 293.3672, -579.1942, 42.1950 >>) //SET_ENTITY_HEADING(PLAYER_PED_ID(), 223.0003) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) //SET_BUILDING_STATE(BUILDINGNAME_ES_PILLBOX_HILL, BUILDINGSTATE_DESTROYED) //SET_BUILDING_STATE(BUILDINGNAME_IPL_PILLBOX_HILL, BUILDINGSTATE_DESTROYED) //SET_BUILDING_STATE(BUILDINGNAME_IPL_PILLBOX_HILL_INTERIOR, BUILDINGSTATE_NORMAL) SAFE_FADE_SCREEN_IN_FROM_BLACK(0, FALSE) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) //temp IF eHospitalInteriorState = HIS_SET_INTERIOR_IPLS_FOR_CHASE SET_BUILDING_STATE(BUILDINGNAME_IPL_PILLBOX_HILL, BUILDINGSTATE_DESTROYED) // sets the window to destroyed so player/target can drive through it SET_BUILDING_STATE(BUILDINGNAME_IPL_PILLBOX_HILL_INTERIOR, BUILDINGSTATE_NORMAL) // sets the interior to stream HospitalInteriorIndex = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 307.3065, -589.9595, 43.3020 >>, "v_hospital") //get handle to hospital interior eHospitalInteriorState = HIS_PIN_INTERIOR_IN_MEMORY CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE - done HIS_SET_INTERIOR_IPLS_FOR_CHASE : FC = ", GET_FRAME_COUNT()) // interior needs to be pinned into memory really early ELIF eHospitalInteriorState = HIS_PIN_INTERIOR_IN_MEMORY IF NOT IS_REPLAY_BEING_SET_UP() IF IS_VALID_INTERIOR(HospitalInteriorIndex) IF NOT IS_INTERIOR_READY(HospitalInteriorIndex) PIN_INTERIOR_IN_MEMORY(HospitalInteriorIndex) ELSE SET_INTERIOR_ACTIVE(HospitalInteriorIndex, TRUE) eHospitalInteriorState = HIS_REFRESH_INTERIOR CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE - done HIS_PIN_INTERIOR_IN_MEMORY : FC = ", GET_FRAME_COUNT()) ENDIF ELSE HospitalInteriorIndex = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 307.3065, -589.9595, 43.3020 >>, "v_hospital") //get handle to hospital interior CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE getting handle to valid interior : FC = ", GET_FRAME_COUNT()) ENDIF ENDIF // refresh the interior once everything should be setup correctly ELIF eHospitalInteriorState = HIS_REFRESH_INTERIOR IF NOT IS_REPLAY_BEING_SET_UP() IF IS_VALID_INTERIOR(HospitalInteriorIndex) IF IS_INTERIOR_READY(HospitalInteriorIndex) REFRESH_INTERIOR(HospitalInteriorIndex) eHospitalInteriorState = HIS_READY // HIS_REQUEST_NEW_LOAD_SCENE_AT_INTERIOR // CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE - SKIPPED ^ done HIS_REFRESH_INTERIOR : FC = ", GET_FRAME_COUNT()) ELSE PIN_INTERIOR_IN_MEMORY(HospitalInteriorIndex) CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE : HIS_REFRESH_INTERIOR - re pinnning in memory : FC = ", GET_FRAME_COUNT()) //eHospitalInteriorState = HIS_PIN_INTERIOR_IN_MEMORY //CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE : HIS_REFRESH_INTERIOR - error interior no longer ready! : FC = ", GET_FRAME_COUNT()) ENDIF ELSE HospitalInteriorIndex = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 307.3065, -589.9595, 43.3020 >>, "v_hospital") //get handle to hospital interior CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE : HIS_REFRESH_INTERIOR - getting handle to valid interior : FC = ", GET_FRAME_COUNT()) //eHospitalInteriorState = HIS_PIN_INTERIOR_IN_MEMORY //CPRINTLN(DEBUG_MISSION, " ***** MANAGE_HOSPITAL_STATE_DURING_CHASE : HIS_REFRESH_INTERIOR - error interior no longer valid! : FC = ", GET_FRAME_COUNT()) ENDIF ENDIF ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG_HOSPITAL_DOORS_STATE - SS_SETUP - set building swaps to BUILDINGSTATE_DESTROYED") ENDIF #ENDIF eSubStage = SS_UPDATE BREAK // ------------------------------------------ CASE SS_UPDATE //MANAGE_HOSPITAL_STATE_DURING_CHASE() MANAGE_JUMP_OUT_HOSPITAL_WINDOW() NIG2_TRACK_STAT_HAS_PLAYER_INJURED_PED_WHILST_IN_HOSPITAL() IF IS_VEHICLE_OK(sNigelVehicle.vehicle) IF IS_ENTITY_IN_ANGLED_AREA(sNigelVehicle.vehicle, <<381.915619,-628.101440,22.932293>>, <<394.477234,-606.126953,35.774826>>, 18.500000) //IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS() // CPRINTLN(DEBUG_MISSION, "+++++++++ ok for stop cutscene FC = ", GET_FRAME_COUNT()) //ENDIF IF IS_VEHICLE_SETTLED_FOR_CUTSCENE(sNigelVehicle.vehicle) IF HAS_TIME_PASSED(iTimer_OutroMocapDelay, 500) DRAW_RECT(0.2, 0.5, 0.2, 0.4, 76, 255, 0, 100) // green ELSE DRAW_RECT(0.2, 0.5, 0.2, 0.4, 170, 0, 255, 100) // purple ENDIF ELSE iTimer_OutroMocapDelay = GET_GAME_TIMER() DRAW_RECT(0.2, 0.5, 0.2, 0.4, 255, 0, 0, 100) // red ENDIF ELSE iTimer_OutroMocapDelay = GET_GAME_TIMER() ENDIF ENDIF // B*1572752 - now creating doors object in script to display until rayfire anim kicks in - rayfire object always struggled to stream prior to start state IF eHospitalDoorsObjectState = HDO_CREATE IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_JUMP) IF NOT DOES_ENTITY_EXIST(sObjectHospitalDoors.objectIndex) REQUEST_MODEL(sObjectHospitalDoors.modelName) IF HAS_MODEL_LOADED(sObjectHospitalDoors.modelName) sObjectHospitalDoors.objectIndex = CREATE_OBJECT(sObjectHospitalDoors.modelName, sObjectHospitalDoors.vPos) IF IS_ENTITY_ALIVE(sObjectHospitalDoors.objectindex) SET_ENTITY_ROTATION(sObjectHospitalDoors.objectindex, sObjectHospitalDoors.vRot) FREEZE_ENTITY_POSITION(sObjectHospitalDoors.objectindex, TRUE) SET_MODEL_AS_NO_LONGER_NEEDED(sObjectHospitalDoors.modelName) eHospitalDoorsObjectState = HDO_WAIT_FOR_DELETE CPRINTLN(DEBUG_MISSION, "OBJECT Hospital Doors Progress, created doors : eHospitalDoorsObjectState > HDO_WAIT_FOR_DELETE") ENDIF ENDIF ENDIF ENDIF // same frame the rayfire object begins to playback from this object ELIF eHospitalDoorsObjectState = HDO_WAIT_FOR_DELETE IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_SPRINT) IF DOES_ENTITY_EXIST(sObjectHospitalDoors.objectIndex) SAFE_DELETE_OBJECT(sObjectHospitalDoors.objectIndex) eHospitalDoorsObjectState = HDO_CREATE CPRINTLN(DEBUG_MISSION, "OBJECT Hospital Doors Progress, doors deleted for rayfire : eHospitalDoorsObjectState > HDO_CREATE") ENDIF ENDIF ELIF eHospitalDoorsObjectState = HDO_END ENDIF //IF GET_ENTITY_UPRIGHT_VALUE(sNigelVehicle.vehicle) < 0.1 // APPLY_FORCE_TO_ENTITY(sNigelVehicle.vehicle, APPLY_TYPE_ANGULAR_IMPULSE, -GET_ENTITY_ROTATION_VELOCITY(vehCar), << 0.0, 0.0, 0.0 >>, 0, TRUE, FALSE, FALSE) //ENDIF /* IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "trigger screams sfx") ENDIF #ENDIF PLAY_SOUND_FROM_COORD(-1, "SCREAMS", << 310.5149, -595.4158, 42.3020 >>, "NIGEL_02_SOUNDSET") ELIF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "trigger flatline sfx") ENDIF #ENDIF PLAY_SOUND_FROM_COORD(-1, "ECG", << 357.6582, -585.5173, 42.3275 >>, "NIGEL_02_SOUNDSET") ENDIF */ /* IF IS_VEHICLE_OK(sTargetVehicle.vehicle) IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) UNPAUSE_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle) #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYBACK OF RECORDING UNPAUSED") ENDIF #ENDIF ENDIF ELIF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO) IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) FREEZE_ENTITY_POSITION(sTargetVehicle.vehicle, FALSE) START_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle, iMainCarRecID, sNigel2_UberRecordingName) #IF IS_DEBUG_BUILD DISPLAY_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle, RDM_WHOLELINE) #ENDIF ENDIF IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTargetVehicle.vehicle) SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle, 109072.500) PAUSE_PLAYBACK_RECORDED_VEHICLE(sTargetVehicle.vehicle) ENDIF ENDIF ENDIF */ BREAK // ------------------------------------------ CASE SS_CLEANUP BREAK ENDSWITCH ENDPROC #ENDIF SCRIPT(g_structRCScriptArgs sRCLauncherDataIn) sRCLauncherDataLocal = sRCLauncherDataIn RC_TakeEntityOwnership(sRCLauncherDataLocal) SET_MISSION_FLAG(TRUE) // Setup callback when player is killed, arrested or goes to multiplayer IF (HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS|FORCE_CLEANUP_FLAG_DEBUG_MENU)) PRINT_LAUNCHER_DEBUG("Force cleanup [TERMINATING]") Random_Character_Failed() Script_Cleanup() ENDIF /*IF IS_REPLAY_IN_PROGRESS() // Set up the initial scene for replays g_bSceneAutoTrigger = TRUE //set the initial scene back up eInitialSceneStage = IS_REQUEST_SCENE WHILE NOT SetupScene_NIGEL_2(sRCLauncherDataLocal) CPRINTLN(DEBUG_MISSION, " IS_REPLAY_IN_PROGRESS - waiting on SetupScene_NIGEL_2") WAIT(0) ENDWHILE RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE) RC_TakeEntityOwnership(sRCLauncherDataLocal) SETUP_AREA_FOR_MISSION(RC_NIGEL_2, FALSE) // need to turn this off in this instance since launcher cleanup won't get called to do it g_bSceneAutoTrigger = FALSE ENDIF*/ INIT_MISSION() // handle replay checkpoints IF IS_REPLAY_IN_PROGRESS() RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE) INT iReplayStage = GET_REPLAY_MID_MISSION_STAGE() IF g_bShitskipAccepted = TRUE iReplayStage++ // player is skipping this stage ENDIF SWITCH iReplayStage CASE CP_NIGEL2_START_CHASE START_REPLAY_SETUP(<<-1309.0155, -641.8671, 25.5017>>, 242.3463, FALSE) // match mocap finished position and heading bDoneDialogue_GetInNigelsVehicle[0] = TRUE //set this dialogue to have already played, because they want the skip to be at the objective instead DO_Z_SKIP(Z_SKIP_START_CHASE) // skip the mocap intro CPRINTLN(DEBUG_MISSION, "* Replay checkpoint * - ", "start chase in progress") BREAK CASE CP_NIGEL2_MISSION_PASSED START_REPLAY_SETUP(<< 391.08, -615.87, 28.33 >>, 333.66, FALSE) // match position for kicking off outro mocap DO_Z_SKIP(Z_SKIP_OUTRO_CUTSCENE) CPRINTLN(DEBUG_MISSION, "* Replay checkpoint * - ", "mission passed in progress (play outro mocap first") BREAK DEFAULT SCRIPT_ASSERT("RC - NIGEL 2 : Replay checkpoint * - starting mission from invalid checkpoint") BREAK ENDSWITCH ENDIF WHILE(TRUE) REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_VSADN") UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) MISSION_FAILED_CHECKS() vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) // Fix B*1121745 - swap over to call everyframe commands SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) SET_ALL_NEUTRAL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) SWITCH eMissionStage CASE MISSION_STAGE_INTRO_MOCAP_SCENE INTRO_MOCAP_SCENE() BREAK CASE MISSION_STAGE_CHASE_TARGET_IN_VEHICLE CHASE_TARGET_IN_VEHICLE() BREAK CASE MISSION_STAGE_GET_CLOSE_TO_TARGET_FOR_CUTSCENE GET_CLOSE_TO_TARGET_FOR_CUTSCENE() BREAK CASE MISSION_STAGE_END_CUTSCENE_MOCAP STAGE_END_CUTSCENE_MOCAP() BREAK CASE MISSION_STAGE_MISSION_PASSED Script_Passed() BREAK CASE MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE MISSION_FAILED_WAIT_FOR_FADE() BREAK CASE MISSION_STAGE_DEBUG_RECORD_CHASE_ROUTE // debug stage #IF IS_DEBUG_BUILD RECORD_CHASE_ROUTE() #ENDIF BREAK CASE MISSION_STAGE_DEBUG_PLAYBACK_CHASE_ROUTE // debug stage #IF IS_DEBUG_BUILD PLAYBACK_CHASE_ROUTE() #ENDIF BREAK CASE MISSION_STAGE_DEBUG // debug stage #IF IS_DEBUG_BUILD DEBUG_STATE() #ENDIF BREAK CASE MISSION_STAGE_DEBUG_HOPSITAL // debug stage #IF IS_DEBUG_BUILD DEBUG_HOSPITAL_STATE() #ENDIF BREAK CASE MISSION_STAGE_DEBUG_HOPSITAL_DOORS // debug stage #IF IS_DEBUG_BUILD DEBUG_HOSPITAL_DOORS_STATE() #ENDIF BREAK ENDSWITCH ENDIF // if we are skipping through the mission stages, for a checkpoint / debug skip IF bFinishedStageSkipping = FALSE JUMP_TO_STAGE(eMissionSkipTargetStage) ENDIF #IF IS_DEBUG_BUILD MAINTAIN_MISSION_WIDGETS() //This is here so it can use the debug skipping functions IF bDebug_SetupMission_DebugStage RC_START_Z_SKIP(TRUE, FALSE) RESET_MISSION() SET_STAGE(MISSION_STAGE_DEBUG_HOPSITAL_DOORS) RC_END_Z_SKIP() IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - mission setup in debug stage.") ENDIF bDebug_SetupMission_DebugStage = FALSE ENDIF // temp placement IF bDebug_CheckPlayerInsideHospital IS_PED_INSIDE_HOSPITAL_INTERIOR(PLAYER_PED_ID()) ENDIF IF bFinishedStageSkipping = TRUE // not skipping stages, check for debug keys as long as we aren't in fail state IF eMissionStage <> MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE DEBUG_Check_Debug_Keys() ENDIF ENDIF #ENDIF WAIT(0) ENDWHILE ENDSCRIPT