Files
2025-09-29 00:52:08 +02:00

32352 lines
1.2 MiB
Plaintext
Executable File

// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : finale_heist3A.sc
// AUTHOR : Matthew Booton
// DESCRIPTION : Michael and Trevor hijack two security vans heading to the bank, pose as the security crew,
// enter the bank via the underground loading entrance and load the gold into the vans. Franklin
// helps the vans travel through the city by hacking the traffic systems. Once the vans reach
// Franklin, the gold is transferred to three smaller cars, while this is happening the cops
// show up. Franklin, Michael and Trevor hold off the cops and escape in the cars, eventually
// driving the cars into a truck.
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//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 "commands_audio.sch"
USING "commands_camera.sch"
USING "commands_clock.sch"
USING "commands_debug.sch"
USING "commands_fire.sch"
USING "commands_graphics.sch"
USING "commands_hud.sch"
USING "commands_misc.sch"
USING "commands_object.sch"
USING "commands_pad.sch"
USING "commands_ped.sch"
USING "commands_physics.sch"
USING "commands_player.sch"
USING "commands_recording.sch"
USING "commands_script.sch"
USING "commands_streaming.sch"
USING "commands_task.sch"
USING "commands_vehicle.sch"
USING "commands_interiors.sch"
USING "commands_itemsets.sch"
USING "building_control_public.sch"
USING "cam_recording_public.sch"
USING "chase_hint_cam.sch"
USING "dialogue_public.sch"
USING "emergency_call.sch"
USING "locates_public.sch"
USING "flow_public_core_override.sch"
USING "model_enums.sch"
USING "push_in_public.sch"
USING "script_ped.sch"
USING "script_player.sch"
USING "script_misc.sch"
USING "script_blips.sch"
USING "script_heist.sch"
USING "selector_public.sch"
USING "locates_public.sch"
USING "replay_public.sch"
USING "CompletionPercentage_public.sch"
USING "taxi_functions.sch"
USING "cutscene_public.sch"
USING "vehicle_gen_public.sch"
USING "stripclub_public.sch"
USING "shop_public.sch"
USING "shared_hud_displays.sch"
USING "heist_end_screen.sch"
USING "vehicle_public.sch"
USING "achievement_public.sch"
USING "clearmissionarea.sch"
USING "spline_cam_edit.sch"
USING "cheat_controller_public.sch"
// total should not exceed 225
CONST_INT TOTAL_NUMBER_OF_TRAFFIC_CARS 75
CONST_INT TOTAL_NUMBER_OF_PARKED_CARS 22
CONST_INT TOTAL_NUMBER_OF_SET_PIECE_CARS 28
// total should not exceed 12
CONST_INT MAX_NUMBER_OF_TRAFFIC_CARS_PLAYING_BACK 16
CONST_INT MAX_NUMBER_OF_SET_PIECE_CARS_PLAYING_BACK 12
// this should be fine
CONST_INT MAX_NUMBER_OF_PARKED_CARS_PLAYING_BACK 20
USING "traffic.sch"
#IF IS_DEBUG_BUILD
USING "shared_debug.sch"
USING "script_debug.sch"
USING "select_mission_stage.sch"
#ENDIF
ENUM MISSION_STAGE
STAGE_START_CUTSCENE = 0,
STAGE_SET_UP_STINGER,
STAGE_VAN_CRASH_CUTSCENE,
STAGE_HIJACK_VANS,
STAGE_HIJACK_CUTSCENE,
STAGE_DRIVE_TO_BANK,
STAGE_BANK_PARK_CUTSCENE,
STAGE_WALK_TO_LIFT_1,
STAGE_LIFT_CUTSCENE_1,
STAGE_WALK_TO_VAULT,
STAGE_VAULT_OPEN_CUTSCENE,
STAGE_WALK_TO_GOLD,
STAGE_COLLECT_GOLD_CUTSCENE,
STAGE_WALK_TO_LIFT_2,
STAGE_LIFT_CUTSCENE_2,
STAGE_WALK_TO_VANS,
STAGE_LOAD_GOLD_IN_VANS_CUTSCENE,
STAGE_LEAVE_BANK,
STAGE_SWAP_TO_FRANKLIN_CUTSCENE,
STAGE_TRAFFIC_CONTROL,
STAGE_ARRIVAL_CUTSCENE,
STAGE_SHOOTOUT,
STAGE_CHASE_START_CUTSCENE,
STAGE_CHASE,
STAGE_CHASE_END_CUTSCENE,
STAGE_DROP_OFF_TRUCKS_CUTSCENE,
STAGE_GO_TO_MICHAELS_HOUSE,
STAGE_FINAL_CUTSCENE,
STAGE_DEBUG_RECORD_TRAFFIC,
STAGE_DEBUG_RECORD_SETPIECES,
STAGE_DEBUG_RECORD_VAN_CRASH,
STAGE_DEBUG_RECORD_RAMP_DRIVE,
STAGE_DEBUG_TEST_RAMP_DRIVE_PLAYBACK,
STAGE_DEBUG_RECORD_TRUCK_AND_TRAILER,
STAGE_DEBUG_RECORD_CHASE_CAM,
STAGE_DEBUG_PLAY_CHASE_CAM
ENDENUM
ENUM FAILED_REASON
FAILED_GENERIC = 0,
FAILED_FRANKLIN_DIED,
FAILED_MICHAEL_DIED,
FAILED_TREVOR_DIED,
FAILED_CREW_MEMBER_DIED,
FAILED_CREW_MEMBERS_DIED,
FAILED_START_CAR_DESTROYED,
FAILED_GOLD_TRUCK_DESTROYED,
FAILED_GOLD_TRUCKS_DESTROYED,
FAILED_GOLD_CAR_DESTROYED,
FAILED_SOME_GOLD_CARS_DESTROYED,
FAILED_GOLD_CARS_DESTROYED,
FAILED_LOST_BUDDIES,
FAILED_DESTROYED_FRANKLINS_BIKE,
FAILED_SPOOKED_VAN_PEDS,
FAILED_MISSED_STINGER,
FAILED_STINGER_NOT_IN_TIME,
FAILED_SECURITY_WORKER_DEAD,
FAILED_SOME_SECURITY_WORKERS_DEAD,
FAILED_ALL_SECURITY_WORKERS_DEAD,
FAILED_ALERTED_BANK_BY_KILLING_SECURITY,
FAILED_ALERTED_BANK_VIA_GPS,
FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS,
FAILED_ALERTED_COPS,
FAILED_CAUGHT_DURING_TRAFFIC_CONTROL,
FAILED_MISSED_TRUCKS,
FAILED_CAR_STUCK,
FAILED_VAN_STUCK,
FAILED_LEFT_TREVOR_BEHIND,
FAILED_LEFT_MICHAEL_BEHIND,
FAILED_LEFT_FRANKLIN_BEHIND,
FAILED_LEFT_CREW_BEHIND,
FAILED_MISSED_TUNNEL,
FAILED_BANK_WORKER_DEAD,
FAILED_SPOOKED_BANK_WORKERS,
FAILED_ABANDONED_SHOOTOUT_CREW,
FAILED_ABANDONED_CAR,
FAILED_MICHAEL_VAN_TOO_DAMAGED,
FAILED_TREVOR_VAN_TOO_DAMAGED,
FAILED_TRUCK_DRIVER_DIED,
FAILED_LESTER_DIED,
FAILED_COPS_SPOTTED_TRANSFER
ENDENUM
ENUM SECTION_STAGE
SECTION_STAGE_SETUP = 0,
SECTION_STAGE_RUNNING,
SECTION_STAGE_CLEANUP,
SECTION_STAGE_SKIP,
SECTION_STAGE_JUMPING_TO_STAGE
ENDENUM
ENUM LIFT_DOOR_ACTION
LIFT_DOOR_INSTANT_OPEN,
LIFT_DOOR_INSTANT_CLOSE,
LIFT_DOOR_WAIT_FOR_OPEN_THEN_LOCK,
LIFT_DOOR_OPEN,
LIFT_DOOR_CLOSE,
LIFT_DOOR_UNLOCK
ENDENUM
ENUM TRAFFIC_CAR_STATE
TC_STATE_MOVING,
TC_STATE_GOING_THROUGH_GREEN,
TC_STATE_STOPPED_AT_RED
ENDENUM
ENUM SHOOTOUT_STATE
SHOOTOUT_STATE_DEFEND_FRONT_1,
SHOOTOUT_STATE_DEFEND_FLANK_1,
SHOOTOUT_STATE_DEFEND_FRONT_2,
SHOOTOUT_STATE_KILL_REMAINDER
ENDENUM
ENUM BUDDY_SHOOTOUT_STATE
BUDDY_STATE_DEFENDING_FRONT,
BUDDY_STATE_DEFENDING_FLANK_CLOSE,
BUDDY_STATE_DEFENDING_FLANK_FAR,
BUDDY_STATE_SNIPING
ENDENUM
ENUM PLAYER_SHOOTOUT_STATE
PLAYER_STATE_DEFENDING_FRONT,
PLAYER_STATE_DEFENDING_FLANK,
PLAYER_STATE_SNIPING
ENDENUM
ENUM TRIGGERED_TEXT_LABEL
FH3A_SKID ,
FH3A_MVEGUN ,
FH3A_MVEDRV ,
FH3A_DRP ,
FH3A_TCOMM ,
FH3A_SPIN ,
FH3A_CRSH ,
FH3A_KILL ,
FH3A_SAVE ,
FH3A_HK10 ,
FH3A_CHAT1,
FH3A_CHAT2,
FH3A_CHAT3,
FH3A_WANTED ,
LOSE_WANTED ,
FH3A_GUNCAR ,
FH3A_LONG ,
FH3A_LONG2 ,
FH3A_WAIT ,
FH3A_HOLD_PRELOAD,
FH3A_DROP ,
F3A_STINGER ,
FH3A_PROMPT ,
F3A_STINGHELP ,
FH3A_STINGER ,
F3A_WAITVAN ,
FH3A_STOP ,
FH3A_MCS1_LI ,
F3A_GETINVAN,
F3A_JACKVANS ,
FH3A_THR ,
FH3A_GOING ,
FH3A_CHAT4 ,
FH3A_LATE ,
FH3A_BURST ,
FH3A_GATE ,
FH3A_GATE_PRELOAD ,
F3A_FOLLOW ,
FH3A_LIASON ,
FH3A_LAG1 ,
FH3A_LAG1B ,
FH3A_MCS3_LO ,
FH3A_MCS3_LO_7 ,
FH3A_MCS3_LO_PRELOAD,
FH3A_SWITCH_PRELOAD,
FH3A_SWITCH_1,
FH3A_WORKER ,
FH3A_VAULT ,
FH3A_LAG2 ,
FH3A_WALK ,
FH3A_LAG3 ,
FH3A_PSHTROL ,
FH3A_LAG4 ,
FH3A_SEEN_1 ,
FH3A_SEEN_2 ,
FH3A_TROLLEY ,
FH3A_LAG5 ,
FH3A_MCS7LO1 ,
FH3A_GOING2 ,
FH3A_RADIO ,
FH3A_EXPLAIN ,
FH3A_RESPOND ,
FH3A_AWAY ,
F3A_SWITCHFRAN ,
FH3A_NOGO ,
FH3A_MCS7LO2_1 ,
FH3A_MCS7LO2_2 ,
FH3A_MCS7LO2_1_SKIPPED ,
FH3A_MCS7LO2_3 ,
F3A_TRAFHELP1D ,
F3A_TRAFHELP1B ,
FH3A_HACK ,
F3A_TRAFFIC ,
F3A_TRAFHELP3 ,
FH3A_FSEES ,
FH3A_JUNCT2 ,
FH3A_NEARLY ,
FH3A_RED ,
FH3A_IMPAT ,
FH3A_GREEN ,
FH3A_FRONT ,
FH3A_LOOKL ,
FH3A_FRONT2 ,
FH3A_STAY ,
FH3A_SNIPE ,
FH3A_OUT,
FH3A_GONE,
FH3A_SHEND ,
FH3A_NOTIME,
F3A_KILLCOPS ,
FH3A_CAR ,
FH3A_LOOKUP ,
F3A_ABANCREW ,
F3A_CAMHELP ,
FH3A_DRIVEOF ,
F3A_CHASE ,
FH3A_HARDR ,
FH3A_MJUMP ,
FH3A_GOOFF ,
FH3A_JUMP ,
FH3A_EXP ,
FH3A_SEETUN,
FH3A_CHOP,
FH3A_COPS ,
FH3A_COPSCREW ,
FH3A_SITE ,
FH3A_LOST ,
FH3A_TRUCK ,
FH3A_RTRUCK ,
FH3A_TRK ,
FH3A_ENC ,
FH3A_MAKE ,
FH3A_WHF ,
FH3A_WHERE ,
FH3A_TANKER ,
FH3A_BADTRK ,
F3A_TRUCK ,
F3A_GETBACKCAR ,
FH3A_ENDC ,
FH3A_ENDC_PRELOAD ,
FH3A_TALK ,
FH3A_TALK2 ,
FH3A_FNEAR ,
FH3A_LESTER,
FH3A_HOLD,
FH3A_KOSHM,
FH3A_KOSHF,
FH3A_KOSHT
ENDENUM
STRUCT BIRD_DATA
PED_INDEX ped
INT iEvent
INT iTimer
VECTOR vDir
FLOAT fSpeed
ENDSTRUCT
STRUCT MISSION_VEHICLE
VEHICLE_INDEX veh
BLIP_INDEX blip
INT iEvent
ENDSTRUCT
STRUCT MISSION_PED
PED_INDEX ped
BLIP_INDEX blip
INT iEvent
INT iTimer
ENDSTRUCT
STRUCT BUDDY_DATA
PED_INDEX ped
//PED_INDEX ped_current_target
BLIP_INDEX blip
COVERPOINT_INDEX cover
INT iEvent
INT iTimer
INT iTimeOfShootoutRouteSwitch
BOOL bRefreshTasks
BOOL bIsUsingSecondaryCover
VECTOR vDest
BUDDY_SHOOTOUT_STATE eBuddyShootoutState
ENDSTRUCT
STRUCT ENEMY_DATA
PED_INDEX ped
//PED_INDEX ped_current_target
BLIP_INDEX blip
COVERPOINT_INDEX cover
BOOL bIsCreated
BOOL bHasCleanedUp
BOOL bHasStartedRopeJump
BOOL bSetToCharge
INT iEvent
INT iTimer
INT iRopeEvent
VECTOR vDest
AI_BLIP_STRUCT sBlipData
ENDSTRUCT
STRUCT JUNCTION_CROSSING
VECTOR vCentre
FLOAT fHeading
//FLOAT fWidth
BOOL bIsBlocked
INT iAdjacentJunction
ENDSTRUCT
STRUCT TRAFFIC_GAME_JUNCTION
VECTOR vCentre
VECTOR vCamPos
VECTOR vCamRot
FLOAT fCamFov
INT iChangeTimer
INT iBufferingTimer
BOOL bPlayedLightStatusDialogue
BOOL bLightsFrozen
BOOL bIsBuffering
JUNCTION_CROSSING sCrossings[4]
ENDSTRUCT
STRUCT TRAFFIC_GAME_DATA
FLOAT fAspectRatio
FLOAT fHudAlpha
FLOAT fCamRotOffsetX
FLOAT fCamRotOffsetZ
FLOAT fNoiseLevel
INT iSelection
INT iNoiseTimer
INT iTimeSinceLastSelection
INT iCopsSpriteColourModifier
INT iCopsSpriteColourDir
INT iBackgroundSound
INT iStaticSound
INT iSelectSound
INT iIndicatorFlashTimer
//INT iCarCreationTimer
//INT iLastCarProcessed
INT iLastJunctionCamViewed
BOOL bJunctionCamActive
BOOL bAllowMovement
BOOL bAllowCamSwitch
BOOL bAllowSwitch
BOOL bJunctionStreamingActive
VECTOR vCursorPos
VECTOR vCurrentIndicatorPos
VEHICLE_INDEX vehIndicatorTarget
ENDSTRUCT
STRUCT TRAFFIC_GAME_CAR
VEHICLE_INDEX veh
PED_INDEX ped
BOOL bIsCreated
BOOL bIsOffScreen
INT iTimer
INT iFlashTimer
FLOAT fPlaybackSpeed
TEXT_LABEL strCurrentWaypoint
VECTOR vCurrentDest
ENDSTRUCT
STRUCT ACTION_CAM_ANGLE
INT iRecordingID
FLOAT fStartTime
ENDSTRUCT
BOOL bPickedGoodCarDriver = FALSE
BOOL bPickedGoodTruckDriver = FALSE
BOOL bPickedGoodGunman = FALSE
BOOL bPickedGoodSecondGunman = FALSE
BOOL bCustomGpsActive = FALSE
BOOL bRequestedTrafficScaleform = FALSE
BOOL bTrafficGameAudioSceneActive = FALSE
BOOL bMissionFailed = FALSE
BOOL bTrevorLeftVault = FALSE
BOOL bPlayerLeftVault = FALSE
BOOL bHostageLeftVault = FALSE
BOOL bWorkerLeftVault = FALSE
BOOL bPlayedLiftSound = FALSE
BOOL bMichaelReachedTrafficFinish = FALSE
BOOL bTrevorReachedTrafficFinish = FALSE
BOOL bPlayerAlreadyGivenArmour = FALSE
BOOL bSlomoActive = FALSE
BOOL bSkippedMocap = FALSE
BOOL bClosedVaultDoor = FALSE
BOOl bRetryingTrafficSection = FALSE
BOOL bPlayerInShootoutSafeArea = FALSE
BOOL bFrozenVehiclesForShootout = FALSE
BOOL bChaseTrailerReadyToDriveUp = FALSE
BOOL bTunnelAudioSceneActive = FALSE
BOOL bMichaelInvincibleDuringChase = FALSE
BOOL bTCPrimedMichaelNearMissDialogue = FALSE
BOOL bTCPrimedTrevorNearMissDialogue = FALSE
BOOL bMichaelSaidInstructionInChase = FALSE
BOOL bPlayerReachedBuildingSiteBlockade = FALSE
BOOL bPlayerReachedRockfordBlockade = FALSE
BOOL bPlayerReachedFreewayBlockade = FALSE
BOOL bDoAlternateVanArrivalCutscene = FALSE
BOOL bTrevorSetToLookInVansArriveCut = FALSE
BOOL bCamIsInterpingToVans = FALSE
BOOL bUberPlaybackHasStartedFromMocap = FALSE
BOOL bPlayedCopCrashSound = FALSE
BOOL bDisabledSwitch = FALSE
BOOL bPlayTruckMusicEvent = FALSE
BOOl bTrafficAudioStreamActive = FALSE
BOOl bPlayerIsDrivingUpRamp = FALSE
BOOL bFranklinsBikeAudioSceneActive = FALSE
BOOL bPlayedFranklinsBikeRevSound = FALSE
BOOL bBarriersAddedToBankInterior = FALSE
BOOL bChaseTrailerFrozen[2]
BOOL bBuddiesPushedToFlank = FALSE
BOOL bTankerCrashStreamActive = FALSE
BOOL bTrafficEndStreamingActive = FALSE
BOOL bVanTyreBurst = FALSE
BOOL bDoNewVersionOfShootout = TRUE
BOOL bMichaelsHelmetRemoved = FALSE
BOOL bRemovedShotgunSilencer = FALSE
BOOL bPreloadedOutfitsForCutscene = FALSE
BOOL bHasUsedCheckpoint = FALSE
BOOL bPlayersCarExitStateHasBeenHit = FALSE
BOOl bHeliAudioSceneSet = FALSE
BOOL bTriggeredTrafficIntro = FALSE
BOOL bInSafeAreaForInfiniteFlankSpawn = FALSE
BOOL bNearInfiniteFlankSpawnArea = FALSE
BOOL bSafeToDriveOntoTrucks = TRUE
//BOOL bPlayerExitStateHit = FALSE
//BOOL bCameraExitStateHit = FALSE
BOOL bDriverGoldBarsCreated = FALSE
BOOL bGunmanGoldBarsCreated = FALSE
BOOl bMissionPassedScreenDisplayed = FALSE
BOOL bHasChangedClothesMichael = FALSE
BOOL bHasChangedClothesFranklin = FALSE
BOOL bHasChangedClothesTrevor = FALSE
BOOL bReplayEventStarted = FALSE
BOOL bHitCutsceneCamExitState = FALSE
BOOL bHasFirstPersonFlashTriggered = FALSE
BOOL bHasTextLabelTriggered[130]
BOOL bPCCursorAccept = FALSE
BOOL bPCCursorMoved = FALSE
CONST_INT TC_NORTH_JUNCTION 0
CONST_INT TC_EAST_JUNCTION 1
CONST_INT TC_SOUTH_JUNCTION 2
CONST_INT TC_WEST_JUNCTION 3
CONST_INT CHECKPOINT_DRIVE_TO_BANK 1
CONST_INT CHECKPOINT_BANK_TOUR 2
CONST_INT CHECKPOINT_LEAVE_BANK 3
CONST_INT CHECKPOINT_TRAFFIC_CONTROL 4
CONST_INT CHECKPOINT_SHOOTOUT 5
CONST_INT CHECKPOINT_CHASE 6
CONST_INT CHECKPOINT_GO_HOME 7
CONST_INT HOSTAGE_INDEX 0
CONST_INT CASEY_ID 0
CONST_INT VAN_DRIVER_2 2
CONST_INT CARREC_TC_COP_1 10
CONST_INT CARREC_TC_COP_2 11
CONST_INT CARREC_TC_COP_3 12
CONST_INT CARREC_TC_COP_4 13
CONST_INT CARREC_TC_COP_5 14
CONST_INT CARREC_TC_COP_6 15
CONST_INT CARREC_CHASE_TRIGGER 100
CONST_INT CARREC_TRAILER_RIGHT 103
CONST_INT CARREC_TRUCK_RIGHT_BAD 98
CONST_INT CARREC_TRAILER_RIGHT_BAD 99
CONST_INT CARREC_TRAILER_LEFT 104
CONST_INT CARREC_CHASE_BUDDY_1 105
CONST_INT CARREC_CHASE_BUDDY_2 109
CONST_INT CARREC_CHASE_BUDDY_3_GOOD_TRUCK 107
CONST_INT CARREC_CHASE_BUDDY_3_BAD_DRIVER 108
CONST_INT CARREC_CHASE_BUDDY_3_BAD_TRUCK 97
CONST_INT CARREC_GAS_TANKER 122
CONST_INT CARREC_CHASE_COPS_BLOCKADE 137
CONST_INT CARREC_CHASE_COPS_BLOCKADE_2 138
CONST_INT CARREC_VAN_STINGER_1 501
CONST_INT CARREC_VAN_STINGER_2 502
CONST_INT CARREC_VAN_STINGER_BUDDIES 503
CONST_INT CARREC_COPS_VAN_1 551
CONST_INT CARREC_COPS_VAN_2 552
CONST_INT CARREC_COPS_COP_1 555
CONST_INT CARREC_COPS_COP_2 556
CONST_INT CARREC_COPS_COP_3 557
CONST_INT CARREC_COPS_NOOSE_1 558
CONST_INT CARREC_COPS_NOOSE_2 559
CONST_INT CARREC_COPS_HELI_1 560
CONST_INT CARREC_SHOOTOUT_GOONS_2A 561
CONST_INT CARREC_SHOOTOUT_GOONS_2B 562
CONST_INT CARREC_SHOOTOUT_GOONS_3A 563
CONST_INT CARREC_SHOOTOUT_GOONS_3B 564
CONST_INT CARREC_BANK_PARK_1 600
CONST_INT CARREC_BANK_PARK_2 601
CONST_INT CARREC_BANK_LEAVE_GATE 602
CONST_INT CARREC_BANK_TREVOR 603
CONST_INT CARREC_BANK_LEAVE 605
CONST_INT CARREC_GOLD_VANS_APPEAR 650
CONST_INT CARREC_END_TRUCK_1 701
CONST_INT CARREC_END_TRAILER_1 702
CONST_INT CARREC_END_TRUCK_2 703
CONST_INT CARREC_END_TRAILER_2 704
CONST_INT CARREC_END_HELI 705
CONST_INT CARREC_RAMP_HACK_CAR 901
CONST_INT CARREC_RAMP_HACK_TRAILER 902
CONST_INT PLAYERS_GOLD_CAR 3
CONST_INT NUM_TC_COP_CARS 7
CONST_INT CREW_FORCED_GUNMAN 1
CONST_INT CREW_FORCED_DRIVER 3
CONST_INT CREW_GUNMAN 0
CONST_INT CREW_DRIVER 2
CONST_INT CREW_HACKER 4
CONST_INT CHOPPER_SETPIECE_ID 5
CONST_INT MERRY_SPEAKER_1 6
CONST_INT MERRY_SPEAKER_2 7
CONST_INT MERRY_SPEAKER_3 8
CONST_INT GOLD_TROLLEY_BONE_GRIP_LEFT 14991
CONST_INT GOLD_TROLLEY_BONE_GRIP_RIGHT 50415
CONST_INT HACKER_LEVEL_GOOD 0
CONST_INT HACKER_LEVEL_MEDIUM 1
CONST_INT HACKER_LEVEL_BAD 2
CONST_INT MAX_OVERALL_TAKE 201600000
CONST_INT MERRY_CAR_COLOUR 99
INT iCurrentEvent = 0
INT iTimelapseTimer = 0
INT iCineCamPhoneTimer = 0
INT iGameplayHintEvent = 0
INT iSwitchStage = 0
INT iHealthBeforeSwitch = 0
INT iCarrecChaseBuddy3 = CARREC_CHASE_BUDDY_3_GOOD_TRUCK
INT iPreloadRecordingsIndex = 0
INT iBankGateOpenSound = 0
INT iTrafficControlHelpEvent = 0
INT iLiftDoorIndex = 0
//INT iBridgeNooseDialogueTimer = 0
INT iJumpSlomoStage = 0
//INT iChopperBulletTimer = 0
INT iLiftSoundID = 0
INT iLiftMoveSoundID = 0
INT iLiftEvent = 0
INT iCurrentTrafficCarToReposition = 0
INT iCurrentTrafficCarToProcess = 0
INT iCurrentCopCarToProcess = 0
INT iVaultDoorOpenSoundID = 0
INT iVaultDoorCloseSoundID = 0
INT iClosestVehicleCheckTimer = 0
INT iAmbientDialogueTimer = 0
INT iChaseHornTimer = 0
INT iRedLightDialogueTimer = 0
INT iRedLightHornTimer = 0
INT iSyncSceneArriveAtBank = 0
INT iSyncSceneArriveAtBank2 = 0
//INT iSyncSceneSecurityWait = 0
INT iTrainTimer = 0
INT iDriverGoldSyncScene = 0
INT iGunmanGoldSyncScene = 0
INT iTCDialogueTimer = 0
INT iGasTankerExplosionTimer = 0
INT iGasTankerExplosionEvent = 0
INT iVaultWorkerSyncScene = 0
INT iBankWorkerIdleTimer = 0
INT iTrafficHighlightEvent = 0
INT iTrafficHighlightTimer = 0
INT iGasTankerDialogueTimer = 0
INT iVanCrashEvent = 0
INT iCurrentActionCam = 0
INT iHeliBurstTimer = 0
INT iCombatDialogueTimer = 0
INT iFranklinShootoutDialogueTimer = 0
INT iTrevorShootoutDialogueTimer = 0
INT iMichaelShootoutDialogueTimer = 0
INT iMusicTriggerEvent = 0
//INT iCutsceneCamEvent = 0
INT iChaseEndTimer = 0
//INT iMerryweatherDialogueTimer = 0
INT iTrafficBlipFlashTimer = 0
INT iMusicStartTimer = 0
INT iTCNearMissDialogueTimer = 0
INT iPrevNumVanCrashes = 0
INT iTimeSinceVanLastMovedQuickly = 0
INT iTimeSinceVanLastDamaged = 0
INT iTunnelJourneyDialogueTimer = 0
INT iChaseCrashTimer = 0
INT iTrevorLagDialogueTimer = 0
INT iTrafficLightOverrideEvent = 0
INT iChaseHeliDialogueTimer = 0
INT iShootoutEndTimer = 0
INT iBankExitBarrierHash = HASH("Finale_Bank_Exit_Barrier")
INT iBankDoorState = 0
INT iTimeSinceLastChaseCopKilled = 0
INT iStingerAudioSceneEvent = 0
INT iChaseAudioSceneEvent = 0
INT iCopsCollisionDialogueTimer = 0
INT iTimeVansStopped = 0
INT iHackerLevel = HACKER_LEVEL_GOOD
INT iTrafficFailTimer = 0
INT iTrafficInstructionEvent = 0
INT iTimeOfLastTrafficSwitch = 0
INT iCurrentTake = 0 //Used for tracking take changes during the heist, mainly so the displayed take can be kept up to date.
INT iDisplayedTake = 0
INT iMaxTakeConsideringCrew = 0 //Stores take considering crew choices: this is used to calculate losses due to previous crew deaths easily on skips.
INT iTakePenaltyDropGold = 0
INT iTakePenaltyCrewDies = 0
INT iTakePenaltyCaseysCut = 0
INT iMoneyCountSoundID = 0
INT iChaseCutsceneCarSpawnTimer = 0
INT iBridgeEnemiesDialogueTimer = 0
INT iEnemyNotVisibleDialogueTimer = 0
INT iIllCoverYouDialogueTimer = 0
INT iTimeOfLastSwitch = 0
INT iGoldTrolleySoundID[2]
INT iBankWorkerSyncScene = 0
INT iSyncSceneLiftLeadOut[3]
INT iNumAliveCopsStart = 0
INT iNumAliveCopsWave2 = 0
INT iNumAliveVanFlank = 0
INT iNumAliveVanCrash = 0
INT iNumAliveNooseRope1 = 0
INT iNumAliveNooseAbove = 0
INT iNumAliveGoonsWave3b = 0
INT iNumAliveGoonsSnipe = 0
INT iNumAliveFrontEnemies = 0
INT iNumAliveInfiniteEnemiesFront = 0
INT iNumAliveInfiniteEnemiesFlank = 0
INT iTotalEnemiesInShootout = 0
INT iWrongWayDialogueTimer = 0
INT iLostDialogueTimer = 0
INT iNumTimesPlayedTrevorLostDialogue = 0
INT iNumTimesPlayedMichaelLostDialogue = 0
INT iNumTimesPlayedCrewLostDialogue = 0
INT iNumTimesPlayedTrevorFoundDialogue = 0
INT iNumTimesPlayedMichaelFoundDialogue = 0
INT iSyncSceneHijackCars = 0
INT iSyncSceneHijackCasey = 0
INT iTimeLastFlankingEnemyDamaged = 0
INT iFlankEnemiesSpawnTimer = 0
INT iTimeLastFrontEnemyDamaged = 0
INT iTimeSnipersKilledByPlayer = 0
INT iTrafficSyncedScene = 0
INT iHijackSpeechTimer = 0
INT iCarCreationEvent = 0
INT iNumFrontInfiniteEnemiesSpawned = 0
INT iNumFlankInfiniteEnemiesSpawned = 0
INT iSirenBlipTimer = 0
INT iCopsTailingFranklinEvent = 0
INT iLocateCheckIndex = 0
INT iSyncSceneMichaelsHouseDoors = 0
INT iLesterEndEvent = 0
INT iTimeSniperDialogueTriggered = 0
INT iFranklinHitCopDialogueTimer = 0
INT iCountdownAudioEvent = 0
INT iNavmeshBlockShootout[5]
INT iNavmeshBlockBankEntrance = -1
INT iTrailerRampSounds[2]
INT iTrailerRampRaiseSounds[2]
INT iTrolleyEmptyingStage[2]
CONST_FLOAT TRAILER_SETPIECE_SPEED 0.8
FLOAT fChaseTriggerHeading = 182.9051
FLOAT fChasePlaybackTime = 0.0
FLOAT fChasePlaybackSpeed = 1.0
//FLOAT fChopperPlaybackSpeed = 1.0
FLOAT fTrafficGameMainCamFOV = 65.4608
FLOAT fLiftOpenRatio = 0.0
FLOAT fCurrentTimeScale = 0.0
FLOAT fPrevClosestMerryDistMike = 0.0
FLOAT fPrevClosestMerryDistTrev = 0.0
FLOAT fStartCarHeading = 122.7590
FLOAT fPlaybackOffset = 0.0
FLOAT fPrevDistanceFromBank = 0.0
FLOAT fPrevDistanceFromTunnel = 0.0
FLOAT fFranklinPostMissionHeading = 62.5//61.0103
FLOAT fTrailerDoorRatios[2]
FLOAT fTrafficLatitude[4]
FLOAT fPrevTrafficLatitude[4]
FLOAT fTrafficTime[3]
FLOAT fPrevTrafficTime[3]
VECTOR vOutsideSecurityGate = <<-80.0971, -683.0414, 33.5046>>
VECTOR vTunnelPos = <<293.7361, -640.5953, 28.1654>>
VECTOR vWaitForVansPos = <<294.7272, -640.9750, 28.1689>>
//VECTOR vBankWorkerDestination1 = <<10.0880, -667.5394, 32.4749>>
//VECTOR vBankWorkerDestination2 = <<-1.9512, -663.2974, 15.1556>>
VECTOR vBankExit = <<28.9340, -656.6191, 30.6251>>
VECTOR vChaseTriggerStart = <<133.7468, -1204.6522, 28.2951>>
VECTOR vGate1 = <<-72.785, -682.290, 32.77>>
VECTOR vGate2 = <<25.0, -664.5, 30.76>>
//VECTOR vVaultDoorPos = <<-5.6567, -687.8661, 15.1556>>
VECTOR vTrafficGameMainCamPos = <<0.8525, -961.6469, 502.7943>>//<<43.130051,-970.825195,394.223145>> //<<46.350388,-962.160095,259.162933>>
VECTOR vTrafficGameMainCamRot = <<-89.498756,-0.000003,-20.320625>>//<<-89.499535,-0.000001,-20.320627>> //<<-89.498756,3.158357,-17.216499>>
VECTOR vVaultDoorPos = <<-1.7, -686.5, 16.7>>
VECTOR vStingerDropPos = <<0.0, 0.0, 0.0>>
VECTOR vLiftBottom1 = <<2.1, -704.1, 15.1>>
VECTOR vLiftBottom2 = <<-0.6, -703.1, 15.1>>
VECTOR vLiftTop1 = <<11.7, -668.5, 32.4>>
VECTOR vLiftTop2 = <<8.8, -668.7, 32.4>>
VECTOR vBankWorkerExit = <<-3.1908, -661.0954, 32.4830>>
VECTOR vTrolleyLeftHandAttach = <<0.0, 0.0, -0.1>>//<<-0.762, 0.559, 0.822>>
VECTOR vTrolleyRightHandAttach = <<0.0, 0.0, -0.1>>//<<-0.782, -0.539, 0.822>>
VECTOR vTrolleyAttach = <<0.0, 1.3444, -0.61>> //<<0.0, 1.5444, -0.61>>
VECTOR vStartCarPos = <<136.8679, -1305.4700, 28.0474>>
VECTOR vMichaelsHousePos = <<-817.7731, 177.7026, 71.2278>>
VECTOR vFranklinPostMissionPos = <<-2434.8701, -229.8764, 15.3772>>
STRING strManagerLeadOut = "missbigscore2aleadinout@ig_7_p2@bankman@"
STRING strAnimLiftLeadOut = "missbigscore2aleadinout@bs_2a_mcs_3"
STRING strVanArriveCamAnim = "missbigscore2a"
STRING strTrailerRampAnims = "missbigscore2a"
STRING strAnimsHijack = "missbigscore2aleadinout@bs_2a_mcs_1"
STRING strAnimsTrafficSwitch = "missbigscore2aswitch"
STRING strAnimsCamShake = "shake_cam_all@"
STRING strAnimsLesterLeadIn = "missbigscore2aleadinout@bs_2a_ext"
TEXT_LABEL strTrafficTextures = "trafficCam"
TEXT_LABEL strStingerAnims = "P_ld_stinger_s"
TEXT_LABEL strCarrec = "finheista"
TEXT_LABEL strWaypointVehLeaveBank = "BigScoreA10"
TEXT_LABEL strWaypointVehEnterBank = "BigScoreA11"
TEXT_LABEL strWaypointVehGotoBank = "BigScoreA12"
TEXT_LABEL strWaypointLiftEnterTop = "BigScoreA01"
TEXT_LABEL strWaypointLiftEnterTopLeft = "BigScoreA25"
TEXT_LABEL strWaypointLiftEnterTopRight = "BigScoreA26"
TEXT_LABEL strWaypointLiftExitTop = "BigScoreA02"
TEXT_LABEL strWaypointLiftExitTopLeft = "BigScoreA21"
TEXT_LABEL strWaypointLiftExitTopRight = "BigScoreA22"
TEXT_LABEL strWaypointLiftExitBottom = "BigScoreA03"
TEXT_LABEL strWaypointLiftExitBottomLeft = "BigScoreA27"
TEXT_LABEL strWaypointLiftExitBottomRight = "BigScoreA28"
TEXT_LABEL strWaypointLiftEnterBottom = "BigScoreA04"
TEXT_LABEL strWaypointLiftEnterBottomLeft = "BigScoreA23"
TEXT_LABEL strWaypointLiftEnterBottomRight = "BigScoreA24"
TEXT_LABEL strWaypointVehTrafficMain = "BigScoreA50"
/*TEXT_LABEL strWaypointVehTrafficCops1 = "BigScoreA60"
TEXT_LABEL strWaypointVehTrafficCops2 = "BigScoreA61"
TEXT_LABEL strWaypointVehTrafficCops3 = "BigScoreA62"
TEXT_LABEL strWaypointVehTrafficCops4 = "BigScoreA63"
TEXT_LABEL strWaypointVehTrafficCops5 = "BigScoreA64"
TEXT_LABEL strWaypointVehTrafficCops6 = "BigScoreA65"
TEXT_LABEL strWaypointVehTrafficCops7 = "BigScoreA66"*/
TEXT_LABEL strWaypointVehTCGoon1 = "BigScoreA70"
TEXT_LABEL strWaypointVehTCGoon2 = "BigScoreA71"
TEXT_LABEL strWaypointVehTCGoon3 = "BigScoreA72"
TEXT_LABEL strWaypointVehTCGoon4 = "BigScoreA73"
TEXT_LABEL strWaypointVehTCGoon5 = "BigScoreA74"
TEXT_LABEL strWaypointVehTCGoon6 = "BigScoreA75"
TEXT_LABEL strWaypointVehVansToBank = "BigScoreA20"
TEXT_LABEL strWaypointLoadGold1A = "BigScoreA31"
TEXT_LABEL strWaypointLoadGold1B = "BigScoreA32"
TEXT_LABEL strWaypointLoadGold1C = "BigScoreA33"
TEXT_LABEL strWaypointLoadGold2A = "BigScoreA34"
TEXT_LABEL strWaypointLoadGold2B = "BigScoreA35"
TEXT_LABEL strWaypointLoadGold2C = "BigScoreA36"
TEXT_LABEL strWaypointHobo = "BigScoreA80"
TEXT_LABEL strFailLabel = ""
TEXT_LABEL_31 strAnimIG1 = "missbigscore2aig_1"
TEXT_LABEL_31 strAnimIG2 = "missbigscore2aig_2"
TEXT_LABEL_31 strAnimIG3 = "missbigscore2aig_3"
TEXT_LABEL_31 strAnimIG6 = "missbigscore2aig_6"
TEXT_LABEL_31 strAnimIG5 = "missbigscore2aig_5"
TEXT_LABEL_31 strAnimIG7Driver = "missbigscore2aig_7@driver"
TEXT_LABEL_31 strAnimIG7Gunman = "missbigscore2aig_7@gunman"
TEXT_LABEL_31 strRappelAnims = "misslamar1swat_rappel"
TEXT_LABEL_31 strVaultWorkerAnims = "missbigscore2aig_4"
BLIP_INDEX blipCurrentObjective
BLIP_INDEX blipChaseChopper
CAMERA_INDEX camMain
CAMERA_INDEX camInterp
CAMERA_INDEX camAttach
CAMERA_INDEX camChase
INTERIOR_INSTANCE_INDEX interiorTunnel
INTERIOR_INSTANCE_INDEX interiorTunnel2
INTERIOR_INSTANCE_INDEX interiorTunnel3
INTERIOR_INSTANCE_INDEX interiorBank
INTERIOR_INSTANCE_INDEX interiorBankCarPark
INTERIOR_INSTANCE_INDEX interiorMichaelsHouse
INTERIOR_INSTANCE_INDEX interiorBackgroundCarPark
INTERIOR_INSTANCE_INDEX interiorChaseTunnel[4]
OBJECT_INDEX objStinger
OBJECT_INDEX objGoldTrolleys[2]
OBJECT_INDEX objEmptyTrolleys[2]
OBJECT_INDEX objSecurityBarriers[2]
OBJECT_INDEX objSecurityGateCollision[2]
OBJECT_INDEX objMachineGun
OBJECT_INDEX objIDCard
OBJECT_INDEX objGoldBarsDriver[5]
OBJECT_INDEX objGoldBarsGunman[5]
OBJECT_INDEX objFakeVaultDoor
OBJECT_INDEX objWalkieTalkie
OBJECT_INDEX objBankWorkerWalkieTalkie
//OBJECT_INDEX objShootoutPallet
OBJECT_INDEX objShootoutCover
OBJECT_INDEX objwalkingStick
OBJECT_INDEX objBeer
OBJECT_INDEX objLaptops[2]
OBJECT_INDEX objMichaelsWeapon
OBJECT_INDEX objTrevorsWeapon
OBJECT_INDEX objGunmansWeapon
OBJECT_INDEX objDriversWeapon
OBJECT_INDEX objMichaelsHouseDoors[2]
OBJECT_INDEX objMichaelsHouseMapDoors[2]
PED_INDEX pedGateSecurity
PED_INDEX pedChaseCops[4]
PED_INDEX pedChaseBlockade2[4]
PED_INDEX pedChaseBlockadeMall[2]
PED_INDEX pedEndCops[2]
PED_INDEX pedHeliGunner
PED_INDEX pedLester
PED_INDEX pedHobos[2]
PTFX_ID ptfxRampSparks[4]
SCALEFORM_INDEX sfTrafficHud
SCENARIO_BLOCKING_INDEX sbiStripClub
SCENARIO_BLOCKING_INDEX sbiTrafficControl
SCENARIO_BLOCKING_INDEX sbiSecurityVans[2]
SCENARIO_BLOCKING_INDEX sbiUnderpass
SCENARIO_BLOCKING_INDEX sbiChase[2]
SCENARIO_BLOCKING_INDEX sbiDropOffPoint
STREAMVOL_ID svChaseStart
VEHICLE_INDEX vehCopsStart[2]
VEHICLE_INDEX vehCopsWave2
VEHICLE_INDEX vehNooseWave1
VEHICLE_INDEX vehGoons3a
VEHICLE_INDEX vehGoons3b
VEHICLE_INDEX vehChaseTrigger
VEHICLE_INDEX vehTrailer[2]
VEHICLE_INDEX vehFranklinsBike
VEHICLE_INDEX vehMichaelsCar
VEHICLE_INDEX vehBuddyVan
VEHICLE_INDEX vehNooseChopper1
VEHICLE_INDEX vehEndTrucks[2]
VEHICLE_INDEX vehEndTrailers[2]
VEHICLE_INDEX vehEndHeli
VEHICLE_INDEX vehRampHackTruck
VEHICLE_INDEX vehRampHackCars[4]
VEHICLE_INDEX vehPreMissionCar
VEHICLE_INDEX vehVanCrash
VEHICLE_INDEX vehTrain
VEHICLE_INDEX vehTanker
VEHICLE_INDEX vehCamCar
VEHICLE_INDEX vehChaseCopsBlockade[2]
VEHICLE_INDEX vehChaseCops[2]
MODEL_NAMES modelStartCar = DUBSTA
MODEL_NAMES modelGoldVan = STOCKADE
MODEL_NAMES modelGoldVanPeds = S_M_M_Armoured_01
MODEL_NAMES modelCasey = IG_CASEY
MODEL_NAMES modelBankWorker = IG_BANKMAN //U_M_M_BankMan
MODEL_NAMES modelVaultWorker = A_M_Y_BUSINESS_01
MODEL_NAMES modelChaseCars = GAUNTLET //DOMINATOR
MODEL_NAMES modelStinger = P_LD_STINGER_S
MODEL_NAMES modelGoldTrolley = PROP_LARGE_GOLD //PROP_GOLD_TROLLY_FULL
MODEL_NAMES modelGoldBar = PROP_GOLD_BAR
MODEL_NAMES modelCopCar = POLICE3
MODEL_NAMES modelCop = S_M_Y_COP_01
MODEL_NAMES modelMerryweather = S_M_Y_BLACKOPS_01
MODEL_NAMES modelMerryCar = MESA3
MODEL_NAMES modelSecurityGate = P_Sec_Gate_01_S
MODEL_NAMES modeGateCollision = P_SEC_GATE_01_S_COL
MODEL_NAMES modelBuddyVan = BURRITO3
//MODEL_NAMES modelChopper = POLMAV
MODEL_NAMES modelBarrier = PROP_BARRIER_WORK05
MODEL_NAMES modelEndTruck = PACKER
MODEL_NAMES modelEndTrailers = TRAILERS3
MODEL_NAMES modelEndHeli = POLMAV//FROGGER
MODEL_NAMES modelVaultDoor = V_ILEV_FIN_VAULTDOOR
MODEL_NAMES modelFakeVaultDoor = p_fin_vaultdoor_s
MODEL_NAMES modelVaultGates = V_ILEV_FINGATE
MODEL_NAMES modelLiftDoor = V_ILEV_FINELEVDOOR01
MODEL_NAMES modelDefaultTCPed = A_M_M_Business_01
MODEL_NAMES modelDefaultTCCar = SCHWARZER
MODEL_NAMES modelDefaultTCCar2 = SERRANO
MODEL_NAMES modelIDCard = P_LD_ID_CARD_01
MODEL_NAMES modelTrain = METROTRAIN
MODEL_NAMES modelWalkieTalkie = Prop_CS_Walkie_Talkie
MODEL_NAMES modelShootoutFence = prop_fnclink_04d
MODEL_NAMES modelWalkingStick = PROP_CS_WALKING_STICK
MODEL_NAMES modelBeer = PROP_CS_BEER_BOT_01
MODEL_NAMES modelEmptyTrolley = PROP_LARGE_GOLD_EMPTY
MODEL_NAMES modelHobo = A_M_O_TRAMP_01
MODEL_NAMES modelContainerAlt1 = PROP_LARGE_GOLD_ALT_A
MODEL_NAMES modelContainerAlt2 = PROP_LARGE_GOLD_ALT_B
MODEL_NAMES modelContainerAlt3 = PROP_LARGE_GOLD_ALT_C
MODEL_NAMES modelLaptop = P_laptop_02_S
MODEL_NAMES modelMichaelsDoorLeft = V_ILEV_MM_DOORM_L
MODEL_NAMES modelMichaelsDoorRight = V_ILEV_MM_DOORM_R
//MODEL_NAMES modelShootoutCover = prop_Sk
MISSION_STAGE eMissionStage = STAGE_START_CUTSCENE
SECTION_STAGE eSectionStage = SECTION_STAGE_SETUP
SHOOTOUT_STATE eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_1
SELECTOR_SLOTS_ENUM eCurrentPlayer = SELECTOR_PED_MICHAEL
SELECTOR_PED_STRUCT sSelectorPeds
LOCATES_HEADER_DATA sLocatesData
TRAFFIC_GAME_DATA sTrafficGame
TRAFFIC_GAME_JUNCTION sTrafficJunction[11]
BUDDY_DATA sCrew[5]
BUDDY_DATA sTrevor
BUDDY_DATA sMichael
BUDDY_DATA sFranklin
BUDDY_DATA sBankWorker
ENEMY_DATA sCopsStart[8]
ENEMY_DATA sCopsWave2[4]
ENEMY_DATA sVanFlank[4]
ENEMY_DATA sVanCrash[4]
ENEMY_DATA sNooseRope1[2]
ENEMY_DATA sNooseAbove[2]
ENEMY_DATA sGoonsWave3b[4]
ENEMY_DATA sGoonsSnipe[2]
ENEMY_DATA sInfiniteEnemiesFront[2]
ENEMY_DATA sInfiniteEnemiesFlank[2]
ENEMY_DATA sChaseCopsBlockade[4]
ENEMY_DATA sChaseCops[4]
MISSION_PED sGoldVanPeds[4]
MISSION_PED sVaultWorker
MISSION_VEHICLE sGoldVans[2]
MISSION_VEHICLE sGoldCars[4]
MISSION_VEHICLE sGoldTruck
MISSION_VEHICLE sStartCar
PUSH_IN_DATA sPushInData
TRAFFIC_GAME_CAR sTrafficGameCops[NUM_TC_COP_CARS]
TRAFFIC_GAME_CAR sTrafficGameCars[12]
ACTION_CAM_ANGLE sActionCams[5]
REL_GROUP_HASH relGroupCops
REL_GROUP_HASH relGroupNeutral
structPedsForConversation sConversationPeds
SELECTOR_CAM_STRUCT sSelectorCam
CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
structTimelapse sTimelapse
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//- TRAFFIC CONTROL SWITCH: Merged from shelved CL 4495173
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TEXT_LABEL_31 strAudioBankBigScoreLaptop = "BIG_SCORE_LAPTOP"
ENUM BIG_HEIST_SWITCH_CAM_STATE
SWITCH_CAM_IDLE,
SWITCH_CAM_START_CODED_SWITCH,
SWITCH_CAM_PLAYING_CODED_SWITCH,
SWITCH_CAM_START_SPLINE1,
SWITCH_CAM_PLAYING_SPLINE1,
SWITCH_CAM_RETURN_TO_GAMEPLAY
ENDENUM
BIG_HEIST_SWITCH_CAM_STATE eSwitchCamState = SWITCH_CAM_IDLE
SWITCH_CAM_STRUCT scsSwitchCam
//STRING strSRLName = "trafficControl"
FLOAT fSRLTime = 0.0
FLOAT fFranklinDialogue1Phase = 0.235
FLOAT fWooshStartPhase = 0.21
FLOAT fWooshStopPhase = 0.283
INT iWooshSoundId = -1
BOOL bFranklinDialogue1Started = FALSE
BOOL bSwitchedToFranklin = FALSE
BOOL bPlayedMichaelSwitchFX = FALSE
BOOL bPlayedFranklinSwitchFX = FALSE
BOOL bRenderingHDOnly = FALSE
BOOL bSyncSceneUnpaused = FALSE
BOOL bWooshStarted = FALSE
BOOL bWooshStopped = FALSE
// PC CONTROL FOR STINGER
BOOL bPCCOntrolsSetup = FALSE
PROC SETUP_PC_CONTROLS()
IF IS_PC_VERSION()
IF bPCCOntrolsSetup = FALSE
INIT_PC_SCRIPTED_CONTROLS("FINALE HEIST STINGER")
bPCCOntrolsSetup = TRUE
ENDIF
ENDIF
ENDPROC
PROC CLEANUP_PC_CONTROLS()
IF IS_PC_VERSION()
IF bPCCOntrolsSetup = TRUE
SHUTDOWN_PC_SCRIPTED_CONTROLS()
bPCCOntrolsSetup = FALSE
ENDIF
ENDIF
ENDPROC
PROC START_SYNC_SCENE()
iTrafficSyncedScene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
IF NOT IS_ENTITY_DEAD(sGoldCars[PLAYERS_GOLD_CAR].veh)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iTrafficSyncedScene, sGoldCars[PLAYERS_GOLD_CAR].veh, 0)
IF NOT IS_ENTITY_DEAD(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
FREEZE_ENTITY_POSITION(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
TASK_SYNCHRONIZED_SCENE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], iTrafficSyncedScene, strAnimsTrafficSwitch, "switch_mic_car_fra_laptop_fra", INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(pedLester)
FREEZE_ENTITY_POSITION(pedLester, FALSE)
TASK_SYNCHRONIZED_SCENE(pedLester, iTrafficSyncedScene, strAnimsTrafficSwitch, "switch_mic_car_fra_laptop_lester", INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedLester)
ENDIF
IF NOT IS_ENTITY_DEAD(sCrew[CREW_HACKER].ped)
FREEZE_ENTITY_POSITION(sCrew[CREW_HACKER].ped, FALSE)
TASK_SYNCHRONIZED_SCENE(sCrew[CREW_HACKER].ped, iTrafficSyncedScene, strAnimsTrafficSwitch, "switch_mic_car_fra_laptop_hacker", INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sCrew[CREW_HACKER].ped)
ENDIF
IF NOT IS_ENTITY_DEAD(objLaptops[0])
FREEZE_ENTITY_POSITION(objLaptops[0], FALSE)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objLaptops[0], iTrafficSyncedScene, "switch_mic_car_fra_laptop_laptop1", strAnimsTrafficSwitch, INSTANT_BLEND_IN, SLOW_BLEND_OUT)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objLaptops[0])
ENDIF
IF NOT IS_ENTITY_DEAD(objLaptops[1])
FREEZE_ENTITY_POSITION(objLaptops[1], FALSE)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objLaptops[1], iTrafficSyncedScene, "switch_mic_car_fra_laptop_laptop2", strAnimsTrafficSwitch, INSTANT_BLEND_IN, SLOW_BLEND_OUT)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objLaptops[1])
ENDIF
IF NOT IS_ENTITY_DEAD(objwalkingStick)
FREEZE_ENTITY_POSITION(objwalkingStick, FALSE)
DETACH_ENTITY(objwalkingStick, FALSE, TRUE)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objwalkingStick, iTrafficSyncedScene, "switch_mic_car_fra_laptop_stick", strAnimsTrafficSwitch, INSTANT_BLEND_IN, SLOW_BLEND_OUT)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objwalkingStick)
ENDIF
SET_SYNCHRONIZED_SCENE_LOOPED(iTrafficSyncedScene, FALSE)
SET_SYNCHRONIZED_SCENE_PHASE(iTrafficSyncedScene, 0.0)
SET_SYNCHRONIZED_SCENE_RATE(iTrafficSyncedScene, 0.0)
ENDIF
ENDPROC
PROC SETUP_SPLINE_CAM_NODE_ARRAY(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX pi1, PED_INDEX pi2)
IF NOT thisSwitchCam.bInitialized
//--- Start of Cam Data ---
thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[0].iNodeTime = 0
thisSwitchCam.nodes[0].vNodePos = <<0.8301, 1.4015, 0.6565>> //<<0.7365, 2.0598, 0.6598>>
thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[0].vNodeDir = <<-1.0001, -0.9636, 0.4179>> //<<-0.2140, 0.1069, 0.6680>>
thisSwitchCam.nodes[0].bPointAtEntity = TRUE
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[0].fNodeFOV = 40.0000
thisSwitchCam.nodes[0].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[0].iNodeToClone = 0
thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[0].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_MEDIUM
thisSwitchCam.nodes[0].fNodeCamShake = 0.2000
thisSwitchCam.nodes[0].iCamEaseType = 0
thisSwitchCam.nodes[0].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[0].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[0].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[0].bCamEaseForceLevel = TRUE
thisSwitchCam.nodes[0].fTimeScale = 1.0000
thisSwitchCam.nodes[0].iTimeScaleEaseType = 0
thisSwitchCam.nodes[0].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[0].bFlashEnabled = FALSE
thisSwitchCam.nodes[0].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[0].fMinExposure = 0.0000
thisSwitchCam.nodes[0].fMaxExposure = 0.0000
thisSwitchCam.nodes[0].iRampUpDuration = 0
thisSwitchCam.nodes[0].iRampDownDuration = 0
thisSwitchCam.nodes[0].iHoldDuration = 0
thisSwitchCam.nodes[0].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[0].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[0].bUseCustomDOF = FALSE
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[1].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[1].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[1].iNodeTime = 3500
thisSwitchCam.nodes[1].vNodePos = <<0.7813, 1.3384, 0.6502>> //<<0.6958, 1.9692, 0.6596>>
thisSwitchCam.nodes[1].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[1].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[1].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[1].vNodeDir = <<-1.0489, -1.0266, 0.4116>> //<<-0.2093, 0.1110, 0.6842>>
thisSwitchCam.nodes[1].bPointAtEntity = TRUE
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].fNodeFOV = 40.0000
thisSwitchCam.nodes[1].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[1].iNodeToClone = 0
thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[1].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_MEDIUM
thisSwitchCam.nodes[1].fNodeCamShake = 0.2000
thisSwitchCam.nodes[1].iCamEaseType = 2
thisSwitchCam.nodes[1].fCamEaseScaler = 1.0000
thisSwitchCam.nodes[1].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[1].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[1].bCamEaseForceLevel = TRUE
thisSwitchCam.nodes[1].fTimeScale = 1.0000
thisSwitchCam.nodes[1].iTimeScaleEaseType = 0
thisSwitchCam.nodes[1].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[1].bFlashEnabled = FALSE
thisSwitchCam.nodes[1].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[1].fMinExposure = 0.0000
thisSwitchCam.nodes[1].fMaxExposure = 0.0000
thisSwitchCam.nodes[1].iRampUpDuration = 0
thisSwitchCam.nodes[1].iRampDownDuration = 0
thisSwitchCam.nodes[1].iHoldDuration = 0
thisSwitchCam.nodes[1].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[1].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[1].bUseCustomDOF = FALSE
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[2].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[2].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[2].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[2].iNodeTime = 600
thisSwitchCam.nodes[2].vNodePos = <<0.7813, 1.3384, 2.0294>> //<<0.6420, 2.0132, 2.0049>>
thisSwitchCam.nodes[2].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[2].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[2].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[2].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[2].vNodeDir = <<-1.0489, -1.0266, 2.0294>> //<<-0.2630, 0.1549, 2.0294>>
thisSwitchCam.nodes[2].bPointAtEntity = TRUE
thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[2].fNodeFOV = 40.0000
thisSwitchCam.nodes[2].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[2].iNodeToClone = 0
thisSwitchCam.nodes[2].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[2].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[2].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[2].fNodeMotionBlur = 1.0000
thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_MEDIUM
thisSwitchCam.nodes[2].fNodeCamShake = 0.5000
thisSwitchCam.nodes[2].iCamEaseType = 0
thisSwitchCam.nodes[2].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[2].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[2].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[2].bCamEaseForceLevel = TRUE
thisSwitchCam.nodes[2].fTimeScale = 1.0000
thisSwitchCam.nodes[2].iTimeScaleEaseType = 0
thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[2].bFlashEnabled = FALSE
thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[2].fMinExposure = 0.0000
thisSwitchCam.nodes[2].fMaxExposure = 0.0000
thisSwitchCam.nodes[2].iRampUpDuration = 0
thisSwitchCam.nodes[2].iRampDownDuration = 0
thisSwitchCam.nodes[2].iHoldDuration = 0
thisSwitchCam.nodes[2].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[2].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[2].bUseCustomDOF = FALSE
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[3].bIsCamCutNode = TRUE
thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_WORLD_POS
thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[4].iNodeTime = 0
thisSwitchCam.nodes[4].vNodePos = <<125.1270, -1184.9181, 28.6665>>
thisSwitchCam.nodes[4].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[4].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[4].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[4].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[4].vNodeDir = <<-11.8747, 0.0000, -60.9711>>
thisSwitchCam.nodes[4].bPointAtEntity = FALSE
thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[4].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[4].fNodeFOV = 50.0000
thisSwitchCam.nodes[4].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[4].iNodeToClone = 0
thisSwitchCam.nodes[4].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[4].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[4].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[4].fNodeMotionBlur = 1.0000
thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_MEDIUM
thisSwitchCam.nodes[4].fNodeCamShake = 0.3000
thisSwitchCam.nodes[4].iCamEaseType = 1
thisSwitchCam.nodes[4].fCamEaseScaler = 1.0000
thisSwitchCam.nodes[4].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[4].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[4].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[4].fTimeScale = 1.0000
thisSwitchCam.nodes[4].iTimeScaleEaseType = 0
thisSwitchCam.nodes[4].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[4].bFlashEnabled = FALSE
thisSwitchCam.nodes[4].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[4].fMinExposure = 0.0000
thisSwitchCam.nodes[4].fMaxExposure = 0.0000
thisSwitchCam.nodes[4].iRampUpDuration = 0
thisSwitchCam.nodes[4].iRampDownDuration = 0
thisSwitchCam.nodes[4].iHoldDuration = 0
thisSwitchCam.nodes[4].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[4].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[4].bUseCustomDOF = FALSE
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_NearDOF = 1.0000
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_FarDOF = 5.0000
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_EffectStrength = 1.0000
thisSwitchCam.nodes[5].SwitchCamType = SWITCH_CAM_WORLD_POS
thisSwitchCam.nodes[5].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[5].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[5].iNodeTime = 600
thisSwitchCam.nodes[5].vNodePos = <<125.3823, -1184.7758, 30.0584>>
thisSwitchCam.nodes[5].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[5].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[5].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[5].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[5].vNodeDir = <<-11.8491, 0.0000, -60.9382>>
thisSwitchCam.nodes[5].bPointAtEntity = FALSE
thisSwitchCam.nodes[5].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[5].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[5].fNodeFOV = 50.0000
thisSwitchCam.nodes[5].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[5].iNodeToClone = 0
thisSwitchCam.nodes[5].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[5].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[5].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[5].fNodeMotionBlur = 1.0000
thisSwitchCam.nodes[5].NodeCamShakeType = CAM_SHAKE_MEDIUM
thisSwitchCam.nodes[5].fNodeCamShake = 0.3000
thisSwitchCam.nodes[5].iCamEaseType = 0
thisSwitchCam.nodes[5].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[5].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[5].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[5].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[5].fTimeScale = 1.0000
thisSwitchCam.nodes[5].iTimeScaleEaseType = 0
thisSwitchCam.nodes[5].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[5].bFlashEnabled = FALSE
thisSwitchCam.nodes[5].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[5].fMinExposure = 0.0000
thisSwitchCam.nodes[5].fMaxExposure = 0.0000
thisSwitchCam.nodes[5].iRampUpDuration = 0
thisSwitchCam.nodes[5].iRampDownDuration = 0
thisSwitchCam.nodes[5].iHoldDuration = 0
thisSwitchCam.nodes[5].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[5].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[5].bUseCustomDOF = TRUE
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_NearDOF = 1.0000
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_FarDOF = 5.0000
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_EffectStrength = 1.0000
thisSwitchCam.nodes[6].SwitchCamType = SWITCH_CAM_WORLD_POS
thisSwitchCam.nodes[6].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[6].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[6].iNodeTime = 3500
thisSwitchCam.nodes[6].vNodePos = <<125.5458, -1184.6844, 30.0072>>
thisSwitchCam.nodes[6].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[6].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[6].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[6].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[6].vNodeDir = <<-8.7028, 0.0000, -60.9332>>
thisSwitchCam.nodes[6].bPointAtEntity = FALSE
thisSwitchCam.nodes[6].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[6].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[6].fNodeFOV = 50.0000
thisSwitchCam.nodes[6].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[6].iNodeToClone = 0
thisSwitchCam.nodes[6].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[6].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[6].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[6].fNodeMotionBlur = 1.0000
thisSwitchCam.nodes[6].NodeCamShakeType = CAM_SHAKE_MEDIUM
thisSwitchCam.nodes[6].fNodeCamShake = 0.3000
thisSwitchCam.nodes[6].iCamEaseType = 0
thisSwitchCam.nodes[6].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[6].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[6].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[6].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[6].fTimeScale = 1.0000
thisSwitchCam.nodes[6].iTimeScaleEaseType = 0
thisSwitchCam.nodes[6].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[6].bFlashEnabled = FALSE
thisSwitchCam.nodes[6].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[6].fMinExposure = 0.0000
thisSwitchCam.nodes[6].fMaxExposure = 0.0000
thisSwitchCam.nodes[6].iRampUpDuration = 0
thisSwitchCam.nodes[6].iRampDownDuration = 0
thisSwitchCam.nodes[6].iHoldDuration = 0
thisSwitchCam.nodes[6].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[6].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[6].bUseCustomDOF = FALSE
thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[7].bIsCamCutNode = TRUE
thisSwitchCam.nodes[8].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[8].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[8].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[8].iNodeTime = 0
thisSwitchCam.nodes[8].vNodePos = <<-1.6749, 2.3071, 0.7210>>
thisSwitchCam.nodes[8].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[8].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[8].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[8].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[8].vNodeDir = <<-0.1197, -0.1124, 0.1506>>
thisSwitchCam.nodes[8].bPointAtEntity = TRUE
thisSwitchCam.nodes[8].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[8].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[8].fNodeFOV = 50.0000
thisSwitchCam.nodes[8].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[8].iNodeToClone = 0
thisSwitchCam.nodes[8].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[8].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[8].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[8].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[8].NodeCamShakeType = CAM_SHAKE_MEDIUM
thisSwitchCam.nodes[8].fNodeCamShake = 0.3000
thisSwitchCam.nodes[8].iCamEaseType = 0
thisSwitchCam.nodes[8].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[8].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[8].bCamEaseForceLinear = FALSE
thisSwitchCam.nodes[8].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[8].fTimeScale = 1.0000
thisSwitchCam.nodes[8].iTimeScaleEaseType = 0
thisSwitchCam.nodes[8].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[8].bFlashEnabled = FALSE
thisSwitchCam.nodes[8].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[8].fMinExposure = 0.0000
thisSwitchCam.nodes[8].fMaxExposure = 0.0000
thisSwitchCam.nodes[8].iRampUpDuration = 0
thisSwitchCam.nodes[8].iRampDownDuration = 0
thisSwitchCam.nodes[8].iHoldDuration = 0
thisSwitchCam.nodes[8].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[8].bIsLowDetailNode = TRUE
thisSwitchCam.nodes[8].bUseCustomDOF = FALSE
thisSwitchCam.nodes[8].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[8].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[8].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[9].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[9].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[9].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[9].iNodeTime = 5000
thisSwitchCam.nodes[9].vNodePos = <<-1.5402, 2.0971, 0.6716>>
thisSwitchCam.nodes[9].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[9].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[9].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[9].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[9].vNodeDir = <<-0.1199, -0.1126, 0.1506>>
thisSwitchCam.nodes[9].bPointAtEntity = TRUE
thisSwitchCam.nodes[9].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[9].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[9].fNodeFOV = 50.0000
thisSwitchCam.nodes[9].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[9].iNodeToClone = 0
thisSwitchCam.nodes[9].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[9].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[9].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[9].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[9].NodeCamShakeType = CAM_SHAKE_MEDIUM
thisSwitchCam.nodes[9].fNodeCamShake = 0.3000
thisSwitchCam.nodes[9].iCamEaseType = 0
thisSwitchCam.nodes[9].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[9].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[9].bCamEaseForceLinear = FALSE
thisSwitchCam.nodes[9].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[9].fTimeScale = 1.0000
thisSwitchCam.nodes[9].iTimeScaleEaseType = 0
thisSwitchCam.nodes[9].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[9].bFlashEnabled = FALSE
thisSwitchCam.nodes[9].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[9].fMinExposure = 0.0000
thisSwitchCam.nodes[9].fMaxExposure = 0.0000
thisSwitchCam.nodes[9].iRampUpDuration = 0
thisSwitchCam.nodes[9].iRampDownDuration = 0
thisSwitchCam.nodes[9].iHoldDuration = 0
thisSwitchCam.nodes[9].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[9].bIsLowDetailNode = TRUE
thisSwitchCam.nodes[9].bUseCustomDOF = FALSE
thisSwitchCam.nodes[9].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[9].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[9].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[10].bIsCamCutNode = TRUE
thisSwitchCam.nodes[11].SwitchCamType = SWITCH_CAM_WORLD_POS
thisSwitchCam.nodes[11].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[11].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[11].iNodeTime = 0
thisSwitchCam.nodes[11].vNodePos = <<125.9506, -1184.6221, 29.7275>>
thisSwitchCam.nodes[11].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[11].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[11].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[11].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[11].vNodeDir = <<0.2183, 0.0000, -52.6074>>
thisSwitchCam.nodes[11].bPointAtEntity = FALSE
thisSwitchCam.nodes[11].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[11].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[11].fNodeFOV = 50.0000
thisSwitchCam.nodes[11].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[11].iNodeToClone = 0
thisSwitchCam.nodes[11].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[11].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[11].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[11].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[11].NodeCamShakeType = CAM_SHAKE_MEDIUM
thisSwitchCam.nodes[11].fNodeCamShake = 0.3000
thisSwitchCam.nodes[11].iCamEaseType = 0
thisSwitchCam.nodes[11].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[11].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[11].bCamEaseForceLinear = FALSE
thisSwitchCam.nodes[11].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[11].fTimeScale = 1.0000
thisSwitchCam.nodes[11].iTimeScaleEaseType = 0
thisSwitchCam.nodes[11].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[11].bFlashEnabled = FALSE
thisSwitchCam.nodes[11].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[11].fMinExposure = 0.0000
thisSwitchCam.nodes[11].fMaxExposure = 0.0000
thisSwitchCam.nodes[11].iRampUpDuration = 0
thisSwitchCam.nodes[11].iRampDownDuration = 0
thisSwitchCam.nodes[11].iHoldDuration = 0
thisSwitchCam.nodes[11].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[11].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[11].bUseCustomDOF = FALSE
thisSwitchCam.nodes[11].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[11].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[11].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[12].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[12].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[12].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[12].iNodeTime = 3400
thisSwitchCam.nodes[12].vNodePos = <<0.6801, 1.1884, 0.3570>>
thisSwitchCam.nodes[12].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[12].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[12].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[12].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[12].vNodeDir = <<-0.3077, 0.3765, 0.3619>>
thisSwitchCam.nodes[12].bPointAtEntity = TRUE
thisSwitchCam.nodes[12].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[12].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[12].fNodeFOV = 50.0000
thisSwitchCam.nodes[12].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[12].iNodeToClone = 0
thisSwitchCam.nodes[12].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[12].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[12].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[12].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[12].NodeCamShakeType = CAM_SHAKE_MEDIUM
thisSwitchCam.nodes[12].fNodeCamShake = 0.3000
thisSwitchCam.nodes[12].iCamEaseType = 0
thisSwitchCam.nodes[12].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[12].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[12].bCamEaseForceLinear = FALSE
thisSwitchCam.nodes[12].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[12].fTimeScale = 1.0000
thisSwitchCam.nodes[12].iTimeScaleEaseType = 0
thisSwitchCam.nodes[12].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[12].bFlashEnabled = FALSE
thisSwitchCam.nodes[12].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[12].fMinExposure = 0.0000
thisSwitchCam.nodes[12].fMaxExposure = 0.0000
thisSwitchCam.nodes[12].iRampUpDuration = 0
thisSwitchCam.nodes[12].iRampDownDuration = 0
thisSwitchCam.nodes[12].iHoldDuration = 0
thisSwitchCam.nodes[12].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[12].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[12].bUseCustomDOF = FALSE
thisSwitchCam.nodes[12].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[12].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[12].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.iNumNodes = 13
thisSwitchCam.iCamSwitchFocusNode = 3
thisSwitchCam.bSplineNoSmoothing = TRUE
thisSwitchCam.bAddGameplayCamAsLastNode = FALSE
thisSwitchCam.iGameplayNodeBlendDuration = 0
//--- End of Cam Data ---
thisSwitchCam.strOutputStructName = "thisSwitchCam"
thisSwitchCam.strOutputFileName = "CameraInfo_finaleHeist2A_MichaelToFranklin.txt"
thisSwitchCam.strXMLFileName = "CameraInfo_finaleHeist2A_MichaelToFranklin.xml"
thisSwitchCam.bInitialized = TRUE
ENDIF
thisSwitchCam.piPeds[0] = pi1
thisSwitchCam.piPeds[1] = pi2
ENDPROC
PROC REQUEST_CUSTOM_SWITCH_ASSETS()
REQUEST_ANIM_DICT(strAnimsTrafficSwitch)
REQUEST_ANIM_DICT(strAnimsCamShake)
REQUEST_SCRIPT_AUDIO_BANK(strAudioBankBigScoreLaptop)
//PREFETCH_SRL(strSRLName)
ENDPROC
FUNC BOOL HAVE_CUSTOM_SWITCH_ASSETS_LOADED()
#IF IS_DEBUG_BUILD
IF NOT HAS_ANIM_DICT_LOADED(strAnimsTrafficSwitch)
PRINTLN("Waiting on traffic switch anims")
ENDIF
IF NOT HAS_ANIM_DICT_LOADED(strAnimsCamShake)
PRINTLN("Waiting on cam shake anims")
ENDIF
IF NOT IS_SRL_LOADED()
PRINTLN("Waiting on SRL")
ENDIF
#ENDIF
IF REQUEST_SCRIPT_AUDIO_BANK(strAudioBankBigScoreLaptop)
AND HAS_ANIM_DICT_LOADED(strAnimsTrafficSwitch)
AND HAS_ANIM_DICT_LOADED(strAnimsCamShake)
//AND IS_SRL_LOADED()
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC VECTOR CONVERT_ROTATION_TO_DIRECTION_VECTOR(VECTOR vRot)
RETURN <<-SIN(vRot.z) * COS(vRot.x), COS(vRot.z) * COS(vRot.x), SIN(vRot.x)>>
ENDFUNC
FUNC BOOL HANDLE_SWITCH_CAM(SWITCH_CAM_STRUCT &thisSwitchCam)
INT i = 0
INT iCurrentNode
FLOAT fCamPhase
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SWITCH eSwitchCamState
CASE SWITCH_CAM_IDLE
//CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE")
BREAK
CASE SWITCH_CAM_START_SPLINE1
START_SYNC_SCENE()
DESTROY_ALL_CAMS()
SETUP_SPLINE_CAM_NODE_ARRAY(thisSwitchCam, PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
CREATE_SPLINE_CAM(thisSwitchCam)
SET_CAM_ACTIVE(thisSwitchCam.ciSpline, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_VEHICLE_POPULATION_BUDGET(0)
SET_PED_POPULATION_BUDGET(0)
CLEAR_AREA_OF_PEDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), 300.0)
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 300.0, TRUE)
SET_GAME_PAUSES_FOR_STREAMING(FALSE)
//SET_RENDER_HD_ONLY(TRUE)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", TRUE)
SET_TIME_SCALE(1.0)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, PLAYER_PED_ID(), "MICHAEL")
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, NULL, "FRANKLIN")
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, pedLester, "LESTER")
//PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SWITCH", "FH3A_SWITCH_1", CONV_PRIORITY_MEDIUM)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), "FH3A_JAAA", "MICHAEL", SPEECH_PARAMS_FORCE_FRONTEND)
//PLAY_AMBIENT_SPEECH_FROM_POSITION("FH3A_JAAA", "MICHAEL", GET_ENTITY_COORDS(PLAYER_PED_ID()), SPEECH_PARAMS_FORCE_FRONTEND)
bHasTextLabelTriggered[FH3A_SWITCH_PRELOAD] = FALSE //Force a second preload of the switch convo in case it cancelled.
//SET_SRL_READAHEAD_TIMES(5, 5, 5, 5)
//BEGIN_SRL()
fSRLTime = -(GET_FRAME_TIME())
bSyncSceneUnpaused = FALSE
bFranklinDialogue1Started = FALSE
bSwitchedToFranklin = FALSE
bPlayedMichaelSwitchFX = FALSE
bPlayedFranklinSwitchFX = FALSE
bRenderingHDOnly = TRUE
bWooshStarted = FALSE
bWooshStopped = FALSE
eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1
FALLTHRU
CASE SWITCH_CAM_PLAYING_SPLINE1
//CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1")
OVERRIDE_LODSCALE_THIS_FRAME(1.0)
fSRLTime += GET_FRAME_TIME()
IF fSRLTime < 0.0
fSRLTime = 0.0
ENDIF
//SET_SRL_TIME(fSRLTime)
IF NOT bHasTextLabelTriggered[FH3A_SWITCH_1]
IF IS_AMBIENT_SPEECH_PLAYING(PLAYER_PED_ID())
IF IS_SUBTITLE_PREFERENCE_SWITCHED_ON()
PRINT_NOW("FH3A_SWITCH_1", 3500, 0) //The ambient line won't have subtitles so print it directly.
ENDIF
bHasTextLabelTriggered[FH3A_SWITCH_1] = TRUE
ENDIF
ENDIF
//Preload the second half of the conversation while the ambient line is playing.
IF NOT bHasTextLabelTriggered[FH3A_SWITCH_PRELOAD]
IF PRELOAD_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SWITCH", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_SWITCH_PRELOAD] = TRUE
ENDIF
ENDIF
IF IS_CAM_ACTIVE(thisSwitchCam.ciSpline)
iCurrentNode = UPDATE_SPLINE_CAM(thisSwitchCam)
fCamPhase = GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline)
#IF IS_DEBUG_BUILD
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] HANDLE_SWITCH_CAM: fCamPhase = ", fCamPhase, " iCurrentNode = ", iCurrentNode, "TIMERB = ", TIMERB())
#ENDIF
IF NOT bPlayedMichaelSwitchFX
IF fCamPhase > 0.21
ANIMPOSTFX_PLAY("SwitchShortMichaelIn", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bPlayedMichaelSwitchFX = TRUE
ENDIF
ENDIF
IF NOT bPlayedFranklinSwitchFX
IF fCamPhase > 0.238
ANIMPOSTFX_PLAY("SwitchShortFranklinMid", 0, FALSE)
//PLAY_SOUND_FRONTEND(-1, "Hit_1", "LONG_PLAYER_SWITCH_SOUNDS")
bPlayedFranklinSwitchFX = TRUE
ENDIF
ENDIF
IF NOT bRenderingHDOnly
IF fCamPhase > 0.247
SET_RENDER_HD_ONLY(TRUE)
bRenderingHDOnly = TRUE
ENDIF
ENDIF
IF NOT bWooshStarted
IF fCamPhase > 0.221
PLAY_SOUND_FRONTEND(-1, "Short_Transition_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bWooshStarted = TRUE
ENDIF
ENDIF
//Old version, remove once changes verified.
IF NOT bWooshStarted
IF fCamPhase > fWooshStartPhase
//PLAY_SOUND_FRONTEND(iWooshSoundID, "In", "SHORT_PLAYER_SWITCH_SOUND_SET")
//bWooshStarted = TRUE
ENDIF
ENDIF
IF NOT bWooshStopped
IF fCamPhase > fWooshStopPhase
//STOP_SOUND(iWooshSoundID)
bWooshStopped = TRUE
ENDIF
ENDIF
IF NOT bSwitchedToFranklin
IF iCurrentNode >= thisSwitchCam.iCamSwitchFocusNode
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
CDEBUG3LN(DEBUG_MISSION, "Switching to Franklin...")
CLEAR_FOCUS()
CLEAR_PRINTS()
sSelectorPeds.pedID[SELECTOR_PED_MICHAEL] = PLAYER_PED_ID()
SET_SELECTOR_PED_FAKE_STATE(sSelectorPeds, SELECTOR_PED_FRANKLIN, SELECTOR_STATE_AVAILABLE)
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), FALSE)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iTrafficSyncedScene, strAnimsTrafficSwitch, "switch_mic_car_fra_laptop_fra", INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_BLOCK_MOVER_UPDATE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), TRUE)
ENDIF
ENDIF
REPEAT COUNT_OF(sGoldCars) i
IF i != PLAYERS_GOLD_CAR
IF NOT IS_ENTITY_DEAD(sGoldCars[i].veh)
SET_VEHICLE_DOOR_SHUT(sGoldCars[i].veh, SC_DOOR_BOOT, TRUE)
ENDIF
ENDIF
ENDREPEAT
bSwitchedToFranklin = TRUE
ENDIF
ENDIF
ENDIF
IF IS_NEW_LOAD_SCENE_ACTIVE()
IF fCamPhase > 0.65
NEW_LOAD_SCENE_STOP()
ENDIF
ENDIF
IF NOT bSyncSceneUnpaused
IF iCurrentNode >= thisSwitchCam.iCamSwitchFocusNode
CDEBUG3LN(DEBUG_MISSION, "Unpausing Sync Scene...")
SET_SYNCHRONIZED_SCENE_RATE(iTrafficSyncedScene, 1.0)
bSyncSceneUnpaused = TRUE
ENDIF
ENDIF
//Play Franklin's conversation with Lester: Cancel preloaded conversation, update speakers so the facial works, then start the conversation from the second line.
IF NOT bFranklinDialogue1Started
AND bSwitchedToFranklin
IF fCamPhase >= fFranklinDialogue1Phase
//AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, NULL, "MICHAEL")
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, PLAYER_PED_ID(), "FRANKLIN")
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, pedLester, "LESTER")
//NOTE: we can't begin the preloaded conversation as we're starting from the second line, in this case kill the preload and start the conversation
//(this should still load the conversation).
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(sConversationPeds, "FH3AAUD", "FH3A_SWITCH", "FH3A_SWITCH_2", CONV_PRIORITY_HIGH)
bFranklinDialogue1Started = TRUE
ELSE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
IF fCamPhase >= 1.0
SET_TIME_SCALE(1.0)
IF DOES_CAM_EXIST(thisSwitchCam.ciSpline)
DESTROY_CAM(thisSwitchCam.ciSpline)
DESTROY_ALL_CAMS()
ENDIF
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_RENDER_HD_ONLY(FALSE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
STOP_SOUND(iWooshSoundID)
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", FALSE)
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), FALSE)
ENDIF
ENDIF
//END_SRL()
RETURN TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//- END OF TRAFFIC CONTROL SWITCH
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID widgetDebug
CONST_INT MAX_SKIP_MENU_LENGTH 28
INT iDebugJumpStage = 0
INT iDebugTrafficLightColour = 0
INT iDebugForceComponent = 0
INT iDebugForceType = 0
INT iDebugCurrentCam = 0
INT iDebugTrevorShootoutState = 0
INT iDebugMichaelShootoutState = 0
INT iDebugFranklinShootoutState = 0
INT iDebugRGB[3]
MissionStageMenuTextStruct sSkipMenu[MAX_SKIP_MENU_LENGTH]
BOOL bDebugRecordTraffic
BOOL bDebugRecordSetpieces
BOOL bDebugShowChaseStats
BOOL bDebugRecordVanCrash
BOOL bDebugPlaceholderMode = FALSE
BOOl bDebugAutoPlayTriggerCar = FALSE
BOOL bDebugRecordRampDrive = FALSE
BOOL bDebugPlayRampDrive = FALSE
BOOL bDebugRecordTruckTrailer = FALSE
BOOL bDebugShowDebug = FALSE
BOOL bDebugTrafficLightTest = FALSE
BOOL bDebugDrawGateCollision = FALSE
BOOL bDebugForceActivate = FALSE
BOOL bDebugForceLocalForce = FALSE
BOOL bDebugForceLocalOffset = FALSE
BOOL bDebugForceScaleByMass = FALSE
BOOL bDebugDrawTrafficCars = FALSE
BOOL bDebugRecordChaseCamera = FALSE
BOOL bDebugPlayChaseCamera = FALSE
BOOL bDebugPlayFinalEdit = FALSE
BOOl bDebugReattachTrolleys = FALSE
VECTOR vDebugMousePos = <<0.0, 0.0, 0.0>>
VECTOR vDebugForceDir = <<0.0, 0.0, 0.0>>
VECTOR vDebugForceOffset = <<0.0, 0.0, 0.0>>
BOOL bDebugStartJunctionPlacement = FALSE
BOOL bDebugOutputData = FALSE
FLOAT fDebugTcCrossingHeading[4]
FLOAT fDebugTcCrossingWidth[4]
FLOAT fDebugCamFirstPersonHeading = 90.0
VECTOR vDebugTcCrossingPos[4]
VECTOR vDebugTcJunctionPos
VEHICLE_INDEX vehDebug
VEHICLE_INDEX vehDebugCamCar
CAM_RECORDING_DATA sCamData
PROC CREATE_WIDGETS()
INT i = 0
TEXT_LABEL str
widgetDebug = START_WIDGET_GROUP("Finale Heist A")
ADD_WIDGET_INT_READ_ONLY("Truck pass timer", iChaseEndTimer)
ADD_WIDGET_FLOAT_SLIDER("Cam first-person heading", fDebugCamFirstPersonHeading, 0.0, 360.0, 1.0)
ADD_WIDGET_BOOL("Show debug", bDebugShowDebug)
ADD_WIDGET_BOOL("Do new version of shootout", bDoNewVersionOfShootout)
ADD_WIDGET_BOOL("Record trigger and traffic", bDebugRecordTraffic)
ADD_WIDGET_BOOL("Just record traffic", bDebugAutoPlayTriggerCar)
ADD_WIDGET_BOOL("Record set-pieces", bDebugRecordSetpieces)
ADD_WIDGET_BOOL("Show chase stats", bDebugShowChaseStats)
ADD_WIDGET_BOOL("Record van crash", bDebugRecordVanCrash)
ADD_WIDGET_BOOL("Placeholder mode", bDebugPlaceholderMode)
ADD_WIDGET_BOOL("Record ramp drive", bDebugRecordRampDrive)
ADD_WIDGET_BOOL("Test playback ramp drive", bDebugPlayRampDrive)
ADD_WIDGET_BOOL("Record truck and trailer", bDebugRecordTruckTrailer)
ADD_WIDGET_BOOL("Draw gate collision", bDebugDrawGateCollision)
ADD_WIDGET_BOOL("Draw traffic cars", bDebugDrawTrafficCars)
ADD_WIDGET_BOOL("Picked good chase driver", bPickedGoodCarDriver)
ADD_WIDGET_BOOL("Picked good truck driver", bPickedGoodTruckDriver)
ADD_WIDGET_BOOL("Picked good main gunman", bPickedGoodGunman)
ADD_WIDGET_BOOL("Picked good secondary gunman", bPickedGoodSecondGunman)
START_WIDGET_GROUP("Mission variables")
ADD_WIDGET_INT_READ_ONLY("iDebugTrevorShootoutState", iDebugTrevorShootoutState)
ADD_WIDGET_INT_READ_ONLY("iDebugFranklinShootoutState", iDebugFranklinShootoutState)
ADD_WIDGET_INT_READ_ONLY("iDebugMichaelShootoutState", iDebugMichaelShootoutState)
ADD_WIDGET_INT_READ_ONLY("iTimeLastFrontEnemyDamaged", iTimeLastFrontEnemyDamaged)
ADD_WIDGET_INT_READ_ONLY("iTimeLastFlankingEnemyDamaged", iTimeLastFlankingEnemyDamaged)
ADD_WIDGET_BOOL("bPlayerIsDrivingUpRamp", bPlayerIsDrivingUpRamp)
ADD_WIDGET_VECTOR_SLIDER("sMichael.vDest", sMichael.vDest, -10000.0, 10000.0, 0.01)
ADD_WIDGET_VECTOR_SLIDER("sTrevor.vDest", sTrevor.vDest, -10000.0, 10000.0, 0.01)
ADD_WIDGET_VECTOR_SLIDER("sFranklin.vDest", sFranklin.vDest, -10000.0, 10000.0, 0.01)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Take variables")
ADD_WIDGET_INT_READ_ONLY("iMaxTakeConsideringCrew", iMaxTakeConsideringCrew)
ADD_WIDGET_INT_READ_ONLY("iCurrentTake", iCurrentTake)
ADD_WIDGET_INT_READ_ONLY("iDisplayedTake", iDisplayedTake)
ADD_WIDGET_INT_READ_ONLY("iTakePenaltyCaseysCut", iTakePenaltyCaseysCut)
ADD_WIDGET_INT_READ_ONLY("iTakePenaltyCrewDies", iTakePenaltyCrewDies)
ADD_WIDGET_INT_READ_ONLY("iTakePenaltyDropGold", iTakePenaltyDropGold)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Traffic Control Debug")
ADD_WIDGET_INT_SLIDER("Hacker level", iHackerLevel, 0, 2, 1)
REPEAT COUNT_OF(sTrafficJunction) i
str = "frozen["
str += i
str += "]"
ADD_WIDGET_BOOL(str, sTrafficJunction[i].bLightsFrozen)
str = "timer["
str += i
str += "]"
ADD_WIDGET_INT_READ_ONLY(str, sTrafficJunction[i].iChangeTimer)
ENDREPEAT
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Chase variable debug")
ADD_WIDGET_BOOL("TrailerFrozen[0]", bChaseTrailerFrozen[0])
ADD_WIDGET_BOOL("TrailerFrozen[1]", bChaseTrailerFrozen[1])
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Camera recording")
ADD_WIDGET_BOOL("Record chase camera", bDebugRecordChaseCamera)
ADD_WIDGET_BOOL("Playback chase cameras", bDebugPlayChaseCamera)
ADD_WIDGET_BOOL("Use final edit for playback", bDebugPlayFinalEdit)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Trolley IK")
ADD_WIDGET_VECTOR_SLIDER("Left hand offset", vTrolleyLeftHandAttach, -3.0, 3.0, 0.01)
ADD_WIDGET_VECTOR_SLIDER("Right hand offset", vTrolleyRightHandAttach, -3.0, 3.0, 0.01)
ADD_WIDGET_VECTOR_SLIDER("Trolley offset", vTrolleyAttach, -3.0, 3.0, 0.01)
ADD_WIDGET_BOOL("Reattach trolleys", bDebugReattachTrolleys)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Traffic Junction Placement")
ADD_WIDGET_BOOL("Activate widget", bDebugStartJunctionPlacement)
ADD_WIDGET_BOOL("Output data", bDebugOutputData)
ADD_WIDGET_VECTOR_SLIDER("Junction centre", vDebugTcJunctionPos, -5000.0, 5000.0, 0.1)
START_WIDGET_GROUP("North crossing")
ADD_WIDGET_VECTOR_SLIDER("Centre pos", vDebugTcCrossingPos[TC_NORTH_JUNCTION], -5000.0, 5000.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("Heading", fDebugTcCrossingHeading[TC_NORTH_JUNCTION], -180.0, 180.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("Width", fDebugTcCrossingWidth[TC_NORTH_JUNCTION], 0.0, 50.0, 0.1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("East crossing")
ADD_WIDGET_VECTOR_SLIDER("Centre pos", vDebugTcCrossingPos[TC_EAST_JUNCTION], -5000.0, 5000.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("Heading", fDebugTcCrossingHeading[TC_EAST_JUNCTION], -180.0, 180.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("Width", fDebugTcCrossingWidth[TC_EAST_JUNCTION], 0.0, 50.0, 0.1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("South crossing")
ADD_WIDGET_VECTOR_SLIDER("Centre pos", vDebugTcCrossingPos[TC_SOUTH_JUNCTION], -5000.0, 5000.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("Heading", fDebugTcCrossingHeading[TC_SOUTH_JUNCTION], -180.0, 180.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("Width", fDebugTcCrossingWidth[TC_SOUTH_JUNCTION], 0.0, 50.0, 0.1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("West crossing")
ADD_WIDGET_VECTOR_SLIDER("Centre pos", vDebugTcCrossingPos[TC_WEST_JUNCTION], -5000.0, 5000.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("Heading", fDebugTcCrossingHeading[TC_WEST_JUNCTION], -180.0, 180.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("Width", fDebugTcCrossingWidth[TC_WEST_JUNCTION], 0.0, 50.0, 0.1)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Traffic Light Control")
ADD_WIDGET_BOOL("Activate widget", bDebugTrafficLightTest)
ADD_WIDGET_STRING("Click on the map to control the nearest traffic light.")
ADD_WIDGET_INT_SLIDER("Traffic light colour", iDebugTrafficLightColour, 0, 2, 1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Vehicle forces")
ADD_WIDGET_BOOL("Activate", bDebugForceActivate)
ADD_WIDGET_INT_SLIDER("Force type", iDebugForceType, 0, 5, 1)
ADD_WIDGET_VECTOR_SLIDER("Force direction", vDebugForceDir, -20.0, 20.0, 0.01)
ADD_WIDGET_VECTOR_SLIDER("Force offset", vDebugForceOffset, -20.0, 20.0, 0.01)
ADD_WIDGET_INT_SLIDER("Component", iDebugForceComponent, 0, 50, 1)
ADD_WIDGET_BOOL("Local force", bDebugForceLocalForce)
ADD_WIDGET_BOOL("Local offset", bDebugForceLocalOffset)
ADD_WIDGET_BOOL("Scale by mass", bDebugForceScaleByMass)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Traffic control colours")
ADD_WIDGET_INT_SLIDER("R", iDebugRGB[0], 0, 255, 1)
ADD_WIDGET_INT_SLIDER("G", iDebugRGB[1], 0, 255, 1)
ADD_WIDGET_INT_SLIDER("B", iDebugRGB[2], 0, 255, 1)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
SET_LOCATES_HEADER_WIDGET_GROUP(widgetDebug)
SET_UBER_PARENT_WIDGET_GROUP(widgetDebug)
SET_CAM_RECORDING_WIDGET_GROUP(sCamData, widgetDebug)
ENDPROC
PROC DESTROY_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(widgetDebug)
DELETE_WIDGET_GROUP(widgetDebug)
ENDIF
ENDPROC
PROC DRAW_INT_ABOVE_PED(PED_INDEX ped, INT i)
IF bDebugShowDebug
IF NOT IS_PED_INJURED(ped)
TEXT_LABEL str = ""
str += i
DRAW_DEBUG_TEXT(str, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(ped, <<0.0, 0.0, 1.0>>))
ENDIF
ENDIF
ENDPROC
#ENDIF
PROC LOAD_CHASE_UBER_DATA()
TrafficCarPos[0] = <<126.1199, -1378.6299, 29.0093>>
TrafficCarQuatX[0] = 0.0001
TrafficCarQuatY[0] = -0.0002
TrafficCarQuatZ[0] = 0.8791
TrafficCarQuatW[0] = -0.4766
TrafficCarRecording[0] = 151
TrafficCarStartime[0] = 6732.0000
TrafficCarModel[0] = habanero
TrafficCarPos[1] = <<204.7956, -1308.8750, 29.0337>>
TrafficCarQuatX[1] = -0.0005
TrafficCarQuatY[1] = -0.0019
TrafficCarQuatZ[1] = 0.9753
TrafficCarQuatW[1] = 0.2207
TrafficCarRecording[1] = 257
TrafficCarStartime[1] = 7000.0000
TrafficCarModel[1] = habanero
TrafficCarPos[2] = <<200.2874, -1343.9808, 28.7914>>
TrafficCarQuatX[2] = 0.0002
TrafficCarQuatY[2] = 0.0003
TrafficCarQuatZ[2] = -0.2659
TrafficCarQuatW[2] = 0.9640
TrafficCarRecording[2] = 258
TrafficCarStartime[2] = 7100.0000
TrafficCarModel[2] = emperor
TrafficCarPos[3] = <<170.4004, -1384.7385, 28.8709>>
TrafficCarQuatX[3] = 0.0054
TrafficCarQuatY[3] = 0.0069
TrafficCarQuatZ[3] = -0.3416
TrafficCarQuatW[3] = 0.9398
TrafficCarRecording[3] = 153
TrafficCarStartime[3] = 7162.0000
TrafficCarModel[3] = emperor
TrafficCarPos[4] = <<206.7476, -1152.2988, 28.8386>>
TrafficCarQuatX[4] = -0.0084
TrafficCarQuatY[4] = -0.0046
TrafficCarQuatZ[4] = 0.9999
TrafficCarQuatW[4] = -0.0139
TrafficCarRecording[4] = 260
TrafficCarStartime[4] = 9000.0000
TrafficCarModel[4] = emperor
TrafficCarPos[5] = <<269.9556, -1293.9294, 28.9782>>
TrafficCarQuatX[5] = -0.0135
TrafficCarQuatY[5] = 0.0000
TrafficCarQuatZ[5] = 0.7132
TrafficCarQuatW[5] = 0.7008
TrafficCarRecording[5] = 275
TrafficCarStartime[5] = 9100.0000
TrafficCarModel[5] = habanero
TrafficCarPos[6] = <<312.6693, -1303.3511, 31.1403>>
TrafficCarQuatX[6] = -0.0251
TrafficCarQuatY[6] = 0.0041
TrafficCarQuatZ[6] = 0.5936
TrafficCarQuatW[6] = 0.8043
TrafficCarRecording[6] = 276
TrafficCarStartime[6] = 9200.0000
TrafficCarModel[6] = habanero
TrafficCarPos[7] = <<224.6259, -1325.1558, 28.8638>>
TrafficCarQuatX[7] = 0.0076
TrafficCarQuatY[7] = -0.0116
TrafficCarQuatZ[7] = -0.4922
TrafficCarQuatW[7] = 0.8704
TrafficCarRecording[7] = 155
TrafficCarStartime[7] = 9242.0000
TrafficCarModel[7] = emperor
TrafficCarPos[8] = <<245.5630, -1294.8407, 28.9200>>
TrafficCarQuatX[8] = -0.0156
TrafficCarQuatY[8] = 0.0159
TrafficCarQuatZ[8] = 0.6623
TrafficCarQuatW[8] = 0.7489
TrafficCarRecording[8] = 277
TrafficCarStartime[8] = 9500.0000
TrafficCarModel[8] = habanero
TrafficCarPos[9] = <<210.7034, -1238.6334, 29.0745>>
TrafficCarQuatX[9] = -0.0262
TrafficCarQuatY[9] = 0.0018
TrafficCarQuatZ[9] = 0.9987
TrafficCarQuatW[9] = -0.0429
TrafficCarRecording[9] = 274
TrafficCarStartime[9] = 10000.0000
TrafficCarModel[9] = burrito3
TrafficCarPos[10] = <<216.0489, -1108.3988, 28.8714>>
TrafficCarQuatX[10] = -0.0007
TrafficCarQuatY[10] = -0.1208
TrafficCarQuatZ[10] = -0.0156
TrafficCarQuatW[10] = 0.9926
TrafficCarRecording[10] = 261
TrafficCarStartime[10] = 13000.0000
TrafficCarModel[10] = Vader
TrafficCarPos[11] = <<177.2016, -1035.9320, 28.7794>>
TrafficCarQuatX[11] = -0.0197
TrafficCarQuatY[11] = -0.0168
TrafficCarQuatZ[11] = 0.8222
TrafficCarQuatW[11] = -0.5686
TrafficCarRecording[11] = 265
TrafficCarStartime[11] = 14100.0000
TrafficCarModel[11] = emperor
TrafficCarPos[12] = <<195.4742, -1041.9108, 28.9829>>
TrafficCarQuatX[12] = -0.0239
TrafficCarQuatY[12] = -0.0175
TrafficCarQuatZ[12] = 0.8144
TrafficCarQuatW[12] = -0.5795
TrafficCarRecording[12] = 281
TrafficCarStartime[12] = 14500.0000
TrafficCarModel[12] = habanero
TrafficCarPos[13] = <<284.8204, -1049.3608, 28.7383>>
TrafficCarQuatX[13] = -0.0003
TrafficCarQuatY[13] = 0.0001
TrafficCarQuatZ[13] = 0.7117
TrafficCarQuatW[13] = 0.7025
TrafficCarRecording[13] = 283
TrafficCarStartime[13] = 16500.0000
TrafficCarModel[13] = emperor
TrafficCarPos[14] = <<266.7325, -900.9877, 28.5204>>
TrafficCarQuatX[14] = 0.0001
TrafficCarQuatY[14] = 0.0021
TrafficCarQuatZ[14] = 0.9812
TrafficCarQuatW[14] = 0.1929
TrafficCarRecording[14] = 284
TrafficCarStartime[14] = 17500.0000
TrafficCarModel[14] = emperor
TrafficCarPos[15] = <<253.6513, -921.3041, 28.7015>>
TrafficCarQuatX[15] = -0.0183
TrafficCarQuatY[15] = 0.0083
TrafficCarQuatZ[15] = 0.9795
TrafficCarQuatW[15] = 0.2002
TrafficCarRecording[15] = 285
TrafficCarStartime[15] = 17600.0000
TrafficCarModel[15] = emperor
TrafficCarPos[16] = <<233.5967, -1019.6245, 28.9231>>
TrafficCarQuatX[16] = 0.0060
TrafficCarQuatY[16] = -0.0017
TrafficCarQuatZ[16] = -0.1695
TrafficCarQuatW[16] = 0.9855
TrafficCarRecording[16] = 156
TrafficCarStartime[16] = 17754.0000
TrafficCarModel[16] = emperor
TrafficCarPos[17] = <<306.5299, -805.0709, 29.3483>>
TrafficCarQuatX[17] = 0.0006
TrafficCarQuatY[17] = -0.0001
TrafficCarQuatZ[17] = 0.9854
TrafficCarQuatW[17] = 0.1702
TrafficCarRecording[17] = 286
TrafficCarStartime[17] = 19900.0000
TrafficCarModel[17] = benson
TrafficCarPos[18] = <<285.1549, -895.8602, 28.4742>>
TrafficCarQuatX[18] = 0.0049
TrafficCarQuatY[18] = 0.0154
TrafficCarQuatZ[18] = -0.1881
TrafficCarQuatW[18] = 0.9820
TrafficCarRecording[18] = 269
TrafficCarStartime[18] = 20000.0000
TrafficCarModel[18] = emperor
TrafficCarPos[19] = <<333.1492, -849.5153, 29.0901>>
TrafficCarQuatX[19] = 0.0003
TrafficCarQuatY[19] = 0.0000
TrafficCarQuatZ[19] = 0.7037
TrafficCarQuatW[19] = 0.7105
TrafficCarRecording[19] = 270
TrafficCarStartime[19] = 20100.0000
TrafficCarModel[19] = habanero
TrafficCarPos[20] = <<291.1502, -816.9569, 28.7980>>
TrafficCarQuatX[20] = -0.0218
TrafficCarQuatY[20] = 0.0030
TrafficCarQuatZ[20] = 0.9868
TrafficCarQuatW[20] = 0.1606
TrafficCarRecording[20] = 271
TrafficCarStartime[20] = 20200.0000
TrafficCarModel[20] = emperor
TrafficCarPos[21] = <<196.0913, -832.3592, 30.7138>>
TrafficCarQuatX[21] = 0.0054
TrafficCarQuatY[21] = -0.0076
TrafficCarQuatZ[21] = 0.8238
TrafficCarQuatW[21] = -0.5669
TrafficCarRecording[21] = 287
TrafficCarStartime[21] = 20500.0000
TrafficCarModel[21] = habanero
TrafficCarPos[22] = <<92.8789, -800.8184, 30.9753>>
TrafficCarQuatX[22] = -0.0163
TrafficCarQuatY[22] = -0.0168
TrafficCarQuatZ[22] = 0.8141
TrafficCarQuatW[22] = -0.5802
TrafficCarRecording[22] = 290
TrafficCarStartime[22] = 26000.0000
TrafficCarModel[22] = emperor
TrafficCarPos[23] = <<192.4791, -730.7765, 33.5496>>
TrafficCarQuatX[23] = -0.0104
TrafficCarQuatY[23] = -0.0190
TrafficCarQuatZ[23] = 0.9892
TrafficCarQuatW[23] = 0.1451
TrafficCarRecording[23] = 292
TrafficCarStartime[23] = 26100.0000
TrafficCarModel[23] = emperor
TrafficCarPos[24] = <<221.0276, -652.8216, 38.2833>>
TrafficCarQuatX[24] = -0.0275
TrafficCarQuatY[24] = -0.0334
TrafficCarQuatZ[24] = 0.9870
TrafficCarQuatW[24] = 0.1551
TrafficCarRecording[24] = 293
TrafficCarStartime[24] = 27000.0000
TrafficCarModel[24] = habanero
TrafficCarPos[25] = <<235.0106, -631.0068, 39.9466>>
TrafficCarQuatX[25] = -0.0052
TrafficCarQuatY[25] = -0.0368
TrafficCarQuatZ[25] = 0.9772
TrafficCarQuatW[25] = 0.2091
TrafficCarRecording[25] = 294
TrafficCarStartime[25] = 27100.0000
TrafficCarModel[25] = emperor
TrafficCarPos[26] = <<257.8245, -576.9314, 43.1755>>
TrafficCarQuatX[26] = 0.0011
TrafficCarQuatY[26] = 0.0042
TrafficCarQuatZ[26] = 0.9824
TrafficCarQuatW[26] = 0.1869
TrafficCarRecording[26] = 295
TrafficCarStartime[26] = 31000.0000
TrafficCarModel[26] = burrito3
TrafficCarPos[27] = <<257.4754, -607.5755, 42.3823>>
TrafficCarQuatX[27] = 0.0241
TrafficCarQuatY[27] = -0.0046
TrafficCarQuatZ[27] = -0.1815
TrafficCarQuatW[27] = 0.9831
TrafficCarRecording[27] = 296
TrafficCarStartime[27] = 31100.0000
TrafficCarModel[27] = habanero
TrafficCarPos[28] = <<150.5976, -586.0983, 43.6946>>
TrafficCarQuatX[28] = 0.0047
TrafficCarQuatY[28] = 0.0042
TrafficCarQuatZ[28] = 0.5715
TrafficCarQuatW[28] = 0.8205
TrafficCarRecording[28] = 157
TrafficCarStartime[28] = 35114.0000
TrafficCarModel[28] = habanero
TrafficCarPos[29] = <<103.8211, -593.5438, 43.8325>>
TrafficCarQuatX[29] = -0.0059
TrafficCarQuatY[29] = 0.0013
TrafficCarQuatZ[29] = -0.1642
TrafficCarQuatW[29] = 0.9864
TrafficCarRecording[29] = 158
TrafficCarStartime[29] = 36434.0000
TrafficCarModel[29] = habanero
TrafficCarPos[30] = <<120.9813, -488.4099, 42.5893>>
TrafficCarQuatX[30] = -0.0213
TrafficCarQuatY[30] = 0.0040
TrafficCarQuatZ[30] = 0.9892
TrafficCarQuatW[30] = 0.1450
TrafficCarRecording[30] = 297
TrafficCarStartime[30] = 37500.0000
TrafficCarModel[30] = emperor
TrafficCarPos[31] = <<87.8423, -516.1512, 33.5669>>
TrafficCarQuatX[31] = -0.0023
TrafficCarQuatY[31] = 0.0024
TrafficCarQuatZ[31] = -0.7071
TrafficCarQuatW[31] = 0.7071
TrafficCarRecording[31] = 159
TrafficCarStartime[31] = 38678.0000
TrafficCarModel[31] = emperor
TrafficCarPos[32] = <<11.6671, -355.2730, 41.4288>>
TrafficCarQuatX[32] = 0.0588
TrafficCarQuatY[32] = 0.0154
TrafficCarQuatZ[32] = -0.2108
TrafficCarQuatW[32] = 0.9756
TrafficCarRecording[32] = 305
TrafficCarStartime[32] = 48000.0000
TrafficCarModel[32] = habanero
TrafficCarPos[33] = <<-26.6949, -452.7456, 40.1421>>
TrafficCarQuatX[33] = -0.0001
TrafficCarQuatY[33] = 0.0000
TrafficCarQuatZ[33] = -0.1595
TrafficCarQuatW[33] = 0.9872
TrafficCarRecording[33] = 162
TrafficCarStartime[33] = 49832.0000
TrafficCarModel[33] = habanero
TrafficCarPos[34] = <<-16.8086, -440.1597, 39.8461>>
TrafficCarQuatX[34] = -0.0192
TrafficCarQuatY[34] = 0.0029
TrafficCarQuatZ[34] = -0.1642
TrafficCarQuatW[34] = 0.9862
TrafficCarRecording[34] = 163
TrafficCarStartime[34] = 49832.0000
TrafficCarModel[34] = emperor
TrafficCarPos[35] = <<-17.3110, -335.6307, 42.8243>>
TrafficCarQuatX[35] = -0.0002
TrafficCarQuatY[35] = -0.0830
TrafficCarQuatZ[35] = 0.7806
TrafficCarQuatW[35] = -0.6195
TrafficCarRecording[35] = 298
TrafficCarStartime[35] = 52000.0000
TrafficCarModel[35] = emperor
TrafficCarPos[36] = <<-46.9629, -226.8312, 45.6652>>
TrafficCarQuatX[36] = -0.0161
TrafficCarQuatY[36] = 0.0002
TrafficCarQuatZ[36] = 0.9829
TrafficCarQuatW[36] = 0.1836
TrafficCarRecording[36] = 307
TrafficCarStartime[36] = 56000.0000
TrafficCarModel[36] = benson
TrafficCarPos[37] = <<-98.6689, -267.7760, 43.0703>>
TrafficCarQuatX[37] = 0.0322
TrafficCarQuatY[37] = 0.0106
TrafficCarQuatZ[37] = -0.5247
TrafficCarQuatW[37] = 0.8506
TrafficCarRecording[37] = 306
TrafficCarStartime[37] = 57800.0000
TrafficCarModel[37] = habanero
TrafficCarPos[38] = <<-80.8850, -230.5711, 44.5481>>
TrafficCarQuatX[38] = -0.0211
TrafficCarQuatY[38] = -0.0154
TrafficCarQuatZ[38] = 0.5934
TrafficCarQuatW[38] = 0.8045
TrafficCarRecording[38] = 165
TrafficCarStartime[38] = 57884.0000
TrafficCarModel[38] = emperor
TrafficCarPos[39] = <<-96.7447, -164.7146, 52.2507>>
TrafficCarQuatX[39] = -0.0158
TrafficCarQuatY[39] = -0.1056
TrafficCarQuatZ[39] = 0.9881
TrafficCarQuatW[39] = 0.1108
TrafficCarRecording[39] = 308
TrafficCarStartime[39] = 58000.0000
TrafficCarModel[39] = habanero
TrafficCarPos[40] = <<-101.7929, -232.2783, 44.4927>>
TrafficCarQuatX[40] = 0.0045
TrafficCarQuatY[40] = 0.0025
TrafficCarQuatZ[40] = 0.5293
TrafficCarQuatW[40] = 0.8484
TrafficCarRecording[40] = 166
TrafficCarStartime[40] = 58544.0000
TrafficCarModel[40] = habanero
TrafficCarPos[41] = <<-296.2088, -183.6414, 39.0774>>
TrafficCarQuatX[41] = -0.0023
TrafficCarQuatY[41] = -0.0187
TrafficCarQuatZ[41] = 0.9997
TrafficCarQuatW[41] = 0.0165
TrafficCarRecording[41] = 169
TrafficCarStartime[41] = 65408.0000
TrafficCarModel[41] = habanero
TrafficCarPos[42] = <<-332.6289, -197.7712, 37.8084>>
TrafficCarQuatX[42] = -0.0195
TrafficCarQuatY[42] = 0.0036
TrafficCarQuatZ[42] = 0.7673
TrafficCarQuatW[42] = -0.6410
TrafficCarRecording[42] = 171
TrafficCarStartime[42] = 67454.0000
TrafficCarModel[42] = emperor
TrafficCarPos[43] = <<-349.0214, -199.3470, 37.5625>>
TrafficCarQuatX[43] = 0.0064
TrafficCarQuatY[43] = -0.0325
TrafficCarQuatZ[43] = -0.4826
TrafficCarQuatW[43] = 0.8752
TrafficCarRecording[43] = 172
TrafficCarStartime[43] = 67454.0000
TrafficCarModel[43] = habanero
TrafficCarPos[44] = <<-426.7659, -209.2404, 35.9418>>
TrafficCarQuatX[44] = 0.0010
TrafficCarQuatY[44] = -0.0009
TrafficCarQuatZ[44] = 0.2650
TrafficCarQuatW[44] = 0.9643
TrafficCarRecording[44] = 175
TrafficCarStartime[44] = 70886.0000
TrafficCarModel[44] = habanero
TrafficCarPos[45] = <<-459.9709, -245.2829, 35.5389>>
TrafficCarQuatX[45] = 0.0166
TrafficCarQuatY[45] = -0.0054
TrafficCarQuatZ[45] = 0.9301
TrafficCarQuatW[45] = 0.3669
TrafficCarRecording[45] = 176
TrafficCarStartime[45] = 72404.0000
TrafficCarModel[45] = emperor
TrafficCarPos[46] = <<-487.6095, -275.0030, 35.3290>>
TrafficCarQuatX[46] = 0.0074
TrafficCarQuatY[46] = -0.0049
TrafficCarQuatZ[46] = -0.5561
TrafficCarQuatW[46] = 0.8311
TrafficCarRecording[46] = 177
TrafficCarStartime[46] = 73592.0000
TrafficCarModel[46] = emperor
TrafficCarPos[47] = <<-553.4454, -312.1426, 34.8028>>
TrafficCarQuatX[47] = 0.0016
TrafficCarQuatY[47] = -0.0076
TrafficCarQuatZ[47] = 0.9663
TrafficCarQuatW[47] = -0.2573
TrafficCarRecording[47] = 179
TrafficCarStartime[47] = 75572.0000
TrafficCarModel[47] = habanero
TrafficCarPos[48] = <<-634.9479, -330.0110, 34.2810>>
TrafficCarQuatX[48] = 0.0143
TrafficCarQuatY[48] = -0.0355
TrafficCarQuatZ[48] = 0.4117
TrafficCarQuatW[48] = 0.9105
TrafficCarRecording[48] = 180
TrafficCarStartime[48] = 77486.0000
TrafficCarModel[48] = emperor
TrafficCarPos[49] = <<-663.3157, -369.6766, 34.3548>>
TrafficCarQuatX[49] = -0.0078
TrafficCarQuatY[49] = 0.0102
TrafficCarQuatZ[49] = 0.7912
TrafficCarQuatW[49] = -0.6115
TrafficCarRecording[49] = 181
TrafficCarStartime[49] = 78542.0000
TrafficCarModel[49] = emperor
TrafficCarPos[50] = <<-637.4808, -487.1667, 24.8780>>
TrafficCarQuatX[50] = -0.0183
TrafficCarQuatY[50] = 0.0069
TrafficCarQuatZ[50] = 0.8166
TrafficCarQuatW[50] = 0.5769
TrafficCarRecording[50] = 184
TrafficCarStartime[50] = 81182.0000
TrafficCarModel[50] = habanero
TrafficCarPos[51] = <<-855.8752, -520.4864, 22.5379>>
TrafficCarQuatX[51] = -0.0003
TrafficCarQuatY[51] = -0.0380
TrafficCarQuatZ[51] = 0.7819
TrafficCarQuatW[51] = 0.6223
TrafficCarRecording[51] = 250
TrafficCarStartime[51] = 84000.0000
TrafficCarModel[51] = habanero
TrafficCarPos[52] = <<-779.1765, -497.9582, 24.9619>>
TrafficCarQuatX[52] = -0.0034
TrafficCarQuatY[52] = -0.0015
TrafficCarQuatZ[52] = 0.7341
TrafficCarQuatW[52] = 0.6790
TrafficCarRecording[52] = 251
TrafficCarStartime[52] = 84100.0000
TrafficCarModel[52] = habanero
TrafficCarPos[53] = <<-743.4897, -490.8126, 24.6116>>
TrafficCarQuatX[53] = -0.0202
TrafficCarQuatY[53] = 0.0062
TrafficCarQuatZ[53] = 0.7088
TrafficCarQuatW[53] = 0.7051
TrafficCarRecording[53] = 252
TrafficCarStartime[53] = 84200.0000
TrafficCarModel[53] = emperor
TrafficCarPos[54] = <<-1145.7391, -671.9159, 10.8002>>
TrafficCarQuatX[54] = 0.0008
TrafficCarQuatY[54] = -0.0002
TrafficCarQuatZ[54] = -0.5093
TrafficCarQuatW[54] = 0.8606
TrafficCarRecording[54] = 254
TrafficCarStartime[54] = 92000.0000
TrafficCarModel[54] = habanero
TrafficCarPos[55] = <<-1099.3217, -649.7197, 13.4586>>
TrafficCarQuatX[55] = 0.0450
TrafficCarQuatY[55] = -0.0023
TrafficCarQuatZ[55] = -0.5102
TrafficCarQuatW[55] = 0.8589
TrafficCarRecording[55] = 255
TrafficCarStartime[55] = 92050.0000
TrafficCarModel[55] = habanero
TrafficCarPos[56] = <<-1109.8805, -676.7749, 20.2021>>
TrafficCarQuatX[56] = -0.0166
TrafficCarQuatY[56] = -0.0026
TrafficCarQuatZ[56] = -0.4663
TrafficCarQuatW[56] = 0.8845
TrafficCarRecording[56] = 256
TrafficCarStartime[56] = 92100.0000
TrafficCarModel[56] = emperor
TrafficCarPos[57] = <<-1022.6064, -583.3073, 17.8000>>
TrafficCarQuatX[57] = 0.0140
TrafficCarQuatY[57] = -0.0102
TrafficCarQuatZ[57] = 0.8554
TrafficCarQuatW[57] = 0.5177
TrafficCarRecording[57] = 300
TrafficCarStartime[57] = 92150.0000
TrafficCarModel[57] = emperor
TrafficCarPos[58] = <<-1026.0228, -559.6900, 17.9219>>
TrafficCarQuatX[58] = -0.0157
TrafficCarQuatY[58] = 0.0057
TrafficCarQuatZ[58] = 0.8602
TrafficCarQuatW[58] = 0.5097
TrafficCarRecording[58] = 302
TrafficCarStartime[58] = 92200.0000
TrafficCarModel[58] = habanero
TrafficCarPos[59] = <<-927.6820, -521.0225, 19.0224>>
TrafficCarQuatX[59] = -0.0199
TrafficCarQuatY[59] = 0.0055
TrafficCarQuatZ[59] = 0.8601
TrafficCarQuatW[59] = 0.5097
TrafficCarRecording[59] = 186
TrafficCarStartime[59] = 92336.0000
TrafficCarModel[59] = emperor
TrafficCarPos[60] = <<-1012.2963, -595.6451, 18.0410>>
TrafficCarQuatX[60] = -0.0052
TrafficCarQuatY[60] = 0.0012
TrafficCarQuatZ[60] = -0.5286
TrafficCarQuatW[60] = 0.8489
TrafficCarRecording[60] = 190
TrafficCarStartime[60] = 95306.0000
TrafficCarModel[60] = habanero
TrafficCarPos[61] = <<-1182.6104, -674.0771, 10.7061>>
TrafficCarQuatX[61] = 0.0164
TrafficCarQuatY[61] = -0.0065
TrafficCarQuatZ[61] = 0.8521
TrafficCarQuatW[61] = 0.5230
TrafficCarRecording[61] = 303
TrafficCarStartime[61] = 97000.0000
TrafficCarModel[61] = habanero
TrafficCarPos[62] = <<-1130.8397, -635.9573, 11.9827>>
TrafficCarQuatX[62] = -0.0154
TrafficCarQuatY[62] = -0.0265
TrafficCarQuatZ[62] = 0.8716
TrafficCarQuatW[62] = 0.4892
TrafficCarRecording[62] = 191
TrafficCarStartime[62] = 98012.0000
TrafficCarModel[62] = emperor
TrafficCarPos[63] = <<-1346.7484, -752.6110, 11.1104>>
TrafficCarQuatX[63] = -0.0018
TrafficCarQuatY[63] = -0.0021
TrafficCarQuatZ[63] = -0.6166
TrafficCarQuatW[63] = 0.7872
TrafficCarRecording[63] = 193
TrafficCarStartime[63] = 103094.0000
TrafficCarModel[63] = BUS
TrafficCarPos[64] = <<-1393.6064, -762.5773, 10.5991>>
TrafficCarQuatX[64] = -0.0031
TrafficCarQuatY[64] = 0.0048
TrafficCarQuatZ[64] = -0.6391
TrafficCarQuatW[64] = 0.7691
TrafficCarRecording[64] = 194
TrafficCarStartime[64] = 104018.0000
TrafficCarModel[64] = emperor
TrafficCarPos[65] = <<-1489.5645, -772.1517, 10.6688>>
TrafficCarQuatX[65] = -0.0018
TrafficCarQuatY[65] = 0.0052
TrafficCarQuatZ[65] = -0.6960
TrafficCarQuatW[65] = 0.7180
TrafficCarRecording[65] = 196
TrafficCarStartime[65] = 105998.0000
TrafficCarModel[65] = emperor
TrafficCarPos[66] = <<-1745.0309, -639.5851, 9.8203>>
TrafficCarQuatX[66] = 0.0059
TrafficCarQuatY[66] = 0.0037
TrafficCarQuatZ[66] = 0.4360
TrafficCarQuatW[66] = 0.8999
TrafficCarRecording[66] = 201
TrafficCarStartime[66] = 111740.0000
TrafficCarModel[66] = emperor
TrafficCarPos[67] = <<-1851.9233, -553.9167, 11.0878>>
TrafficCarQuatX[67] = -0.0018
TrafficCarQuatY[67] = -0.0048
TrafficCarQuatZ[67] = 0.4298
TrafficCarQuatW[67] = 0.9029
TrafficCarRecording[67] = 203
TrafficCarStartime[67] = 114578.0000
TrafficCarModel[67] = emperor
TrafficCarPos[68] = <<-1878.9818, -557.9254, 11.3563>>
TrafficCarQuatX[68] = 0.0006
TrafficCarQuatY[68] = -0.0012
TrafficCarQuatZ[68] = 0.8999
TrafficCarQuatW[68] = -0.4362
TrafficCarRecording[68] = 204
TrafficCarStartime[68] = 114974.0000
TrafficCarModel[68] = habanero
TrafficCarPos[69] = <<-1899.4320, -514.9224, 11.2890>>
TrafficCarQuatX[69] = -0.0047
TrafficCarQuatY[69] = -0.0027
TrafficCarQuatZ[69] = 0.4238
TrafficCarQuatW[69] = 0.9058
TrafficCarRecording[69] = 205
TrafficCarStartime[69] = 115832.0000
TrafficCarModel[69] = emperor
TrafficCarPos[70] = <<-1915.1440, -508.8627, 11.3121>>
TrafficCarQuatX[70] = -0.0050
TrafficCarQuatY[70] = -0.0019
TrafficCarQuatZ[70] = 0.4256
TrafficCarQuatW[70] = 0.9049
TrafficCarRecording[70] = 206
TrafficCarStartime[70] = 116162.0000
TrafficCarModel[70] = emperor
TrafficCarPos[71] = <<-1945.2784, -503.7773, 11.3477>>
TrafficCarQuatX[71] = 0.0005
TrafficCarQuatY[71] = -0.0008
TrafficCarQuatZ[71] = 0.9002
TrafficCarQuatW[71] = -0.4354
TrafficCarRecording[71] = 207
TrafficCarStartime[71] = 116756.0000
TrafficCarModel[71] = emperor
TrafficCarPos[72] = <<-1935.8025, -478.0072, 11.5486>>
TrafficCarQuatX[72] = -0.0068
TrafficCarQuatY[72] = -0.0039
TrafficCarQuatZ[72] = 0.4292
TrafficCarQuatW[72] = 0.9032
TrafficCarRecording[72] = 208
TrafficCarStartime[72] = 116954.0000
TrafficCarModel[72] = habanero
TrafficCarPos[73] = <<-1951.1832, -492.1719, 11.5457>>
TrafficCarQuatX[73] = 0.0007
TrafficCarQuatY[73] = -0.0062
TrafficCarQuatZ[73] = 0.9020
TrafficCarQuatW[73] = -0.4317
TrafficCarRecording[73] = 209
TrafficCarStartime[73] = 117020.0000
TrafficCarModel[73] = habanero
//The buddy and truck recordings are played separately in the main mission, but as setpiece cars during debug.
SetPieceCarPos[0] = <<-1253.1776, -697.2492, 11.1198>>
SetPieceCarQuatX[0] = -0.0151
SetPieceCarQuatY[0] = 0.0104
SetPieceCarQuatZ[0] = 0.8292
SetPieceCarQuatW[0] = 0.5586
IF bPickedGoodTruckDriver
SetPieceCarRecording[0] = 101
ELSE
SetPieceCarRecording[0] = CARREC_TRUCK_RIGHT_BAD
ENDIF
SetPieceCarStartime[0] = 90000.0000
SetPieceCarRecordingSpeed[0] = TRAILER_SETPIECE_SPEED
SetPieceCarModel[0] = packer
iDontSwitchThisSetpieceRecordingToAI = SetPieceCarRecording[0]
SetPieceCarPos[1] = <<-1242.3896, -704.7631, 11.1252>>
SetPieceCarQuatX[1] = 0.0141
SetPieceCarQuatY[1] = -0.0079
SetPieceCarQuatZ[1] = 0.8385
SetPieceCarQuatW[1] = 0.5447
SetPieceCarRecording[1] = 102
SetPieceCarStartime[1] = 90000.0000
SetPieceCarRecordingSpeed[1] = TRAILER_SETPIECE_SPEED
SetPieceCarModel[1] = packer
iDontSwitchThisSetpieceRecordingToAI2 = SetPieceCarRecording[1]
IF eMissionStage = STAGE_DEBUG_RECORD_SETPIECES
SetPieceCarPos[2] = <<136.2907, -1186.8152, 29.0991>>
SetPieceCarQuatX[2] = 0.0007
SetPieceCarQuatY[2] = -0.0097
SetPieceCarQuatZ[2] = 0.9982
SetPieceCarQuatW[2] = -0.0597
SetPieceCarRecording[2] = 105
SetPieceCarStartime[2] = 0.0000
SetPieceCarRecordingSpeed[2] = 1.0000
SetPieceCarModel[2] = gauntlet
//SetPieceCarID[2] = sGoldCars[0].veh
SetPieceCarPos[3] = <<133.3132, -1186.8992, 29.1002>>
SetPieceCarQuatX[3] = 0.0005
SetPieceCarQuatY[3] = -0.0097
SetPieceCarQuatZ[3] = 0.9990
SetPieceCarQuatW[3] = -0.0431
SetPieceCarRecording[3] = 109
SetPieceCarStartime[3] = 0.0000
SetPieceCarRecordingSpeed[3] = 1.0000
SetPieceCarModel[3] = gauntlet
//SetPieceCarID[3] = sGoldCars[1].veh
SetPieceCarPos[4] = <<130.3132, -1186.7778, 29.0910>>
SetPieceCarQuatX[4] = 0.0001
SetPieceCarQuatY[4] = -0.0096
SetPieceCarQuatZ[4] = 0.9997
SetPieceCarQuatW[4] = -0.0239
IF NOT bPickedGoodCarDriver
SetPieceCarRecording[4] = CARREC_CHASE_BUDDY_3_BAD_DRIVER
ELSE
IF bPickedGoodTruckDriver
SetPieceCarRecording[4] = CARREC_CHASE_BUDDY_3_GOOD_TRUCK
ELSE
SetPieceCarRecording[4] = CARREC_CHASE_BUDDY_3_BAD_TRUCK
ENDIF
ENDIF
SetPieceCarStartime[4] = 0.0000
SetPieceCarRecordingSpeed[4] = 1.0000
SetPieceCarModel[4] = gauntlet
//SetPieceCarID[4] = sGoldCars[2].veh
ENDIF
SetPieceCarPos[5] = <<-569.5978, -646.8032, 43.9248>>
SetPieceCarQuatX[5] = -0.0000
SetPieceCarQuatY[5] = 0.0000
SetPieceCarQuatZ[5] = 0.6114
SetPieceCarQuatW[5] = 0.7913
SetPieceCarRecording[5] = 110
SetPieceCarStartime[5] = 77500.0000
SetPieceCarRecordingSpeed[5] = 1.0000
SetPieceCarModel[5] = POLMAV
SetPieceCarPos[6] = <<166.1673, -597.6662, 43.2851>>
SetPieceCarQuatX[6] = -0.0122
SetPieceCarQuatY[6] = -0.0356
SetPieceCarQuatZ[6] = 0.8113
SetPieceCarQuatW[6] = -0.5834
SetPieceCarRecording[6] = 111
SetPieceCarStartime[6] = 32000.0000
SetPieceCarRecordingSpeed[6] = 1.0000
SetPieceCarModel[6] = habanero
SetPieceCarPos[7] = <<-620.6948, -405.8100, 34.4012>>
SetPieceCarQuatX[7] = -0.0012
SetPieceCarQuatY[7] = 0.0267
SetPieceCarQuatZ[7] = 0.0122
SetPieceCarQuatW[7] = 0.9996
SetPieceCarRecording[7] = 112
SetPieceCarStartime[7] = 77000.0000
SetPieceCarRecordingSpeed[7] = 1.0000
SetPieceCarModel[7] = habanero
SetPieceCarPos[8] = <<-627.9930, -443.3298, 34.5073>>
SetPieceCarQuatX[8] = -0.0019
SetPieceCarQuatY[8] = -0.0005
SetPieceCarQuatZ[8] = -0.0065
SetPieceCarQuatW[8] = 1.0000
SetPieceCarRecording[8] = 113
SetPieceCarStartime[8] = 77100.0000
SetPieceCarRecordingSpeed[8] = 1.0000
SetPieceCarModel[8] = habanero
SetPieceCarPos[9] = <<19.9876, -217.7000, 51.5301>>
SetPieceCarQuatX[9] = 0.0190
SetPieceCarQuatY[9] = -0.0262
SetPieceCarQuatZ[9] = 0.8315
SetPieceCarQuatW[9] = -0.5546
SetPieceCarRecording[9] = 115
SetPieceCarStartime[9] = 54000.0000
SetPieceCarRecordingSpeed[9] = 1.1111
SetPieceCarModel[9] = POLICE3
SetPieceCarPos[10] = <<281.2316, -1044.3389, 28.7334>>
SetPieceCarQuatX[10] = -0.0026
SetPieceCarQuatY[10] = 0.0009
SetPieceCarQuatZ[10] = 0.6940
SetPieceCarQuatW[10] = 0.7200
SetPieceCarRecording[10] = 118
SetPieceCarStartime[10] = 16000.0000
SetPieceCarRecordingSpeed[10] = 1.0000
SetPieceCarModel[10] = emperor
SetPieceCarPos[11] = <<166.7606, -1026.9526, 29.0744>>
SetPieceCarQuatX[11] = 0.0027
SetPieceCarQuatY[11] = -0.0035
SetPieceCarQuatZ[11] = 0.8117
SetPieceCarQuatW[11] = -0.5840
SetPieceCarRecording[11] = 119
SetPieceCarStartime[11] = 15000.0000
SetPieceCarRecordingSpeed[11] = 1.0000
SetPieceCarModel[11] = habanero
SetPieceCarPos[12] = <<229.0311, -849.7205, 29.6122>>
SetPieceCarQuatX[12] = 0.0984
SetPieceCarQuatY[12] = 0.0568
SetPieceCarQuatZ[12] = 0.8058
SetPieceCarQuatW[12] = -0.5811
SetPieceCarRecording[12] = 120
SetPieceCarStartime[12] = 22000.0000
SetPieceCarRecordingSpeed[12] = 1.0000
SetPieceCarModel[12] = vader
SetPieceCarPos[13] = <<246.6916, -618.9172, 41.7370>>
SetPieceCarQuatX[13] = -0.0087
SetPieceCarQuatY[13] = -0.0396
SetPieceCarQuatZ[13] = 0.9798
SetPieceCarQuatW[13] = 0.1960
SetPieceCarRecording[13] = 272
SetPieceCarStartime[13] = 26000.0000
SetPieceCarRecordingSpeed[13] = 1.0000
SetPieceCarModel[13] = Biff
SetPieceCarPos[14] = <<208.4380, -748.9736, 33.4368>>
SetPieceCarQuatX[14] = 0.0266
SetPieceCarQuatY[14] = 0.0193
SetPieceCarQuatZ[14] = -0.1842
SetPieceCarQuatW[14] = 0.9823
SetPieceCarRecording[14] = 273
SetPieceCarStartime[14] = 27500.0000
SetPieceCarRecordingSpeed[14] = 1.0000
SetPieceCarModel[14] = bus
SetPieceCarPos[15] = <<-292.1852, -148.5122, 41.0333>>
SetPieceCarQuatX[15] = 0.0082
SetPieceCarQuatY[15] = 0.0118
SetPieceCarQuatZ[15] = 0.6025
SetPieceCarQuatW[15] = 0.7980
SetPieceCarRecording[15] = 121
SetPieceCarStartime[15] = 64800.0
SetPieceCarRecordingSpeed[15] = 1.0000
SetPieceCarModel[15] = packer
SetPieceCarPos[16] = <<107.7398, -600.9831, 43.6752>>
SetPieceCarQuatX[16] = 0.0013
SetPieceCarQuatY[16] = 0.0244
SetPieceCarQuatZ[16] = -0.1665
SetPieceCarQuatW[16] = 0.9857
SetPieceCarRecording[16] = 124
SetPieceCarStartime[16] = 37000.0000
SetPieceCarRecordingSpeed[16] = 1.0000
SetPieceCarModel[16] = emperor
SetPieceCarPos[17] = <<-685.8647, -475.7422, 34.2185>>
SetPieceCarQuatX[17] = 0.0010
SetPieceCarQuatY[17] = -0.0263
SetPieceCarQuatZ[17] = 0.6944
SetPieceCarQuatW[17] = 0.7191
SetPieceCarRecording[17] = 127
SetPieceCarStartime[17] = 81000.0000
SetPieceCarRecordingSpeed[17] = 1.0000
SetPieceCarModel[17] = flatbed
SetPieceCarPos[18] = <<269.2946, -562.0340, 42.9396>>
SetPieceCarQuatX[18] = -0.0003
SetPieceCarQuatY[18] = -0.0010
SetPieceCarQuatZ[18] = 0.9925
SetPieceCarQuatW[18] = 0.1223
SetPieceCarRecording[18] = 132
SetPieceCarStartime[18] = 30000.0000
SetPieceCarRecordingSpeed[18] = 1.1111
SetPieceCarModel[18] = police3
SetPieceCarPos[19] = <<-254.5352, -227.4811, 36.0209>>
SetPieceCarQuatX[19] = -0.0241
SetPieceCarQuatY[19] = -0.0305
SetPieceCarQuatZ[19] = 0.8423
SetPieceCarQuatW[19] = 0.5377
SetPieceCarRecording[19] = 131
SetPieceCarStartime[19] = 66000.0000
SetPieceCarRecordingSpeed[19] = 1.1111
SetPieceCarModel[19] = police3
SetPieceCarPos[21] = <<90.3679, -817.8712, 30.8911>>
SetPieceCarQuatX[21] = 0.0120
SetPieceCarQuatY[21] = -0.0168
SetPieceCarQuatZ[21] = -0.1665
SetPieceCarQuatW[21] = 0.9858
SetPieceCarRecording[21] = 133
SetPieceCarStartime[21] = 24500.0000
SetPieceCarRecordingSpeed[21] = 1.1000
SetPieceCarModel[21] = police3
SetPieceCarPos[22] = <<86.6921, -774.7521, 31.1603>>
SetPieceCarQuatX[22] = 0.0263
SetPieceCarQuatY[22] = 0.0127
SetPieceCarQuatZ[22] = 0.8206
SetPieceCarQuatW[22] = -0.5708
SetPieceCarRecording[22] = 134
SetPieceCarStartime[22] = 24600.0000
SetPieceCarRecordingSpeed[22] = 1.1000
SetPieceCarModel[22] = police3
SetPieceCarPos[23] = <<-12.9334, -274.2683, 46.6387>>
SetPieceCarQuatX[23] = -0.0231
SetPieceCarQuatY[23] = 0.0011
SetPieceCarQuatZ[23] = 0.8489
SetPieceCarQuatW[23] = -0.5281
SetPieceCarRecording[23] = 135
SetPieceCarStartime[23] = 49000.0000
SetPieceCarRecordingSpeed[23] = 1.0000
SetPieceCarModel[23] = habanero
SetPieceCarPos[24] = <<186.4278, -1399.0901, 28.8768>>
SetPieceCarQuatX[24] = -0.0096
SetPieceCarQuatY[24] = 0.0226
SetPieceCarQuatZ[24] = 0.3507
SetPieceCarQuatW[24] = 0.9362
SetPieceCarRecording[24] = 136
SetPieceCarStartime[24] = 7000.0000
SetPieceCarRecordingSpeed[24] = 1.1111
SetPieceCarModel[24] = police3
SetPieceCarPos[25] = <<232.7994, -1259.1505, 28.7174>>
SetPieceCarQuatX[25] = 0.0010
SetPieceCarQuatY[25] = 0.0093
SetPieceCarQuatZ[25] = -0.0596
SetPieceCarQuatW[25] = 0.9982
SetPieceCarRecording[25] = 278
SetPieceCarStartime[25] = 9600.0000
SetPieceCarRecordingSpeed[25] = 1.0
SetPieceCarModel[25] = emperor
SetPieceCarPos[26] = <<163.3614, -826.8202, 30.6954>>
SetPieceCarQuatX[26] = 0.0016
SetPieceCarQuatY[26] = 0.0005
SetPieceCarQuatZ[26] = 0.8207
SetPieceCarQuatW[26] = -0.5714
SetPieceCarRecording[26] = 288
SetPieceCarStartime[26] = 20600.0000
SetPieceCarRecordingSpeed[26] = 1.0
SetPieceCarModel[26] = emperor
//Parked cars
ParkedCarPos[0] = <<150.9794, -399.4397, 40.8743>>
ParkedCarQuatX[0] = 0.0075
ParkedCarQuatY[0] = 0.0249
ParkedCarQuatZ[0] = 0.4819
ParkedCarQuatW[0] = 0.8758
ParkedCarModel[0] = POLICE3
ParkedCarPos[1] = <<159.0037, -401.6718, 40.9692>>
ParkedCarQuatX[1] = -0.0162
ParkedCarQuatY[1] = -0.0122
ParkedCarQuatZ[1] = 0.9668
ParkedCarQuatW[1] = -0.2548
ParkedCarModel[1] = POLICE3
ParkedCarPos[2] = <<168.1424, -406.2586, 40.8993>>
ParkedCarQuatX[2] = -0.0075
ParkedCarQuatY[2] = -0.0210
ParkedCarQuatZ[2] = 0.7181
ParkedCarQuatW[2] = -0.6956
ParkedCarModel[2] = POLICE3
ParkedCarPos[3] = <<-627.4457, -483.3596, 33.8083>>
ParkedCarQuatX[3] = 0.0
ParkedCarQuatY[3] = 0.0
ParkedCarQuatZ[3] = 0.8862
ParkedCarQuatW[3] = 0.4633
ParkedCarModel[3] = POLICE3
/*ParkedCarPos[4] = <<-630.5210, -481.4349, 33.8083>>
ParkedCarQuatX[4] = 0.0001
ParkedCarQuatY[4] = -0.0000
ParkedCarQuatZ[4] = 0.7624
ParkedCarQuatW[4] = -0.6471
ParkedCarModel[4] = POLICE3*/
ParkedCarPos[5] = <<-635.9256, -484.7276, 33.8083>>
ParkedCarQuatX[5] = 0.0003
ParkedCarQuatY[5] = -0.0006
ParkedCarQuatZ[5] = 0.2910
ParkedCarQuatW[5] = 0.9567
ParkedCarModel[5] = POLICE3
ParkedCarPos[6] = <<-644.4130, -483.9380, 33.8083>>
ParkedCarQuatX[6] = 0.0142
ParkedCarQuatY[6] = -0.0109
ParkedCarQuatZ[6] = -0.5902
ParkedCarQuatW[6] = 0.8070
ParkedCarModel[6] = POLICE3
ParkedCarPos[7] = <<141.7556, -1282.3517, 28.8426>>
ParkedCarQuatX[7] = -0.0175
ParkedCarQuatY[7] = 0.0099
ParkedCarQuatZ[7] = -0.5080
ParkedCarQuatW[7] = -0.8611
ParkedCarModel[7] = Emperor
ParkedCarPos[8] = <<259.2000, -1254.4874, 28.6646>>
ParkedCarQuatX[8] = 0.0001
ParkedCarQuatY[8] = -0.0099
ParkedCarQuatZ[8] = 0.9999
ParkedCarQuatW[8] = -0.0031
ParkedCarModel[8] = Emperor
ParkedCarPos[9] = <<250.0250, -1150.0442, 28.7959>>
ParkedCarQuatX[9] = -0.0060
ParkedCarQuatY[9] = -0.0024
ParkedCarQuatZ[9] = -0.0184
ParkedCarQuatW[9] = 0.9998
ParkedCarModel[9] = Emperor
ParkedCarPos[10] = <<279.6884, -921.0851, 28.6364>>
ParkedCarQuatX[10] = -0.0179
ParkedCarQuatY[10] = -0.0670
ParkedCarQuatZ[10] = -0.1643
ParkedCarQuatW[10] = 0.9840
ParkedCarModel[10] = Habanero
ParkedCarPos[11] = <<224.5021, -799.3860, 30.3567>>
ParkedCarQuatX[11] = 0.0024
ParkedCarQuatY[11] = 0.0013
ParkedCarQuatZ[11] = 0.5406
ParkedCarQuatW[11] = 0.8413
ParkedCarModel[11] = Habanero
ParkedCarPos[12] = <<226.3161, -774.3887, 30.2995>>
ParkedCarQuatX[12] = 0.0071
ParkedCarQuatY[12] = -0.0123
ParkedCarQuatZ[12] = 0.8175
ParkedCarQuatW[12] = -0.5757
ParkedCarModel[12] = emperor
ParkedCarPos[13] = <<211.8195, -669.2407, 37.1736>>
ParkedCarQuatX[13] = 0.0409
ParkedCarQuatY[13] = -0.0391
ParkedCarQuatZ[13] = 0.9846
ParkedCarQuatW[13] = 0.1654
ParkedCarModel[13] = burrito3
ParkedCarPos[14] = <<114.0084, -380.0473, 41.5471>>
ParkedCarQuatX[14] = 0.0016
ParkedCarQuatY[14] = -0.0542
ParkedCarQuatZ[14] = 0.9983
ParkedCarQuatW[14] = -0.0202
ParkedCarModel[14] = bulldozer
ParkedCarPos[15] = <<-63.0514, -215.2341, 45.0139>>
ParkedCarQuatX[15] = -0.0146
ParkedCarQuatY[15] = -0.0313
ParkedCarQuatZ[15] = 0.9794
ParkedCarQuatW[15] = 0.1989
ParkedCarModel[15] = emperor
ParkedCarPos[16] = <<-476.7066, -216.8887, 35.9730>>
ParkedCarQuatX[16] = 0.0065
ParkedCarQuatY[16] = -0.0212
ParkedCarQuatZ[16] = 0.9641
ParkedCarQuatW[16] = -0.2645
ParkedCarModel[16] = emperor
ParkedCarPos[17] = <<-483.9053, -204.4272, 36.3443>>
ParkedCarQuatX[17] = 0.0066
ParkedCarQuatY[17] = -0.0226
ParkedCarQuatZ[17] = 0.9716
ParkedCarQuatW[17] = -0.2356
ParkedCarModel[17] = habanero
ParkedCarPos[18] = <<-520.6978, -265.9695, 35.3349>>
ParkedCarQuatX[18] = 0.0015
ParkedCarQuatY[18] = -0.0036
ParkedCarQuatZ[18] = 0.8274
ParkedCarQuatW[18] = 0.5616
ParkedCarModel[18] = bus
ParkedCarPos[19] = <<-128.3865, -215.6624, 44.4083>>
ParkedCarQuatX[19] = -0.0081
ParkedCarQuatY[19] = 0.0031
ParkedCarQuatZ[19] = -0.0220
ParkedCarQuatW[19] = 0.9997
ParkedCarModel[19] = police3
ParkedCarPos[20] = <<203.9267, -846.0989, 30.2330>>
ParkedCarQuatX[20] = 0.0081
ParkedCarQuatY[20] = -0.0084
ParkedCarQuatZ[20] = 0.8171
ParkedCarQuatW[20] = -0.5763
ParkedCarModel[20] = habanero
ENDPROC
FUNC INT GET_TRAFFIC_VEHICLE_SEARCH_FLAGS()
RETURN (VEHICLE_SEARCH_FLAG_ALLOW_VEHICLE_OCCUPANTS_TO_BE_PERFORMING_A_SCRIPTED_TASK |
VEHICLE_SEARCH_FLAG_RETURN_MISSION_VEHICLES |
VEHICLE_SEARCH_FLAG_RETURN_RANDOM_VEHICLES |
VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_A_DEAD_OR_DYING_PED)
ENDFUNC
FUNC INT GET_TRAFFIC_AND_PLAYER_VEHICLE_SEARCH_FLAGS()
RETURN (VEHICLE_SEARCH_FLAG_ALLOW_VEHICLE_OCCUPANTS_TO_BE_PERFORMING_A_SCRIPTED_TASK |
VEHICLE_SEARCH_FLAG_RETURN_MISSION_VEHICLES |
VEHICLE_SEARCH_FLAG_RETURN_RANDOM_VEHICLES |
VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_A_PLAYER |
VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_GROUP_MEMBERS |
VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_A_DEAD_OR_DYING_PED)
ENDFUNC
PROC CLEAR_TRIGGERED_LABELS()
INT iArraySize = COUNT_OF(bHasTextLabelTriggered)
INT i = 0
REPEAT iArraySize i
bHasTextLabelTriggered[i] = FALSE
ENDREPEAT
ENDPROC
///Gets the ped index for a given player ped character, if the character is the player it returns PLAYER_PED_ID(), otherwise it returns the relevant selector ped.
FUNC PED_INDEX GET_PED_INDEX(enumCharacterList eChar)
IF GET_PLAYER_PED_MODEL(eChar) = GET_ENTITY_MODEL(PLAYER_PED_ID())
RETURN PLAYER_PED_ID()
ELSE
RETURN sSelectorPeds.pedID[GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(eChar)]
ENDIF
ENDFUNC
PROC DISABLE_COMBAT_CONTROLS_THIS_FRAME(BOOL bAllowEnteringVehicles = FALSE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_COVER)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DUCK)
IF NOT bAllowEnteringVehicles
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
ENDIF
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK1)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_BLOCK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_PREV_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_AIM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_RELOAD)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_PC)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_SECONDARY)
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
ENDIF
ENDPROC
//PURPOSE: triggers multiple bullet hits around an entity at given intervals.
//AUTHOR: Ross Wallace
PROC DO_EXCITING_NEAR_BULLET_MISS_ON_ENTITY(ENTITY_INDEX entityToMiss, PED_INDEX sourceOfBullets, INT &iControlTimer, VECTOR sourceOffset,
INT timeBetweenBullets = 60, FLOAT minXrange = -3.9, FLOAT maxXrange = -1.0, FLOAT minYRange = -2.9, FLOAT maxYrange = 3.9)
INT currentBulletTime = GET_GAME_TIMER()
VECTOR bulletHit
VECTOR bulletOrigin
IF ((currentBulletTime - iControlTimer) > timeBetweenBullets)
IF NOT IS_ENTITY_DEAD(entityToMiss)
AND NOT IS_ENTITY_DEAD(sourceOfBullets)
bulletHit = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(entityToMiss, <<GET_RANDOM_FLOAT_IN_RANGE(minXrange, maxXrange), GET_RANDOM_FLOAT_IN_RANGE(minYRange, maxYrange), 0.0>>)
bulletOrigin = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sourceOfBullets, sourceOffset)
GET_GROUND_Z_FOR_3D_COORD(bulletHit, bulletHit.z)
SHOOT_SINGLE_BULLET_BETWEEN_COORDS(bulletOrigin, bulletHit, 1)
iControlTimer = currentBulletTime
//SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
//DRAW_DEBUG_SPHERE(bulletOrigin, 0.2)
//DRAW_DEBUG_SPHERE(bulletHit, 0.2)
ENDIF
ENDIF
ENDPROC
PROC FIX_ALL_VEHICLE_TYRES(VEHICLE_INDEX veh)
IF IS_VEHICLE_DRIVEABLE(veh)
SET_VEHICLE_TYRE_FIXED(veh, SC_WHEEL_CAR_FRONT_LEFT)
SET_VEHICLE_TYRE_FIXED(veh, SC_WHEEL_CAR_FRONT_RIGHT)
SET_VEHICLE_TYRE_FIXED(veh, SC_WHEEL_CAR_REAR_LEFT)
SET_VEHICLE_TYRE_FIXED(veh, SC_WHEEL_CAR_REAR_RIGHT)
ENDIF
ENDPROC
FUNC PED_INDEX CREATE_ENEMY_PED(MODEL_NAMES model, VECTOR vPos, FLOAT fHeading, REL_GROUP_HASH group,
INT iHealth = 200, INT iArmour = 0, WEAPON_TYPE weapon = WEAPONTYPE_UNARMED, PED_TYPE ePedType = PEDTYPE_MISSION)
PED_INDEX ped = CREATE_PED(ePedType, model, vPos, fHeading)
GIVE_WEAPON_TO_PED(ped, weapon, INFINITE_AMMO, TRUE)
SET_PED_INFINITE_AMMO(ped, TRUE, weapon)
SET_PED_MAX_HEALTH(ped, iHealth)
SET_ENTITY_HEALTH(ped, iHealth)
ADD_ARMOUR_TO_PED(ped, -GET_PED_ARMOUR(ped))
ADD_ARMOUR_TO_PED(ped, iArmour)
SET_PED_DIES_WHEN_INJURED(ped, TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(ped, group)
SET_PED_AS_ENEMY(ped, TRUE)
SET_PED_TARGET_LOSS_RESPONSE(ped, TLR_NEVER_LOSE_TARGET)
SET_PED_CONFIG_FLAG(ped, PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(ped, PCF_DisableHurt, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped, CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_MONEY(ped, 0)
RETURN ped
ENDFUNC
FUNC PED_INDEX CREATE_ENEMY_PED_IN_VEHICLE(MODEL_NAMES model, VEHICLE_INDEX veh, VEHICLE_SEAT eSeat, REL_GROUP_HASH group,
INT iHealth = 200, INT iArmour = 0, WEAPON_TYPE weapon = WEAPONTYPE_UNARMED, PED_TYPE ePedType = PEDTYPE_MISSION)
PED_INDEX ped
IF IS_VEHICLE_DRIVEABLE(veh)
ped = CREATE_ENEMY_PED(model, GET_ENTITY_COORDS(veh) + <<0.0, 0.0, 3.0>>, 0.0, group, iHealth, iArmour, weapon, ePedType)
SET_PED_INTO_VEHICLE(ped, veh, eSeat)
ENDIF
RETURN ped
ENDFUNC
PROC SET_PED_COMBAT_AI(PED_INDEX &ped, INT accuracy, COMBAT_MOVEMENT movement, COMBAT_ABILITY_LEVEL ability, COMBAT_RANGE range, COMBAT_ATTRIBUTE activeAttributes,
VECTOR vDefensiveSpherePos, FLOAT fDefensiveSphereRadius = 0.0)
IF NOT IS_PED_INJURED(ped)
SET_PED_COMBAT_MOVEMENT(ped, movement)
SET_PED_COMBAT_ABILITY(ped, ability)
SET_PED_COMBAT_RANGE(ped, range)
SET_PED_COMBAT_ATTRIBUTES(ped, CA_USE_COVER, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped, CA_DO_DRIVEBYS, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped, CA_LEAVE_VEHICLES, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped, CA_CAN_INVESTIGATE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped, activeAttributes, TRUE)
SET_PED_ACCURACY(ped, accuracy)
IF fDefensiveSphereRadius != 0.0
SET_PED_SPHERE_DEFENSIVE_AREA(ped, vDefensiveSpherePos, fDefensiveSphereRadius)
ENDIF
ENDIF
ENDPROC
PROC SET_PED_COMBAT_PARAMS(PED_INDEX &ped, INT iAccuracy, COMBAT_MOVEMENT eMovement, COMBAT_ABILITY_LEVEL eAbility, COMBAT_RANGE eRange,
COMBAT_TARGET_LOSS_RESPONSE eTLR)
SET_PED_COMBAT_MOVEMENT(ped, eMovement)
SET_PED_COMBAT_ABILITY(ped, eAbility)
SET_PED_COMBAT_RANGE(ped, eRange)
SET_PED_ACCURACY(ped, iAccuracy)
SET_PED_TARGET_LOSS_RESPONSE(ped, eTLR)
ENDPROC
PROC SET_PED_PREFERRED_COVER_POINT(PED_INDEX &ped, COVERPOINT_INDEX &cover)
IF NOT IS_PED_INJURED(ped)
ITEMSET_INDEX itemCover = CREATE_ITEMSET(TRUE)
ADD_TO_ITEMSET(cover, itemCover)
SET_PED_PREFERRED_COVER_SET(ped, itemCover)
DESTROY_ITEMSET(itemCover)
ENDIF
ENDPROC
PROC INITIALISE_ENEMY_PED(ENEMY_DATA &sEnemy, STRING strName, INT iIndex)
IF NOT IS_PED_INJURED(sEnemy.ped)
TASK_STAND_STILL(sEnemy.ped, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemy.ped, TRUE)
INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(sEnemy.ped)
sEnemy.bIsCreated = TRUE
sEnemy.bHasCleanedUp = FALSE
sEnemy.bSetToCharge = FALSE
sEnemy.iEvent = 0
sEnemy.iTimer = 0
#IF IS_DEBUG_BUILD
TEXT_LABEL_31 strDebugName = strName
strDebugName += iIndex
SET_PED_NAME_DEBUG(sEnemy.ped, strDebugName)
#ENDIF
#IF NOT IS_DEBUG_BUILD
strName = strName // to prevent an Unreferenced variable error
iIndex = iIndex
#ENDIF
ENDIF
ENDPROC
PROC INITIALISE_ENEMY_GROUP(ENEMY_DATA &sEnemies[], STRING name)
INT i = 0
REPEAT COUNT_OF(sEnemies) i
INITIALISE_ENEMY_PED(sEnemies[i], name, i)
ENDREPEAT
ENDPROC
PROC CLEAN_UP_ENEMY_PED(ENEMY_DATA &sEnemy, BOOL bResetVariables = FALSE)
IF DOES_BLIP_EXIST(sEnemy.blip)
REMOVE_BLIP(sEnemy.blip)
ENDIF
CLEANUP_AI_PED_BLIP(sEnemy.sBlipData)
IF NOT IS_PED_INJURED(sEnemy.ped)
STOP_SYNCHRONIZED_ENTITY_ANIM(sEnemy.ped, NORMAL_BLEND_OUT, TRUE)
ELSE
//Increment the kill stat if this ped was killed by the player.
IF DOES_ENTITY_EXIST(sEnemy.ped)
ENTITY_INDEX entityDeathSource = GET_PED_SOURCE_OF_DEATH(sEnemy.ped)
IF DOES_ENTITY_EXIST(entityDeathSource)
AND IS_ENTITY_A_PED(entityDeathSource)
IF GET_PED_INDEX_FROM_ENTITY_INDEX(entityDeathSource) = PLAYER_PED_ID()
REL_GROUP_HASH eEnemyGroup = GET_PED_RELATIONSHIP_GROUP_HASH(sEnemy.ped)
IF eEnemyGroup = relGroupCops
OR eEnemyGroup = RELGROUPHASH_COP
INFORM_MISSION_STATS_OF_INCREMENT(FH2A_KILLS)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
REMOVE_COVER_POINT(sEnemy.cover)
SET_PED_AS_NO_LONGER_NEEDED(sEnemy.ped)
IF bResetVariables
sEnemy.bIsCreated = FALSE
sEnemy.bHasCleanedUp = FALSE
sEnemy.bHasStartedRopeJump = FALSE
sEnemy.iEvent = 0
sEnemy.iTimer = 0
sEnemy.iRopeEvent = 0
sEnemy.ped = NULL
sEnemy.cover = NULL
ENDIF
ENDPROC
PROC KILL_ENEMY_GROUP_INSTANTLY(ENEMY_DATA &sEnemies[])
INT i = 0
REPEAT COUNT_OF(sEnemies) i
sEnemies[i].bIsCreated = TRUE
IF NOT IS_PED_INJURED(sEnemies[i].ped)
SET_ENTITY_HEALTH(sEnemies[i].ped, 0)
ENDIF
ENDREPEAT
ENDPROC
///Counts the number of enemies currently alive in the group. If the group hasn't been created yet than all the peds are considered as alive.
FUNC INT GET_NUM_ENEMIES_ALIVE_IN_GROUP(ENEMY_DATA &sEnemies[])
INT iNumAlive = 0
INT iNumEnemiesInGroup = COUNT_OF(sEnemies)
INT i = 0
IF sEnemies[0].bIsCreated
REPEAT iNumEnemiesInGroup i
IF NOT IS_PED_INJURED(sEnemies[i].ped)
iNumAlive++
ENDIF
ENDREPEAT
ELSE
iNumAlive = iNumEnemiesInGroup
ENDIF
RETURN iNumAlive
ENDFUNC
FUNC BOOL IS_ENEMY_GROUP_DEAD(ENEMY_DATA &sEnemies[])
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sEnemies) = 0
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Helper function to set up a ped's personal cover point and defensive sphere in one go.
PROC SET_PED_COVER_POINT_AND_SPHERE(PED_INDEX ped, COVERPOINT_INDEX &cover, VECTOR vPos, FLOAT fHeading, FLOAT fSphereRadius,
COVERPOINT_USAGE covUsage, COVERPOINT_HEIGHT covHeight, COVERPOINT_ARC covArc, BOOL bGoToCentreOfSphere = FALSE)
IF NOT IS_PED_INJURED(ped)
IF cover != NULL
REMOVE_COVER_POINT(cover)
cover = NULL
ENDIF
cover = ADD_COVER_POINT(vPos, fHeading, covUsage, covHeight, covArc)
SET_PED_SPHERE_DEFENSIVE_AREA(ped, vPos, fSphereRadius, bGoToCentreOfSphere)
ENDIF
ENDPROC
/// PURPOSE:
/// Tells a ped to go to cover while aiming at either a coord or a given entity, and then go into general combat.
PROC SEQ_GO_TO_COVER_WHILE_AIMING_THEN_COMBAT(PED_INDEX ped, VECTOR v_destination, FLOAT move_state, INT i_time_spent_in_cover, BOOL b_shoot, VECTOR v_aim_pos,
FLOAT f_target_distance = 0.5, FLOAT f_slow_distance = 4.0, BOOL b_use_navmesh = TRUE, ENTITY_INDEX entity_aim = NULL)
IF NOT IS_PED_INJURED(ped)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF IS_ENTITY_DEAD(entity_aim)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, v_destination, v_aim_pos, move_state, b_shoot, f_target_distance, f_slow_distance, b_use_navmesh)
TASK_SEEK_COVER_TO_COORDS(NULL, v_destination, v_aim_pos, i_time_spent_in_cover)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, v_destination, entity_aim, move_state, b_shoot, f_target_distance, f_slow_distance, b_use_navmesh)
TASK_SEEK_COVER_TO_COORDS(NULL, v_destination, GET_ENTITY_COORDS(entity_aim), i_time_spent_in_cover)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 50.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDPROC
/// PURPOSE:
/// Tells a ped to go to cover while aiming at either a coord or a given entity.
PROC SEQ_GO_TO_COVER_WHILE_AIMING(PED_INDEX ped, VECTOR vDestination, FLOAT moveState, INT iTimeSpentInCover, BOOL bShoot, VECTOR vAimPos,
FLOAT fTargetDistance = 0.5, FLOAT fSlowDistance = 4.0, BOOL bUseNavmesh = TRUE, ENTITY_INDEX entityAim = NULL,
BOOL bBlockNonTempEvents = TRUE)
IF NOT IS_PED_INJURED(ped)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
IF IS_ENTITY_DEAD(entityAim)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, vDestination, vAimPos, moveState, bShoot, fTargetDistance, fSlowDistance, bUseNavmesh)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, vDestination, entityAim, moveState, bShoot, fTargetDistance, fSlowDistance, bUseNavmesh)
ENDIF
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, vDestination, iTimeSpentInCover)
CLOSE_SEQUENCE_TASK(seq)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped, bBlockNonTempEvents)
TASK_PERFORM_SEQUENCE(ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDPROC
/// PURPOSE:
/// Tells a ped to run to a location and then puts them into cover there
PROC SEQ_GO_TO_COVER(PED_INDEX ped, VECTOR vDestination, FLOAT moveState, INT iTimeSpentInCover, BOOL bBlockNonTempEvents = TRUE, BOOL bUseNavmesh = TRUE,
INT iTime = DEFAULT_TIME_BEFORE_WARP, FLOAT fRadius = DEFAULT_NAVMESH_RADIUS, ENAV_SCRIPT_FLAGS navFlags = ENAV_DEFAULT)
IF NOT IS_PED_INJURED(ped)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
IF bUseNavmesh
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vDestination, moveState, iTime, fRadius, navFlags)
ELSE
TASK_GO_STRAIGHT_TO_COORD(NULL, vDestination, moveState, iTime)
ENDIF
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, vDestination, iTimeSpentInCover, FALSE, SLOW_BLEND_DURATION)
CLOSE_SEQUENCE_TASK(seq)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped, bBlockNonTempEvents)
TASK_PERFORM_SEQUENCE(ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDPROC
/// PURPOSE:
/// Performs a generic sequence where a ped will go to a coord while aiming at something (either a coord or entity), then transition into combat
PROC SEQ_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(PED_INDEX ped, VECTOR v_destination, FLOAT move_speed, VECTOR v_aim_pos, ENTITY_INDEX entity_aim = NULL, BOOL b_shoot = TRUE,
FLOAT f_target_dist = 0.5, FLOAT f_slow_dist = 0.5, BOOL b_use_navmesh = TRUE, FLOAT f_combat_range = 100.0)
IF NOT IS_PED_INJURED(ped)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF IS_ENTITY_DEAD(entity_aim)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, v_destination, v_aim_pos, move_speed, b_shoot, f_target_dist, f_slow_dist, b_use_navmesh)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, v_destination, entity_aim, move_speed, b_shoot, f_target_dist, f_slow_dist, b_use_navmesh)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, f_combat_range)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDPROC
/// PURPOSE:
/// Performs a generic sequence where a ped will go to a coord while aiming at something (either a coord or entity), then either continue aiming or shoot at the target.
PROC SEQ_GO_TO_COORD_WHILE_AIMING_THEN_AIM(PED_INDEX ped, VECTOR vDestination, FLOAT moveState, VECTOR vAimPos, ENTITY_INDEX entityAim = NULL, BOOL bShoot = TRUE,
FLOAT fTargetDist = 0.5, FLOAT fSlowDist = 0.5, BOOL bUseNavmesh = TRUE, BOOL bBlockNonTempEvents = TRUE,
BOOL bShootWhenStopped = TRUE, FIRING_TYPE fireType = FIRING_TYPE_RANDOM_BURSTS)
IF NOT IS_PED_INJURED(ped)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
IF IS_ENTITY_DEAD(entityAim)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, vDestination, vAimPos, moveState, bShoot, fTargetDist, fSlowDist, bUseNavmesh)
IF bShootWhenStopped
TASK_SHOOT_AT_COORD(NULL, vAimPos, -1, fireType)
ELSE
TASK_AIM_GUN_AT_COORD(NULL, vAimPos, -1)
ENDIF
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, vDestination, entityAim, moveState, bShoot, fTargetDist, fSlowDist, bUseNavmesh)
IF bShootWhenStopped
TASK_SHOOT_AT_ENTITY(NULL, entityAim, -1, fireType)
ELSE
TASK_AIM_GUN_AT_ENTITY(NULL, entityAim, -1)
ENDIF
ENDIF
CLOSE_SEQUENCE_TASK(seq)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped, bBlockNonTempEvents)
TASK_PERFORM_SEQUENCE(ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDPROC
FUNC BOOL HAS_VEHICLE_HAD_MULTIPLE_PARTS_DAMAGED(VEHICLE_INDEX veh, INT iNumPartsToDamage)
IF IS_VEHICLE_DRIVEABLE(veh)
INT iNumPartsDamaged = GET_VEHICLE_NUM_OF_BROKEN_OFF_PARTS(veh) + GET_VEHICLE_NUM_OF_BROKEN_LOOSEN_PARTS(veh)
IF IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_LEFT)
OR IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_RIGHT)
OR IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_LEFT)
OR (IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_RIGHT) AND NOT bVanTyreBurst)
OR iNumPartsDamaged >= iNumPartsToDamage
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Based on Ross's proc in rural_bank_heist.sc: applies extra damage to vehicle components as it is shot.
PROC DO_VEHICLE_DAMAGE_WHEN_SHOT(VEHICLE_INDEX &veh)
IF NOT IS_ENTITY_DEAD(veh)
IF NOT IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_LEFT)
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<-0.8000, 1.4000, 0.1000>>), 0.738)
SET_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_LEFT)
SET_VEHICLE_DAMAGE(veh, <<-1.0000, 1.0000, 0.2000>>, 100.0, 100.0, TRUE)
ENDIF
ENDIF
IF NOT IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_RIGHT)
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<0.8000, 1.4000, 0.1000>>), 0.738)
SET_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_RIGHT)
SET_VEHICLE_DAMAGE(veh, <<1.0000, 1.0000, 0.2000>>, 100.0, 100.0, TRUE)
ENDIF
ENDIF
IF NOT IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_LEFT)
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<-0.8000, -1.4000, 0.1000>>), 0.738)
SET_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_LEFT)
SET_VEHICLE_DAMAGE(veh, <<-1.0000, -1.0000, 0.2000>>, 100.0, 100.0, TRUE)
ENDIF
ENDIF
IF NOT IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_RIGHT)
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<0.8000, -1.5000, 0.1000>>), 0.738)
SET_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_RIGHT)
SET_VEHICLE_DAMAGE(veh, <<1.0000, -1.0000, 0.2000>>, 100.0, 100.0, TRUE)
ENDIF
ENDIF
IF NOT IS_VEHICLE_DOOR_DAMAGED(veh, SC_DOOR_FRONT_LEFT)
AND NOT IS_VEHICLE_DOOR_DAMAGED(veh, SC_DOOR_REAR_LEFT)
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<-0.8000, 0.0000, 0.1000>>), 0.538)
INT iDoorToBreak = GET_RANDOM_INT_IN_RANGE(0, 2)
IF iDoorToBreak = 0
SMASH_VEHICLE_WINDOW(veh, SC_WINDOW_FRONT_LEFT)
SET_VEHICLE_DOOR_BROKEN(veh, SC_DOOR_FRONT_LEFT, FALSE)
ELSE
SMASH_VEHICLE_WINDOW(veh, SC_WINDOW_REAR_LEFT)
SET_VEHICLE_DOOR_BROKEN(veh, SC_DOOR_REAR_LEFT, FALSE)
ENDIF
ENDIF
ENDIF
IF NOT IS_VEHICLE_DOOR_DAMAGED(veh, SC_DOOR_FRONT_RIGHT)
AND NOT IS_VEHICLE_DOOR_DAMAGED(veh, SC_DOOR_REAR_RIGHT)
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<0.8000, 0.0000, 0.1000>>), 0.538)
INT iDoorToBreak = GET_RANDOM_INT_IN_RANGE(0, 2)
IF iDoorToBreak = 0
SMASH_VEHICLE_WINDOW(veh, SC_WINDOW_FRONT_RIGHT)
SET_VEHICLE_DOOR_BROKEN(veh, SC_DOOR_FRONT_RIGHT, FALSE)
ELSE
SMASH_VEHICLE_WINDOW(veh, SC_WINDOW_REAR_RIGHT)
SET_VEHICLE_DOOR_BROKEN(veh, SC_DOOR_REAR_RIGHT, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC INT GET_NUM_FLANKING_ENEMIES_IN_PUSH_AREA()
INT i = 0
INT iNumEnemies = 0
REPEAT COUNT_OF(sNooseRope1) i
IF sNooseRope1[i].bIsCreated
IF NOT IS_PED_INJURED(sNooseRope1[i].ped)
iNumEnemies++
ENDIF
ELSE
iNumEnemies++
ENDIF
ENDREPEAT
/*REPEAT COUNT_OF(sNooseAbove) i
IF sNooseAbove[i].bIsCreated
IF NOT IS_PED_INJURED(sNooseAbove[i].ped)
iNumEnemies++
ENDIF
ELSE
iNumEnemies++
ENDIF
ENDREPEAT*/
REPEAT COUNT_OF(sVanFlank) i
IF sVanFlank[i].bIsCreated
IF NOT IS_PED_INJURED(sVanFlank[i].ped)
IF IS_ENTITY_IN_ANGLED_AREA(sVanFlank[i].ped, <<157.079086,-1204.959106,28.295168>>, <<128.503387,-1206.576416,40.295166>>, 32.000000)
iNumEnemies++
ENDIF
ENDIF
ELSE
iNumEnemies++
ENDIF
ENDREPEAT
RETURN iNumEnemies
ENDFUNC
PROC REMOVE_OBJECT(OBJECT_INDEX &obj, BOOL bForceDelete = FALSE)
IF DOES_ENTITY_EXIST(obj)
IF IS_ENTITY_ATTACHED(obj)
DETACH_ENTITY(obj)
ENDIF
IF bForceDelete
DELETE_OBJECT(obj)
ELSE
SET_OBJECT_AS_NO_LONGER_NEEDED(obj)
ENDIF
ENDIF
ENDPROC
PROC REMOVE_VEHICLE(VEHICLE_INDEX &veh, BOOL bForceDelete = FALSE)
IF DOES_ENTITY_EXIST(veh)
IF NOT IS_ENTITY_DEAD(veh)
IF IS_ENTITY_ATTACHED(veh)
DETACH_ENTITY(veh)
ENDIF
STOP_SYNCHRONIZED_ENTITY_ANIM(veh, NORMAL_BLEND_OUT, TRUE)
ENDIF
IF DOES_ENTITY_BELONG_TO_THIS_SCRIPT(veh, FALSE)
IF bForceDelete
DELETE_VEHICLE(veh)
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(veh)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC REMOVE_PED(PED_INDEX &ped, BOOL bForceDelete = FALSE)
IF DOES_ENTITY_EXIST(ped)
IF NOT IS_PED_INJURED(ped)
STOP_SYNCHRONIZED_ENTITY_ANIM(ped, NORMAL_BLEND_OUT, TRUE)
IF NOT IS_PED_IN_ANY_VEHICLE(ped, TRUE)
AND NOT IS_PED_GETTING_INTO_A_VEHICLE(ped)
IF IS_ENTITY_ATTACHED_TO_ANY_OBJECT(ped)
OR IS_ENTITY_ATTACHED_TO_ANY_PED(ped)
OR IS_ENTITY_ATTACHED_TO_ANY_VEHICLE(ped)
DETACH_ENTITY(ped)
ENDIF
FREEZE_ENTITY_POSITION(ped, FALSE)
ENDIF
IF NOT IS_PED_IN_ANY_VEHICLE(ped)
SET_ENTITY_COLLISION(ped, TRUE)
ENDIF
SET_PED_KEEP_TASK(ped, TRUE)
ENDIF
IF bForceDelete
DELETE_PED(ped)
ELSE
SET_PED_AS_NO_LONGER_NEEDED(ped)
ENDIF
ENDIF
ENDPROC
PROC REMOVE_ENEMY_GROUP(ENEMY_DATA &peds[], BOOL bForceDelete = FALSE)
INT i = 0
REPEAT COUNT_OF(peds) i
IF DOES_BLIP_EXIST(peds[i].blip)
REMOVE_BLIP(peds[i].blip)
ENDIF
CLEANUP_AI_PED_BLIP(peds[i].sBlipData)
REMOVE_COVER_POINT(peds[i].cover)
//Give them combat in most cases
IF NOT IS_PED_INJURED(peds[i].ped)
IF NOT IS_PED_IN_ANY_VEHICLE(peds[i].ped)
AND GET_PED_RELATIONSHIP_GROUP_HASH(peds[i].ped) = relGroupCops
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_COMBAT_PED(peds[i].ped, PLAYER_PED_ID())
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
TASK_COMBAT_PED(peds[i].ped, sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
TASK_COMBAT_PED(peds[i].ped, sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
TASK_COMBAT_PED(peds[i].ped, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
ENDIF
//SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[i].ped, TRUE)
SET_PED_KEEP_TASK(peds[i].ped, TRUE)
ENDIF
ENDIF
REMOVE_PED(peds[i].ped, bForceDelete)
peds[i].bIsCreated = FALSE
peds[i].iEvent = 0
peds[i].iRopeEvent = 0
peds[i].iTimer = 0
peds[i].cover = NULL
ENDREPEAT
ENDPROC
PROC SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(VEHICLE_INDEX &veh, FLOAT fTime)
IF NOT IS_ENTITY_DEAD(veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh, fTime - GET_TIME_POSITION_IN_RECORDING(veh))
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Converges a value towards a given destination, by adding/removing a given amount.
PROC CONVERGE_VALUE(FLOAT &val, FLOAT fDesiredVal, FLOAT fAmountToConverge, BOOL bAdjustForFramerate = FALSE)
IF val != fDesiredVal
FLOAT fConvergeAmountThisFrame = fAmountToConverge
IF bAdjustForFramerate
fConvergeAmountThisFrame = 0.0 +@ fAmountToConverge
ENDIF
IF val - fDesiredVal > fConvergeAmountThisFrame
val -= fConvergeAmountThisFrame
ELIF val - fDesiredVal < -fConvergeAmountThisFrame
val += fConvergeAmountThisFrame
ELSE
val = fDesiredVal
ENDIF
ENDIF
ENDPROC
PROC DO_FADE_OUT_WITH_WAIT(BOOL bHideHud = FALSE)
IF NOT IS_SCREEN_FADED_OUT()
IF NOT IS_SCREEN_FADING_OUT()
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_OUT()
IF bHideHud
HIDE_HUD_AND_RADAR_THIS_FRAME()
ENDIF
WAIT(0)
ENDWHILE
ENDIF
ENDPROC
PROC DO_FADE_IN_WITH_WAIT()
IF NOT IS_SCREEN_FADED_IN()
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_IN()
WAIT(0)
ENDWHILE
ENDIF
ENDPROC
PROC REMOVE_ALL_BLIPS()
IF DOES_BLIP_EXIST(blipCurrentObjective)
REMOVE_BLIP(blipCurrentObjective)
ENDIF
IF DOES_BLIP_EXIST(blipChaseChopper)
REMOVE_BLIP(blipChaseChopper)
ENDIF
INT i = 0
REPEAT COUNT_OF(sGoldCars) i
IF DOES_BLIP_EXIST(sGoldCars[i].blip)
REMOVE_BLIP(sGoldCars[i].blip)
ENDIF
ENDREPEAT
REPEAT COUNT_OF(sGoldVans) i
IF DOES_BLIP_EXIST(sGoldVans[i].blip)
REMOVE_BLIP(sGoldVans[i].blip)
ENDIF
ENDREPEAT
REPEAT COUNT_OF(sGoldVanPeds) i
IF DOES_BLIP_EXIST(sGoldVanPeds[i].blip)
REMOVE_BLIP(sGoldVanPeds[i].blip)
ENDIF
ENDREPEAT
REPEAT COUNT_OF(sCrew) i
IF DOES_BLIP_EXIST(sCrew[i].blip)
REMOVE_BLIP(sCrew[i].blip)
ENDIF
ENDREPEAT
IF DOES_BLIP_EXIST(sBankWorker.blip)
REMOVE_BLIP(sBankWorker.blip)
ENDIF
IF DOES_BLIP_EXIST(sTrevor.blip)
REMOVE_BLIP(sTrevor.blip)
ENDIF
IF DOES_BLIP_EXIST(sFranklin.blip)
REMOVE_BLIP(sFranklin.blip)
ENDIF
IF DOES_BLIP_EXIST(sMichael.blip)
REMOVE_BLIP(sMichael.blip)
ENDIF
ENDPROC
PROC REMOVE_ALL_OBJECTS(BOOL bForceDelete = FALSE)
INT i = 0
REPEAT COUNT_OF(objGoldTrolleys) i
REMOVE_OBJECT(objGoldTrolleys[i], bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(objEmptyTrolleys) i
REMOVE_OBJECT(objEmptyTrolleys[i], bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(objSecurityBarriers) i
REMOVE_OBJECT(objSecurityBarriers[i], bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(objSecurityGateCollision) i
REMOVE_OBJECT(objSecurityGateCollision[i], bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(objGoldBarsDriver) i
REMOVE_OBJECT(objGoldBarsDriver[i], bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(objGoldBarsGunman) i
REMOVE_OBJECT(objGoldBarsGunman[i], bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(objLaptops) i
REMOVE_OBJECT(objLaptops[i], bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(objMichaelsHouseDoors) i
REMOVE_OBJECT(objMichaelsHouseDoors[i], bForceDelete)
ENDREPEAT
REMOVE_OBJECT(objStinger, bForceDelete)
REMOVE_OBJECT(objMachineGun, bForceDelete)
REMOVE_OBJECT(objIDCard, bForceDelete)
REMOVE_OBJECT(objFakeVaultDoor, TRUE)
REMOVE_OBJECT(objWalkieTalkie, bForceDelete)
REMOVE_OBJECT(objBankWorkerWalkieTalkie, bForceDelete)
//REMOVE_OBJECT(objShootoutPallet, FALSE)
REMOVE_OBJECT(objShootoutCover, bForceDelete)
REMOVE_OBJECT(objBeer, bForceDelete)
REMOVE_OBJECT(objwalkingStick, bForceDelete)
REMOVE_OBJECT(objMichaelsWeapon, bForceDelete)
REMOVE_OBJECT(objTrevorsWeapon, bForceDelete)
REMOVE_OBJECT(objGunmansWeapon, bForceDelete)
REMOVE_OBJECT(objDriversWeapon, bForceDelete)
ENDPROC
PROC REMOVE_ALL_PEDS(BOOL bForceDelete = FALSE)
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], bForceDelete)
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], bForceDelete)
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], bForceDelete)
REMOVE_PED(sTrevor.ped, bForceDelete)
INT i = 0
REPEAT COUNT_OF(sGoldVanPeds) i
REMOVE_PED(sGoldVanPeds[i].ped, bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(sCrew) i
REMOVE_PED(sCrew[i].ped, bForceDelete)
ENDREPEAT
REMOVE_PED(sBankWorker.ped, bForceDelete)
REMOVE_PED(sVaultWorker.ped, bForceDelete)
REMOVE_PED(pedGateSecurity, bForceDelete)
REMOVE_ENEMY_GROUP(sCopsStart, bForceDelete)
REMOVE_ENEMY_GROUP(sCopsWave2, bForceDelete)
REMOVE_ENEMY_GROUP(sVanFlank, bForceDelete)
REMOVE_ENEMY_GROUP(sVanCrash, bForceDelete)
REMOVE_ENEMY_GROUP(sNooseRope1, bForceDelete)
REMOVE_ENEMY_GROUP(sNooseAbove, bForceDelete)
REMOVE_ENEMY_GROUP(sGoonsWave3b, bForceDelete)
REMOVE_ENEMY_GROUP(sGoonsSnipe, bForceDelete)
REMOVE_ENEMY_GROUP(sInfiniteEnemiesFront, bForceDelete)
REMOVE_ENEMY_GROUP(sInfiniteEnemiesFlank, bForceDelete)
REMOVE_ENEMY_GROUP(sChaseCopsBlockade, bForceDelete)
REMOVE_PED(pedGateSecurity, bForceDelete)
REMOVE_PED(pedHeliGunner, bForceDelete)
REMOVE_PED(pedLester, bForceDelete)
REPEAT COUNT_OF(pedChaseCops) i
REMOVE_PED(pedChaseCops[i], bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(sTrafficGameCops) i
REMOVE_PED(sTrafficGameCops[i].ped, bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(sTrafficGameCars) i
REMOVE_PED(sTrafficGameCars[i].ped, bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(pedEndCops) i
REMOVE_PED(pedEndCops[i], bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(pedChaseBlockade2) i
REMOVE_PED(pedChaseBlockade2[i], bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(pedChaseBlockadeMall) i
REMOVE_PED(pedChaseBlockadeMall[i], bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(pedHobos) i
REMOVE_PED(pedHobos[i], bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(sChaseCops) i
REMOVE_PED(sChaseCops[i].ped, bForceDelete)
ENDREPEAT
ENDPROC
PROC REMOVE_ALL_VEHICLES(BOOL bForceDelete = FALSE)
INT i = 0
REPEAT COUNT_OF(sGoldCars) i
REMOVE_VEHICLE(sGoldCars[i].veh, bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(sGoldVans) i
REMOVE_VEHICLE(sGoldVans[i].veh, bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(sTrafficGameCops) i
REMOVE_VEHICLE(sTrafficGameCops[i].veh, bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(sTrafficGameCops) i
REMOVE_VEHICLE(sTrafficGameCars[i].veh, bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(vehRampHackCars) i
REMOVE_VEHICLE(vehRampHackCars[i], TRUE)
ENDREPEAT
REPEAT COUNT_OF(vehChaseCopsBlockade) i
REMOVE_VEHICLE(vehChaseCopsBlockade[i], bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(vehChaseCops) i
REMOVE_VEHICLE(vehChaseCops[i], bForceDelete)
ENDREPEAT
REMOVE_VEHICLE(sGoldTruck.veh, bForceDelete)
REMOVE_VEHICLE(vehCopsStart[0], bForceDelete)
REMOVE_VEHICLE(vehCopsStart[1], bForceDelete)
REMOVE_VEHICLE(vehChaseTrigger, bForceDelete)
REMOVE_VEHICLE(vehTrailer[0], bForceDelete)
REMOVE_VEHICLE(vehTrailer[1], bForceDelete)
REMOVE_VEHICLE(vehFranklinsBike, bForceDelete)
REMOVE_VEHICLE(vehBuddyVan, bForceDelete)
REMOVE_VEHICLE(vehCopsWave2, bForceDelete)
REMOVE_VEHICLE(vehNooseWave1, bForceDelete)
REMOVE_VEHICLE(vehGoons3a, bForceDelete)
REMOVE_VEHICLE(vehGoons3b, bForceDelete)
REMOVE_VEHICLE(vehVanCrash, bForceDelete)
REMOVE_VEHICLE(vehNooseChopper1, bForceDelete)
REMOVE_VEHICLE(sStartCar.veh, bForceDelete)
REMOVE_VEHICLE(vehEndTrucks[0], bForceDelete)
REMOVE_VEHICLE(vehEndTrucks[1], bForceDelete)
REMOVE_VEHICLE(vehEndTrailers[0], bForceDelete)
REMOVE_VEHICLE(vehEndTrailers[1], bForceDelete)
REMOVE_VEHICLE(vehEndHeli, bForceDelete)
REMOVE_VEHICLE(vehTanker, bForceDelete)
REMOVE_VEHICLE(vehRampHackTruck, TRUE)
REMOVE_VEHICLE(vehPreMissionCar, FALSE)
REMOVE_VEHICLE(vehCamCar, FALSE)
REMOVE_VEHICLE(vehMichaelsCar, bForceDelete)
IF NOT IS_ENTITY_DEAD(vehTrain)
DELETE_MISSION_TRAIN(vehTrain)
ENDIF
ENDPROC
PROC REMOVE_ALL_CAMERAS()
IF DOES_CAM_EXIST(camMain)
DESTROY_CAM(camMain)
ENDIF
IF DOES_CAM_EXIST(camAttach)
DESTROY_CAM(camAttach)
ENDIF
IF DOES_CAM_EXIST(camInterp)
DESTROY_CAM(camInterp)
ENDIF
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
SET_WIDESCREEN_BORDERS(FALSE, 0)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDPROC
PROC REMOVE_ALL_ANIMS()
REMOVE_ANIM_DICT(strRappelAnims)
REMOVE_ANIM_DICT(strStingerAnims)
REMOVE_ANIM_DICT(strAnimIG1)
REMOVE_ANIM_DICT(strAnimIG2)
REMOVE_ANIM_DICT(strAnimIG3)
REMOVE_ANIM_DICT(strAnimIG5)
REMOVE_ANIM_DICT(strAnimIG6)
REMOVE_ANIM_DICT(strAnimIG7Driver)
REMOVE_ANIM_DICT(strAnimIG7Gunman)
REMOVE_ANIM_DICT(strVaultWorkerAnims)
REMOVE_ANIM_DICT(strManagerLeadOut)
REMOVE_ANIM_DICT(strAnimLiftLeadOut)
REMOVE_ANIM_DICT(strVanArriveCamAnim)
REMOVE_ANIM_DICT(strTrailerRampAnims)
REMOVE_ANIM_DICT(strAnimsHijack)
REMOVE_ANIM_DICT(strAnimsTrafficSwitch)
REMOVE_ANIM_DICT(strAnimsCamShake)
REMOVE_ANIM_DICT(strAnimsLesterLeadIn)
REMOVE_ANIM_DICT("map_objects")
ENDPROC
PROC REMOVE_ALL_AUDIO()
IF bTrafficGameAudioSceneActive
STOP_AUDIO_SCENE("BIG_SCORE_TRAFFIC_CONTROL_SCENE")
bTrafficGameAudioSceneActive = FALSE
ENDIF
IF bFranklinsBikeAudioSceneActive
STOP_AUDIO_SCENE("BIG_SCORE_2A_Boost_Franklins_Bike")
bFranklinsBikeAudioSceneActive = FALSE
ENDIF
STOP_STREAM()
IF NOT HAS_SOUND_FINISHED(sTrafficGame.iBackgroundSound)
STOP_SOUND(sTrafficGame.iBackgroundSound)
ENDIF
IF NOT HAS_SOUND_FINISHED(sTrafficGame.iStaticSound)
STOP_SOUND(sTrafficGame.iStaticSound)
ENDIF
IF NOT HAS_SOUND_FINISHED(sTrafficGame.iSelectSound)
STOP_SOUND(sTrafficGame.iSelectSound)
ENDIF
IF NOT HAS_SOUND_FINISHED(iLiftSoundID)
STOP_SOUND(iLiftSoundID)
ENDIF
IF NOT HAS_SOUND_FINISHED(iLiftMoveSoundID)
STOP_SOUND(iLiftMoveSoundID)
ENDIF
IF NOT HAS_SOUND_FINISHED(iBankGateOpenSound)
STOP_SOUND(iBankGateOpenSound)
ENDIF
IF NOT HAS_SOUND_FINISHED(iVaultDoorCloseSoundID)
STOP_SOUND(iVaultDoorCloseSoundID)
ENDIF
IF NOT HAS_SOUND_FINISHED(iVaultDoorOpenSoundID)
STOP_SOUND(iVaultDoorOpenSoundID)
ENDIF
IF NOT HAS_SOUND_FINISHED(iGoldTrolleySoundID[0])
STOP_SOUND(iGoldTrolleySoundID[0])
ENDIF
IF NOT HAS_SOUND_FINISHED(iGoldTrolleySoundID[1])
STOP_SOUND(iGoldTrolleySoundID[1])
ENDIF
IF NOT HAS_SOUND_FINISHED(iTrailerRampSounds[0])
STOP_SOUND(iTrailerRampSounds[0])
ENDIF
IF NOT HAS_SOUND_FINISHED(iTrailerRampSounds[1])
STOP_SOUND(iTrailerRampSounds[1])
ENDIF
IF NOT HAS_SOUND_FINISHED(iTrailerRampRaiseSounds[0])
STOP_SOUND(iTrailerRampRaiseSounds[0])
ENDIF
IF NOT HAS_SOUND_FINISHED(iTrailerRampRaiseSounds[1])
STOP_SOUND(iTrailerRampRaiseSounds[1])
ENDIF
IF NOT HAS_SOUND_FINISHED(iWooshSoundID)
STOP_SOUND(iWooshSoundID)
ENDIF
SET_AUDIO_FLAG("AllowScoreAndRadio", FALSE)
SET_USER_RADIO_CONTROL_ENABLED(TRUE)
IF NOT bMissionFailed //This will have already triggered in that case.
TRIGGER_MUSIC_EVENT("FH2A_MISSION_FAIL")
ENDIF
RELEASE_SCRIPT_AUDIO_BANK()
ENDPROC
PROC REMOVE_ALL_AUDIO_SCENES()
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_TUNNEL")
STOP_AUDIO_SCENE("BS_2A_GET_TO_TUNNEL")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_TRUCKS_ARRIVE")
STOP_AUDIO_SCENE("BS_2A_TRUCKS_ARRIVE")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_DROP_STINGER")
STOP_AUDIO_SCENE("BS_2A_DROP_STINGER")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_DRIVE_TO_BANK")
STOP_AUDIO_SCENE("BS_2A_DRIVE_TO_BANK")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_PARK_UP_CUTSCENE")
STOP_AUDIO_SCENE("BS_2A_PARK_UP_CUTSCENE")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_FOLLOW_MANAGER")
STOP_AUDIO_SCENE("BS_2A_FOLLOW_MANAGER")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_LEAVE_BANK")
STOP_AUDIO_SCENE("BS_2A_LEAVE_BANK")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_TRAFFIC_CONTROL_STAGE")
STOP_AUDIO_SCENE("BS_2A_TRAFFIC_CONTROL_STAGE")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_INTERSECTION_CAM")
STOP_AUDIO_SCENE("BS_2A_INTERSECTION_CAM")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_SHOOTOUT")
STOP_AUDIO_SCENE("BS_2A_SHOOTOUT")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_01")
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_01")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_02")
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_02")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_03")
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_03")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_04")
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_04")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CHASE_MAIN")
STOP_AUDIO_SCENE("BS_2A_CHASE_MAIN")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_STUNT_JUMP")
STOP_AUDIO_SCENE("BS_2A_STUNT_JUMP")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_DRIVE_INTO_TRUCK")
STOP_AUDIO_SCENE("BS_2A_DRIVE_INTO_TRUCK")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_VAULT")
STOP_AUDIO_SCENE("BS_2A_GET_TO_VAULT")
ENDIF
ENDPROC
/// Cancels any music events from this mission that may
PROC CANCEL_ALL_PREPARED_MUSIC_EVENTS()
CANCEL_MUSIC_EVENT("FH2A_MISSION_START_ST")
CANCEL_MUSIC_EVENT("FH2A_MISSION_START_OS")
CANCEL_MUSIC_EVENT("FH2A_ENTER_BANK_MA")
CANCEL_MUSIC_EVENT("FH2A_BANK_MID")
CANCEL_MUSIC_EVENT("FH2A_LEAVE_BANK_MA")
CANCEL_MUSIC_EVENT("FH2A_TRAFFIC_START")
CANCEL_MUSIC_EVENT("FH2A_FIGHT_MID")
CANCEL_MUSIC_EVENT("FH2A_FIGHT_DROP")
CANCEL_MUSIC_EVENT("FH2A_GETAWAY_DRIVE_MA")
CANCEL_MUSIC_EVENT("FH2A_JUMP_START")
CANCEL_MUSIC_EVENT("FH2A_ENTER_TRUCK")
ENDPROC
PROC DISPLAY_TAKE()
IF iDisplayedTake != iCurrentTake
//IF HAS_SOUND_FINISHED(iMoneyCountSoundID)
// PLAY_SOUND_FRONTEND(iMoneyCountSoundID, "ROBBERY_MONEY_TOTAL", "HUD_FRONTEND_CUSTOM_SOUNDSET")
//ENDIF
IF iDisplayedTake > iCurrentTake
iDisplayedTake = iDisplayedTake - ROUND(0 +@ 3750000)
IF iDisplayedTake < iCurrentTake
iDisplayedTake = iCurrentTake
ENDIF
ELSE
iDisplayedTake = iDisplayedTake + ROUND(0 +@ 3750000)
IF iDisplayedTake > iCurrentTake
iDisplayedTake = iCurrentTake
ENDIF
ENDIF
ELSE
//IF NOT HAS_SOUND_FINISHED(iMoneyCountSoundID)
// STOP_SOUND(iMoneyCountSoundID)
//ENDIF
ENDIF
//SET_FAR_RIGHT_TITLE_POSITION_HUD_THIS_FRAME()
MPGlobalsScoreHud.bTitleExtraLeftJustified = TRUE
IF iDisplayedTake > iCurrentTake
DRAW_GENERIC_SCORE(iDisplayedTake, "CMN_TAKE", HEIST_TAKE_DISPLAY_FLASH_TIME, HUD_COLOUR_RED, HUDORDER_DONTCARE, FALSE, "HUD_CASH", FALSE, 0.0, HUDFLASHING_FLASHWHITE, 250)
ELSE
DRAW_GENERIC_SCORE(iDisplayedTake, "CMN_TAKE", HEIST_TAKE_DISPLAY_FLASH_TIME, HUD_COLOUR_GREEN, HUDORDER_DONTCARE, FALSE, "HUD_CASH", FALSE, 0.0, HUDFLASHING_FLASHWHITE, 250)
ENDIF
ENDPROC
///NOTE: this is bad as it relies on global values, it's not obvious that these are calculated beforehand.
FUNC INT CONVERT_SHOOTOUT_PROGRESS_INTO_TAKE(INT iMaxTake)
INT iAliveEnemies = iNumAliveCopsStart
iAliveEnemies += iNumAliveCopsWave2
iAliveEnemies += iNumAliveVanFlank
iAliveEnemies += iNumAliveVanCrash
iAliveEnemies += iNumAliveNooseRope1
//iAliveEnemies += iNumAliveNooseAbove
iAliveEnemies += iNumAliveGoonsWave3b
RETURN ROUND((TO_FLOAT(iMaxTake) / TO_FLOAT(iTotalEnemiesInShootout)) * TO_FLOAT(iTotalEnemiesInShootout - iAliveEnemies))
ENDFUNC
FUNC BOOL IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(PED_INDEX ped)
IF NOT IS_PED_RAGDOLL(ped)
AND NOT IS_PED_GETTING_UP(ped)
AND NOT IS_PED_IN_COMBAT(ped)
AND NOT IS_PED_RELOADING(ped)
AND IS_PED_WEAPON_READY_TO_SHOOT(ped)
WEAPON_TYPE eCurrentWeapon
WEAPON_GROUP eCurrentGroup
GET_CURRENT_PED_WEAPON(ped, eCurrentWeapon)
eCurrentGroup = GET_WEAPONTYPE_GROUP(eCurrentWeapon)
IF eCurrentGroup != WEAPONGROUP_MELEE
AND eCurrentGroup != WEAPONGROUP_INVALID
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
///Used during the chase end cutscene: creates a random car.
PROC CREATE_RANDOM_CAR_AT_POS(MODEL_NAMES model, VECTOR vPos, FLOAT fHeading)
IF CAN_CREATE_RANDOM_DRIVER()
VEHICLE_INDEX vehRandom
PED_INDEX pedRandom
CLEAR_AREA(vPos, 2.0, TRUE)
vehRandom = CREATE_VEHICLE(model, vPos, fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(vehRandom)
pedRandom = CREATE_RANDOM_PED_AS_DRIVER(vehRandom)
TASK_VEHICLE_MISSION(pedRandom, vehRandom, NULL, MISSION_CRUISE, 15.0, DRIVINGMODE_STOPFORCARS, 5.0, 5.0)
SET_PED_KEEP_TASK(pedRandom, TRUE)
SET_VEHICLE_FORWARD_SPEED(vehRandom, 15.0)
SET_PED_AS_NO_LONGER_NEEDED(pedRandom)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehRandom)
ENDIF
ENDPROC
//Manage Franklin: he drives off and is deleted once out of view.
PROC UPDATE_FRANKLIN_ON_BIKE()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
IF DOES_ENTITY_EXIST(vehFranklinsBike)
AND IS_VEHICLE_DRIVEABLE(vehFranklinsBike)
//SEQUENCE_INDEX seq
IF NOT bPlayedFranklinsBikeRevSound
SET_VEHICLE_STARTUP_REV_SOUND(vehFranklinsBike, "Franklin_Bike_Rev", "BIG_SCORE_3A_SOUNDS")
bPlayedFranklinsBikeRevSound = TRUE
ENDIF
IF NOT bFranklinsBikeAudioSceneActive
START_AUDIO_SCENE("BIG_SCORE_2A_Boost_Franklins_Bike")
bFranklinsBikeAudioSceneActive = TRUE
ENDIF
IF NOT IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], vehFranklinsBike)
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
TASK_ENTER_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], vehFranklinsBike, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
ENDIF
ELSE
IF IS_PED_SITTING_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], vehFranklinsBike)
IF VDIST2(<<661.1089, -231.6551, 42.6443>>, GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])) < 25.0
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_VEHICLE_DRIVE_WANDER) != PERFORMING_TASK
TASK_VEHICLE_DRIVE_WANDER(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], vehFranklinsBike, 30.0, DRIVINGMODE_AVOIDCARS)
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_VEHICLE_DRIVE_TO_COORD) != PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
TASK_PAUSE(NULL, 1700)
TASK_VEHICLE_DRIVE_TO_COORD(NULL, vehFranklinsBike, <<661.1089, -231.6551, 42.6443>>, 30.0, DRIVINGSTYLE_NORMAL,
GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_BIKE), DRIVINGMODE_AVOIDCARS, 3.0, 3.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDIF
ENDIF
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])) > 2500.0
IF NOT IS_ENTITY_ON_SCREEN(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
DELETE_VEHICLE(vehFranklinsBike)
ENDIF
ENDIF
ENDIF
ELSE
//The bike was destroyed: the mission will eventually fail so just have Franklin flee.
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_SMART_FLEE_POINT) != PERFORMING_TASK
TASK_SMART_FLEE_COORD(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], GET_ENTITY_COORDS(PLAYER_PED_ID()), 200.0, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
ENDIF
ENDIF
ENDIF
ENDPROC
///Handles the idle synchronised scenes for the bank security: randomly plays from a number of possible anims.
PROC UPDATE_SECURITY_GUARD_IDLES()
IF NOT IS_PED_INJURED(pedGateSecurity)
REQUEST_ANIM_DICT(strAnimIG1)
IF HAS_ANIM_DICT_LOADED(strAnimIG1)
//VECTOR vScenePos = <<-72.327, -677.107, 32.747>>
//VECTOR vSceneRot = <<-0.000, -0.000, -113.414>>
IF NOT IS_PED_RAGDOLL(pedGateSecurity)
TEXT_LABEL strCurrentAnim = ""
IF IS_ENTITY_PLAYING_ANIM(pedGateSecurity, strAnimIG1, "Wait_Gate_A")
strCurrentAnim = "Wait_Gate_A"
ELIF IS_ENTITY_PLAYING_ANIM(pedGateSecurity, strAnimIG1, "Wait_Gate_B")
strCurrentAnim = "Wait_Gate_B"
ELIF IS_ENTITY_PLAYING_ANIM(pedGateSecurity, strAnimIG1, "Wait_Gate_C")
strCurrentAnim = "Wait_Gate_C"
ELIF IS_ENTITY_PLAYING_ANIM(pedGateSecurity, strAnimIG1, "Wait_Gate_D")
strCurrentAnim = "Wait_Gate_D"
ENDIF
IF IS_STRING_NULL_OR_EMPTY(strCurrentAnim)
OR (IS_ENTITY_PLAYING_ANIM(pedGateSecurity, strAnimIG1, strCurrentAnim) AND GET_ENTITY_ANIM_CURRENT_TIME(pedGateSecurity, strAnimIG1, strCurrentAnim) > 0.99)
INT iRandom = GET_RANDOM_INT_IN_RANGE(0, 4)
IF iRandom = 0
TASK_PLAY_ANIM(pedGateSecurity, strAnimIG1, "Wait_Gate_A", DEFAULT, DEFAULT, DEFAULT, AF_USE_KINEMATIC_PHYSICS)
ELIF iRandom = 1
TASK_PLAY_ANIM(pedGateSecurity, strAnimIG1, "Wait_Gate_B", DEFAULT, DEFAULT, DEFAULT, AF_USE_KINEMATIC_PHYSICS)
ELIF iRandom = 2
TASK_PLAY_ANIM(pedGateSecurity, strAnimIG1, "Wait_Gate_C", DEFAULT, DEFAULT, DEFAULT, AF_USE_KINEMATIC_PHYSICS)
ELSE
TASK_PLAY_ANIM(pedGateSecurity, strAnimIG1, "Wait_Gate_D", DEFAULT, DEFAULT, DEFAULT, AF_USE_KINEMATIC_PHYSICS)
ENDIF
ENDIF
/*IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneSecurityWait)
OR (IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneSecurityWait) AND GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneSecurityWait) > 0.99)
INT iRandom = GET_RANDOM_INT_IN_RANGE(0, 4)
iSyncSceneSecurityWait = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
IF iRandom = 0
TASK_SYNCHRONIZED_SCENE(pedGateSecurity, iSyncSceneSecurityWait, strAnimIG1, "Wait_Gate_A", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
ELIF iRandom = 1
TASK_SYNCHRONIZED_SCENE(pedGateSecurity, iSyncSceneSecurityWait, strAnimIG1, "Wait_Gate_B", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
ELIF iRandom = 2
TASK_SYNCHRONIZED_SCENE(pedGateSecurity, iSyncSceneSecurityWait, strAnimIG1, "Wait_Gate_C", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
ELSE
TASK_SYNCHRONIZED_SCENE(pedGateSecurity, iSyncSceneSecurityWait, strAnimIG1, "Wait_Gate_D", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
ENDIF
ENDIF*/
ENDIF
ENDIF
ENDIF
ENDPROC
PROC UPDATE_BANK_EMPLOYEE_IDLES()
IF NOT IS_PED_INJURED(sBankWorker.ped)
AND NOT IS_PED_RAGDOLL(sBankWorker.ped)
REQUEST_ANIM_DICT(strAnimIG3)
IF HAS_ANIM_DICT_LOADED(strAnimIG3)
IF NOT IS_ENTITY_PLAYING_ANIM(sBankWorker.ped, strAnimIG3, "Wait_For_Van_Base")
IF NOT IS_ENTITY_PLAYING_ANIM(sBankWorker.ped, strAnimIG3, "Wait_For_Van_A")
AND NOT IS_ENTITY_PLAYING_ANIM(sBankWorker.ped, strAnimIG3, "Wait_For_Van_B")
AND NOT IS_ENTITY_PLAYING_ANIM(sBankWorker.ped, strAnimIG3, "Wait_For_Van_C")
//Worker isn't playing any anim, so play the idle.
TASK_PLAY_ANIM(sBankWorker.ped, strAnimIG3, "Wait_For_Van_Base", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
iBankWorkerIdleTimer = 0
ENDIF
ELSE
IF eMissionStage = STAGE_DRIVE_TO_BANK //Only play the variations when the player hasn't arrived yet.
IF iBankWorkerIdleTimer = 0
iBankWorkerIdleTimer = GET_GAME_TIMER() + (GET_RANDOM_INT_IN_RANGE(12000, 15000))
ELIF GET_GAME_TIMER() - iBankWorkerIdleTimer > 0
SEQUENCE_INDEX seq
INT iRandom = GET_RANDOM_INT_IN_RANGE(0, 3)
OPEN_SEQUENCE_TASK(seq)
IF iRandom = 0
TASK_PLAY_ANIM(NULL, strAnimIG3, "Wait_For_Van_A", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1)
ELIF iRandom = 1
TASK_PLAY_ANIM(NULL, strAnimIG3, "Wait_For_Van_B", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1)
ELSE
TASK_PLAY_ANIM(NULL, strAnimIG3, "Wait_For_Van_C", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1)
ENDIF
TASK_PLAY_ANIM(NULL, strAnimIG3, "Wait_For_Van_Base", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
CLEAR_SEQUENCE_TASK(seq)
iBankWorkerIdleTimer = 0
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC UPDATE_VAULT_WORKER_IDLES(BOOL bPlayInstantly = FALSE)
IF NOT IS_PED_INJURED(sVaultWorker.ped)
AND NOT IS_PED_RAGDOLL(sVaultWorker.ped)
REQUEST_ANIM_DICT(strVaultWorkerAnims)
IF HAS_ANIM_DICT_LOADED(strVaultWorkerAnims)
BOOL bPlayAnim = FALSE
IF NOT IS_ENTITY_PLAYING_ANIM(sVaultWorker.ped, strVaultWorkerAnims, "wait_idle_a")
AND NOT IS_ENTITY_PLAYING_ANIM(sVaultWorker.ped, strVaultWorkerAnims, "wait_idle_b")
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iVaultWorkerSyncScene)
bPlayAnim = TRUE
ENDIF
ELSE
IF IS_ENTITY_PLAYING_ANIM(sVaultWorker.ped, strVaultWorkerAnims, "wait_idle_a")
IF GET_ENTITY_ANIM_CURRENT_TIME(sVaultWorker.ped, strVaultWorkerAnims, "wait_idle_a") > 0.99
bPlayAnim = TRUE
ENDIF
ELSE IS_ENTITY_PLAYING_ANIM(sVaultWorker.ped, strVaultWorkerAnims, "wait_idle_b")
IF GET_ENTITY_ANIM_CURRENT_TIME(sVaultWorker.ped, strVaultWorkerAnims, "wait_idle_b") > 0.99
bPlayAnim = TRUE
ENDIF
ENDIF
ENDIF
IF bPlayAnim
INT iRandom = GET_RANDOM_INT_IN_RANGE(0, 2)
FLOAT fBlendInTime = NORMAL_BLEND_IN
IF bPlayInstantly
fBlendInTime = INSTANT_BLEND_IN
ENDIF
IF iRandom = 0
TASK_PLAY_ANIM(sVaultWorker.ped, strVaultWorkerAnims, "wait_idle_a", fBlendInTime, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
ELIF iRandom = 1
TASK_PLAY_ANIM(sVaultWorker.ped, strVaultWorkerAnims, "wait_idle_b", fBlendInTime, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
ENDIF
IF bPlayInstantly
FORCE_PED_AI_AND_ANIMATION_UPDATE(sVaultWorker.ped)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Performs a given action on a pair of lift doors.
FUNC BOOL PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_ACTION eAction, VECTOR vLeftDoor, VECTOR vRightDoor, MODEL_NAMES modelDoor, BOOL bPlaySound = TRUE)
BOOL bLockState
SWITCH eAction
CASE LIFT_DOOR_INSTANT_CLOSE
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelDoor, vLeftDoor, TRUE, 0.0, 0.0, 0.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelDoor, vRightDoor, TRUE, 0.0, 0.0, 0.0)
RETURN TRUE
BREAK
CASE LIFT_DOOR_INSTANT_OPEN
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelDoor, vLeftDoor, TRUE, 0.0, 0.0, -1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelDoor, vRightDoor, TRUE, 0.0, 0.0, -1.0)
RETURN TRUE
BREAK
CASE LIFT_DOOR_UNLOCK
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vLeftDoor, 2.0, modelDoor)
GET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vLeftDoor, bLockState, fLiftOpenRatio)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vLeftDoor, FALSE, fLiftOpenRatio)
ENDIF
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vRightDoor, 2.0, modelDoor)
GET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vRightDoor, bLockState, fLiftOpenRatio)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vRightDoor, FALSE, fLiftOpenRatio)
ENDIF
RETURN TRUE
BREAK
CASE LIFT_DOOR_WAIT_FOR_OPEN_THEN_LOCK
IF iLiftDoorIndex = 0
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vLeftDoor, 2.0, modelDoor)
GET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vLeftDoor, bLockState, fLiftOpenRatio)
IF fLiftOpenRatio < -0.99
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vLeftDoor, TRUE, -1.0)
fLiftOpenRatio = -1.0
ENDIF
ENDIF
iLiftDoorIndex = 1
ELSE
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vRightDoor, 2.0, modelDoor)
GET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vRightDoor, bLockState, fLiftOpenRatio)
IF fLiftOpenRatio < -0.99
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vRightDoor, TRUE, -1.0)
fLiftOpenRatio = -1.0
ENDIF
ENDIF
iLiftDoorIndex = 0
ENDIF
IF bPlaySound
IF NOT bPlayedLiftSound
IF fLiftOpenRatio < 0.0
PLAY_SOUND_FROM_COORD(iLiftSoundID, "FREIGHT_ELEVATOR_01_DOOR_OPEN", vLeftDoor)
bPlayedLiftSound = TRUE
ENDIF
ENDIF
ENDIF
IF fLiftOpenRatio = -1.0
IF NOT HAS_SOUND_FINISHED(iLiftSoundID)
STOP_SOUND(iLiftSoundID)
ENDIF
RETURN TRUE
ENDIF
BREAK
CASE LIFT_DOOR_CLOSE
fLiftOpenRatio = fLiftOpenRatio -@ 0.6
IF fLiftOpenRatio < 0.0
fLiftOpenRatio = 0.0
ENDIF
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vLeftDoor, 2.0, modelDoor)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vLeftDoor, TRUE, -fLiftOpenRatio)
ENDIF
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vRightDoor, 2.0, modelDoor)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vRightDoor, TRUE, -fLiftOpenRatio)
ENDIF
IF bPlaySound
IF NOT bPlayedLiftSound
PLAY_SOUND_FROM_COORD(iLiftSoundID, "FREIGHT_ELEVATOR_01_DOOR_CLOSE", vLeftDoor)
bPlayedLiftSound = TRUE
ENDIF
ENDIF
IF fLiftOpenRatio = 0.0
IF NOT HAS_SOUND_FINISHED(iLiftSoundID)
STOP_SOUND(iLiftSoundID)
ENDIF
RETURN TRUE
ENDIF
BREAK
CASE LIFT_DOOR_OPEN
fLiftOpenRatio = fLiftOpenRatio -@ 0.6
IF fLiftOpenRatio < -1.0
fLiftOpenRatio = -1.0
ENDIF
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vLeftDoor, 2.0, modelDoor)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vLeftDoor, TRUE, fLiftOpenRatio)
ENDIF
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vRightDoor, 2.0, modelDoor)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vRightDoor, TRUE, fLiftOpenRatio)
ENDIF
IF bPlaySound
IF NOT bPlayedLiftSound
PLAY_SOUND_FROM_COORD(iLiftSoundID, "FREIGHT_ELEVATOR_01_DOOR_OPEN", vLeftDoor)
bPlayedLiftSound = TRUE
ENDIF
ENDIF
IF fLiftOpenRatio = -1.0
IF NOT HAS_SOUND_FINISHED(iLiftSoundID)
STOP_SOUND(iLiftSoundID)
ENDIF
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC CLOSE_TUNNEL_PAVEMENTS(BOOL bClose)
IF bClose
SET_PED_PATHS_IN_AREA(<<282.5752, -675.0562, 20.0>>, <<347.5317, -630.0744, 35.0>>, FALSE)
SET_PED_NON_CREATION_AREA(<<282.5752, -675.0562, 20.0>>, <<347.5317, -630.0744, 35.0>>)
ELSE
SET_PED_PATHS_BACK_TO_ORIGINAL(<<282.5752, -675.0562, 20.0>>, <<347.5317, -630.0744, 35.0>>)
CLEAR_PED_NON_CREATION_AREA()
ENDIF
ENDPROC
PROC BLOCK_PAVEMENTS_AT_BANK_EXIT(BOOL bBlock)
IF bBlock
SET_PED_PATHS_IN_AREA(<<60.833741,-645.605237,20.206173>>, <<78.287971,-607.055603,38.206173>>, FALSE)
SET_PED_NON_CREATION_AREA(<<62.4439, -640.2803, 20.3515>>, <<78.287971,-607.055603,38.206173>>)
ELSE
SET_PED_PATHS_BACK_TO_ORIGINAL(<<60.833741,-645.605237,20.206173>>, <<78.287971,-607.055603,38.206173>>)
CLEAR_PED_NON_CREATION_AREA()
ENDIF
ENDPROC
PROC BLOCK_PEDS_SPAWNING_AT_UNDERPASS(BOOL bBlock)
IF bBlock
SET_PED_NON_CREATION_AREA(<<117.149620,-1249.347412,0.829775>>, <<207.030228,-1164.563599,36.811390>>)
IF sbiUnderpass = NULL
sbiUnderpass = ADD_SCENARIO_BLOCKING_AREA(<<117.149620,-1249.347412,0.829775>>, <<207.030228,-1164.563599,36.811390>>)
ENDIF
ELSE
CLEAR_PED_NON_CREATION_AREA()
IF sbiUnderpass != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbiUnderpass)
sbiUnderpass = NULL
ENDIF
ENDIF
ENDPROC
//Blocks some key areas of peds, to help with streaming/framerate.
PROC BLOCK_PEDS_DURING_CHASE(BOOL bBlock)
IF bBlock
IF sbiChase[0] = NULL
sbiChase[0] = ADD_SCENARIO_BLOCKING_AREA(<<-3.9866, -1371.4302, 0.0134>>, <<591.0969, -405.0642, 500.5134>>)
ENDIF
IF sbiChase[1] = NULL
sbiChase[1] = ADD_SCENARIO_BLOCKING_AREA(<<-2241.8862, -882.5413, 0.2256>>, <<-94.8870, 652.3632, 500.2256>>)
ENDIF
ELSE
IF sbiChase[0] != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbiChase[0])
sbiChase[0] = NULL
ENDIF
IF sbiChase[1] != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbiChase[1])
sbiChase[1] = NULL
ENDIF
ENDIF
ENDPROC
PROC BLOCK_PEDS_AT_DROP_OFF(BOOL bBlock)
IF bBlock
SET_PED_NON_CREATION_AREA(<<172.7488, 2772.6792, 30.3079>>, <<224.8802, 2816.3293, 62.3079>>)
IF sbiDropOffPoint = NULL
sbiDropOffPoint = ADD_SCENARIO_BLOCKING_AREA(<<172.7488, 2772.6792, 30.3079>>, <<224.8802, 2816.3293, 62.3079>>)
ENDIF
ELSE
CLEAR_PED_NON_CREATION_AREA()
IF sbiDropOffPoint != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbiDropOffPoint)
sbiDropOffPoint = NULL
ENDIF
ENDIF
ENDPROC
PROC SET_ALL_CLOTHES_SHOPS_DISABLED(BOOL bDisable)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_H_01_BH, bDisable)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_H_02_B, bDisable)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_H_03_MW, bDisable)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_01_SC, bDisable)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_02_GS, bDisable)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_03_DT, bDisable)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_04_CS, bDisable)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_05_GSD, bDisable)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_06_VC, bDisable)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_07_PB, bDisable)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_M_01_SM, bDisable)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_M_03_H, bDisable)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_M_04_HW, bDisable)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_M_05_GOH, bDisable)
ENDPROC
PROC RUBBER_BAND_WALKING_PED(PED_INDEX &ped, FLOAT fDefaultValue = 1.0, FLOAT fIdealDist = 2.0, FLOAT fMaxDist = 6.0)
IF NOT IS_PED_INJURED(ped)
VECTOR vPedPos = GET_ENTITY_COORDS(ped)
FLOAT fDist = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), vPedPos)
FLOAT fNewSpeed = 1.0
IF fDist > fIdealDist
IF fDist > fMaxDist
fDist = fMaxDist
ENDIF
//NOTE: currently it assumes that the player can never get in fron of the walking ped, this should be the case for this mission.
fNewSpeed = fDefaultValue * (1.0 - (((fDist - fIdealDist) / (fMaxDist - fIdealDist)) * 0.2))
IF fNewSpeed > 1.15
fNewSpeed = 1.15
ENDIF
SET_PED_MOVE_RATE_OVERRIDE(ped, fNewSpeed)
ENDIF
ENDIF
ENDPROC
///Checks the three player chars and makes sure they're assigned the correct speakers in dialogue. This is useful for when switches occur, as these
///make current speaker peds invalid.
PROC REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF sConversationPeds.PedInfo[0].Index != sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "MICHAEL")
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
IF sConversationPeds.PedInfo[1].Index != sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "FRANKLIN")
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF sConversationPeds.PedInfo[2].Index != sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
ADD_PED_FOR_DIALOGUE(sConversationPeds, 2, sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "TREVOR")
ENDIF
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF sConversationPeds.PedInfo[0].Index != PLAYER_PED_ID()
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, PLAYER_PED_ID(), "MICHAEL")
ENDIF
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
IF sConversationPeds.PedInfo[1].Index != PLAYER_PED_ID()
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, PLAYER_PED_ID(), "FRANKLIN")
ENDIF
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF sConversationPeds.PedInfo[2].Index != PLAYER_PED_ID()
ADD_PED_FOR_DIALOGUE(sConversationPeds, 2, PLAYER_PED_ID(), "TREVOR")
ENDIF
ENDIF
ENDPROC
///Creates a gunman conversation: each conversation in D* contains a postfix referring to which specific gunman speaks the line.
FUNC BOOL CREATE_GUNMAN_CONVERSATION(INT iGunmanID, PED_INDEX pedGunman, structPedsForConversation &sConvData, STRING strTextBlock, STRING strConvRootWithoutPostfix,
enumConversationPriority ePriority = CONV_PRIORITY_MEDIUM, enumSubtitlesState eSubtitles = DISPLAY_SUBTITLES)
TEXT_LABEL strConvRoot = strConvRootWithoutPostfix
TEXT_LABEL strCrewVoiceName = ""
CrewMember eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, iGunmanID)
SWITCH eCrewID
CASE CM_GUNMAN_G_GUSTAV
strConvRoot += "_GM"
strCrewVoiceName = "GUSTAVO"
BREAK
CASE CM_GUNMAN_G_KARL
strConvRoot += "_KA"
strCrewVoiceName = "KARL"
BREAK
CASE CM_GUNMAN_G_PACKIE_UNLOCK
strConvRoot += "_PM"
strCrewVoiceName = "PACKIE"
BREAK
CASE CM_GUNMAN_G_CHEF_UNLOCK
strConvRoot += "_CH"
strCrewVoiceName = "CHEF"
BREAK
CASE CM_GUNMAN_M_HUGH
strConvRoot += "_HW"
strCrewVoiceName = "HUGH"
BREAK
CASE CM_GUNMAN_B_NORM
strConvRoot += "_NR"
strCrewVoiceName = "NORM"
BREAK
CASE CM_GUNMAN_B_DARYL
strConvRoot += "_DJ"
strCrewVoiceName = "DARYL"
BREAK
ENDSWITCH
IF NOT IS_STRING_NULL_OR_EMPTY(strCrewVoiceName)
TEXT_LABEL strRandomRoot = strConvRoot
strRandomRoot += "_01"
TEXT_LABEL strNonRandomRoot = strConvRoot
strNonRandomRoot += "_1"
IF DOES_TEXT_LABEL_EXIST(strRandomRoot)
OR DOES_TEXT_LABEL_EXIST(strNonRandomRoot)
IF NOT IS_PED_INJURED(pedGunman)
IF VDIST2(GET_ENTITY_COORDS(pedGunman), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 3600.0
ADD_PED_FOR_DIALOGUE(sConvData, 4, pedGunman, strCrewVoiceName)
ELSE
ADD_PED_FOR_DIALOGUE(sConvData, 4, NULL, strCrewVoiceName)
ENDIF
ELSE
ADD_PED_FOR_DIALOGUE(sConvData, 4, NULL, strCrewVoiceName)
ENDIF
IF CREATE_CONVERSATION(sConvData, strTextBlock, strConvRoot, ePriority, eSubtitles)
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CREATE_DRIVER_CONVERSATION(INT iDriverID, PED_INDEX pedDriver, structPedsForConversation &sConvData, STRING strTextBlock, STRING strConvRootWithoutPostfix,
enumConversationPriority ePriority = CONV_PRIORITY_MEDIUM, enumSubtitlesState eSubtitles = DISPLAY_SUBTITLES)
TEXT_LABEL strConvRoot = strConvRootWithoutPostfix
TEXT_LABEL strCrewVoiceName = ""
CrewMember eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, iDriverID)
SWITCH eCrewID
CASE CM_DRIVER_G_EDDIE
strConvRoot += "_ET"
strCrewVoiceName = "EDDIE"
BREAK
CASE CM_DRIVER_G_TALINA_UNLOCK
strConvRoot += "_TM"
strCrewVoiceName = "TALINA"
BREAK
CASE CM_DRIVER_B_KARIM
strConvRoot += "_KD"
strCrewVoiceName = "KARIM"
BREAK
ENDSWITCH
IF NOT IS_STRING_NULL_OR_EMPTY(strCrewVoiceName)
TEXT_LABEL strRandomRoot = strConvRoot
strRandomRoot += "_01"
TEXT_LABEL strNonRandomRoot = strConvRoot
strNonRandomRoot += "_1"
IF DOES_TEXT_LABEL_EXIST(strRandomRoot)
OR DOES_TEXT_LABEL_EXIST(strNonRandomRoot)
IF NOT IS_PED_INJURED(pedDriver)
IF VDIST2(GET_ENTITY_COORDS(pedDriver), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 3600.0
ADD_PED_FOR_DIALOGUE(sConvData, 4, pedDriver, strCrewVoiceName)
ELSE
ADD_PED_FOR_DIALOGUE(sConvData, 4, NULL, strCrewVoiceName)
ENDIF
ELSE
ADD_PED_FOR_DIALOGUE(sConvData, 4, NULL, strCrewVoiceName)
ENDIF
IF CREATE_CONVERSATION(sConvData, strTextBlock, strConvRoot, ePriority, eSubtitles)
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Wrapper for a number of checks during the missions stages inside the bank. If the player does anything suspicious during these stages
/// the bank workers are spooked and the mission fails.
/// RETURNS:
/// BOOL indicating if the player triggered one of the checks.
FUNC BOOL IS_PLAYER_ACTING_SUSPICIOUS_IN_BANK()
BOOL bHasSpooked = FALSE
IF NOT IS_PED_INJURED(sVaultWorker.ped)
IF (IS_PED_RAGDOLL(sVaultWorker.ped) OR HAS_PED_RECEIVED_EVENT(sVaultWorker.ped, EVENT_PED_COLLISION_WITH_PLAYER) OR IS_PED_RESPONDING_TO_EVENT(sVaultWorker.ped, EVENT_PED_COLLISION_WITH_PLAYER))
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sVaultWorker.ped)) < 9.0
bHasSpooked = TRUE
ENDIF
ENDIF
//Fail for any explosions or bullets fired.
BOOL bPlayerCausedExplosion = FALSE
ENTITY_INDEX entityExplosion = GET_OWNER_OF_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, <<-106.440224,-635.586426,25.639248>>, <<49.404850,-692.630066,66.712708>>, 120.750000)
IF NOT IS_ENTITY_DEAD(entityExplosion)
IF IS_ENTITY_A_PED(entityExplosion)
IF GET_PED_INDEX_FROM_ENTITY_INDEX(entityExplosion) = PLAYER_PED_ID()
bPlayerCausedExplosion = TRUE
ENDIF
ENDIF
ENDIF
IF bPlayerCausedExplosion
OR (IS_PED_SHOOTING(PLAYER_PED_ID()) AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-106.440224,-635.586426,25.639248>>, <<49.404850,-692.630066,66.712708>>, 120.750000))
bHasSpooked = TRUE
ENDIF
IF bHasSpooked
IF NOT IS_PED_INJURED(sVaultWorker.ped)
STOP_SYNCHRONIZED_ENTITY_ANIM(sVaultWorker.ped, NORMAL_BLEND_OUT, TRUE)
TASK_SMART_FLEE_PED(sVaultWorker.ped, PLAYER_PED_ID(), 100.0, -1)
IF DOES_ENTITY_EXIST(objFakeVaultDoor)
STOP_SYNCHRONIZED_ENTITY_ANIM(objFakeVaultDoor, NORMAL_BLEND_OUT, TRUE)
FREEZE_ENTITY_POSITION(objFakeVaultDoor, TRUE)
ENDIF
IF DOES_ENTITY_EXIST(objWalkieTalkie)
AND IS_ENTITY_ATTACHED_TO_ENTITY(objWalkieTalkie, sVaultWorker.ped)
DETACH_ENTITY(objWalkieTalkie, TRUE, FALSE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
TASK_SMART_FLEE_PED(sBankWorker.ped, PLAYER_PED_ID(), 100.0, -1)
ENDIF
ENDIF
RETURN bHasSpooked
ENDFUNC
FUNC FLOAT GET_ASPECT_RATIO_FOR_TRAFFIC_CONTROL()
//INT iScreenX
//INT iScreenY
//GET_SCREEN_RESOLUTION(iScreenX, iScreenY)
//RETURN TO_FLOAT(iScreenY) / TO_FLOAT(iScreenX)
FLOAT fAspectR = GET_ASPECT_RATIO(TRUE)
//
// #IF IS_DEBUG_BUILD
// CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), "] Aspect ratio is: ", fAspectR)
// #ENDIF
//
IF fAspectR > 3.0 //B* 2183999: Return normal aspect ratio of the central screen
CDEBUG1LN(DEBUG_MISSION,"This is a multihead tripple-screen set-up, dividing aspect ratio by 3 (in script)")
fAspectR = 1.77
SET_USE_ADJUSTED_MOUSE_COORDS(TRUE)
ENDIF
//1829785: The replacement native command gives the inverse result of the original script command (this is the correct way, but it's too risky at this stage to change all the script references to the old value).
RETURN 1.0 / fAspectR
ENDFUNC
PROC INITIALISE_TRAFFIC_GAME()
//Code commands
//CREATE_TEMPLATED_JUNCTION - maybe use this to create my own junctions
//JUNCTION LAYOUT:
// - 0 ----- 1 ----- 2 ----- 3 -----
// - 4 ----- 5 ----- 6 ----- 7 -----
// - 8 ----- 9 ----- 10 ----
sTrafficGame.fAspectRatio = GET_ASPECT_RATIO_FOR_TRAFFIC_CONTROL()
sTrafficGame.fHudAlpha = 175.0
sTrafficGame.fNoiseLevel = 0.1
sTrafficGame.iSelection = 0
sTrafficGame.iTimeSinceLastSelection = 0
sTrafficGame.iLastJunctionCamViewed = -1
sTrafficGame.bAllowMovement = TRUE
sTrafficGame.bAllowCamSwitch = TRUE
sTrafficGame.bAllowSwitch = TRUE
sTrafficGame.bJunctionStreamingActive = FALSE
sTrafficJunction[0].vCentre = <<-120.9111, -711.7057, 36.2946>>
sTrafficJunction[0].vCamPos = <<-115.097702,-736.650024,39.247398>>
sTrafficJunction[0].vCamRot = <<-32.520157,0.000000,-0.361360>>
sTrafficJunction[0].fCamFov = 80.0
sTrafficJunction[0].sCrossings[0].vCentre = <<-115.0111, -695.4057, 36.2946>>
sTrafficJunction[0].sCrossings[0].fHeading = -19.5000
//sTrafficJunction[0].sCrossings[0].fWidth = 24.8000
sTrafficJunction[0].sCrossings[0].bIsBlocked = TRUE
sTrafficJunction[0].sCrossings[0].iAdjacentJunction = -1
sTrafficJunction[0].sCrossings[1].vCentre = <<-103.5111, -717.2057, 36.2946>>
sTrafficJunction[0].sCrossings[1].fHeading = -109.0000
//sTrafficJunction[0].sCrossings[1].fWidth = 25.0000
sTrafficJunction[0].sCrossings[1].bIsBlocked = FALSE
sTrafficJunction[0].sCrossings[1].iAdjacentJunction = 1
sTrafficJunction[0].sCrossings[2].vCentre = <<-127.0111, -728.8057, 36.2946>>
sTrafficJunction[0].sCrossings[2].fHeading = 163.7000
//sTrafficJunction[0].sCrossings[2].fWidth = 24.7000
sTrafficJunction[0].sCrossings[2].bIsBlocked = TRUE
sTrafficJunction[0].sCrossings[2].iAdjacentJunction = 4
sTrafficJunction[0].sCrossings[3].vCentre = <<-136.8111, -706.3057, 36.2950>>
sTrafficJunction[0].sCrossings[3].fHeading = 70.0000
//sTrafficJunction[0].sCrossings[3].fWidth = 25.0000
sTrafficJunction[0].sCrossings[3].bIsBlocked = FALSE
sTrafficJunction[0].sCrossings[3].iAdjacentJunction = -1
sTrafficJunction[1].vCentre = <<36.264, -771.340, 31.212>>
sTrafficJunction[1].vCamPos = <<39.584274,-792.793335,36.945503>>
sTrafficJunction[1].vCamRot = <<-41.737045,0.000000,9.282529>>
sTrafficJunction[1].fCamFov = 80.0
sTrafficJunction[1].sCrossings[0].vCentre = <<38.264, -758.840, 31.2122>>
sTrafficJunction[1].sCrossings[0].fHeading = -22.200
//sTrafficJunction[1].sCrossings[0].fWidth = 23.000
sTrafficJunction[1].sCrossings[0].bIsBlocked = FALSE
sTrafficJunction[1].sCrossings[0].iAdjacentJunction = -1
sTrafficJunction[1].sCrossings[1].vCentre = <<48.164, -776.040, 31.212>>
sTrafficJunction[1].sCrossings[1].fHeading = -108.500
//sTrafficJunction[1].sCrossings[1].fWidth = 20.000
sTrafficJunction[1].sCrossings[1].bIsBlocked = TRUE
sTrafficJunction[1].sCrossings[1].iAdjacentJunction = 2
sTrafficJunction[1].sCrossings[2].vCentre = <<31.264, -783.240, 31.212>>
sTrafficJunction[1].sCrossings[2].fHeading = 161.000
//sTrafficJunction[1].sCrossings[2].fWidth = 23.000
sTrafficJunction[1].sCrossings[2].bIsBlocked = FALSE
sTrafficJunction[1].sCrossings[2].iAdjacentJunction = 5
sTrafficJunction[1].sCrossings[3].vCentre = <<20.264, -765.740, 31.212>>
sTrafficJunction[1].sCrossings[3].fHeading = 80.100
//sTrafficJunction[1].sCrossings[3].fWidth = 20.000
sTrafficJunction[1].sCrossings[3].bIsBlocked = TRUE
sTrafficJunction[1].sCrossings[3].iAdjacentJunction = 0
sTrafficJunction[2].vCentre = <<172.8905, -817.8768, 31.9256>>
sTrafficJunction[2].vCamPos = <<182.942795,-845.808716,36.523899>>
sTrafficJunction[2].vCamRot = <<-39.106430,0.000000,7.103434>>
sTrafficJunction[2].fCamFov = 80.0
sTrafficJunction[2].sCrossings[0].vCentre = <<179.1905, -799.3768, 31.9256>>
sTrafficJunction[2].sCrossings[0].fHeading = -20.0000
//sTrafficJunction[2].sCrossings[0].fWidth = 25.0000
sTrafficJunction[2].sCrossings[0].bIsBlocked = FALSE
sTrafficJunction[2].sCrossings[0].iAdjacentJunction = -1
sTrafficJunction[2].sCrossings[1].vCentre = <<192.6905, -825.9768, 31.9256>>
sTrafficJunction[2].sCrossings[1].fHeading = -106.0000
//sTrafficJunction[2].sCrossings[1].fWidth = 25.0000
sTrafficJunction[2].sCrossings[1].bIsBlocked = TRUE
sTrafficJunction[2].sCrossings[1].iAdjacentJunction = 3
sTrafficJunction[2].sCrossings[2].vCentre = <<168.8905, -835.0768, 31.9256>>
sTrafficJunction[2].sCrossings[2].fHeading = 161.0000
//sTrafficJunction[2].sCrossings[2].fWidth = 30.0000
sTrafficJunction[2].sCrossings[2].bIsBlocked = FALSE
sTrafficJunction[2].sCrossings[2].iAdjacentJunction = 6
sTrafficJunction[2].sCrossings[3].vCentre = <<155.7905, -812.3768, 31.9256>>
sTrafficJunction[2].sCrossings[3].fHeading = 71.0000
//sTrafficJunction[2].sCrossings[3].fWidth = 25.0000
sTrafficJunction[2].sCrossings[3].bIsBlocked = TRUE
sTrafficJunction[2].sCrossings[3].iAdjacentJunction = 1
sTrafficJunction[3].vCentre = <<291.0192, -853.4460, 28.9082>>
sTrafficJunction[3].vCamPos = <<294.976349,-876.544434,35.861366>>
sTrafficJunction[3].vCamRot = <<-42.146454,-0.000000,13.208912>>
sTrafficJunction[3].fCamFov = 80.0
sTrafficJunction[3].sCrossings[0].vCentre = <<295.7192, -836.5460, 28.9082>>
sTrafficJunction[3].sCrossings[0].fHeading = 0.0000
//sTrafficJunction[3].sCrossings[0].fWidth = 28.0000
sTrafficJunction[3].sCrossings[0].bIsBlocked = TRUE
sTrafficJunction[3].sCrossings[0].iAdjacentJunction = -1
sTrafficJunction[3].sCrossings[1].vCentre = <<306.1192, -854.5460, 28.9082>>
sTrafficJunction[3].sCrossings[1].fHeading = -110.0000
//sTrafficJunction[3].sCrossings[1].fWidth = 28.0000
sTrafficJunction[3].sCrossings[1].bIsBlocked = FALSE
sTrafficJunction[3].sCrossings[1].iAdjacentJunction = -1
sTrafficJunction[3].sCrossings[2].vCentre = <<282.8192, -871.5460, 28.9082>>
sTrafficJunction[3].sCrossings[2].fHeading = 180.0000
//sTrafficJunction[3].sCrossings[2].fWidth = 28.0000
sTrafficJunction[3].sCrossings[2].bIsBlocked = TRUE
sTrafficJunction[3].sCrossings[2].iAdjacentJunction = 7
sTrafficJunction[3].sCrossings[3].vCentre = <<272.0192, -854.6460, 28.9082>>
sTrafficJunction[3].sCrossings[3].fHeading = 70.0000
//sTrafficJunction[3].sCrossings[3].fWidth = 28.0000
sTrafficJunction[3].sCrossings[3].bIsBlocked = FALSE
sTrafficJunction[3].sCrossings[3].iAdjacentJunction = 2
sTrafficJunction[4].vCentre = <<-186.1589, -892.4801, 29.5082>>
sTrafficJunction[4].vCamPos = <<-181.393311,-918.074951,35.585155>>
sTrafficJunction[4].vCamRot = <<-40.950901,0.000000,-0.616000>>
sTrafficJunction[4].fCamFov = 80.0
sTrafficJunction[4].sCrossings[0].vCentre = <<-179.2589, -875.7801, 29.5082>>
sTrafficJunction[4].sCrossings[0].fHeading = -16.0000
//sTrafficJunction[4].sCrossings[0].fWidth = 28.5000
sTrafficJunction[4].sCrossings[0].bIsBlocked = TRUE
sTrafficJunction[4].sCrossings[0].iAdjacentJunction = 0
sTrafficJunction[4].sCrossings[1].vCentre = <<-168.3589, -898.7801, 29.5082>>
sTrafficJunction[4].sCrossings[1].fHeading = -108.5000
//sTrafficJunction[4].sCrossings[1].fWidth = 26.5000
sTrafficJunction[4].sCrossings[1].bIsBlocked = FALSE
sTrafficJunction[4].sCrossings[1].iAdjacentJunction = 5
sTrafficJunction[4].sCrossings[2].vCentre = <<-194.0589, -910.4801, 29.5082>>
sTrafficJunction[4].sCrossings[2].fHeading = 161.7000
//sTrafficJunction[4].sCrossings[2].fWidth = 26.9000
sTrafficJunction[4].sCrossings[2].bIsBlocked = TRUE
sTrafficJunction[4].sCrossings[2].iAdjacentJunction = -1
sTrafficJunction[4].sCrossings[3].vCentre = <<-203.9589, -886.4801, 29.5082>>
sTrafficJunction[4].sCrossings[3].fHeading = 67.6000
//sTrafficJunction[4].sCrossings[3].fWidth = 26.0000
sTrafficJunction[4].sCrossings[3].bIsBlocked = FALSE
sTrafficJunction[4].sCrossings[3].iAdjacentJunction =-1
sTrafficJunction[5].vCentre = <<-33.8007, -947.3564, 29.3034>>
sTrafficJunction[5].vCamPos = <<-25.997375,-969.534851,35.526428>>
sTrafficJunction[5].vCamRot = <<-41.858204,-0.000000,13.621637>>
sTrafficJunction[5].fCamFov = 80.0
sTrafficJunction[5].sCrossings[0].vCentre = <<-30.3007, -932.9564, 29.3034>>
sTrafficJunction[5].sCrossings[0].fHeading = -20.5000
//sTrafficJunction[5].sCrossings[0].fWidth = 37.2000
sTrafficJunction[5].sCrossings[0].bIsBlocked = FALSE
sTrafficJunction[5].sCrossings[0].iAdjacentJunction = 1
sTrafficJunction[5].sCrossings[1].vCentre = <<-13.9007, -953.2564, 29.3034>>
sTrafficJunction[5].sCrossings[1].fHeading = -103.7000
//sTrafficJunction[5].sCrossings[1].fWidth = 20.7000
sTrafficJunction[5].sCrossings[1].bIsBlocked = TRUE
sTrafficJunction[5].sCrossings[1].iAdjacentJunction = 6
sTrafficJunction[5].sCrossings[2].vCentre = <<-37.1007, -962.6564, 29.3034>>
sTrafficJunction[5].sCrossings[2].fHeading = 171.8000
//sTrafficJunction[5].sCrossings[2].fWidth = 26.0000
sTrafficJunction[5].sCrossings[2].bIsBlocked = FALSE
sTrafficJunction[5].sCrossings[2].iAdjacentJunction = 8
sTrafficJunction[5].sCrossings[3].vCentre = <<-52.6007, -941.6564, 29.3034>>
sTrafficJunction[5].sCrossings[3].fHeading = 90.0000
//sTrafficJunction[5].sCrossings[3].fWidth = 27.5000
sTrafficJunction[5].sCrossings[3].bIsBlocked = TRUE
sTrafficJunction[5].sCrossings[3].iAdjacentJunction = 4
sTrafficJunction[6].vCentre = <<105.5346, -999.3572, 29.8471>>
sTrafficJunction[6].vCamPos = <<111.713623,-1026.126465,34.592899>>
sTrafficJunction[6].vCamRot = <<-42.496307,0.000000,10.443845>>
sTrafficJunction[6].fCamFov = 80.0
sTrafficJunction[6].sCrossings[0].vCentre = <<113.3346, -979.6572, 29.8471>>
sTrafficJunction[6].sCrossings[0].fHeading = -20.0000
//sTrafficJunction[6].sCrossings[0].fWidth = 26.0000
sTrafficJunction[6].sCrossings[0].bIsBlocked = FALSE
sTrafficJunction[6].sCrossings[0].iAdjacentJunction = 2
sTrafficJunction[6].sCrossings[1].vCentre = <<126.6346, -1007.3570, 29.8471>>
sTrafficJunction[6].sCrossings[1].fHeading = -110.0000
//sTrafficJunction[6].sCrossings[1].fWidth = 26.0000
sTrafficJunction[6].sCrossings[1].bIsBlocked = TRUE
sTrafficJunction[6].sCrossings[1].iAdjacentJunction = 7
sTrafficJunction[6].sCrossings[2].vCentre = <<98.5346, -1020.3570, 29.8471>>
sTrafficJunction[6].sCrossings[2].fHeading = 160.0000
//sTrafficJunction[6].sCrossings[2].fWidth = 26.0000
sTrafficJunction[6].sCrossings[2].bIsBlocked = FALSE
sTrafficJunction[6].sCrossings[2].iAdjacentJunction = 9
sTrafficJunction[6].sCrossings[3].vCentre = <<83.6346, -991.3572, 29.8471>>
sTrafficJunction[6].sCrossings[3].fHeading = 70.0000
//sTrafficJunction[6].sCrossings[3].fWidth = 26.0000
sTrafficJunction[6].sCrossings[3].bIsBlocked = TRUE
sTrafficJunction[6].sCrossings[3].iAdjacentJunction = 5
sTrafficJunction[7].vCentre = <<222.3941, -1041.5291, 29.5764>>
sTrafficJunction[7].vCamPos = <<229.162262,-1070.942261,35.763374>>
sTrafficJunction[7].vCamRot = <<-42.638462,-0.000000,6.193697>>
sTrafficJunction[7].fCamFov = 80.0
sTrafficJunction[7].sCrossings[0].vCentre = <<229.1941, -1021.0290, 29.5764>>
sTrafficJunction[7].sCrossings[0].fHeading = -20.0000
//sTrafficJunction[7].sCrossings[0].fWidth = 27.5000
sTrafficJunction[7].sCrossings[0].bIsBlocked = FALSE
sTrafficJunction[7].sCrossings[0].iAdjacentJunction = 3
sTrafficJunction[7].sCrossings[1].vCentre = <<246.1941, -1048.4290, 29.5764>>
sTrafficJunction[7].sCrossings[1].fHeading = -100.0000
//sTrafficJunction[7].sCrossings[1].fWidth = 28.5000
sTrafficJunction[7].sCrossings[1].bIsBlocked = TRUE
sTrafficJunction[7].sCrossings[1].iAdjacentJunction = -1
sTrafficJunction[7].sCrossings[2].vCentre = <<215.1941, -1061.7290, 29.5764>>
sTrafficJunction[7].sCrossings[2].fHeading = 155.0000
//sTrafficJunction[7].sCrossings[2].fWidth = 29.0000
sTrafficJunction[7].sCrossings[2].bIsBlocked = FALSE
sTrafficJunction[7].sCrossings[2].iAdjacentJunction = 10
sTrafficJunction[7].sCrossings[3].vCentre = <<202.0941, -1035.6290, 29.5764>>
sTrafficJunction[7].sCrossings[3].fHeading = 70.0000
//sTrafficJunction[7].sCrossings[3].fWidth = 20.0000
sTrafficJunction[7].sCrossings[3].bIsBlocked = TRUE
sTrafficJunction[7].sCrossings[3].iAdjacentJunction = 6
sTrafficJunction[8].vCentre = <<-97.918, -1140.141, 26.946>>
sTrafficJunction[8].vCamPos = <<-91.280067,-1158.127441,31.868998>>
sTrafficJunction[8].vCamRot = <<-41.123184,-0.000000,23.792860>>
sTrafficJunction[8].fCamFov = 80.0
sTrafficJunction[8].sCrossings[0].vCentre = <<-92.418, -1123.341, 26.946>>
sTrafficJunction[8].sCrossings[0].fHeading = 0.000
//sTrafficJunction[8].sCrossings[0].fWidth = 23.000
sTrafficJunction[8].sCrossings[0].bIsBlocked = FALSE
sTrafficJunction[8].sCrossings[0].iAdjacentJunction = 5
sTrafficJunction[8].sCrossings[1].vCentre = <<-77.918, -1139.741, 26.946>>
sTrafficJunction[8].sCrossings[1].fHeading = -110.000
//sTrafficJunction[8].sCrossings[1].fWidth = 22.000
sTrafficJunction[8].sCrossings[1].bIsBlocked = TRUE
sTrafficJunction[8].sCrossings[1].iAdjacentJunction = 9
sTrafficJunction[8].sCrossings[2].vCentre = <<-104.218, -1157.741, 26.946>>
sTrafficJunction[8].sCrossings[2].fHeading = 177.000
//sTrafficJunction[8].sCrossings[2].fWidth = 25.000
sTrafficJunction[8].sCrossings[2].bIsBlocked = FALSE
sTrafficJunction[8].sCrossings[2].iAdjacentJunction = -1
sTrafficJunction[8].sCrossings[3].vCentre = <<-117.918, -1140.041, 26.946>>
sTrafficJunction[8].sCrossings[3].fHeading = 70.000
//sTrafficJunction[8].sCrossings[3].fWidth = 22.0000
sTrafficJunction[8].sCrossings[3].bIsBlocked = TRUE
sTrafficJunction[8].sCrossings[3].iAdjacentJunction = -1
sTrafficJunction[9].vCentre = <<57.1919, -1133.3660, 29.5424>>
sTrafficJunction[9].vCamPos = <<72.951180,-1149.167480,34.798061>>
sTrafficJunction[9].vCamRot = <<-41.737637,0.000001,31.932966>>
sTrafficJunction[9].fCamFov = 80.0
sTrafficJunction[9].sCrossings[0].vCentre = <<55.5919, -1117.9659, 29.5424>>
sTrafficJunction[9].sCrossings[0].fHeading = 2.5000
//sTrafficJunction[9].sCrossings[0].fWidth = 38.0000
sTrafficJunction[9].sCrossings[0].bIsBlocked = TRUE
sTrafficJunction[9].sCrossings[0].iAdjacentJunction = 6
sTrafficJunction[9].sCrossings[1].vCentre = <<80.9919, -1131.2660, 29.5424>>
sTrafficJunction[9].sCrossings[1].fHeading = -93.5000
//sTrafficJunction[9].sCrossings[1].fWidth = 15.4000
sTrafficJunction[9].sCrossings[1].bIsBlocked = FALSE
sTrafficJunction[9].sCrossings[1].iAdjacentJunction = 10
sTrafficJunction[9].sCrossings[2].vCentre = <<59.6919, -1150.8660, 29.5424>>
sTrafficJunction[9].sCrossings[2].fHeading = -174.0000
//sTrafficJunction[9].sCrossings[2].fWidth = 26.5000
sTrafficJunction[9].sCrossings[2].bIsBlocked = TRUE
sTrafficJunction[9].sCrossings[2].iAdjacentJunction = -1
sTrafficJunction[9].sCrossings[3].vCentre = <<29.7919, -1135.6660, 29.5424>>
sTrafficJunction[9].sCrossings[3].fHeading = 92.0000
//sTrafficJunction[9].sCrossings[3].fWidth = 21.0000
sTrafficJunction[9].sCrossings[3].bIsBlocked = FALSE
sTrafficJunction[9].sCrossings[3].iAdjacentJunction = 8
sTrafficJunction[10].vCentre = <<209.1869, -1130.0310, 30.7262>>
sTrafficJunction[10].vCamPos = <<226.615387,-1143.339966,35.144077>>
sTrafficJunction[10].vCamRot = <<-42.472389,0.000001,34.189583>>
sTrafficJunction[10].fCamFov = 80.0
sTrafficJunction[10].sCrossings[0].vCentre = <<208.1869, -1119.3311, 30.7262>>
sTrafficJunction[10].sCrossings[0].fHeading = 0.5000
//sTrafficJunction[10].sCrossings[0].fWidth = 30.0000
sTrafficJunction[10].sCrossings[0].bIsBlocked = FALSE
sTrafficJunction[10].sCrossings[0].iAdjacentJunction = 7
sTrafficJunction[10].sCrossings[1].vCentre = <<232.3869, -1130.9310, 30.7262>>
sTrafficJunction[10].sCrossings[1].fHeading = -79.0000
//sTrafficJunction[10].sCrossings[1].fWidth = 10.0000
sTrafficJunction[10].sCrossings[1].bIsBlocked = TRUE
sTrafficJunction[10].sCrossings[1].iAdjacentJunction = -1
sTrafficJunction[10].sCrossings[2].vCentre = <<211.2869, -1143.2310, 30.7262>>
sTrafficJunction[10].sCrossings[2].fHeading = 180.0000
//sTrafficJunction[10].sCrossings[2].fWidth = 25.0000
sTrafficJunction[10].sCrossings[2].bIsBlocked = FALSE
sTrafficJunction[10].sCrossings[2].iAdjacentJunction = -1
sTrafficJunction[10].sCrossings[3].vCentre = <<185.6869, -1129.1310, 30.7262>>
sTrafficJunction[10].sCrossings[3].fHeading = 100.0000
//sTrafficJunction[10].sCrossings[3].fWidth = 11.3000
sTrafficJunction[10].sCrossings[3].bIsBlocked = TRUE
sTrafficJunction[10].sCrossings[3].iAdjacentJunction = 9
INT i = 0
REPEAT COUNT_OF(sTrafficJunction) i
sTrafficJunction[i].bPlayedLightStatusDialogue = FALSE
sTrafficJunction[i].bLightsFrozen = FALSE
//Initialise the light changing timers to random values
IF i = 0
sTrafficJunction[i].iChangeTimer = 0
ELSE
sTrafficJunction[i].iChangeTimer = GET_GAME_TIMER() - GET_RANDOM_INT_IN_RANGE(0, 20000)
ENDIF
ENDREPEAT
//Initialise the car variables
REPEAT COUNT_OF(sTrafficGameCops) i
sTrafficGameCops[i].bIsCreated = FALSE
ENDREPEAT
bTrafficAudioStreamActive = FALSE
bTrafficGameAudioSceneActive = FALSE
fPrevTrafficLatitude[0] = 0.0
fPrevTrafficLatitude[1] = 0.0
fPrevTrafficLatitude[2] = 0.0
fPrevTrafficLatitude[3] = 0.0
fPrevTrafficTime[0] = 0.0
fPrevTrafficTime[1] = 0.0
fPrevTrafficTime[2] = 0.0
ENDPROC
PROC TC_DRAW_JUNCTION_MARKERS(INT iJunction)
VECTOR vScreenPos
GET_SCREEN_COORD_FROM_WORLD_COORD(sTrafficJunction[iJunction].vCentre, vScreenPos.x, vScreenPos.y)
DRAW_SPRITE(strTrafficTextures, "Traffic_junction_box", vScreenPos.x, vScreenPos.y,
0.08 * sTrafficGame.fAspectRatio, 0.08, 0.0,
255, 255, 255, CEIL(sTrafficGame.fHudAlpha),TRUE)
//North-south lights
IF sTrafficJunction[iJunction].sCrossings[0].bIsBlocked
DRAW_SPRITE(strTrafficTextures, "Traffic_Lights_Horz", vScreenPos.x, vScreenPos.y,
0.08 * sTrafficGame.fAspectRatio, 0.08, 0.0,
200, 0, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
ELSE
DRAW_SPRITE(strTrafficTextures, "Traffic_Lights_Horz", vScreenPos.x, vScreenPos.y,
0.08 * sTrafficGame.fAspectRatio, 0.08, 0.0,
0, 200, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
ENDIF
//East-west lights
IF sTrafficJunction[iJunction].sCrossings[1].bIsBlocked
DRAW_SPRITE(strTrafficTextures, "Traffic_Lights_Vert", vScreenPos.x, vScreenPos.y,
0.08 * sTrafficGame.fAspectRatio, 0.08, 0.0,
200, 0, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
ELSE
DRAW_SPRITE(strTrafficTextures, "Traffic_Lights_Vert", vScreenPos.x, vScreenPos.y,
0.08 * sTrafficGame.fAspectRatio, 0.08, 0.0,
0, 200, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
ENDIF
ENDPROC
//Draws a series of dots on the junction to indicate it's buffering.
PROC DRAW_BUFFERING_INDICATOR(INT iJunction)
CONST_FLOAT DOT_SIZE 0.007
VECTOR vScreenPos, vAdjustedPos
GET_SCREEN_COORD_FROM_WORLD_COORD(sTrafficJunction[iJunction].vCentre, vScreenPos.x, vScreenPos.y)
INT iDotToDraw = ((GET_GAME_TIMER() - sTrafficJunction[iJunction].iBufferingTimer) % 900) / 150
INT iHorizontalRGB[3]
INT iVerticalRGB[3]
//The dots are the reverse colours of the lights
IF sTrafficJunction[iJunction].sCrossings[0].bIsBlocked
iHorizontalRGB[0] = 200
iHorizontalRGB[1] = 0
iHorizontalRGB[2] = 0
iVerticalRGB[0] = 0
iVerticalRGB[1] = 200
iVerticalRGB[2] = 0
ELSE
iHorizontalRGB[0] = 0
iHorizontalRGB[1] = 200
iHorizontalRGB[2] = 0
iVerticalRGB[0] = 200
iVerticalRGB[1] = 0
iVerticalRGB[2] = 0
ENDIF
IF iDotToDraw = 0
vAdjustedPos = vScreenPos
vAdjustedPos.x = vAdjustedPos.x - ((DOT_SIZE * 1.2) * sTrafficGame.fAspectRatio)
DRAW_RECT(vAdjustedPos.x, vAdjustedPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iHorizontalRGB[0], iHorizontalRGB[1], iHorizontalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
ELIF iDotToDraw = 1
DRAW_RECT(vScreenPos.x, vScreenPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iHorizontalRGB[0], iHorizontalRGB[1], iHorizontalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
ELIF iDotToDraw = 2
vAdjustedPos = vScreenPos
vAdjustedPos.x = vAdjustedPos.x + ((DOT_SIZE * 1.2) * sTrafficGame.fAspectRatio)
DRAW_RECT(vAdjustedPos.x, vAdjustedPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iHorizontalRGB[0], iHorizontalRGB[1], iHorizontalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
ELIF iDotToDraw = 3
vAdjustedPos = vScreenPos
vAdjustedPos.y = vAdjustedPos.y - (DOT_SIZE * 1.2)
DRAW_RECT(vAdjustedPos.x, vAdjustedPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iVerticalRGB[0], iVerticalRGB[1], iVerticalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
ELIF iDotToDraw = 4
DRAW_RECT(vScreenPos.x, vScreenPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iVerticalRGB[0], iVerticalRGB[1], iVerticalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
ELIF iDotToDraw = 5
vAdjustedPos = vScreenPos
vAdjustedPos.y = vAdjustedPos.y + (DOT_SIZE * 1.2)
DRAW_RECT(vAdjustedPos.x, vAdjustedPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iVerticalRGB[0], iVerticalRGB[1], iVerticalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
ENDIF
/*IF iDotToDraw = 0
//Draw the top and left dots.
vAdjustedPos = vScreenPos
vAdjustedPos.y = vAdjustedPos.y - (DOT_SIZE * 1.2)
DRAW_RECT(vAdjustedPos.x, vAdjustedPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iVerticalRGB[0], iVerticalRGB[1], iVerticalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
vAdjustedPos = vScreenPos
vAdjustedPos.x = vAdjustedPos.x - ((DOT_SIZE * 1.2) * sTrafficGame.fAspectRatio)
DRAW_RECT(vAdjustedPos.x, vAdjustedPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iHorizontalRGB[0], iHorizontalRGB[1], iHorizontalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
ELIF iDotToDraw = 1
//Draw the middle dot.
DRAW_RECT(vScreenPos.x, vScreenPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iHorizontalRGB[0], iHorizontalRGB[1], iHorizontalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
ELSE
//Draw the bottom and right dots.
vAdjustedPos = vScreenPos
vAdjustedPos.y = vAdjustedPos.y + (DOT_SIZE * 1.2)
DRAW_RECT(vAdjustedPos.x, vAdjustedPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iVerticalRGB[0], iVerticalRGB[1], iVerticalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
vAdjustedPos = vScreenPos
vAdjustedPos.x = vAdjustedPos.x + ((DOT_SIZE * 1.2) * sTrafficGame.fAspectRatio)
DRAW_RECT(vAdjustedPos.x, vAdjustedPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iHorizontalRGB[0], iHorizontalRGB[1], iHorizontalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
ENDIF*/
ENDPROC
PROC TC_DRAW_SPECIFIC_JUNCTION_MARKER(INT iJunction)
CONST_FLOAT BOX_SIZE 0.14
VECTOR vScreenPos = <<0.5, 0.2, 0.0>>
DRAW_SPRITE(strTrafficTextures, "Traffic_junction_box", vScreenPos.x, vScreenPos.y,
BOX_SIZE * sTrafficGame.fAspectRatio, BOX_SIZE, 0.0,
255, 255, 255, CEIL(sTrafficGame.fHudAlpha),TRUE)
//North-south lights
IF sTrafficJunction[iJunction].sCrossings[0].bIsBlocked
DRAW_SPRITE(strTrafficTextures, "Traffic_lights_horz_large", vScreenPos.x, vScreenPos.y,
BOX_SIZE * sTrafficGame.fAspectRatio, BOX_SIZE, 0.0,
200, 0, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
ELSE
DRAW_SPRITE(strTrafficTextures, "Traffic_lights_horz_large", vScreenPos.x, vScreenPos.y,
BOX_SIZE * sTrafficGame.fAspectRatio, BOX_SIZE, 0.0,
0, 200, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
ENDIF
//East-west lights
IF sTrafficJunction[iJunction].sCrossings[1].bIsBlocked
DRAW_SPRITE(strTrafficTextures, "Traffic_lights_vert_large", vScreenPos.x, vScreenPos.y,
BOX_SIZE * sTrafficGame.fAspectRatio, BOX_SIZE, 0.0,
200, 0, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
ELSE
DRAW_SPRITE(strTrafficTextures, "Traffic_lights_vert_large", vScreenPos.x, vScreenPos.y,
BOX_SIZE * sTrafficGame.fAspectRatio, BOX_SIZE, 0.0,
0, 200, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
ENDIF
ENDPROC
PROC TC_DRAW_VEHICLE_MARKER(VEHICLE_INDEX veh, BOOL bIsACop, INT iFlashTimer = 0)
IF NOT IS_ENTITY_DEAD(veh)
IF DOES_CAM_EXIST(camMain)
VECTOR vScreenPos
FLOAT fVehHeading = GET_ENTITY_HEADING(veh)
VECTOR vCamRot = GET_CAM_ROT(camMain)
GET_SCREEN_COORD_FROM_WORLD_COORD(GET_ENTITY_COORDS(veh), vScreenPos.x, vScreenPos.y)
IF vScreenPos.x > 0.04
AND vScreenPos.x < 0.96
AND vScreenPos.y > 0.04
AND vScreenPos.y < 0.96
IF bIsACop
BOOL bSafeToDraw = FALSE
IF GET_GAME_TIMER() - iFlashTimer < 3000
IF (GET_GAME_TIMER() - iFlashTimer) % 200 < 100
bSafeToDraw = TRUE
ENDIF
ELSE
bSafeToDraw = TRUE
ENDIF
IF bSafeToDraw
DRAW_SPRITE(strTrafficTextures, "radar_centre", vScreenPos.x, vScreenPos.y,
0.035 * sTrafficGame.fAspectRatio, 0.035, vCamRot.z - fVehHeading,
//sTrafficGame.iCopsSpriteColourModifier, 128 - sTrafficGame.iCopsSpriteColourModifier / 2, 255 - sTrafficGame.iCopsSpriteColourModifier,
255, 0, 0,
CEIL(sTrafficGame.fHudAlpha),TRUE)
ENDIF
ELSE
DRAW_SPRITE(strTrafficTextures, "radar_centre", vScreenPos.x, vScreenPos.y,
0.03 * sTrafficGame.fAspectRatio, 0.03, vCamRot.z - fVehHeading,
0, 152, 255, CEIL(sTrafficGame.fHudAlpha),TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC TC_DRAW_CURSOR()
CONST_FLOAT CURSOR_SIZE 0.08
VECTOR vScreenPos, vLineMiddlePos
GET_SCREEN_COORD_FROM_WORLD_COORD(sTrafficGame.vCursorPos, vScreenPos.x, vScreenPos.y)
DRAW_SPRITE(strTrafficTextures, "Cursor", vScreenPos.x, vScreenPos.y,
CURSOR_SIZE * sTrafficGame.fAspectRatio, CURSOR_SIZE, 0.0,
255, 255, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
//Top line
FLOAT fTopLineLength = vScreenPos.y - (CURSOR_SIZE / 2.0)
vLineMiddlePos.x = vScreenPos.x
vLineMiddlePos.y = fTopLineLength / 2.0
DRAW_SPRITE(strTrafficTextures, "Cursor_Lines", vLineMiddlePos.x, vLineMiddlePos.y,
0.01 * sTrafficGame.fAspectRatio, fTopLineLength + 0.01, 90.0,
255, 255, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
//Bottom line
FLOAT fBottomCursorEdge = vScreenPos.y + (CURSOR_SIZE / 2.0)
FLOAT fBottomLineLength = 1.0 - fBottomCursorEdge
vLineMiddlePos.x = vScreenPos.x
vLineMiddlePos.y = fBottomCursorEdge + (fBottomLineLength / 2.0)
DRAW_SPRITE(strTrafficTextures, "Cursor_Lines", vLineMiddlePos.x, vLineMiddlePos.y,
0.01 * sTrafficGame.fAspectRatio, fBottomLineLength + 0.01, 90.0,
255, 255, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
//Left line
FLOAT fLeftCursorEdge = vScreenPos.x - (CURSOR_SIZE / 2.0)
FLOAT fLeftLineLength = fLeftCursorEdge
vLineMiddlePos.x = fLeftLineLength / 2.0
vLineMiddlePos.y = vScreenPos.y
DRAW_SPRITE(strTrafficTextures, "Cursor_Lines", vLineMiddlePos.x, vLineMiddlePos.y,
fLeftLineLength +(CURSOR_SIZE / 2.0), 0.01, 0.0,
255, 255, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
//Right line
FLOAT fRightCursorEdge = vScreenPos.x + (CURSOR_SIZE / 2.0)
FLOAT fRightLineLength = 1.0 - fRightCursorEdge
vLineMiddlePos.x = fRightCursorEdge + (fRightLineLength / 2.0)
vLineMiddlePos.y = vScreenPos.y
DRAW_SPRITE(strTrafficTextures, "Cursor_Lines", vLineMiddlePos.x, vLineMiddlePos.y,
fRightLineLength +(CURSOR_SIZE / 2.0), 0.01, 0.0,
255, 255, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
ENDPROC
PROC TC_DRAW_INDICATOR()
CONST_FLOAT CURSOR_SIZE 0.06
VECTOR vScreenPos
GET_SCREEN_COORD_FROM_WORLD_COORD(sTrafficGame.vCurrentIndicatorPos, vScreenPos.x, vScreenPos.y)
DRAW_SPRITE(strTrafficTextures, "Cursor", vScreenPos.x, vScreenPos.y,
CURSOR_SIZE * sTrafficGame.fAspectRatio, CURSOR_SIZE, 0.0,
255, 0, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
ENDPROC
PROC SET_TC_INDICATOR_HIGHLIGHT_COORD(VEHICLE_INDEX vehNewTarget)
sTrafficGame.vehIndicatorTarget = vehNewTarget
sTrafficGame.iIndicatorFlashTimer = GET_GAME_TIMER()
sTrafficGame.vCurrentIndicatorPos = sTrafficGame.vCursorPos
ENDPROC
PROC GET_CLOSEST_JUNCTION_TO_COORDS(VECTOR vPos, INT &iClosestJunction, FLOAT &fClosestDist)
INT i = 0
fClosestDist = -1.0
REPEAT COUNT_OF(sTrafficJunction) i
FLOAT fDist = VDIST2(vPos, sTrafficJunction[i].vCentre)
IF fClosestDist = -1.0 OR fDist < fClosestDist
fClosestDist = fDist
iClosestJunction = i
ENDIF
ENDREPEAT
ENDPROC
PROC GET_CLOSEST_CROSSING_ON_JUNCTION(VECTOR vPos, INT iJunction, INT &iClosestCrossing, FLOAT &fClosestDist)
INT i = 0
fClosestDist = -1.0
REPEAT 4 i
FLOAT fDist = VDIST2(vPos, sTrafficJunction[iJunction].sCrossings[i].vCentre)
IF fClosestDist = -1.0 OR fDist < fClosestDist
fClosestDist = fDist
iClosestCrossing = i
ENDIF
ENDREPEAT
ENDPROC
FUNC TEXT_LABEL GET_RANDOM_TRAFFIC_WAYPOINT_RECORDING(INT min, INT max)
TEXT_LABEL strWaypoint = "BigScoreA"
INT iRandom = GET_RANDOM_INT_IN_RANGE(min, max)
strWaypoint += iRandom
RETURN strWaypoint
ENDFUNC
FUNC BOOL CREATE_TRAFFIC_CAR_USING_WAYPOINT(TRAFFIC_GAME_CAR &sTrafficCar, MODEL_NAMES modelCar, MODEL_NAMES modelPed, TEXT_LABEL strWaypoint, BOOL bLoadCollision = FALSE)
REQUEST_WAYPOINT_RECORDING(strWaypoint)
REQUEST_MODEL(modelCar)
REQUEST_MODEL(modelPed)
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypoint)
AND HAS_MODEL_LOADED(modelCar)
AND HAS_MODEL_LOADED(modelPed)
FLOAT fStartHeading
VECTOR vStartPos, vNextNodePos
WAYPOINT_RECORDING_GET_COORD(strWaypoint, 5, vStartPos)
WAYPOINT_RECORDING_GET_COORD(strWaypoint, 6, vNextNodePos)
fStartHeading = GET_HEADING_FROM_VECTOR_2D(vNextNodePos.x - vStartPos.x, vNextNodePos.y - vStartPos.y)
IF NOT DOES_ENTITY_EXIST(sTrafficCar.veh)
sTrafficCar.veh = CREATE_VEHICLE(modelCar, vStartPos, fStartHeading)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sTrafficCar.veh)
IF NOT DOES_ENTITY_EXIST(sTrafficCar.ped)
sTrafficCar.ped = CREATE_PED_INSIDE_VEHICLE(sTrafficCar.veh, PEDTYPE_MISSION, modelPed)
ENDIF
SET_ENTITY_COORDS(sTrafficCar.veh, vStartPos)
SET_ENTITY_HEADING(sTrafficCar.veh, fStartHeading)
sTrafficCar.iTimer = GET_GAME_TIMER()
sTrafficCar.iFlashTimer = 0
sTrafficCar.bIsCreated = TRUE
sTrafficCar.bIsOffScreen = FALSE
sTrafficCar.strCurrentWaypoint = strWaypoint
IF NOT IS_PED_INJURED(sTrafficCar.ped)
SET_ENTITY_LOAD_COLLISION_FLAG(sTrafficCar.ped, bLoadCollision)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sTrafficCar.ped, NOT bLoadCollision)
ENDIF
SET_ENTITY_LOAD_COLLISION_FLAG(sTrafficCar.veh, bLoadCollision)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sTrafficCar.ped, bLoadCollision)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
///Gets the current state of a traffic car.
FUNC TRAFFIC_CAR_STATE GET_TRAFFIC_CAR_STATE(VEHICLE_INDEX veh)
TRAFFIC_CAR_STATE eCurrentState = TC_STATE_MOVING
IF IS_VEHICLE_DRIVEABLE(veh)
INT iClosestJunction = 0
INT iClosestCrossing = 0
FLOAT fClosestDist = -1.0
VECTOR vVehPos = GET_ENTITY_COORDS(veh)
GET_CLOSEST_JUNCTION_TO_COORDS(vVehPos, iClosestJunction, fClosestDist)
GET_CLOSEST_CROSSING_ON_JUNCTION(vVehPos, iClosestJunction, iClosestCrossing, fClosestDist)
IF fClosestDist < 900.0
//If the crossing is red (or the whole junction is set to malfunction), and the vehicle is approaching it, stop the vehicle.
IF (sTrafficJunction[iClosestJunction].sCrossings[iClosestCrossing].bIsBlocked)
IF VDIST2(vVehPos, sTrafficJunction[iClosestJunction].vCentre) > fClosestDist //If the car is in the middle of the junction ignore the lights.
FLOAT fHeading = GET_ENTITY_HEADING(veh)
FLOAT fHeadingDiff = ABSF(fHeading - sTrafficJunction[iClosestJunction].sCrossings[iClosestCrossing].fHeading)
IF fHeadingDiff > 180.0
fHeadingDiff = ABSF(fHeadingDiff - 360.0)
ENDIF
IF fHeadingDiff > 110.0
VECTOR vVehDir = CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<0.0, 0.0, fHeading>>) //GET_ENTITY_FORWARD_VECTOR(veh)
VECTOR vDirToCrossing = sTrafficJunction[iClosestJunction].sCrossings[iClosestCrossing].vCentre - vVehPos
vDirToCrossing = vDirToCrossing / VMAG(vDirToCrossing)
vVehDir.z = 0
vDirToCrossing.z = 0
IF DOT_PRODUCT(vVehDir, vDirToCrossing) > 0.0
/*#IF IS_DEBUG_BUILD
IF veh = sGoldVans[0].veh OR veh = sGoldVans[1].veh
FLOAT fX1, fY1, fX2, fY2
GET_SCREEN_COORD_FROM_WORLD_COORD(sTrafficJunction[iClosestJunction].sCrossings[iClosestCrossing].vCentre, fX1, fY1)
GET_SCREEN_COORD_FROM_WORLD_COORD(vVehPos, fX2, fY2)
DRAW_LINE_2D(fX1, fY1, fX2, fY2, 0.001, 0, 0, 255, 255)
ENDIF
#ENDIF*/
eCurrentState = TC_STATE_STOPPED_AT_RED
ENDIF
ENDIF
ENDIF
ELSE
eCurrentState = TC_STATE_GOING_THROUGH_GREEN
ENDIF
ENDIF
ENDIF
RETURN eCurrentState
ENDFUNC
/// Checks if a car is geting close to a car driving in front of it.
FUNC BOOL IS_CAR_APPROACHING_CAR_IN_FRONT(VEHICLE_INDEX vehMain, VEHICLE_INDEX vehFront)
IF NOT IS_ENTITY_DEAD(vehMain)
AND NOT IS_ENTITY_DEAD(vehFront)
IF GET_ENTITY_SPEED(vehFront) < GET_ENTITY_SPEED(vehMain)
VECTOR vOffsetFromFrontCar = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehFront, GET_ENTITY_COORDS(vehMain))
IF vOffsetFromFrontCar.y > -25.0
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// Updates a traffic game car's movement using a given waypoint recording to determine where to go.
/// NOTE: The returned BOOL indicates if the car is currently being instructed to stop.
FUNC TRAFFIC_CAR_STATE UPDATE_TRAFFIC_CAR_WAYPOINT_MOVEMENT(VEHICLE_INDEX veh, PED_INDEX pedDriver, STRING strWaypoint, DRIVINGMODE eDrivingMode = DRIVINGMODE_AVOIDCARS, VEHICLE_INDEX vehCarToStayBehind = NULL)
TRAFFIC_CAR_STATE eCurrentState = TC_STATE_MOVING
IF IS_VEHICLE_DRIVEABLE(veh)
AND NOT IS_PED_INJURED(pedDriver)
eCurrentState = GET_TRAFFIC_CAR_STATE(veh)
BOOL bStopForCarInFront = FALSE
IF NOT IS_ENTITY_DEAD(vehCarToStayBehind)
AND eCurrentState != TC_STATE_STOPPED_AT_RED
bStopForCarInFront = IS_CAR_APPROACHING_CAR_IN_FRONT(veh, vehCarToStayBehind)
ENDIF
IF bStopForCarInFront
OR eCurrentState = TC_STATE_STOPPED_AT_RED
IF GET_SCRIPT_TASK_STATUS(pedDriver, SCRIPT_TASK_VEHICLE_MISSION) != PERFORMING_TASK
AND ABSF(GET_ENTITY_SPEED(veh)) > 1.0
TASK_VEHICLE_MISSION(pedDriver, veh, NULL, MISSION_STOP, 0.0, DRIVINGMODE_STOPFORCARS, 5.0, 5.0, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedDriver, TRUE)
ENDIF
ELSE
IF NOT IS_STRING_NULL_OR_EMPTY(strWaypoint)
IF GET_SCRIPT_TASK_STATUS(pedDriver, SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) != PERFORMING_TASK
REQUEST_WAYPOINT_RECORDING(strWaypoint)
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypoint)
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(pedDriver, veh, strWaypoint, eDrivingMode, 0,
EWAYPOINT_START_FROM_CLOSEST_POINT, -1, 30.0)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN eCurrentState
ENDFUNC
/// Updates a traffic game car's movement using a given destination coordinate to determine where to go.
/// NOTE: The returned BOOL indicates if the car is currently being instructed to stop.
FUNC TRAFFIC_CAR_STATE UPDATE_TRAFFIC_CAR_TASK_MOVEMENT(VEHICLE_INDEX veh, PED_INDEX pedDriver, VECTOR vDest, DRIVINGMODE eDrivingMode = DRIVINGMODE_AVOIDCARS)
TRAFFIC_CAR_STATE eCurrentState = TC_STATE_MOVING
IF IS_VEHICLE_DRIVEABLE(veh)
AND NOT IS_PED_INJURED(pedDriver)
eCurrentState = GET_TRAFFIC_CAR_STATE(veh)
IF eCurrentState = TC_STATE_STOPPED_AT_RED
IF GET_SCRIPT_TASK_STATUS(pedDriver, SCRIPT_TASK_VEHICLE_MISSION) != PERFORMING_TASK
AND ABSF(GET_ENTITY_SPEED(veh)) > 1.0
TASK_VEHICLE_MISSION(pedDriver, veh, NULL, MISSION_STOP, 0.0, DRIVINGMODE_STOPFORCARS, 5.0, 5.0, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedDriver, TRUE)
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(pedDriver, SCRIPT_TASK_VEHICLE_DRIVE_WANDER) != PERFORMING_TASK
AND vDest.z != 0
FREEZE_ENTITY_POSITION(veh, FALSE)
//TASK_VEHICLE_DRIVE_TO_COORD(pedDriver, veh, vDest, 20.0, DRIVINGSTYLE_NORMAL, GET_ENTITY_MODEL(veh), eDrivingMode, 10.0, 10.0)
TASK_VEHICLE_DRIVE_WANDER(pedDriver, veh, 15.0, eDrivingMode)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedDriver, TRUE)
ENDIF
ENDIF
ENDIF
RETURN eCurrentState
ENDFUNC
PROC UPDATE_TRAFFIC_GAME_CAR(TRAFFIC_GAME_CAR &sTrafficCar, STRING strWaypoint, VECTOR vDestination, DRIVINGMODE eDrivingMode = DRIVINGMODE_AVOIDCARS)
IF IS_VEHICLE_DRIVEABLE(sTrafficCar.veh)
IF NOT IS_PED_INJURED(sTrafficCar.ped)
AND NOT sTrafficCar.bIsOffScreen
IF NOT IS_STRING_NULL_OR_EMPTY(strWaypoint)
UPDATE_TRAFFIC_CAR_WAYPOINT_MOVEMENT(sTrafficCar.veh, sTrafficCar.ped, strWaypoint, eDrivingMode)
ELIF vDestination.z != 0.0
UPDATE_TRAFFIC_CAR_TASK_MOVEMENT(sTrafficCar.veh, sTrafficCar.ped, vDestination, eDrivingMode)
ENDIF
ENDIF
IF GET_GAME_TIMER() - sTrafficCar.iTimer > 20000
AND NOT sTrafficGame.bJunctionCamActive
IF NOT IS_ENTITY_ON_SCREEN(sTrafficCar.veh)
sTrafficCar.bIsOffScreen = TRUE
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
IF bDebugDrawTrafficCars
FLOAT fX1, fY1
GET_SCREEN_COORD_FROM_WORLD_COORD(GET_ENTITY_COORDS(sTrafficCar.veh), fX1, fY1)
DRAW_RECT(fX1, fY1, 0.01, 0.01, 255, 0, 0, 255,TRUE)
ENDIF
#ENDIF
ENDIF
ENDPROC
//Currently not used
/*PROC UPDATE_TRAFFIC_CAR_USING_RECORDING(TRAFFIC_GAME_CAR &sTrafficCar)
IF IS_VEHICLE_DRIVEABLE(sTrafficCar.veh)
AND NOT sTrafficCar.bIsOffScreen
BOOL bStopCarForLights = FALSE
INT iClosestJunction = 0
INT iClosestCrossing = 0
FLOAT fClosestDist = -1.0
FLOAT fDesiredPlaybackSpeed = 1.0
VECTOR vVehPos = GET_ENTITY_COORDS(sTrafficCar.veh)
GET_CLOSEST_JUNCTION_TO_COORDS(vVehPos, iClosestJunction, fClosestDist)
GET_CLOSEST_CROSSING_ON_JUNCTION(vVehPos, iClosestJunction, iClosestCrossing, fClosestDist)
//If the crossing is red (or the whole junction is set to malfunction), and the vehicle is approaching it, stop the vehicle.
IF (sTrafficJunction[iClosestJunction].sCrossings[iClosestCrossing].bIsBlocked)
IF fClosestDist < 900.0
FLOAT fHeading = GET_ENTITY_HEADING(sTrafficCar.veh)
FLOAT fHeadingDiff = ABSF(fHeading - sTrafficJunction[iClosestJunction].sCrossings[iClosestCrossing].fHeading)
IF fHeadingDiff > 180.0
fHeadingDiff = ABSF(fHeadingDiff - 360.0)
ENDIF
IF fHeadingDiff > 90.0 //This should indicate that the car is heading towards the crossing rather than away from it.
VECTOR vVehDir = CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<0.0, 0.0, fHeading>>)
VECTOR vDirToCrossing = sTrafficJunction[iClosestJunction].sCrossings[iClosestCrossing].vCentre - vVehPos
vDirToCrossing = vDirToCrossing / VMAG(vDirToCrossing)
vVehDir.z = 0
vDirToCrossing.z = 0
IF DOT_PRODUCT(vVehDir, vDirToCrossing) > 0.0
bStopCarForLights = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF bStopCarForLights
fDesiredPlaybackSpeed = 0.0
ENDIF
CONVERGE_VALUE(sTrafficCar.fPlaybackSpeed, fDesiredPlaybackSpeed, 0.3, TRUE)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTrafficCar.veh)
SET_PLAYBACK_SPEED(sTrafficCar.veh, sTrafficCar.fPlaybackSpeed)
ENDIF
IF GET_GAME_TIMER() - sTrafficCar.iTimer > 20000
AND NOT sTrafficGame.bJunctionCamActive
IF NOT IS_ENTITY_ON_SCREEN(sTrafficCar.veh)
sTrafficCar.bIsOffScreen = TRUE
ENDIF
ENDIF
ENDIF
ENDPROC*/
FUNC BOOL CREATE_TRAFFIC_CAR_USING_RECORDING(TRAFFIC_GAME_CAR &sTrafficCar, MODEL_NAMES model, INT iCarrec)
REQUEST_VEHICLE_RECORDING(iCarrec, strCarrec)
REQUEST_MODEL(model)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrec, strCarrec)
VECTOR vStartPos = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(iCarrec, 0.0, strCarrec)
IF NOT DOES_ENTITY_EXIST(sTrafficCar.veh)
IF HAS_MODEL_LOADED(model)
sTrafficCar.veh = CREATE_VEHICLE(model, vStartPos)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sTrafficCar.veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTrafficCar.veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sTrafficCar.veh)
ENDIF
sTrafficCar.iTimer = GET_GAME_TIMER()
sTrafficCar.fPlaybackSpeed = 1.0
sTrafficCar.bIsCreated = TRUE
sTrafficCar.bIsOffScreen = FALSE
START_PLAYBACK_RECORDED_VEHICLE(sTrafficCar.veh, iCarrec, strCarrec)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sTrafficCar.veh)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
///Finds a random position around a given central point and places a car there.
/// If bOnlyHeadTowardsJunction is TRUE cars will only be position so that they're heading towards the junction rather than away from it.
FUNC BOOL SET_TRAFFIC_CAR_RANDOM_POSITION_AROUND_JUNCTION(TRAFFIC_GAME_CAR &sTrafficCar, INT iJunction, BOOL bOnlyHeadTowardsJunction = FALSE,
FLOAT fMinDistFromCentre = 35.0, FLOAT fMaxDistFromCentre = 60.0)
//Fetch a random road node around the junction
FLOAT fRandomAngle = GET_RANDOM_FLOAT_IN_RANGE(0.0, 359.9)
FLOAT fRandomDist = GET_RANDOM_FLOAT_IN_RANGE(fMinDistFromCentre, fMaxDistFromCentre)
FLOAT fRandomX = -SIN(fRandomAngle) * fRandomDist
FLOAT fRandomY = COS(fRandomAngle) * fRandomDist
VECTOR vCurrentJunctionPos = sTrafficJunction[iJunction].vCentre
VECTOR vRandomPos = vCurrentJunctionPos + <<fRandomX, fRandomY, 0.0>>
VECTOR vNodePos
FLOAT fNodeHeading
IF bOnlyHeadTowardsJunction
GET_NTH_CLOSEST_VEHICLE_NODE_FAVOUR_DIRECTION(vRandomPos, vCurrentJunctionPos, 0, vNodePos, fNodeHeading)
ELSE
GET_CLOSEST_VEHICLE_NODE_WITH_HEADING(vRandomPos, vNodePos, fNodeHeading)
ENDIF
//Check the node is safe: there can't be any cars there and it must not obstruct the gold vans.
IF NOT IS_AREA_OCCUPIED(vNodePos - <<5.0, 5.0, 5.0>>, vNodePos + <<5.0, 5.0, 5.0>>, FALSE, TRUE, FALSE, FALSE, FALSE)
INT iClosestCrossing = -1
FLOAT fClosestDist = 0.0
GET_CLOSEST_CROSSING_ON_JUNCTION(vNodePos, iJunction, iClosestCrossing, fClosestDist)
//If currently viewing the junction cam we can't respawn the car if the position is from the north, as this will be visible on the junction cam.
IF iClosestCrossing != TC_NORTH_JUNCTION
OR NOT bOnlyHeadTowardsJunction
IF IS_VEHICLE_DRIVEABLE(sTrafficCar.veh)
SET_ENTITY_COORDS(sTrafficCar.veh, vNodePos)
SET_ENTITY_HEADING(sTrafficCar.veh, fNodeHeading)
FREEZE_ENTITY_POSITION(sTrafficCar.veh, FALSE)
//Give the cars a destination: have them drive forwards from the position they spawned.
sTrafficCar.vCurrentDest = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sTrafficCar.veh, <<0.0, 500.0, 0.0>>)
//Clear any previous driving tasks the driver may have.
PED_INDEX pedDriver = GET_PED_IN_VEHICLE_SEAT(sTrafficCar.veh, VS_DRIVER)
IF NOT IS_PED_INJURED(pedDriver)
CLEAR_PED_TASKS(pedDriver)
ENDIF
//Give the car a start speed if the light is green or the start distance is far enough.
IF NOT sTrafficJunction[iJunction].sCrossings[iClosestCrossing].bIsBlocked
OR fClosestDist > 900.0
SET_VEHICLE_FORWARD_SPEED(sTrafficCar.veh, 10.0)
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN("finale_heist2a.sc - Car successfully repositioned. Junction = ", iJunction, " Crossing = ", iClosestCrossing, " Distance = ", fClosestDist)
#ENDIF
ENDIF
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC SWAP_LIGHTS_AT_JUNCTION(INT iJunction)
INT i = 0
REPEAT 4 i
sTrafficJunction[iJunction].sCrossings[i].bIsBlocked = NOT sTrafficJunction[iJunction].sCrossings[i].bIsBlocked
ENDREPEAT
ENDPROC
PROC UPDATE_TRAFFIC_GAME(BOOL bDrawScaleform = TRUE)
CONST_INT SELECTION_INTERVAL 300
CONST_INT NOISE_TIME 1000
BOOL bPlayLightsChangeSound = FALSE
BOOL bPlayRandomLightsChangeSound = FALSE
BOOL bIsStatic = FALSE
INT iBufferWaitTime = 0
INT i = 0
INT iLeftX = GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_MOVE_LR) - 128
INT iLeftY = GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_MOVE_UD) - 128
// Mouse/Trackpad support
FLOAT fCursorX = GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_CURSOR_X)
FLOAT fCursorY = GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_CURSOR_Y)
INT iPCCursorSelection = -1 // The junction selected by the cursor
VECTOR v2DPos // 2D UI position of junction
//B* 2183999: - Multihead fix for cursor position
//REMOVE IF CODE FIXES THIS!!!! - Dan H
// IF GET_ASPECT_RATIO(TRUE) > 3.0
// CPRINTLN(debug_dan,"REMOVE THIS IFFY FIX if code fixes this")
// fCursorX *= 3
// fCursorX -=1
// ENDIF
bPCCursorAccept = FALSE // For changing traffic lights using mouse button.
IF iHackerLevel = HACKER_LEVEL_MEDIUM
iBufferWaitTime = 500
ELIF iHackerLevel = HACKER_LEVEL_BAD
iBufferWaitTime = 2000
ENDIF
//Disable Switch HUD.
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CHARACTER_WHEEL)
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_CHARACTER_WHEEL)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_DISTRICT_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_STREET_NAME)
IF NOT bDisabledSwitch
DISABLE_SELECTOR()
bDisabledSwitch = TRUE
ENDIF
//Cap really small values to prevent jittering
IF ABSI(iLeftX) < 10
iLeftX = 0
ENDIF
IF ABSI(iLeftY) < 10
iLeftY = 0
ENDIF
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_BEFORE_HUD)
IF NOT IS_RADAR_HIDDEN()
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
ENDIF
//If the mission has failed during the traffic game continue drawing the HUD but fade it out.
IF bMissionFailed
sTrafficGame.fHudAlpha = sTrafficGame.fHudAlpha -@ 125.0
IF sTrafficGame.fHudAlpha < 0.0
sTrafficGame.fHudAlpha = 0.0
ENDIF
sTrafficGame.fNoiseLevel = sTrafficGame.fNoiseLevel +@ 1.0
IF sTrafficGame.fNoiseLevel > 255.0
sTrafficGame.fNoiseLevel = 255.0
ENDIF
SET_NOISINESSOVERIDE(sTrafficGame.fNoiseLevel)
ENDIF
//The traffic HUD starts with a loading anim, don't allow control while this is active.
IF (eMissionStage = STAGE_TRAFFIC_CONTROL AND (eSectionStage = SECTION_STAGE_RUNNING OR eSectionStage = SECTION_STAGE_CLEANUP))
OR eMissionStage = STAGE_ARRIVAL_CUTSCENE //Need to continue to draw HUD while this stage loads.
//Camera selection
IF NOT bMissionFailed
IF (IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_VEH_CIN_CAM) OR IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL)) // PC right mouse button to change view
AND sTrafficGame.bAllowCamSwitch
AND iHackerLevel = HACKER_LEVEL_GOOD
IF NOT sTrafficGame.bJunctionCamActive
SET_CAM_COORD(camMain, sTrafficJunction[sTrafficGame.iSelection].vCamPos)
SET_CAM_ROT(camMain, sTrafficJunction[sTrafficGame.iSelection].vCamRot)
SET_CAM_FOV(camMain, sTrafficJunction[sTrafficGame.iSelection].fCamFov)
SET_NOISINESSOVERIDE(255.0)
sTrafficGame.iNoiseTimer = GET_GAME_TIMER()
PLAY_SOUND_FRONTEND(sTrafficGame.iStaticSound, "TRAFFIC_CONTROL_CHANGE_CAM", "BIG_SCORE_3A_SOUNDS")
//If we've switched junctions then we need to reposition the pool of traffic cars around the new junction.
IF sTrafficGame.iSelection != sTrafficGame.iLastJunctionCamViewed
iCurrentTrafficCarToReposition = 0
ENDIF
IF NOT sTrafficGame.bJunctionStreamingActive
AND NOT bTrafficEndStreamingActive
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
VECTOR vFrustrumPos, vFrustrumDir
vFrustrumDir = CONVERT_ROTATION_TO_DIRECTION_VECTOR(sTrafficJunction[sTrafficGame.iSelection].vCamRot)
vFrustrumPos = sTrafficJunction[sTrafficGame.iSelection].vCamPos //- (vFrustrumDir * 10.0)
NEW_LOAD_SCENE_START(vFrustrumPos, vFrustrumDir, 50.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
//NEW_LOAD_SCENE_START_SPHERE(sTrafficJunction[sTrafficGame.iSelection].vCentre, 60.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
sTrafficGame.bJunctionStreamingActive = TRUE
ENDIF
ENDIF
sTrafficGame.iLastJunctionCamViewed = sTrafficGame.iSelection
sTrafficGame.bJunctionCamActive = TRUE
ENDIF
ELIF sTrafficGame.bJunctionCamActive
SET_CAM_COORD(camMain, vTrafficGameMainCamPos)
SET_CAM_ROT(camMain, vTrafficGameMainCamRot)
SET_CAM_FOV(camMain, fTrafficGameMainCamFOV)
SET_NOISINESSOVERIDE(255.0)
sTrafficGame.iNoiseTimer = GET_GAME_TIMER() - (NOISE_TIME / 2) //Leave the noise up for less when coming out of the cam.
PLAY_SOUND_FRONTEND(sTrafficGame.iStaticSound, "TRAFFIC_CONTROL_CHANGE_CAM", "BIG_SCORE_3A_SOUNDS")
sTrafficGame.bJunctionCamActive = FALSE
ENDIF
ENDIF
IF NOT sTrafficGame.bJunctionCamActive
//If we're in the overhead view don't reposition any traffic cars (this will also reset the value for z-skipping etc).
iCurrentTrafficCarToReposition = 1000
//Remove any load scenes (don't remove if the final load scene has been started).
IF sTrafficGame.bJunctionStreamingActive
AND NOT bTrafficEndStreamingActive
NEW_LOAD_SCENE_STOP()
sTrafficGame.bJunctionStreamingActive = FALSE
ENDIF
// Work out which junction is being highlighted if using mouse or trackpad
IF IS_USING_CURSOR(FRONTEND_CONTROL)
SET_MOUSE_CURSOR_THIS_FRAME()
iPCCursorSelection = -1
REPEAT COUNT_OF(sTrafficJunction) i
GET_SCREEN_COORD_FROM_WORLD_COORD(sTrafficJunction[i].vCentre, v2DPos.x, v2DPos.y)
IF VDIST( << v2DPos.x, v2DPos.Y, 0.0>>, <<fCursorX, fCursorY, 0.0 >> ) < 0.04
DRAW_RECT(v2DPos.x, v2DPos.Y, 0.040, 0.065, 255,255,255,64,TRUE)
iPCCursorSelection = i
ENDIF
ENDREPEAT
ENDIF
ENDIF
//Reposition the traffic cars after a switch to junction cam: this should take place during the static.
IF iCurrentTrafficCarToReposition < COUNT_OF(sTrafficGameCars)
INT iRepostionAttemptsThisFrame = 0
WHILE iRepostionAttemptsThisFrame < 5 AND iCurrentTrafficCarToReposition < COUNT_OF(sTrafficGameCars)
IF SET_TRAFFIC_CAR_RANDOM_POSITION_AROUND_JUNCTION(sTrafficGameCars[iCurrentTrafficCarToReposition], sTrafficGame.iSelection)
iCurrentTrafficCarToReposition++
ENDIF
PRINTLN("@@@@@@@@@ iRepostionAttemptsThisFrame: ", iRepostionAttemptsThisFrame, " @@@@@@@@@")
iRepostionAttemptsThisFrame++
ENDWHILE
ENDIF
//Turn off the static after a set amount of time: also keep the static up if there are things streaming in.
IF GET_GAME_TIMER() - sTrafficGame.iNoiseTimer > NOISE_TIME
AND iCurrentTrafficCarToReposition >= COUNT_OF(sTrafficGameCars)
IF (sTrafficGame.bJunctionStreamingActive AND IS_NEW_LOAD_SCENE_ACTIVE() AND IS_NEW_LOAD_SCENE_LOADED())
OR NOT sTrafficGame.bJunctionStreamingActive
SET_NOISINESSOVERIDE(sTrafficGame.fNoiseLevel)
IF NOT HAS_SOUND_FINISHED(sTrafficGame.iStaticSound)
STOP_SOUND(sTrafficGame.iStaticSound)
ENDIF
ELSE
bIsStatic = TRUE
ENDIF
ELSE
bIsStatic = TRUE
ENDIF
//Update the cursor position to interp to the currently selected junction.
IF sTrafficGame.vCursorPos.x = 0.0
sTrafficGame.vCursorPos = sTrafficJunction[sTrafficGame.iSelection].vCentre
ELSE
VECTOR vDesiredPos = sTrafficJunction[sTrafficGame.iSelection].vCentre
sTrafficGame.vCursorPos.x = sTrafficGame.vCursorPos.x + ((vDesiredPos.x - sTrafficGame.vCursorPos.x) * 0.3)
sTrafficGame.vCursorPos.y = sTrafficGame.vCursorPos.y + ((vDesiredPos.y - sTrafficGame.vCursorPos.y) * 0.3)
sTrafficGame.vCursorPos.z = sTrafficGame.vCursorPos.z + ((vDesiredPos.z - sTrafficGame.vCursorPos.z) * 0.3)
ENDIF
/* Mouse debug
GET_SCREEN_COORD_FROM_WORLD_COORD(sTrafficGame.vCursorPos, v2DPos.x, v2DPos.y)
DISPLAY_TEXT_WITH_FLOAT( 0.1, 0.1, "NUMBER", v2DPos.x, 2 )
DISPLAY_TEXT_WITH_FLOAT( 0.1, 0.2, "NUMBER", v2DPos.y, 2 )
DISPLAY_TEXT_WITH_FLOAT( 0.2, 0.1, "NUMBER", fCursorX, 2 )
DISPLAY_TEXT_WITH_FLOAT( 0.2, 0.2, "NUMBER", fCursorY, 2 )
*/
//Update the cops sprite colour values: this gives the impression of the cops sprites flashing red/blue
IF sTrafficGame.iCopsSpriteColourDir = 0
sTrafficGame.iCopsSpriteColourDir = 1
ELSE
sTrafficGame.iCopsSpriteColourModifier += sTrafficGame.iCopsSpriteColourDir * 48
IF sTrafficGame.iCopsSpriteColourModifier < 0
sTrafficGame.iCopsSpriteColourModifier = 0
sTrafficGame.iCopsSpriteColourDir = 1
ELIF sTrafficGame.iCopsSpriteColourModifier > 255
sTrafficGame.iCopsSpriteColourModifier = 255
sTrafficGame.iCopsSpriteColourDir = -1
ENDIF
ENDIF
// Change traffic lights using mouse/Trackpad
IF IS_USING_CURSOR(FRONTEND_CONTROL)
// Work out which traffic junction is highlighted by the cursor
IF NOT sTrafficGame.bJunctionCamActive
// If mouse is over the current selection, and clicked, then switch.
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)
IF sTrafficGame.iSelection = iPCCursorSelection
bPCCursorAccept = TRUE
ENDIF
ENDIF
ELSE
// Traffic cam active, just switch.
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)
bPCCursorAccept = TRUE
ENDIF
ENDIF
ENDIF
//Reverse the traffic lights on the current junction if (A) is pressed. Depending on the hacker the lights may not change immediately, instead
//they're set to a buffering state, then after a certain amount of time they change. Lights can't be changed while they're buffering.
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SPRINT) OR bPCCursorAccept
AND sTrafficGame.bAllowSwitch
AND NOT bMissionFailed
IF NOT sTrafficJunction[sTrafficGame.iSelection].bIsBuffering
sTrafficJunction[sTrafficGame.iSelection].bIsBuffering = TRUE
sTrafficJunction[sTrafficGame.iSelection].iBufferingTimer = GET_GAME_TIMER()
INFORM_MISSION_STATS_OF_INCREMENT(FH2A_TRAFFIC_LIGHT_CHANGES)
bPlayLightsChangeSound = TRUE
iTimeOfLastTrafficSwitch = GET_GAME_TIMER()
ENDIF
ENDIF
//Handle the lights changing: the lights can change under two conditions:
// - At random intervals of approx 20 seconds (if they're not currently frozen.
// - If the light has been selected by the player: once the buffer time is done it will change.
REPEAT COUNT_OF(sTrafficJunction) i
IF sTrafficJunction[i].bIsBuffering
IF (iHackerLevel = HACKER_LEVEL_GOOD)
OR (GET_GAME_TIMER() - sTrafficJunction[i].iBufferingTimer > iBufferWaitTime)
SWAP_LIGHTS_AT_JUNCTION(i)
sTrafficJunction[i].iChangeTimer = 0
sTrafficJunction[i].bIsBuffering = FALSE
ENDIF
ELSE
IF sTrafficJunction[i].iChangeTimer = 0
sTrafficJunction[i].iChangeTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(-3000, 3000)
ELIF GET_GAME_TIMER() - sTrafficJunction[i].iChangeTimer > 20000
IF NOT sTrafficJunction[i].bLightsFrozen
IF NOT (i = 0 AND NOT sTrafficGame.bAllowMovement) //Don't switch the first set of lights if the player hasn't done the tutorial yet.
AND i != sTrafficGame.iSelection
SWAP_LIGHTS_AT_JUNCTION(i)
bPlayRandomLightsChangeSound = TRUE
sTrafficJunction[i].iChangeTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(-3000, 3000)
ELSE
//If the player hasn't done the tutorial yet or the junction is higlighted just keep updating the timer so it doesn't switch the lights.
sTrafficJunction[i].iChangeTimer = GET_GAME_TIMER()
ENDIF
ELSE
//If the light has been deliberately frozen then increment the timer.
sTrafficJunction[i].iChangeTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF NOT sTrafficGame.bJunctionCamActive
//Select the adjacent junction based on stick direction (if the selection didn't already update).
IF GET_GAME_TIMER() - sTrafficGame.iTimeSinceLastSelection > SELECTION_INTERVAL
AND sTrafficGame.bAllowMovement
AND NOT bMissionFailed
INT iMaxValue = 0
INT iDirection = 0
BOOL bDpadPressed = FALSE
// Use mouse to select new junction
IF IS_USING_CURSOR(FRONTEND_CONTROL)
IF iPCCursorSelection != -1
IF IS_CONTROL_JUST_PRESSED( FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT )
// Selecting different junction = change junction
IF sTrafficGame.iSelection != iPCCursorSelection
sTrafficGame.iSelection = iPCCursorSelection
PLAY_SOUND_FRONTEND(-1, "TRAFFIC_CONTROL_MOVE_CROSSHAIR", "BIG_SCORE_3A_SOUNDS")
sTrafficGame.iTimeSinceLastSelection = GET_GAME_TIMER()
bPCCursorMoved = TRUE
ENDIF
ENDIF
ENDIF
ELSE // Use gamepad to select junction
IF ABSI(iLeftX) > ABSI(iLeftY)
iMaxValue = iLeftX
IF iLeftX < 0
iDirection = TC_WEST_JUNCTION
ELSE
iDirection = TC_EAST_JUNCTION
ENDIF
ELSE
iMaxValue = iLeftY
IF iLeftY < 0
iDirection = TC_NORTH_JUNCTION
ELSE
iDirection = TC_SOUTH_JUNCTION
ENDIF
ENDIF
//Allow D-pad control too
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_UP)
iDirection = TC_NORTH_JUNCTION
bDpadPressed = TRUE
ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_DOWN)
iDirection = TC_SOUTH_JUNCTION
bDpadPressed = TRUE
ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_LEFT)
iDirection = TC_WEST_JUNCTION
bDpadPressed = TRUE
ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT)
iDirection = TC_EAST_JUNCTION
bDpadPressed = TRUE
ENDIF
IF (ABSI(iMaxValue) > 60 OR bDpadPressed)
AND sTrafficJunction[sTrafficGame.iSelection].sCrossings[iDirection].iAdjacentJunction >= 0
PLAY_SOUND_FRONTEND(-1, "TRAFFIC_CONTROL_MOVE_CROSSHAIR", "BIG_SCORE_3A_SOUNDS")
sTrafficGame.iSelection = sTrafficJunction[sTrafficGame.iSelection].sCrossings[iDirection].iAdjacentJunction
sTrafficGame.iTimeSinceLastSelection = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
IF bPlayLightsChangeSound
PLAY_SOUND_FRONTEND(sTrafficGame.iSelectSound, "TRAFFIC_CONTROL_TOGGLE_LIGHT", "BIG_SCORE_3A_SOUNDS")
SET_VARIABLE_ON_SOUND(sTrafficGame.iSelectSound, "delay", TO_FLOAT(iBufferWaitTime) / 1000.0)
ENDIF
IF bPlayRandomLightsChangeSound
PLAY_SOUND_FRONTEND(-1, "Traffic_Control_Light_Switch_Back", "BIG_SCORE_3A_SOUNDS")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_INTERSECTION_CAM")
STOP_AUDIO_SCENE("BS_2A_INTERSECTION_CAM")
ENDIF
//Sprite drawing
IF NOT bIsStatic
AND bDrawScaleform
//AND NOT bMissionFailed
SET_SCRIPT_GFX_DRAW_BEHIND_PAUSEMENU(TRUE)
REPEAT COUNT_OF(sTrafficJunction) i
IF sTrafficJunction[i].bIsBuffering
DRAW_BUFFERING_INDICATOR(i)
ENDIF
TC_DRAW_JUNCTION_MARKERS(i)
ENDREPEAT
//Draw the van blips: they don't appear at first, then flash after a few seconds
IF iTrafficBlipFlashTimer = 0
TC_DRAW_VEHICLE_MARKER(sGoldVans[0].veh, FALSE)
TC_DRAW_VEHICLE_MARKER(sGoldVans[1].veh, FALSE)
ELSE
IF GET_GAME_TIMER() - iTrafficBlipFlashTimer < 1500
IF (GET_GAME_TIMER() - iTrafficBlipFlashTimer) % 200 < 100
TC_DRAW_VEHICLE_MARKER(sGoldVans[0].veh, FALSE)
TC_DRAW_VEHICLE_MARKER(sGoldVans[1].veh, FALSE)
ENDIF
ELSE
//Just draw the blips normally.
TC_DRAW_VEHICLE_MARKER(sGoldVans[0].veh, FALSE)
TC_DRAW_VEHICLE_MARKER(sGoldVans[1].veh, FALSE)
ENDIF
ENDIF
REPEAT COUNT_OF(sTrafficGameCops) i
TC_DRAW_VEHICLE_MARKER(sTrafficGameCops[i].veh, TRUE, sTrafficGameCops[i].iFlashTimer)
ENDREPEAT
TC_DRAW_CURSOR()
//Destination text: this seems to draw over the loading screen even when using GFX_ORDER_AFTER_HUD, so just delay it until the loading screen is done
IF sTrafficGame.bAllowSwitch = TRUE
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
VECTOR vFranklinPos
GET_SCREEN_COORD_FROM_WORLD_COORD(<<59.4589, -1168.9636, 28.4826>>, vFranklinPos.x, vFranklinPos.y)
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_AFTER_HUD)
DRAW_RECT(vFranklinPos.x, vFranklinPos.y, 0.01 * sTrafficGame.fAspectRatio, 0.01, 255, 255, 96, CEIL(sTrafficGame.fHudAlpha),TRUE)
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_AFTER_HUD)
SET_TEXT_JUSTIFICATION(FONT_CENTRE)
SET_TEXT_SCALE(0.4, 0.4)
SET_TEXT_COLOUR(255, 255, 96, CEIL(sTrafficGame.fHudAlpha))
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("F3A_TRAFDEST")
END_TEXT_COMMAND_DISPLAY_TEXT(vFranklinPos.x, vFranklinPos.y + 0.01, 1)
ENDIF
ENDIF
ENDIF
sTrafficGame.fCamRotOffsetX = 0.0
sTrafficGame.fCamRotOffsetZ = 0.0
fTrafficLatitude[0] = TO_FLOAT(ROUND(ABSF(vTrafficGameMainCamPos.y)))
fTrafficLatitude[1] = 78.0
fTrafficLatitude[2] = TO_FLOAT(ROUND(ABSF(vTrafficGameMainCamPos.x)))
fTrafficLatitude[3] = 55.0
ELSE
//Allow the player to move the cam around a bit when viewing the junction cam.
CONST_FLOAT MAX_ROT_X 20.0
CONST_FLOAT MAX_ROT_Z 20.0
CONST_FLOAT ROT_SPEED 60.0
//Take into account invert look
IF IS_LOOK_INVERTED()
iLeftY = -iLeftY
ENDIF
FLOAT fDesiredOffsetX = sTrafficGame.fCamRotOffsetX +@ ((TO_FLOAT(-iLeftY) / 128.0) * ROT_SPEED)
FLOAT fDesiredOffsetZ = sTrafficGame.fCamRotOffsetZ +@ ((TO_FLOAT(-iLeftX) / 128.0) * ROT_SPEED)
// Mouse look on PC
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
fDesiredOffsetX = sTrafficGame.fCamRotOffsetX + GET_CONTROL_UNBOUND_NORMAL(FRONTEND_CONTROL, INPUT_LOOK_UD) * -30
fDesiredOffsetZ = sTrafficGame.fCamRotOffsetZ + GET_CONTROL_UNBOUND_NORMAL(FRONTEND_CONTROL, INPUT_LOOK_LR) * -30
ENDIF
IF fDesiredOffsetX > MAX_ROT_X
fDesiredOffsetX = MAX_ROT_X
ELIF fDesiredOffsetX < -MAX_ROT_X
fDesiredOffsetX = -MAX_ROT_X
ENDIF
IF fDesiredOffsetZ > MAX_ROT_Z
fDesiredOffsetZ = MAX_ROT_Z
ELIF fDesiredOffsetZ < -MAX_ROT_Z
fDesiredOffsetZ = -MAX_ROT_Z
ENDIF
// Only auto-centre on gamepad.
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
sTrafficGame.fCamRotOffsetX = fDesiredOffsetX
sTrafficGame.fCamRotOffsetZ = fDesiredOffsetZ
ELSE
sTrafficGame.fCamRotOffsetX = sTrafficGame.fCamRotOffsetX + ((fDesiredOffsetX - sTrafficGame.fCamRotOffsetX) * 0.2)
sTrafficGame.fCamRotOffsetZ = sTrafficGame.fCamRotOffsetZ + ((fDesiredOffsetZ - sTrafficGame.fCamRotOffsetZ) * 0.2)
ENDIF
VECTOR vRotOrigin = sTrafficJunction[sTrafficGame.iSelection].vCamRot //For shorthand purposes
SET_CAM_ROT(camMain, <<vRotOrigin.x + sTrafficGame.fCamRotOffsetX, vRotOrigin.y, vRotOrigin.z + sTrafficGame.fCamRotOffsetZ>>)
//Draw junction-specific traffic marker
IF NOT bIsStatic
SET_SCRIPT_GFX_DRAW_BEHIND_PAUSEMENU(TRUE)
TC_DRAW_SPECIFIC_JUNCTION_MARKER(sTrafficGame.iSelection)
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_INTERSECTION_CAM")
START_AUDIO_SCENE("BS_2A_INTERSECTION_CAM")
ENDIF
fTrafficLatitude[0] = TO_FLOAT(ROUND(ABSF(sTrafficJunction[sTrafficGame.iSelection].vCamPos.y)))
fTrafficLatitude[1] = TO_FLOAT(((sTrafficGame.iSelection + 2) * (sTrafficGame.iSelection + 2) * 3) % 100)
fTrafficLatitude[2] = TO_FLOAT(ROUND(ABSF(sTrafficJunction[sTrafficGame.iSelection].vCamPos.x)))
fTrafficLatitude[3] = TO_FLOAT(((sTrafficGame.iSelection + 2) * (sTrafficGame.iSelection + 1) * 7) % 100)
ENDIF
//If the latitude changes then update the scaleform movie.
IF fTrafficLatitude[0] != fPrevTrafficLatitude[0]
OR fTrafficLatitude[1] != fPrevTrafficLatitude[1]
OR fTrafficLatitude[2] != fPrevTrafficLatitude[2]
OR fTrafficLatitude[3] != fPrevTrafficLatitude[3]
OR fPrevTrafficLatitude[0] = 0.0
BEGIN_SCALEFORM_MOVIE_METHOD(sfTrafficHud, "SET_LAT_LONG")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fTrafficLatitude[0])
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fTrafficLatitude[1])
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fTrafficLatitude[2])
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fTrafficLatitude[3])
END_SCALEFORM_MOVIE_METHOD()
ENDIF
fPrevTrafficLatitude[0] = fTrafficLatitude[0]
fPrevTrafficLatitude[1] = fTrafficLatitude[1]
fPrevTrafficLatitude[2] = fTrafficLatitude[2]
fPrevTrafficLatitude[3] = fTrafficLatitude[3]
ENDIF
fTrafficTime[0] = TO_FLOAT(ENUM_TO_INT(GET_CLOCK_DAY_OF_WEEK()))
fTrafficTime[1] = TO_FLOAT(GET_CLOCK_HOURS())
fTrafficTime[2] = TO_FLOAT(GET_CLOCK_MINUTES())
IF fTrafficTime[0] != fPrevTrafficTime[0]
OR fTrafficTime[1] != fPrevTrafficTime[1]
OR fTrafficTime[2] != fPrevTrafficTime[2]
OR fPrevTrafficTime[0] = 0.0
//Draw scaleform
//CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfTrafficHud, "SET_CAM_DATE", fTrafficTime[0],
// fTrafficTime[1], fTrafficTime[2])
BEGIN_SCALEFORM_MOVIE_METHOD(sfTrafficHud, "SET_CAM_DATE")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fTrafficTime[0])
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fTrafficTime[1])
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fTrafficTime[2])
END_SCALEFORM_MOVIE_METHOD()
ENDIF
fPrevTrafficTime[0] = fTrafficTime[0]
fPrevTrafficTime[1] = fTrafficTime[1]
fPrevTrafficTime[2] = fTrafficTime[2]
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_BEFORE_HUD)
SET_SCRIPT_GFX_DRAW_BEHIND_PAUSEMENU(FALSE)
IF NOT bTriggeredTrafficIntro
CALL_SCALEFORM_MOVIE_METHOD(sfTrafficHud, "PLAY_CAM_MOVIE")
bTriggeredTrafficIntro = TRUE
ENDIF
//Start the looping sound
IF NOT bTrafficGameAudioSceneActive
START_AUDIO_SCENE("BIG_SCORE_TRAFFIC_CONTROL_SCENE")
bTrafficGameAudioSceneActive = TRUE
PLAY_SOUND_FRONTEND(sTrafficGame.iBackgroundSound, "TRAFFIC_CONTROL_BG_NOISE", "BIG_SCORE_3A_SOUNDS")
ENDIF
IF NOT bMissionFailed
AND bDrawScaleform
DRAW_SCALEFORM_MOVIE_FULLSCREEN(sfTrafficHud, 255, 255, 255, ROUND(sTrafficGame.fHudAlpha))
ENDIF
IF NOT bTrafficAudioStreamActive
IF LOAD_STREAM("Traffic_Control_BG_Stream", "BIG_SCORE_3A_SOUNDS")
PLAY_STREAM_FRONTEND()
bTrafficAudioStreamActive = TRUE
ENDIF
ENDIF
//Handle the fail audio
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_TRAFFIC_CONTROL_FAIL")
IF bMissionFailed
IF iTrafficFailTimer = 0
PLAY_SOUND_FRONTEND(-1, "Traffic_Control_Fail", "BIG_SCORE_3A_SOUNDS")
iTrafficFailTimer = GET_GAME_TIMER()
ELIF iTrafficFailTimer != -1
IF GET_GAME_TIMER() - iTrafficFailTimer > 3500
PLAY_SOUND_FRONTEND(-1, "Traffic_Control_Fail_Blank", "BIG_SCORE_3A_SOUNDS")
iTrafficFailTimer = -1
ENDIF
ENDIF
ELSE
iTrafficFailTimer = 0
ENDIF
ENDIF
ENDPROC
PROC PRELOAD_ALL_CHASE_RECORDINGS(FLOAT fPlaybackTime)
INT i = 0
INT iSetpieceSize = COUNT_OF(SetPieceCarID)
INT iTrafficSize = COUNT_OF(TrafficCarID)
//Only do 10 cars per frame max to save execution time.
WHILE iPreloadRecordingsIndex < iTrafficSize AND i < 10
//Do traffic cars
IF TrafficCarRecording[i] > 0
IF TrafficCarStartime[i] > fPlaybackTime
REQUEST_VEHICLE_RECORDING(TrafficCarRecording[i], strCarrec)
ENDIF
ENDIF
//Do set-pieces in the same loop
IF iPreloadRecordingsIndex < iSetpieceSize
IF SetPieceCarRecording[iPreloadRecordingsIndex] > 0
IF SetPieceCarStartime[iPreloadRecordingsIndex] > fPlaybackTime
REQUEST_VEHICLE_RECORDING(SetPieceCarRecording[iPreloadRecordingsIndex], strCarrec)
ELIF fPlaybackTime > SetPieceCarStartime[iPreloadRecordingsIndex] + 30000
//Some setpieces aren't being removed, force them to be cleaned up.
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[iPreloadRecordingsIndex])
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[iPreloadRecordingsIndex])
SET_VEHICLE_AS_NO_LONGER_NEEDED(SetPieceCarID[iPreloadRecordingsIndex])
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
iPreloadRecordingsIndex++
i++
ENDWHILE
IF iPreloadRecordingsIndex >= iTrafficSize
iPreloadRecordingsIndex = 0
ENDIF
ENDPROC
FUNC VEHICLE_INDEX TC_GET_CLOSEST_ENEMY_CAR_TO_PED(PED_INDEX ped, FLOAT &fClosestDistance)
VEHICLE_INDEX vehClosest
fClosestDistance = 0.0
IF NOT IS_PED_INJURED(ped)
INT i = 0
REPEAT COUNT_OF(sTrafficGameCops) i
IF NOT IS_ENTITY_DEAD(sTrafficGameCops[i].veh)
FLOAT fDist = VDIST2(GET_ENTITY_COORDS(ped), GET_ENTITY_COORDS(sTrafficGameCops[i].veh))
IF fClosestDistance = 0.0
OR fDist < fClosestDistance
fClosestDistance = fDist
vehClosest = sTrafficGameCops[i].veh
ENDIF
ENDIF
ENDREPEAT
ENDIF
RETURN vehClosest
ENDFUNC
FUNC TEXT_LABEL GET_NEAR_MISS_TEXT_LABEL(VEHICLE_INDEX vehBuddyCar, VECTOR vEnemyPos)
TEXT_LABEL strNearMissLabel = ""
IF IS_VEHICLE_DRIVEABLE(vehBuddyCar)
VECTOR vEnemyOffsetFromBuddy = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehBuddyCar, vEnemyPos)
IF ABSF(vEnemyOffsetFromBuddy.x) > ABSF(vEnemyOffsetFromBuddy.y)
IF vEnemyOffsetFromBuddy.x > 0.0
strNearMissLabel = "FH3A_MERRYR"
ELSE
strNearMissLabel = "FH3A_MERRYL"
ENDIF
ELSE
IF vEnemyOffsetFromBuddy.y > 0.0
strNearMissLabel = "FH3A_MERRYF"
ELSE
strNearMissLabel = "FH3A_MERRYB"
ENDIF
ENDIF
ENDIF
RETURN strNearMissLabel
ENDFUNC
PROC UPDATE_CREW_CHASE_RECORDING_TO_MATCH_SELECTIONS()
IF bPickedGoodCarDriver
IF bPickedGoodTruckDriver
iCarrecChaseBuddy3 = CARREC_CHASE_BUDDY_3_GOOD_TRUCK
ELSE
iCarrecChaseBuddy3 = CARREC_CHASE_BUDDY_3_BAD_TRUCK
ENDIF
ELSE
iCarrecChaseBuddy3 = CARREC_CHASE_BUDDY_3_BAD_DRIVER
ENDIF
ENDPROC
PROC RUBBER_BAND_CHASE(FLOAT &fCurrentSpeed, VEHICLE_INDEX vehPlayer, VEHICLE_INDEX vehTrigger)
IF IS_VEHICLE_DRIVEABLE(vehTrigger)
AND IS_VEHICLE_DRIVEABLE(vehPlayer)
VECTOR vPlayerPos = GET_ENTITY_COORDS(vehPlayer)
VECTOR vTriggerPos = GET_ENTITY_COORDS(vehTrigger)
//Rubber banding
FLOAT fDist = VDIST(vPlayerPos, vTriggerPos)
FLOAT fTouchingDist = 4.5
FLOAT fDesiredDist = 8.0
FLOAT fMaxDist = 70.0
FLOAT fSuperMaxDist = 100.0
FLOAT fDesiredPlaybackSpeed = 1.0
FLOAT fAccel = 0.0
FLOAT fPlayersSpeedModifier = 0.0
FLOAT fMaxDistInFront = 30.0
FLOAT fPlayerSpeed = GET_ENTITY_SPEED(vehPlayer)
FLOAT fSpeedDiff = GET_ENTITY_SPEED(vehTrigger) - fPlayerSpeed
//Default values for any adjustments to the player's speed and the playback accel.
IF IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
fAccel = 0.025
fPlayersSpeedModifier = -25.0
ELSE
fAccel = 0.01
fPlayersSpeedModifier = 0.0
ENDIF
//Special cases:
IF fChasePlaybackTime < 10000.0 //Start of chase: don't let cars shoot ahead
fDesiredDist = 10.0
fTouchingDist = 0.0
fMaxDist = 20.0
fSuperMaxDist = 50.0
ENDIF
IF fChasePlaybackTime > 58000.0 AND fChasePlaybackTime < 71000.0 //Get cars further in front for the jump.
fDesiredDist = 15.0
fTouchingDist = 7.5
fMaxDist = 90.0
fAccel *= 0.5
//During the actual jump speed up even more.
IF fCurrentTimeScale < 0.5 AND fChasePlaybackTime > 69000.0
fDesiredDist = 30.0
fTouchingDist = 15.0
fAccel *= 3.0
ENDIF
ENDIF
IF fChasePlaybackTime > 71000.0 AND fChasePlaybackTime < 81000.0 //Straight after the jump bring them back closer.
fMaxDist = 30.0
fSuperMaxDist = 50.0
fAccel *= 1.5
ENDIF
IF fChasePlaybackTime > 90000.0 //Approaching trucks: keep cars further forward.
fDesiredDist = 20.0
fMaxDist = 80.0
ENDIF
FLOAT fDistRatio = 0.0
VECTOR vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrigger, vPlayerPos)
IF vOffset.y < 1.0
//Player is behind
IF fDist > fMaxDist
//Player is a long way behind, slow the trigger car down by a lot (if not on screen).
BOOl bInsanelyFarBehind = FALSE
IF fDist > fSuperMaxDist
IF fDist > 200.0
bInsanelyFarBehind = TRUE
ENDIF
fDist = fSuperMaxDist
ENDIF
fDistRatio = ((fDist - fMaxDist) / (fSuperMaxDist - fMaxDist))
IF IS_ENTITY_ON_SCREEN(vehTrigger) AND NOT bInsanelyFarBehind
IF fSpeedDiff > 10.0
fDesiredPlaybackSpeed = 0.7 - (0.2 * fDistRatio)
ELSE
fDesiredPlaybackSpeed = 0.7 - (0.1 * fDistRatio)
ENDIF
ELSE
fDesiredPlaybackSpeed = 0.7 - (0.4 * fDistRatio) //0.5 - (0.3 * fDistRatio)
ENDIF
ELIF fDist > fDesiredDist
//Player is somewhat behind, slow the trigger car down relative to how far behind the player is.
fDistRatio = ((fDist - fDesiredDist) / (fMaxDist - fDesiredDist))
fDesiredPlaybackSpeed = 1.0 - (0.3 * fDistRatio)
ELSE
//Player is getting too close, speed up the trigger car relative to how close the player is.
IF fDist < fTouchingDist
fDist = fTouchingDist
ENDIF
fDistRatio = (fDesiredDist - fDist) / (fDesiredDist - fTouchingDist)
IF IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
fDesiredPlaybackSpeed = 1.0 + (fDistRatio * 2.0)
ELSE
fDesiredPlaybackSpeed = 1.0 + (fDistRatio)
ENDIF
ENDIF
ELSE
//Player is in front, speed up trigger car based on the player's own speed.
IF fDist > fMaxDistInFront
fDist = fMaxDistInFront
ENDIF
fDistRatio = fDist / fMaxDistInFront
//If the player is already going slower then don't speed up the buddy as much.
IF fSpeedDiff > 0.0
fDistRatio = fDistRatio * 0.5
ENDIF
IF IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
fDesiredPlaybackSpeed = 2.0 + fDistRatio
ELSE
IF GET_ENTITY_SPEED(vehPlayer) < 5.0 //If the player has slowed down slow the buddy down so it's not as harsh if they plough through.
AND fSpeedDiff > 0.0
fDesiredPlaybackSpeed = 0.6 + fDistRatio
ELSE
fDesiredPlaybackSpeed = 1.0 + fDistRatio
ENDIF
ENDIF
ENDIF
//Cap the max speed at the start.
IF fChasePlaybackTime < 10000.0
AND fDesiredPlaybackSpeed > 1.0
fDesiredPlaybackSpeed = 1.0
ENDIF
//Push the cars ahead by a lot when doing the stunt jump.
IF fCurrentTimeScale < 0.5
fAccel *= 4.0
IF fDesiredPlaybackSpeed >= 1.0
fDesiredPlaybackSpeed *= 1.5
ENDIF
ENDIF
//Slow the chase down at the end
IF fChasePlaybackTime > 114000.0
AND fDesiredPlaybackSpeed > 0.9
fDesiredPlaybackSpeed = 0.9
ENDIF
//If the player doesn't go into the tunnel don't rubber band.
IF fChasePlaybackTime > 102000.0 AND vPlayerPos.z > 15.0 AND fDesiredPlaybackSpeed < 1.0
fDesiredPlaybackSpeed = 1.0
ENDIF
//Once all of the cars are on the trucks don't speed up the chase.
IF (bPickedGoodCarDriver AND NOT IS_ENTITY_DEAD(sGoldCars[2].veh) AND IS_ENTITY_ATTACHED(sGoldCars[2].veh))
OR (NOT bPickedGoodCarDriver AND fChasePlaybackTime > 109000.0)
IF fDesiredPlaybackSpeed > 0.8
fDesiredPlaybackSpeed = 0.8
ENDIF
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
AND NOT IS_ENTITY_DEAD(sGoldCars[0].veh)
IF (VDIST2(vPlayerPos, GET_ENTITY_COORDS(vehTrailer[0])) < 900.0 AND NOT IS_ENTITY_ON_SCREEN(sGoldCars[1].veh))
OR IS_ENTITY_ATTACHED(sGoldCars[1].veh)
fDesiredPlaybackSpeed = 0.5
ENDIF
ENDIF
fAccel = 0.02
ENDIF
//If the trigger speed is trying to catch up from really slow then increase the acceleration.
IF fCurrentSpeed < 1.0
AND fDesiredPlaybackSpeed > fCurrentSpeed
fAccel *= 2.0
ENDIF
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vehPlayer)
fDesiredPlaybackSpeed = 1.0
ENDIF
//Modify the player's speed further based on the desired speed.
IF fDesiredPlaybackSpeed > 1.0
fPlayersSpeedModifier = fPlayersSpeedModifier - ((fDesiredPlaybackSpeed - 1.0) * 10.0)
ENDIF
//If the player is approaching the trucks then lower the top speed even more.
IF fChasePlaybackTime > 106000.0
AND NOT IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
IF VDIST2(vPlayerPos, GET_ENTITY_COORDS(vehTrailer[0])) < 10000.0
fPlayersSpeedModifier -= 20.0
IF fPlayerSpeed > 35.0
FLOAT fNewSpeed = fPlayerSpeed -@ (fPlayerSpeed * 0.2)
SET_VEHICLE_FORWARD_SPEED(vehPlayer, fNewSpeed)
ENDIF
/*AND IS_VEHICLE_ON_ALL_WHEELS(vehPlayer)
VECTOR vVel = GET_ENTITY_VELOCITY(vehPlayer)
vVel = vVel -@ (vVel * 5.0)
PRINTLN(vVel)
SET_ENTITY_VELOCITY(vehPlayer, vVel)
ENDIF*/
ENDIF
ENDIF
ENDIF
//Make the speed changes.
MODIFY_VEHICLE_TOP_SPEED(sGoldCars[PLAYERS_GOLD_CAR].veh, fPlayersSpeedModifier)
fCurrentSpeed = fCurrentSpeed +@ (((fDesiredPlaybackSpeed - fCurrentSpeed) * fAccel) * 30.0)
#IF IS_DEBUG_BUILD
IF bDebugShowChaseStats
SET_TEXT_SCALE(0.5, 0.5)
TEXT_LABEL_63 strDist = "Distance: "
strDist += GET_STRING_FROM_FLOAT(fDist)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.1, "STRING", strDist)
SET_TEXT_SCALE(0.5, 0.5)
TEXT_LABEL_63 strSpeed = "Playback speed: "
strSpeed += GET_STRING_FROM_FLOAT(fChasePlaybackSpeed)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.15, "STRING", strSpeed)
SET_TEXT_SCALE(0.5, 0.5)
TEXT_LABEL_63 strTime = "Time: "
strTime += GET_STRING_FROM_FLOAT(fChasePlaybackTime)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.2, "STRING", strTime)
SET_TEXT_SCALE(0.5, 0.5)
TEXT_LABEL_63 strDiff = "Speed Diff: "
strDiff += GET_STRING_FROM_FLOAT(GET_ENTITY_SPEED(vehTrigger) - GET_ENTITY_SPEED(vehPlayer))
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.25, "STRING", strDiff)
SET_TEXT_SCALE(0.5, 0.5)
TEXT_LABEL_63 strState = "Trigger car state: "
IF vOffset.y < 0.0
strState += "in front and "
ELSE
strState += "behind and "
ENDIF
IF IS_ENTITY_ON_SCREEN(vehTrigger)
strState += "on screen."
ELSE
strState += "off screen."
ENDIF
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.3, "STRING", strState)
ENDIF
#ENDIF
ENDIF
ENDPROC
PROC DO_TREVOR_STOCKADE_CAM()
IF IS_PHONE_ONSCREEN()
iCineCamPhoneTimer = GET_GAME_TIMER()
ENDIF
#IF IS_DEBUG_BUILD SCRIPT_ASSERT("PRIVATE_IsChaseHintCamButtonPressedInVehicle") #ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND PRIVATE_IsChaseHintCamButtonPressedInVehicle()
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh)
IF NOT IS_PHONE_ONSCREEN()
IF GET_GAME_TIMER() - iCineCamPhoneTimer > 1000
IF NOT DOES_CAM_EXIST(camChase)
camChase = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
SHAKE_CAM(camChase, "SKY_DIVING_SHAKE", 0.05)
ATTACH_CAM_TO_ENTITY(camChase, sGoldVans[1].veh, <<-0.3060, 0.1135, 1.6573>>)
POINT_CAM_AT_ENTITY(camChase, sGoldVans[1].veh, <<-0.5548, 3.0824, 1.3055>>)
SET_CAM_FOV(camChase, 55.5556)
ENDIF
IF NOT IS_CAM_RENDERING(camChase)
SET_CAM_ACTIVE(camChase, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
//Clean up cinematic cam
IF DOES_CAM_EXIST(camChase)
IF IS_CAM_RENDERING(camChase)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC EMPTY_TROLLEY_DURING_SHOOTOUT(INT iTrolleyIndex)
REQUEST_MODEL(modelContainerAlt1)
REQUEST_MODEL(modelContainerAlt2)
REQUEST_MODEL(modelContainerAlt3)
IF NOT IS_ENTITY_DEAD(sGoldVans[iTrolleyIndex].veh)
AND DOES_ENTITY_EXIST(objGoldTrolleys[iTrolleyIndex])
BOOL bReadyToEmptyTrolley = FALSE
IF (iTrolleyEmptyingStage[iTrolleyIndex] = 0 AND iCurrentTake > iMaxTakeConsideringCrew / 4)
OR (iTrolleyEmptyingStage[iTrolleyIndex] = 1 AND iCurrentTake > iMaxTakeConsideringCrew / 2)
OR (iTrolleyEmptyingStage[iTrolleyIndex] = 2 AND iCurrentTake > (iMaxTakeConsideringCrew / 4) * 3)
IF NOT IS_SPHERE_VISIBLE(GET_ENTITY_COORDS(objGoldTrolleys[iTrolleyIndex]), 2.0)
bReadyToEmptyTrolley = TRUE
ENDIF
ENDIF
IF bReadyToEmptyTrolley
SWITCH iTrolleyEmptyingStage[iTrolleyIndex]
CASE 0
REMOVE_OBJECT(objGoldTrolleys[iTrolleyIndex], TRUE)
objGoldTrolleys[iTrolleyIndex] = CREATE_OBJECT_NO_OFFSET(modelContainerAlt1,
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[0].veh, <<0.0, -2.2, 0.8>>))
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[iTrolleyIndex], sGoldVans[iTrolleyIndex].veh, 0, <<0.0, -2.2, 0.8>>, <<0.0, 0.0, 89.0>>)
BREAK
CASE 1
REMOVE_OBJECT(objGoldTrolleys[iTrolleyIndex], TRUE)
objGoldTrolleys[iTrolleyIndex] = CREATE_OBJECT_NO_OFFSET(modelContainerAlt2,
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[0].veh, <<0.0, -2.2, 0.8>>))
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[iTrolleyIndex], sGoldVans[iTrolleyIndex].veh, 0, <<0.0, -2.2, 0.8>>, <<0.0, 0.0, 89.0>>)
BREAK
CASE 2
REMOVE_OBJECT(objGoldTrolleys[iTrolleyIndex], TRUE)
objGoldTrolleys[iTrolleyIndex] = CREATE_OBJECT_NO_OFFSET(modelContainerAlt3,
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[0].veh, <<0.0, -2.2, 0.8>>))
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[iTrolleyIndex], sGoldVans[iTrolleyIndex].veh, 0, <<0.0, -2.2, 0.8>>, <<0.0, 0.0, 89.0>>)
BREAK
ENDSWITCH
iTrolleyEmptyingStage[iTrolleyIndex]++
ENDIF
ENDIF
ENDPROC
PROC SET_TROLLEY_SOUNDS_ACTIVE(BOOL bActive)
IF bActive
IF DOES_ENTITY_EXIST(objGoldTrolleys[0])
AND DOES_ENTITY_EXIST(objGoldTrolleys[1])
IF HAS_SOUND_FINISHED(iGoldTrolleySoundID[0])
PLAY_SOUND_FROM_ENTITY(iGoldTrolleySoundID[0], "Gold_Trolley_Roll_Player", objGoldTrolleys[0], "BIG_SCORE_3A_SOUNDS")
ENDIF
IF HAS_SOUND_FINISHED(iGoldTrolleySoundID[1])
PLAY_SOUND_FROM_ENTITY(iGoldTrolleySoundID[1], "Gold_Trolley_Roll_NPC", objGoldTrolleys[1], "BIG_SCORE_3A_SOUNDS")
ENDIF
ENDIF
ELSE
IF NOT HAS_SOUND_FINISHED(iGoldTrolleySoundID[0])
STOP_SOUND(iGoldTrolleySoundID[0])
ENDIF
IF NOT HAS_SOUND_FINISHED(iGoldTrolleySoundID[1])
STOP_SOUND(iGoldTrolleySoundID[1])
ENDIF
ENDIF
ENDPROC
///May need to add more roads for this
PROC SET_ROADS_BLOCKED_FOR_BANK_DRIVE(BOOL bBlocked)
IF bBlocked
SET_ROADS_IN_ANGLED_AREA(<<110.448364,-585.028870,30.621614>>, <<45.294167,-760.642517,37.113495>>, 11.500000, FALSE, FALSE)
SET_ROADS_IN_ANGLED_AREA(<<125.681503,-573.059998,24.874260>>, <<328.602509,-658.280212,34.331116>>, 24.000000, FALSE, FALSE)
//SET_ROADS_IN_AREA(<<102.0942, -574.5608, 20.2721>>, <<110.4552, -562.3591, 37.2721>>, FALSE)
ELSE
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<110.448364,-585.028870,30.621614>>, <<45.294167,-760.642517,37.113495>>, 11.500000)
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<125.681503,-573.059998,33.874260>>, <<328.602509,-658.280212,27.331116>>, 21.000000)
//SET_ROADS_BACK_TO_ORIGINAL(<<102.0942, -574.5608, 20.2721>>, <<110.4552, -562.3591, 37.2721>>)
ENDIF
ENDPROC
PROC SET_FORCED_OBJECTS_FOR_CHASE(BOOL bSetActive)
IF bSetActive
//Building site
CREATE_FORCED_OBJECT(<<7.92, -391.17, 38.42>>, 2.0, PROP_BARRIER_WORK06A, TRUE)
CREATE_FORCED_OBJECT(<<7.33, -393.29, 38.42>>, 2.0, PROP_BARRIER_WORK06A, TRUE)
CREATE_FORCED_OBJECT(<<6.63, -395.65, 38.42>>, 2.0, PROP_BARRIER_WORK06A, TRUE)
CREATE_FORCED_OBJECT(<<6.00, -398.00, 38.43>>, 2.0, PROP_BARRIER_WORK06A, TRUE)
//Stunt jump
CREATE_FORCED_OBJECT(<<-241.33, -210.51, 48.00>>, 2.0, PROP_BARRIER_WORK06A, TRUE)
CREATE_FORCED_OBJECT(<<-245.66, -213.24, 48.00>>, 2.0, PROP_BARRIER_WORK06A, TRUE)
ELSE
//Building site
REMOVE_FORCED_OBJECT(<<7.92, -391.17, 38.42>>, 2.0, PROP_BARRIER_WORK06A)
REMOVE_FORCED_OBJECT(<<7.33, -393.29, 38.42>>, 2.0, PROP_BARRIER_WORK06A)
REMOVE_FORCED_OBJECT(<<6.63, -395.65, 38.42>>, 2.0, PROP_BARRIER_WORK06A)
REMOVE_FORCED_OBJECT(<<6.00, -398.00, 38.43>>, 2.0, PROP_BARRIER_WORK06A)
//Stunt jump
REMOVE_FORCED_OBJECT(<<-241.33, -210.51, 48.00>>, 2.0, PROP_BARRIER_WORK06A)
REMOVE_FORCED_OBJECT(<<-245.66, -213.24, 48.00>>, 2.0, PROP_BARRIER_WORK06A)
ENDIF
ENDPROC
//There are some traffic cones in the way at certain points of the mission, this turns them on/off.
PROC SET_TRAFFIC_CONES_ACTIVE(BOOL bSetActive)
IF NOT bSetActive
//In front of strip club (spawns inside the car location).
CREATE_MODEL_HIDE(<<134.80, -1305.21, 28.34>>, 3.0, PROP_ROADCONE02A, TRUE)
//At stunt jump: these make it very difficult for the player to complete the jump.
CREATE_MODEL_HIDE(<<-235.97, -210.19, 47.95>>, 2.0, PROP_ROADCONE02A, TRUE)
CREATE_MODEL_HIDE(<<-238.71, -211.73, 47.95>>, 2.0, PROP_ROADCONE02A, TRUE)
CREATE_MODEL_HIDE(<<-241.60, -212.92, 47.95>>, 2.0, PROP_ROADCONE02A, TRUE)
ELSE
REMOVE_MODEL_HIDE(<<134.80, -1305.21, 28.34>>, 2.0, PROP_ROADCONE02A, TRUE)
REMOVE_MODEL_HIDE(<<-235.97, -210.19, 47.95>>, 2.0, PROP_ROADCONE02A, TRUE)
REMOVE_MODEL_HIDE(<<-238.71, -211.73, 47.95>>, 2.0, PROP_ROADCONE02A, TRUE)
REMOVE_MODEL_HIDE(<<-241.60, -212.92, 47.95>>, 2.0, PROP_ROADCONE02A, TRUE)
ENDIF
ENDPROC
//Temporarily remove/move some objects in the shootout, as they're in the way.
PROC SETUP_REQ_REMOVE_JUNK_FOR_SHOOTOUT(BOOL bRemove)
/*IF NOT DOES_ENTITY_EXIST(objShootoutPallet)
objShootoutPallet = GET_CLOSEST_OBJECT_OF_TYPE(<<127.6, -1217.0, 28.9>>, 3.0, prop_pallet_03a)
IF DOES_ENTITY_EXIST(objShootoutPallet)
SET_ENTITY_COORDS(objShootoutPallet, GET_ENTITY_COORDS(objShootoutPallet) + <<0.0, 0.0, -20.0>>)
FREEZE_ENTITY_POSITION(objShootoutPallet, TRUE)
ENDIF
ENDIF*/
IF bRemove
CREATE_MODEL_HIDE(<<127.6, -1217.0, 28.9>>, 3.0, prop_pallet_03a, TRUE)
CREATE_MODEL_HIDE(<<158.7, -1206.6, 29.1>>, 3.0, PROP_HOMELES_SHELTER_02, TRUE)
CREATE_MODEL_HIDE(<<171.78, -1219.39, 28.4>>, 3.0, PROP_SKID_BOX_04, TRUE)
CREATE_MODEL_HIDE(<<179.988, -1206.92, 28.3>>, 3.0, PROP_SKID_BOX_05, TRUE)
OBJECT_INDEX objContainer = GET_CLOSEST_OBJECT_OF_TYPE(<<185.6665, -1238.3120, 28.2079>>, 5.0, prop_rub_cont_01b, FALSE)
IF DOES_ENTITY_EXIST(objContainer)
SET_ENTITY_COORDS_NO_OFFSET(objContainer, <<185.6665, -1238.3120, 28.2079>>)
ENDIF
ELSE
REMOVE_MODEL_HIDE(<<127.6, -1217.0, 28.9>>, 3.0, prop_pallet_03a, TRUE)
REMOVE_MODEL_HIDE(<<158.7, -1206.6, 29.1>>, 3.0, PROP_HOMELES_SHELTER_02, TRUE)
REMOVE_MODEL_HIDE(<<171.78, -1219.39, 28.4>>, 3.0, PROP_SKID_BOX_04, TRUE)
REMOVE_MODEL_HIDE(<<179.988, -1206.92, 28.3>>, 3.0, PROP_SKID_BOX_05, TRUE)
ENDIF
//New trolley location (need prop)
//SET_ENTITY_COORDS_NO_OFFSET(entity, <<159.4629, -1211.0630, 28.8027>>)
//SET_ENTITY_ROTATION(entity, <<1.0766, 0.0000, -112.3111>>)
/*IF NOT DOES_ENTITY_EXIST(objShootoutShelter)
objShootoutShelter = GET_CLOSEST_OBJECT_OF_TYPE(<<143.0, -1217.31, 28.32>>, 3.0, prop_homeless_shelter_01)
IF DOES_ENTITY_EXIST(objShootoutShelter)
SET_ENTITY_COORDS(objShootoutShelter, GET_ENTITY_COORDS(objShootoutShelter) + <<0.0, 0.0, -20.0>>)
FREEZE_ENTITY_POSITION(objShootoutShelter, TRUE)
ENDIF
ENDIF*/
ENDPROC
///1790649 - A box always streams in later for the switch cutscene, just hide it until the cutscene is over.
PROC HIDE_JUNK_FOR_SWITCH_CUTSCENE(BOOL bHide)
IF bHide
CREATE_MODEL_HIDE(<<121.5, -1183.0, 29.8>>, 3.0, PROP_SKID_BOX_05, TRUE)
ELSE
REMOVE_MODEL_HIDE(<<121.5, -1183.0, 29.8>>, 3.0, PROP_SKID_BOX_05, TRUE)
ENDIF
ENDPROC
PROC SET_MICHAELS_HOUSE_FOR_FINAL_CUTSCENE(BOOL bLockDoors)
IF bLockDoors
//SET_DOOR_STATE(DOORNAME_M_MANSION_B_L, DOORSTATE_LOCKED)
//SET_DOOR_STATE(DOORNAME_M_MANSION_B_R, DOORSTATE_LOCKED)
SET_DOOR_STATE(DOORNAME_M_MANSION_G1, DOORSTATE_LOCKED)
SET_DOOR_STATE(DOORNAME_M_MANSION_GA_SM, DOORSTATE_LOCKED)
SET_DOOR_STATE(DOORNAME_M_MANSION_R_L1, DOORSTATE_LOCKED)
SET_DOOR_STATE(DOORNAME_M_MANSION_R_L2, DOORSTATE_LOCKED)
SET_DOOR_STATE(DOORNAME_M_MANSION_R_R1, DOORSTATE_LOCKED)
SET_DOOR_STATE(DOORNAME_M_MANSION_R_R2, DOORSTATE_LOCKED)
//SET_DOOR_STATE(DOORNAME_M_MANSION_F_L, DOORSTATE_FORCE_OPEN_THIS_FRAME)
//SET_DOOR_STATE(DOORNAME_M_MANSION_F_R, DOORSTATE_FORCE_OPEN_THIS_FRAME)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_MM_DOORM_L, <<-816.72, 179.10, 72.03>>, TRUE, 0.0, 0.0, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_MM_DOORM_R, <<-816.11, 177.51, 72.03>>, TRUE, 0.0, 0.0, -1.0)
ELSE
//SET_DOOR_STATE(DOORNAME_M_MANSION_B_L, DOORSTATE_UNLOCKED)
//SET_DOOR_STATE(DOORNAME_M_MANSION_B_R, DOORSTATE_UNLOCKED)
SET_DOOR_STATE(DOORNAME_M_MANSION_G1, DOORSTATE_UNLOCKED)
SET_DOOR_STATE(DOORNAME_M_MANSION_GA_SM, DOORSTATE_UNLOCKED)
SET_DOOR_STATE(DOORNAME_M_MANSION_R_L1, DOORSTATE_UNLOCKED)
SET_DOOR_STATE(DOORNAME_M_MANSION_R_L2, DOORSTATE_UNLOCKED)
SET_DOOR_STATE(DOORNAME_M_MANSION_R_R1, DOORSTATE_UNLOCKED)
SET_DOOR_STATE(DOORNAME_M_MANSION_R_R2, DOORSTATE_UNLOCKED)
//SET_DOOR_STATE(DOORNAME_M_MANSION_F_L, DOORSTATE_FORCE_CLOSED_THIS_FRAME)
//SET_DOOR_STATE(DOORNAME_M_MANSION_F_R, DOORSTATE_FORCE_CLOSED_THIS_FRAME)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_MM_DOORM_L, <<-816.72, 179.10, 72.03>>, FALSE, 0.0, 0.0, 0.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_MM_DOORM_R, <<-816.11, 177.51, 72.03>>, FALSE, 0.0, 0.0, 0.0)
SET_DOOR_STATE(DOORNAME_M_MANSION_F_L, DOORSTATE_FORCE_LOCKED_THIS_FRAME) //This should make sure the door is in the correct building controller state after the mission.
SET_DOOR_STATE(DOORNAME_M_MANSION_F_R, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
ENDIF
ENDPROC
PROC REMOVE_MICHAEL_SHOTGUN_SILENCER()
IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
BOOL bPlayerHadASilencer = FALSE
IF HAS_PED_GOT_WEAPON_COMPONENT(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, WEAPONCOMPONENT_AT_SR_SUPP)
REMOVE_WEAPON_COMPONENT_FROM_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, WEAPONCOMPONENT_AT_SR_SUPP)
bPlayerHadASilencer = TRUE
ENDIF
bRemovedShotgunSilencer = bPlayerHadASilencer
ENDIF
ENDPROC
PROC SET_CUTSCENE_PED_COMPONENT_VARIATIONS(STRING strCutsceneName)
INT iNameHash = GET_HASH_KEY(strCutsceneName)
CrewMember eForcedDriverID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_DRIVER)
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
IF iNameHash = HASH("bs_2a_mcs_10") //new intro
SET_HEIST_CREW_MEMBER_OUTFIT_EXTRA_PARAMS(NULL, "gunman_selection_1", GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_GUNMAN), CREW_OUTFIT_SECURITY)
//SET_HEIST_CREW_MEMBER_OUTFIT_EXTRA_PARAMS(NULL, "hacker_selection", GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER), CREW_OUTFIT_DEFAULT)
SET_HEIST_CREW_MEMBER_OUTFIT_FOR_CUTSCENE("hacker_selection", GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER), CREW_OUTFIT_DEFAULT)
SET_CUTSCENE_PED_PROP_VARIATION("Lester", ANCHOR_EYES, 0)
ELIF iNameHash = HASH("bs_2a_mcs_1")
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("gunman_selection_1", sCrew[CREW_GUNMAN].ped)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("driver_selection_1", sCrew[CREW_DRIVER].ped)
ENDIF
SET_HEIST_CREW_MEMBER_OUTFIT_EXTRA_PARAMS(NULL, "gunman_selection_2", GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_GUNMAN), CREW_OUTFIT_DEFAULT)
SET_HEIST_CREW_MEMBER_OUTFIT_EXTRA_PARAMS(NULL, "driver_selection_2", GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_DRIVER), CREW_OUTFIT_DEFAULT)
IF eForcedDriverID = CM_DRIVER_G_TALINA_UNLOCK
SET_CUTSCENE_PED_COMPONENT_VARIATION("driver_selection_2", PED_COMP_HAIR, 2, 0)
ELSE
SET_CUTSCENE_PED_COMPONENT_VARIATION("driver_selection_2", PED_COMP_HAIR, 0, 0)
ENDIF
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_2", PED_COMP_HAIR, 1, 0)
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Casey", sGoldVanPeds[CASEY_ID].ped)
SET_CUTSCENE_PED_PROP_VARIATION("Casey", ANCHOR_HEAD, 0, 0)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[1].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Left_Security", sGoldVanPeds[1].ped)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[2].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Middle_Security", sGoldVanPeds[2].ped)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[3].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Right_Security", sGoldVanPeds[3].ped)
ENDIF
ELIF iNameHash = HASH("bs_2a_mcs_2")
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("gunman_selection_1", sCrew[CREW_GUNMAN].ped)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Driver_selection", sCrew[CREW_DRIVER].ped)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Casey", sGoldVanPeds[CASEY_ID].ped)
SET_CUTSCENE_PED_PROP_VARIATION("Casey", ANCHOR_HEAD, 0, 0)
ENDIF
ELIF iNameHash = HASH("BS_2A_MCS_3_alt")
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Casey", sGoldVanPeds[CASEY_ID].ped)
SET_CUTSCENE_PED_PROP_VARIATION("Casey", ANCHOR_HEAD, 0, 0)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Bank_Employee", sBankWorker.ped)
ENDIF
ELIF iNameHash = HASH("bs_2a_mcs_4")
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Casey", sGoldVanPeds[CASEY_ID].ped)
SET_CUTSCENE_PED_PROP_VARIATION("Casey", ANCHOR_HEAD, 0, 0)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Bank_Employee", sBankWorker.ped)
ENDIF
IF NOT IS_PED_INJURED(sVaultWorker.ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Vault_Guy", sVaultWorker.ped)
ENDIF
ELIF iNameHash = HASH("bs_2a_mcs_5")
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Casey", sGoldVanPeds[CASEY_ID].ped)
SET_CUTSCENE_PED_PROP_VARIATION("Casey", ANCHOR_HEAD, 0, 0)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Bank_Employee", sBankWorker.ped)
ENDIF
ELIF iNameHash = HASH("bs_2a_mcs_6")
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Casey", sGoldVanPeds[CASEY_ID].ped)
SET_CUTSCENE_PED_PROP_VARIATION("Casey", ANCHOR_HEAD, 0, 0)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Bank_Employee", sBankWorker.ped)
ENDIF
ELIF iNameHash = HASH("BS_2A_MCS_7_P1")
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Casey", sGoldVanPeds[CASEY_ID].ped)
SET_CUTSCENE_PED_PROP_VARIATION("Casey", ANCHOR_HEAD, 0, 0)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Bank_Employee", sBankWorker.ped)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("gunman_selection_1", sCrew[CREW_GUNMAN].ped)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Driver_selection", sCrew[CREW_DRIVER].ped)
ENDIF
ELIF iNameHash = HASH("bs_2a_mcs_8")
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", GET_PED_INDEX(CHAR_FRANKLIN))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", GET_PED_INDEX(CHAR_MICHAEL))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Casey", sGoldVanPeds[CASEY_ID].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("gunman_selection_1", sCrew[CREW_GUNMAN].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("driver_selection", sCrew[CREW_DRIVER].ped)
ENDIF
SET_CUTSCENE_PED_PROP_VARIATION("Casey", ANCHOR_HEAD, 0, 0)
ELIF iNameHash = HASH("bs_2a_mcs_8_p3")
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", GET_PED_INDEX(CHAR_MICHAEL))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", GET_PED_INDEX(CHAR_FRANKLIN))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("gunman_selection_1", sCrew[CREW_GUNMAN].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("driver_selection", sCrew[CREW_DRIVER].ped)
ENDIF
ELIF iNameHash = HASH("bs_2a_mcs_11")
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", GET_PED_INDEX(CHAR_MICHAEL))
ENDIF
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", PLAYER_PED_ID())
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
ENDIF
SET_HEIST_CREW_MEMBER_OUTFIT_EXTRA_PARAMS(NULL, "gunman_selection_1", GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_GUNMAN), CREW_OUTFIT_DEFAULT)
SET_HEIST_CREW_MEMBER_OUTFIT_EXTRA_PARAMS(NULL, "driver_selection", GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_DRIVER), CREW_OUTFIT_DEFAULT)
SET_CUTSCENE_PED_COMPONENT_VARIATION("driver_selection", PED_COMP_HAIR, 0, 0)
ELIF iNameHash = HASH("bs_2a_ext")
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", GET_PED_INDEX(CHAR_MICHAEL))
ENDIF
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", PLAYER_PED_ID())
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("driver_selection", sCrew[CREW_DRIVER].ped)
ENDIF
IF NOT IS_PED_INJURED(pedLester)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Lester", pedLester)
ENDIF
SET_CUTSCENE_PED_PROP_VARIATION("Lester", ANCHOR_EYES, 0)
ENDIF
ENDIF
ENDPROC
PROC MISSION_SETUP()
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
CLEAR_HELP()
CLEAR_PRINTS()
REGISTER_SCRIPT_WITH_AUDIO(TRUE)
REQUEST_ADDITIONAL_TEXT("FINAL3A", MISSION_TEXT_SLOT)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, PLAYER_PED_ID(), "MICHAEL")
ADD_RELATIONSHIP_GROUP("COPS", relGroupCops)
ADD_RELATIONSHIP_GROUP("NEUTRAL", relGroupNeutral)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, relGroupCops)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, relGroupNeutral)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupCops, relGroupCops)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relGroupCops, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupCops, relGroupNeutral)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupNeutral, relGroupNeutral)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupNeutral, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupNeutral, relGroupCops)
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
DISABLE_TAXI_HAILING(TRUE)
SUPPRESS_EMERGENCY_CALLS()
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelChaseCars, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelGoldVan, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelStartCar, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(CAVALCADE2, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(CAVALCADE, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_BIKE), TRUE)
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P0_HEADSET)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_01_AP, TRUE)
SET_ALL_CLOTHES_SHOPS_DISABLED(TRUE)
//DISABLE_STRIP_CLUBS()
//Lock all of the vault doors for the entire mission (the last one is open as it needs to be open during the bank tour).
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-7.4, -678.7, 16.4>>, TRUE, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<4.4, -682.9, 16.4>>, TRUE, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-3.0, -676.6, 16.4>>, TRUE, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<2.3, -678.6, 16.4>>, TRUE, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-1.0, -671.1, 16.4>>, TRUE, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<4.3, -673.0, 16.4>>, TRUE, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<8.2, -672.4, 16.4>>, TRUE, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-3.6, -668.2, 16.4>>, TRUE, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<10.6, -666.6, 16.4>>, TRUE, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-1.6562, -662.1329, 16.3586>>, TRUE, 0.0, 0.0, -2.1250)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<144.3611, -1330.6985, 10.2414>>, <<187.7694, -1299.4413, 52.2414>>, FALSE)
iLiftSoundID = GET_SOUND_ID()
iLiftMoveSoundID = GET_SOUND_ID()
iBankGateOpenSound = GET_SOUND_ID()
iVaultDoorOpenSoundID = GET_SOUND_ID()
iVaultDoorCloseSoundID = GET_SOUND_ID()
iMoneyCountSoundID = GET_SOUND_ID()
iGoldTrolleySoundID[0] = GET_SOUND_ID()
iGoldTrolleySoundID[1] = GET_SOUND_ID()
iTrailerRampSounds[0] = GET_SOUND_ID()
iTrailerRampSounds[1] = GET_SOUND_ID()
iTrailerRampRaiseSounds[0] = GET_SOUND_ID()
iTrailerRampRaiseSounds[1] = GET_SOUND_ID()
sTrafficGame.iBackgroundSound = GET_SOUND_ID()
sTrafficGame.iStaticSound = GET_SOUND_ID()
sTrafficGame.iSelectSound = GET_SOUND_ID()
iWooshSoundID = GET_SOUND_ID()
ADD_DOOR_TO_SYSTEM(iBankExitBarrierHash, prop_sec_barrier_ld_01a, <<63.0577, -625.9503, 31.7126>>)
sbiSecurityVans[0] = ADD_SCENARIO_BLOCKING_AREA(<<-51.264175,-763.883057,0.850182>>, <<-31.748135,-745.944641,39.850182>>)
sbiSecurityVans[1] = ADD_SCENARIO_BLOCKING_AREA(<<152.7736, -1040.3269, 0.4272>>, <<167.3881, -1024.5648, 35.4272>>)
SET_TRAFFIC_CONES_ACTIVE(FALSE)
RESET_GENERIC_SCORE_FLASHING(0)
INT i = 0
REPEAT COUNT_OF(iNavmeshBlockShootout) i
iNavmeshBlockShootout[i] = -1
ENDREPEAT
SET_INTERIOR_CAPPED(INTERIOR_DT1_03_CARPARK, FALSE)
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_HOLE_COVER, BUILDINGSTATE_DESTROYED)
SET_BUILDING_STATE( BUILDINGNAME_IPL_JEWEL_HEIST_BIKE_TUNNELS, BUILDINGSTATE_DESTROYED)
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_BANK, BUILDINGSTATE_DESTROYED)
#IF IS_DEBUG_BUILD
CREATE_WIDGETS()
sSkipMenu[0].sTxtLabel = "START_CUTSCENE (BS_2A_MCS_10)"
sSkipMenu[1].sTxtLabel = "SET_UP_STINGER"
sSkipMenu[2].sTxtLabel = "VAN_CRASH_CUTSCENE"
sSkipMenu[3].sTxtLabel = "HIJACK_VANS"
sSkipMenu[4].sTxtLabel = "HIJACK_CUTSCENE (BS_2A_MCS_1)"
sSkipMenu[5].sTxtLabel = "DRIVE_TO_BANK"
sSkipMenu[6].sTxtLabel = "BANK_PARK_CUTSCENE (BS_2A_MCS_2)"
sSkipMenu[7].sTxtLabel = "WALK_TO_LIFT_1"
sSkipMenu[8].sTxtLabel = "LIFT_CUTSCENE_1 (BS_2A_MCS_3_alt)"
sSkipMenu[9].sTxtLabel = "WALK_TO_VAULT"
sSkipMenu[10].sTxtLabel = "VAULT_OPEN_CUTSCENE (BS_2A_MCS_4)"
sSkipMenu[11].sTxtLabel = "WALK_TO_GOLD"
sSkipMenu[12].sTxtLabel = "COLLECT_GOLD_CUTSCENE (BS_2A_MCS_5)"
sSkipMenu[13].sTxtLabel = "WALK_TO_LIFT_2"
sSkipMenu[14].sTxtLabel = "LIFT_CUTSCENE_2 (BS_2A_MCS_6)"
sSkipMenu[15].sTxtLabel = "WALK_TO_VANS"
sSkipMenu[16].sTxtLabel = "LOAD_GOLD_IN_VANS_CUTSCENE (BS_2A_MCS_7_P1)"
sSkipMenu[17].sTxtLabel = "LEAVE_BANK"
sSkipMenu[18].sTxtLabel = "SWAP_TO_FRANKLIN_CUTSCENE"
sSkipMenu[19].sTxtLabel = "TRAFFIC_CONTROL"
sSkipMenu[20].sTxtLabel = "ARRIVAL_CUTSCENE (BS_2A_MCS_8)"
sSkipMenu[21].sTxtLabel = "SHOOTOUT"
sSkipMenu[22].sTxtLabel = "CHASE_START_CUTSCENE (BS_2A_MCS_8_P3)"
sSkipMenu[23].sTxtLabel = "CHASE"
sSkipMenu[24].sTxtLabel = "CHASE_END_CUTSCENE"
sSkipMenu[25].sTxtLabel = "DROP_OFF_CUTSCENE (BS_2A_MCS_11)"
sSkipMenu[26].sTxtLabel = "GO_TO_MICHAELS_HOUSE"
sSkipMenu[27].sTxtLabel = "FINAL_CUTSCENE (BS_2A_MCS_9)"
#ENDIF
bHasChangedClothesMichael = GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL)
bHasChangedClothesFranklin = GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN)
bHasChangedClothesTrevor = GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR)
//iTotalEnemiesInShootout = COUNT_OF(sCopsStart) + COUNT_OF(sCopsWave2) + COUNT_OF(sVanFlank) + COUNT_OF(sVanCrash) + COUNT_OF(sNooseRope1) + COUNT_OF(sNooseAbove) + COUNT_OF(sGoonsWave3b)
iTotalEnemiesInShootout = COUNT_OF(sCopsStart) + COUNT_OF(sCopsWave2) + COUNT_OF(sVanFlank) + COUNT_OF(sVanCrash) + COUNT_OF(sNooseRope1) + COUNT_OF(sGoonsWave3b)
iMaxTakeConsideringCrew = MAX_OVERALL_TAKE
iTakePenaltyCaseysCut = 300000
iTakePenaltyDropGold = 0
iTakePenaltyCrewDies = 0
//Remove Casey's cut first, as all other calculations are based off percentages of this value.
INT iMaxTakeMinusCaseysCut = MAX_OVERALL_TAKE - iTakePenaltyCaseysCut
iMaxTakeConsideringCrew = iMaxTakeMinusCaseysCut
//Store the skill levels of the crew members for use later
IF GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER)) = CMSK_GOOD
bPickedGoodCarDriver = TRUE
ELSE
bPickedGoodCarDriver = FALSE
iTakePenaltyDropGold += ROUND(TO_FLOAT(iMaxTakeMinusCaseysCut) * 0.09)
ENDIF
IF GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_DRIVER)) = CMSK_GOOD
OR GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_DRIVER)) = CMSK_MEDIUM
bPickedGoodTruckDriver = TRUE
ELSE
bPickedGoodTruckDriver = FALSE
ENDIF
IF GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_GUNMAN)) = CMSK_GOOD
bPickedGoodGunman = TRUE
ELSE
bPickedGoodGunman = FALSE
iTakePenaltyDropGold += ROUND(TO_FLOAT(iMaxTakeMinusCaseysCut) * 0.09)
ENDIF
iMaxTakeConsideringCrew -= iTakePenaltyDropGold
IF GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_GUNMAN)) = CMSK_GOOD
bPickedGoodSecondGunman = TRUE
ELSE
bPickedGoodSecondGunman = FALSE
ENDIF
IF GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER)) = CMSK_BAD
iHackerLevel = HACKER_LEVEL_BAD
ELIF GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER)) = CMSK_MEDIUM
iHackerLevel = HACKER_LEVEL_MEDIUM
ELSE
iHackerLevel = HACKER_LEVEL_GOOD
ENDIF
UPDATE_CREW_CHASE_RECORDING_TO_MATCH_SELECTIONS()
bPCCOntrolsSetup = FALSE
ENDPROC
PROC MISSION_CLEANUP()
IF NOT HAS_CUTSCENE_FINISHED()
STOP_CUTSCENE()
ENDIF
REMOVE_CUTSCENE()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
WHILE IS_CUTSCENE_ACTIVE()
WAIT(0)
ENDWHILE
ENDIF
//If we started a replay recording then make sure it's cancelled if we're performing cleanup.
IF bReplayEventStarted
REPLAY_STOP_EVENT()
bReplayEventStarted = FALSE
ENDIF
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_VEHICLE_POPULATION_BUDGET(3)
SET_PED_POPULATION_BUDGET(3)
SET_CREATE_RANDOM_COPS(TRUE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, TRUE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
DISABLE_CELLPHONE(FALSE)
HIDE_ACTIVE_PHONE(FALSE)
DISABLE_VEHICLE_GEN_ON_MISSION(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
SET_STUNT_JUMPS_CAN_TRIGGER(TRUE)
SET_FRONTEND_RADIO_ACTIVE(TRUE)
SET_AGGRESSIVE_HORNS(FALSE)
SET_RANDOM_TRAINS(TRUE)
SET_GPS_DISABLED_ZONE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
STOP_GAMEPLAY_CAM_SHAKING(FALSE)
STOP_GAMEPLAY_HINT()
CLEAR_FOCUS()
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_DOWN, FALSE)
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_UP, FALSE)
SET_SRL_FORCE_PRESTREAM(SRL_PRESTREAM_DEFAULT)
SET_NO_LOADING_SCREEN(FALSE)
IF bSlomoActive
SET_TIME_SCALE(1.0)
bSlomoActive = FALSE
ENDIF
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
IF IS_ENTITY_ATTACHED_TO_ANY_VEHICLE(PLAYER_PED_ID())
DETACH_ENTITY(PLAYER_PED_ID())
ENDIF
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
CLEAR_PED_TASKS(PLAYER_PED_ID())
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), FALSE)
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE)
SET_ENTITY_PROOFS(PLAYER_PED_ID(), FALSE, FALSE, FALSE, FALSE, FALSE)
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, TRUE)
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
SET_POLICE_RADAR_BLIPS(TRUE)
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), TRUE)
SET_MAX_WANTED_LEVEL(5)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
SET_PED_CURRENT_WEAPON_VISIBLE(PLAYER_PED_ID(), TRUE)
ENDIF
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
ENDIF
ENDIF
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
ENDIF
IF STREAMVOL_IS_VALID(svChaseStart)
STREAMVOL_DELETE(svChaseStart)
svChaseStart = NULL
ENDIF
SET_RENDER_HD_ONLY(FALSE)
IF NOT IS_ENTITY_DEAD(sGoldVans[0].veh)
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_UNLOCKED)
ENDIF
IF sbiStripClub != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbiStripClub)
ENDIF
INT i = 0
REPEAT COUNT_OF(ptfxRampSparks) i
IF ptfxRampSparks[i] != NULL
STOP_PARTICLE_FX_LOOPED(ptfxRampSparks[i])
ptfxRampSparks[i] = NULL
ENDIF
ENDREPEAT
IF interiorTunnel != NULL
UNPIN_INTERIOR(interiorTunnel)
interiorTunnel = NULL
ENDIF
IF interiorTunnel2 != NULL
UNPIN_INTERIOR(interiorTunnel2)
interiorTunnel2 = NULL
ENDIF
IF interiorTunnel3 != NULL
UNPIN_INTERIOR(interiorTunnel3)
interiorTunnel3 = NULL
ENDIF
IF interiorBank != NULL
UNPIN_INTERIOR(interiorBank)
interiorBank = NULL
ENDIF
IF interiorBankCarPark != NULL
UNPIN_INTERIOR(interiorBankCarPark)
interiorBankCarPark = NULL
ENDIF
IF interiorMichaelsHouse != NULL
UNPIN_INTERIOR(interiorMichaelsHouse)
interiorMichaelsHouse = NULL
ENDIF
IF interiorBackgroundCarPark != NULL
UNPIN_INTERIOR(interiorBackgroundCarPark)
interiorBackgroundCarPark = NULL
ENDIF
REPEAT COUNT_OF(interiorChaseTunnel) i
IF interiorChaseTunnel[i] != NULL
UNPIN_INTERIOR(interiorChaseTunnel[i])
interiorChaseTunnel[i] = NULL
ENDIF
ENDREPEAT
IF sbiTrafficControl != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbiTrafficControl)
ENDIF
REPEAT COUNT_OF(iNavmeshBlockShootout) i
IF iNavmeshBlockShootout[i] != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(iNavmeshBlockShootout[i])
iNavmeshBlockShootout[i] = -1
ENDIF
ENDREPEAT
IF iNavmeshBlockBankEntrance != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(iNavmeshBlockBankEntrance)
iNavmeshBlockBankEntrance = -1
ENDIF
IF bDisabledSwitch
ENABLE_SELECTOR()
bDisabledSwitch = FALSE
ENDIF
CLEAR_TIMECYCLE_MODIFIER()
SET_NOISEOVERIDE(FALSE)
REMOVE_PTFX_ASSET()
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED(strTrafficTextures)
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(sfTrafficHud)
bRequestedTrafficScaleform = FALSE
REMOVE_ALL_COVER_BLOCKING_AREAS()
CLOSE_TUNNEL_PAVEMENTS(FALSE)
BLOCK_PAVEMENTS_AT_BANK_EXIT(FALSE)
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 2)
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 4)
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 5)
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 6)
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 7)
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 8)
IF DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[0])
SET_ENTITY_VISIBLE(objMichaelsHouseMapDoors[0], TRUE)
SET_OBJECT_AS_NO_LONGER_NEEDED(objMichaelsHouseMapDoors[0])
ENDIF
IF DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[1])
SET_ENTITY_VISIBLE(objMichaelsHouseMapDoors[1], TRUE)
SET_OBJECT_AS_NO_LONGER_NEEDED(objMichaelsHouseMapDoors[1])
ENDIF
//REQUEST_IPL("DT1_03_Shutter")
//REMOVE_MODEL_HIDE(<<24.98, -664.58, 30.57>>, 2.0, P_SEC_GATE_01_S, FALSE)
//REMOVE_MODEL_HIDE(<<-72.75, -682.17, 32.52>>, 2.0, P_SEC_GATE_01_S, FALSE)
//REMOVE_MODEL_HIDE(<<24.98, -664.58, 30.57>>, 5.0, P_SEC_GATE_01_S_COL, FALSE)
//REMOVE_MODEL_HIDE(<<-72.75, -682.17, 32.52>>, 5.0, P_SEC_GATE_01_S_COL, FALSE)
SET_BUILDING_STATE(BUILDINGNAME_ES_BANK_CAR_PARK_SHUTTERS, BUILDINGSTATE_NORMAL)
SET_MICHAELS_HOUSE_FOR_FINAL_CUTSCENE(FALSE)
SET_FORCED_OBJECTS_FOR_CHASE(FALSE)
SET_ROADS_BLOCKED_FOR_BANK_DRIVE(FALSE)
SETUP_REQ_REMOVE_JUNK_FOR_SHOOTOUT(FALSE)
BLOCK_PEDS_SPAWNING_AT_UNDERPASS(FALSE)
BLOCK_PEDS_DURING_CHASE(FALSE)
BLOCK_PEDS_AT_DROP_OFF(FALSE)
HIDE_JUNK_FOR_SWITCH_CUTSCENE(FALSE)
SET_ROADS_BACK_TO_ORIGINAL(<<-220.0, -1400.0, 0.0>>, <<500.0, -900.0, 100.0>>)
CLEAR_PED_NON_CREATION_AREA()
REMOVE_MODEL_HIDE(<<-5.017, -685.369, 15.909>>, 3.0, modelVaultDoor)
REMOVE_MODEL_HIDE(<<179.4, -1233.9, 29.2>>, 5.0, modelShootoutFence)
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", FALSE)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
SET_TROLLEY_SOUNDS_ACTIVE(FALSE)
REMOVE_ALL_AUDIO()
REMOVE_ALL_AUDIO_SCENES()
REMOVE_ALL_BLIPS()
REMOVE_ALL_CAMERAS()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
REMOVE_ALL_OBJECTS(TRUE)
REMOVE_ALL_PEDS(TRUE)
REMOVE_ALL_VEHICLES(TRUE)
ELSE
REMOVE_ALL_OBJECTS()
REMOVE_ALL_PEDS()
REMOVE_ALL_VEHICLES()
ENDIF
REMOVE_ALL_ANIMS()
CLEAR_SELECTOR_PED_PRIORITY(sSelectorPeds)
IF eSectionStage != SECTION_STAGE_JUMPING_TO_STAGE
//Clean up anything that was created in the initial setup (this stuff must not be cleaned up if p-skipping)
#IF IS_DEBUG_BUILD
DESTROY_WIDGETS()
#ENDIF
DISABLE_TAXI_HAILING(FALSE)
RELEASE_SUPPRESSED_EMERGENCY_CALLS()
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelChaseCars, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelGoldVan, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelStartCar, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(CAVALCADE2, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(CAVALCADE, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_BIKE), FALSE)
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE)
ENABLE_STRIP_CLUBS()
KILL_FACE_TO_FACE_CONVERSATION()
//Reset the vault gates
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-7.4, -678.7, 16.4>>, FALSE, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<4.4, -682.9, 16.4>>, FALSE, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-3.0, -676.6, 16.4>>, FALSE, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<2.3, -678.6, 16.4>>, FALSE, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-1.0, -671.1, 16.4>>, FALSE, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<4.3, -673.0, 16.4>>, FALSE, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<8.2, -672.4, 16.4>>, FALSE, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-3.6, -668.2, 16.4>>, FALSE, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<10.6, -666.6, 16.4>>, FALSE, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-1.6562, -662.1329, 16.3586>>, FALSE, 0.0, 0.0, -2.1250)
RELEASE_SOUND_ID(iLiftSoundID)
RELEASE_SOUND_ID(iLiftMoveSoundID)
RELEASE_SOUND_ID(iBankGateOpenSound)
RELEASE_SOUND_ID(iVaultDoorOpenSoundID)
RELEASE_SOUND_ID(iVaultDoorCloseSoundID)
RELEASE_SOUND_ID(iMoneyCountSoundID)
RELEASE_SOUND_ID(iTrailerRampSounds[0])
RELEASE_SOUND_ID(iTrailerRampSounds[1])
RELEASE_SOUND_ID(iTrailerRampRaiseSounds[0])
RELEASE_SOUND_ID(iTrailerRampRaiseSounds[1])
RELEASE_SOUND_ID(sTrafficGame.iStaticSound)
RELEASE_SOUND_ID(sTrafficGame.iBackgroundSound)
SET_ROADS_BACK_TO_ORIGINAL(<<320.0534, -700.1548, 28.2937>>, <<393.6534, -633.9548, 48.2937>>) //Outside tunnel (after arrival cutscene)
SET_ROADS_BACK_TO_ORIGINAL(<<-142.7897, -705.0483, 30.9823>>, <<-37.9477, -555.9297, 41.7746>>)
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<96.116104,-572.902649,25.195431>>, <<26.738914,-761.622437,39.121941>>, 16.750000)
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<332.834991,-659.348389,27.838188>>, <<120.851776,-573.066589,35.662926>>, 18.750000) //Outside tunnel (before arrival cutscene)
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<395.946472,-569.395081,27.532516>>, <<351.844971,-652.105469,29.339520>>, 15.500000) //Outside tunnel (before arrival cutscene)
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<328.408264,-737.851563,27.344345>>, <<387.132874,-603.286560,38.589233>>, 43.500000) //Larger area outside tunnel (after arrival cutscene).
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<144.3611, -1330.6985, 10.2414>>, <<187.7694, -1299.4413, 52.2414>>, TRUE)
REMOVE_DOOR_FROM_SYSTEM(iBankExitBarrierHash)
SET_TRAFFIC_CONES_ACTIVE(TRUE)
IF sbiSecurityVans[0] != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbiSecurityVans[0])
ENDIF
IF sbiSecurityVans[1] != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbiSecurityVans[1])
ENDIF
IF bRemovedShotgunSilencer
IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
GIVE_WEAPON_COMPONENT_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, WEAPONCOMPONENT_AT_SR_SUPP)
ENDIF
ENDIF
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_HOLE_COVER, BUILDINGSTATE_NORMAL, TRUE)
SET_BUILDING_STATE( BUILDINGNAME_IPL_JEWEL_HEIST_BIKE_TUNNELS, BUILDINGSTATE_NORMAL, TRUE)
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_BANK, BUILDINGSTATE_NORMAL, TRUE)
SET_INTERIOR_CAPPED_ON_EXIT(INTERIOR_DT1_03_CARPARK, TRUE)
REGISTER_SCRIPT_WITH_AUDIO(FALSE)
TERMINATE_THIS_THREAD()
ELSE
CLEAR_TRIGGERED_LABELS()
CLEAR_PRINTS()
CLEAR_HELP()
CLEAR_AREA(<<0.0, 0.0, 0.0>>, 10000.0, TRUE)
STOP_FIRE_IN_RANGE(<<0.0, 0.0, 0.0>>, 10000.0)
REMOVE_DECALS_IN_RANGE(<<0.0, 0.0, 0.0>>, 10000.0)
SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
CLEANUP_UBER_PLAYBACK()
CANCEL_ALL_PREPARED_MUSIC_EVENTS()
REMOVE_WAYPOINT_RECORDING(strWaypointLiftExitTop)
REMOVE_WAYPOINT_RECORDING(strWaypointLiftEnterTop)
REMOVE_WAYPOINT_RECORDING(strWaypointLiftExitBottom)
REMOVE_WAYPOINT_RECORDING(strWaypointLiftExitBottomLeft)
REMOVE_WAYPOINT_RECORDING(strWaypointLiftExitBottomRight)
REMOVE_WAYPOINT_RECORDING(strWaypointLiftEnterBottom)
REMOVE_WAYPOINT_RECORDING(strWaypointVehLeaveBank)
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold1A)
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold1B)
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold1C)
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold2A)
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold2B)
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold2C)
REMOVE_WAYPOINT_RECORDING(strWaypointLiftEnterTopLeft)
REMOVE_WAYPOINT_RECORDING(strWaypointLiftEnterTopRight)
REMOVE_WAYPOINT_RECORDING(strWaypointHobo)
REMOVE_VEHICLE_RECORDING(CARREC_GOLD_VANS_APPEAR, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_1, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_2, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_BUDDIES, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_BANK_PARK_1, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_BANK_PARK_2, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_BANK_LEAVE_GATE, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_BANK_TREVOR, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_1, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_2, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_BUDDIES, strCarrec)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMerryCar)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMerryweather)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCasey)
SET_MODEL_AS_NO_LONGER_NEEDED(modelBuddyVan)
SET_MODEL_AS_NO_LONGER_NEEDED(modelBankWorker)
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldVanPeds)
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldVan)
SET_MODEL_AS_NO_LONGER_NEEDED(modelBarrier)
SET_MODEL_AS_NO_LONGER_NEEDED(modelChaseCars)
SET_MODEL_AS_NO_LONGER_NEEDED(modelDefaultTCCar)
SET_MODEL_AS_NO_LONGER_NEEDED(modelDefaultTCCar2)
SET_MODEL_AS_NO_LONGER_NEEDED(modelDefaultTCPed)
SET_MODEL_AS_NO_LONGER_NEEDED(modelWalkieTalkie)
SET_MODEL_AS_NO_LONGER_NEEDED(modelIDCard)
SET_MODEL_AS_NO_LONGER_NEEDED(modelWalkingStick)
SET_MODEL_AS_NO_LONGER_NEEDED(modelBeer)
SET_MODEL_AS_NO_LONGER_NEEDED(modelEmptyTrolley)
SET_MODEL_AS_NO_LONGER_NEEDED(modelContainerAlt1)
SET_MODEL_AS_NO_LONGER_NEEDED(modelContainerAlt2)
SET_MODEL_AS_NO_LONGER_NEEDED(modelContainerAlt3)
SET_MODEL_AS_NO_LONGER_NEEDED(modelHobo)
SET_MODEL_AS_NO_LONGER_NEEDED(modelLaptop)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMichaelsDoorLeft)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMichaelsDoorRight)
REMOVE_WEAPON_ASSET(WEAPONTYPE_CARBINERIFLE)
REMOVE_WEAPON_ASSET(WEAPONTYPE_ADVANCEDRIFLE)
REMOVE_VEHICLE_ASSET(modelStartCar)
REMOVE_VEHICLE_ASSET(CAVALCADE2)
REMOVE_VEHICLE_ASSET(modelMerryCar)
REMOVE_VEHICLE_ASSET(modelGoldVan)
IF eMissionStage < STAGE_TRAFFIC_CONTROL
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_01_AP, TRUE)
SET_ALL_CLOTHES_SHOPS_DISABLED(TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
CLEANUP_PC_CONTROLS()
//bBarriersAddedToBankInterior = FALSE
ENDIF
ENDPROC
PROC JUMP_TO_STAGE(MISSION_STAGE stage, BOOL bIsDebugJump = FALSE)
DO_FADE_OUT_WITH_WAIT()
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
iCurrentEvent = 0
eMissionStage = stage
MISSION_CLEANUP()
//Update mission checkpoint in case they skipped the stages where it gets set.
IF bIsDebugJump
IF eMissionStage >= STAGE_GO_TO_MICHAELS_HOUSE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_GO_HOME, "GO_HOME", TRUE)
ELIF eMissionStage >= STAGE_CHASE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_CHASE, "CAR_CHASE")
ELIF eMissionStage >= STAGE_SHOOTOUT
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_SHOOTOUT, "SHOOTOUT")
ELIF eMissionStage >= STAGE_TRAFFIC_CONTROL
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_TRAFFIC_CONTROL, "TRAFFIC_CONTROL")
ELIF eMissionStage >= STAGE_LEAVE_BANK
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_LEAVE_BANK, "LEAVE_BANK")
ELIF eMissionStage >= STAGE_WALK_TO_LIFT_1
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_BANK_TOUR, "GET_GOLD_FROM_BANK")
ELIF eMissionStage >= STAGE_DRIVE_TO_BANK
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_DRIVE_TO_BANK, "DRIVE_TO_BANK")
ELIF eMissionStage >= STAGE_SET_UP_STINGER
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "HIJACK_VANS")
ENDIF
ENDIF
ENDPROC
///Creates a new load scene sphere and waits until it has finished loading or it times out.
PROC NEW_LOAD_SCENE_SPHERE_WITH_WAIT(VECTOR vPos, FLOAT fRadius, NEWLOADSCENE_FLAGS controlFlags = 0, INT iMaxWaitTime = 10000)
INT iTimeOut = GET_GAME_TIMER()
WHILE GET_GAME_TIMER() - iTimeOut < iMaxWaitTime
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_START_SPHERE(vPos, fRadius, controlFlags)
ELIF IS_NEW_LOAD_SCENE_LOADED()
iTimeOut = 0
ENDIF
WAIT(0)
ENDWHILE
NEW_LOAD_SCENE_STOP()
ENDPROC
PROC DISABLE_VEH_CONTROLS_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_AIM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CINEMATIC_DOWN_ONLY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CINEMATIC_LR)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CINEMATIC_UD)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CINEMATIC_UP_ONLY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HANDBRAKE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_DUCK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HORN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_LOOK_BEHIND)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_LOOK_LEFT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_LOOK_RIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_DOWN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_DOWN_ONLY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LEFT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LEFT_ONLY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LR)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_RIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_RIGHT_ONLY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UD)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UP_ONLY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_RADIO_WHEEL)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_NEXT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_PREV_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SPECIAL)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SPECIAL_ABILITY_FRANKLIN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CELLPHONE_UP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK1)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_DOWN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_DOWN_ONLY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LEFT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LEFT_ONLY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LR)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_RIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_RIGHT_ONLY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UD)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UP_ONLY)
ENDPROC
FUNC BOOL SETUP_REQ_FRANKLIN(VECTOR vPos, FLOAT fHeading = 0.0, BOOl bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
REQUEST_PLAYER_PED_MODEL(CHAR_FRANKLIN)
IF HAS_PLAYER_PED_MODEL_LOADED(CHAR_FRANKLIN)
IF bJustRequestAssets
RETURN TRUE
ELIF CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CHAR_FRANKLIN, vPos, fHeading)
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 1800)
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 1800)
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
sFranklin.iEvent = 0
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE, 500, TRUE)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "FRANKLIN")
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], RELGROUPHASH_PLAYER)
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], COMP_TYPE_PROPS, PROPS_P1_HEADSET, FALSE)
RETURN TRUE
ENDIF
ENDIF
ELSE
IF NOT bJustRequestAssets
IF sConversationPeds.PedInfo[1].Index != sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "FRANKLIN")
ENDIF
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_TREVOR(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
REQUEST_PLAYER_PED_MODEL(CHAR_TREVOR)
IF HAS_PLAYER_PED_MODEL_LOADED(CHAR_TREVOR)
IF bJustRequestAssets
RETURN TRUE
ELIF CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CHAR_TREVOR, vPos, fHeading)
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
sTrevor.iEvent = 0
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE, 500, TRUE)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 2, sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "TREVOR")
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], RELGROUPHASH_PLAYER)
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], COMP_TYPE_PROPS, PROPS_P2_HEADSET, FALSE)
RETURN TRUE
ENDIF
ENDIF
ELSE
IF NOT bJustRequestAssets
IF sConversationPeds.PedInfo[2].Index != sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
ADD_PED_FOR_DIALOGUE(sConversationPeds, 2, sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "TREVOR")
ENDIF
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_MICHAEL(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
REQUEST_PLAYER_PED_MODEL(CHAR_MICHAEL)
IF HAS_PLAYER_PED_MODEL_LOADED(CHAR_MICHAEL)
IF bJustRequestAssets
RETURN TRUE
ELIF CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CHAR_MICHAEL, vPos, fHeading)
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1800)
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1800)
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_PROPS, PROPS_P0_HEADSET, FALSE)
sMichael.iEvent = 0
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_CARBINERIFLE, 500, TRUE)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "MICHAEL")
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], RELGROUPHASH_PLAYER)
RETURN TRUE
ENDIF
ENDIF
ELSE
IF NOT bJustRequestAssets
IF sConversationPeds.PedInfo[0].Index != sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "MICHAEL")
ENDIF
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_PLAYER_IS_FRANKLIN()
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
SET_CURRENT_SELECTOR_PED(SELECTOR_PED_FRANKLIN)
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
ELSE
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, 300)
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_PLAYER_IS_MICHAEL()
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
SET_CURRENT_SELECTOR_PED(SELECTOR_PED_MICHAEL)
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
ELSE
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_PLAYER_IS_TREVOR()
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
SET_CURRENT_SELECTOR_PED(SELECTOR_PED_TREVOR)
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
ELSE
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_START_CAR(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(sStartCar.veh)
REQUEST_MODEL(modelStartCar)
REQUEST_VEHICLE_ASSET(modelStartCar, ENUM_TO_INT(VRF_REQUEST_ENTRY_ANIMS | VRF_REQUEST_ALTERNATE_ENTRY_ANIMS))
IF HAS_MODEL_LOADED(modelStartCar)
AND HAS_VEHICLE_ASSET_LOADED(modelStartCar)
IF NOT bJustRequestAssets
sStartCar.veh = CREATE_VEHICLE(modelStartCar, vPos, fHeading)
SET_VEHICLE_COLOURS(sStartCar.veh, 0, 0)
SET_VEHICLE_EXTRA_COLOURS(sStartCar.veh, 0, 0)
SET_VEHICLE_AUTOMATICALLY_ATTACHES(sStartCar.veh, FALSE)
SET_VEHICLE_RADIO_ENABLED(sStartCar.veh, TRUE)
SET_VEHICLE_STRONG(sStartCar.veh, TRUE)
SET_VEHICLE_HAS_STRONG_AXLES(sStartCar.veh, TRUE)
SET_VEH_RADIO_STATION(sStartCar.veh, "RADIO_01_CLASS_ROCK")
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sStartCar.veh, SC_DOOR_FRONT_LEFT, FALSE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sStartCar.veh, SC_DOOR_FRONT_RIGHT, FALSE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sStartCar.veh, SC_DOOR_REAR_LEFT, FALSE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sStartCar.veh, SC_DOOR_REAR_RIGHT, FALSE)
SET_VEHICLE_TYRES_CAN_BURST(sStartCar.veh, FALSE)
SET_VEHICLE_NUMBER_PLATE_TEXT(sStartCar.veh, "37JDW593")
SET_MODEL_AS_NO_LONGER_NEEDED(modelStartCar)
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_FRANKLINS_BIKE(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(vehFranklinsBike)
REQUEST_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_BIKE)
REQUEST_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_BIKE))
IF HAS_PLAYER_VEH_MODEL_LOADED(CHAR_FRANKLIN, VEHICLE_TYPE_BIKE)
AND HAS_VEHICLE_ASSET_LOADED(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_BIKE))
IF NOT bJustRequestAssets
CREATE_PLAYER_VEHICLE(vehFranklinsBike, CHAR_FRANKLIN, vPos, fHeading, TRUE, VEHICLE_TYPE_BIKE)
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vehFranklinsBike, FALSE)
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_MICHAELS_CAR(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(vehMichaelsCar)
REQUEST_MODEL(CAVALCADE2)
REQUEST_VEHICLE_ASSET(CAVALCADE2, ENUM_TO_INT(VRF_REQUEST_ENTRY_ANIMS))
IF HAS_MODEL_LOADED(CAVALCADE2)
AND HAS_VEHICLE_ASSET_LOADED(CAVALCADE2)
IF NOT bJustRequestAssets
vehMichaelsCar = CREATE_VEHICLE(CAVALCADE2, vPos, fHeading)
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vehMichaelsCar, FALSE)
SET_VEHICLE_COLOURS(vehMichaelsCar, 0, 0)
SET_VEHICLE_EXTRA_COLOURS(vehMichaelsCar, 5, 0)
SET_VEHICLE_NUMBER_PLATE_TEXT(vehMichaelsCar, "54AJM610")
SET_VEHICLE_DIRT_LEVEL(vehMichaelsCar, 3.0)
SET_VEH_RADIO_STATION(vehMichaelsCar, "RADIO_15_MOTOWN")
SET_MODEL_AS_NO_LONGER_NEEDED(CAVALCADE2)
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_LESTER(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(pedLester)
REQUEST_NPC_PED_MODEL(CHAR_LESTER)
REQUEST_MODEL(modelWalkingStick)
REQUEST_MODEL(modelBeer)
IF HAS_NPC_PED_MODEL_LOADED(CHAR_LESTER)
AND HAS_MODEL_LOADED(modelWalkingStick)
AND HAS_MODEL_LOADED(modelBeer)
IF bJustRequestAssets
RETURN TRUE
ELIF CREATE_NPC_PED_ON_FOOT(pedLester, CHAR_LESTER, vPos, fHeading)
SET_PED_CAN_BE_TARGETTED(pedLester, FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(pedLester, RELGROUPHASH_PLAYER)
SET_PED_CONFIG_FLAG(pedLester, PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(pedLester, PCF_DisableExplosionReactions, TRUE)
SET_PED_CONFIG_FLAG(pedLester, PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(pedLester, TRUE)
SET_PED_PROP_INDEX(pedLester, ANCHOR_EYES, 0)
objwalkingStick = CREATE_OBJECT(modelWalkingStick, vPos)
ATTACH_ENTITY_TO_ENTITY(objwalkingStick, pedLester, GET_PED_BONE_INDEX(pedLester, BONETAG_PH_R_HAND), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
SET_MODEL_AS_NO_LONGER_NEEDED(modelWalkingStick)
IF eMissionStage > STAGE_CHASE
objBeer = CREATE_OBJECT(modelBeer, vPos)
ATTACH_ENTITY_TO_ENTITY(objBeer, pedLester, GET_PED_BONE_INDEX(pedLester, BONETAG_PH_L_HAND), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(modelBeer)
RETURN TRUE
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_TRAFFIC_LAPTOPS(VECTOR vLaptopPos1, VECTOR vLaptopPos2, FLOAT fLaptopHeading1 = 0.0, FLOAT fLaptopHeading2 = 0.0, BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(objLaptops[0])
REQUEST_MODEL(modelLaptop)
IF HAS_MODEL_LOADED(modelLaptop)
IF bJustRequestAssets
RETURN TRUE
ELSE
objLaptops[0] = CREATE_OBJECT(modelLaptop, vLaptopPos1)
SET_ENTITY_HEADING(objLaptops[0], fLaptopHeading1)
objLaptops[1] = CREATE_OBJECT(modelLaptop, vLaptopPos2)
SET_ENTITY_HEADING(objLaptops[1], fLaptopHeading2)
SET_MODEL_AS_NO_LONGER_NEEDED(modelLaptop)
RETURN TRUE
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_MAIN_GUNMAN(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(sCrew[CREW_GUNMAN].ped)
REQUEST_MODEL_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_GUNMAN))
IF HAS_MODEL_LOADED_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_GUNMAN))
IF NOT bJustRequestAssets
sCrew[CREW_GUNMAN].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_GUNMAN, vPos, fHeading)
SET_PED_RELATIONSHIP_GROUP_HASH(sCrew[CREW_GUNMAN].ped, RELGROUPHASH_PLAYER)
SET_PED_CAN_BE_TARGETTED(sCrew[CREW_GUNMAN].ped, FALSE)
SET_PED_CONFIG_FLAG(sCrew[CREW_GUNMAN].ped, PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(sCrew[CREW_GUNMAN].ped, PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
GIVE_WEAPON_TO_PED(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_PISTOL, INFINITE_AMMO, FALSE, FALSE)
GIVE_WEAPON_TO_PED(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, FALSE, FALSE)
SET_MODEL_FOR_CREW_MEMBER_AS_NO_LONGER_NEEDED(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_GUNMAN))
ADD_PED_FOR_DIALOGUE(sConversationPeds, 3, sCrew[CREW_GUNMAN].ped, "FH3CREW1")
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_HACKER(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(sCrew[CREW_HACKER].ped)
REQUEST_MODEL_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER))
IF HAS_MODEL_LOADED_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER))
IF NOT bJustRequestAssets
sCrew[CREW_HACKER].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER, vPos, fHeading)
SET_PED_RELATIONSHIP_GROUP_HASH(sCrew[CREW_HACKER].ped, RELGROUPHASH_PLAYER)
SET_PED_CAN_BE_TARGETTED(sCrew[CREW_HACKER].ped, FALSE)
SET_PED_CONFIG_FLAG(sCrew[CREW_HACKER].ped, PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(sCrew[CREW_HACKER].ped, PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
SET_MODEL_FOR_CREW_MEMBER_AS_NO_LONGER_NEEDED(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER))
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_MAIN_DRIVER(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(sCrew[CREW_DRIVER].ped)
REQUEST_MODEL_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER))
IF HAS_MODEL_LOADED_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER))
IF NOT bJustRequestAssets
sCrew[CREW_DRIVER].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER, vPos, fHeading)
SET_PED_RELATIONSHIP_GROUP_HASH(sCrew[CREW_DRIVER].ped, RELGROUPHASH_PLAYER)
SET_PED_CAN_BE_TARGETTED(sCrew[CREW_DRIVER].ped, FALSE)
SET_PED_CONFIG_FLAG(sCrew[CREW_DRIVER].ped, PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(sCrew[CREW_DRIVER].ped, PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
GIVE_WEAPON_TO_PED(sCrew[CREW_DRIVER].ped, WEAPONTYPE_PISTOL, INFINITE_AMMO, FALSE, FALSE)
GIVE_WEAPON_TO_PED(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, FALSE, FALSE)
SET_MODEL_FOR_CREW_MEMBER_AS_NO_LONGER_NEEDED(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER))
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, sCrew[CREW_DRIVER].ped, "FH3CREW2")
//TEMP: remove balaclava from crew driver
SET_PED_COMPONENT_VARIATION(sCrew[CREW_DRIVER].ped, PED_COMP_HAIR, 0, 0)
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_FORCED_CREW(BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(sCrew[CREW_FORCED_GUNMAN].ped)
REQUEST_MODEL_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_GUNMAN))
REQUEST_MODEL_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_DRIVER))
IF HAS_MODEL_LOADED_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_GUNMAN))
AND HAS_MODEL_LOADED_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_DRIVER))
IF NOT bJustRequestAssets
sCrew[CREW_FORCED_GUNMAN].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_GUNMAN, <<358.6120, -637.1446, 38.9746>>, 0.0)
sCrew[CREW_FORCED_DRIVER].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_DRIVER, <<358.6120, -637.1446, 38.9746>>, 0.0)
SET_PED_RELATIONSHIP_GROUP_HASH(sCrew[CREW_FORCED_GUNMAN].ped, RELGROUPHASH_PLAYER)
SET_PED_RELATIONSHIP_GROUP_HASH(sCrew[CREW_FORCED_DRIVER].ped, RELGROUPHASH_PLAYER)
SET_PED_CAN_BE_TARGETTED(sCrew[CREW_FORCED_GUNMAN].ped, FALSE)
SET_PED_CAN_BE_TARGETTED(sCrew[CREW_FORCED_DRIVER].ped, FALSE)
SET_MODEL_FOR_CREW_MEMBER_AS_NO_LONGER_NEEDED(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_GUNMAN))
SET_MODEL_FOR_CREW_MEMBER_AS_NO_LONGER_NEEDED(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_DRIVER))
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_CREW_VAN(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(vehBuddyVan)
REQUEST_MODEL(modelBuddyVan)
IF HAS_MODEL_LOADED(modelBuddyVan)
IF bJustRequestAssets
RETURN TRUE
ELSE
vehBuddyVan = CREATE_VEHICLE(modelBuddyVan, vPos, fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(vehBuddyVan)
SET_VEHICLE_RADIO_ENABLED(vehBuddyVan, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelBuddyVan)
RETURN TRUE
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_TUNNEL_INTERIOR_LOADED()
IF interiorTunnel = NULL
interiorTunnel = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<249.3368, -622.8621, 29.6647>>, "dt1_rd1_tun")
//interiorTunnel = GET_INTERIOR_AT_COORDS(<<249.3368, -622.8621, 29.6647>>)
ELSE
PIN_INTERIOR_IN_MEMORY(interiorTunnel)
ENDIF
IF interiorTunnel2 = NULL
interiorTunnel2 = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<132.835007,-577.426636,33.010033>>, "dt1_rd1_tun2")
//interiorTunnel2 = GET_INTERIOR_AT_COORDS(<<132.835007,-577.426636,33.010033>>)
ELSE
PIN_INTERIOR_IN_MEMORY(interiorTunnel2)
ENDIF
IF interiorTunnel3 = NULL
interiorTunnel3 = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<287.4,-641.1,30.510033>>, "dt1_rd1_tun3")
//interiorTunnel2 = GET_INTERIOR_AT_COORDS(<<132.835007,-577.426636,33.010033>>)
ELSE
PIN_INTERIOR_IN_MEMORY(interiorTunnel3)
ENDIF
IF IS_INTERIOR_READY(interiorTunnel)
AND IS_INTERIOR_READY(interiorTunnel2)
AND IS_INTERIOR_READY(interiorTunnel3)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_CHASE_TUNNEL_INTERIOR_LOADED()
IF interiorChaseTunnel[0] = NULL
interiorChaseTunnel[0] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-1562.1206, -740.3986, 12.5837>>, "sm20_tun1")
ELIF NOT IS_INTERIOR_READY(interiorChaseTunnel[0])
PIN_INTERIOR_IN_MEMORY(interiorChaseTunnel[0])
ENDIF
IF interiorChaseTunnel[1] = NULL
interiorChaseTunnel[1] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-1411.0428, -748.9814, 12.4501>>, "sm20_tun2")
ELIF NOT IS_INTERIOR_READY(interiorChaseTunnel[1])
PIN_INTERIOR_IN_MEMORY(interiorChaseTunnel[1])
ENDIF
IF interiorChaseTunnel[2] = NULL
interiorChaseTunnel[2] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-1294.2448, -720.2783, 13.0111>>, "sm20_tun3")
ELIF NOT IS_INTERIOR_READY(interiorChaseTunnel[2])
PIN_INTERIOR_IN_MEMORY(interiorChaseTunnel[2])
ENDIF
IF interiorChaseTunnel[3] = NULL
interiorChaseTunnel[3] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-1191.2521, -673.7817, 12.6938>>, "sm20_tun4")
ELIF NOT IS_INTERIOR_READY(interiorChaseTunnel[3])
PIN_INTERIOR_IN_MEMORY(interiorChaseTunnel[3])
ENDIF
IF IS_INTERIOR_READY(interiorChaseTunnel[0])
AND IS_INTERIOR_READY(interiorChaseTunnel[1])
AND IS_INTERIOR_READY(interiorChaseTunnel[2])
AND IS_INTERIOR_READY(interiorChaseTunnel[3])
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_BANK_INTERIOR_LOADED()
IF interiorBank = NULL
interiorBank = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<1.4766, -671.6155, 16.6482>>, "V_finalebank")
ENDIF
IF interiorBankCarPark = NULL
interiorBankCarPark = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-1.2993, -678.8333, 33.7190>>, "dt1_03_carpark")
ENDIF
PIN_INTERIOR_IN_MEMORY(interiorBank)
PIN_INTERIOR_IN_MEMORY(interiorBankCarPark)
IF IS_INTERIOR_READY(interiorBank)
AND IS_INTERIOR_READY(interiorBankCarPark)
RETURN TRUE
ELSE
#IF IS_DEBUG_BUILD
IF NOT IS_INTERIOR_READY(interiorBank)
PRINTLN("Big Score 2A - waiting for V_finalebank interior to be ready.")
ENDIF
IF NOT IS_INTERIOR_READY(interiorBankCarPark)
PRINTLN("Big Score 2A - waiting for dt1_03_carpark interior to be ready.")
ENDIF
#ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_MICHAELS_HOUSE_INTERIOR_LOADED()
IF interiorMichaelsHouse = NULL
interiorMichaelsHouse = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-813.6312, 179.8698, 73.0647>>, "v_michael")
ENDIF
PIN_INTERIOR_IN_MEMORY(interiorMichaelsHouse)
IF IS_INTERIOR_READY(interiorMichaelsHouse)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_BACKGROUND_CAR_PARK_INTERIOR_LOADED()
IF interiorBackgroundCarPark = NULL
interiorBackgroundCarPark = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-141.6, -653.7, 34.3>>, "dt1_02_carpark")
ENDIF
PIN_INTERIOR_IN_MEMORY(interiorBackgroundCarPark)
IF IS_INTERIOR_READY(interiorBackgroundCarPark)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_GOLD_VANS_PRE_HIJACK(VECTOR vVanPos1, FLOAT fVanHeading1, VECTOR vVanPos2, FLOAT fVanHeading2, BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(sGoldVans[0].veh)
REQUEST_MODEL(modelGoldVan)
REQUEST_MODEL(modelGoldVanPeds)
REQUEST_MODEL(modelCasey)
IF HAS_MODEL_LOADED(modelGoldVan)
AND HAS_MODEL_LOADED(modelGoldVanPeds)
AND HAS_MODEL_LOADED(modelCasey)
IF NOT bJustRequestAssets
CLEAR_AREA(<<423.7884, -674.1555, 28.2342>>, 6.0, TRUE)
CLEAR_AREA(<<434.7316, -673.8383, 27.9883>>, 6.0, TRUE)
IF vVanPos1.x = 0.0
//Default position.
sGoldVans[0].veh = CREATE_VEHICLE(modelGoldVan, <<423.7884, -674.1555, 28.2342>>, 91.4872)
sGoldVans[1].veh = CREATE_VEHICLE(modelGoldVan, <<434.7316, -673.8383, 27.9883>>, 91.3587)
ELSE
sGoldVans[0].veh = CREATE_VEHICLE(modelGoldVan, vVanPos1, fVanHeading1)
sGoldVans[1].veh = CREATE_VEHICLE(modelGoldVan, vVanPos2, fVanHeading2)
ENDIF
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[0].veh)
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[1].veh)
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldVan)
sGoldVanPeds[0].ped = CREATE_PED_INSIDE_VEHICLE(sGoldVans[0].veh, PEDTYPE_MISSION, modelCasey)
sGoldVanPeds[1].ped = CREATE_PED_INSIDE_VEHICLE(sGoldVans[0].veh, PEDTYPE_MISSION, modelGoldVanPeds, VS_FRONT_RIGHT)
sGoldVanPeds[2].ped = CREATE_PED_INSIDE_VEHICLE(sGoldVans[1].veh, PEDTYPE_MISSION, modelGoldVanPeds)
sGoldVanPeds[3].ped = CREATE_PED_INSIDE_VEHICLE(sGoldVans[1].veh, PEDTYPE_MISSION, modelGoldVanPeds, VS_FRONT_RIGHT)
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldVanPeds)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCasey)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 5, sGoldVanPeds[CASEY_ID].ped, "Casey")
INT i = 0
REPEAT COUNT_OF(sGoldVans) i
SET_VEHICLE_AUTOMATICALLY_ATTACHES(sGoldVans[i].veh, FALSE)
SET_VEHICLE_RADIO_ENABLED(sGoldVans[i].veh, FALSE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldVans[i].veh, SC_DOOR_FRONT_LEFT, FALSE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldVans[i].veh, SC_DOOR_FRONT_RIGHT, FALSE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldVans[i].veh, SC_DOOR_REAR_LEFT, FALSE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldVans[i].veh, SC_DOOR_REAR_RIGHT, FALSE)
IF i = 0
SET_VEHICLE_AS_RESTRICTED(sGoldVans[i].veh, 0)
ENDIF
ENDREPEAT
REPEAT COUNT_OF(sGoldVanPeds) i
IF i != CASEY_ID
SET_PED_PROP_INDEX(sGoldVanPeds[i].ped, ANCHOR_HEAD, 1)
IF i = 1
SET_PED_COMPONENT_VARIATION(sGoldVanPeds[i].ped, PED_COMP_HEAD, 0, 1)
ELIF i = 2
SET_PED_COMPONENT_VARIATION(sGoldVanPeds[i].ped, PED_COMP_HEAD, 1, 0)
ELIF i = 3
SET_PED_COMPONENT_VARIATION(sGoldVanPeds[i].ped, PED_COMP_HEAD, 1, 1)
ENDIF
ELSE
SET_PED_PROP_INDEX(sGoldVanPeds[i].ped, ANCHOR_HEAD, 0)
ENDIF
ENDREPEAT
ENDIF
RETURN TRUE
ENDIF
ELSE
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
IF sConversationPeds.PedInfo[5].Index != sGoldVanPeds[CASEY_ID].ped
ADD_PED_FOR_DIALOGUE(sConversationPeds, 5, sGoldVanPeds[CASEY_ID].ped, "Casey")
ENDIF
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_GOLD_VAN_HOSTAGE(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(sGoldVanPeds[CASEY_ID].ped)
REQUEST_MODEL(modelCasey)
IF HAS_MODEL_LOADED(modelCasey)
IF NOT bJustRequestAssets
sGoldVanPeds[CASEY_ID].ped = CREATE_PED(PEDTYPE_MISSION, modelCasey, vPos, fHeading)
SET_PED_PROP_INDEX(sGoldVanPeds[CASEY_ID].ped, ANCHOR_HEAD, 0, 0)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCasey)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 5, sGoldVanPeds[CASEY_ID].ped, "Casey")
ENDIF
RETURN TRUE
ENDIF
ELSE
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
IF sConversationPeds.PedInfo[5].Index != sGoldVanPeds[CASEY_ID].ped
ADD_PED_FOR_DIALOGUE(sConversationPeds, 5, sGoldVanPeds[CASEY_ID].ped, "Casey")
ENDIF
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_GOLD_VANS_POST_HIJACK(VECTOR vVanPos1, FLOAT fVanHeading1, VECTOR vVanPos2, FLOAT fVanHeading2, BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(sGoldVans[0].veh)
REQUEST_MODEL(modelGoldVan)
IF HAS_MODEL_LOADED(modelGoldVan)
IF NOT bJustRequestAssets
IF vVanPos1.x != 0.0
sGoldVans[0].veh = CREATE_VEHICLE(modelGoldVan, vVanPos1, fVanHeading1)
sGoldVans[1].veh = CREATE_VEHICLE(modelGoldVan, vVanPos2, fVanHeading2)
ELSE
//Default position
sGoldVans[0].veh = CREATE_VEHICLE(modelGoldVan, <<412.8341, -675.7876, 28.9040>>, 67.1693)
sGoldVans[1].veh = CREATE_VEHICLE(modelGoldVan, <<419.8341, -678.7876, 28.9040>>, 69.4937)
ENDIF
INT i = 0
REPEAT COUNT_OF(sGoldVans) i
SET_VEHICLE_AUTOMATICALLY_ATTACHES(sGoldVans[i].veh, FALSE)
SET_VEHICLE_RADIO_ENABLED(sGoldVans[i].veh, FALSE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldVans[i].veh, SC_DOOR_FRONT_LEFT, FALSE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldVans[i].veh, SC_DOOR_FRONT_RIGHT, FALSE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldVans[i].veh, SC_DOOR_REAR_LEFT, FALSE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldVans[i].veh, SC_DOOR_REAR_RIGHT, FALSE)
IF i = 0
SET_VEHICLE_AS_RESTRICTED(sGoldVans[i].veh, 0)
ENDIF
ENDREPEAT
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldVan)
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_GOLD_VANS_AT_BANK()
RETURN SETUP_REQ_GOLD_VANS_POST_HIJACK(<<-6.911, -667.815, 31.3154>>, -176.386, <<-2.283, -667.746, 31.3231>>, -174.161)
ENDFUNC
PROC SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
IF NOT bPickedGoodSecondGunman
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_RIGHT)
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_RIGHT, FALSE, 1.0)
SET_VEHICLE_TYRES_CAN_BURST(sGoldVans[0].veh, FALSE)
bVanTyreBurst = TRUE
ENDIF
ENDIF
ENDPROC
FUNC BOOL SETUP_REQ_BANK_WORKER(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(sBankWorker.ped)
REQUEST_MODEL(modelBankWorker)
IF HAS_MODEL_LOADED(modelBankWorker)
IF NOT bJustRequestAssets
sBankWorker.ped = CREATE_PED(PEDTYPE_MISSION, modelBankWorker, vPos, fHeading)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, sBankWorker.ped, "BankLiaison")
SET_PED_CAN_RAGDOLL(sBankWorker.ped, FALSE)
SET_PED_LOD_MULTIPLIER(sBankWorker.ped, 1.5)
SET_MODEL_AS_NO_LONGER_NEEDED(modelBankWorker)
ENDIF
RETURN TRUE
ENDIF
ELSE
IF NOT IS_PED_INJURED(sBankWorker.ped)
AND sConversationPeds.PedInfo[8].Index != sBankWorker.ped
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, sBankWorker.ped, "BankLiaison")
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_BANK_WORKER_WALKIE_TALKIE(BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(objBankWorkerWalkieTalkie)
REQUEST_MODEL(modelWalkieTalkie)
IF HAS_MODEL_LOADED(modelWalkieTalkie)
IF NOT bJustRequestAssets
IF NOT IS_PED_INJURED(sBankWorker.ped)
objBankWorkerWalkieTalkie = CREATE_OBJECT(modelWalkieTalkie, GET_ENTITY_COORDS(sBankWorker.ped) + <<0.0, 0.0, 1.0>>)
ATTACH_ENTITY_TO_ENTITY(objBankWorkerWalkieTalkie, sBankWorker.ped, GET_PED_BONE_INDEX(sBankWorker.ped, BONETAG_PH_R_HAND),
<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
SET_MODEL_AS_NO_LONGER_NEEDED(modelWalkieTalkie)
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_VAULT_WORKER(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(sVaultWorker.ped)
REQUEST_MODEL(modelVaultWorker)
IF HAS_MODEL_LOADED(modelVaultWorker)
IF NOT bJustRequestAssets
sVaultWorker.ped = CREATE_PED(PEDTYPE_MISSION, modelVaultWorker, vPos, fHeading)
//SET_PED_CAN_RAGDOLL(sVaultWorker.ped, FALSE)
//FREEZE_ENTITY_POSITION(sVaultWorker.ped, TRUE)
TASK_LOOK_AT_ENTITY(sVaultWorker.ped, PLAYER_PED_ID(), -1)
SET_PED_COMPONENT_VARIATION(sVaultWorker.ped, PED_COMP_HEAD, 0, 0)
SET_PED_COMPONENT_VARIATION(sVaultWorker.ped, PED_COMP_HAIR, 1, 0)
SET_PED_COMPONENT_VARIATION(sVaultWorker.ped, PED_COMP_TORSO, 0, 1)
SET_PED_COMPONENT_VARIATION(sVaultWorker.ped, PED_COMP_LEG, 0, 1)
STOP_PED_SPEAKING(sVaultWorker.ped, TRUE)
SET_PED_LOD_MULTIPLIER(sVaultWorker.ped, 2.0)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 6, sVaultWorker.ped, "FH3VAULT")
SET_MODEL_AS_NO_LONGER_NEEDED(modelVaultWorker)
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_CHASE_CARS_START(BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(sGoldCars[0].veh)
REQUEST_MODEL(modelChaseCars)
IF HAS_MODEL_LOADED(modelChaseCars)
IF NOT bJustRequestAssets
sGoldCars[0].veh = CREATE_VEHICLE(modelChaseCars, <<136.2890, -1186.8018, 28.5015>>, 186.8401)
sGoldCars[1].veh = CREATE_VEHICLE(modelChaseCars, <<133.3123, -1186.8987, 28.5025>>, 184.9469)
sGoldCars[2].veh = CREATE_VEHICLE(modelChaseCars, <<130.3133, -1186.7798, 28.5033>>, 182.7759)
sGoldCars[3].veh = CREATE_VEHICLE(modelChaseCars, <<126.9503, -1186.3328, 28.5033>>, 179.8296)
SET_VEHICLE_COLOURS(sGoldCars[0].veh, 73, 0)
SET_VEHICLE_EXTRA_COLOURS(sGoldCars[0].veh, 73, 0)
SET_VEHICLE_COLOURS(sGoldCars[1].veh, 88, 0)
SET_VEHICLE_EXTRA_COLOURS(sGoldCars[1].veh, 88, 0)
SET_VEHICLE_COLOURS(sGoldCars[2].veh, 4, 0)
SET_VEHICLE_EXTRA_COLOURS(sGoldCars[2].veh, 5, 0)
SET_VEHICLE_COLOURS(sGoldCars[3].veh, 29, 0)
SET_VEHICLE_EXTRA_COLOURS(sGoldCars[3].veh, 29, 0)
INT i = 0
REPEAT COUNT_OF(sGoldCars) i
SET_VEHICLE_DOOR_OPEN(sGoldCars[i].veh, SC_DOOR_BOOT, FALSE, TRUE)
SET_VEHICLE_STRONG(sGoldCars[i].veh, TRUE)
SET_VEHICLE_HAS_STRONG_AXLES(sGoldCars[i].veh, TRUE)
SET_VEHICLE_AUTOMATICALLY_ATTACHES(sGoldCars[i].veh, FALSE)
SET_VEHICLE_TYRES_CAN_BURST(sGoldCars[i].veh, FALSE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(sGoldCars[i].veh, TRUE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldCars[i].veh, SC_DOOR_FRONT_LEFT, FALSE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldCars[i].veh, SC_DOOR_FRONT_RIGHT, FALSE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldCars[i].veh, SC_DOOR_BONNET, FALSE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldCars[i].veh, SC_DOOR_BOOT, FALSE)
sGoldCars[i].iEvent = 0
TEXT_LABEL_63 debugCarName = "Gold "
debugCarName += i
SET_VEHICLE_NAME_DEBUG(sGoldCars[i].veh, debugCarName)
IF i = PLAYERS_GOLD_CAR
SET_VEHICLE_AS_RESTRICTED(sGoldCars[i].veh, 1)
SET_GOLD_PREP_VEHICLE_SETUP(sGoldCars[i].veh, 2)
ELIF i = 0
SET_GOLD_PREP_VEHICLE_SETUP(sGoldCars[i].veh, 0)
ELIF i = 1
SET_GOLD_PREP_VEHICLE_SETUP(sGoldCars[i].veh, 1)
ELSE
SET_GOLD_PREP_VEHICLE_SETUP(sGoldCars[i].veh, -1)
ENDIF
SET_VEHICLE_MOD_KIT(sGoldCars[i].veh, 0)
SET_VEHICLE_MOD(sGoldCars[i].veh, MOD_SUSPENSION, GET_NUM_VEHICLE_MODS(sGoldCars[i].veh, MOD_SUSPENSION) - 1)
ENDREPEAT
SET_MODEL_AS_NO_LONGER_NEEDED(modelChaseCars)
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_FRANKLIN_INSIDE_CHASE_CAR()
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
IF SETUP_REQ_FRANKLIN(GET_ENTITY_COORDS(sGoldCars[0].veh))
IF NOT IS_PED_SITTING_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sGoldCars[0].veh)
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sGoldCars[0].veh)
ENDIF
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_GOLD_TROLLEYS_IN_VAULT(BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(objGoldTrolleys[0])
REQUEST_MODEL(modelGoldTrolley)
IF HAS_MODEL_LOADED(modelGoldTrolley)
IF NOT bJustRequestAssets
objGoldTrolleys[0] = CREATE_OBJECT(modelGoldTrolley, <<-0.880, -659.39, 15.1556>>)
objGoldTrolleys[1] = CREATE_OBJECT(modelGoldTrolley, <<1.158, -660.34, 15.1556>>)
SET_ENTITY_HEADING(objGoldTrolleys[0], -31.94)
SET_ENTITY_HEADING(objGoldTrolleys[1], -130.40)
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldTrolley)
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_CREW_HAVE_SHOTGUNS()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN)
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_PUMPSHOTGUN)
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_PUMPSHOTGUN)
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
ENDIF
ENDIF
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 50, TRUE)
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
SET_ENTITY_COORDS(sCrew[CREW_GUNMAN].ped, <<-6.5872, -671.7311, 31.3406>>)
SET_ENTITY_HEADING(sCrew[CREW_GUNMAN].ped, 190.0721)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped, <<-2.1510, -671.4575, 31.3406>>)
SET_ENTITY_HEADING(sCrew[CREW_DRIVER].ped, 184.4707)
ENDIF
RETURN TRUE
ENDFUNC
///Sets up all of the crew members, the bank worker and Security_Guard for the sections inside the bank,
///including giving them the correct weapons and resetting any previous tasks.
FUNC BOOL SETUP_REQ_BANK_PEDS_READY_FOR_WALK(BOOL bForceWeapons = FALSE)
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
IF IS_PED_IN_GROUP(sCrew[CREW_DRIVER].ped)
REMOVE_PED_FROM_GROUP(sCrew[CREW_DRIVER].ped)
ENDIF
TASK_STAND_STILL(sCrew[CREW_DRIVER].ped, -1)
IF NOT HAS_PED_GOT_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO)
ENDIF
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_DRIVER].ped, TRUE)
SET_CURRENT_PED_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE, bForceWeapons)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
IF IS_PED_IN_GROUP(sCrew[CREW_GUNMAN].ped)
REMOVE_PED_FROM_GROUP(sCrew[CREW_GUNMAN].ped)
ENDIF
TASK_STAND_STILL(sCrew[CREW_GUNMAN].ped, -1)
IF NOT HAS_PED_GOT_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO)
ENDIF
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_GUNMAN].ped, TRUE)
SET_CURRENT_PED_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, bForceWeapons)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF IS_PED_IN_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
REMOVE_PED_FROM_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN)
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN, 50)
ENDIF
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN, bForceWeapons)
SET_PED_CAN_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
IF IS_PED_IN_GROUP(sGoldVanPeds[CASEY_ID].ped)
REMOVE_PED_FROM_GROUP(sGoldVanPeds[CASEY_ID].ped)
ENDIF
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[CASEY_ID].ped, TRUE)
SET_PED_CAN_RAGDOLL(sGoldVanPeds[CASEY_ID].ped, FALSE)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBankWorker.ped, TRUE)
SET_PED_CAN_RAGDOLL(sBankWorker.ped, FALSE)
TASK_CLEAR_LOOK_AT(sBankWorker.ped)
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL SETUP_REQ_CREW_HAVE_CORRECT_WEAPONS_FOR_SHOOTOUT()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_CARBINERIFLE, 500, FALSE, FALSE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE, 500, FALSE, FALSE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE, 500, FALSE, FALSE)
ENDIF
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
OR GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, 600, FALSE, FALSE)
ENDIF
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, 600, FALSE, FALSE)
ENDIF
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL REQUEST_DRIVER_SECURITY_OUTFIT()
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_DRIVER].ped, PED_COMP_SPECIAL, 0, 0)
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_DRIVER].ped, PED_COMP_DECL, 1, 0)
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_DRIVER].ped, PED_COMP_HAIR, 0, 0)
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_DRIVER].ped, PED_COMP_LEG, 1, 0)
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_DRIVER].ped, PED_COMP_TORSO, 1, 0)
SET_PED_PRELOAD_PROP_DATA(sCrew[CREW_DRIVER].ped, ANCHOR_HEAD, 0)
IF HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(sCrew[CREW_DRIVER].ped)
AND HAS_PED_PRELOAD_PROP_DATA_FINISHED(sCrew[CREW_DRIVER].ped)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL REQUEST_GUNMAN_SECURITY_OUTFIT()
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_GUNMAN].ped, PED_COMP_SPECIAL, 6, 0)
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_GUNMAN].ped, PED_COMP_FEET, 1, 0)
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_GUNMAN].ped, PED_COMP_HAIR, 2, 0)
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_GUNMAN].ped, PED_COMP_LEG, 7, 0)
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_GUNMAN].ped, PED_COMP_SPECIAL2, 0, 0)
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_GUNMAN].ped, PED_COMP_TORSO, 7, 0)
SET_PED_PRELOAD_PROP_DATA(sCrew[CREW_GUNMAN].ped, ANCHOR_EYES, 3)
IF HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(sCrew[CREW_GUNMAN].ped)
AND HAS_PED_PRELOAD_PROP_DATA_FINISHED(sCrew[CREW_GUNMAN].ped)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_TREVOR_SECURITY_OUTFIT()
IF (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) OR GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR)
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_SECURITY, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P2_HEADSET, FALSE)
ELSE
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], COMP_TYPE_OUTFIT, OUTFIT_P2_SECURITY, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], COMP_TYPE_PROPS, PROPS_P2_HEADSET, FALSE)
ADD_ARMOUR_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -GET_PED_ARMOUR(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
ADD_ARMOUR_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 100)
ENDIF
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_MICHAEL_SECURITY_OUTFIT()
IF (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) OR GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL)
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_SECURITY, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P0_HEADSET, FALSE)
ELSE
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_OUTFIT, OUTFIT_P0_SECURITY, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_PROPS, PROPS_P0_HEADSET, FALSE)
ADD_ARMOUR_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], -GET_PED_ARMOUR(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
ADD_ARMOUR_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 100)
ENDIF
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_FRANKLIN_OUTFIT()
IF (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) OR GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN)
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_STEALTH_NO_MASK, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET, FALSE)
ELSE
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], COMP_TYPE_OUTFIT, OUTFIT_P1_STEALTH_NO_MASK, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], COMP_TYPE_PROPS, PROPS_P1_HEADSET, FALSE)
ENDIF
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_DRIVER_SECURITY_OUTFIT()
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
//Accs_000, decl_001, hair_000, lowr_001, uppr_001 and p_head_000.
SET_PED_COMPONENT_VARIATION(sCrew[CREW_DRIVER].ped, PED_COMP_SPECIAL, 0, 0)
SET_PED_COMPONENT_VARIATION(sCrew[CREW_DRIVER].ped, PED_COMP_DECL, 1, 0)
SET_PED_COMPONENT_VARIATION(sCrew[CREW_DRIVER].ped, PED_COMP_HAIR, 0, 0)
SET_PED_COMPONENT_VARIATION(sCrew[CREW_DRIVER].ped, PED_COMP_LEG, 1, 0)
SET_PED_COMPONENT_VARIATION(sCrew[CREW_DRIVER].ped, PED_COMP_TORSO, 1, 0)
SET_PED_COMPONENT_VARIATION(sCrew[CREW_DRIVER].ped, PED_COMP_DECL, 1, 0)
SET_PED_PROP_INDEX(sCrew[CREW_DRIVER].ped, ANCHOR_HEAD, 0)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_GUNMAN_SECURITY_OUTFIT()
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
//Accs_006, feet_001, hair_002, lowr_007, task_000, uppr_007 and p_head_003.
SET_PED_COMPONENT_VARIATION(sCrew[CREW_GUNMAN].ped, PED_COMP_SPECIAL, 6, 0)
SET_PED_COMPONENT_VARIATION(sCrew[CREW_GUNMAN].ped, PED_COMP_FEET, 1, 0)
SET_PED_COMPONENT_VARIATION(sCrew[CREW_GUNMAN].ped, PED_COMP_HAIR, 2, 0)
SET_PED_COMPONENT_VARIATION(sCrew[CREW_GUNMAN].ped, PED_COMP_LEG, 7, 0)
SET_PED_COMPONENT_VARIATION(sCrew[CREW_GUNMAN].ped, PED_COMP_SPECIAL2, 0, 0)
SET_PED_COMPONENT_VARIATION(sCrew[CREW_GUNMAN].ped, PED_COMP_TORSO, 7, 0)
SET_PED_COMPONENT_VARIATION(sCrew[CREW_GUNMAN].ped, PED_COMP_BERD, 1, 0)
SET_PED_COMPONENT_VARIATION(sCrew[CREW_GUNMAN].ped, PED_COMP_DECL, 1, 0)
SET_PED_PROP_INDEX(sCrew[CREW_GUNMAN].ped, ANCHOR_EYES, 3)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR(BOOL bCheckStreamingRequestsCompleted = FALSE)
SETUP_MICHAEL_SECURITY_OUTFIT()
SETUP_TREVOR_SECURITY_OUTFIT()
SETUP_GUNMAN_SECURITY_OUTFIT()
SETUP_DRIVER_SECURITY_OUTFIT()
//Give the player actual armour as the outfit has a bulletproof vest.
IF eMissionStage >= STAGE_DRIVE_TO_BANK
AND GET_ENTITY_MODEL(PLAYER_PED_ID()) != GET_PLAYER_PED_MODEL(CHAR_FRANKLIN) //Franklin doesn't wear the security outfit.
IF eMissionStage = STAGE_DRIVE_TO_BANK
OR NOT bPlayerAlreadyGivenArmour
ADD_ARMOUR_TO_PED(PLAYER_PED_ID(), -GET_PED_ARMOUR(PLAYER_PED_ID()))
ADD_ARMOUR_TO_PED(PLAYER_PED_ID(), 100)
bPlayerAlreadyGivenArmour = TRUE
ENDIF
ENDIF
IF bCheckStreamingRequestsCompleted
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_VAN_TYRES_ARE_BURST()
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_FRONT_LEFT, FALSE, 1)
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_FRONT_RIGHT, FALSE, 1)
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_LEFT, FALSE, 1)
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_RIGHT, FALSE, 1)
SET_VEHICLE_TYRES_CAN_BURST(sGoldVans[0].veh, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_FRONT_LEFT, FALSE, 1)
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_FRONT_RIGHT, FALSE, 1)
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_REAR_LEFT, FALSE, 1)
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_REAR_RIGHT, FALSE, 1)
SET_VEHICLE_TYRES_CAN_BURST(sGoldVans[1].veh, FALSE)
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL SETUP_REQ_BANK_SECURITY(BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(pedGateSecurity)
REQUEST_MODEL(modelGoldVanPeds)
IF HAS_MODEL_LOADED(modelGoldVanPeds)
IF NOT bJustRequestAssets
pedGateSecurity = CREATE_PED(PEDTYPE_MISSION, modelGoldVanPeds, <<-73.0784, -678.9486, 32.7587>>, 92.0015)
GIVE_WEAPON_TO_PED(pedGateSecurity, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, TRUE)
TASK_STAND_STILL(pedGateSecurity, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedGateSecurity, TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(pedGateSecurity, RELGROUPHASH_PLAYER)
SET_PED_PROP_INDEX(pedGateSecurity, ANCHOR_HEAD, 1)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(pedGateSecurity, TRUE)
IF eMissionStage < STAGE_WALK_TO_LIFT_1 //The vault worker shares the same speaker index.
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, pedGateSecurity, "BS2BankSecurity")
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldVanPeds)
ENDIF
RETURN TRUE
ENDIF
ELSE
IF eMissionStage < STAGE_WALK_TO_LIFT_1
IF NOT IS_PED_INJURED(pedGateSecurity)
AND sConversationPeds.PedInfo[8].Index != pedGateSecurity
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, pedGateSecurity, "BS2BankSecurity")
ENDIF
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_SECURITY_BARRIERS(BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(objSecurityBarriers[0])
REQUEST_MODEL(modelSecurityGate)
REQUEST_MODEL(modeGateCollision)
IF HAS_MODEL_LOADED(modelSecurityGate)
AND HAS_MODEL_LOADED(modeGateCollision)
IF NOT bJustRequestAssets
SET_BUILDING_STATE(BUILDINGNAME_ES_BANK_CAR_PARK_SHUTTERS, BUILDINGSTATE_DESTROYED)
objSecurityBarriers[0] = CREATE_OBJECT(modelSecurityGate, vGate1)
objSecurityBarriers[1] = CREATE_OBJECT(modelSecurityGate, vGate2)
SET_ENTITY_HEADING(objSecurityBarriers[0], 69.743)
SET_ENTITY_HEADING(objSecurityBarriers[1], 339.996)
SET_ENTITY_LOD_DIST(objSecurityBarriers[0], 250)
SET_ENTITY_LOD_DIST(objSecurityBarriers[1], 250)
objSecurityGateCollision[0] = CREATE_OBJECT(modeGateCollision, vGate1 + <<0.0, 0.0, 0.1>>)
objSecurityGateCollision[1] = CREATE_OBJECT(modeGateCollision, vGate2 + <<0.0, 0.0, 0.1>>)
SET_ENTITY_HEADING(objSecurityGateCollision[0], -110.257)
SET_ENTITY_HEADING(objSecurityGateCollision[1], 339.996)
FREEZE_ENTITY_POSITION(objSecurityGateCollision[0], TRUE)
FREEZE_ENTITY_POSITION(objSecurityGateCollision[1], TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelSecurityGate)
SET_MODEL_AS_NO_LONGER_NEEDED(modeGateCollision)
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_GOLD_VANS_AT_TRANSFER_POINT(BOOL bOpenDoors = TRUE, BOOL bFreezePosition = TRUE, BOOL bSetCoordinates = TRUE)
IF SETUP_REQ_GOLD_VANS_POST_HIJACK(<<126.4855, -1195.3433, 28.4754>>, 85.6665, <<124.6472, -1199.2728, 28.4650>>, 89.8633)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF bSetCoordinates
SET_ENTITY_COORDS(sGoldVans[0].veh, <<126.4855, -1195.3433, 28.4754>>) //<<125.4591, -1195.7665, 28.4754>>
SET_ENTITY_HEADING(sGoldVans[0].veh, 85.6665)
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[0].veh)
ENDIF
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
IF bOpenDoors
SET_VEHICLE_DOOR_OPEN(sGoldVans[0].veh, SC_DOOR_REAR_LEFT)
SET_VEHICLE_DOOR_OPEN(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT)
ENDIF
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, bFreezePosition)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF bSetCoordinates
SET_ENTITY_COORDS(sGoldVans[1].veh, <<124.6472, -1199.2728, 28.4650>>) //<<124.8484, -1199.6436, 28.4650>>)
SET_ENTITY_HEADING(sGoldVans[1].veh, 89.8633)
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[1].veh)
ENDIF
SET_VEHICLE_DOORS_LOCKED(sGoldVans[1].veh, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
IF bOpenDoors
SET_VEHICLE_DOOR_OPEN(sGoldVans[1].veh, SC_DOOR_REAR_LEFT)
SET_VEHICLE_DOOR_OPEN(sGoldVans[1].veh, SC_DOOR_REAR_RIGHT)
ENDIF
FREEZE_ENTITY_POSITION(sGoldVans[1].veh, bFreezePosition)
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_GOLD_TROLLEYS_IN_VANS(BOOL bOffsetTrevorsTrolleyForPassenger = FALSE)
IF SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
DETACH_ENTITY(objGoldTrolleys[0])
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[0], sGoldVans[0].veh, 0, <<0.0, -2.2, 0.8>>, <<0.0, 0.0, 89.0>>)
DETACH_ENTITY(objGoldTrolleys[1])
IF bOffsetTrevorsTrolleyForPassenger
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[1], sGoldVans[1].veh, 0, <<-0.2, -1.8, 0.8>>, <<0.0, 0.0, 90.0>>)
ELSE
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[1], sGoldVans[1].veh, 0, <<0.0, -2.2, 0.8>>, <<0.0, 0.0, 90.0>>)
ENDIF
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_BUDDIES_START_FIGHT()
sMichael.iEvent = 0
sFranklin.iEvent = 0
sTrevor.iEvent = 0
sCrew[CREW_GUNMAN].iEvent = 0
sCrew[CREW_DRIVER].iEvent = 0
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<130.5416, -1202.8286, 28.3419>>)
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 186.3565)
ENDIF
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_CARBINERIFLE, 500, TRUE)
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], RELGROUPHASH_PLAYER)
SET_PED_COMBAT_PARAMS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CA_BLIND_FIRE_IN_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_DisableHurt, TRUE)
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_CARBINERIFLE, TRUE)
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1800)
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1800)
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
SET_RAGDOLL_BLOCKING_FLAGS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_PLAYER_IMPACT | RBF_MELEE | RBF_FALLING | RBF_IMPACT_OBJECT)
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE, -1)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], <<127.7625, -1208.8765, 28.2951>>)
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 178.8779)
ENDIF
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE, 500, TRUE)
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], RELGROUPHASH_PLAYER)
SET_PED_COMBAT_PARAMS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CA_BLIND_FIRE_IN_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PCF_DisableHurt, TRUE)
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE, TRUE)
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 1800)
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 1800)
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
SET_RAGDOLL_BLOCKING_FLAGS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_PLAYER_IMPACT | RBF_MELEE | RBF_FALLING | RBF_IMPACT_OBJECT)
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE, -1)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<137.9836, -1201.9281, 28.4865>>)
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 187.6068)
ENDIF
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE, 500, TRUE)
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], RELGROUPHASH_PLAYER)
SET_PED_COMBAT_PARAMS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CA_BLIND_FIRE_IN_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_DisableHurt, TRUE)
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE, TRUE)
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
SET_RAGDOLL_BLOCKING_FLAGS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_PLAYER_IMPACT | RBF_MELEE | RBF_FALLING | RBF_IMPACT_OBJECT)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE, -1)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped, <<134.4529, -1181.8196, 28.5015>>)
SET_ENTITY_HEADING(sCrew[CREW_DRIVER].ped, 182.2204)
SET_PED_MAX_HEALTH(sCrew[CREW_DRIVER].ped, 1800)
SET_ENTITY_HEALTH(sCrew[CREW_DRIVER].ped, 1800)
SET_PED_CAN_BE_TARGETTED(sCrew[CREW_DRIVER].ped, FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(sCrew[CREW_DRIVER].ped, RELGROUPHASH_PLAYER)
SET_PED_SUFFERS_CRITICAL_HITS(sCrew[CREW_DRIVER].ped, FALSE)
SET_PED_CAN_RAGDOLL(sCrew[CREW_DRIVER].ped, FALSE)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
SET_ENTITY_COORDS(sCrew[CREW_GUNMAN].ped, <<128.1546, -1182.0406, 28.5027>>)
SET_ENTITY_HEADING(sCrew[CREW_GUNMAN].ped, 175.5790)
SET_PED_MAX_HEALTH(sCrew[CREW_GUNMAN].ped, 1800)
SET_ENTITY_HEALTH(sCrew[CREW_GUNMAN].ped, 1800)
SET_PED_CAN_BE_TARGETTED(sCrew[CREW_GUNMAN].ped, FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(sCrew[CREW_GUNMAN].ped, RELGROUPHASH_PLAYER)
SET_PED_SUFFERS_CRITICAL_HITS(sCrew[CREW_GUNMAN].ped, FALSE)
SET_PED_CAN_RAGDOLL(sCrew[CREW_GUNMAN].ped, FALSE)
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
RETURN TRUE
ENDFUNC
/*FUNC BOOL SETUP_REQ_EXTRA_SHOOTOUT_COVER()
IF NOT DOES_ENTITY_EXIST(objShootoutCover)
REQUEST_MODEL(modelShootoutCover)
IF HAS_MODEL_LOADED(modelShootoutCover)
objShootoutCover = CREATE_OBJECT_NO_OFFSET(modelShootoutCover, <<160.8731, -1202.5350, 28.3122>>)
SET_ENTITY_ROTATION(objShootoutCover, <<-1.4658, -0.4678, -0.9420>>)
FREEZE_ENTITY_POSITION(objShootoutCover, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelShootoutCover)
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC*/
FUNC BOOL SETUP_REQ_CREW_IN_GOLD_VANS(BOOL bIncludePlayer = TRUE)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) OR GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL)
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF bIncludePlayer
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh)
ELSE
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sGoldVans[0].veh)
ENDIF
ENDIF
SET_PED_INTO_VEHICLE(sGoldVanPeds[CASEY_ID].ped, sGoldVans[0].veh, VS_FRONT_RIGHT)
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh)
SET_PED_INTO_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldVans[1].veh, VS_FRONT_RIGHT)
SET_PED_INTO_VEHICLE(sCrew[CREW_GUNMAN].ped, sGoldVans[1].veh, VS_BACK_RIGHT)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(PED_INDEX ped, OBJECT_INDEX objTrolley, BOOL bInstantBlend = FALSE, BOOL bForceAIUpdate = FALSE, BOOL bForceWalkingAnim = FALSE)
FLOAT fBlendTime = NORMAL_BLEND_IN
INT iIKBlendTime = -1
IF bInstantBlend
fBlendTime = INSTANT_BLEND_IN
iIKBlendTime = 0
ENDIF
IF NOT IS_PED_INJURED(ped)
IF IS_PED_WALKING(ped)
OR bForceWalkingAnim
IF NOT IS_ENTITY_PLAYING_ANIM(ped, strAnimIG5, "push_trolly_walk")
TASK_PLAY_ANIM(ped, strAnimIG5, "push_trolly_walk", fBlendTime, -2, -1,
AF_UPPERBODY | AF_SECONDARY | AF_LOOPING | AF_TAG_SYNC_CONTINUOUS)
ENDIF
ELSE
IF NOT IS_ENTITY_PLAYING_ANIM(ped, strAnimIG5, "push_trolly_stand")
TASK_PLAY_ANIM(ped, strAnimIG5, "push_trolly_stand", fBlendTime, -2, -1,
AF_UPPERBODY | AF_SECONDARY | AF_LOOPING | AF_TAG_SYNC_CONTINUOUS)
ENDIF
ENDIF
SET_IK_TARGET(ped, IK_PART_ARM_LEFT, objTrolley, GOLD_TROLLEY_BONE_GRIP_LEFT, vTrolleyLeftHandAttach, ITF_ARM_TARGET_WRT_IKHELPER, iIKBlendTime)
SET_IK_TARGET(ped, IK_PART_ARM_RIGHT, objTrolley, GOLD_TROLLEY_BONE_GRIP_RIGHT, vTrolleyRightHandAttach, ITF_ARM_TARGET_WRT_IKHELPER, iIKBlendTime)
ENDIF
IF bForceAIUpdate
FORCE_PED_AI_AND_ANIMATION_UPDATE(ped)
ENDIF
ENDPROC
PROC UPDATE_TROLLEY_WALK_ANIMS(BOOL bInstantBlend = FALSE, BOOL bForceAIUpdate = FALSE, BOOL bForceWalkingAnim = FALSE)
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], objGoldTrolleys[1], bInstantBlend, bForceAIUpdate, bForceWalkingAnim)
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sGoldVanPeds[CASEY_ID].ped, objGoldTrolleys[0], bInstantBlend, bForceAIUpdate, bForceWalkingAnim)
ENDPROC
/// PURPOSE:
/// There are three slots being used for random enemy ped speakers. This adds a ped into a currently free slot. Once a ped dies the slot is cleared.
/// If i_speaker is set to something other than -1 it'll try to place the ped in the given slot.
PROC ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(PED_INDEX ped, INT iSpeaker = -1, BOOL bForceAdd = FALSE)
IF NOT IS_PED_INJURED(ped)
IF sConversationPeds.PedInfo[MERRY_SPEAKER_1].Index != ped
AND sConversationPeds.PedInfo[MERRY_SPEAKER_2].Index != ped
AND sConversationPeds.PedInfo[MERRY_SPEAKER_3].Index != ped
IF iSpeaker = -1
IF NOT sConversationPeds.PedInfo[MERRY_SPEAKER_1].ActiveInConversation
ADD_PED_FOR_DIALOGUE(sConversationPeds, MERRY_SPEAKER_1, ped, "BS2AMerry1")
ELIF NOT sConversationPeds.PedInfo[MERRY_SPEAKER_2].ActiveInConversation
ADD_PED_FOR_DIALOGUE(sConversationPeds, MERRY_SPEAKER_2, ped, "BS2AMerry2")
ELIF NOT sConversationPeds.PedInfo[MERRY_SPEAKER_3].ActiveInConversation
ADD_PED_FOR_DIALOGUE(sConversationPeds, MERRY_SPEAKER_3, ped, "BS2AMerry3")
ENDIF
ELSE
IF NOT sConversationPeds.PedInfo[iSpeaker].ActiveInConversation
OR bForceAdd
IF iSpeaker = MERRY_SPEAKER_1
ADD_PED_FOR_DIALOGUE(sConversationPeds, iSpeaker, ped, "BS2AMerry1")
ELIF iSpeaker = MERRY_SPEAKER_2
ADD_PED_FOR_DIALOGUE(sConversationPeds, iSpeaker, ped, "BS2AMerry2")
ELIF iSpeaker = MERRY_SPEAKER_3
ADD_PED_FOR_DIALOGUE(sConversationPeds, iSpeaker, ped, "BS2AMerry3")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC PLAYER_SHOOTOUT_STATE GET_PLAYER_SHOOTOUT_STATE()
PLAYER_SHOOTOUT_STATE ePlayerState = PLAYER_STATE_DEFENDING_FRONT
RETURN ePlayerState
ENDFUNC
///Returns the ped index of the ped that killed the given ped (if their source of death was a ped).
FUNC PED_INDEX GET_PED_THAT_KILLED_PED(PED_INDEX ped)
ENTITY_INDEX entityDeathSource = GET_PED_SOURCE_OF_DEATH(ped)
IF DOES_ENTITY_EXIST(entityDeathSource)
IF IS_ENTITY_A_PED(entityDeathSource)
RETURN GET_PED_INDEX_FROM_ENTITY_INDEX(entityDeathSource)
ENDIF
ENDIF
RETURN NULL
ENDFUNC
//Splits locate checks for the shootout over multiple frames to save execution time.
PROC CHECK_LOCATES_FOR_SHOOTOUT(INT iMaxNumLocatesPerFrame = 1)
INT iNumLocatesCheckedThisFrame = 0
WHILE iNumLocatesCheckedThisFrame < iMaxNumLocatesPerFrame
SWITCH iLocateCheckIndex
CASE 0
bInSafeAreaForInfiniteFlankSpawn = IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<126.471077,-1212.260864,30.298681>>,<<48.250000,39.250000,2.250000>>)
BREAK
CASE 1
bNearInfiniteFlankSpawnArea = IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<195.842010,-1236.673340,35.467030>>,<<2.750000,26.750000,7.750000>>)
BREAK
ENDSWITCH
iLocateCheckIndex++
IF iLocateCheckIndex > 1
iLocateCheckIndex = 0
ENDIF
iNumLocatesCheckedThisFrame++
ENDWHILE
ENDPROC
PROC MANAGE_SHOOTOUT_ENEMIES(BOOL bJustRequestAssets = FALSE, BOOL bForceCombatDuringCutscene = FALSE)
INT i = 0
SEQUENCE_INDEX seq
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
REQUEST_MODEL(modelMerryweather)
REQUEST_MODEL(modelMerryCar)
REQUEST_VEHICLE_ASSET(modelMerryCar, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
REQUEST_WEAPON_ASSET(WEAPONTYPE_CARBINERIFLE)
REQUEST_WEAPON_ASSET(WEAPONTYPE_ADVANCEDRIFLE)
//Store the number of enemies alive in each group, this comes in handy later and saves execution.
iNumAliveCopsStart = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sCopsStart)
iNumAliveCopsWave2 = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sCopsWave2)
iNumAliveVanFlank = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sVanFlank)
iNumAliveVanCrash = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sVanCrash)
iNumAliveNooseRope1 = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sNooseRope1)
//iNumAliveNooseAbove = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sNooseAbove)
iNumAliveGoonsWave3b = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sGoonsWave3b)
iNumAliveGoonsSnipe = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sGoonsSnipe)
iNumAliveInfiniteEnemiesFront = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sInfiniteEnemiesFront)
iNumAliveInfiniteEnemiesFlank = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sInfiniteEnemiesFlank)
iNumAliveFrontEnemies = iNumAliveCopsStart + iNumAliveCopsWave2 + iNumAliveVanCrash + iNumAliveGoonsSnipe + iNumAliveInfiniteEnemiesFront
//First cops: these appear in the cutscene, two cars drive in and cops get out.
IF NOT sCopsStart[0].bIsCreated
IF HAS_MODEL_LOADED(modelMerryweather)
AND HAS_MODEL_LOADED(modelMerryCar)
AND HAS_VEHICLE_ASSET_LOADED(modelMerryCar)
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_CARBINERIFLE)
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_ADVANCEDRIFLE)
AND NOT bJustRequestAssets
vehCopsStart[0] = CREATE_VEHICLE(modelMerryCar, <<139.4125, -1229.0784, 28.4037>>, 283.0258)
vehCopsStart[1] = CREATE_VEHICLE(modelMerryCar, <<125.9182, -1234.2787, 28.4433>>, 67.2091)
SET_VEHICLE_ENGINE_ON(vehCopsStart[0], TRUE, TRUE)
SET_VEHICLE_LIGHTS(vehCopsStart[0], FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_FULLBEAM(vehCopsStart[0], TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(vehCopsStart[0])
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehCopsStart[0], FALSE)
SET_VEHICLE_COLOURS(vehCopsStart[0], MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
SET_VEHICLE_EXTRA_COLOURS(vehCopsStart[0], MERRY_CAR_COLOUR, 0)
SET_VEHICLE_EXTRA(vehCopsStart[0], 1, TRUE)
SET_VEHICLE_ENGINE_ON(vehCopsStart[1], TRUE, TRUE)
SET_VEHICLE_LIGHTS(vehCopsStart[1], FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_FULLBEAM(vehCopsStart[1], TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(vehCopsStart[1])
FREEZE_ENTITY_POSITION(vehCopsStart[1], TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehCopsStart[1], FALSE)
SET_VEHICLE_COLOURS(vehCopsStart[1], MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
SET_VEHICLE_EXTRA_COLOURS(vehCopsStart[1], MERRY_CAR_COLOUR, 0)
SET_VEHICLE_EXTRA(vehCopsStart[1], 1, TRUE)
sCopsStart[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsStart[0], VS_DRIVER, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
sCopsStart[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsStart[0], VS_FRONT_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_ADVANCEDRIFLE)
sCopsStart[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsStart[0], VS_BACK_LEFT, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
sCopsStart[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsStart[0], VS_BACK_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_ADVANCEDRIFLE)
sCopsStart[4].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsStart[1], VS_DRIVER, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
sCopsStart[5].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsStart[1], VS_FRONT_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_ADVANCEDRIFLE)
sCopsStart[6].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsStart[1], VS_BACK_LEFT, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
sCopsStart[7].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsStart[1], VS_BACK_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_ADVANCEDRIFLE)
ADD_COVER_BLOCKING_AREA(<<126.0, -1218.7, 28.0>>, <<130.5, -1214.1, 31.0>>, TRUE, FALSE, TRUE)
INITIALISE_ENEMY_GROUP(sCopsStart, "Start ")
REPEAT COUNT_OF(sCopsStart) i
IF HAS_PED_GOT_WEAPON(sCopsStart[i].ped, WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_COMPONENT_TO_PED(sCopsStart[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
ELIF HAS_PED_GOT_WEAPON(sCopsStart[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
GIVE_WEAPON_COMPONENT_TO_PED(sCopsStart[i].ped, WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
ENDIF
ENDREPEAT
ENDIF
ELSE
IF NOT sCopsStart[0].bHasCleanedUp
INT iNumPedsCleanedUp = 0
INT iNumPedsInGroup = COUNT_OF(sCopsStart)
REPEAT iNumPedsInGroup i
IF DOES_ENTITY_EXIST(sCopsStart[i].ped)
IF NOT IS_PED_INJURED(sCopsStart[i].ped)
//If the enemy was just damaged by the player then update the timer tracking the last time the player damaged a ped.
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sCopsStart[i].ped, PLAYER_PED_ID())
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sCopsStart[i].ped)
ENDIF
SWITCH sCopsStart[i].iEvent
CASE 0
INT iVehicle
iVehicle = i / 4
IF eMissionStage = STAGE_SHOOTOUT //Don't have them get out in the cutscene
OR bForceCombatDuringCutscene
IF (IS_VEHICLE_DRIVEABLE(vehCopsStart[iVehicle])
AND ABSF(GET_ENTITY_SPEED(vehCopsStart[iVehicle])) < 0.5
AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehCopsStart[iVehicle]))
OR NOT IS_VEHICLE_DRIVEABLE(vehCopsStart[iVehicle])
IF i = 0
sCopsStart[i].vDest = <<138.4230, -1220.4518, 28.3784>>
SET_PED_COVER_POINT_AND_SPHERE(sCopsStart[i].ped, sCopsStart[i].cover, sCopsStart[i].vDest, 333.3116, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
ELIF i = 1
sCopsStart[i].vDest = <<141.2, -1230.4, 28.2952>>
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsStart[i].ped, sCopsStart[i].vDest, 2.0, TRUE)
ELIF i = 2
sCopsStart[i].vDest = <<136.7580, -1219.8176, 28.4035>>
SET_PED_COVER_POINT_AND_SPHERE(sCopsStart[i].ped, sCopsStart[i].cover, sCopsStart[i].vDest, 337.2540, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
ELIF i = 3
sCopsStart[i].vDest = <<138.1, -1230.8, 28.2951>>
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsStart[i].ped, sCopsStart[i].vDest, 2.0, TRUE)
ELIF i = 4
sCopsStart[i].vDest = <<124.3, -1234.9, 28.2951>>
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsStart[i].ped, sCopsStart[i].vDest, 2.0, TRUE)
ELIF i = 5
sCopsStart[i].vDest = <<130.2462, -1224.1238, 28.5143>>
SET_PED_COVER_POINT_AND_SPHERE(sCopsStart[i].ped, sCopsStart[i].cover, sCopsStart[i].vDest, 9.5513, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
ELIF i = 6
sCopsStart[i].vDest = <<127.0, -1236.4, 28.2951>>
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsStart[i].ped, sCopsStart[i].vDest, 2.0, TRUE)
ELIF i = 7
sCopsStart[i].vDest = <<127.5857, -1215.9505, 28.4570>>
SET_PED_COVER_POINT_AND_SPHERE(sCopsStart[i].ped, sCopsStart[i].cover, sCopsStart[i].vDest, 5.0, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
ENDIF
//If this is the cutscene transition then get them out the cars immediately.
IF bForceCombatDuringCutscene
IF i = 0
SET_ENTITY_COORDS(sCopsStart[i].ped, <<138.93, -1226.68, 28.38>>)
ELIF i = 1
SET_ENTITY_COORDS(sCopsStart[i].ped, <<142.48, -1231.99, 28.38>>)
ELIF i = 2
SET_ENTITY_COORDS(sCopsStart[i].ped, <<137.44, -1226.8, 28.38>>)
ELIF i = 3
SET_ENTITY_COORDS(sCopsStart[i].ped, <<137.16, -1232.79, 28.38>>)
ELIF i = 4
SET_ENTITY_COORDS(sCopsStart[i].ped, <<122.43, -1236.17, 28.38>>)
ELIF i = 5
SET_ENTITY_COORDS(sCopsStart[i].ped, <<126.92, -1229.19, 28.38>>)
ELIF i = 6
SET_ENTITY_COORDS(sCopsStart[i].ped, <<127.80, -1237.70, 28.38>>)
ELIF i = 7
SET_ENTITY_COORDS(sCopsStart[i].ped, <<128.18, -1232.65, 28.38>>)
ENDIF
SET_ENTITY_HEADING(sCopsStart[i].ped, -4.3)
ENDIF
//SET_COMBAT_FLOAT(sCopsStart[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 0.5)
IF i % 2 = 0
SET_PED_COMBAT_PARAMS(sCopsStart[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
ELSE
SET_PED_COMBAT_PARAMS(sCopsStart[i].ped, 12, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
ENDIF
IF HAS_PED_GOT_WEAPON(sCopsStart[i].ped, WEAPONTYPE_CARBINERIFLE)
SET_CURRENT_PED_WEAPON(sCopsStart[i].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
ELIF HAS_PED_GOT_WEAPON(sCopsStart[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
SET_CURRENT_PED_WEAPON(sCopsStart[i].ped, WEAPONTYPE_ADVANCEDRIFLE, TRUE)
ENDIF
SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_REQUIRES_LOS_TO_SHOOT, FALSE)
SET_COMBAT_FLOAT(sCopsStart[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
//SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_OPEN_COMBAT_WHEN_DEFENSIVE_AREA_IS_REACHED, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sCopsStart[i].ped, 150.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCopsStart[i].ped, FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sCopsStart[i].ped, TRUE)
//SET_COMBAT_FLOAT(sCopsStart[i].ped, CCF_TIME_BETWEEN_BURSTS_IN_COVER, 0.05)
IF i = 0
PLAY_PED_AMBIENT_SPEECH(sCopsStart[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
ENDIF
//sCopsStart[i].blip = CREATE_BLIP_FOR_PED(sCopsStart[i].ped, TRUE)
sCopsStart[i].iTimer = GET_GAME_TIMER()
sCopsStart[i].iEvent++
ENDIF
ENDIF
BREAK
CASE 1 //Break out of defensive areas after a few seconds.
IF GET_GAME_TIMER() - sCopsStart[i].iTimer > 7000
SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_CAN_CHARGE, TRUE)
SET_COMBAT_FLOAT(sCopsStart[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
sCopsStart[i].iEvent++
ENDIF
BREAK
CASE 2 //Make them killable by buddies.
IF GET_GAME_TIMER() - sCopsStart[i].iTimer > 10000
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sCopsStart[i].ped, FALSE)
sCopsStart[i].iEvent++
ENDIF
BREAK
CASE 3 //If there are any enemies still alive after the van crash, have them push forward.
IF i = 3
//Enemy #3 pushes forward to the sofa once enemy #0 is dead
IF IS_PED_INJURED(sCopsStart[0].ped)
sCopsStart[i].vDest = <<136.7580, -1219.8176, 28.4035>>
SET_PED_COMBAT_MOVEMENT(sCopsStart[i].ped, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsStart[i].ped, sCopsStart[i].vDest, 2.0)
SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_CAN_CHARGE, TRUE)
SET_COMBAT_FLOAT(sCopsStart[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
sCopsStart[i].iEvent = 50
ENDIF
ELIF i = 2
//Enemy #2 pushes forward to the pillars after a bit of time.
IF GET_GAME_TIMER() - sCopsStart[i].iTimer > 20000
OR sCopsWave2[0].bIsCreated
sCopsStart[i].vDest = <<138.9045, -1209.6268, 28.2952>>
REMOVE_COVER_POINT(sCopsStart[i].cover)
SET_PED_COMBAT_MOVEMENT(sCopsStart[i].ped, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsStart[i].ped, sCopsStart[i].vDest, 2.0, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_CAN_CHARGE, TRUE)
SET_COMBAT_FLOAT(sCopsStart[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
sCopsStart[i].iEvent = 50
ENDIF
ELSE
sCopsStart[i].iEvent = 50
ENDIF
BREAK
ENDSWITCH
IF sCopsStart[i].iEvent != 0
UPDATE_AI_PED_BLIP(sCopsStart[i].ped, sCopsStart[i].sBlipData)
//SET_PED_RESET_FLAG(sCopsStart[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
//Handle the enemy behaviour when the main attack front changes: if the enemy isn't part of the main front then set them to defensive.
IF sCopsStart[i].iEvent <= 50
//General combat with charge on, once the front changes set them to defensive.
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FLANK_1
SET_PED_COMBAT_MOVEMENT(sCopsStart[i].ped, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsStart[i].ped, sCopsStart[i].vDest, 2.0)
SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
//SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_CAN_CHARGE, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sCopsStart[i].ped, 150.0)
sCopsStart[i].iEvent = 100
ENDIF
//Do a forced charge when there are only a few enemies left.
IF NOT sCopsStart[i].bSetToCharge
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
IF iNumAliveFrontEnemies < 4
SET_PED_CONFIG_FLAG(sCopsStart[i].ped, PCF_ShouldChargeNow, TRUE)
sCopsStart[i].bSetToCharge = TRUE
ENDIF
ENDIF
ENDIF
ELIF sCopsStart[i].iEvent = 100
//General combat with charge off, once the front changes set them to charge.
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_1
OR eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
SET_PED_COMBAT_MOVEMENT(sCopsStart[i].ped, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsStart[i].ped, sCopsStart[i].vDest, 2.0)
SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_CAN_CHARGE, TRUE)
SET_COMBAT_FLOAT(sCopsStart[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
sCopsStart[i].iEvent = 50
ENDIF
ENDIF
ENDIF
//For any cops surrounding the second car: if it blows up kill the peds off instantly.
IF i > 3
VECTOR vCarPos = GET_ENTITY_COORDS(vehCopsStart[1], FALSE)
IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_CAR, vCarPos, 3.0)
IF VDIST2(GET_ENTITY_COORDS(sCopsStart[i].ped), vCarPos) < 25.0
SET_ENTITY_HEALTH(sCopsStart[i].ped, 0)
ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
DRAW_INT_ABOVE_PED(sCopsStart[i].ped, sCopsStart[i].iEvent)
#ENDIF
ELSE
//If the enemy just died check if the player killed them, if so then update the timer tracking the last time a ped was killed by the player.
IF GET_PED_THAT_KILLED_PED(sCopsStart[i].ped) = PLAYER_PED_ID()
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
ENDIF
CLEAN_UP_ENEMY_PED(sCopsStart[i])
ENDIF
ELSE
iNumPedsCleanedUp++
ENDIF
ENDREPEAT
//Flag this group as cleaned up once each individual ped has been cleaned up (this saves execution time running exist checks every frame).
IF iNumPedsCleanedUp >= iNumPedsInGroup
sCopsStart[0].bHasCleanedUp = TRUE
ENDIF
ENDIF
//Blow up one of the cars if the player shoots it
IF IS_VEHICLE_DRIVEABLE(vehCopsStart[1])
IF GET_VEHICLE_PETROL_TANK_HEALTH(vehCopsStart[1]) > -100
AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vehCopsStart[1], PLAYER_PED_ID(), FALSE)
IF GET_ENTITY_HEALTH(vehCopsStart[1]) < 500
OR GET_VEHICLE_PETROL_TANK_HEALTH(vehCopsStart[1]) < 700
OR GET_VEHICLE_ENGINE_HEALTH(vehCopsStart[1]) < 700
SET_VEHICLE_PETROL_TANK_HEALTH(vehCopsStart[1], -100)
ENDIF
ENDIF
ENDIF
ENDIF
//Another car turns up shortly after the first 2
IF NOT sCopsWave2[0].bIsCreated
REQUEST_VEHICLE_RECORDING(CARREC_COPS_COP_3, strCarrec)
IF HAS_MODEL_LOADED(modelMerryweather)
AND HAS_MODEL_LOADED(modelMerryCar)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_COP_3, strCarrec)
IF NOT DOES_ENTITY_EXIST(vehCopsWave2)
IF (iNumAliveCopsStart < 5 OR NOT bPlayerInShootoutSafeArea) //Trigger when enough enemies have died or if the player goes walkabout.
vehCopsWave2 = CREATE_VEHICLE(modelMerryCar, <<118.5229, -1275.9232, 28.7070>>)
SET_ENTITY_QUATERNION(vehCopsWave2, -0.0419, -0.0341, -0.6314, 0.7736)
SET_VEHICLE_ENGINE_ON(vehCopsWave2, TRUE, TRUE)
SET_SIREN_WITH_NO_DRIVER(vehCopsWave2, TRUE)
SET_VEHICLE_LIGHTS(vehCopsWave2, FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_FULLBEAM(vehCopsWave2, TRUE)
START_PLAYBACK_RECORDED_VEHICLE(vehCopsWave2, CARREC_COPS_COP_3, strCarrec)
IF bPlayerInShootoutSafeArea
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehCopsWave2, 1000.0)
ELSE
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehCopsWave2, 1000.0)
ENDIF
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehCopsWave2)
SET_PLAYBACK_SPEED(vehCopsWave2, 1.1)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehCopsWave2, FALSE)
SET_VEHICLE_COLOURS(vehCopsWave2, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
SET_VEHICLE_EXTRA_COLOURS(vehCopsWave2, MERRY_CAR_COLOUR, 0)
SET_VEHICLE_EXTRA(vehCopsWave2, 1, TRUE)
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_01")
START_AUDIO_SCENE("BS_2A_CAR_ARRIVE_01")
ENDIF
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vehCopsWave2, "BS_2A_MERRYWEATHER_CARS")
ENDIF
ELIF NOT DOES_ENTITY_EXIST(sCopsWave2[0].ped)
sCopsWave2[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsWave2, VS_DRIVER, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
ELIF NOT DOES_ENTITY_EXIST(sCopsWave2[1].ped)
sCopsWave2[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsWave2, VS_FRONT_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_ADVANCEDRIFLE)
ELIF NOT DOES_ENTITY_EXIST(sCopsWave2[2].ped)
sCopsWave2[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsWave2, VS_BACK_LEFT, relGroupCops, 200, 100, WEAPONTYPE_ADVANCEDRIFLE)
ELIF NOT DOES_ENTITY_EXIST(sCopsWave2[3].ped)
sCopsWave2[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsWave2, VS_BACK_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
INITIALISE_ENEMY_GROUP(sCopsWave2, "Wave 2 ")
REPEAT COUNT_OF(sCopsWave2) i
IF HAS_PED_GOT_WEAPON(sCopsWave2[i].ped, WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_COMPONENT_TO_PED(sCopsWave2[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
ELIF HAS_PED_GOT_WEAPON(sCopsWave2[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
GIVE_WEAPON_COMPONENT_TO_PED(sCopsWave2[i].ped, WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
ENDIF
ENDREPEAT
ENDIF
ENDIF
ELSE
IF NOT sCopsWave2[0].bHasCleanedUp
INT iNumPedsCleanedUp = 0
INT iNumPedsInGroup = COUNT_OF(sCopsWave2)
REPEAT iNumPedsInGroup i
IF DOES_ENTITY_EXIST(sCopsWave2[i].ped)
IF NOT IS_PED_INJURED(sCopsWave2[i].ped)
//If the enemy was just damaged by the player then update the timer tracking the last time the player damaged a ped.
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sCopsWave2[i].ped, PLAYER_PED_ID())
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sCopsWave2[i].ped)
ENDIF
SWITCH sCopsWave2[i].iEvent
CASE 0
BOOL bGetPedsOut
INT iGetOutTimer
IF IS_VEHICLE_DRIVEABLE(vehCopsWave2)
IF ABSF(GET_ENTITY_SPEED(vehCopsWave2)) < 0.5 AND IS_ENTITY_AT_COORD(vehCopsWave2, <<137.3, -1235.7, 28.5143>>, <<5.0, 5.0, 5.0>>)
bGetPedsOut = TRUE
ENDIF
ELSE
bGetPedsOut = TRUE
ENDIF
IF bGetPedsOut
IF i = 0
iGetOutTimer = 0
ELIF i = 1
iGetOutTimer = 1200
ELIF i = 2
iGetOutTimer = 650
ELSE
iGetOutTimer = 1700
ENDIF
IF sCopsWave2[i].iTimer = 0
sCopsWave2[i].iTimer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - sCopsWave2[i].iTimer > iGetOutTimer
IF i = 0
sCopsWave2[i].vDest = <<130.6482, -1210.0120, 28.2952>>
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsWave2[i].ped, sCopsWave2[i].vDest, 3.0, TRUE)
ELIF i = 1
sCopsWave2[i].vDest = <<137.3, -1235.7, 28.5143>>
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsWave2[i].ped, sCopsWave2[i].vDest, 3.0, TRUE)
ELIF i = 2
sCopsWave2[i].vDest = <<128.5857, -1215.5505, 28.4570>>
SET_PED_COVER_POINT_AND_SPHERE(sCopsWave2[i].ped, sCopsWave2[i].cover, sCopsWave2[i].vDest, 2.0, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
ELSE
sCopsWave2[i].vDest = <<128.1760, -1226.6620, 28.5025>>
SET_PED_COVER_POINT_AND_SPHERE(sCopsWave2[i].ped, sCopsWave2[i].cover, sCopsWave2[i].vDest, 15.7777, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
ENDIF
IF i % 2 = 0
SET_PED_COMBAT_PARAMS(sCopsWave2[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
ELSE
SET_PED_COMBAT_PARAMS(sCopsWave2[i].ped, 12, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
ENDIF
//SET_COMBAT_FLOAT(sCopsWave2[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 0.5)
IF HAS_PED_GOT_WEAPON(sCopsWave2[i].ped, WEAPONTYPE_CARBINERIFLE)
SET_CURRENT_PED_WEAPON(sCopsWave2[i].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
ELIF HAS_PED_GOT_WEAPON(sCopsWave2[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
SET_CURRENT_PED_WEAPON(sCopsWave2[i].ped, WEAPONTYPE_ADVANCEDRIFLE, TRUE)
ENDIF
SET_PED_COMBAT_ATTRIBUTES(sCopsWave2[i].ped, CA_USE_VEHICLE, FALSE)
SET_COMBAT_FLOAT(sCopsWave2[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sCopsWave2[i].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCopsWave2[i].ped, FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sCopsWave2[i].ped, TRUE)
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_01")
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_01")
ENDIF
IF i = 0 OR i = 3
PLAY_PED_AMBIENT_SPEECH(sCopsWave2[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
ENDIF
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vehCopsWave2)
sCopsWave2[i].iTimer = GET_GAME_TIMER()
sCopsWave2[i].iEvent++
ENDIF
ENDIF
BREAK
CASE 1
IF GET_GAME_TIMER() - sCopsWave2[i].iTimer > 7000
SET_PED_COMBAT_ATTRIBUTES(sCopsWave2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(sCopsWave2[i].ped, CA_CAN_CHARGE, TRUE)
SET_COMBAT_FLOAT(sCopsWave2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
sCopsWave2[i].iEvent++
ENDIF
BREAK
CASE 2
IF GET_GAME_TIMER() - sCopsWave2[i].iTimer > 10000
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sCopsWave2[i].ped, FALSE)
sCopsWave2[i].iEvent++
ENDIF
BREAK
ENDSWITCH
IF sCopsWave2[i].iEvent > 0
UPDATE_AI_PED_BLIP(sCopsWave2[i].ped, sCopsWave2[i].sBlipData)
//SET_PED_RESET_FLAG(sCopsWave2[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
//Handle the enemy behaviour when the main attack front changes: if the enemy isn't part of the main front then set them to defensive.
IF sCopsWave2[i].iEvent <= 50
//General combat with charge on, once the front changes set them to defensive.
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FLANK_1
SET_PED_COMBAT_MOVEMENT(sCopsWave2[i].ped, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsWave2[i].ped, sCopsWave2[i].vDest, 3.0)
SET_PED_COMBAT_ATTRIBUTES(sCopsWave2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
//SET_PED_COMBAT_ATTRIBUTES(sCopsWave2[i].ped, CA_CAN_CHARGE, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sCopsWave2[i].ped, 150.0)
sCopsWave2[i].iEvent = 100
ENDIF
//Do a forced charge when there are only a few enemies left.
IF NOT sCopsWave2[i].bSetToCharge
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
IF iNumAliveFrontEnemies < 4
SET_PED_CONFIG_FLAG(sCopsWave2[i].ped, PCF_ShouldChargeNow, TRUE)
sCopsWave2[i].bSetToCharge = TRUE
ENDIF
ENDIF
ENDIF
ELIF sCopsWave2[i].iEvent = 100
//General combat with charge off, once the front changes set them to charge.
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_1
OR eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
SET_PED_COMBAT_MOVEMENT(sCopsWave2[i].ped, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsWave2[i].ped, sCopsWave2[i].vDest, 3.0)
SET_PED_COMBAT_ATTRIBUTES(sCopsWave2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(sCopsWave2[i].ped, CA_CAN_CHARGE, TRUE)
SET_COMBAT_FLOAT(sCopsWave2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
sCopsWave2[i].iEvent = 50
ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
DRAW_INT_ABOVE_PED(sCopsWave2[i].ped, sCopsWave2[i].iEvent)
#ENDIF
ELSE
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_01")
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_01")
ENDIF
//If the enemy just died check if the player killed them, if so then update the timer tracking the last time a ped was killed by the player.
IF GET_PED_THAT_KILLED_PED(sCopsWave2[i].ped) = PLAYER_PED_ID()
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
ENDIF
CLEAN_UP_ENEMY_PED(sCopsWave2[i])
ENDIF
ELSE
iNumPedsCleanedUp++
ENDIF
ENDREPEAT
//Flag this group as cleaned up once each individual ped has been cleaned up (this saves execution time running exist checks every frame).
IF iNumPedsCleanedUp >= iNumPedsInGroup
sCopsWave2[0].bHasCleanedUp = TRUE
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(vehCopsWave2) AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehCopsWave2)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_COP_3, strCarrec)
ENDIF
//DO_VEHICLE_DAMAGE_WHEN_SHOT(vehCopsWave2)
ENDIF
//Van attempts to get in close, skids out.
IF NOT sVanCrash[0].bIsCreated
IF (bDoNewVersionOfShootout AND iNumAliveVanFlank + iNumAliveNooseRope1 /*+ iNumAliveNooseAbove*/ + iNumAliveGoonsWave3b < 3)
OR (NOT bDoNewVersionOfShootout AND iNumAliveCopsStart + iNumAliveCopsWave2 < 5)
REQUEST_VEHICLE_RECORDING(CARREC_SHOOTOUT_GOONS_2B, strCarrec)
IF HAS_MODEL_LOADED(modelMerryweather)
AND HAS_MODEL_LOADED(modelMerryCar)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_SHOOTOUT_GOONS_2B, strCarrec)
IF NOT DOES_ENTITY_EXIST(vehVanCrash)
vehVanCrash = CREATE_VEHICLE(modelMerryCar, <<118.5229, -1275.9232, 28.7070>>)
SET_VEHICLE_ENGINE_ON(vehVanCrash, TRUE, TRUE)
SET_SIREN_WITH_NO_DRIVER(vehVanCrash, TRUE)
SET_VEHICLE_LIGHTS(vehVanCrash, FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_FULLBEAM(vehVanCrash, TRUE)
START_PLAYBACK_RECORDED_VEHICLE(vehVanCrash, CARREC_SHOOTOUT_GOONS_2B, strCarrec)
IF bPlayerInShootoutSafeArea
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehVanCrash, 1000.0)
ELSE
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehVanCrash, 0.0)
ENDIF
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehVanCrash)
SET_PLAYBACK_SPEED(vehVanCrash, 1.0)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehVanCrash, FALSE)
SET_VEHICLE_COLOURS(vehVanCrash, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
SET_VEHICLE_EXTRA_COLOURS(vehVanCrash, MERRY_CAR_COLOUR, 0)
SET_VEHICLE_EXTRA(vehVanCrash, 1, TRUE)
iVanCrashEvent = 0
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_02")
START_AUDIO_SCENE("BS_2A_CAR_ARRIVE_02")
ENDIF
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vehVanCrash, "BS_2A_MERRYWEATHER_CARS")
ELIF NOT DOES_ENTITY_EXIST(sVanCrash[0].ped)
sVanCrash[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehVanCrash, VS_DRIVER, relGroupCops, 150, 100, WEAPONTYPE_ADVANCEDRIFLE)
ELIF NOT DOES_ENTITY_EXIST(sVanCrash[1].ped)
sVanCrash[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehVanCrash, VS_FRONT_RIGHT, relGroupCops, 150, 100, WEAPONTYPE_CARBINERIFLE)
ELIF NOT DOES_ENTITY_EXIST(sVanCrash[2].ped)
sVanCrash[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehVanCrash, VS_BACK_LEFT, relGroupCops, 150, 100, WEAPONTYPE_CARBINERIFLE)
ELIF NOT DOES_ENTITY_EXIST(sVanCrash[3].ped)
sVanCrash[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehVanCrash, VS_BACK_RIGHT, relGroupCops, 150, 100, WEAPONTYPE_ADVANCEDRIFLE)
INITIALISE_ENEMY_GROUP(sVanCrash, "Crash ")
REPEAT COUNT_OF(sVanCrash) i
IF HAS_PED_GOT_WEAPON(sVanCrash[i].ped, WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_COMPONENT_TO_PED(sVanCrash[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
ELIF HAS_PED_GOT_WEAPON(sVanCrash[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
GIVE_WEAPON_COMPONENT_TO_PED(sVanCrash[i].ped, WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
ENDIF
ENDREPEAT
ENDIF
ENDIF
ENDIF
ELSE
IF NOT sVanCrash[0].bHasCleanedUp
BOOL bTimeToGetOut = FALSE
BOOL bCheckedGetOutTrigger = FALSE
INT iNumPedsCleanedUp = 0
INT iNumPedsInGroup = COUNT_OF(sVanCrash)
REPEAT iNumPedsInGroup i
IF DOES_ENTITY_EXIST(sVanCrash[i].ped)
IF NOT IS_PED_INJURED(sVanCrash[i].ped)
UPDATE_AI_PED_BLIP(sVanCrash[i].ped, sVanCrash[i].sBlipData)
//SET_PED_RESET_FLAG(sVanCrash[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
//If the enemy was just damaged by the player then update the timer tracking the last time the player damaged a ped.
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sVanCrash[i].ped, PLAYER_PED_ID())
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sVanCrash[i].ped)
ENDIF
SWITCH sVanCrash[i].iEvent
CASE 0
IF NOT bCheckedGetOutTrigger
IF NOT IS_ENTITY_DEAD(vehVanCrash)
IF ABSF(GET_ENTITY_SPEED(vehVanCrash)) < 3.0
IF (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehVanCrash) AND GET_TIME_POSITION_IN_RECORDING(vehVanCrash) > 2000.0)
OR NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehVanCrash)
bTimeToGetOut = TRUE
ENDIF
ENDIF
ELSE
bTimeToGetOut = TRUE
ENDIF
bCheckedGetOutTrigger = TRUE
ENDIF
IF bTimeToGetOut
INT iGetOutTimer
IF i = 0
iGetOutTimer = 0
ELIF i = 1
iGetOutTimer = 300
ELIF i = 2
iGetOutTimer = 650
ELSE
iGetOutTimer = 400
ENDIF
IF sVanCrash[i].iTimer = 0
sVanCrash[i].iTimer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - sVanCrash[i].iTimer > iGetOutTimer
IF i = 0
sVanCrash[i].vDest = GET_ENTITY_COORDS(sVanCrash[i].ped)
SET_PED_SPHERE_DEFENSIVE_AREA(sVanCrash[i].ped, GET_ENTITY_COORDS(sVanCrash[i].ped), 5.0)
ELIF i = 1
sVanCrash[i].vDest = <<128.9, -1224.4, 28.6>>
SET_PED_SPHERE_DEFENSIVE_AREA(sVanCrash[i].ped, <<128.9, -1224.4, 28.6>>, 3.0, TRUE)
ELIF i = 2
sVanCrash[i].vDest = <<138.9, -1209.4, 28.6>>
SET_PED_SPHERE_DEFENSIVE_AREA(sVanCrash[i].ped, <<138.9, -1209.4, 28.6>>, 4.0, TRUE)
ELIF i = 3
sVanCrash[i].vDest = <<127.4, -1215.7, 28.6>>
SET_PED_SPHERE_DEFENSIVE_AREA(sVanCrash[i].ped, <<127.4, -1215.7, 28.6>>, 3.0, TRUE)
ENDIF
IF i % 2 = 0
SET_PED_COMBAT_PARAMS(sVanCrash[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
ELSE
SET_PED_COMBAT_PARAMS(sVanCrash[i].ped, 12, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
ENDIF
IF HAS_PED_GOT_WEAPON(sVanCrash[i].ped, WEAPONTYPE_CARBINERIFLE)
SET_CURRENT_PED_WEAPON(sVanCrash[i].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
ELIF HAS_PED_GOT_WEAPON(sVanCrash[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
SET_CURRENT_PED_WEAPON(sVanCrash[i].ped, WEAPONTYPE_ADVANCEDRIFLE, TRUE)
ENDIF
SET_PED_COMBAT_ATTRIBUTES(sVanCrash[i].ped, CA_USE_VEHICLE, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sVanCrash[i].ped, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sVanCrash[i].ped, 200.0)
SET_PED_COMBAT_ATTRIBUTES(sVanCrash[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(sVanCrash[i].ped, CA_CAN_CHARGE, TRUE)
SET_COMBAT_FLOAT(sVanCrash[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
SET_COMBAT_FLOAT(sVanCrash[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_02")
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_02")
ENDIF
IF i = 0
PLAY_PED_AMBIENT_SPEECH(sVanCrash[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
ENDIF
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vehVanCrash)
sVanCrash[i].iEvent++
ENDIF
ENDIF
BREAK
ENDSWITCH
//Handle the enemy behaviour when the main attack front changes: if the enemy isn't part of the main front then set them to defensive.
IF sVanCrash[i].iEvent <= 50
//General combat with charge on, once the front changes set them to defensive.
//NOTE: currently these peds should never be set to not charge.
/*IF eShootoutState = SHOOTOUT_STATE_DEFEND_FLANK_1
SET_PED_COMBAT_MOVEMENT(sVanCrash[i].ped, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(sVanCrash[i].ped, sVanCrash[i].vDest, 5.0)
SET_PED_COMBAT_ATTRIBUTES(sVanCrash[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sVanCrash[i].ped, CA_CAN_CHARGE, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sVanCrash[i].ped, 150.0)
sVanCrash[i].iEvent = 100
ENDIF*/
//Do a forced charge when there are only a few enemies left.
IF NOT sVanCrash[i].bSetToCharge
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
IF iNumAliveFrontEnemies < 4
SET_PED_CONFIG_FLAG(sVanCrash[i].ped, PCF_ShouldChargeNow, TRUE)
sVanCrash[i].bSetToCharge = TRUE
ENDIF
ENDIF
ENDIF
ELIF sVanCrash[i].iEvent = 100
//General combat with charge off, once the front changes set them to charge.
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_1
OR eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
SET_PED_COMBAT_MOVEMENT(sVanCrash[i].ped, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(sVanCrash[i].ped, sVanCrash[i].vDest, 5.0, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sVanCrash[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(sVanCrash[i].ped, CA_CAN_CHARGE, TRUE)
SET_COMBAT_FLOAT(sVanCrash[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
sVanCrash[i].iEvent = 50
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
DRAW_INT_ABOVE_PED(sVanCrash[i].ped, sVanCrash[i].iEvent)
#ENDIF
ELSE
IF i > 0
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_02")
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_02")
ENDIF
ENDIF
//If the enemy just died check if the player killed them, if so then update the timer tracking the last time a ped was killed by the player.
IF GET_PED_THAT_KILLED_PED(sVanCrash[i].ped) = PLAYER_PED_ID()
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
ENDIF
CLEAN_UP_ENEMY_PED(sVanCrash[i])
ENDIF
ELSE
iNumPedsCleanedUp++
ENDIF
ENDREPEAT
//Flag this group as cleaned up once each individual ped has been cleaned up (this saves execution time running exist checks every frame).
IF iNumPedsCleanedUp >= iNumPedsInGroup
sVanCrash[0].bHasCleanedUp = TRUE
ENDIF
ENDIF
//Update the van: tyres burst.
IF NOT IS_ENTITY_DEAD(vehVanCrash)
SWITCH iVanCrashEvent
CASE 0
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehVanCrash)
IF GET_TIME_POSITION_IN_RECORDING(vehVanCrash) > 6800
iVanCrashEvent++
ENDIF
ENDIF
BREAK
CASE 1
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehVanCrash)
AND GET_TIME_POSITION_IN_RECORDING(vehVanCrash) > 7100
SET_VEHICLE_ENGINE_HEALTH(vehVanCrash, 200.0)
iVanCrashEvent++
ENDIF
BREAK
CASE 2
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehVanCrash)
REMOVE_VEHICLE_RECORDING(CARREC_SHOOTOUT_GOONS_2B, strCarrec)
iVanCrashEvent++
ENDIF
BREAK
CASE 3
//DO_VEHICLE_DAMAGE_WHEN_SHOT(vehVanCrash)
BREAK
ENDSWITCH
ENDIF
ENDIF
//Noose van: attempts to flank, triggers at different times depending on which shootout version we're doing.
IF NOT sVanFlank[0].bIsCreated
IF (bDoNewVersionOfShootout AND iNumAliveCopsStart + iNumAliveCopsWave2 < 3)
OR (NOT bDoNewVersionOfShootout AND iNumAliveCopsStart + iNumAliveCopsWave2 + iNumAliveVanCrash < 3)
REQUEST_VEHICLE_RECORDING(CARREC_SHOOTOUT_GOONS_2A, strCarrec)
IF HAS_MODEL_LOADED(modelMerryweather)
AND HAS_MODEL_LOADED(modelMerryCar)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_SHOOTOUT_GOONS_2A, strCarrec)
IF NOT DOES_ENTITY_EXIST(vehNooseWave1)
vehNooseWave1 = CREATE_VEHICLE(modelMerryCar, <<118.5229, -1275.9232, 28.7070>>)
SET_ENTITY_QUATERNION(vehNooseWave1, -0.0419, -0.0341, -0.6314, 0.7736)
SET_VEHICLE_ENGINE_ON(vehNooseWave1, TRUE, TRUE)
SET_SIREN_WITH_NO_DRIVER(vehNooseWave1, TRUE)
SET_VEHICLE_LIGHTS(vehNooseWave1, FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_FULLBEAM(vehNooseWave1, TRUE)
START_PLAYBACK_RECORDED_VEHICLE(vehNooseWave1, CARREC_SHOOTOUT_GOONS_2A, strCarrec)
IF bPlayerInShootoutSafeArea
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehNooseWave1, 1000.0)
ELSE
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehNooseWave1, 0.0)
ENDIF
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehNooseWave1)
SET_PLAYBACK_SPEED(vehNooseWave1, 1.0)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehNooseWave1, FALSE)
SET_VEHICLE_COLOURS(vehNooseWave1, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
SET_VEHICLE_EXTRA_COLOURS(vehNooseWave1, MERRY_CAR_COLOUR, 0)
SET_VEHICLE_EXTRA(vehNooseWave1, 1, TRUE)
SET_VEHICLE_STRONG(vehNooseWave1, TRUE)
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_03")
START_AUDIO_SCENE("BS_2A_CAR_ARRIVE_03")
ENDIF
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vehNooseWave1, "BS_2A_MERRYWEATHER_CARS")
ELIF NOT DOES_ENTITY_EXIST(sVanFlank[0].ped)
sVanFlank[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehNooseWave1, VS_DRIVER, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
ELIF NOT DOES_ENTITY_EXIST(sVanFlank[1].ped)
sVanFlank[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehNooseWave1, VS_FRONT_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_ADVANCEDRIFLE)
ELIF NOT DOES_ENTITY_EXIST(sVanFlank[2].ped)
sVanFlank[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehNooseWave1, VS_BACK_LEFT, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
ELIF NOT DOES_ENTITY_EXIST(sVanFlank[3].ped)
sVanFlank[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehNooseWave1, VS_BACK_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_PUMPSHOTGUN)
INITIALISE_ENEMY_GROUP(sVanFlank, "Van1 ")
REPEAT COUNT_OF(sVanFlank) i
IF i < 3
IF HAS_PED_GOT_WEAPON(sVanFlank[i].ped, WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_COMPONENT_TO_PED(sVanFlank[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
ELIF HAS_PED_GOT_WEAPON(sVanFlank[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
GIVE_WEAPON_COMPONENT_TO_PED(sVanFlank[i].ped, WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDIF
ENDIF
ELSE
IF NOT sVanFlank[0].bHasCleanedUp
INT iNumPedsCleanedUp = 0
INT iNumPedsInGroup = COUNT_OF(sVanFlank)
REPEAT iNumPedsInGroup i
IF DOES_ENTITY_EXIST(sVanFlank[i].ped)
IF NOT IS_PED_INJURED(sVanFlank[i].ped)
UPDATE_AI_PED_BLIP(sVanFlank[i].ped, sVanFlank[i].sBlipData)
//SET_PED_RESET_FLAG(sVanFlank[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
//If the enemy was just damaged by the player then update the timer tracking the last time the player damaged a ped.
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sVanFlank[i].ped, PLAYER_PED_ID())
iTimeLastFlankingEnemyDamaged = GET_GAME_TIMER()
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sVanFlank[i].ped)
ENDIF
SWITCH sVanFlank[i].iEvent
CASE 0
IF (NOT IS_ENTITY_DEAD(vehNooseWave1)
AND ABSF(GET_ENTITY_SPEED(vehNooseWave1)) < 0.5
AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehNooseWave1))
OR IS_ENTITY_DEAD(vehNooseWave1) //In case it's blown up during playback
IF i = 0
sVanFlank[i].vDest = <<165.7681, -1194.2896, 28.3612>>
SET_PED_COVER_POINT_AND_SPHERE(sVanFlank[i].ped, sVanFlank[i].cover, sVanFlank[i].vDest, 97.5015, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
ELIF i = 1
sVanFlank[i].vDest = <<164.1503, -1207.8420, 28.7991>>
SET_PED_COVER_POINT_AND_SPHERE(sVanFlank[i].ped, sVanFlank[i].cover, sVanFlank[i].vDest, 86.1376, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120)
ELIF i = 2
sVanFlank[i].vDest = <<165.6146, -1198.6959, 28.3113>>
SET_PED_COVER_POINT_AND_SPHERE(sVanFlank[i].ped, sVanFlank[i].cover, sVanFlank[i].vDest, 83.9552, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
ELSE
sVanFlank[i].vDest = <<165.0666, -1212.6161, 28.2951>>
SET_PED_COVER_POINT_AND_SPHERE(sVanFlank[i].ped, sVanFlank[i].cover, sVanFlank[i].vDest, 72.3967, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
ENDIF
IF i % 2 = 0
SET_PED_COMBAT_PARAMS(sVanFlank[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
ELSE
SET_PED_COMBAT_PARAMS(sVanFlank[i].ped, 12, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
ENDIF
IF i = 3
SET_CURRENT_PED_WEAPON(sVanFlank[i].ped, WEAPONTYPE_PUMPSHOTGUN, TRUE)
ELSE
IF HAS_PED_GOT_WEAPON(sVanFlank[i].ped, WEAPONTYPE_CARBINERIFLE)
SET_CURRENT_PED_WEAPON(sVanFlank[i].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
ELIF HAS_PED_GOT_WEAPON(sVanFlank[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
SET_CURRENT_PED_WEAPON(sVanFlank[i].ped, WEAPONTYPE_ADVANCEDRIFLE, TRUE)
ENDIF
ENDIF
SET_PED_COMBAT_ATTRIBUTES(sVanFlank[i].ped, CA_USE_VEHICLE, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sVanFlank[i].ped, 150.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sVanFlank[i].ped, FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sVanFlank[i].ped, TRUE)
SET_COMBAT_FLOAT(sVanFlank[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
SET_COMBAT_FLOAT(sVanFlank[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_03")
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_03")
ENDIF
IF i = 0
PLAY_PED_AMBIENT_SPEECH(sVanFlank[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
ENDIF
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vehNooseWave1)
sVanFlank[i].iTimer = GET_GAME_TIMER()
sVanFlank[i].iEvent++
ENDIF
BREAK
CASE 1
IF GET_GAME_TIMER() - sVanFlank[i].iTimer > 15000
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sVanFlank[i].ped, FALSE)
ENDIF
IF VDIST2(GET_ENTITY_COORDS(sVanFlank[i].ped), vPlayerPos) < 100.0
OR GET_GAME_TIMER() - sVanFlank[i].iTimer > 18000
OR iNumAliveVanFlank <= 3
SET_PED_COMBAT_ATTRIBUTES(sVanFlank[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(sVanFlank[i].ped, CA_CAN_CHARGE, TRUE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sVanFlank[i].ped, FALSE)
sVanFlank[i].iEvent++
ENDIF
BREAK
ENDSWITCH
IF sVanFlank[i].iEvent > 0
//Handle the enemy behaviour when the main attack front changes: if the enemy isn't part of the main front then set them to defensive.
IF sVanFlank[i].iEvent <= 50
//General combat with charge on, once the front changes set them to defensive.
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_1
OR eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
SET_PED_COMBAT_MOVEMENT(sVanFlank[i].ped, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(sVanFlank[i].ped, sVanFlank[i].vDest, 2.0)
SET_PED_COMBAT_ATTRIBUTES(sVanFlank[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
//SET_PED_COMBAT_ATTRIBUTES(sVanFlank[i].ped, CA_CAN_CHARGE, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sVanFlank[i].ped, 150.0)
sVanFlank[i].iEvent = 100
ENDIF
ELIF sVanFlank[i].iEvent = 100
//General combat with charge off, once the front changes set them to charge.
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FLANK_1
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
SET_PED_COMBAT_MOVEMENT(sVanFlank[i].ped, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(sVanFlank[i].ped, sVanFlank[i].vDest, 2.0)
SET_PED_COMBAT_ATTRIBUTES(sVanFlank[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(sVanFlank[i].ped, CA_CAN_CHARGE, TRUE)
SET_COMBAT_FLOAT(sVanFlank[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
sVanFlank[i].iEvent = 50
ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
DRAW_INT_ABOVE_PED(sVanFlank[i].ped, sVanFlank[i].iEvent)
#ENDIF
ELSE
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_03")
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_03")
ENDIF
//If the enemy just died check if the player killed them, if so then update the timer tracking the last time a ped was killed by the player.
IF GET_PED_THAT_KILLED_PED(sVanFlank[i].ped) = PLAYER_PED_ID()
iTimeLastFlankingEnemyDamaged = GET_GAME_TIMER()
ENDIF
CLEAN_UP_ENEMY_PED(sVanFlank[i])
ENDIF
ELSE
iNumPedsCleanedUp++
ENDIF
ENDREPEAT
//Flag this group as cleaned up once each individual ped has been cleaned up (this saves execution time running exist checks every frame).
IF iNumPedsCleanedUp >= iNumPedsInGroup
sVanFlank[0].bHasCleanedUp = TRUE
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(vehNooseWave1)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehNooseWave1)
REMOVE_VEHICLE_RECORDING(CARREC_SHOOTOUT_GOONS_2A, strCarrec)
//DO_VEHICLE_DAMAGE_WHEN_SHOT(vehNooseWave1)
ENDIF
ENDIF
ENDIF
//These used to be rappelling peds, now they just spawn off-camera
IF NOT sNooseRope1[0].bIsCreated
IF sVanFlank[0].bIsCreated
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<162.177841,-1205.590576,30.600058>>,<<19.000000,22.250000,2.250000>>)
IF HAS_MODEL_LOADED(modelMerryweather)
IF NOT DOES_ENTITY_EXIST(sNooseRope1[0].ped)
sNooseRope1[0].ped = CREATE_ENEMY_PED(modelMerryweather, <<181.2369, -1208.8674, 28.2951>>, 88.381, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
ELIF NOT DOES_ENTITY_EXIST(sNooseRope1[1].ped)
sNooseRope1[1].ped = CREATE_ENEMY_PED(modelMerryweather, <<181.1033, -1199.6613, 28.2952>>, 92.5013, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
INITIALISE_ENEMY_GROUP(sNooseRope1, "Rope 1 ")
REPEAT COUNT_OF(sNooseRope1) i
GIVE_WEAPON_COMPONENT_TO_PED(sNooseRope1[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
sNooseRope1[i].iTimer = 0
sNooseRope1[i].iEvent = 0
ENDREPEAT
ENDIF
ENDIF
ENDIF
ELSE
IF NOT sNooseRope1[0].bHasCleanedUp
INT iNumPedsCleanedUp = 0
INT iNumPedsInGroup = COUNT_OF(sNooseRope1)
REPEAT iNumPedsInGroup i
IF DOES_ENTITY_EXIST(sNooseRope1[i].ped)
IF NOT IS_PED_INJURED(sNooseRope1[i].ped)
//If the enemy was just damaged by the player then update the timer tracking the last time the player damaged a ped.
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sNooseRope1[i].ped, PLAYER_PED_ID())
iTimeLastFlankingEnemyDamaged = GET_GAME_TIMER()
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sNooseRope1[i].ped)
ENDIF
SWITCH sNooseRope1[i].iEvent
CASE 0
IF sNooseRope1[i].iTimer = 0
sNooseRope1[i].iTimer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - sNooseRope1[i].iTimer > 3000
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<162.177841,-1205.590576,30.600058>>,<<19.000000,22.250000,2.250000>>)
IF i = 0
PLAY_PED_AMBIENT_SPEECH(sNooseRope1[i].ped, "SURROUNDED", SPEECH_PARAMS_FORCE_SHOUTED)
sNooseRope1[i].vDest = <<162.3094, -1205.9188, 28.2997>>
SET_PED_COVER_POINT_AND_SPHERE(sNooseRope1[i].ped, sNooseRope1[i].cover, sNooseRope1[i].vDest, 93.1005, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
//ADD_EXPLOSION(<<159.9, -1204.3, 28.4>>, EXP_TAG_SMOKE_GRENADE)
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<177.1, -1204.7302, 28.2952>>, PLAYER_PED_ID(), PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE, ENAV_NO_STOPPING)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 150.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sNooseRope1[i].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ELSE
sNooseRope1[i].vDest = <<163.7782, -1201.0775, 28.2951>>
SET_PED_COVER_POINT_AND_SPHERE(sNooseRope1[i].ped, sNooseRope1[i].cover, sNooseRope1[i].vDest, 91.1853, 2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0, TRUE)
OPEN_SEQUENCE_TASK(seq)
TASK_PAUSE(NULL, 500)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<177.1, -1204.7302, 28.2952>>, PLAYER_PED_ID(), PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE, ENAV_NO_STOPPING)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 150.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sNooseRope1[i].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
SET_PED_COMBAT_AI(sNooseRope1[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, CA_USE_COVER, sNooseRope1[i].vDest, 2.0)
SET_COMBAT_FLOAT(sNooseRope1[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
SET_COMBAT_FLOAT(sNooseRope1[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
sNooseRope1[i].iTimer = 0
sNooseRope1[i].iEvent++
ENDIF
BREAK
CASE 1
IF VDIST2(GET_ENTITY_COORDS(sNooseRope1[i].ped), vPlayerPos) < 100.0
OR GET_GAME_TIMER() - sNooseRope1[i].iTimer > 18000
OR iNumAliveNooseRope1 <= 2
SET_PED_COMBAT_ATTRIBUTES(sNooseRope1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(sNooseRope1[i].ped, CA_CAN_CHARGE, TRUE)
sNooseRope1[i].iEvent++
ENDIF
BREAK
ENDSWITCH
IF sNooseRope1[i].iEvent > 0
UPDATE_AI_PED_BLIP(sNooseRope1[i].ped, sNooseRope1[i].sBlipData)
//SET_PED_RESET_FLAG(sNooseRope1[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
//Handle the enemy behaviour when the main attack front changes: if the enemy isn't part of the main front then set them to defensive.
IF sNooseRope1[i].iEvent <= 50
//General combat with charge on, once the front changes set them to defensive.
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2 //Don't check Front 1 as this will override their current behaviour.
SET_PED_COMBAT_MOVEMENT(sNooseRope1[i].ped, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(sNooseRope1[i].ped, sNooseRope1[i].vDest, 2.0)
SET_PED_COMBAT_ATTRIBUTES(sNooseRope1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
//SET_PED_COMBAT_ATTRIBUTES(sNooseRope1[i].ped, CA_CAN_CHARGE, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sNooseRope1[i].ped, 150.0)
sNooseRope1[i].iEvent = 100
ENDIF
ELIF sNooseRope1[i].iEvent = 100
//General combat with charge off, once the front changes set them to charge.
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FLANK_1
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
SET_PED_COMBAT_MOVEMENT(sNooseRope1[i].ped, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(sNooseRope1[i].ped, sNooseRope1[i].vDest, 2.0)
SET_PED_COMBAT_ATTRIBUTES(sNooseRope1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(sNooseRope1[i].ped, CA_CAN_CHARGE, TRUE)
SET_COMBAT_FLOAT(sNooseRope1[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
sNooseRope1[i].iEvent = 50
ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
DRAW_INT_ABOVE_PED(sNooseRope1[i].ped, sNooseRope1[i].iEvent)
#ENDIF
ELSE
//If the enemy just died check if the player killed them, if so then update the timer tracking the last time a ped was killed by the player.
IF GET_PED_THAT_KILLED_PED(sNooseRope1[i].ped) = PLAYER_PED_ID()
iTimeLastFlankingEnemyDamaged = GET_GAME_TIMER()
ENDIF
CLEAN_UP_ENEMY_PED(sNooseRope1[i])
ENDIF
ELSE
iNumPedsCleanedUp++
ENDIF
ENDREPEAT
//Flag this group as cleaned up once each individual ped has been cleaned up (this saves execution time running exist checks every frame).
IF iNumPedsCleanedUp >= iNumPedsInGroup
sNooseRope1[0].bHasCleanedUp = TRUE
ENDIF
ENDIF
ENDIF
//Peds up above: appear once the player starts targetting van/rope peds
IF NOT sNooseAbove[0].bIsCreated
/*REQUEST_CLIP_SET("move_ped_strafing")
IF HAS_MODEL_LOADED(modelMerryweather)
AND HAS_CLIP_SET_LOADED("move_ped_strafing")
AND iNumAliveNooseRope1 < 2
sNooseAbove[0].ped = CREATE_ENEMY_PED(modelMerryweather, <<161.8438, -1205.5321, 36.7988>>, 90.7871, relGroupCops, 150, 0, WEAPONTYPE_CARBINERIFLE)
sNooseAbove[1].ped = CREATE_ENEMY_PED(modelMerryweather, <<160.2572, -1203.2941, 36.7949>>, 95.0947, relGroupCops, 150, 0, WEAPONTYPE_CARBINERIFLE)
INITIALISE_ENEMY_GROUP(sNooseAbove, "Above ")
iTrainTimer = 0
REPEAT COUNT_OF(sNooseRope1) i
SET_CURRENT_PED_WEAPON(sNooseAbove[i].ped, WEAPONTYPE_CARBINERIFLE, TRUE) //Fix suggested by code for 445077.
SET_PED_SUFFERS_CRITICAL_HITS(sNooseAbove[i].ped, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sNooseAbove[i].ped, TRUE)
SET_PED_STRAFE_CLIPSET(sNooseAbove[i].ped, "move_ped_strafing")
//GIVE_WEAPON_COMPONENT_TO_PED(sNooseAbove[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSHLASR)
//sNooseAbove[i].blip = CREATE_BLIP_FOR_PED(sNooseAbove[i].ped, TRUE)
ENDREPEAT
ENDIF*/
ELSE
REPEAT COUNT_OF(sNooseAbove) i
IF DOES_ENTITY_EXIST(sNooseAbove[i].ped)
IF NOT IS_PED_INJURED(sNooseAbove[i].ped)
UPDATE_AI_PED_BLIP(sNooseAbove[i].ped, sNooseAbove[i].sBlipData)
//SET_PED_RESET_FLAG(sNooseAbove[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
IF i = 0
sNooseAbove[i].vDest = <<150.4053, -1206.1014, 36.9088>>
ELIF i = 1
sNooseAbove[i].vDest = <<150.2348, -1203.9055, 36.9092>>
ENDIF
SWITCH sNooseAbove[i].iEvent
CASE 0
IF i = 0
OR (i = 1 AND (IS_SPHERE_VISIBLE(<<149.4, -1204.1, 39.7>>, 1.0) OR IS_PED_INJURED(sNooseAbove[0].ped) OR iNumAliveVanFlank < 3))
SET_PED_COMBAT_PARAMS(sNooseAbove[i].ped, 20, CM_STATIONARY, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_PED_SPHERE_DEFENSIVE_AREA(sNooseAbove[i].ped, sNooseAbove[i].vDest, 1.0, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(sNooseAbove[i].ped, sNooseAbove[i].vDest, PLAYER_PED_ID(), PEDMOVE_RUN, FALSE, 0.25, 1.0, FALSE, ENAV_STOP_EXACTLY)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sNooseAbove[i].ped, TRUE)
IF i = 0
PLAY_PED_AMBIENT_SPEECH(sNooseRope1[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
ENDIF
sNooseAbove[i].iTimer = 0
sNooseAbove[i].iEvent++
ENDIF
BREAK
CASE 1
IF GET_SCRIPT_TASK_STATUS(sNooseAbove[i].ped, SCRIPT_TASK_GO_STRAIGHT_TO_COORD) != PERFORMING_TASK
IF VDIST2(GET_ENTITY_COORDS(sNooseAbove[i].ped), sNooseAbove[i].vDest) < 2.0
IF GET_SCRIPT_TASK_STATUS(sNooseAbove[i].ped, SCRIPT_TASK_SHOOT_AT_ENTITY) != PERFORMING_TASK
TASK_SHOOT_AT_ENTITY(sNooseAbove[i].ped, PLAYER_PED_ID(), -1, FIRING_TYPE_RANDOM_BURSTS)
ENDIF
ELSE
sNooseAbove[i].iEvent = 0
ENDIF
ENDIF
//Make one of them fall off the top if they're shot.
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sNooseAbove[i].ped, GET_PED_INDEX(CHAR_MICHAEL))
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sNooseAbove[i].ped, GET_PED_INDEX(CHAR_TREVOR))
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sNooseAbove[i].ped, GET_PED_INDEX(CHAR_FRANKLIN))
IF i = 0
SET_ENTITY_INVINCIBLE(sNooseAbove[i].ped, TRUE)
SET_PED_TO_RAGDOLL_WITH_FALL(sNooseAbove[i].ped, 2000, 10000, TYPE_FROM_HIGH, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<0.0, 0.0, 90.0>>),
29.0, <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
APPLY_FORCE_TO_ENTITY(sNooseAbove[i].ped, APPLY_TYPE_IMPULSE, <<-2.0, 0.0, 0.1>>, <<0.0, 0.0, 0.5>>,
GET_PED_RAGDOLL_BONE_INDEX(sNooseAbove[i].ped, RAGDOLL_PELVIS), FALSE, TRUE, TRUE)
sNooseAbove[i].iEvent = 2
sNooseAbove[i].iTimer = GET_GAME_TIMER()
ELSE
APPLY_DAMAGE_TO_PED(sNooseAbove[i].ped, 200, TRUE)
ENDIF
ENDIF
BREAK
CASE 2
IF i = 0
IF GET_GAME_TIMER() - sNooseAbove[i].iTimer > 2000
SET_ENTITY_INVINCIBLE(sNooseAbove[i].ped, FALSE)
APPLY_DAMAGE_TO_PED(sNooseAbove[i].ped, 200, TRUE)
ENDIF
ENDIF
BREAK
ENDSWITCH
IF bBuddiesPushedToFlank
IF sNooseAbove[i].iTimer = 0
sNooseAbove[i].iTimer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - sNooseAbove[i].iTimer > 1000
SET_ENTITY_INVINCIBLE(sNooseAbove[i].ped, FALSE)
APPLY_DAMAGE_TO_PED(sNooseAbove[i].ped, 200, TRUE)
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
DRAW_INT_ABOVE_PED(sNooseAbove[i].ped, sNooseAbove[i].iEvent)
#ENDIF
ELSE
CLEAN_UP_ENEMY_PED(sNooseAbove[i])
IF i = 1
AND IS_PED_INJURED(sNooseAbove[0].ped)
REMOVE_CLIP_SET("move_ped_strafing")
ENDIF
ENDIF
ENDIF
ENDREPEAT
//Set up a train to go past when the player looks up at the enemies for the first time.
IF iTrainTimer = 0
REQUEST_MODEL(modelTrain)
IF HAS_MODEL_LOADED(modelTrain)
IF NOT IS_PED_INJURED(sNooseAbove[0].ped) OR NOT IS_PED_INJURED(sNooseAbove[1].ped)
IF IS_SPHERE_VISIBLE(<<149.4, -1204.1, 37.7>>, 1.0)
IF (NOT IS_PED_INJURED(sNooseAbove[0].ped) AND IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sNooseAbove[0].ped))
OR (NOT IS_PED_INJURED(sNooseAbove[1].ped) AND IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sNooseAbove[1].ped))
vehTrain = CREATE_MISSION_TRAIN(24, <<181.100, -1198.800, 37.600>>, TRUE)
iTrainTimer = GET_GAME_TIMER()
SET_MODEL_AS_NO_LONGER_NEEDED(modelTrain)
ENDIF
ENDIF
ELSE
//Train didn't load in time.
iTrainTimer = GET_GAME_TIMER()
SET_MODEL_AS_NO_LONGER_NEEDED(modelTrain)
ENDIF
ENDIF
ELIF GET_GAME_TIMER() - iTrainTimer > 10000
IF NOT IS_ENTITY_DEAD(vehTrain)
DELETE_MISSION_TRAIN(vehTrain)
ENDIF
ENDIF
ENDIF
//Final car: shows up once a few of the flank enemies have been killed.
IF NOT sGoonsWave3b[0].bIsCreated
REQUEST_VEHICLE_RECORDING(CARREC_SHOOTOUT_GOONS_3B, strCarrec)
//Create each entity one at a time to avoid execution time spikes.
IF HAS_MODEL_LOADED(modelMerryweather)
AND HAS_MODEL_LOADED(modelMerryCar)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_SHOOTOUT_GOONS_3B, strCarrec)
IF NOT DOES_ENTITY_EXIST(vehGoons3b)
//IF iNumAliveNooseRope1 + iNumAliveVanFlank + iNumAliveNooseAbove < 5
IF iNumAliveNooseRope1 + iNumAliveVanFlank < 4
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<162.704208,-1207.238647,30.547756>>,<<4.000000,43.750000,2.500000>>)
vehGoons3b = CREATE_VEHICLE(modelMerryCar, <<184.3946, -1267.1230, 28.7186>>)
SET_ENTITY_QUATERNION(vehGoons3b, 0.0000, 0.0003, -0.1558, 0.9878)
SET_VEHICLE_ENGINE_ON(vehGoons3b, TRUE, TRUE)
SET_VEHICLE_LIGHTS(vehGoons3b, FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_FULLBEAM(vehGoons3b, TRUE)
START_PLAYBACK_RECORDED_VEHICLE(vehGoons3b, CARREC_SHOOTOUT_GOONS_3B, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehGoons3b, 0.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehGoons3b)
SET_PLAYBACK_SPEED(vehGoons3b, 1.0)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehGoons3b, FALSE)
SET_VEHICLE_COLOURS(vehGoons3b, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
SET_VEHICLE_EXTRA_COLOURS(vehGoons3b, MERRY_CAR_COLOUR, 0)
SET_VEHICLE_EXTRA(vehGoons3b, 1, TRUE)
ENDIF
ELIF NOT DOES_ENTITY_EXIST(sGoonsWave3b[0].ped)
sGoonsWave3b[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehGoons3b, VS_DRIVER, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
ELIF NOT DOES_ENTITY_EXIST(sGoonsWave3b[1].ped)
sGoonsWave3b[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehGoons3b, VS_FRONT_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_ADVANCEDRIFLE)
ELIF NOT DOES_ENTITY_EXIST(sGoonsWave3b[2].ped)
sGoonsWave3b[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehGoons3b, VS_BACK_LEFT, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
ELIF NOT DOES_ENTITY_EXIST(sGoonsWave3b[3].ped)
sGoonsWave3b[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehGoons3b, VS_BACK_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_ADVANCEDRIFLE)
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_04")
START_AUDIO_SCENE("BS_2A_CAR_ARRIVE_04")
ENDIF
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vehGoons3b, "BS_2A_MERRYWEATHER_CARS")
REPEAT COUNT_OF(sGoonsWave3b) i
INITIALISE_ENEMY_PED(sGoonsWave3b[i], "3b", i)
IF NOT IS_PED_INJURED(sGoonsWave3b[i].ped)
IF HAS_PED_GOT_WEAPON(sGoonsWave3b[i].ped, WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_COMPONENT_TO_PED(sGoonsWave3b[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
ELIF HAS_PED_GOT_WEAPON(sGoonsWave3b[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
GIVE_WEAPON_COMPONENT_TO_PED(sGoonsWave3b[i].ped, WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDIF
ELSE
IF NOT sGoonsWave3b[0].bHasCleanedUp
INT iNumPedsCleanedUp = 0
INT iNumPedsInGroup = COUNT_OF(sGoonsWave3b)
BOOL bTimeToGetOut = FALSE
BOOL bCheckedGetOutTrigger = FALSE
REPEAT iNumPedsInGroup i
IF DOES_ENTITY_EXIST(sGoonsWave3b[i].ped)
IF NOT IS_PED_INJURED(sGoonsWave3b[i].ped)
UPDATE_AI_PED_BLIP(sGoonsWave3b[i].ped, sGoonsWave3b[i].sBlipData)
//SET_PED_RESET_FLAG(sGoonsWave3b[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
//If the enemy was just damaged by the player then update the timer tracking the last time the player damaged a ped.
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sGoonsWave3b[i].ped, PLAYER_PED_ID())
iTimeLastFlankingEnemyDamaged = GET_GAME_TIMER()
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sGoonsWave3b[i].ped)
ENDIF
SWITCH sGoonsWave3b[i].iEvent
CASE 0
IF NOT bCheckedGetOutTrigger
IF NOT IS_ENTITY_DEAD(vehGoons3b)
IF ABSF(GET_ENTITY_SPEED(vehGoons3b)) < 1.0
IF (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehGoons3b) AND GET_TIME_POSITION_IN_RECORDING(vehGoons3b) > 1000.0)
OR NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehGoons3b)
bTimeToGetOut = TRUE
ENDIF
ENDIF
ELSE
bTimeToGetOut = TRUE
ENDIF
bCheckedGetOutTrigger = TRUE
ENDIF
IF bTimeToGetOut
IF i = 0
sGoonsWave3b[i].vDest = <<180.9489, -1208.6591, 28.2951>>
SET_PED_COVER_POINT_AND_SPHERE(sGoonsWave3b[i].ped, sGoonsWave3b[i].cover, sGoonsWave3b[i].vDest, 75.4236, 3.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120)
ELIF i = 1
sGoonsWave3b[i].vDest = <<175.4908, -1197.6615, 28.3430>>
SET_PED_COVER_POINT_AND_SPHERE(sGoonsWave3b[i].ped, sGoonsWave3b[i].cover, sGoonsWave3b[i].vDest, 91.26514, 3.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
ELIF i = 2
sGoonsWave3b[i].vDest = <<167.7789, -1214.0789, 28.2951>>
SET_PED_COVER_POINT_AND_SPHERE(sGoonsWave3b[i].ped, sGoonsWave3b[i].cover, sGoonsWave3b[i].vDest, 91.3935, 3.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
ELIF i = 3
sGoonsWave3b[i].vDest = <<180.6675, -1199.8951, 28.2951>>
SET_PED_COVER_POINT_AND_SPHERE(sGoonsWave3b[i].ped, sGoonsWave3b[i].cover, sGoonsWave3b[i].vDest, 96.3577, 3.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120)
ENDIF
IF i % 2 = 0
SET_PED_COMBAT_PARAMS(sGoonsWave3b[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
ELSE
SET_PED_COMBAT_PARAMS(sGoonsWave3b[i].ped, 12, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
ENDIF
IF HAS_PED_GOT_WEAPON(sGoonsWave3b[i].ped, WEAPONTYPE_CARBINERIFLE)
SET_CURRENT_PED_WEAPON(sGoonsWave3b[i].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
ELIF HAS_PED_GOT_WEAPON(sGoonsWave3b[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
SET_CURRENT_PED_WEAPON(sGoonsWave3b[i].ped, WEAPONTYPE_ADVANCEDRIFLE, TRUE)
ENDIF
SET_PED_COMBAT_ATTRIBUTES(sGoonsWave3b[i].ped, CA_USE_VEHICLE, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoonsWave3b[i].ped, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sGoonsWave3b[i].ped, 200.0)
SET_COMBAT_FLOAT(sGoonsWave3b[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sGoonsWave3b[i].ped, TRUE)
SET_COMBAT_FLOAT(sGoonsWave3b[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_04")
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_04")
ENDIF
IF i = 0
PLAY_PED_AMBIENT_SPEECH(sGoonsWave3b[i].ped, "SURROUNDED", SPEECH_PARAMS_FORCE_SHOUTED)
ENDIF
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vehGoons3b)
sGoonsWave3b[i].iTimer = GET_GAME_TIMER()
sGoonsWave3b[i].iEvent++
ENDIF
BREAK
CASE 1
IF GET_GAME_TIMER() - sGoonsWave3b[i].iTimer > 10000
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sGoonsWave3b[i].ped, FALSE)
ENDIF
IF VDIST2(GET_ENTITY_COORDS(sGoonsWave3b[i].ped), vPlayerPos) < 100.0
OR GET_GAME_TIMER() - sGoonsWave3b[i].iTimer > 18000
OR iNumAliveGoonsWave3b <= 3
SET_PED_COMBAT_ATTRIBUTES(sGoonsWave3b[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(sGoonsWave3b[i].ped, CA_CAN_CHARGE, TRUE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sGoonsWave3b[i].ped, FALSE)
ENDIF
BREAK
ENDSWITCH
IF sGoonsWave3b[i].iEvent > 0
//Handle the enemy behaviour when the main attack front changes: if the enemy isn't part of the main front then set them to defensive.
IF sGoonsWave3b[i].iEvent <= 50
//General combat with charge on, once the front changes set them to defensive.
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_1
OR eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
SET_PED_COMBAT_MOVEMENT(sGoonsWave3b[i].ped, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(sGoonsWave3b[i].ped, sGoonsWave3b[i].vDest, 2.0)
SET_PED_COMBAT_ATTRIBUTES(sGoonsWave3b[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
//SET_PED_COMBAT_ATTRIBUTES(sGoonsWave3b[i].ped, CA_CAN_CHARGE, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sGoonsWave3b[i].ped, 150.0)
sGoonsWave3b[i].iEvent = 100
ENDIF
ELIF sGoonsWave3b[i].iEvent = 100
//General combat with charge off, once the front changes set them to charge.
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FLANK_1
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
SET_PED_COMBAT_MOVEMENT(sGoonsWave3b[i].ped, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(sGoonsWave3b[i].ped, sGoonsWave3b[i].vDest, 2.0)
SET_PED_COMBAT_ATTRIBUTES(sGoonsWave3b[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(sGoonsWave3b[i].ped, CA_CAN_CHARGE, TRUE)
SET_COMBAT_FLOAT(sGoonsWave3b[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
sGoonsWave3b[i].iEvent = 50
ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
DRAW_INT_ABOVE_PED(sGoonsWave3b[i].ped, sGoonsWave3b[i].iEvent)
#ENDIF
ELSE
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_04")
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_04")
ENDIF
//If the enemy just died check if the player killed them, if so then update the timer tracking the last time a ped was killed by the player.
IF GET_PED_THAT_KILLED_PED(sGoonsWave3b[i].ped) = PLAYER_PED_ID()
iTimeLastFlankingEnemyDamaged = GET_GAME_TIMER()
ENDIF
CLEAN_UP_ENEMY_PED(sGoonsWave3b[i])
ENDIF
ELSE
iNumPedsCleanedUp++
ENDIF
ENDREPEAT
//Flag this group as cleaned up once each individual ped has been cleaned up (this saves execution time running exist checks every frame).
IF iNumPedsCleanedUp >= iNumPedsInGroup
sGoonsWave3b[0].bHasCleanedUp = TRUE
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(vehGoons3b) AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehGoons3b)
REMOVE_VEHICLE_RECORDING(CARREC_SHOOTOUT_GOONS_3B, strCarrec)
//DO_VEHICLE_DAMAGE_WHEN_SHOT(vehGoons3b)
ENDIF
ENDIF
//Snipers: turn up on the overpass (only in the new shootout version).
IF bDoNewVersionOfShootout
IF NOT sGoonsSnipe[0].bIsCreated
IF sVanCrash[0].bIsCreated
IF HAS_MODEL_LOADED(modelMerryweather)
//Create them in a more convenient position if it's off-screen
IF NOT DOES_ENTITY_EXIST(sGoonsSnipe[0].ped)
sGoonsSnipe[0].ped = CREATE_ENEMY_PED(modelMerryweather, <<122.3364, -1260.8892, 32.6925>>, 350.0277, relGroupCops, 150, 0, WEAPONTYPE_SNIPERRIFLE)
ELIF NOT DOES_ENTITY_EXIST(sGoonsSnipe[1].ped)
sGoonsSnipe[1].ped = CREATE_ENEMY_PED(modelMerryweather, <<128.1841, -1258.7861, 33.4637>>, 20.6211, relGroupCops, 150, 0, WEAPONTYPE_SNIPERRIFLE)
INITIALISE_ENEMY_GROUP(sGoonsSnipe, "Snipe ")
REPEAT COUNT_OF(sGoonsSnipe) i
sGoonsSnipe[i].iTimer = 0
sGoonsSnipe[i].iEvent = 0
ENDREPEAT
iTimeSnipersKilledByPlayer = 0
ENDIF
ENDIF
ENDIF
ELSE
IF NOT sGoonsSnipe[0].bHasCleanedUp
INT iNumPedsCleanedUp = 0
INT iNumPedsInGroup = COUNT_OF(sGoonsSnipe)
REPEAT iNumPedsInGroup i
IF DOES_ENTITY_EXIST(sGoonsSnipe[i].ped)
IF NOT IS_PED_INJURED(sGoonsSnipe[i].ped)
//If the enemy was just damaged by the player then update the timer tracking the last time the player damaged a ped.
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sGoonsSnipe[i].ped, PLAYER_PED_ID())
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sGoonsSnipe[i].ped)
ENDIF
SWITCH sGoonsSnipe[i].iEvent
CASE 0
IF sGoonsSnipe[i].iTimer = 0
IF sVanCrash[0].iEvent > 0
OR IS_PED_INJURED(sVanCrash[0].ped)
sGoonsSnipe[i].iTimer = GET_GAME_TIMER()
ENDIF
ELIF GET_GAME_TIMER() - sGoonsSnipe[i].iTimer > 3000
IF i = 0
sGoonsSnipe[i].vDest = <<125.2335, -1252.3010, 33.3162>>
SET_PED_COVER_POINT_AND_SPHERE(sGoonsSnipe[i].ped, sGoonsSnipe[i].cover, sGoonsSnipe[i].vDest, 2.9585, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
ELSE
sGoonsSnipe[i].vDest = <<123.6991, -1253.2300, 33.1086>>
SET_PED_COVER_POINT_AND_SPHERE(sGoonsSnipe[i].ped, sGoonsSnipe[i].cover, sGoonsSnipe[i].vDest, 358.9323, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
ENDIF
SET_PED_COMBAT_PARAMS(sGoonsSnipe[i].ped, 20, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sGoonsSnipe[i].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoonsSnipe[i].ped, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sGoonsSnipe[i].ped, CA_USE_COVER, FALSE)
sGoonsSnipe[i].iTimer = 0
sGoonsSnipe[i].iEvent++
ENDIF
BREAK
CASE 1
UPDATE_AI_PED_BLIP(sGoonsSnipe[i].ped, sGoonsSnipe[i].sBlipData)
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
DRAW_INT_ABOVE_PED(sGoonsSnipe[i].ped, sGoonsSnipe[i].iEvent)
#ENDIF
ELSE
//If the enemy just died check if the player killed them, if so then update the timer tracking the last time a ped was killed by the player.
IF GET_PED_THAT_KILLED_PED(sGoonsSnipe[i].ped) = PLAYER_PED_ID()
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
iTimeSnipersKilledByPlayer = GET_GAME_TIMER()
ENDIF
CLEAN_UP_ENEMY_PED(sGoonsSnipe[i])
ENDIF
ELSE
iNumPedsCleanedUp++
ENDIF
ENDREPEAT
//Flag this group as cleaned up once each individual ped has been cleaned up (this saves execution time running exist checks every frame).
IF iNumPedsCleanedUp >= iNumPedsInGroup
sGoonsSnipe[0].bHasCleanedUp = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
//Updates behaviour of infinite Merryweather enemies at the front of the shootout.
PROC UPDATE_INFINITE_ENEMIES_FRONT(VECTOR vPlayerPos, BOOL bKeepSpawningAferDeath = TRUE)
INT i = 0
REQUEST_MODEL(modelMerryweather)
REQUEST_WEAPON_ASSET(WEAPONTYPE_CARBINERIFLE)
BOOL bPedCreatedThisFrame = FALSE
//Stop creating infinite enemies if the player stays at the front. Once they move to the correct side then begin creating enemies again.
IF iNumFrontInfiniteEnemiesSpawned > 6
IF GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged < 1000
iNumFrontInfiniteEnemiesSpawned = 4
REPEAT COUNT_OF(sInfiniteEnemiesFront) i
IF NOT DOES_ENTITY_EXIST(sInfiniteEnemiesFront[i].ped)
sInfiniteEnemiesFront[i].bIsCreated = FALSE
ENDIF
ENDREPEAT
ELSE
bKeepSpawningAferDeath = FALSE
ENDIF
ENDIF
REPEAT COUNT_OF(sInfiniteEnemiesFront) i
IF NOT sInfiniteEnemiesFront[i].bIsCreated
IF HAS_MODEL_LOADED(modelMerryweather)
AND NOT bPedCreatedThisFrame
IF i = 0
sInfiniteEnemiesFront[i].ped = CREATE_ENEMY_PED(modelMerryweather, <<114.8663, -1274.0483, 28.1787>>, 288.0569, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
sInfiniteEnemiesFront[i].vDest = <<137.2739, -1237.1921, 28.3756>>
ELIF i = 1
sInfiniteEnemiesFront[i].ped = CREATE_ENEMY_PED(modelMerryweather, <<109.0800, -1275.3662, 28.1587>>, 288.0605, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
sInfiniteEnemiesFront[i].vDest = <<138.9004, -1230.4973, 28.4172>>
ENDIF
INITIALISE_ENEMY_PED(sInfiniteEnemiesFront[i], "Infinite ", i)
GIVE_WEAPON_COMPONENT_TO_PED(sInfiniteEnemiesFront[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
IF i % 2 = 0
SET_PED_COMBAT_PARAMS(sInfiniteEnemiesFront[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
ELSE
SET_PED_COMBAT_PARAMS(sInfiniteEnemiesFront[i].ped, 12, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
ENDIF
SET_PED_SPHERE_DEFENSIVE_AREA(sInfiniteEnemiesFront[i].ped, sInfiniteEnemiesFront[i].vDest, 4.0, FALSE)
SET_CURRENT_PED_WEAPON(sInfiniteEnemiesFront[i].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFront[i].ped, CA_USE_VEHICLE, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sInfiniteEnemiesFront[i].ped, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sInfiniteEnemiesFront[i].ped, 200.0)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sInfiniteEnemiesFront[i].ped, FALSE)
sInfiniteEnemiesFront[i].iEvent = 100 //Peds are already set up to stay in their defensive areas, so go straight to waiting for the right time to charge.
sInfiniteEnemiesFront[i].iTimer = 0
iNumFrontInfiniteEnemiesSpawned++
bPedCreatedThisFrame = TRUE
ENDIF
ELSE
IF DOES_ENTITY_EXIST(sInfiniteEnemiesFront[i].ped)
IF NOT IS_PED_INJURED(sInfiniteEnemiesFront[i].ped)
//If the enemy was just damaged by the player then update the timer tracking the last time the player damaged a ped.
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sInfiniteEnemiesFront[i].ped, PLAYER_PED_ID())
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sInfiniteEnemiesFront[i].ped)
ENDIF
//Handle the enemy behaviour when the main attack front changes: if the enemy isn't part of the main front then set them to defensive.
IF sInfiniteEnemiesFront[i].iEvent <= 50
//General combat with charge on, once the front changes set them to defensive.
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FLANK_1
SET_PED_COMBAT_MOVEMENT(sInfiniteEnemiesFront[i].ped, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(sInfiniteEnemiesFront[i].ped, sInfiniteEnemiesFront[i].vDest, 4.0)
SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFront[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
//SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFront[i].ped, CA_CAN_CHARGE, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sInfiniteEnemiesFront[i].ped, 150.0)
sInfiniteEnemiesFront[i].iEvent = 100
ENDIF
//Do a forced charge when there are only a few enemies left.
IF NOT sInfiniteEnemiesFront[i].bSetToCharge
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
IF iNumAliveFrontEnemies < 4
SET_PED_CONFIG_FLAG(sInfiniteEnemiesFront[i].ped, PCF_ShouldChargeNow, TRUE)
sInfiniteEnemiesFront[i].bSetToCharge = TRUE
ENDIF
ENDIF
ENDIF
ELIF sInfiniteEnemiesFront[i].iEvent = 100
//General combat with charge off, once the front changes set them to charge.
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_1
OR eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
SET_PED_COMBAT_MOVEMENT(sInfiniteEnemiesFront[i].ped, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(sInfiniteEnemiesFront[i].ped, sInfiniteEnemiesFront[i].vDest, 4.0)
SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFront[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFront[i].ped, CA_CAN_CHARGE, TRUE)
SET_COMBAT_FLOAT(sInfiniteEnemiesFront[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
sInfiniteEnemiesFront[i].iEvent = 50
ENDIF
ENDIF
UPDATE_AI_PED_BLIP(sInfiniteEnemiesFront[i].ped, sInfiniteEnemiesFront[i].sBlipData)
//SET_PED_RESET_FLAG(sInfiniteEnemiesFront[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
#IF IS_DEBUG_BUILD
DRAW_INT_ABOVE_PED(sInfiniteEnemiesFront[i].ped, sInfiniteEnemiesFront[i].iEvent)
#ENDIF
ELSE
IF iNumAliveInfiniteEnemiesFront < 3
//If the enemy just died check if the player killed them, if so then update the timer tracking the last time a ped was killed by the player.
IF GET_PED_THAT_KILLED_PED(sInfiniteEnemiesFront[i].ped) = PLAYER_PED_ID()
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
ENDIF
CLEAN_UP_ENEMY_PED(sInfiniteEnemiesFront[i], bKeepSpawningAferDeath)
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF vPlayerPos.z > 0.0
ENDIF
ENDPROC
//Updates behaviour of infinite Merryweather enemies from the side of the shootout area.
PROC UPDATE_INFINITE_ENEMIES_FLANK(VECTOR vPlayerPos, BOOL bKeepSpawningAferDeath = TRUE)
INT i = 0
REQUEST_MODEL(modelMerryweather)
REQUEST_WEAPON_ASSET(WEAPONTYPE_CARBINERIFLE)
BOOL bPedCreatedThisFrame = FALSE
//Stop creating infinite enemies if the player stays at the front. Once they move to the correct side then begin creating enemies again.
IF iNumFlankInfiniteEnemiesSpawned > 6
IF GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged < 1000
iNumFlankInfiniteEnemiesSpawned = 4
REPEAT COUNT_OF(sInfiniteEnemiesFlank) i
IF NOT DOES_ENTITY_EXIST(sInfiniteEnemiesFlank[i].ped)
sInfiniteEnemiesFlank[i].bIsCreated = FALSE
ENDIF
ENDREPEAT
ELSE
bKeepSpawningAferDeath = FALSE
ENDIF
ENDIF
REPEAT COUNT_OF(sInfiniteEnemiesFlank) i
IF NOT sInfiniteEnemiesFlank[i].bIsCreated
IF HAS_MODEL_LOADED(modelMerryweather)
AND NOT bPedCreatedThisFrame
AND GET_GAME_TIMER() - iFlankEnemiesSpawnTimer > 0
IF i = 0
IF bInSafeAreaForInfiniteFlankSpawn
sInfiniteEnemiesFlank[i].ped = CREATE_ENEMY_PED(modelMerryweather, <<185.0784, -1253.7997, 28.1985>>, 351.6618, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
ELSE
sInfiniteEnemiesFlank[i].ped = CREATE_ENEMY_PED(modelMerryweather, <<203.8568, -1253.8951, 28.3246>>, 152.6642, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
ENDIF
sInfiniteEnemiesFlank[i].vDest = <<180.5752, -1199.7738, 28.2951>>
ELIF i = 1
IF bInSafeAreaForInfiniteFlankSpawn
sInfiniteEnemiesFlank[i].ped = CREATE_ENEMY_PED(modelMerryweather, <<184.7398, -1255.9893, 28.1985>>, 351.6668, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
ELSE
sInfiniteEnemiesFlank[i].ped = CREATE_ENEMY_PED(modelMerryweather, <<204.3409, -1249.8408, 28.3146>>, 168.3013, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
ENDIF
sInfiniteEnemiesFlank[i].vDest = <<180.8943, -1208.6416, 28.2951>>
ENDIF
INITIALISE_ENEMY_PED(sInfiniteEnemiesFlank[i], "InfiniteB ", i)
GIVE_WEAPON_COMPONENT_TO_PED(sInfiniteEnemiesFlank[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
IF i % 2 = 0
SET_PED_COMBAT_PARAMS(sInfiniteEnemiesFlank[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
ELSE
SET_PED_COMBAT_PARAMS(sInfiniteEnemiesFlank[i].ped, 12, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
ENDIF
SET_PED_SPHERE_DEFENSIVE_AREA(sInfiniteEnemiesFlank[i].ped, sInfiniteEnemiesFlank[i].vDest, 4.0, FALSE)
SET_CURRENT_PED_WEAPON(sInfiniteEnemiesFlank[i].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFlank[i].ped, CA_USE_VEHICLE, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sInfiniteEnemiesFlank[i].ped, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sInfiniteEnemiesFlank[i].ped, 200.0)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sInfiniteEnemiesFlank[i].ped, FALSE)
bPedCreatedThisFrame = TRUE
iFlankEnemiesSpawnTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(700, 1300)
sInfiniteEnemiesFlank[i].iEvent++
sInfiniteEnemiesFlank[i].iTimer = 100 //Already set up as defensive, so go straight to waiting for the front to change.
ENDIF
ELSE
IF DOES_ENTITY_EXIST(sInfiniteEnemiesFlank[i].ped)
IF NOT IS_PED_INJURED(sInfiniteEnemiesFlank[i].ped)
UPDATE_AI_PED_BLIP(sInfiniteEnemiesFlank[i].ped, sInfiniteEnemiesFlank[i].sBlipData)
//SET_PED_RESET_FLAG(sInfiniteEnemiesFlank[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
//If the enemy was just damaged by the player then update the timer tracking the last time the player damaged a ped.
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sInfiniteEnemiesFlank[i].ped, PLAYER_PED_ID())
iTimeLastFlankingEnemyDamaged = GET_GAME_TIMER()
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sInfiniteEnemiesFlank[i].ped)
ENDIF
//Handle the enemy behaviour when the main attack front changes: if the enemy isn't part of the main front then set them to defensive.
IF sInfiniteEnemiesFlank[i].iEvent <= 50
//General combat with charge on, once the front changes set them to defensive.
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_1
OR eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
SET_PED_COMBAT_MOVEMENT(sInfiniteEnemiesFlank[i].ped, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(sInfiniteEnemiesFlank[i].ped, sInfiniteEnemiesFlank[i].vDest, 4.0)
SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFlank[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
//SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFlank[i].ped, CA_CAN_CHARGE, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sInfiniteEnemiesFlank[i].ped, 150.0)
sInfiniteEnemiesFlank[i].iTimer = 0
sInfiniteEnemiesFlank[i].iEvent = 100
ENDIF
ELIF sInfiniteEnemiesFlank[i].iEvent = 100
//General combat with charge off, once the front changes set them to charge.
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FLANK_1
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
IF sInfiniteEnemiesFlank[i].iTimer = 0
sInfiniteEnemiesFlank[i].iTimer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - sInfiniteEnemiesFlank[i].iTimer > 20000
OR VDIST2(GET_ENTITY_COORDS(sInfiniteEnemiesFlank[i].ped), vPlayerPos) < 100.0
OR (iNumAliveGoonsWave3b + iNumAliveInfiniteEnemiesFlank + iNumAliveVanFlank + iNumAliveNooseRope1) <= 3
SET_PED_COMBAT_MOVEMENT(sInfiniteEnemiesFlank[i].ped, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(sInfiniteEnemiesFlank[i].ped, sInfiniteEnemiesFlank[i].vDest, 4.0)
SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFlank[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFlank[i].ped, CA_CAN_CHARGE, TRUE)
SET_COMBAT_FLOAT(sInfiniteEnemiesFlank[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
sInfiniteEnemiesFlank[i].iTimer = 0
sInfiniteEnemiesFlank[i].iEvent = 50
ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
DRAW_INT_ABOVE_PED(sInfiniteEnemiesFlank[i].ped, sInfiniteEnemiesFlank[i].iEvent)
#ENDIF
ELSE
IF iNumAliveInfiniteEnemiesFlank < 3
//If the enemy just died check if the player killed them, if so then update the timer tracking the last time a ped was killed by the player.
IF GET_PED_THAT_KILLED_PED(sInfiniteEnemiesFlank[i].ped) = PLAYER_PED_ID()
iTimeLastFlankingEnemyDamaged = GET_GAME_TIMER()
ENDIF
iFlankEnemiesSpawnTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
CLEAN_UP_ENEMY_PED(sInfiniteEnemiesFlank[i], bKeepSpawningAferDeath)
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF vPlayerPos.z > 0.0
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if a given ped is currently hanging around where another given ped is trying to task to.
/// PARAMS:
/// pedToCheckForSteal - The ped that we want to check is stealing cover from our AI ped.
/// pedToMove - The AI ped that we want to move to the given destination.
/// vDestination - The destination
/// fMaxDistBeforeCheck - The moving ped must be within this distance of the destination before we start checking what the other ped is doing.
/// fMaxDistConsideredAsStealing - pedToCheckForSteal must be within this distance of the destination to be considered stealing it.
/// bPlayerMustBeInCover - If TRUE then the ped must be in cover for them to be considered in the way.
FUNC BOOL IS_PED_STEALING_PEDS_DESTINATION(PED_INDEX pedToCheckForSteal, PED_INDEX pedToMove, VECTOR vDestination, FLOAT fMaxDistBeforeCheck, FLOAT fMaxDistConsideredAsStealing = 2.0, BOOL bMustBeInCover = FALSE)
IF NOT IS_PED_INJURED(pedToMove)
AND NOT IS_PED_INJURED(pedToCheckForSteal)
VECTOR vPed1Pos = GET_ENTITY_COORDS(pedToCheckForSteal)
VECTOR vPed2Pos = GET_ENTITY_COORDS(pedToMove)
FLOAT fDistFromPed2ToDest = VDIST2(vPed2Pos, vDestination)
FLOAT fDistFromPed1ToDest = VDIST2(vPed1Pos, vDestination)
//NOTE: the values passed in are in real metres, they need to be converted to squared values for comparisons.
IF fDistFromPed2ToDest < (fMaxDistBeforeCheck * fMaxDistBeforeCheck)
IF fDistFromPed1ToDest < fDistFromPed2ToDest
AND fDistFromPed1ToDest < (fMaxDistConsideredAsStealing * fMaxDistConsideredAsStealing)
IF bMustBeInCover
IF IS_PED_IN_COVER(pedToCheckForSteal)
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
///Finds a free destination for the ped given three different points. This is useful for selector ped shootouts: given three peds and three destinations it will find a spot
///that isn't blocked by one of the other peds (or the player).
/// pedToMove - The ped we want to move to a new destination.
/// pedInTheWay1 - The first ped that we want to check for blocking any of the given destinations.
/// pedInTheWay2 - The second ped that we want to check for blocking any of the given destinations.
/// vBuddyDest1 - The current destination of the first buddy ped.
/// vBuddyDest2 - The current destination of the second buddy ped.
/// vCurrentDest - The current destination for this ped: this will be checked first, if it's not being stolen then there's no need to look for a new point.
/// vDest1 - The first potential destination to check.
/// vDest2 - The second potential destination to check.
/// vDest3 - The third potential destination to check.
FUNC VECTOR GET_FREE_DESTINATION_POINT_FOR_PED(PED_INDEX pedToMove, PED_INDEX pedBuddy1, PED_INDEX pedBuddy2, VECTOR vBuddyDest1, VECTOR vBuddyDest2, VECTOR vCurrentDest, VECTOR vDest1, VECTOR vDest2, VECTOR vDest3)
IF NOT ARE_VECTORS_ALMOST_EQUAL(vCurrentDest, <<0.0, 0.0, 0.0>>)
IF NOT IS_PED_STEALING_PEDS_DESTINATION(pedBuddy1, pedToMove, vCurrentDest, 5.0, 3.0)
AND NOT IS_PED_STEALING_PEDS_DESTINATION(pedBuddy2, pedToMove, vCurrentDest, 5.0, 3.0)
RETURN vCurrentDest
ENDIF
ENDIF
IF NOT ARE_VECTORS_ALMOST_EQUAL(vCurrentDest, vDest1)
//First check that another buddy isn't already using this destination.
IF NOT ARE_VECTORS_ALMOST_EQUAL(vDest1, vBuddyDest1)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vDest1, vBuddyDest2)
//Now check that one of the other buddies isn't closer to this destination.
IF NOT IS_PED_STEALING_PEDS_DESTINATION(pedBuddy1, pedToMove, vDest1, 5.0, 3.0)
AND NOT IS_PED_STEALING_PEDS_DESTINATION(pedBuddy2, pedToMove, vDest1, 5.0, 3.0)
RETURN vDest1
ENDIF
ENDIF
ENDIF
IF NOT ARE_VECTORS_ALMOST_EQUAL(vCurrentDest, vDest2)
IF NOT ARE_VECTORS_ALMOST_EQUAL(vDest2, vBuddyDest1)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vDest2, vBuddyDest2)
IF NOT IS_PED_STEALING_PEDS_DESTINATION(pedBuddy1, pedToMove, vDest2, 5.0, 3.0)
AND NOT IS_PED_STEALING_PEDS_DESTINATION(pedBuddy2, pedToMove, vDest2, 5.0, 3.0)
RETURN vDest2
ENDIF
ENDIF
ENDIF
IF NOT ARE_VECTORS_ALMOST_EQUAL(vCurrentDest, vDest3)
IF NOT ARE_VECTORS_ALMOST_EQUAL(vDest3, vBuddyDest1)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vDest3, vBuddyDest2)
IF NOT IS_PED_STEALING_PEDS_DESTINATION(pedBuddy1, pedToMove, vDest3, 5.0, 3.0)
AND NOT IS_PED_STEALING_PEDS_DESTINATION(pedBuddy2, pedToMove, vDest3, 5.0, 3.0)
RETURN vDest3
ENDIF
ENDIF
ENDIF
//As a failsafe return the first choice.
RETURN vDest1
ENDFUNC
PROC SET_SELECTOR_PED_SHOOTOUT_STATE(BUDDY_DATA &sBuddy, BUDDY_SHOOTOUT_STATE eNewState)
sBuddy.vDest = <<0.0, 0.0, 0.0>>
sBuddy.iTimer = 0
sBuddy.iEvent = 0
sBuddy.eBuddyShootoutState = eNewState
ENDPROC
///New procedure for Michael: based around defending different fronts.
PROC UPDATE_MICHAEL_DURING_SHOOTOUT()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
VECTOR vMichaelPos = GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
VECTOR vAimPos
VECTOR vNewDest
FLOAT fDistToDestination
BOOL bPlayerStoleCover = FALSE
BOOL bIsInCombat = (IS_PED_IN_COMBAT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) OR GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) = PERFORMING_TASK)
SEQUENCE_INDEX seq
SET_PED_RESET_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PRF_DisableFriendlyGunReactAudio, TRUE)
IF HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_CARBINERIFLE)
IF GET_AMMO_IN_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_CARBINERIFLE) < 50
ADD_AMMO_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_CARBINERIFLE, 50)
ENDIF
ENDIF
SWITCH sMichael.eBuddyShootoutState
CASE BUDDY_STATE_DEFENDING_FRONT //Stays close to the gold, defending from enemies at the front entrance.
vNewDest = GET_FREE_DESTINATION_POINT_FOR_PED(GET_PED_INDEX(CHAR_MICHAEL), GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_FRANKLIN), sTrevor.vDest, sFranklin.vDest, sMichael.vDest,
<<130.5688, -1202.8179, 28.3423>>, <<127.7625, -1208.8765, 28.2951>>, <<138.0075, -1201.9452, 28.3113>>)
IF NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sMichael.vDest)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sFranklin.vDest)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sTrevor.vDest)
sMichael.vDest = vNewDest
IF ARE_VECTORS_ALMOST_EQUAL(sMichael.vDest, <<138.0075, -1201.9452, 28.3113>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael.cover, sMichael.vDest, 182.3275,
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60, FALSE)
ELIF ARE_VECTORS_ALMOST_EQUAL(sMichael.vDest, <<127.7625, -1208.8765, 28.2951>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael.cover, sMichael.vDest, 189.6171,
2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, FALSE)
ELIF ARE_VECTORS_ALMOST_EQUAL(sMichael.vDest, <<130.5688, -1202.8179, 28.3423>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael.cover, sMichael.vDest, 181.5105,
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120, FALSE)
ENDIF
bPlayerStoleCover = TRUE
sMichael.bRefreshTasks = TRUE
ENDIF
fDistToDestination = VDIST2(vMichaelPos, sMichael.vDest)
IF sMichael.bRefreshTasks
OR (GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
vAimPos = <<133.27, -1229.06, 30.0>>
OPEN_SEQUENCE_TASK(seq)
IF fDistToDestination > 4.0
AND NOT bPlayerStoleCover
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sMichael.vDest, vAimPos, PEDMOVE_RUN, FALSE, 0.25, 0.5)
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, sMichael.vDest, 1000, FALSE, 0.5, FALSE, FALSE, sMichael.cover, TRUE)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], seq)
CLEAR_SEQUENCE_TASK(seq)
sMichael.bRefreshTasks = FALSE
ENDIF
BREAK
CASE BUDDY_STATE_DEFENDING_FLANK_CLOSE //Stays close to the gold, defending from enemies on the flank.
vNewDest = GET_FREE_DESTINATION_POINT_FOR_PED(GET_PED_INDEX(CHAR_MICHAEL), GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_FRANKLIN), sTrevor.vDest, sFranklin.vDest, sMichael.vDest,
<<142.2252, -1214.2750, 28.2952>>, <<137.8998, -1208.3472, 28.2952>>, <<137.3811, -1202.9869, 28.2952>>)
IF NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sMichael.vDest)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sFranklin.vDest)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sTrevor.vDest)
sMichael.vDest = vNewDest
IF ARE_VECTORS_ALMOST_EQUAL(sMichael.vDest, <<137.3811, -1202.9869, 28.2952>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael.cover, sMichael.vDest, 280.5384,
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60, FALSE)
ELIF ARE_VECTORS_ALMOST_EQUAL(sMichael.vDest, <<137.8998, -1208.3472, 28.2952>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael.cover, sMichael.vDest, 271.1857,
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0, FALSE)
ELIF ARE_VECTORS_ALMOST_EQUAL(sMichael.vDest, <<142.2252, -1214.2750, 28.2952>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael.cover, sMichael.vDest, 224.9126,
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_180, FALSE)
ENDIF
bPlayerStoleCover = TRUE
sMichael.bRefreshTasks = TRUE
ENDIF
fDistToDestination = VDIST2(vMichaelPos, sMichael.vDest)
IF sMichael.bRefreshTasks
OR (GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
vAimPos = <<165.33, -1204.0, 30.0>>
OPEN_SEQUENCE_TASK(seq)
IF fDistToDestination > 4.0
AND NOT bPlayerStoleCover
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, sMichael.vDest, vAimPos, PEDMOVE_RUN, FALSE, 0.25, 0.5)
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, sMichael.vDest, 1000, FALSE, 0.5, FALSE, FALSE, sMichael.cover, TRUE)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<168.350510,-1204.140137,28.295084>>, 23.000000)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], seq)
CLEAR_SEQUENCE_TASK(seq)
sMichael.bRefreshTasks = FALSE
ENDIF
BREAK
CASE BUDDY_STATE_DEFENDING_FLANK_FAR //Defends the flank, but pushes further up.
vNewDest = GET_FREE_DESTINATION_POINT_FOR_PED(GET_PED_INDEX(CHAR_MICHAEL), GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_FRANKLIN), sTrevor.vDest, sFranklin.vDest, sMichael.vDest,
<<153.9629, -1208.1871, 28.7898>>, <<153.7258, -1201.8673, 28.4310>>, <<152.8369, -1215.7323, 28.3121>>)
IF NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sMichael.vDest)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sFranklin.vDest)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sTrevor.vDest)
sMichael.vDest = vNewDest
IF ARE_VECTORS_ALMOST_EQUAL(sMichael.vDest, <<153.7258, -1201.8673, 28.4310>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael.cover, sMichael.vDest, 270.4854,
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60, FALSE)
ELIF ARE_VECTORS_ALMOST_EQUAL(sMichael.vDest, <<153.9629, -1208.1871, 28.7898>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael.cover, sMichael.vDest, 270.4854,
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_180, FALSE)
ELIF ARE_VECTORS_ALMOST_EQUAL(sMichael.vDest, <<152.8369, -1215.7323, 28.3121>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael.cover, sMichael.vDest, 275.5096,
3.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0, FALSE)
ENDIF
bPlayerStoleCover = TRUE
sMichael.bRefreshTasks = TRUE
ENDIF
fDistToDestination = VDIST2(vMichaelPos, sMichael.vDest)
IF sMichael.bRefreshTasks
OR (GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<168.350510,-1204.140137,28.295084>>, 23.000000)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], seq)
CLEAR_SEQUENCE_TASK(seq)
sMichael.bRefreshTasks = FALSE
ENDIF
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
IF bDebugShowDebug
TEXT_LABEL strIndex = ""
strIndex += ENUM_TO_INT(sMichael.eBuddyShootoutState)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
DRAW_DEBUG_TEXT(strIndex, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<0.0, 0.0, 2.0>>))
ENDIF
#ENDIF
ENDIF
ENDPROC
PROC UPDATE_FRANKLIN_DURING_SHOOTOUT()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
BOOL bPlayerStoleCover = FALSE
VECTOR vNewDest
VECTOR vFranklinPos = GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
BOOL bIsInCombat = (IS_PED_IN_COMBAT(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) OR GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) = PERFORMING_TASK)
FLOAT fDistToDestination
VECTOR vAimPos
SEQUENCE_INDEX seq
SET_PED_RESET_FLAG(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PRF_DisableFriendlyGunReactAudio, TRUE)
IF HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE)
IF GET_AMMO_IN_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE) < 50
ADD_AMMO_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE, 50)
ENDIF
ENDIF
SWITCH sFranklin.eBuddyShootoutState
CASE BUDDY_STATE_DEFENDING_FRONT //Stays close to the gold, defending from enemies at the front entrance.
vNewDest = GET_FREE_DESTINATION_POINT_FOR_PED(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_MICHAEL), sTrevor.vDest, sMichael.vDest, sFranklin.vDest,
<<127.7625, -1208.8765, 28.2951>>, <<130.5416, -1202.8286, 28.3419>>, <<138.0075, -1201.9452, 28.3113>>)
IF NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sMichael.vDest)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sFranklin.vDest)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sTrevor.vDest)
sFranklin.vDest = vNewDest
IF ARE_VECTORS_ALMOST_EQUAL(sFranklin.vDest, <<138.0075, -1201.9452, 28.3113>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.cover, sFranklin.vDest, 182.3275,
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
ELIF ARE_VECTORS_ALMOST_EQUAL(sFranklin.vDest, <<127.7625, -1208.8765, 28.2951>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.cover, sFranklin.vDest, 189.6171,
2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
ELIF ARE_VECTORS_ALMOST_EQUAL(sFranklin.vDest, <<130.5416, -1202.8286, 28.3419>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.cover, sFranklin.vDest, 180.6171,
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_180)
ENDIF
bPlayerStoleCover = TRUE
sFranklin.bRefreshTasks = TRUE
ENDIF
fDistToDestination = VDIST2(vFranklinPos, sFranklin.vDest)
IF sFranklin.bRefreshTasks
OR (GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
vAimPos = <<133.27, -1229.06, 30.0>>
OPEN_SEQUENCE_TASK(seq)
IF fDistToDestination > 4.0
AND NOT bPlayerStoleCover
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sFranklin.vDest, vAimPos, PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE, ENAV_NO_STOPPING)
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, sFranklin.vDest, 1000, FALSE, 0.5, FALSE, FALSE, sFranklin.cover, TRUE)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], seq)
CLEAR_SEQUENCE_TASK(seq)
sFranklin.bRefreshTasks = FALSE
ENDIF
BREAK
CASE BUDDY_STATE_DEFENDING_FLANK_CLOSE //Stays close to the gold, defending from enemies on the flank.
vNewDest = GET_FREE_DESTINATION_POINT_FOR_PED(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_MICHAEL), sTrevor.vDest, sMichael.vDest, sFranklin.vDest,
<<137.8998, -1208.3472, 28.2952>>, <<142.2252, -1214.2750, 28.2952>>, <<137.3811, -1202.9869, 28.2952>>)
IF NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sMichael.vDest)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sFranklin.vDest)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sTrevor.vDest)
sFranklin.vDest = vNewDest
IF ARE_VECTORS_ALMOST_EQUAL(sFranklin.vDest, <<137.3811, -1202.9869, 28.2952>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.cover, sFranklin.vDest, 280.5384,
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
ELIF ARE_VECTORS_ALMOST_EQUAL(sFranklin.vDest, <<137.8998, -1208.3472, 28.2952>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.cover, sFranklin.vDest, 271.1857,
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0)
ELIF ARE_VECTORS_ALMOST_EQUAL(sFranklin.vDest, <<142.2252, -1214.2750, 28.2952>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.cover, sFranklin.vDest, 224.9126,
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0, FALSE)
ENDIF
bPlayerStoleCover = TRUE
sFranklin.bRefreshTasks = TRUE
ENDIF
fDistToDestination = VDIST2(vFranklinPos, sFranklin.vDest)
IF sFranklin.bRefreshTasks
OR (GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
vAimPos = <<165.33, -1204.0, 30.0>>
OPEN_SEQUENCE_TASK(seq)
IF fDistToDestination > 4.0
AND NOT bPlayerStoleCover
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF NOT IS_ENTITY_DEAD(vehNooseWave1)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, sFranklin.vDest, vehNooseWave1, PEDMOVE_RUN, TRUE, 0.5, 0.5, TRUE, ENAV_NO_STOPPING)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, sFranklin.vDest, vAimPos, PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE, ENAV_NO_STOPPING)
ENDIF
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, sFranklin.vDest, 1000, FALSE, 0.5, FALSE, FALSE, sFranklin.cover, TRUE)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<168.350510,-1204.140137,28.295084>>, 23.000000)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], seq)
CLEAR_SEQUENCE_TASK(seq)
sFranklin.bRefreshTasks = FALSE
ENDIF
BREAK
CASE BUDDY_STATE_DEFENDING_FLANK_FAR //Defends the flank, but pushes further up.
vNewDest = GET_FREE_DESTINATION_POINT_FOR_PED(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_MICHAEL), sTrevor.vDest, sMichael.vDest, sFranklin.vDest,
<<153.7258, -1201.8673, 28.4310>>, <<153.9629, -1208.1871, 28.7898>>, <<152.8369, -1215.7323, 28.3121>>)
IF NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sMichael.vDest)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sFranklin.vDest)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sTrevor.vDest)
sFranklin.vDest = vNewDest
IF ARE_VECTORS_ALMOST_EQUAL(sFranklin.vDest, <<153.7258, -1201.8673, 28.4310>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.cover, sFranklin.vDest, 270.4854,
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
ELIF ARE_VECTORS_ALMOST_EQUAL(sFranklin.vDest, <<153.9629, -1208.1871, 28.7898>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.cover, sFranklin.vDest, 270.4854,
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_180)
ELIF ARE_VECTORS_ALMOST_EQUAL(sFranklin.vDest, <<152.8369, -1215.7323, 28.3121>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.cover, sFranklin.vDest, 275.5096,
3.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0, FALSE)
ENDIF
bPlayerStoleCover = TRUE
sFranklin.bRefreshTasks = TRUE
ENDIF
fDistToDestination = VDIST2(vFranklinPos, sFranklin.vDest)
IF sFranklin.bRefreshTasks
OR (GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<168.350510,-1204.140137,28.295084>>, 23.000000)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], seq)
CLEAR_SEQUENCE_TASK(seq)
sFranklin.bRefreshTasks = FALSE
ENDIF
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
IF bDebugShowDebug
TEXT_LABEL strIndex = ""
strIndex += ENUM_TO_INT(sFranklin.eBuddyShootoutState)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
DRAW_DEBUG_TEXT(strIndex, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], <<0.0, 0.0, 2.0>>))
ENDIF
#ENDIF
ENDIF
ENDPROC
PROC UPDATE_TREVOR_DURING_SHOOTOUT()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
VECTOR vTrevorPos = GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
VECTOR vAimPos
VECTOR vNewDest
FLOAT fDistToDestination
BOOL bCoverWasStolen = FALSE
BOOL bIsInCombat = (IS_PED_IN_COMBAT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) OR GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) = PERFORMING_TASK)
SEQUENCE_INDEX seq
SET_PED_RESET_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PRF_DisableFriendlyGunReactAudio, TRUE)
IF HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE)
IF GET_AMMO_IN_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE) < 50
ADD_AMMO_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE, 50)
ENDIF
ENDIF
SWITCH sTrevor.eBuddyShootoutState
CASE BUDDY_STATE_DEFENDING_FRONT //Stays close to the gold, defending from enemies at the front entrance.
vNewDest = GET_FREE_DESTINATION_POINT_FOR_PED(GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_MICHAEL), GET_PED_INDEX(CHAR_FRANKLIN), sMichael.vDest, sFranklin.vDest, sTrevor.vDest,
<<138.0075, -1201.9452, 28.3113>>, <<127.7625, -1208.8765, 28.2951>>, <<130.5416, -1202.8286, 28.3419>>)
IF NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sMichael.vDest)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sFranklin.vDest)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sTrevor.vDest)
sTrevor.vDest = vNewDest
IF ARE_VECTORS_ALMOST_EQUAL(sTrevor.vDest, <<138.0075, -1201.9452, 28.3113>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.cover, sTrevor.vDest, 182.3275,
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60, FALSE)
ELIF ARE_VECTORS_ALMOST_EQUAL(sTrevor.vDest, <<127.7625, -1208.8765, 28.2951>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.cover, sTrevor.vDest, 189.6171,
2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, FALSE)
ELIF ARE_VECTORS_ALMOST_EQUAL(sTrevor.vDest, <<130.5416, -1202.8286, 28.3419>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.cover, sTrevor.vDest, 180.6171,
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_180, FALSE)
ENDIF
bCoverWasStolen = TRUE
sTrevor.bRefreshTasks = TRUE
ENDIF
fDistToDestination = VDIST2(vTrevorPos, sTrevor.vDest)
IF sTrevor.bRefreshTasks
OR (GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
vAimPos = <<133.27, -1229.06, 30.0>>
OPEN_SEQUENCE_TASK(seq)
IF fDistToDestination > 4.0
AND NOT bCoverWasStolen
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sTrevor.vDest, vAimPos, PEDMOVE_RUN, FALSE, 0.25, 0.5)
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, sTrevor.vDest, 1000, FALSE, 0.5, FALSE, FALSE, sTrevor.cover, TRUE)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
CLEAR_SEQUENCE_TASK(seq)
sTrevor.bRefreshTasks = FALSE
ENDIF
BREAK
CASE BUDDY_STATE_DEFENDING_FLANK_CLOSE //Stays close to the gold, defending from enemies on the flank.
vNewDest = GET_FREE_DESTINATION_POINT_FOR_PED(GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_MICHAEL), GET_PED_INDEX(CHAR_FRANKLIN), sMichael.vDest, sFranklin.vDest, sTrevor.vDest,
<<137.3811, -1202.9869, 28.2952>>, <<137.8998, -1208.3472, 28.2952>>, <<142.2252, -1214.2750, 28.2952>>)
IF NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sMichael.vDest)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sFranklin.vDest)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sTrevor.vDest)
sTrevor.vDest = vNewDest
IF ARE_VECTORS_ALMOST_EQUAL(sTrevor.vDest, <<137.3811, -1202.9869, 28.2952>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.cover, sTrevor.vDest, 280.5384,
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60, FALSE)
ELIF ARE_VECTORS_ALMOST_EQUAL(sTrevor.vDest, <<137.8998, -1208.3472, 28.2952>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.cover, sTrevor.vDest, 271.1857,
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0, FALSE)
ELIF ARE_VECTORS_ALMOST_EQUAL(sTrevor.vDest, <<142.2252, -1214.2750, 28.2952>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.cover, sTrevor.vDest, 224.9126,
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0, FALSE)
ENDIF
bCoverWasStolen = TRUE
sTrevor.bRefreshTasks = TRUE
ENDIF
fDistToDestination = VDIST2(vTrevorPos, sTrevor.vDest)
IF sTrevor.bRefreshTasks
OR (GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
vAimPos = <<165.33, -1204.0, 30.0>>
OPEN_SEQUENCE_TASK(seq)
IF fDistToDestination > 4.0
AND NOT bCoverWasStolen
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, sTrevor.vDest, vAimPos, PEDMOVE_RUN, FALSE, 0.25, 0.5)
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, sTrevor.vDest, 1000, FALSE, 0.5, FALSE, FALSE, sTrevor.cover, TRUE)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<168.350510,-1204.140137,28.295084>>, 23.000000)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
CLEAR_SEQUENCE_TASK(seq)
sTrevor.bRefreshTasks = FALSE
ENDIF
BREAK
CASE BUDDY_STATE_DEFENDING_FLANK_FAR //Defends the flank, but pushes further up.
vNewDest = GET_FREE_DESTINATION_POINT_FOR_PED(GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_MICHAEL), GET_PED_INDEX(CHAR_FRANKLIN), sMichael.vDest, sFranklin.vDest, sTrevor.vDest,
<<152.8369, -1215.7323, 28.3121>>, <<153.7258, -1201.8673, 28.4310>>, <<153.9629, -1208.1871, 28.7898>>)
IF NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sMichael.vDest)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sFranklin.vDest)
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sTrevor.vDest)
sTrevor.vDest = vNewDest
IF ARE_VECTORS_ALMOST_EQUAL(sTrevor.vDest, <<153.7258, -1201.8673, 28.4310>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.cover, sTrevor.vDest, 270.4854,
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60, FALSE)
ELIF ARE_VECTORS_ALMOST_EQUAL(sTrevor.vDest, <<153.9629, -1208.1871, 28.7898>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.cover, sTrevor.vDest, 270.4854,
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_180, FALSE)
ELIF ARE_VECTORS_ALMOST_EQUAL(sTrevor.vDest, <<152.8369, -1215.7323, 28.3121>>)
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.cover, sTrevor.vDest, 275.5096,
3.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0, FALSE)
ENDIF
sTrevor.bRefreshTasks = TRUE
ENDIF
fDistToDestination = VDIST2(vTrevorPos, sTrevor.vDest)
IF sTrevor.bRefreshTasks
OR (GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<168.350510,-1204.140137,28.295084>>, 23.000000)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
CLEAR_SEQUENCE_TASK(seq)
sTrevor.bRefreshTasks = FALSE
ENDIF
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
IF bDebugShowDebug
TEXT_LABEL strIndex = ""
strIndex += ENUM_TO_INT(sTrevor.eBuddyShootoutState)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
DRAW_DEBUG_TEXT(strIndex, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<0.0, 0.0, 2.0>>))
ENDIF
#ENDIF
ENDIF
ENDPROC
PROC MANAGE_FREE_HOTSWAP()
SWITCH iSwitchStage
CASE 0
IF UPDATE_SELECTOR_HUD(sSelectorPeds)
CLEAR_HELP()
DESTROY_ALL_CAMS()
INFORM_MISSION_STATS_OF_INCREMENT(FH2A_SWITCHES)
sSelectorCam.pedTo = sSelectorPeds.pedID[sSelectorPeds.eNewSelectorPed]
iHealthBeforeSwitch = GET_ENTITY_HEALTH(PLAYER_PED_ID())
iSwitchStage++
ENDIF
VECTOR vPlayerPos
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
//Guarantee that the current player's cover info is removed from when they were AI controlled.
IF GET_GAME_TIMER() - iTimeOfLastSwitch > 1000
//OR iSwitchStage != 0
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
IF sFranklin.cover != NULL
IF VDIST2(sFranklin.vDest, vPlayerPos) > 9.0
REMOVE_COVER_POINT(sFranklin.cover)
sFranklin.cover = NULL
sFranklin.vDest = <<0.0, 0.0, 0.0>>
ENDIF
ENDIF
ELIF eCurrentPlayer = SELECTOR_PED_MICHAEL
IF sMichael.cover != NULL
IF VDIST2(sMichael.vDest, vPlayerPos) > 9.0
REMOVE_COVER_POINT(sMichael.cover)
sMichael.cover = NULL
sMichael.vDest = <<0.0, 0.0, 0.0>>
ENDIF
ENDIF
ELSE
IF sTrevor.cover != NULL
IF VDIST2(sTrevor.vDest, vPlayerPos) > 9.0
REMOVE_COVER_POINT(sTrevor.cover)
sTrevor.cover = NULL
sTrevor.vDest = <<0.0, 0.0, 0.0>>
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF NOT RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(sSelectorCam)
iTimeOfLastSwitch = GET_GAME_TIMER()
iSwitchStage = 0
ELSE
IF sSelectorCam.bOKToSwitchPed
IF NOT sSelectorCam.bPedSwitched
IF TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed])
IF iHealthBeforeSwitch < 110
iHealthBeforeSwitch = 110
ENDIF
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], FALSE)
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], FALSE)
SET_PED_DIES_WHEN_INJURED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], RELGROUPHASH_PLAYER)
//1082129 - Half accuracy once the buddies push forwards.
IF sVanFlank[0].iEvent > 0
OR sVanFlank[0].bIsCreated AND IS_PED_INJURED(sVanFlank[0].ped)
SET_PED_COMBAT_PARAMS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], 5, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
ELSE
SET_PED_COMBAT_PARAMS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
ENDIF
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_BLIND_FIRE_IN_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], PCF_DisableHurt, TRUE)
SET_ENTITY_HEALTH(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], iHealthBeforeSwitch)
SET_PED_MAX_HEALTH_WITH_SCALE(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], 1800)
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], TRUE, -1)
SET_RAGDOLL_BLOCKING_FLAGS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_PLAYER_IMPACT | RBF_MELEE | RBF_FALLING | RBF_IMPACT_OBJECT)
IF eMissionStage = STAGE_SHOOTOUT
SET_PED_CAN_RAGDOLL(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], FALSE)
//1106601 - If the player managed to switch while stuck behind the surrounding fence then just warp the ped back.
VECTOR vPedPos
vPedPos = GET_ENTITY_COORDS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed])
IF vPedPos.x < 122.5
IF NOT IS_AREA_OCCUPIED(<<125.1323, -1206.9291, 28.2952>>, <<127.1323, -1204.9291, 28.2952>>, FALSE, TRUE, TRUE, FALSE, FALSE)
SET_ENTITY_COORDS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], <<126.1323, -1205.9291, 28.2952>>)
ENDIF
ELIF NOT IS_ENTITY_IN_ANGLED_AREA(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], <<120.063802,-1203.822021,27.795198>>, <<184.646594,-1199.640503,33.555710>>, 51.000000)
IF VDIST2(<<174.7520, -1222.2562, 28.4890>>, vPedPos) < VDIST2(<<139.6026, -1222.5187, 28.3368>>, vPedPos)
IF NOT IS_AREA_OCCUPIED(<<174.7520, -1222.2562, 28.4890>> - <<1.0, 1.0, 0.0>>, <<174.7520, -1222.2562, 28.4890>> + <<1.0, 1.0, 0.0>>, FALSE, TRUE, TRUE, FALSE, FALSE)
SET_ENTITY_COORDS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], <<174.7520, -1222.2562, 28.4890>>)
ENDIF
ELSE
IF NOT IS_AREA_OCCUPIED(<<174.7520, -1222.2562, 28.4890>> - <<1.0, 1.0, 0.0>>, <<174.7520, -1222.2562, 28.4890>> + <<1.0, 1.0, 0.0>>, FALSE, TRUE, TRUE, FALSE, FALSE)
SET_ENTITY_COORDS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], <<174.7520, -1222.2562, 28.4890>>)
ENDIF
ENDIF
ENDIF
//Reset the defensive area for each ped, this ensures they update their destination to match the latest state of the buddies.
IF sSelectorPeds.ePreviousSelectorPed = SELECTOR_PED_MICHAEL
sMichael.vDest = <<0.0, 0.0, 0.0>>
sMichael.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER() - 5000
ELIF sSelectorPeds.ePreviousSelectorPed = SELECTOR_PED_FRANKLIN
sFranklin.vDest = <<0.0, 0.0, 0.0>>
sFranklin.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER() - 5000
ELIF sSelectorPeds.ePreviousSelectorPed = SELECTOR_PED_TREVOR
sTrevor.vDest = <<0.0, 0.0, 0.0>>
sTrevor.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER() - 5000
ENDIF
ENDIF
IF HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], WEAPONTYPE_CARBINERIFLE)
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], WEAPONTYPE_CARBINERIFLE)
IF GET_AMMO_IN_PED_WEAPON(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], WEAPONTYPE_CARBINERIFLE) < 50
ADD_AMMO_TO_PED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], WEAPONTYPE_CARBINERIFLE, 50)
ENDIF
ENDIF
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
FLOAT fBuddyDistFromCover, fPlayerDistFromCover
VECTOR vAICoverPos
COVERPOINT_INDEX coverPlayer
//Update the hint and store details about the player character when they were AI controlled.
IF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
coverPlayer = sFranklin.cover
eCurrentPlayer = SELECTOR_PED_FRANKLIN
ELIF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_MICHAEL)
coverPlayer = sMichael.cover
eCurrentPlayer = SELECTOR_PED_MICHAEL
ELSE
coverPlayer = sTrevor.cover
eCurrentPlayer = SELECTOR_PED_TREVOR
ENDIF
//If the player is near the cover point that the AI was heading to then put them into cover.
IF coverPlayer != NULL
vAICoverPos = GET_SCRIPTED_COVER_POINT_COORDS(coverPlayer)
fBuddyDistFromCover = VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed]), vAICoverPos)
fPlayerDistFromCover = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vAICoverPos)
IF fPlayerDistFromCover < fBuddyDistFromCover
AND fPlayerDistFromCover < 2.0
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), GET_SCRIPTED_COVER_POINT_COORDS(coverPlayer), 1500, FALSE, 0.0, FALSE, FALSE, coverPlayer, TRUE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
ENDIF
ENDIF
sSelectorCam.bPedSwitched = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC UPDATE_BUDDY_SHOOTOUT_DIALOGUE(VECTOR vPlayerPos)
IF GET_GAME_TIMER() - iCombatDialogueTimer > 0
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND NOT IS_SELECTOR_CAM_ACTIVE()
//Trevor AI dialogue
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF GET_GAME_TIMER() - iTrevorShootoutDialogueTimer > 0
IF (IS_PED_SHOOTING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) OR IS_PED_IN_COMBAT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
AND NOT IS_PED_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]), vPlayerPos) < 400.0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_ATTACK", CONV_PRIORITY_MEDIUM)
iTrevorShootoutDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
iCombatDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
ENDIF
ENDIF
ENDIF
ENDIF
//Franklin AI dialogue
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
IF GET_GAME_TIMER() - iFranklinShootoutDialogueTimer > 0
IF (IS_PED_SHOOTING(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) OR IS_PED_IN_COMBAT(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]))
AND NOT IS_PED_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
AND VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]), vPlayerPos) < 400.0
IF NOT bHasTextLabelTriggered[FH3A_SKID]
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SKID", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_SKID] = TRUE
iFranklinShootoutDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
iCombatDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
ENDIF
ELSE
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_ATTACKF", CONV_PRIORITY_MEDIUM)
iFranklinShootoutDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
iCombatDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Michael AI dialogue
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF GET_GAME_TIMER() - iMichaelShootoutDialogueTimer > 0
IF (IS_PED_SHOOTING(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) OR IS_PED_IN_COMBAT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
AND NOT IS_PED_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
AND VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]), vPlayerPos) < 400.0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_ATTACKM", CONV_PRIORITY_MEDIUM)
iMichaelShootoutDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
iCombatDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
ENDIF
ENDIF
ENDIF
ENDIF
//Player dialogue
IF IS_PED_SHOOTING(PLAYER_PED_ID())
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
IF GET_GAME_TIMER() - iFranklinShootoutDialogueTimer > 0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_ATTACKF", CONV_PRIORITY_MEDIUM)
iFranklinShootoutDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
iCombatDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
ENDIF
ENDIF
ELIF eCurrentPlayer = SELECTOR_PED_MICHAEL
IF GET_GAME_TIMER() - iMichaelShootoutDialogueTimer > 0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_ATTACKM", CONV_PRIORITY_MEDIUM)
iMichaelShootoutDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
iCombatDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
ENDIF
ENDIF
ELIF eCurrentPlayer = SELECTOR_PED_TREVOR
IF GET_GAME_TIMER() - iTrevorShootoutDialogueTimer > 0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_ATTACK", CONV_PRIORITY_MEDIUM)
iTrevorShootoutDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
iCombatDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC UPDATE_CREW_MEMBER_CARRYING_GOLD(BUDDY_DATA &sCrewMember, STRING strAnimDict, INT &iSyncSceneID, OBJECT_INDEX &objGoldBars[], BOOL &bUpdateTakeTotal, BOOL &bGoldBarsCreated)
//NOTES:
//Need some behaviour in case they get knocked off their anims. Use the waypoint recordings to get them back on then continue.
INT i = 0
//Create gold bars.
BOOL bGoldBarCreatedThisFrame = FALSE
IF NOT bGoldBarsCreated
INT iNumBarsCreated = 0
REPEAT COUNT_OF(objGoldBars) i
IF NOT DOES_ENTITY_EXIST(objGoldBars[i])
IF NOT bGoldBarCreatedThisFrame
REQUEST_MODEL(modelGoldBar)
IF HAS_MODEL_LOADED(modelGoldBar)
objGoldBars[i] = CREATE_OBJECT_NO_OFFSET(modelGoldBar, <<131.8, -1191.4, 26.2>> + <<TO_FLOAT(i), GET_RANDOM_FLOAT_IN_RANGE(0.0, 3.0), 0.0>>)
FREEZE_ENTITY_POSITION(objGoldBars[i], TRUE)
bGoldBarCreatedThisFrame = TRUE
ENDIF
ENDIF
ELSE
iNumBarsCreated++
ENDIF
ENDREPEAT
IF iNumBarsCreated >= COUNT_OF(objGoldBars)
bGoldBarsCreated = TRUE
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sCrewMember.ped)
SET_PED_RESET_FLAG(sCrewMember.ped, PRF_DisableFriendlyGunReactAudio, TRUE)
REQUEST_ANIM_DICT(strAnimDict)
IF HAS_ANIM_DICT_LOADED(strAnimDict)
VECTOR vScenePos = <<130.821, -1203.087, 28.545>>
VECTOR vSceneRot = <<0.000, 0.000, -176.400>>
SWITCH sCrewMember.iEvent
CASE 0
SET_CURRENT_PED_WEAPON(sCrewMember.ped, WEAPONTYPE_UNARMED, TRUE)
SET_PED_CURRENT_WEAPON_VISIBLE(sCrewMember.ped, FALSE)
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "back_to_van_l", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
sCrewMember.iEvent++
BREAK
CASE 1
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "van_loop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
sCrewMember.iEvent++
ENDIF
ENDIF
BREAK
CASE 2
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "carry_from_van", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
REPEAT COUNT_OF(objGoldBars) i
FREEZE_ENTITY_POSITION(objGoldBars[i], FALSE)
ENDREPEAT
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[0], iSyncSceneID, "Carry_From_Van_Gold_A", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[1], iSyncSceneID, "Carry_From_Van_Gold_B", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[2], iSyncSceneID, "Carry_From_Van_Gold_C", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[3], iSyncSceneID, "Carry_From_Van_Gold_D", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[4], iSyncSceneID, "Carry_From_Van_Gold_E", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
sCrewMember.iEvent++
ENDIF
ENDIF
BREAK
CASE 3
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
IF NOT bHasTextLabelTriggered[FH3A_MVEGUN]
//Play a general line for the gunman moving gold.
IF sCrewMember.ped = sCrew[CREW_GUNMAN].ped
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sCrewMember.ped)) < 900.0
IF CREATE_GUNMAN_CONVERSATION(CREW_GUNMAN, sCrewMember.ped, sConversationPeds, "FH3AAUD", "FH3A_MVE")
bHasTextLabelTriggered[FH3A_MVEGUN] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT bHasTextLabelTriggered[FH3A_MVEDRV]
//Play a general line for the driver moving gold.
IF sCrewMember.ped = sCrew[CREW_DRIVER].ped
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sCrewMember.ped)) < 900.0
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrewMember.ped, sConversationPeds, "FH3AAUD", "FH3A_MVE")
bHasTextLabelTriggered[FH3A_MVEDRV] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT bHasTextLabelTriggered[FH3A_DRP]
//Play a line for the bad gunman dropping gold.
IF (NOT bPickedGoodGunman AND sCrewMember.ped = sCrew[CREW_GUNMAN].ped)
IF bHasTextLabelTriggered[FH3A_MVEGUN]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sCrewMember.ped)) < 900.0
IF CREATE_GUNMAN_CONVERSATION(CREW_GUNMAN, sCrewMember.ped, sConversationPeds, "FH3AAUD", "FH3A_DRP")
bHasTextLabelTriggered[FH3A_DRP] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELIF (NOT bPickedGoodCarDriver AND sCrewMember.ped = sCrew[CREW_DRIVER].ped)
IF bHasTextLabelTriggered[FH3A_MVEDRV]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sCrewMember.ped)) < 900.0
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, sCrewMember.ped, "KARIM")
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_CARRY2B", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_DRP] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_TCOMM]
IF NOT bPickedGoodGunman
OR NOT bPickedGoodCarDriver
//Trevor complains about the bad crew.
TEXT_LABEL strLabel
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF NOT bPickedGoodGunman
strLabel = "FH3A_TCOMM"
ELIF NOT bPickedGoodCarDriver
strLabel = "FH3A_TCOMM2"
ENDIF
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])) < 900.0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_TCOMM] = TRUE
ENDIF
ENDIF
ENDIF
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
IF NOT bPickedGoodGunman
strLabel = "FH3A_DROPF2"
ELIF NOT bPickedGoodCarDriver
strLabel = "FH3A_DROPF"
ENDIF
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])) < 900.0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_TCOMM] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "carry_to_boot_r", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[0], iSyncSceneID, "Carry_To_Boot_R_Gold_A", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[1], iSyncSceneID, "Carry_To_Boot_R_Gold_B", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[2], iSyncSceneID, "Carry_To_Boot_R_Gold_C", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[3], iSyncSceneID, "Carry_To_Boot_R_Gold_D", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[4], iSyncSceneID, "Carry_To_Boot_R_Gold_E", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
sCrewMember.iEvent++
ENDIF
ENDIF
BREAK
CASE 4
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "boot_r_loop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
sCrewMember.iEvent++
ENDIF
ENDIF
BREAK
CASE 5
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
bUpdateTakeTotal = TRUE
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "back_to_van_r", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
sCrewMember.iEvent++
ENDIF
ENDIF
BREAK
CASE 6
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "van_loop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
sCrewMember.iEvent++
ENDIF
ENDIF
BREAK
CASE 7
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "carry_from_van", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[0], iSyncSceneID, "Carry_From_Van_Gold_A", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[1], iSyncSceneID, "Carry_From_Van_Gold_B", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[2], iSyncSceneID, "Carry_From_Van_Gold_C", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[3], iSyncSceneID, "Carry_From_Van_Gold_D", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[4], iSyncSceneID, "Carry_From_Van_Gold_E", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
sCrewMember.iEvent++
ENDIF
ENDIF
BREAK
CASE 8
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "carry_to_boot_l", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[0], iSyncSceneID, "Carry_To_Boot_L_Gold_A", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[1], iSyncSceneID, "Carry_To_Boot_L_Gold_B", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[2], iSyncSceneID, "Carry_To_Boot_L_Gold_C", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[3], iSyncSceneID, "Carry_To_Boot_L_Gold_D", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[4], iSyncSceneID, "Carry_To_Boot_L_Gold_E", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
sCrewMember.iEvent++
ENDIF
ENDIF
BREAK
CASE 9
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "boot_l_loop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
sCrewMember.iEvent++
ENDIF
ENDIF
BREAK
CASE 10
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
sCrewMember.iEvent = 0
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
IF IS_ENTITY_ON_FIRE(sCrewMember.ped)
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
STOP_SYNCHRONIZED_ENTITY_ANIM(sCrewMember.ped, WALK_BLEND_OUT, TRUE)
SET_PED_CAN_RAGDOLL(sCrewMember.ped, TRUE)
SET_PED_TO_RAGDOLL_WITH_FALL(sCrewMember.ped, 1000, 20000, TYPE_FROM_HIGH, <<1.0, 0.0, 0.0>>, 28.4, <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
iSyncSceneID = -1
ENDIF
APPLY_DAMAGE_TO_PED(sCrewMember.ped, 40, TRUE)
ENDIF
ENDIF
ENDPROC
FUNC PED_INDEX GET_CLOSEST_PED_TO_SCREEN_CENTRE(FLOAT &fScreenX, FLOAT &fScreenY)
PED_INDEX pedClosestEnemy = NULL
PED_INDEX peds[6]
GET_PED_NEARBY_PEDS(PLAYER_PED_ID(), peds)
FLOAT fClosestDistFromCentre = -1.0
FLOAT fDist = 0.0
FLOAT fX, fY
INT i = 0
REPEAT COUNT_OF(peds) i
IF NOT IS_PED_INJURED(peds[i])
IF GET_ENTITY_MODEL(peds[i]) = modelMerryweather
GET_SCREEN_COORD_FROM_WORLD_COORD(GET_ENTITY_COORDS(peds[i]), fX, fY)
fDist = ABSF(fX - 0.5) + ABSF(fY - 0.5)
IF fClosestDistFromCentre = -1.0 OR fDist < fClosestDistFromCentre
fClosestDistFromCentre = fDist
fScreenX = fX
fScreenY = fY
pedClosestEnemy = peds[i]
ENDIF
ENDIF
ENDIF
ENDREPEAT
RETURN pedClosestEnemy
ENDFUNC
PROC UPDATE_SHOOTOUT_DIALOGUE()
TEXT_LABEL strLabel
INT iRandom
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
//Play reminders for the bridge guys at regular intervals.
IF sNooseAbove[0].iEvent > 0
IF iNumAliveNooseAbove > 0
IF GET_GAME_TIMER() - iBridgeEnemiesDialogueTimer > 10000
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
iRandom = GET_RANDOM_INT_IN_RANGE(0, 2)
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
IF iRandom = 0
strLabel = "FH3A_TBRID"
ELSE
strLabel = "FH3A_MBRID"
ENDIF
ELIF eCurrentPlayer = SELECTOR_PED_MICHAEL
IF iRandom = 0
strLabel = "FH3A_FBRID"
ELSE
strLabel = "FH3A_TBRID"
ENDIF
ELIF eCurrentPlayer = SELECTOR_PED_TREVOR
IF iRandom = 0
strLabel = "FH3A_FBRID"
ELSE
strLabel = "FH3A_MBRID"
ENDIF
ENDIF
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
iBridgeEnemiesDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(-1000, 2000)
ENDIF
ENDIF
ENDIF
ELSE
iBridgeEnemiesDialogueTimer = GET_GAME_TIMER()
ENDIF
//If an enemy needs to be killed but is blocked by the player then play some "I can't see" dialogue.
BOOL bLostLineOfSight = FALSE
IF IS_PLAYER_FREE_AIMING(PLAYER_ID())
OR IS_PLAYER_TARGETTING_ANYTHING(PLAYER_ID())
FLOAT fScreenX, fScreenY
PED_INDEX pedClosestEnemy = GET_CLOSEST_PED_TO_SCREEN_CENTRE(fScreenX, fScreenY)
IF NOT IS_PED_INJURED(pedClosestEnemy)
IF fScreenX > 0.4
AND fScreenX < 0.6
AND fScreenY > 0.35
AND fScreenY < 0.65
IF NOT HAS_ENTITY_CLEAR_LOS_TO_ENTITY_IN_FRONT(PLAYER_PED_ID(), pedClosestEnemy)
IF GET_GAME_TIMER() - iEnemyNotVisibleDialogueTimer > 1000
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
strLabel = "FH3A_FHID"
ELIF eCurrentPlayer = SELECTOR_PED_MICHAEL
strLabel = "FH3A_MHID"
ELIF eCurrentPlayer = SELECTOR_PED_TREVOR
strLabel = "FH3A_THID"
ENDIF
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
iEnemyNotVisibleDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7000, 9000)
ENDIF
ENDIF
bLostLineOfSight = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT bLostLineOfSight
IF GET_GAME_TIMER() - iEnemyNotVisibleDialogueTimer > 0
iEnemyNotVisibleDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
//If an enemy needs to be killed and the player is in the best position then play some "I'll cover you" dialogue.
IF NOT bDoNewVersionOfShootout
INT iNumEnemiesWaitingOnForSecondPush = GET_NUM_FLANKING_ENEMIES_IN_PUSH_AREA()
INT iNumEnemiesWaitingOnForThirdPush = iNumAliveVanFlank + iNumAliveGoonsWave3b
IF iNumEnemiesWaitingOnForSecondPush = 2
OR iNumEnemiesWaitingOnForThirdPush = 2
IF GET_GAME_TIMER() - iIllCoverYouDialogueTimer > 1000
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
PED_INDEX pedClosestEnemy = NULL
PED_INDEX peds[12]
GET_PED_NEARBY_PEDS(PLAYER_PED_ID(), peds)
INT i = 0
REPEAT COUNT_OF(peds) i
IF pedClosestEnemy = NULL
IF NOT IS_PED_INJURED(peds[i])
pedClosestEnemy = peds[i]
ENDIF
ENDIF
ENDREPEAT
IF NOT IS_PED_INJURED(pedClosestEnemy)
FLOAT fMichaelDist = VDIST2(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_MICHAEL)), GET_ENTITY_COORDS(pedClosestEnemy))
FLOAT fTrevorDist = VDIST2(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_TREVOR)), GET_ENTITY_COORDS(pedClosestEnemy))
FLOAT fFranklinDist = VDIST2(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN)), GET_ENTITY_COORDS(pedClosestEnemy))
#IF IS_DEBUG_BUILD
PRINTLN(fMichaelDist, " ", fTrevorDist, " ", fFranklinDist)
#ENDIF
strLabel = ""
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
IF fMichaelDist < fTrevorDist
IF fFranklinDist - fMichaelDist < 100.0
strLabel = "FH3A_MCOVERU"
ENDIF
ELSE
IF fFranklinDist - fTrevorDist < 100.0
strLabel = "FH3A_TCOVERU"
ENDIF
ENDIF
ELIF eCurrentPlayer = SELECTOR_PED_MICHAEL
IF fFranklinDist < fTrevorDist
IF fMichaelDist - fFranklinDist < 100.0
strLabel = "FH3A_FCOVERU"
ENDIF
ELSE
IF fMichaelDist - fTrevorDist < 100.0
strLabel = "FH3A_TCOVERU"
ENDIF
ENDIF
ELIF eCurrentPlayer = SELECTOR_PED_TREVOR
IF fMichaelDist < fFranklinDist
IF fTrevorDist - fMichaelDist < 100.0
strLabel = "FH3A_MCOVERU"
ENDIF
ELSE
IF fTrevorDist - fFranklinDist < 100.0
strLabel = "FH3A_FCOVERU"
ENDIF
ENDIF
ENDIF
IF NOT IS_STRING_NULL_OR_EMPTY(strLabel)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
iIllCoverYouDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 11000)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
iIllCoverYouDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDPROC
/// Sets the nearest ped to shout if you drive near them: the ped's car must be moving, close by, and not going in the same direction as the player.
/// Can also trigger if the player crashes into the car.
/// PARAMS:
/// iDialogueTimer - Keeps track of the time since the last ambient dialogue was played.
/// vehPlayer - The player's car
/// vehClosest - The car that contains the driver to shout.
/// bForceDialogue - If TRUE the dialogue will be forced through (position and speed checks are ignored).
PROC UPDATE_CHASE_AMBIENT_SHOUTS(INT &iDialogueTimer, VEHICLE_INDEX vehPlayer, VEHICLE_INDEX vehClosest, BOOL bForceDialogue = FALSE)
IF NOT IS_ENTITY_DEAD(vehPlayer)
IF GET_GAME_TIMER() - iDialogueTimer > 3000
OR (bForceDialogue AND GET_GAME_TIMER() - iDialogueTimer > 1000)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ENTITY_DEAD(vehClosest) AND vehClosest != vehPlayer
BOOL bCrashed = FALSE
BOOL bNearMiss = FALSE
IF bForceDialogue
bNearMiss = TRUE
ELIF IS_ENTITY_TOUCHING_ENTITY(vehClosest, vehPlayer)
bCrashed = TRUE
ELIF ABSF(GET_ENTITY_SPEED(vehClosest)) > 2.0
IF ABSF(GET_ENTITY_HEADING(vehClosest) - GET_ENTITY_HEADING(vehPlayer)) > 60.0
bNearMiss = TRUE
ENDIF
ENDIF
IF bCrashed OR bNearMiss
PED_INDEX pedCurrentAngryDriver = GET_PED_IN_VEHICLE_SEAT(vehClosest)
IF NOT IS_PED_INJURED(pedCurrentAngryDriver)
IF bCrashed
PLAY_PED_AMBIENT_SPEECH(pedCurrentAngryDriver, "GENERIC_CURSE_HIGH", SPEECH_PARAMS_FORCE_NORMAL)
ELSE
PLAY_PED_AMBIENT_SPEECH(pedCurrentAngryDriver, "GENERIC_INSULT_HIGH", SPEECH_PARAMS_FORCE_NORMAL)
ENDIF
iDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// Plays car horns on the nearest vehicle
PROC UPDATE_CHASE_HORNS(INT &iHornTimer, VEHICLE_INDEX vehClosest)
//General horns for all vehicles: get the nearest vehicle and play horn
IF GET_GAME_TIMER() - iHornTimer > 2000
IF IS_VEHICLE_DRIVEABLE(vehClosest)
PED_INDEX pedClosest = GET_PED_IN_VEHICLE_SEAT(vehClosest)
IF NOT IS_PED_INJURED(pedClosest)
START_VEHICLE_HORN(vehClosest, 2000)
iHornTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL GET_COP_SPAWN_POS_FROM_PLAYER(VECTOR &vSpawnPos, FLOAT &fSpawnHeading, INT iCopIndex, FLOAT fSpawnDistance = 40.0)
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
VECTOR vChasePos = GET_ENTITY_COORDS(sGoldCars[0].veh)
VECTOR vClosestNodeToPlayer, vClosestNodePos, vPlayerOffset
FLOAT fClosestNodeHeading, fHeadingFromNodeToPlayer, fHeadingDiff, fHeadingFromPlayerToChase
INT iNumLanes
IF GET_CLOSEST_VEHICLE_NODE(vPlayerPos, vClosestNodeToPlayer, NF_INCLUDE_SWITCHED_OFF_NODES)
IF VDIST2(vPlayerPos, vClosestNodeToPlayer) < 25.0
fHeadingFromPlayerToChase = GET_HEADING_FROM_VECTOR_2D(vChasePos.x - vPlayerPos.x, vChasePos.y - vPlayerPos.y)
vPlayerOffset = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vPlayerPos, fHeadingFromPlayerToChase, <<0.0, -fSpawnDistance, 0.0>>)
IF GET_NTH_CLOSEST_VEHICLE_NODE_WITH_HEADING(vPlayerOffset, 1, vClosestNodePos, fClosestNodeHeading, iNumLanes, NF_INCLUDE_SWITCHED_OFF_NODES)
vSpawnPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vClosestNodePos, fClosestNodeHeading, <<0.0, -10.0 * iCopIndex, 0.0>>)
IF NOT IS_SPHERE_VISIBLE(vSpawnPos, 3.0)
AND NOT IS_AREA_OCCUPIED(vSpawnPos - <<1.5, 1.5, 1.5>>, vSpawnPos + <<1.5, 1.5, 1.5>>, FALSE, TRUE, FALSE, FALSE, FALSE)
fHeadingFromNodeToPlayer = GET_HEADING_FROM_VECTOR_2D(vPlayerPos.x - vSpawnPos.x, vPlayerPos.y - vSpawnPos.y)
fHeadingDiff = ABSF(fHeadingFromNodeToPlayer - fClosestNodeHeading)
IF fHeadingDiff > 180.0
fHeadingDiff = ABSF(fHeadingDiff - 360.0)
ENDIF
IF fHeadingDiff < 90.0
fSpawnHeading = fClosestNodeHeading
ELSE
fSpawnHeading = fClosestNodeHeading + 180.0
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN("Cop spawn: ", vSpawnPos, " ", fSpawnHeading)
#ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
/*VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
VECTOR vClosestNodeToPlayer, vClosestNodePos
FLOAT fClosestNodeHeading, fHeadingFromNodeToPlayer, fHeadingDiff
INT iNumLanes
IF GET_CLOSEST_VEHICLE_NODE(vPlayerPos, vClosestNodeToPlayer, NF_NONE)
IF VDIST2(vPlayerPos, vClosestNodeToPlayer) < 25.0
IF GET_NTH_CLOSEST_VEHICLE_NODE_WITH_HEADING(vPlayerPos, 16, vClosestNodePos, fClosestNodeHeading, iNumLanes, NF_NONE)
vSpawnPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vClosestNodePos, fClosestNodeHeading, <<0.0, -5.0 * iCopIndex, 0.0>>)
IF NOT IS_SPHERE_VISIBLE(vSpawnPos, 3.0)
AND NOT IS_AREA_OCCUPIED(vSpawnPos - <<1.5, 1.5, 1.5>>, vSpawnPos + <<1.5, 1.5, 1.5>>, FALSE, TRUE, FALSE, FALSE, FALSE)
fHeadingFromNodeToPlayer = GET_HEADING_FROM_VECTOR_2D(vPlayerPos.x - vSpawnPos.x, vPlayerPos.y - vSpawnPos.y)
fHeadingDiff = ABSF(fHeadingFromNodeToPlayer - fClosestNodeHeading)
IF fHeadingDiff > 180.0
fHeadingDiff = ABSF(fHeadingDiff - 360.0)
ENDIF
IF fHeadingDiff < 90.0
fSpawnHeading = fClosestNodeHeading
ELSE
fSpawnHeading = fClosestNodeHeading + 180.0
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN("Cop spawn: ", vSpawnPos, " ", fSpawnHeading)
#ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF*/
//VECTOR vInitialSpawnPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), <<0.0, fDistanceFromPlayer, 0.0>>)
//GET_NTH_CLOSEST_VEHICLE_NODE_FAVOUR_DIRECTION(vInitialSpawnPos, GET_ENTITY_COORDS(PLAYER_PED_ID()), 1, vSpawnPos, fSpawnHeading)
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Looks after any chase events that aren't part of the uber recording.
PROC UPDATE_CHASE_SET_PIECES()
CONST_INT TRAILER_SETPIECE_RIGHT 0
CONST_INT TRAILER_SETPIECE_LEFT 1
CONST_INT FINAL_CHOPPER_INDEX 5
CONST_INT COP_CRASH_SETPIECE_ID 9
CONST_INT GAS_TRUCK_SETPIECE_ID 15
CONST_INT COP_CRASH_SETPIECE_ID_2 18
SEQUENCE_INDEX seq
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
BOOL bCreatedAnEntityThisFrame = FALSE
REQUEST_MODEL(modelCop)
INT i = 0
REPEAT COUNT_OF(SetPieceCarID) i
//One of the set-piece cars is an articulated truck, the trailer is not part of the uber chase
IF i = 0 OR i = 1
AND SetPieceCarModel[i] = PACKER
INT iTrailerIndex = 0
INT iCarrec = CARREC_TRAILER_RIGHT
IF i = TRAILER_SETPIECE_LEFT
iTrailerIndex = 1
iCarrec = CARREC_TRAILER_LEFT
ELIF i = TRAILER_SETPIECE_RIGHT
//Use different recordings depending on if the player picked a bad truck driver.
IF bPickedGoodTruckDriver
iCarrec = CARREC_TRAILER_RIGHT
ELSE
iCarrec = CARREC_TRAILER_RIGHT_BAD
ENDIF
ENDIF
IF SetPieceCarStartime[i] - fChasePlaybackTime < 30000.0
REQUEST_VEHICLE_RECORDING(iCarrec, strCarrec)
ENDIF
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[i])
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_RAMP")
REQUEST_ANIM_DICT(strTrailerRampAnims)
REQUEST_PTFX_ASSET()
IF i = TRAILER_SETPIECE_RIGHT
SETUP_REQ_CHASE_TUNNEL_INTERIOR_LOADED()
ENDIF
IF NOT DOES_ENTITY_EXIST(vehTrailer[iTrailerIndex])
IF SetPieceCarStartime[i] + 10000.0 > fChasePlaybackTime
REQUEST_MODEL(modelEndTrailers)
//REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_RAMP")
IF HAS_MODEL_LOADED(modelEndTrailers)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrec, strCarrec)
AND NOT bCreatedAnEntityThisFrame
vehTrailer[iTrailerIndex] = CREATE_VEHICLE(modelEndTrailers, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(SetPieceCarID[i], <<0.0, -10.0, 0.0>>),
GET_ENTITY_HEADING(SetPieceCarID[i]))
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehTrailer[iTrailerIndex], TRUE)
SET_VEHICLE_LOD_MULTIPLIER(vehTrailer[iTrailerIndex], 5.0)
SET_ENTITY_LOD_DIST(vehTrailer[iTrailerIndex], 1000)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(SetPieceCarID[i], TRUE)
SET_VEHICLE_LOD_MULTIPLIER(SetPieceCarID[i], 5.0)
SET_ENTITY_LOD_DIST(SetPieceCarID[i], 1000)
SET_MODEL_AS_NO_LONGER_NEEDED(modelEndTrailers)
bChaseTrailerReadyToDriveUp = FALSE
bChaseTrailerFrozen[iTrailerIndex] = FALSE
IF iTrailerIndex = 1
IF NOT IS_ENTITY_DEAD(sGoldCars[0].veh)
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[0].veh, vehTrailer[iTrailerIndex], FALSE)
ENDIF
IF NOT IS_ENTITY_DEAD(sGoldCars[1].veh)
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[1].veh, vehTrailer[iTrailerIndex], FALSE)
ENDIF
ENDIF
IF iTrailerIndex = 0
AND eMissionStage = STAGE_CHASE
IF NOT IS_ENTITY_DEAD(sGoldCars[2].veh)
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[2].veh, vehTrailer[iTrailerIndex], FALSE)
ENDIF
ENDIF
//Fix for 368573 - Lock the trucks at this point so the player can't jack them.
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(SetPieceCarID[i], FALSE)
IF iTrailerIndex = 0
SET_VEHICLE_COLOURS(SetPieceCarID[i], 73, 70)
SET_VEHICLE_EXTRA_COLOURS(SetPieceCarID[i], 63, 156)
ELSE
SET_VEHICLE_COLOURS(SetPieceCarID[i], 45, 40)
SET_VEHICLE_EXTRA_COLOURS(SetPieceCarID[i], 35, 156)
ENDIF
bCreatedAnEntityThisFrame = TRUE
ENDIF
ENDIF
ELSE
IF NOT IS_ENTITY_DEAD(vehTrailer[iTrailerIndex])
IF fChasePlaybackTime > 95000.0
//SET_VEHICLE_DOOR_OPEN(vehTrailer[iTrailerIndex], SC_DOOR_BOOT, TRUE, TRUE)
IF HAS_SOUND_FINISHED(iTrailerRampSounds[iTrailerIndex])
AND REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_RAMP")
PLAY_SOUND_FROM_ENTITY(iTrailerRampSounds[iTrailerIndex], "Truck_Ramp_Scrape", vehTrailer[iTrailerIndex], "BIG_SCORE_3A_SOUNDS")
ENDIF
ENDIF
IF iTrailerIndex = 1
OR NOT bChaseTrailerReadyToDriveUp
//Start playback on the trailer once playback starts on the front
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehTrailer[iTrailerIndex])
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[i])
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrec, strCarrec)
START_PLAYBACK_RECORDED_VEHICLE(vehTrailer[iTrailerIndex], iCarrec, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehTrailer[iTrailerIndex], GET_TIME_POSITION_IN_RECORDING(SetPieceCarID[i]))
//FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehTrailer[iTrailerIndex])
ENDIF
ENDIF
ELSE
SET_PLAYBACK_SPEED(vehTrailer[iTrailerIndex], TRAILER_SETPIECE_SPEED * fChasePlaybackSpeed)
ENDIF
ENDIF
//New version: uses a custom anim.
IF HAS_ANIM_DICT_LOADED(strTrailerRampAnims)
AND HAS_PTFX_ASSET_LOADED()
IF NOT bChaseTrailerFrozen[iTrailerIndex]
IF NOT IS_ENTITY_PLAYING_ANIM(vehTrailer[iTrailerIndex], strTrailerRampAnims, "Trailer3_Door_Open")
PLAY_ENTITY_ANIM(vehTrailer[iTrailerIndex], "Trailer3_Door_Open", strTrailerRampAnims, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.9, ENUM_TO_INT(AF_USE_KINEMATIC_PHYSICS))
//PLAY_ENTITY_ANIM(vehTrailer[iTrailerIndex], "Trailer3_Door_Open", strTrailerRampAnims, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.9)
SET_VEHICLE_INACTIVE_DURING_PLAYBACK(vehTrailer[iTrailerIndex], TRUE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehTrailer[iTrailerIndex], FALSE)
bChaseTrailerFrozen[iTrailerIndex] = TRUE
IF iTrailerIndex = 0
ptfxRampSparks[0] = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_bigscore_ramp_sparks", vehTrailer[iTrailerIndex], <<0.23, -9.6955, -3.0130>>, <<0.0, 0.0, 0.0>>)
ptfxRampSparks[1] = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_bigscore_ramp_sparks", vehTrailer[iTrailerIndex], <<1.3358, -9.6955, -3.0130>>, <<0.0, 0.0, 0.0>>)
ELSE
ptfxRampSparks[2] = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_bigscore_ramp_sparks", vehTrailer[iTrailerIndex], <<0.23, -9.6355, -2.9630>>, <<0.0, 0.0, 0.0>>)
ptfxRampSparks[3] = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_bigscore_ramp_sparks", vehTrailer[iTrailerIndex], <<1.3358, -9.6355, -2.9630>>, <<0.0, 0.0, 0.0>>)
ENDIF
ENDIF
ENDIF
ENDIF
//Old version: uses the open door commands.
/*IF iTrailerIndex = 0
OR eMissionStage != STAGE_CHASE
IF NOT bChaseTrailerFrozen[iTrailerIndex]
IF GET_VEHICLE_DOOR_ANGLE_RATIO(vehTrailer[iTrailerIndex], SC_DOOR_BOOT) > 0.9 AND GET_VEHICLE_DOOR_ANGLE_RATIO(vehTrailer[iTrailerIndex], SC_DOOR_BOOT) < 1.1
SET_VEHICLE_INACTIVE_DURING_PLAYBACK(vehTrailer[iTrailerIndex], TRUE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehTrailer[iTrailerIndex], FALSE)
bChaseTrailerFrozen[iTrailerIndex] = TRUE
ENDIF
ELSE
IF GET_VEHICLE_DOOR_ANGLE_RATIO(vehTrailer[iTrailerIndex], SC_DOOR_BOOT) < 0.85 OR GET_VEHICLE_DOOR_ANGLE_RATIO(vehTrailer[iTrailerIndex], SC_DOOR_BOOT) > 1.1
SET_VEHICLE_INACTIVE_DURING_PLAYBACK(vehTrailer[iTrailerIndex], FALSE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehTrailer[iTrailerIndex], TRUE)
bChaseTrailerFrozen[iTrailerIndex] = FALSE
ENDIF
ENDIF
ENDIF*/
ENDIF
ENDIF
ELSE
REMOVE_VEHICLE(vehTrailer[iTrailerIndex])
ENDIF
ENDIF
IF eMissionStage = STAGE_CHASE
IF SetPieceCarModel[i] = POLICE3
OR SetPieceCarModel[i] = POLICE
IF NOT IS_ENTITY_DEAD(SetPieceCarID[i])
//If the cars stop have the peds get out and fight.
IF SetPieceCarProgress[i] > 2
AND fChasePlaybackTime - SetPieceCarStartime[i] > 2000.0
PED_INDEX pedDriver = GET_PED_IN_VEHICLE_SEAT(SetPieceCarID[i], VS_DRIVER)
IF NOT IS_PED_INJURED(pedDriver)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[i])
OR (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[i])
AND (GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(SetPieceCarRecording[i], strCarrec) - ((fChasePlaybackTime - SetPieceCarStartime[i]) * SetPieceCarRecordingSpeed[i]) < 2000.0)
AND GET_ENTITY_SPEED(SetPieceCarID[i]) < 0.5)
IF GET_SCRIPT_TASK_STATUS(pedDriver, SCRIPT_TASK_COMBAT) != PERFORMING_TASK
AND NOT IS_PED_IN_COMBAT(pedDriver)
SET_PED_RELATIONSHIP_GROUP_HASH(pedDriver, relGroupCops)
SET_PED_COMBAT_ATTRIBUTES(pedDriver, CA_USE_VEHICLE, FALSE)
IF NOT HAS_PED_GOT_WEAPON(pedDriver, WEAPONTYPE_PISTOL)
GIVE_WEAPON_TO_PED(pedDriver, WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(pedDriver, WEAPONTYPE_PISTOL, TRUE)
SET_PED_COMBAT_PARAMS(pedDriver, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(pedDriver, 200.0)
//TASK_COMBAT_PED(pedDriver, PLAYER_PED_ID())
SET_PED_KEEP_TASK(pedDriver, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedDriver, FALSE)
SET_PED_AS_NO_LONGER_NEEDED(pedDriver)
ENDIF
ELSE
//Tell them to driveby the player
IF GET_SCRIPT_TASK_STATUS(pedDriver, SCRIPT_TASK_DRIVE_BY) != PERFORMING_TASK
SET_PED_RELATIONSHIP_GROUP_HASH(pedDriver, relGroupCops)
IF NOT HAS_PED_GOT_WEAPON(pedDriver, WEAPONTYPE_PISTOL)
GIVE_WEAPON_TO_PED(pedDriver, WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(pedDriver, WEAPONTYPE_PISTOL, TRUE)
SET_PED_COMBAT_PARAMS(pedDriver, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
TASK_DRIVE_BY(pedDriver, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 100, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedDriver, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF eMissionStage = STAGE_CHASE //Don't do this stuff if debugging the chase.
//have the chopper do near miss bullets
IF SetPieceCarModel[FINAL_CHOPPER_INDEX] = POLMAV
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[FINAL_CHOPPER_INDEX])
AND IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
//Add a gunner on the back.
IF NOT DOES_ENTITY_EXIST(pedHeliGunner)
IF HAS_MODEL_LOADED(modelCop)
AND NOT bCreatedAnEntityThisFrame
AND NOT bCreatedUberPlaybackEntityThisFrame
pedHeliGunner = CREATE_PED_INSIDE_VEHICLE(SetPieceCarID[FINAL_CHOPPER_INDEX], PEDTYPE_COP, modelCop, VS_BACK_RIGHT)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(pedHeliGunner, "BS_2A_CHASE_TUNNEL_CHOPPER_GUNMAN_GROUP")
GIVE_WEAPON_TO_PED(pedHeliGunner, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, TRUE)
TASK_AIM_GUN_AT_ENTITY(pedHeliGunner, sGoldCars[1].veh, -1)
SET_PED_ACCURACY(pedHeliGunner, 1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedHeliGunner, TRUE)
bCreatedAnEntityThisFrame = TRUE
ENDIF
ELIF NOT IS_PED_INJURED(pedHeliGunner)
VECTOR vRandom = <<GET_RANDOM_FLOAT_IN_RANGE(-1.5, 1.5), GET_RANDOM_FLOAT_IN_RANGE(-0.5, 0.5), 0.0>>
//The burst timer picks a random amount of time to shoot, followed by 500ms wait.
IF iHeliBurstTimer = 0 OR iHeliBurstTimer > 2400
iHeliBurstTimer = GET_RANDOM_INT_IN_RANGE(1000, 1250)
ENDIF
IF HAS_PED_GOT_WEAPON(pedHeliGunner, WEAPONTYPE_CARBINERIFLE)
WEAPON_TYPE eCurrentWeapon
GET_CURRENT_PED_WEAPON(pedHeliGunner, eCurrentWeapon)
IF eCurrentWeapon != WEAPONTYPE_CARBINERIFLE
SET_CURRENT_PED_WEAPON(pedHeliGunner, WEAPONTYPE_CARBINERIFLE, TRUE)
ENDIF
ENDIF
IF GET_SCRIPT_TASK_STATUS(pedHeliGunner, SCRIPT_TASK_AIM_GUN_AT_ENTITY) != PERFORMING_TASK
TASK_AIM_GUN_AT_ENTITY(pedHeliGunner, sGoldCars[1].veh, -1)
ENDIF
IF iHeliBurstTimer < 2000
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(pedHeliGunner)
IF fChasePlaybackTime > 91000.0 AND fChasePlaybackTime < 101000.0
SET_PED_SHOOTS_AT_COORD(pedHeliGunner, GET_ENTITY_COORDS(sGoldCars[1].veh) + vRandom)
ELIF fChasePlaybackTime > 101000.0
SET_PED_SHOOTS_AT_COORD(pedHeliGunner, GET_ENTITY_COORDS(sGoldCars[PLAYERS_GOLD_CAR].veh) + vRandom)
ENDIF
SET_AMMO_IN_CLIP(pedHeliGunner, WEAPONTYPE_CARBINERIFLE, 30)
ENDIF
ENDIF
//Dialogue for the gunner shouting
IF fChasePlaybackTime > 91000.0 AND fChasePlaybackTime < 105000.0
IF GET_GAME_TIMER() - iChaseHeliDialogueTimer > 0
IF sConversationPeds.PedInfo[6].Index != pedHeliGunner
ADD_PED_FOR_DIALOGUE(sConversationPeds, 6, pedHeliGunner, "BS2ACopHeli")
ELSE
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedHeliGunner)) < 10000.0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_TANN", CONV_PRIORITY_MEDIUM)
iChaseHeliDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 15000)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Police barricade by building site
IF DOES_ENTITY_EXIST(ParkedCarID[0])
REPEAT COUNT_OF(pedChaseCops) i
IF NOT DOES_ENTITY_EXIST(pedChaseCops[i])
bPlayerReachedBuildingSiteBlockade = FALSE
IF NOT bCreatedAnEntityThisFrame
AND NOT bCreatedUberPlaybackEntityThisFrame
AND HAS_MODEL_LOADED(modelCop)
IF i = 0
pedChaseCops[0] = CREATE_PED(PEDTYPE_COP, modelCop, <<160.7507, -401.0259, 40.3883>>, 169.4078)
ELIF i = 1
pedChaseCops[1] = CREATE_PED(PEDTYPE_COP, modelCop, <<155.0481, -398.6294, 40.4022>>, 154.8844)
ELIF i = 2
pedChaseCops[2] = CREATE_PED(PEDTYPE_COP, modelCop, <<149.0505, -395.9275, 40.2201>>, 167.5788)
ELIF i = 3
pedChaseCops[3] = CREATE_PED(PEDTYPE_COP, modelCop, <<170.8870, -404.8884, 40.3226>>, 158.9191)
ENDIF
GIVE_WEAPON_TO_PED(pedChaseCops[i], WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
SET_PED_COMBAT_AI(pedChaseCops[i], 0, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER, GET_ENTITY_COORDS(pedChaseCops[i]) - <<0.0, 0.0, 1.0>>, 2.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedChaseCops[i], TRUE)
bCreatedAnEntityThisFrame = TRUE
ENDIF
ELSE
IF NOT IS_PED_INJURED(pedChaseCops[i])
IF GET_SCRIPT_TASK_STATUS(pedChaseCops[i], SCRIPT_TASK_COMBAT) != PERFORMING_TASK
TASK_COMBAT_PED(pedChaseCops[i], PLAYER_PED_ID())
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF DOES_ENTITY_EXIST(pedChaseCops[0])
IF NOT bPlayerReachedBuildingSiteBlockade
IF VDIST2(GET_ENTITY_COORDS(pedChaseCops[0], FALSE), vPlayerPos) < 1600.0
bPlayerReachedBuildingSiteBlockade = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF DOES_ENTITY_EXIST(pedChaseCops[0])
IF bPlayerReachedBuildingSiteBlockade
OR (fChasePlaybackTime > 70000.0 AND fChasePlaybackSpeed > 0.7)
REPEAT COUNT_OF(pedChaseCops) i
REMOVE_PED(pedChaseCops[i])
ENDREPEAT
ENDIF
ENDIF
ENDIF
//Barricade by the shopping mall.
IF DOES_ENTITY_EXIST(ParkedCarID[19]) //This is bad: if the parked array changes this number won't work and needs to be maintained.
IF DOES_ENTITY_EXIST(pedChaseBlockadeMall[0])
IF NOT bPlayerReachedRockfordBlockade
IF VDIST2(GET_ENTITY_COORDS(pedChaseBlockadeMall[0], FALSE), vPlayerPos) < 1600.0
bPlayerReachedRockfordBlockade = TRUE
ENDIF
ENDIF
ELSE
bPlayerReachedRockfordBlockade = FALSE
ENDIF
REPEAT COUNT_OF(pedChaseBlockadeMall) i
IF NOT DOES_ENTITY_EXIST(pedChaseBlockadeMall[i])
IF NOT bCreatedAnEntityThisFrame
AND NOT bCreatedUberPlaybackEntityThisFrame
AND HAS_MODEL_LOADED(modelCop)
IF i = 0
pedChaseBlockadeMall[0] = CREATE_PED(PEDTYPE_COP, modelCop, <<-129.8845, -213.4072, 43.7800 >>, 248.4384)
ELIF i = 1
pedChaseBlockadeMall[1] = CREATE_PED(PEDTYPE_COP, modelCop, <<-130.4947, -216.9322, 43.8199 >>, 246.0174)
ENDIF
bCreatedAnEntityThisFrame = TRUE
ENDIF
ELSE
IF NOT IS_PED_INJURED(pedChaseBlockadeMall[i])
IF GET_SCRIPT_TASK_STATUS(pedChaseBlockadeMall[i], SCRIPT_TASK_COMBAT) != PERFORMING_TASK
GIVE_WEAPON_TO_PED(pedChaseBlockadeMall[i], WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
SET_PED_COMBAT_PARAMS(pedChaseBlockadeMall[i], 0, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_PED_SPHERE_DEFENSIVE_AREA(pedChaseBlockadeMall[i], GET_ENTITY_COORDS(pedChaseBlockadeMall[i]) - <<0.0, 0.0, 1.0>>, 2.0)
TASK_COMBAT_PED(pedChaseBlockadeMall[i], PLAYER_PED_ID())
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedChaseBlockadeMall[i], TRUE)
ENDIF
ENDIF
ENDIF
ENDREPEAT
ELSE
IF DOES_ENTITY_EXIST(pedChaseBlockadeMall[0])
IF bPlayerReachedRockfordBlockade
OR (fChasePlaybackTime > 80000.0 AND fChasePlaybackSpeed > 0.7)
REPEAT COUNT_OF(pedChaseBlockadeMall) i
REMOVE_PED(pedChaseBlockadeMall[i])
ENDREPEAT
ENDIF
ENDIF
ENDIF
//Barricade by the freeway
IF DOES_ENTITY_EXIST(ParkedCarID[3])
IF NOT DOES_ENTITY_EXIST(pedChaseBlockade2[0])
bPlayerReachedFreewayBlockade = FALSE
ELSE
IF NOT bPlayerReachedFreewayBlockade
IF VDIST2(GET_ENTITY_COORDS(pedChaseBlockade2[0], FALSE), vPlayerPos) < 1600.0
bPlayerReachedFreewayBlockade = TRUE
ENDIF
ENDIF
ENDIF
REPEAT COUNT_OF(pedChaseBlockade2) i
IF NOT DOES_ENTITY_EXIST(pedChaseBlockade2[i])
IF NOT bCreatedAnEntityThisFrame
AND NOT bCreatedUberPlaybackEntityThisFrame
AND HAS_MODEL_LOADED(modelCop)
IF i = 0
pedChaseBlockade2[0] = CREATE_PED(PEDTYPE_COP, modelCop, <<-625.3889, -484.0737, 33.6511>>, 22.7602)
ELIF i = 1
pedChaseBlockade2[1] = CREATE_PED(PEDTYPE_COP, modelCop, <<-637.7578, -484.6165, 33.8128>>, 342.2310)
ELIF i = 2
pedChaseBlockade2[2] = CREATE_PED(PEDTYPE_COP, modelCop, <<-642.2914, -485.0347, 33.8047>>, 6.3428)
ELIF i = 3
pedChaseBlockade2[3] = CREATE_PED(PEDTYPE_COP, modelCop, <<-645.7305, -485.9541, 33.6879>>, 9.5655)
ENDIF
bCreatedAnEntityThisFrame = TRUE
ENDIF
ELSE
IF NOT IS_PED_INJURED(pedChaseBlockade2[i])
IF GET_SCRIPT_TASK_STATUS(pedChaseBlockade2[i], SCRIPT_TASK_COMBAT) != PERFORMING_TASK
GIVE_WEAPON_TO_PED(pedChaseBlockade2[i], WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
SET_PED_COMBAT_PARAMS(pedChaseBlockade2[i], 0, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
SET_PED_SPHERE_DEFENSIVE_AREA(pedChaseBlockade2[i], GET_ENTITY_COORDS(pedChaseBlockade2[i]), 4.0)
TASK_COMBAT_PED(pedChaseBlockade2[i], PLAYER_PED_ID())
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedChaseBlockade2[i], TRUE)
ENDIF
ENDIF
ENDIF
ENDREPEAT
ELSE
IF DOES_ENTITY_EXIST(pedChaseBlockade2[0])
IF bPlayerReachedFreewayBlockade
OR (IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh) AND IS_ENTITY_ATTACHED(sGoldCars[0].veh))
REPEAT COUNT_OF(pedChaseBlockade2) i
REMOVE_PED(pedChaseBlockade2[i])
ENDREPEAT
ENDIF
ENDIF
ENDIF
ENDIF
//Two cops create a barricade just before the freeway, if the player picked the bad driver they'll get caught here.
//NOTE: this is not done as part of the uber as we need control of the ped actions, and to guarantee that the cops appear.
FLOAT fBlockadePlaybackStartTime = 75000.0
IF NOT sChaseCopsBlockade[0].bIsCreated
IF NOT bCreatedUberPlaybackEntityThisFrame
AND NOT bCreatedAnEntityThisFrame
IF NOT DOES_ENTITY_EXIST(vehChaseCopsBlockade[0])
IF fChasePlaybackTime > fBlockadePlaybackStartTime - 10000.0
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_COPS_BLOCKADE, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_COPS_BLOCKADE_2, strCarrec)
REQUEST_MODEL(modelCopCar)
IF HAS_MODEL_LOADED(modelCop)
AND HAS_MODEL_LOADED(modelCopCar)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_COPS_BLOCKADE, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_COPS_BLOCKADE_2, strCarrec)
IF fChasePlaybackTime > fBlockadePlaybackStartTime - 4000.0
vehChaseCopsBlockade[0] = CREATE_VEHICLE(modelCopCar, <<-680.7803, -351.3055, 34.2074>>)
SET_ENTITY_QUATERNION(vehChaseCopsBlockade[0], 0.0073, 0.0177, 0.8271, -0.5618)
FREEZE_ENTITY_POSITION(vehChaseCopsBlockade[0], TRUE)
ENDIF
ENDIF
ENDIF
ELIF NOT DOES_ENTITY_EXIST(vehChaseCopsBlockade[1])
vehChaseCopsBlockade[1] = CREATE_VEHICLE(modelCopCar, <<-687.9218, -348.7174, 34.2604>>)
FREEZE_ENTITY_POSITION(vehChaseCopsBlockade[1], TRUE)
SET_ENTITY_QUATERNION(vehChaseCopsBlockade[1], 0.0132, 0.0051, 0.8425, -0.5385)
ELIF NOT DOES_ENTITY_EXIST(sChaseCopsBlockade[0].ped)
sChaseCopsBlockade[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelCop, vehChaseCopsBlockade[0], VS_DRIVER, relGroupCops, 200, 0, WEAPONTYPE_PISTOL)
SET_ENTITY_INVINCIBLE(sChaseCopsBlockade[0].ped, TRUE)
ELIF NOT DOES_ENTITY_EXIST(sChaseCopsBlockade[1].ped)
sChaseCopsBlockade[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelCop, vehChaseCopsBlockade[0], VS_FRONT_RIGHT, relGroupCops, 200, 0, WEAPONTYPE_PISTOL)
SET_ENTITY_INVINCIBLE(sChaseCopsBlockade[1].ped, TRUE)
ELIF NOT DOES_ENTITY_EXIST(sChaseCopsBlockade[2].ped)
sChaseCopsBlockade[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelCop, vehChaseCopsBlockade[1], VS_DRIVER, relGroupCops, 200, 0, WEAPONTYPE_PISTOL)
SET_ENTITY_INVINCIBLE(sChaseCopsBlockade[2].ped, TRUE)
ELIF NOT DOES_ENTITY_EXIST(sChaseCopsBlockade[3].ped)
sChaseCopsBlockade[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelCop, vehChaseCopsBlockade[1], VS_FRONT_RIGHT, relGroupCops, 200, 0, WEAPONTYPE_PISTOL)
SET_ENTITY_INVINCIBLE(sChaseCopsBlockade[3].ped, TRUE)
REPEAT COUNT_OF(vehChaseCopsBlockade) i
IF NOT IS_ENTITY_DEAD(vehChaseCopsBlockade[i])
SET_VEHICLE_ENGINE_ON(vehChaseCopsBlockade[i], TRUE, TRUE)
SET_VEHICLE_STRONG(vehChaseCopsBlockade[i], TRUE)
SET_VEHICLE_LIGHTS(vehChaseCopsBlockade[i], FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_SIREN(vehChaseCopsBlockade[i], TRUE)
SET_SIREN_WITH_NO_DRIVER(vehChaseCopsBlockade[i], TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehChaseCopsBlockade[i], FALSE)
ENDIF
ENDREPEAT
REPEAT COUNT_OF(sChaseCopsBlockade) i
IF NOT IS_PED_INJURED(sChaseCopsBlockade[i].ped)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCopsBlockade[i].ped, TRUE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sChaseCopsBlockade[i].ped, TRUE)
SET_PED_SUFFERS_CRITICAL_HITS(sChaseCopsBlockade[i].ped, FALSE)
SET_PED_CONFIG_FLAG(sChaseCopsBlockade[i].ped, PCF_WillFlyThroughWindscreen, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCopsBlockade[i].ped, TRUE)
sChaseCopsBlockade[i].iEvent = 0
ENDIF
ENDREPEAT
SET_MODEL_AS_NO_LONGER_NEEDED(modelCopCar)
INITIALISE_ENEMY_GROUP(sChaseCopsBlockade, "Block ")
ENDIF
ENDIF
ELSE
INT iCarThisPedIsIn
//Handle the peds: if the player picked a good driver they just get out and fight, otherwise they try to arrest the bad driver who stops in front of them.
REPEAT COUNT_OF(sChaseCopsBlockade) i
IF DOES_ENTITY_EXIST(sChaseCopsBlockade[i].ped)
IF NOT IS_PED_INJURED(sChaseCopsBlockade[i].ped)
iCarThisPedIsIn = i / 2
SWITCH sChaseCopsBlockade[i].iEvent
CASE 0
IF i = 0
IF fChasePlaybackTime >= fBlockadePlaybackStartTime
IF NOT IS_ENTITY_DEAD(vehChaseCopsBlockade[0])
FREEZE_ENTITY_POSITION(vehChaseCopsBlockade[0], FALSE)
START_PLAYBACK_RECORDED_VEHICLE_WITH_FLAGS(vehChaseCopsBlockade[0], CARREC_CHASE_COPS_BLOCKADE, strCarrec,
ENUM_TO_INT(SWITCH_ON_PLAYER_VEHICLE_IMPACT) | ENUM_TO_INT(TURN_ON_ENGINE_INSTANTLY))
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehChaseCopsBlockade[0], fChasePlaybackTime - fBlockadePlaybackStartTime)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehChaseCopsBlockade[0])
SET_PLAYBACK_SPEED(vehChaseCopsBlockade[0], fChasePlaybackSpeed)
ENDIF
IF NOT IS_ENTITY_DEAD(vehChaseCopsBlockade[1])
FREEZE_ENTITY_POSITION(vehChaseCopsBlockade[1], FALSE)
START_PLAYBACK_RECORDED_VEHICLE_WITH_FLAGS(vehChaseCopsBlockade[1], CARREC_CHASE_COPS_BLOCKADE_2, strCarrec,
ENUM_TO_INT(SWITCH_ON_PLAYER_VEHICLE_IMPACT) | ENUM_TO_INT(TURN_ON_ENGINE_INSTANTLY))
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehChaseCopsBlockade[1], fChasePlaybackTime - fBlockadePlaybackStartTime)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehChaseCopsBlockade[1])
SET_PLAYBACK_SPEED(vehChaseCopsBlockade[1], fChasePlaybackSpeed)
ENDIF
SET_ENTITY_INVINCIBLE(sChaseCopsBlockade[i].ped, FALSE)
sChaseCopsBlockade[i].iEvent++
ENDIF
ELSE
IF NOT IS_ENTITY_DEAD(vehChaseCopsBlockade[iCarThisPedIsIn])
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChaseCopsBlockade[iCarThisPedIsIn])
SET_ENTITY_INVINCIBLE(sChaseCopsBlockade[i].ped, FALSE)
sChaseCopsBlockade[i].iEvent++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1 //Once their car stops get them out and fighting
IF NOT IS_ENTITY_DEAD(vehChaseCopsBlockade[iCarThisPedIsIn])
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChaseCopsBlockade[iCarThisPedIsIn])
SET_PED_RELATIONSHIP_GROUP_HASH(sChaseCopsBlockade[i].ped, relGroupCops)
SET_PED_COMBAT_ATTRIBUTES(sChaseCopsBlockade[i].ped, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sChaseCopsBlockade[i].ped, CA_DO_DRIVEBYS, FALSE)
IF NOT HAS_PED_GOT_WEAPON(sChaseCopsBlockade[i].ped, WEAPONTYPE_PISTOL)
GIVE_WEAPON_TO_PED(sChaseCopsBlockade[i].ped, WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(sChaseCopsBlockade[i].ped, WEAPONTYPE_PISTOL, TRUE)
IF NOT bPickedGoodCarDriver
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
OPEN_SEQUENCE_TASK(seq)
TASK_LEAVE_VEHICLE(NULL, vehChaseCopsBlockade[iCarThisPedIsIn], ECF_DONT_CLOSE_DOOR)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, GET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped), sCrew[CREW_DRIVER].ped, PEDMOVE_WALK, FALSE, 4.0, 5.0)
TASK_AIM_GUN_AT_ENTITY(NULL, sCrew[CREW_DRIVER].ped, -1)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sChaseCopsBlockade[i].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
//TASK_ARREST_PED(sChaseCopsBlockade[i].ped, sCrew[CREW_DRIVER].ped)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCopsBlockade[i].ped, TRUE)
ELSE
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sChaseCopsBlockade[i].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCopsBlockade[i].ped, FALSE)
ENDIF
//This is a good moment to record some footage of the blockade driving in and the player swerving around.
IF i = 0
REPLAY_RECORD_BACK_FOR_TIME(3.0)
ENDIF
sChaseCopsBlockade[i].iEvent++
ENDIF
ENDIF
BREAK
CASE 2 //If the player hurts one of the cops while they're trying to arrest the driver put them into combat.
IF NOT IS_PED_IN_COMBAT(sChaseCopsBlockade[i].ped)
IF VDIST2(vPlayerPos, GET_ENTITY_COORDS(sChaseCopsBlockade[i].ped)) < 16.0
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sChaseCopsBlockade[i].ped, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCopsBlockade[i].ped, FALSE)
sChaseCopsBlockade[i].iEvent++
ENDIF
ENDIF
BREAK
ENDSWITCH
ELSE
CLEAN_UP_ENEMY_PED(sChaseCopsBlockade[i])
ENDIF
ENDIF
ENDREPEAT
//Handle the cars: set them as no longer needed once the recording stops.
REPEAT COUNT_OF(vehChaseCopsBlockade) i
IF DOES_ENTITY_EXIST(vehChaseCopsBlockade[i])
IF NOT IS_ENTITY_DEAD(vehChaseCopsBlockade[i])
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChaseCopsBlockade[i])
SET_PLAYBACK_SPEED(vehChaseCopsBlockade[i], fChasePlaybackSpeed)
ELSE
IF fChasePlaybackTime > fBlockadePlaybackStartTime + 5000.0
REMOVE_VEHICLE(vehChaseCopsBlockade[i])
ENDIF
ENDIF
ELSE
REMOVE_VEHICLE(vehChaseCopsBlockade[i])
ENDIF
ENDIF
ENDREPEAT
ENDIF
//If the player picked a bad crew member to drive, they crash half-way through the chase.
IF (NOT bPickedGoodCarDriver) AND eMissionStage = STAGE_CHASE
IF fChasePlaybackTime > 70000.0
IF DOES_ENTITY_EXIST(sGoldCars[2].veh)
IF NOT IS_ENTITY_DEAD(sGoldCars[2].veh)
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SWITCH sGoldCars[2].iEvent
CASE 0
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[2].veh)
TASK_HANDS_UP(sCrew[CREW_DRIVER].ped, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_DRIVER].ped, TRUE)
IF DOES_BLIP_EXIST(sGoldCars[2].blip)
REMOVE_BLIP(sGoldCars[2].blip)
ENDIF
//Remove a quarter of the take.
iTakePenaltyCrewDies = iMaxTakeConsideringCrew / 4
iCurrentTake -= iTakePenaltyCrewDies
sGoldCars[2].iEvent++
ELSE
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT bHasTextLabelTriggered[FH3A_SPIN]
IF fChasePlaybackTime > 81500.0
IF fChasePlaybackTime < 82250.0
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_SPIN", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_SPIN] = TRUE
bMichaelSaidInstructionInChase = FALSE //We don't want crew responses to Michael's isntructions triggering after this dialogue.
ENDIF
ELSE
bHasTextLabelTriggered[FH3A_SPIN] = TRUE
ENDIF
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_CRSH]
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_CRSH", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_CRSH] = TRUE
bMichaelSaidInstructionInChase = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1 //If the player kills all of the cops trying to arrest the driver then he drives off. If the player drives off then kill the driver so they're removed.
IF IS_ENEMY_GROUP_DEAD(sChaseCopsBlockade)
OPEN_SEQUENCE_TASK(seq)
IF NOT IS_PED_IN_VEHICLE(NULL, sGoldCars[2].veh)
TASK_ENTER_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldCars[2].veh)
ENDIF
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, sGoldCars[2].veh, <<-854.9, 207.1, 73.0>>, 40.0, DRIVINGMODE_AVOIDCARS, 10.0)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sCrew[CREW_DRIVER].ped, seq)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_DRIVER].ped, TRUE)
CLEAR_SEQUENCE_TASK(seq)
//Add the previously moved take back.
iCurrentTake += (iMaxTakeConsideringCrew / 4)
iTakePenaltyCrewDies = 0
sGoldCars[2].iEvent++
ELSE
IF VDIST2(GET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped), vPlayerPos) > 6400.0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT bHasTextLabelTriggered[FH3A_KILL]
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_KILL", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_KILL] = TRUE
bMichaelSaidInstructionInChase = FALSE //We don't want crew responses to Michael's isntructions triggering after this dialogue.
ENDIF
ELSE
APPLY_DAMAGE_TO_PED(sCrew[CREW_DRIVER].ped, GET_ENTITY_HEALTH(sCrew[CREW_DRIVER].ped) + 50, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2 //Delete the driver eventually once they get away, and flag them as having been rescued.
IF DOES_ENTITY_EXIST(sGoldCars[2].veh)
IF NOT bHasTextLabelTriggered[FH3A_SAVE]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_SAVE", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_SAVE] = TRUE
ENDIF
ENDIF
ENDIF
IF VDIST2(GET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped, FALSE), vPlayerPos) > 10000.0
OR (IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh) AND IS_ENTITY_ATTACHED(sGoldCars[PLAYERS_GOLD_CAR].veh))
g_bBigScore2ARescuedBadDriver = TRUE
REMOVE_PED(sCrew[CREW_DRIVER].ped)
REMOVE_VEHICLE(sGoldCars[2].veh)
ENDIF
ENDIF
BREAK
ENDSWITCH
ELSE
REMOVE_PED(sCrew[CREW_DRIVER].ped)
REMOVE_VEHICLE(sGoldCars[2].veh)
IF DOES_BLIP_EXIST(sGoldCars[2].blip)
REMOVE_BLIP(sGoldCars[2].blip)
ENDIF
ENDIF
ELSE
REMOVE_PED(sCrew[CREW_DRIVER].ped)
REMOVE_VEHICLE(sGoldCars[2].veh)
IF DOES_BLIP_EXIST(sGoldCars[2].blip)
REMOVE_BLIP(sGoldCars[2].blip)
ENDIF
ENDIF
ENDIF
ENDIF
//Cop car: if player picked good driver this car crashes
IF SetPieceCarModel[COP_CRASH_SETPIECE_ID_2] = POLICE3
OR SetPieceCarModel[COP_CRASH_SETPIECE_ID_2] = POLICE
IF NOT IS_ENTITY_DEAD(SetPieceCarID[COP_CRASH_SETPIECE_ID_2])
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[COP_CRASH_SETPIECE_ID_2])
FLOAT fTime = GET_TIME_POSITION_IN_RECORDING(SetPieceCarID[COP_CRASH_SETPIECE_ID_2])
IF GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(SetPieceCarRecording[COP_CRASH_SETPIECE_ID_2], strCarrec) - fTime < 500.0
PED_INDEX pedDriver = GET_PED_IN_VEHICLE_SEAT(SetPieceCarID[COP_CRASH_SETPIECE_ID_2])
IF NOT IS_PED_INJURED(pedDriver)
SET_ENTITY_HEALTH(pedDriver, 0)
ENDIF
ENDIF
IF NOT IS_VEHICLE_TYRE_BURST(SetPieceCarID[COP_CRASH_SETPIECE_ID_2], SC_WHEEL_CAR_REAR_LEFT)
IF fChasePlaybackTime > 44300.0
SET_VEHICLE_TYRE_BURST(SetPieceCarID[COP_CRASH_SETPIECE_ID_2], SC_WHEEL_CAR_REAR_LEFT, TRUE)
ENDIF
ENDIF
IF NOT bPlayedCopCrashSound
IF fChasePlaybackTime > 44800.0
//This is a good moment to record footage of the car flipping.
REPLAY_RECORD_BACK_FOR_TIME(1.0)
//PLAY_SOUND_FROM_ENTITY(-1, "Cop_Car_Flipped", SetPieceCarID[COP_CRASH_SETPIECE_ID_2], "BIG_SCORE_3A_SOUNDS")
bPlayedCopCrashSound = TRUE
ENDIF
ENDIF
ENDIF
ELSE
bPlayedCopCrashSound = FALSE
ENDIF
ENDIF
//Gas tanker: blows up when police car crashes into it.
IF SetPieceCarModel[GAS_TRUCK_SETPIECE_ID] = PACKER
IF SetPieceCarProgress[GAS_TRUCK_SETPIECE_ID] < 99
AND fChasePlaybackTime < SetPieceCarStartime[GAS_TRUCK_SETPIECE_ID] + 10000.0
IF fChasePlaybackTime > SetPieceCarStartime[GAS_TRUCK_SETPIECE_ID] - 10000.0
AND NOT DOES_ENTITY_EXIST(vehTanker)
REQUEST_MODEL(TANKER)
ENDIF
REQUEST_VEHICLE_RECORDING(CARREC_GAS_TANKER, strCarrec)
ENDIF
IF NOT IS_ENTITY_DEAD(SetPieceCarID[GAS_TRUCK_SETPIECE_ID])
IF NOT DOES_ENTITY_EXIST(vehTanker)
IF fChasePlaybackTime < SetPieceCarStartime[GAS_TRUCK_SETPIECE_ID] + 10000.0
REQUEST_MODEL(TANKER)
IF HAS_MODEL_LOADED(TANKER)
AND NOT bCreatedAnEntityThisFrame
AND NOT bCreatedUberPlaybackEntityThisFrame
vehTanker = CREATE_VEHICLE(TANKER, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(SetPieceCarID[GAS_TRUCK_SETPIECE_ID], <<0.0, -10.0, 0.0>>),
GET_ENTITY_HEADING(SetPieceCarID[GAS_TRUCK_SETPIECE_ID]))
ATTACH_VEHICLE_TO_TRAILER(SetPieceCarID[GAS_TRUCK_SETPIECE_ID], vehTanker)
SET_MODEL_AS_NO_LONGER_NEEDED(TANKER)
bCreatedAnEntityThisFrame = TRUE
ENDIF
ENDIF
ELSE
//IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[GAS_TRUCK_SETPIECE_ID])
//Control trailer playback.
IF NOT IS_ENTITY_DEAD(vehTanker)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehTanker)
IF fChasePlaybackTime < SetPieceCarStartime[GAS_TRUCK_SETPIECE_ID] + 3000.0
REQUEST_VEHICLE_RECORDING(CARREC_GAS_TANKER, strCarrec)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_GAS_TANKER, strCarrec)
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[GAS_TRUCK_SETPIECE_ID])
//START_PLAYBACK_RECORDED_VEHICLE_WITH_FLAGS(vehTanker, CARREC_GAS_TANKER, strCarrec, ENUM_TO_INT(SWITCH_ON_ANY_VEHICLE_IMPACT))
START_PLAYBACK_RECORDED_VEHICLE(vehTanker, CARREC_GAS_TANKER, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehTanker, GET_TIME_POSITION_IN_RECORDING(SetPieceCarID[GAS_TRUCK_SETPIECE_ID]))
ENDIF
ENDIF
ELSE
SET_PLAYBACK_SPEED(vehTanker, fChasePlaybackSpeed)
ENDIF
IF NOT IS_ENTITY_DEAD(SetPieceCarID[COP_CRASH_SETPIECE_ID])
IF IS_ENTITY_TOUCHING_ENTITY(vehTanker, SetPieceCarID[COP_CRASH_SETPIECE_ID])
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[COP_CRASH_SETPIECE_ID])
STOP_PLAYBACK_RECORDED_VEHICLE(SetPieceCarID[COP_CRASH_SETPIECE_ID])
ENDIF
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehTanker)
STOP_PLAYBACK_RECORDED_VEHICLE(vehTanker)
REMOVE_VEHICLE_RECORDING(CARREC_GAS_TANKER, strCarrec)
ENDIF
ENDIF
ENDIF
ENDIF
//ENDIF
ENDIF
IF eMissionStage = STAGE_CHASE
SWITCH iGasTankerExplosionEvent
CASE 0
bTankerCrashStreamActive = FALSE
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_EXPLOSION")
IF NOT IS_ENTITY_DEAD(vehTanker)
AND NOT IS_ENTITY_DEAD(SetPieceCarID[COP_CRASH_SETPIECE_ID])
IF IS_ENTITY_TOUCHING_ENTITY(vehTanker, SetPieceCarID[COP_CRASH_SETPIECE_ID])
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_EXPLOSION")
PLAY_SOUND_FROM_ENTITY(-1, "Gas_Tanker_Explosion", vehTanker, "BIG_SCORE_3A_SOUNDS")
ENDIF
bTankerCrashStreamActive = TRUE
EXPLODE_VEHICLE(SetPieceCarID[COP_CRASH_SETPIECE_ID])
iGasTankerExplosionTimer = GET_GAME_TIMER()
iGasTankerExplosionEvent++
ENDIF
ENDIF
BREAK
CASE 1
IF NOT IS_ENTITY_DEAD(vehTanker)
APPLY_FORCE_TO_ENTITY(vehTanker, APPLY_TYPE_FORCE, <<10.0, 0.0, 0.0>>, <<0.0, -5.0, 0.0>>, 0, TRUE, TRUE, TRUE)
IF GET_GAME_TIMER() - iGasTankerExplosionTimer > 300
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehTanker)
STOP_PLAYBACK_RECORDED_VEHICLE(vehTanker)
REMOVE_VEHICLE_RECORDING(CARREC_GAS_TANKER, strCarrec)
ENDIF
//APPLY_FORCE_TO_ENTITY(vehTanker, APPLY_TYPE_IMPULSE, <<3.0, 0.0, 0.0>>, <<0.0, -5.0, 0.0>>, 0, TRUE, TRUE, TRUE)
SET_VEHICLE_PETROL_TANK_HEALTH(vehTanker, -200)
ADD_EXPLOSION(GET_ENTITY_COORDS(vehTanker), EXP_TAG_TRUCK, 2.0)
EXPLODE_VEHICLE(vehTanker)
IF NOT IS_ENTITY_DEAD(SetPieceCarID[GAS_TRUCK_SETPIECE_ID])
SET_VEHICLE_PETROL_TANK_HEALTH(SetPieceCarID[GAS_TRUCK_SETPIECE_ID], -200)
EXPLODE_VEHICLE(SetPieceCarID[GAS_TRUCK_SETPIECE_ID])
ENDIF
REMOVE_VEHICLE(vehTanker, FALSE)
iGasTankerExplosionTimer = GET_GAME_TIMER()
iGasTankerExplosionEvent++
ENDIF
ENDIF
BREAK
CASE 2
IF NOT IS_ENTITY_DEAD(SetPieceCarID[GAS_TRUCK_SETPIECE_ID])
IF GET_GAME_TIMER() - iGasTankerExplosionTimer > 200
SET_VEHICLE_PETROL_TANK_HEALTH(SetPieceCarID[GAS_TRUCK_SETPIECE_ID], -200)
//EXPLODE_VEHICLE(SetPieceCarID[GAS_TRUCK_SETPIECE_ID])
iGasTankerExplosionTimer = GET_GAME_TIMER()
iGasTankerExplosionEvent++
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ELSE
IF fChasePlaybackTime > SetPieceCarStartime[GAS_TRUCK_SETPIECE_ID] + 20000.0
IF bTankerCrashStreamActive
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_EXPLOSION")
bTankerCrashStreamActive = FALSE
ENDIF
ENDIF
iGasTankerExplosionEvent = 0
iGasTankerExplosionTimer = 0
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("BS2A - Gas truck setpiece has changed ID, please update script to match.")
#ENDIF
ENDIF
//Make the gold cars invincible when the trailer blows up.
IF NOT bMichaelInvincibleDuringChase
IF fChasePlaybackTime > 69000.0
REPEAT COUNT_OF(sGoldCars) i
IF i != PLAYERS_GOLD_CAR
AND NOT IS_ENTITY_DEAD(sGoldCars[i].veh)
SET_ENTITY_INVINCIBLE(sGoldCars[i].veh, TRUE)
SET_ENTITY_PROOFS(sGoldCars[i].veh, TRUE, TRUE, TRUE, TRUE, TRUE)
ENDIF
ENDREPEAT
bMichaelInvincibleDuringChase = TRUE
ENDIF
ELSE
IF fChasePlaybackTime > 73000.0
REPEAT COUNT_OF(sGoldCars) i
IF i != PLAYERS_GOLD_CAR
AND NOT IS_ENTITY_DEAD(sGoldCars[i].veh)
SET_ENTITY_INVINCIBLE(sGoldCars[i].veh, FALSE)
SET_ENTITY_PROOFS(sGoldCars[i].veh, FALSE, FALSE, FALSE, FALSE, FALSE)
ENDIF
ENDREPEAT
bMichaelInvincibleDuringChase = FALSE
ENDIF
ENDIF
ENDPROC
PROC LOAD_ACTION_CAM_DATA()
sActionCams[0].iRecordingID = 950
sActionCams[0].fStartTime = 0.0
sActionCams[1].iRecordingID = 951
sActionCams[1].fStartTime = 79500.0000
ENDPROC
FUNC BOOL CHANGE_ACTION_CAM_ANGLE(VEHICLE_INDEX vehCameraCar, INT iNewCamRec, FLOAT fPlaybackTime, FLOAT fActionCamStartTime)
IF IS_VEHICLE_DRIVEABLE(vehCameraCar)
IF HAS_CAM_RECORDING_LOADED(iNewCamRec, strCarrec)
IF fPlaybackTime >= fActionCamStartTime
STOP_PLAYBACK_RECORDED_VEHICLE(vehCameraCar)
START_PLAYBACK_RECORDED_VEHICLE(vehCameraCar, iNewCamRec, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehCameraCar, fPlaybackTime - fActionCamStartTime)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehCameraCar)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC UPDATE_CHASE_CAM(VEHICLE_INDEX &vehActionCamCar, CAMERA_INDEX &cam, FLOAT fPlaybackTime, FLOAT fPlaybackSpeed)
INT i = 0
REPEAT COUNT_OF(sActionCams) i
IF sActionCams[i].iRecordingID != 0
REQUEST_CAM_RECORDING(sActionCams[i].iRecordingID, strCarrec)
ENDIF
ENDREPEAT
//PRINTLN(iCurrentActionCam)
SWITCH iCurrentActionCam
CASE 0
IF fPlaybackTime > 0.0
IF CHANGE_ACTION_CAM_ANGLE(vehActionCamCar, sActionCams[0].iRecordingID, fPlaybackTime, sActionCams[0].fStartTime)
SET_CAM_FOV(cam, 30.0)
iCurrentActionCam++
ENDIF
ENDIF
BREAK
CASE 1
IF fPlaybackTime > 87000.0
IF CHANGE_ACTION_CAM_ANGLE(vehActionCamCar, sActionCams[1].iRecordingID, fPlaybackTime, sActionCams[1].fStartTime)
SET_CAM_FOV(cam, 22.0)
iCurrentActionCam++
ENDIF
ENDIF
BREAK
CASE 2
IF fPlaybackTime > 93000.0
IF CHANGE_ACTION_CAM_ANGLE(vehActionCamCar, sActionCams[0].iRecordingID, fPlaybackTime, sActionCams[0].fStartTime)
SET_CAM_FOV(cam, 30.0)
iCurrentActionCam++
ENDIF
ENDIF
BREAK
CASE 3 //Freeze the car once the recording runs out
IF IS_VEHICLE_DRIVEABLE(vehActionCamCar)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehActionCamCar)
FREEZE_ENTITY_POSITION(vehActionCamCar, TRUE)
iCurrentActionCam++
ENDIF
ENDIF
BREAK
ENDSWITCH
IF IS_VEHICLE_DRIVEABLE(vehActionCamCar)
UPDATE_CAM_PLAYBACK(cam, vehActionCamCar, fPlaybackSpeed)
ENDIF
ENDPROC
PROC DO_CHASE_CAM(VEHICLE_INDEX veh1, VEHICLE_INDEX veh2)
BOOL bActionCamActivatedThisFrame = FALSE
BOOL bCamTurnedOffThisFrame = FALSE
IF IS_PHONE_ONSCREEN()
iCineCamPhoneTimer = GET_GAME_TIMER()
ENDIF
//Check to see if the hint cam is interping (NOTE: taken from chase_hint_cam.sch, as it needs to work in conjunction with the cinematic)
IF localChaseHintCamStruct.bHintInterpingIn AND IS_GAMEPLAY_HINT_ACTIVE()
IF GET_GAME_TIMER() > localChaseHintCamStruct.iInterpInTimer + iCHASE_HINT_INTERP_IN_TIME
localChaseHintCamStruct.bHintInterpingIn = FALSE
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(vehCamCar)
REQUEST_MODEL(modelChaseCars)
REQUEST_CAM_RECORDING(sActionCams[0].iRecordingID, strCarrec)
IF HAS_MODEL_LOADED(modelChaseCars)
AND HAS_CAM_RECORDING_LOADED(sActionCams[0].iRecordingID, strCarrec)
vehCamCar = CREATE_VEHICLE(modelChaseCars, GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<0.0, 0.0, 5.0>>)
SET_MODEL_AS_NO_LONGER_NEEDED(modelChaseCars)
camChase = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
SHAKE_CAM(camChase, "SKY_DIVING_SHAKE", 0.15)
SET_CAM_FOV(camChase, 30.0)
SET_CAM_MOTION_BLUR_STRENGTH(camChase, 0.01)
START_CAM_PLAYBACK(camChase, vehCamCar, strCarrec, sActionCams[0].iRecordingID)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehCamCar, fChasePlaybackTime)
iCurrentActionCam = 0
ENDIF
ELSE
UPDATE_CHASE_CAM(vehCamCar, camChase, fChasePlaybackTime, fChasePlaybackSpeed)
ENDIF
IF fChasePlaybackTime > 3000.0 //Don't run at the start.
#IF IS_DEBUG_BUILD SCRIPT_ASSERT("PRIVATE_IsChaseHintCamButtonPressedInVehicle") #ENDIF
IF IS_VEHICLE_DRIVEABLE(veh1)
AND IS_VEHICLE_DRIVEABLE(veh2)
AND PRIVATE_IsChaseHintCamButtonPressedInVehicle()
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), veh2)
VECTOR vDriverPos = GET_ENTITY_COORDS(veh2)
VECTOR vTriggerPos = GET_ENTITY_COORDS(veh1)
FLOAT fDist = VDIST2(vDriverPos, vTriggerPos)
IF fDist < 2500.0 //50m
AND fChasePlaybackTime < 107000.0
IF NOT IS_GAMEPLAY_HINT_ACTIVE() AND NOT localChaseHintCamStruct.bHintInterpingBack
IF NOT IS_PHONE_ONSCREEN()
IF GET_GAME_TIMER() - iCineCamPhoneTimer > 1000
IF IS_VEHICLE_DRIVEABLE(vehCamCar)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehCamCar)
IF DOES_CAM_EXIST(camChase)
IF NOT IS_CAM_RENDERING(camChase)
SET_CAM_ACTIVE(camChase, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
bActionCamActivatedThisFrame = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
//If the trigger car is too far away, use a chase hint cam instead of the cinematic cam.
IF DOES_CAM_EXIST(camChase)
IF IS_CAM_RENDERING(camChase)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
bCamTurnedOffThisFrame = TRUE
ENDIF
ENDIF
IF NOT IS_PHONE_ONSCREEN()
IF GET_GAME_TIMER() - iCineCamPhoneTimer > 1000
IF NOT IS_GAMEPLAY_HINT_ACTIVE()
StartVehicleChaseHintCam(veh1)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
//Clean up cinematic cam
IF DOES_CAM_EXIST(camChase)
IF IS_CAM_RENDERING(camChase)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
bCamTurnedOffThisFrame = TRUE
ENDIF
ENDIF
//Clean up chase cam (NOTE: taken from chase_hint_cam.sch, as it needs to be integrated with the cinematic cam)
IF IS_GAMEPLAY_HINT_ACTIVE()
IF NOT localChaseHintCamStruct.bHintInterpingBack AND NOT localChaseHintCamStruct.bHintInterpingIn
STOP_GAMEPLAY_HINT()
SET_GAMEPLAY_ENTITY_HINT(veh1, <<0,0,0>>, TRUE, 0, 0, 500)
localChaseHintCamStruct.bHintInterpingBack = TRUE
ENDIF
ELSE
IF localChaseHintCamStruct.bHintInterpingBack
SET_CINEMATIC_BUTTON_ACTIVE(TRUE)
localChaseHintCamStruct.bHintInterpingBack = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
//One of the cam recordings is inside Michael's car, make it invisible during this time.
IF NOT IS_ENTITY_DEAD(sGoldCars[0].veh)
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF ((DOES_CAM_EXIST(camChase) AND IS_CAM_RENDERING(camChase)) OR bActionCamActivatedThisFrame)
AND VDIST2(GET_ENTITY_COORDS(sGoldCars[0].veh), GET_CAM_COORD(camChase)) < 25.0
AND NOT bCamTurnedOffThisFrame
IF IS_ENTITY_VISIBLE(sGoldCars[0].veh)
SET_ENTITY_VISIBLE(sGoldCars[0].veh, FALSE)
SET_ENTITY_VISIBLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
ENDIF
ELSE
IF NOT IS_ENTITY_VISIBLE(sGoldCars[0].veh)
SET_ENTITY_VISIBLE(sGoldCars[0].veh, TRUE)
SET_ENTITY_VISIBLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
ENDIF
ENDIF
ENDIF
ENDPROC
///Fail cleanup cannot delete peds in the same group/vehicle as the player, so use this to force delete them.
PROC FORCE_DELETE_PED_FOR_FAIL(PED_INDEX ped)
IF NOT IS_ENTITY_DEAD(ped)
IF IS_PED_GROUP_MEMBER(ped, PLAYER_GROUP_ID())
OR ARE_CHARS_IN_SAME_VEHICLE(PLAYER_PED_ID(), ped)
REMOVE_PED(ped, TRUE)
ENDIF
ENDIF
ENDPROC
PROC SET_HEIST_CREW_END_SCREEN_STATUSES()
INT i
REPEAT GET_HEIST_CREW_SIZE(HEIST_FINALE) i
IF i = CREW_DRIVER
IF bPickedGoodCarDriver
OR g_bBigScore2ARescuedBadDriver
SET_HEIST_END_SCREEN_CREW_STATUS(HEIST_FINALE, GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, i), CMST_FINE)
ELSE
SET_HEIST_END_SCREEN_CREW_STATUS(HEIST_FINALE, GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, i), CMST_KILLED)
ENDIF
ELSE
SET_HEIST_END_SCREEN_CREW_STATUS(HEIST_FINALE, GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, i), CMST_FINE)
ENDIF
ENDREPEAT
ENDPROC
PROC SET_END_SCREEN_TAKE()
SET_HEIST_CREW_END_SCREEN_STATUSES()
SET_HEIST_END_SCREEN_POTENTIAL_TAKE(HEIST_FINALE, MAX_OVERALL_TAKE)
SET_HEIST_END_SCREEN_ACTUAL_TAKE(HEIST_FINALE, MAX_OVERALL_TAKE)
ADD_PENALTY_TO_HEIST(HEIST_FINALE, HEIST_PENALTY_BIGS_SLOW_LOADING, iTakePenaltyDropGold)
ADD_PENALTY_TO_HEIST(HEIST_FINALE, HEIST_PENALTY_MONEY_DROPPED, iTakePenaltyCrewDies)
ADD_PENALTY_TO_HEIST(HEIST_FINALE, HEIST_PENALTY_HOSTAGE_GIFT, iTakePenaltyCaseysCut)
ENDPROC
PROC MISSION_PASSED(BOOL bIsDebugPass = FALSE, BOOL bPassScreenAlreadyDisplayed = FALSE)
IF bIsDebugPass
#IF IS_DEBUG_BUILD
IF NOT HAS_CUTSCENE_FINISHED()
STOP_CUTSCENE()
ENDIF
REMOVE_CUTSCENE()
WHILE IS_CUTSCENE_ACTIVE()
WAIT(0)
ENDWHILE
DO_FADE_IN_WITH_WAIT()
#ENDIF
iCurrentTake = iMaxTakeConsideringCrew
ENDIF
IF NOT bPassScreenAlreadyDisplayed
SET_END_SCREEN_TAKE()
ENDIF
AWARD_ACHIEVEMENT_FOR_MISSION(ACH09) // The Big One
Mission_Flow_Mission_Passed()
MISSION_CLEANUP()
ENDPROC
PROC MISSION_FAILED(FAILED_REASON reason)
IF NOT bMissionFailed
CLEAR_PRINTS()
CLEAR_HELP()
REMOVE_ALL_BLIPS()
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
KILL_ANY_CONVERSATION()
CLEANUP_PC_CONTROLS()
IF bCustomGPSActive
SET_GPS_CUSTOM_ROUTE_RENDER(FALSE, 18, 30)
CLEAR_GPS_CUSTOM_ROUTE()
bCustomGPSActive = FALSE
ENDIF
//Have the security attack the player on fail.
IF reason = FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS
OR reason = FAILED_ALERTED_BANK_BY_KILLING_SECURITY
OR reason = FAILED_ALERTED_BANK_VIA_GPS
IF NOT IS_PED_INJURED(pedGateSecurity)
STOP_SYNCHRONIZED_ENTITY_ANIM(pedGateSecurity, NORMAL_BLEND_OUT, TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(pedGateSecurity, relGroupCops)
TASK_COMBAT_PED(pedGateSecurity, PLAYER_PED_ID())
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedGateSecurity, FALSE)
SET_PED_KEEP_TASK(pedGateSecurity, TRUE)
ENDIF
ENDIF
//Have the security guys in the vans flee.
IF reason = FAILED_SPOOKED_VAN_PEDS
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF NOT IS_PED_INJURED(sGoldVanPeds[0].ped)
TASK_VEHICLE_MISSION_PED_TARGET(sGoldVanPeds[0].ped, sGoldVans[0].veh, PLAYER_PED_ID(), MISSION_FLEE, 70.0, DRIVINGMODE_AVOIDCARS_RECKLESS, 300.0, 300.0, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[0].ped, FALSE)
SET_PED_KEEP_TASK(sGoldVanPeds[0].ped, TRUE)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF NOT IS_PED_INJURED(sGoldVanPeds[2].ped)
TASK_VEHICLE_MISSION_PED_TARGET(sGoldVanPeds[2].ped, sGoldVans[1].veh, PLAYER_PED_ID(), MISSION_FLEE, 70.0, DRIVINGMODE_AVOIDCARS_RECKLESS, 300.0, 300.0, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[2].ped, FALSE)
SET_PED_KEEP_TASK(sGoldVanPeds[2].ped, TRUE)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(objFakeVaultDoor)
STOP_SYNCHRONIZED_ENTITY_ANIM(objFakeVaultDoor, NORMAL_BLEND_OUT, TRUE)
FREEZE_ENTITY_POSITION(objFakeVaultDoor, TRUE)
ENDIF
SWITCH reason
CASE FAILED_GENERIC
strFailLabel = ""
BREAK
CASE FAILED_ALERTED_BANK_BY_KILLING_SECURITY
strFailLabel = "F3A_BANKFAIL1"
BREAK
CASE FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS
strFailLabel = "F3A_BANKFAIL2"
BREAK
CASE FAILED_ALERTED_BANK_VIA_GPS
strFailLabel = "F3A_BANKFAIL3"
BREAK
CASE FAILED_ALL_SECURITY_WORKERS_DEAD
strFailLabel = "F3A_SECDEAD3"
BREAK
CASE FAILED_CAUGHT_DURING_TRAFFIC_CONTROL
strFailLabel = "F3A_TRAFFAIL"
BREAK
CASE FAILED_CREW_MEMBER_DIED
strFailLabel = "F3A_CREWDEAD"
BREAK
CASE FAILED_CREW_MEMBERS_DIED
strFailLabel = "F3A_CREWDEAD2"
BREAK
CASE FAILED_FRANKLIN_DIED
strFailLabel = "F3A_FRANDEAD"
BREAK
CASE FAILED_GOLD_CAR_DESTROYED
strFailLabel = "F3A_CARDEAD"
BREAK
CASE FAILED_GOLD_CARS_DESTROYED
strFailLabel = "F3A_CARSDEAD2"
BREAK
CASE FAILED_GOLD_TRUCK_DESTROYED
strFailLabel = "F3A_VANDEAD"
BREAK
CASE FAILED_GOLD_TRUCKS_DESTROYED
strFailLabel = "F3A_VANSDEAD"
BREAK
CASE FAILED_LOST_BUDDIES
strFailLabel = "F3A_LOSTMICH"
BREAK
CASE FAILED_MICHAEL_DIED
strFailLabel = "F3A_MICHDEAD"
BREAK
CASE FAILED_MISSED_STINGER
strFailLabel = "F3A_STINGERMISS"
BREAK
CASE FAILED_STINGER_NOT_IN_TIME
strFailLabel = "F3A_STINGERFAIL"
BREAK
CASE FAILED_SECURITY_WORKER_DEAD
strFailLabel = "F3A_SECDEAD"
BREAK
CASE FAILED_SOME_GOLD_CARS_DESTROYED
strFailLabel = "F3A_CARSDEAD"
BREAK
CASE FAILED_SOME_SECURITY_WORKERS_DEAD
strFailLabel = "F3A_SECDEAD2"
BREAK
CASE FAILED_SPOOKED_VAN_PEDS
strFailLabel = "F3A_SPOOKVAN"
BREAK
CASE FAILED_START_CAR_DESTROYED
strFailLabel = "F3A_CARDEAD2"
BREAK
CASE FAILED_TREVOR_DIED
strFailLabel = "F3A_TREVDEAD"
BREAK
CASE FAILED_MISSED_TRUCKS
strFailLabel = "F3A_TRUCKFAIL"
BREAK
CASE FAILED_CAR_STUCK
strFailLabel = "F3A_CARSTUCK"
BREAK
CASE FAILED_VAN_STUCK
strFailLabel = "F3A_VANSTUCK"
BREAK
CASE FAILED_LEFT_FRANKLIN_BEHIND
strFailLabel = "F3A_LEFTCREWF"
BREAK
CASE FAILED_LEFT_MICHAEL_BEHIND
strFailLabel = "F3A_LEFTMICHF"
BREAK
CASE FAILED_LEFT_TREVOR_BEHIND
strFailLabel = "F3A_LEFTTREVF"
BREAK
CASE FAILED_LEFT_CREW_BEHIND
strFailLabel = "F3A_LEFTCREW2"
BREAK
CASE FAILED_MISSED_TUNNEL
strFailLabel = "F3A_TUNNELFAIL"
BREAK
CASE FAILED_DESTROYED_FRANKLINS_BIKE
strFailLabel = "F3A_BIKEFAIL"
BREAK
CASE FAILED_BANK_WORKER_DEAD
strFailLabel = "F3A_BANKDEAD"
BREAK
CASE FAILED_SPOOKED_BANK_WORKERS
strFailLabel = "F3A_SPOOKBANK"
BREAK
CASE FAILED_ALERTED_COPS
strFailLabel = "F3A_COPSALERT"
BREAK
CASE FAILED_ABANDONED_SHOOTOUT_CREW
strFailLabel = "F3A_FABANCREW"
BREAK
CASE FAILED_ABANDONED_CAR
strFailLabel = "F3A_CARABAN"
BREAK
CASE FAILED_MICHAEL_VAN_TOO_DAMAGED
strFailLabel = "F3A_VANDAMM"
BREAK
CASE FAILED_TREVOR_VAN_TOO_DAMAGED
strFailLabel = "F3A_VANDAMT"
BREAK
CASE FAILED_TRUCK_DRIVER_DIED
strFailLabel = "F3A_TRUCKDEAD"
BREAK
CASE FAILED_LESTER_DIED
strFailLabel = "F3A_LESTDEAD"
BREAK
CASE FAILED_COPS_SPOTTED_TRANSFER
strFailLabel = "F3A_COPSPOT"
BREAK
ENDSWITCH
bMissionFailed = TRUE
ENDIF
//For certain fails: display a 5 star wanted level before failing.
IF reason = FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS
OR reason = FAILED_ALERTED_BANK_BY_KILLING_SECURITY
OR reason = FAILED_ALERTED_BANK_VIA_GPS
OR reason = FAILED_ALERTED_COPS
SETTIMERA(0)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 5)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
WHILE TIMERA() < 2000
WAIT(0)
ENDWHILE
ENDIF
TRIGGER_MUSIC_EVENT("FH2A_MISSION_FAIL")
MISSION_FLOW_MISSION_FAILED_WITH_REASON(strFailLabel)
WHILE NOT GET_MISSION_FLOW_SAFE_TO_CLEANUP()
//Maintain anything that could look weird during fade out (e.g. enemies walking off).
IF eMissionStage = STAGE_SET_UP_STINGER
UPDATE_FRANKLIN_ON_BIKE()
ELIF eMissionStage = STAGE_CHASE
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
UPDATE_UBER_PLAYBACK(vehChaseTrigger, fChasePlaybackSpeed)
UPDATE_CHASE_SET_PIECES()
ELIF eMissionStage = STAGE_TRAFFIC_CONTROL
UPDATE_TRAFFIC_GAME()
ENDIF
WAIT(0)
ENDWHILE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
IF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_MICHAEL)
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL, bHasChangedClothesMichael)
ELIF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN, bHasChangedClothesFranklin)
ELIF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR, bHasChangedClothesTrevor)
ENDIF
FORCE_DELETE_PED_FOR_FAIL(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
FORCE_DELETE_PED_FOR_FAIL(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
FORCE_DELETE_PED_FOR_FAIL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
FORCE_DELETE_PED_FOR_FAIL(sCrew[CREW_DRIVER].ped)
FORCE_DELETE_PED_FOR_FAIL(sCrew[CREW_FORCED_GUNMAN].ped)
FORCE_DELETE_PED_FOR_FAIL(sCrew[CREW_FORCED_DRIVER].ped)
FORCE_DELETE_PED_FOR_FAIL(sCrew[CREW_GUNMAN].ped)
FORCE_DELETE_PED_FOR_FAIL(sGoldVanPeds[CASEY_ID].ped)
//Fail warps.
IF eMissionStage >= STAGE_DRIVE_TO_BANK AND eMissionStage < STAGE_LEAVE_BANK
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<-116.6126, -652.7636, 34.8438>>, 233.8351)
ELIF eMissionStage = STAGE_LEAVE_BANK OR eMissionStage = STAGE_SWAP_TO_FRANKLIN_CUTSCENE
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<69.5240, -617.6522, 30.6806>>, 134.0472)
ELIF eMissionStage = STAGE_TRAFFIC_CONTROL
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<144.6931, -1300.7626, 28.0422>>, 115.3229)
ENDIF
// check if we need to respawn the player in a different position,
// if so call MISSION_FLOW_SET_FAIL_WARP_LOCATION() + SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION here
//MISSION_FLOW_SET_FAIL_WARP_LOCATION(<< 144.2238, -1311.4945, 28.0306 >>, 53.4660)
//SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<< 145.1657, -1304.0176, 28.0517 >>, 118.8119)
MISSION_CLEANUP() // must only take 1 frame and terminate the thread
ENDPROC
//Manages the AI-controlled cops that spawn during the chase and are tasked to take out the player.
PROC UPDATE_CHASE_COPS()
VECTOR vCopSpawnPos
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
FLOAT fCopSpawnHeading
FLOAT fDistToPlayer
REQUEST_MODEL(modelCop)
REQUEST_MODEL(modelCopCar)
BOOL bRemoveCar = FALSE
BOOL bEntitySpawnedThisFrame = FALSE
INT iDriverIndex
INT iPassengerIndex
INT i = 0
bSafeToDriveOntoTrucks = TRUE
REPEAT COUNT_OF(vehChaseCops) i
iDriverIndex = i * 2
iPassengerIndex = iDriverIndex + 1
IF NOT DOES_ENTITY_EXIST(vehChaseCops[i])
//Create more cops once other ones are killed.
IF fChasePlaybackTime > 12000.0
AND fChasePlaybackTime < 77500.0
AND NOT bCreatedUberPlaybackEntityThisFrame
AND NOT bEntitySpawnedThisFrame
IF HAS_MODEL_LOADED(modelCop)
AND HAS_MODEL_LOADED(modelCopCar)
IF (fChasePlaybackTime < 70000.0 AND GET_COP_SPAWN_POS_FROM_PLAYER(vCopSpawnPos, fCopSpawnHeading, i, 40.0))
OR (fChasePlaybackTime > 70000.0 AND GET_COP_SPAWN_POS_FROM_PLAYER(vCopSpawnPos, fCopSpawnHeading, i, 60.0))
CLEAR_AREA(vCopSpawnPos, 3.0, TRUE)
vehChaseCops[i] = CREATE_VEHICLE(modelCopCar, vCopSpawnPos, fCopSpawnHeading)
sChaseCops[iDriverIndex].ped = CREATE_PED_INSIDE_VEHICLE(vehChaseCops[i], PEDTYPE_COP, modelCop)
//sChaseCops[iPassengerIndex].ped = CREATE_PED_INSIDE_VEHICLE(vehChaseCops[i], PEDTYPE_COP, modelCop, VS_FRONT_RIGHT)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCops[iDriverIndex].ped, TRUE)
//SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCops[iPassengerIndex].ped, TRUE)
GIVE_WEAPON_TO_PED(sChaseCops[iDriverIndex].ped, WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE, TRUE)
//GIVE_WEAPON_TO_PED(sChaseCops[iPassengerIndex].ped, WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE, TRUE)
sChaseCops[iDriverIndex].iEvent = 0
//sChaseCops[iPassengerIndex].iEvent = 0
SET_VEHICLE_ENGINE_ON(vehChaseCops[i], TRUE, TRUE)
SET_VEHICLE_SIREN(vehChaseCops[i], TRUE)
SET_SIREN_WITH_NO_DRIVER(vehChaseCops[i], TRUE)
SET_VEHICLE_LIGHTS(vehChaseCops[i], FORCE_VEHICLE_LIGHTS_ON)
SET_VEHICLE_FORWARD_SPEED(vehChaseCops[i], 30.0)
iTimeSinceLastChaseCopKilled = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(500, 1000)
bEntitySpawnedThisFrame = TRUE
ENDIF
ENDIF
ENDIF
ELSE
bRemoveCar = FALSE
IF IS_VEHICLE_DRIVEABLE(vehChaseCops[i])
fDistToPlayer = VDIST2(GET_ENTITY_COORDS(vehChaseCops[i]), vPlayerPos)
//Driver: chases the player, if the car is close enough to the player they get out and combat on foot.
IF NOT IS_PED_INJURED(sChaseCops[iDriverIndex].ped)
AND IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
IF sChaseCops[iDriverIndex].iEvent = 0 //In car
IF NOT IS_PED_IN_VEHICLE(sChaseCops[iDriverIndex].ped, vehChaseCops[i], TRUE)
IF GET_SCRIPT_TASK_STATUS(sChaseCops[iDriverIndex].ped, SCRIPT_TASK_ENTER_VEHICLE) = FINISHED_TASK
AND IS_VEHICLE_SEAT_FREE(vehChaseCops[i], VS_DRIVER)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCops[iDriverIndex].ped, TRUE)
TASK_ENTER_VEHICLE(sChaseCops[iDriverIndex].ped, vehChaseCops[i], DEFAULT_TIME_BEFORE_WARP, VS_DRIVER)
ENDIF
ELIF IS_PED_SITTING_IN_VEHICLE(sChaseCops[iDriverIndex].ped, vehChaseCops[i])
AND ((NOT IS_PED_INJURED(sChaseCops[iPassengerIndex].ped) AND IS_PED_SITTING_IN_VEHICLE(sChaseCops[iPassengerIndex].ped, vehChaseCops[i]))
OR IS_PED_INJURED(sChaseCops[iPassengerIndex].ped))
IF GET_SCRIPT_TASK_STATUS(sChaseCops[iDriverIndex].ped, SCRIPT_TASK_VEHICLE_MISSION) != PERFORMING_TASK
SET_PED_COMBAT_ATTRIBUTES(sChaseCops[iDriverIndex].ped, CA_LEAVE_VEHICLES, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sChaseCops[iDriverIndex].ped, CA_USE_VEHICLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sChaseCops[iDriverIndex].ped, CA_DO_DRIVEBYS, FALSE)
//TASK_VEHICLE_MISSION(sChaseCops[iDriverIndex].ped, vehChaseCops[i], sGoldCars[PLAYERS_GOLD_CAR].veh, MISSION_ATTACK, 50.0, DRIVINGMODE_AVOIDCARS_RECKLESS, 1.0, 1.0)
TASK_COMBAT_PED(sChaseCops[iDriverIndex].ped, PLAYER_PED_ID())
// TASK_DRIVE_BY(sChaseCops[iDriverIndex].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 100, TRUE)
//TASK_COMBAT_PED(sChaseCops[iDriverIndex].ped, PLAYER_PED_ID())
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCops[iDriverIndex].ped, TRUE)
ELSE
IF fChasePlaybackTime < 82500.0
SET_DRIVE_TASK_CRUISE_SPEED(sChaseCops[iDriverIndex].ped, CLAMP(3.0 * SQRT(fDistToPlayer), 50.0, 120.0))
ELSE
SET_DRIVE_TASK_CRUISE_SPEED(sChaseCops[iDriverIndex].ped, CLAMP(3.0 * SQRT(fDistToPlayer), 5.0, 15.0))
ENDIF
ENDIF
//Make it really hard for the cars to catch up with the player once reaching the end of the chase.
IF fChasePlaybackTime > 82500.0
MODIFY_VEHICLE_TOP_SPEED(vehChaseCops[i], -50.0)
IF NOT IS_VEHICLE_TYRE_BURST(vehChaseCops[i], SC_WHEEL_CAR_FRONT_LEFT)
IF GET_RANDOM_INT_IN_RANGE(0, 10) = 5
SET_VEHICLE_TYRE_BURST(vehChaseCops[i], SC_WHEEL_CAR_FRONT_LEFT, TRUE)
ENDIF
ENDIF
ENDIF
IF fDistToPlayer < 900.0
IF GET_GAME_TIMER() - sChaseCops[iDriverIndex].iTimer > 0
PLAY_PED_AMBIENT_SPEECH(sChaseCops[iDriverIndex].ped, "STOP_VEHICLE_CAR_MEGAPHONE", SPEECH_PARAMS_FORCE_MEGAPHONE)
sChaseCops[iDriverIndex].iTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7000, 10000)
ENDIF
ENDIF
IF fDistToPlayer < 400.0
IF GET_GAME_TIMER() - iSirenBlipTimer > 0
PLAY_SOUND_FROM_ENTITY(-1, "SIREN_BLIP", vehChaseCops[i], "BIG_SCORE_3A_SOUNDS")
iSirenBlipTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 15000)
ENDIF
ENDIF
ENDIF
IF fDistToPlayer < 289.0
AND GET_ENTITY_SPEED(sGoldCars[PLAYERS_GOLD_CAR].veh) < 3.0
CLEAR_PED_TASKS(sChaseCops[iDriverIndex].ped)
sChaseCops[iDriverIndex].iEvent++
ENDIF
ELSE //On foot
IF GET_SCRIPT_TASK_STATUS(sChaseCops[iDriverIndex].ped, SCRIPT_TASK_ARREST_PED) != PERFORMING_TASK
SET_PED_COMBAT_ATTRIBUTES(sChaseCops[iDriverIndex].ped, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sChaseCops[iDriverIndex].ped, CA_USE_VEHICLE, FALSE)
//TASK_COMBAT_PED(sChaseCops[iDriverIndex].ped, PLAYER_PED_ID())
TASK_ARREST_PED(sChaseCops[iDriverIndex].ped, PLAYER_PED_ID())
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCops[iDriverIndex].ped, TRUE)
ENDIF
IF fDistToPlayer > 400.0
OR GET_ENTITY_SPEED(sGoldCars[PLAYERS_GOLD_CAR].veh) > 5.0
CLEAR_PED_TASKS(sChaseCops[iDriverIndex].ped)
sChaseCops[iDriverIndex].iEvent = 0
ENDIF
ENDIF
//Fail the mission if one of the AI cops spots the crew loading the cars onto the trucks.
IF fDistToPlayer < 1600.0
bSafeToDriveOntoTrucks = FALSE //This dictates if the god text will play
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
IF VDIST2(vPlayerPos, GET_ENTITY_COORDS(vehTrailer[0])) < 1600.0
MISSION_FAILED(FAILED_COPS_SPOTTED_TRANSFER)
ENDIF
ENDIF
ENDIF
IF NOT bSafeToDriveOntoTrucks
//Do god text and dialogue if the player is nearing the end of the chase and there are still cop cars on them.
IF fChasePlaybackTime > 84000.0
AND fChasePlaybackSpeed > 0.7
IF iCopsTailingFranklinEvent = 0
IF fDistToPlayer < 900.0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LOSECOP", CONV_PRIORITY_MEDIUM)
iCopsTailingFranklinEvent++
ENDIF
ENDIF
ENDIF
ELIF iCopsTailingFranklinEvent = 1
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_NOW("F3A_LOSECOPS", DEFAULT_GOD_TEXT_TIME, 0)
iCopsTailingFranklinEvent++
ENDIF
ELSE
ENDIF
ENDIF
ENDIF
IF fDistToPlayer > 15000.0
//Remove the car if it's lost by the player.
bRemoveCar = TRUE
ELIF fDistToPlayer < 100.0
//Play dialogue if a cop car rams the player.
IF GET_GAME_TIMER() - iFranklinHitCopDialogueTimer > 0
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
AND GET_ENTITY_SPEED(sGoldCars[PLAYERS_GOLD_CAR].veh) > 5.0
AND IS_ENTITY_TOUCHING_ENTITY(vehChaseCops[i], sGoldCars[PLAYERS_GOLD_CAR].veh)
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RAMMED2", CONV_PRIORITY_MEDIUM)
iFranklinHitCopDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(12000, 15000)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
bRemoveCar = TRUE
ENDIF
//Passenger: does drive-bys (passengers are currently disabled due to CPU time issues).
IF NOT IS_PED_INJURED(sChaseCops[iPassengerIndex].ped)
IF sChaseCops[iPassengerIndex].iEvent = 0 //In car
IF NOT IS_PED_IN_VEHICLE(sChaseCops[iPassengerIndex].ped, vehChaseCops[i], TRUE)
IF GET_SCRIPT_TASK_STATUS(sChaseCops[iPassengerIndex].ped, SCRIPT_TASK_ENTER_VEHICLE) = FINISHED_TASK
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCops[iPassengerIndex].ped, TRUE)
TASK_ENTER_VEHICLE(sChaseCops[iPassengerIndex].ped, vehChaseCops[i], DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT)
ENDIF
ELIF IS_PED_SITTING_IN_VEHICLE(sChaseCops[iPassengerIndex].ped, vehChaseCops[i])
IF GET_SCRIPT_TASK_STATUS(sChaseCops[iPassengerIndex].ped, SCRIPT_TASK_DRIVE_BY) = FINISHED_TASK
SET_PED_COMBAT_ATTRIBUTES(sChaseCops[iPassengerIndex].ped, CA_LEAVE_VEHICLES, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sChaseCops[iPassengerIndex].ped, CA_USE_VEHICLE, TRUE)
SET_PED_ACCURACY(sChaseCops[iPassengerIndex].ped, 10)
TASK_DRIVE_BY(sChaseCops[iPassengerIndex].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 100)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCops[iPassengerIndex].ped, TRUE)
ENDIF
ENDIF
IF fDistToPlayer < 289.0
CLEAR_PED_TASKS(sChaseCops[iPassengerIndex].ped)
sChaseCops[iPassengerIndex].iEvent++
ENDIF
ELSE //On foot
IF GET_SCRIPT_TASK_STATUS(sChaseCops[iPassengerIndex].ped, SCRIPT_TASK_ARREST_PED) != PERFORMING_TASK
SET_PED_COMBAT_ATTRIBUTES(sChaseCops[iPassengerIndex].ped, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sChaseCops[iPassengerIndex].ped, CA_USE_VEHICLE, FALSE)
//TASK_COMBAT_PED(sChaseCops[iPassengerIndex].ped, PLAYER_PED_ID())
TASK_ARREST_PED(sChaseCops[iPassengerIndex].ped, PLAYER_PED_ID())
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCops[iPassengerIndex].ped, TRUE)
ENDIF
IF fDistToPlayer > 400.0
CLEAR_PED_TASKS(sChaseCops[iPassengerIndex].ped)
sChaseCops[iPassengerIndex].iEvent = 0
ENDIF
ENDIF
ENDIF
ELSE
bRemoveCar = TRUE
ENDIF
IF bRemoveCar
IF GET_GAME_TIMER() - iTimeSinceLastChaseCopKilled > 0
iTimeSinceLastChaseCopKilled = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(500, 1000)
ENDIF
REMOVE_PED(sChaseCops[iDriverIndex].ped)
REMOVE_PED(sChaseCops[iPassengerIndex].ped)
REMOVE_VEHICLE(vehChaseCops[i])
ENDIF
ENDIF
ENDREPEAT
ENDPROC
PROC DO_START_CUTSCENE()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) = CHAR_TREVOR
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_PROPS, PROPS_P2_HEADSET)
ELIF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) = CHAR_MICHAEL
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_PROPS, PROPS_P0_HEADSET)
ELSE
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
ENDIF
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) = CHAR_TREVOR
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("bs_2a_mcs_10", CS_SECTION_1 | CS_SECTION_2 | CS_SECTION_3 | CS_SECTION_4 | CS_SECTION_5)
ELIF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) = CHAR_MICHAEL
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("bs_2a_mcs_10", CS_SECTION_2 | CS_SECTION_3 | CS_SECTION_4 | CS_SECTION_5)
ELSE
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("bs_2a_mcs_10", CS_SECTION_3 | CS_SECTION_4 | CS_SECTION_5)
ENDIF
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
//REQUEST_CUTSCENE("bs_2a_mcs_10")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_10")
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
IF iCurrentEvent < 99
IF NOT IS_SCREEN_FADED_OUT()
AND NOT g_FH2_bTimelapseTriggeredInside
IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(<<0.0, 0.0, 0.0>>, TRUE)
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<<151.2816, -1309.2737, 28.2024>>, 65.7988)
ENDIF
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<129.082687,-1299.175659,28.232706>>, <<136.970322,-1312.649536,33.186874>>, 19.750000, <<151.2816, -1309.2737, 28.2024>>, 65.7988,
GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
CLEAR_AREA_OF_PEDS(<<-17.1615, -1439.0176, 30.1015>>, 400.0)
CLEAR_AREA_OF_OBJECTS(<<-17.1615, -1439.0176, 30.1015>>, 400.0)
CLEAR_AREA_OF_PROJECTILES(<<-17.1615, -1439.0176, 30.1015>>, 400.0)
CLEAR_AREA_OF_VEHICLES(<<-17.1615, -1439.0176, 30.1015>>, 400.0, TRUE)
REMOVE_PARTICLE_FX_IN_RANGE(<<-17.1615, -1439.0176, 30.1015>>, 50.0)
structTimelapseSettings sTimelapseSettings
GET_SP_MISSION_TOD_CUTSCENE_ATTRIBUTES(SP_HEIST_FINALE_2A, sTimelapseSettings)
DESTROY_ALL_CAMS()
camMain = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<147.032776,-1310.506592,29.858635>>, <<10.395594,-0.000021,49.974117>>, 39.402699, TRUE)
SET_CAM_PARAMS(camMain, sTimelapseSettings.vCamPos1, sTimelapseSettings.vCamRot1, sTimelapseSettings.fCamFOV, 3000, GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SETTIMERB(0)
iCurrentEvent = 99
ELSE
SETTIMERB(0)
iCurrentEvent = 99
ENDIF
ELIF iCurrentEvent = 99
IF TIMERB() > 3000
OR IS_SCREEN_FADED_OUT()
OR g_FH2_bTimelapseTriggeredInside
IF DO_TIMELAPSE(SP_HEIST_FINALE_2A, sTimelapse, FALSE, FALSE)
iCurrentEvent = 100
ENDIF
IF iTimelapseTimer = 0
iTimelapseTimer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - iTimelapseTimer > 100 AND GET_GAME_TIMER() - iTimelapseTimer < 200
DISABLE_STRIP_CLUBS()
iTimelapseTimer = 1
ENDIF
ENDIF
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
IF NOT IS_SCREEN_FADED_OUT()
AND NOT IS_SCREEN_FADING_OUT()
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
ENDIF
ENDIF
ELIF iCurrentEvent = 100
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) != CHAR_TREVOR
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "Trevor", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_TREVOR))
ENDIF
IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) != CHAR_MICHAEL
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "Michael", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_MICHAEL))
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "gunman_selection_1", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_CREW_MEMBER_MODEL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_GUNMAN)))
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "EXL_2_abandoned_car", CU_DONT_ANIMATE_ENTITY, modelStartCar)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
sCrew[CREW_GUNMAN].iEvent = 0
sCrew[CREW_DRIVER].iEvent = 0
sMichael.iEvent = 0
sTrevor.iEvent = 0
bPreloadedOutfitsForCutscene = FALSE
iCurrentEvent = 0
bSkippedMocap = FALSE
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
SWITCH iCurrentEvent
CASE 0 //Do any setup on first frame of cutscene.
IF IS_CUTSCENE_PLAYING()
DISABLE_STRIP_CLUBS()
SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE)
SET_CLOCK_TIME(7, 0, 0) //B*819380
IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(<<0.0, 0.0, 0.0>>, TRUE)
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<<151.2816, -1309.2737, 28.2024>>, 65.7988)
ENDIF
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<129.082687,-1299.175659,28.232706>>, <<136.970322,-1312.649536,33.186874>>, 19.750000, <<151.2816, -1309.2737, 28.2024>>, 65.7988,
GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
//DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES()
CLEAR_AREA_OF_PEDS(<<151.2816, -1309.2737, 28.2024>>, 5000.0)
CLEAR_AREA_OF_OBJECTS(<<151.2816, -1309.2737, 28.2024>>, 5000.0)
CLEAR_AREA_OF_COPS(<<151.2816, -1309.2737, 28.2024>>, 5000.0)
CLEAR_AREA_OF_PROJECTILES(<<151.2816, -1309.2737, 28.2024>>, 5000.0)
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_HEIST_FINALE_2A)
DO_FADE_IN_WITH_WAIT() //In case this is a mission replay, the game will be faded out at this point
iCurrentEvent++
ENDIF
BREAK
CASE 1 //When Michael and Trevor are off-screen change them into the security outfits.
SETUP_REQ_MAIN_DRIVER(<<138.9219, -1306.6428, 27.9476>>, 43.3035)
IF NOT DOES_ENTITY_EXIST(sStartCar.veh)
SETUP_REQ_START_CAR(vStartCarPos, fStartCarHeading)
ENDIF
ENTITY_INDEX entityTrevor, entityMichael, entityGunman
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
entityTrevor = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Trevor")
IF DOES_ENTITY_EXIST(entityTrevor)
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = GET_PED_INDEX_FROM_ENTITY_INDEX(entityTrevor)
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
entityMichael = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Michael")
IF DOES_ENTITY_EXIST(entityMichael)
sSelectorPeds.pedID[SELECTOR_PED_MICHAEL] = GET_PED_INDEX_FROM_ENTITY_INDEX(entityMichael)
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(sCrew[CREW_GUNMAN].ped)
entityGunman = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("gunman_selection_1")
IF DOES_ENTITY_EXIST(entityGunman)
sCrew[CREW_GUNMAN].ped = GET_PED_INDEX_FROM_ENTITY_INDEX(entityGunman)
ENDIF
ENDIF
IF NOT bPreloadedOutfitsForCutscene
IF (GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL OR NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
AND (GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR OR NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
PRELOAD_OUTFIT(GET_PED_INDEX(CHAR_MICHAEL), OUTFIT_P0_SECURITY)
PRELOAD_OUTFIT(GET_PED_INDEX(CHAR_TREVOR), OUTFIT_P2_SECURITY)
bPreloadedOutfitsForCutscene = TRUE
ENDIF
ENDIF
IF GET_CUTSCENE_TIME() > 30500
IF sMichael.iEvent = 0
IF (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) OR GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL)
SETUP_MICHAEL_SECURITY_OUTFIT()
RELEASE_PED_PRELOAD_VARIATION_DATA(GET_PED_INDEX(CHAR_MICHAEL))
RELEASE_PED_PRELOAD_PROP_DATA(GET_PED_INDEX(CHAR_MICHAEL))
sMichael.iEvent++
ENDIF
ENDIF
IF sTrevor.iEvent = 0
IF (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) OR GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR)
SETUP_TREVOR_SECURITY_OUTFIT()
RELEASE_PED_PRELOAD_VARIATION_DATA(GET_PED_INDEX(CHAR_TREVOR))
RELEASE_PED_PRELOAD_PROP_DATA(GET_PED_INDEX(CHAR_TREVOR))
sTrevor.iEvent++
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
IF sCrew[CREW_DRIVER].iEvent = 0
SET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped, <<138.9219, -1306.6428, 27.9476>>)
SET_ENTITY_HEADING(sCrew[CREW_DRIVER].ped, 43.3035)
SETUP_DRIVER_SECURITY_OUTFIT()
sCrew[CREW_DRIVER].iEvent++
ELIF sCrew[CREW_DRIVER].iEvent = 1
IF GET_CUTSCENE_TIME() > 51000
AND IS_VEHICLE_DRIVEABLE(sStartCar.veh)
TASK_ENTER_VEHICLE(sCrew[CREW_DRIVER].ped, sStartCar.veh, -1, VS_BACK_LEFT, PEDMOVE_WALK)
sCrew[CREW_DRIVER].iEvent++
ENDIF
ENDIF
ENDIF
IF sCrew[CREW_GUNMAN].iEvent = 0
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
SETUP_GUNMAN_SECURITY_OUTFIT()
sCrew[CREW_GUNMAN].iEvent++
ENDIF
ENDIF
ENDIF
IF NOT bHasTextLabelTriggered[FH3A_HK10]
IF IS_CUTSCENE_PLAYING()
AND GET_CUTSCENE_TIME() > 37600
TEXT_LABEL strConvRoot
TEXT_LABEL strCrewVoiceName
CrewMember eCrewID
eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER)
SWITCH eCrewID
CASE CM_HACKER_B_RICKIE_UNLOCK
strConvRoot += "FH3A_HK10c"
strCrewVoiceName = "LIEngineer"
BREAK
CASE CM_HACKER_G_PAIGE
strConvRoot += "FH3A_HK10"
strCrewVoiceName = "PAIGE"
BREAK
CASE CM_HACKER_M_CHRIS
strConvRoot += "FH3A_HK10b"
strCrewVoiceName = "CHRISTIAN"
BREAK
ENDSWITCH
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, NULL, strCrewVoiceName)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strConvRoot, CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES, DO_NOT_ADD_TO_BRIEF_SCREEN)
bHasTextLabelTriggered[FH3A_HK10] = TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
IF NOT IS_CUTSCENE_ACTIVE()
REPLAY_STOP_EVENT()
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
eSectionStage = SECTION_STAGE_SKIP
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
ENDIF
//Have the player face the car if we're in first-person.
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
AND NOT IS_SCREEN_FADED_OUT()
SET_ENTITY_HEADING(PLAYER_PED_ID(), -100.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
ENDIF
ADD_ARMOUR_TO_PED(PLAYER_PED_ID(), -GET_PED_ARMOUR(PLAYER_PED_ID()))
ADD_ARMOUR_TO_PED(PLAYER_PED_ID(), 100)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE, FALSE, FAUS_CUTSCENE_EXIT)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sStartCar.veh, VS_FRONT_RIGHT)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("gunman_selection_1")
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
SET_PED_INTO_VEHICLE(sCrew[CREW_GUNMAN].ped, sStartCar.veh, VS_BACK_RIGHT)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
SET_PED_INTO_VEHICLE(sCrew[CREW_DRIVER].ped, sStartCar.veh, VS_BACK_LEFT)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ENDIF
//Fixes issues with LODs popping in after the cutscene.
IF NOT IS_ENTITY_DEAD(sStartCar.veh)
SET_FORCE_HD_VEHICLE(sStartCar.veh, TRUE)
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
RELEASE_PED_PRELOAD_VARIATION_DATA(GET_PED_INDEX(CHAR_MICHAEL))
RELEASE_PED_PRELOAD_PROP_DATA(GET_PED_INDEX(CHAR_MICHAEL))
RELEASE_PED_PRELOAD_VARIATION_DATA(GET_PED_INDEX(CHAR_TREVOR))
RELEASE_PED_PRELOAD_PROP_DATA(GET_PED_INDEX(CHAR_TREVOR))
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
IF bSkippedMocap
//For now just do a skip to the next stage.
JUMP_TO_STAGE(STAGE_SET_UP_STINGER)
ELSE
SET_AUDIO_FLAG("AllowScoreAndRadio", TRUE)
eMissionStage = STAGE_SET_UP_STINGER
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
DO_FADE_OUT_WITH_WAIT()
STOP_CUTSCENE()
bSkippedMocap = TRUE
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDPROC
PROC SET_UP_STINGER()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF SETUP_REQ_PLAYER_IS_MICHAEL()
IF bHasUsedCheckpoint
START_REPLAY_SETUP(<<131.0853, -1302.4243, 28.2489>>, 204.9590)
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<131.0853, -1302.4243, 28.2489>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 204.9590)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
LOAD_SCENE(<<131.0853, -1302.4243, 28.2489>>)
WAIT(0)
ENDIF
SETTIMERA(0)
PRELOAD_OUTFIT(PLAYER_PED_ID(), OUTFIT_P0_SECURITY)
//Create assets
WHILE NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
OR NOT DOES_ENTITY_EXIST(sCrew[CREW_DRIVER].ped)
OR NOT DOES_ENTITY_EXIST(sCrew[CREW_GUNMAN].ped)
OR NOT DOES_ENTITY_EXIST(sStartCar.veh)
SETUP_REQ_TREVOR(<<135.6805, -1304.5132, 28.1500>>, 212.6113)
SETUP_REQ_MAIN_DRIVER(<<138.9219, -1306.6428, 27.9476>>, 43.3035)
SETUP_REQ_MAIN_GUNMAN(<<136.4418, -1302.2856, 28.2036>>, 204.6212)
SETUP_REQ_START_CAR(vStartCarPos, fStartCarHeading)
WAIT(0)
ENDWHILE
#IF IS_DEBUG_BUILD
PRINTLN("Assets created: ", TIMERA())
#ENDIF
//Pre-stream the security outfits.
REQUEST_DRIVER_SECURITY_OUTFIT()
REQUEST_GUNMAN_SECURITY_OUTFIT()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
PRELOAD_OUTFIT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], OUTFIT_P2_SECURITY)
ENDIF
WHILE NOT HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(PLAYER_PED_ID())
OR (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND NOT HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
OR (NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped) AND NOT HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(sCrew[CREW_DRIVER].ped))
OR (NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped) AND NOT HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(sCrew[CREW_GUNMAN].ped))
WAIT(0)
ENDWHILE
SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
RELEASE_PED_PRELOAD_VARIATION_DATA(PLAYER_PED_ID())
RELEASE_PED_PRELOAD_PROP_DATA(PLAYER_PED_ID())
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
//Reposition the crew members, get them entering the vehicles, then wait for a bit so everything looks smooth on fade-in.
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped, <<138.9219, -1306.6428, 27.9476>>)
SET_ENTITY_HEADING(sCrew[CREW_DRIVER].ped, 43.3035)
RELEASE_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_DRIVER].ped)
RELEASE_PED_PRELOAD_PROP_DATA(sCrew[CREW_DRIVER].ped)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
SET_ENTITY_COORDS(sCrew[CREW_GUNMAN].ped, <<136.4418, -1302.2856, 28.2036>>)
SET_ENTITY_HEADING(sCrew[CREW_GUNMAN].ped, 204.6212)
RELEASE_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_GUNMAN].ped)
RELEASE_PED_PRELOAD_PROP_DATA(sCrew[CREW_GUNMAN].ped)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
RELEASE_PED_PRELOAD_VARIATION_DATA(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
RELEASE_PED_PRELOAD_PROP_DATA(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
CLEAR_AREA(<<131.0853, -1302.4243, 28.2489>>, 100.0, TRUE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
SET_ROADS_IN_ANGLED_AREA(<<332.834991,-659.348389,27.838188>>, <<120.851776,-573.066589,35.662926>>, 18.750000, FALSE, FALSE)
SET_ROADS_IN_ANGLED_AREA(<<395.946472,-569.395081,27.532516>>, <<351.844971,-652.105469,29.339520>>, 15.500000, FALSE, FALSE)
CLOSE_TUNNEL_PAVEMENTS(TRUE)
SET_AUDIO_FLAG("AllowScoreAndRadio", TRUE)
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_PED_RELATIONSHIP_GROUP_HASH(sCrew[CREW_DRIVER].ped, RELGROUPHASH_PLAYER)
SET_PED_CAN_BE_TARGETTED(sCrew[CREW_DRIVER].ped, FALSE)
SET_PED_CONFIG_FLAG(sCrew[CREW_DRIVER].ped, PCF_RunFromFiresAndExplosions, FALSE)
GIVE_WEAPON_TO_PED(sCrew[CREW_DRIVER].ped, WEAPONTYPE_PISTOL, INFINITE_AMMO, FALSE, FALSE)
GIVE_WEAPON_TO_PED(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, FALSE, FALSE)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, sCrew[CREW_DRIVER].ped, "FH3CREW2")
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
AND NOt IS_PED_IN_VEHICLE(sCrew[CREW_DRIVER].ped, sStartCar.veh)
AND GET_SCRIPT_TASK_STATUS(sCrew[CREW_DRIVER].ped, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
TASK_ENTER_VEHICLE(sCrew[CREW_DRIVER].ped, sStartCar.veh, DEFAULT_TIME_BEFORE_WARP, VS_BACK_LEFT)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
SET_PED_RELATIONSHIP_GROUP_HASH(sCrew[CREW_GUNMAN].ped, RELGROUPHASH_PLAYER)
SET_PED_CAN_BE_TARGETTED(sCrew[CREW_GUNMAN].ped, FALSE)
SET_PED_CONFIG_FLAG(sCrew[CREW_GUNMAN].ped, PCF_RunFromFiresAndExplosions, FALSE)
GIVE_WEAPON_TO_PED(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_PISTOL, INFINITE_AMMO, FALSE, FALSE)
GIVE_WEAPON_TO_PED(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, FALSE, FALSE)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 3, sCrew[CREW_GUNMAN].ped, "FH3CREW1")
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
AND NOT IS_PED_IN_VEHICLE(sCrew[CREW_GUNMAN].ped, sStartCar.veh)
AND GET_SCRIPT_TASK_STATUS(sCrew[CREW_GUNMAN].ped, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
TASK_ENTER_VEHICLE(sCrew[CREW_GUNMAN].ped, sStartCar.veh, DEFAULT_TIME_BEFORE_WARP, VS_BACK_RIGHT)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_RunFromFiresAndExplosions, FALSE)
sTrevor.iEvent = 0
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE, 500, FALSE, FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], RELGROUPHASH_PLAYER)
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
AND NOT IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sStartCar.veh)
AND GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
TASK_ENTER_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sStartCar.veh, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT)
ENDIF
ENDIF
SET_CREATE_RANDOM_COPS(FALSE)
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
IF IS_SCREEN_FADED_OUT()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_CLOCK_TIME(7, 0, 0)
WAIT(500)
ENDIF
sCrew[CREW_GUNMAN].iEvent = 0
sCrew[CREW_DRIVER].iEvent = 0
sMichael.iEvent = 0
sTrevor.iEvent = 0
IF NOT IS_SCREEN_FADED_IN()
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_IN()
IF NOT IS_ENTITY_DEAD(sStartCar.veh)
SET_FORCE_HD_VEHICLE(sStartCar.veh, TRUE)
ENDIF
WAIT(0)
ENDWHILE
ENDIF
REMOVE_VEHICLE(vehPreMissionCar, FALSE)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
bDoAlternateVanArrivalCutscene = FALSE
bPlayedFranklinsBikeRevSound = FALSE
iMusicTriggerEvent = 0
iStingerAudioSceneEvent = 0
iCountdownAudioEvent = 0
bTunnelAudioSceneActive = FALSE
SET_INITIAL_PLAYER_STATION("RADIO_01_CLASS_ROCK")
CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_WHERE", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(1.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
SETTIMERB(0)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
#IF IS_DEBUG_BUILD
DONT_DO_J_SKIP(sLocatesData)
#ENDIF
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_HIJACK_01")
FLOAT fDistFromTunnel = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vTunnelPos)
//Pre-load the tunnel interior
IF fDistFromTunnel < 10000.0
SETUP_REQ_TUNNEL_INTERIOR_LOADED()
ENDIF
IF NOT IS_ENTITY_DEAD(sStartCar.veh)
SET_FORCE_HD_VEHICLE(sStartCar.veh, TRUE)
ENDIF
//Setup bank security in case the player tries to go there early.
//SETUP_REQ_BANK_SECURITY()
DISABLE_LOCATES_WANTED_PRINTS_OUTSIDE_OF_VEHICLE(sLocatesData, TRUE)
BOOL bPlayerAtTunnelWaitPos = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<278.126892,-636.892761,28.115456>>, <<296.964050,-644.678528,32.056763>>, 8.000000)
//Michael has to find the vans and then tail them until they reach the tunnel. As they approach the tunnel overtake them and plant the stinger in front.
//NOTE: locates header is just being used to handle non-objective blips, groups etc. The actual objective is replaced. Don't display the chevron, as this will be called
//over the mini-cut.
IS_PLAYER_AT_LOCATION_WITH_BUDDIES_IN_VEHICLE(sLocatesData, vTunnelPos, <<0.001, 0.001, LOCATE_SIZE_HEIGHT>>, FALSE,
sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sCrew[CREW_DRIVER].ped, sCrew[CREW_GUNMAN].ped, sStartCar.veh,
"F3A_TUNNEL", "F3A_LEFTTREV", "F3A_LEAVECREW", "F3A_LEAVECREW", "F3A_LEFTCREW", "F3A_GETINCAR", "F3A_GETBACKCAR", FALSE, TRUE, FALSE)
//Play custom dialogue when getting a wanted level.
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
IF iCurrentEvent >= 50
//Fail if the vans already arrived
MISSION_FAILED(FAILED_ALERTED_COPS)
ELSE
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF NOT bHasTextLabelTriggered[FH3A_WANTED]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_WANTED", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
bHasTextLabelTriggered[FH3A_WANTED] = TRUE
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ELIF NOT bHasTextLabelTriggered[LOSE_WANTED]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_NOW("LOSE_WANTED", DEFAULT_GOD_TEXT_TIME, 0)
bHasTextLabelTriggered[LOSE_WANTED] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF bHasTextLabelTriggered[LOSE_WANTED]
bHasTextLabelTriggered[LOSE_WANTED] = FALSE
ENDIF
IF bHasTextLabelTriggered[FH3A_WANTED]
bHasTextLabelTriggered[FH3A_WANTED] = FALSE
ENDIF
ENDIF
//Work out which in-car line to play: this is based on which crew members were picked.
TEXT_LABEL strCarTextBlock, strCarTextBlock2, strCarTextGunmanBlock
INT iNumTimesDriverHired, iNumTimesGunmanHired
iNumTimesDriverHired = GET_NUMBER_OF_TIMES_CREW_MEMBER_HIRED(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER))
iNumTimesGunmanHired = GET_NUMBER_OF_TIMES_CREW_MEMBER_HIRED(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_GUNMAN))
CrewMember eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_GUNMAN)
IF iNumTimesDriverHired = 0 AND iNumTimesGunmanHired = 0
strCarTextBlock = "FH3A_CHAT3"
strCarTextBlock2 = "FH3A_CHAT3b"
strCarTextGunmanBlock = "FH3A_NONE"
ELIF iNumTimesDriverHired > 1 AND iNumTimesGunmanHired > 1
strCarTextBlock = "FH3A_CHAT"
strCarTextBlock2 = "FH3A_CHATb"
IF eCrewID = CM_GUNMAN_G_PACKIE_UNLOCK
IF iNumTimesGunmanHired > 2
strCarTextGunmanBlock = "FH3A_NALL"
ELSE
strCarTextGunmanBlock = "FH3A_TWO"
ENDIF
ELSE
strCarTextGunmanBlock = "FH3A_LOTS"
ENDIF
ELSE
strCarTextBlock = "FH3A_CHAT2"
strCarTextBlock2 = "FH3A_CHAT2b"
IF iNumTimesGunmanHired > 0
IF eCrewID = CM_GUNMAN_G_PACKIE_UNLOCK
IF IS_BIT_SET(g_savedGlobals.sHeistData.iCrewUsedBitset, CREW_USED_JEWEL_PACKIE)
strCarTextGunmanBlock = "FH3A_ONE"
ELIF IS_BIT_SET(g_savedGlobals.sHeistData.iCrewUsedBitset, CREW_USED_PALETO_PACKIE)
strCarTextGunmanBlock = "FH3A_PAL"
ELIF IS_BIT_SET(g_savedGlobals.sHeistData.iCrewUsedBitset, CREW_USED_AGENCY_PACKIE)
strCarTextGunmanBlock = "FH3A_FIB"
ENDIF
ELSE
strCarTextGunmanBlock = "FH3A_ONE"
ENDIF
ELSE
strCarTextGunmanBlock = ""
ENDIF
ENDIF
//Create the stinger in advance.
IF fDistFromTunnel < 2500.0
IF NOT DOES_ENTITY_EXIST(objStinger)
REQUEST_MODEL(modelStinger)
IF HAS_MODEL_LOADED(modelStinger)
objStinger = CREATE_OBJECT(modelStinger, <<314.8, -652.2, 57.8>>)
//ACTIVATE_PHYSICS(objStinger)
//SET_ENTITY_DYNAMIC(objStinger, TRUE)
SET_ENTITY_VISIBLE(objStinger, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelStinger)
ENDIF
ELSE
REQUEST_ANIM_DICT(strStingerAnims)
IF HAS_ANIM_DICT_LOADED(strStingerAnims)
AND DOES_ENTITY_HAVE_DRAWABLE(objStinger)
IF NOT IS_ENTITY_PLAYING_ANIM(objStinger, strStingerAnims, "P_Stinger_S_deploy")
AND NOT IS_ENTITY_PLAYING_ANIM(objStinger, strStingerAnims, "P_Stinger_S_idle_undeployed")
PLAY_ENTITY_ANIM(objStinger, "P_Stinger_S_idle_undeployed", strStingerAnims, INSTANT_BLEND_IN, TRUE, FALSE, FALSE, 0.0)
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH iCurrentEvent
CASE 0 //Drive to a location near the tunnels.
PREPARE_MUSIC_EVENT("FH2A_MISSION_START_ST")
DRAW_CLOCK("F3A_TRUCKCLOCK", TRUE, 7, 45, TIMER_STYLE_DONTUSEMILLISECONDS)
//1844289 - Play audio when there's only ten seconds left (10 seconds real time = 5 mins game time)
INT iHours, iMinutes, iSeconds
iHours = GET_CLOCK_HOURS()
iMinutes = GET_CLOCK_MINUTES()
iSeconds = GET_CLOCK_SECONDS()
IF iCountdownAudioEvent = 0
IF iMinutes = 55 AND iSeconds >= 30
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
iCountdownAudioEvent++
ENDIF
ELIF iCountdownAudioEvent = 1
IF iMinutes = 56 AND iSeconds >= 0
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
iCountdownAudioEvent++
ENDIF
ELIF iCountdownAudioEvent = 2
IF iMinutes = 56 AND iSeconds >= 30
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
iCountdownAudioEvent++
ENDIF
ELIF iCountdownAudioEvent = 3
IF iMinutes = 57 AND iSeconds >= 0
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
iCountdownAudioEvent++
ENDIF
ELIF iCountdownAudioEvent = 4
IF iMinutes = 57 AND iSeconds >= 30
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
iCountdownAudioEvent++
ENDIF
ELIF iCountdownAudioEvent = 5
IF iMinutes = 58 AND iSeconds >= 0
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
iCountdownAudioEvent++
ENDIF
ELIF iCountdownAudioEvent = 6
IF iMinutes = 58 AND iSeconds >= 15
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
iCountdownAudioEvent++
ENDIF
ELIF iCountdownAudioEvent = 7
IF iMinutes = 58 AND iSeconds >= 30
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
iCountdownAudioEvent++
ENDIF
ELIF iCountdownAudioEvent = 8
IF iMinutes = 58 AND iSeconds >= 45
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
iCountdownAudioEvent++
ENDIF
ELIF iCountdownAudioEvent = 9
IF iMinutes = 59 AND iSeconds >= 0
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
iCountdownAudioEvent++
ENDIF
ELIF iCountdownAudioEvent = 10
IF iMinutes = 59 AND iSeconds >= 15
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
iCountdownAudioEvent++
ENDIF
ELIF iCountdownAudioEvent = 11
IF iMinutes = 59 AND iSeconds >= 30
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
iCountdownAudioEvent++
ENDIF
ELIF iCountdownAudioEvent = 12
IF iMinutes = 59 AND iSeconds >= 45
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
iCountdownAudioEvent++
ENDIF
ELIF iCountdownAudioEvent = 13
IF iMinutes >= 0 AND iHours = 8
PLAY_SOUND_FRONTEND(-1, "TIMER_STOP", "HUD_MINI_GAME_SOUNDSET")
iCountdownAudioEvent++
ENDIF
ENDIF
//Do a streaming volume for the cutscene: Note there are two cutscenes that could happen here.
IF fDistFromTunnel < 2500.0
OR (iHours >= 7 AND iMinutes >= 50 AND fDistFromTunnel < 4900.0)
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_START_SPHERE(<<395.5, -697.8, 30.1>>, 50.0)
ENDIF
ELIF fDistFromTunnel > 6400.0
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
ENDIF
ENDIF
//Do locate check just to draw chevron.
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
AND IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND NOT bPlayerAtTunnelWaitPos
AND NOT bDoAlternateVanArrivalCutscene
IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vTunnelPos, <<2.0, 2.0, LOCATE_SIZE_HEIGHT>>, TRUE)
ENDIF
//Fade out music when player gets close to the tunnel entrance (or if they hit the locate some other way).
IF NOT bTunnelAudioSceneActive
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<342.420929,-662.797852,27.306934>>, <<309.718842,-651.177307,36.086140>>, 27.250000)
OR iCurrentEvent != 0
TRIGGER_MUSIC_EVENT("FH2A_RADIO_FADE_OUT")
bTunnelAudioSceneActive = TRUE
iMusicStartTimer = GET_GAME_TIMER()
ENDIF
ENDIF
//Load the gold van assets in advance.
IF fDistFromTunnel < 10000.0
REQUEST_VEHICLE_RECORDING(CARREC_GOLD_VANS_APPEAR, strCarrec)
SETUP_REQ_GOLD_VANS_PRE_HIJACK(<<0.0, 0.0, 0.0>>, 0.0, <<0.0, 0.0, 0.0>>, 0.0, TRUE)
ELIF fDistFromTunnel > 22500.0
REMOVE_VEHICLE_RECORDING(CARREC_GOLD_VANS_APPEAR, strCarrec)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCasey)
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldVan)
//SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldVanPeds) //This is needed for gate security.
ENDIF
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
SET_BLIP_ALPHA(sLocatesData.LocationBlip, 0)
SET_BLIP_ROUTE(sLocatesData.LocationBlip, FALSE)
IF NOT DOES_BLIP_EXIST(blipCurrentObjective)
blipCurrentObjective = CREATE_BLIP_FOR_COORD(vWaitForVansPos, TRUE)
SET_GPS_DISABLED_ZONE(<<138.7158, -1309.0946, 39.1623>>, <<148.0416, -1293.8993, 39.1623>>)
ENDIF
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
ENDIF
//In car chat.
IF NOT bHasTextLabelTriggered[FH3A_CHAT1]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strCarTextBlock, CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_CHAT1] = TRUE
iTunnelJourneyDialogueTimer = 0
ENDIF
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_GUNCAR]
IF NOT IS_STRING_NULL_OR_EMPTY(strCarTextGunmanBlock)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_GUNMAN_CONVERSATION(CREW_GUNMAN, sCrew[CREW_GUNMAN].ped, sConversationPeds, "FH3AAUD", strCarTextGunmanBlock)
bHasTextLabelTriggered[FH3A_GUNCAR] = TRUE
iTunnelJourneyDialogueTimer = 0
ENDIF
ENDIF
ELSE
bHasTextLabelTriggered[FH3A_GUNCAR] = TRUE
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_CHAT2]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strCarTextBlock2, CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_CHAT2] = TRUE
iTunnelJourneyDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_LONG] //If the player hasn't reached the tunnel after the last conversation finished play a "hurry up" line.
IF IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
OR (fDistFromTunnel < fPrevDistanceFromTunnel AND GET_ENTITY_SPEED(sStartCar.veh) > 10.0)
iTunnelJourneyDialogueTimer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - iTunnelJourneyDialogueTimer > 7000
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LONG", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_LONG] = TRUE
iTunnelJourneyDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
fPrevDistanceFromTunnel = fDistFromTunnel
ELIF NOT bHasTextLabelTriggered[FH3A_LONG2] //Play another hurry up line.
IF IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
OR (fDistFromTunnel < fPrevDistanceFromTunnel AND GET_ENTITY_SPEED(sStartCar.veh) > 10.0)
iTunnelJourneyDialogueTimer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - iTunnelJourneyDialogueTimer > 7000
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LONG2", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_LONG2] = TRUE
iTunnelJourneyDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
fPrevDistanceFromTunnel = fDistFromTunnel
ENDIF
ELSE
IF DOES_BLIP_EXIST(blipCurrentObjective)
REMOVE_ALL_BLIPS()
ENDIF
//Don't pause dialogue if we have a wanted level, as there's going to be some custom dialogue.
IF bHasTextLabelTriggered[FH3A_CHAT1]
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
AND GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
ENDIF
ENDIF
IF bCustomGPSActive
SET_GPS_MULTI_ROUTE_RENDER(FALSE)
CLEAR_GPS_MULTI_ROUTE()
bCustomGPSActive = FALSE
ENDIF
ENDIF
//Progress either if the player drives onto the locate correctly of if the alternate cutscene conditions were met.
IF (IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND bPlayerAtTunnelWaitPos
AND CAN_PLAYER_START_CUTSCENE(TRUE, TRUE)
AND DOES_BLIP_EXIST(sLocatesData.LocationBlip)
AND BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(sStartCar.veh, DEFAULT, 2, 0.05))
OR bDoAlternateVanArrivalCutscene
IF bCustomGPSActive
SET_GPS_MULTI_ROUTE_RENDER(FALSE)
CLEAR_GPS_MULTI_ROUTE()
bCustomGPSActive = FALSE
ENDIF
SET_GPS_DISABLED_ZONE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
KILL_FACE_TO_FACE_CONVERSATION()
IF bFranklinsBikeAudioSceneActive
STOP_AUDIO_SCENE("BIG_SCORE_2A_Boost_Franklins_Bike")
bFranklinsBikeAudioSceneActive = FALSE
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(7.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
REMOVE_ALL_BLIPS()
SETTIMERB(0)
iCurrentEvent++
ENDIF
//When the player runs out of time either fail if they're too far away or play an alternate version of the van cutscene if they're near the tunnel.
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
IF GET_CLOCK_HOURS() >= 8
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vWaitForVansPos) < 4900.0
bDoAlternateVanArrivalCutscene = TRUE
ELSE
MISSION_FAILED(FAILED_MISSED_TUNNEL)
ENDIF
ENDIF
ENDIF
BREAK
CASE 1 //Vans arrive cutscene
REQUEST_MODEL(modelStinger)
REQUEST_ANIM_DICT(strStingerAnims)
REQUEST_VEHICLE_RECORDING(CARREC_GOLD_VANS_APPEAR, strCarrec)
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(sStartCar.veh, DEFAULT, 2, 0.05)
IF SETUP_REQ_GOLD_VANS_PRE_HIJACK(<<0.0, 0.0, 0.0>>, 0.0, <<0.0, 0.0, 0.0>>, 0.0, TRUE)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_GOLD_VANS_APPEAR, strCarrec)
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//IF TIMERB() > 15000 OR GET_CLOCK_HOURS() >= 8 //Once dialogue is ready put this in.
IF TIMERB() > 1000
AND bHasTextLabelTriggered[FH3A_HOLD]
SETUP_REQ_GOLD_VANS_PRE_HIJACK(<<0.0, 0.0, 0.0>>, 0.0, <<0.0, 0.0, 0.0>>, 0.0, FALSE)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, CARREC_GOLD_VANS_APPEAR, strCarrec)
IF NOT bDoAlternateVanArrivalCutscene
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, 2650.0)
ELSE
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, 3750.0)
ENDIF
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[0].veh)
SET_VEHICLE_ENGINE_HEALTH(sGoldVans[0].veh, 1000.0)
SET_VEHICLE_PETROL_TANK_HEALTH(sGoldVans[0].veh, 1000.0)
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, CARREC_GOLD_VANS_APPEAR, strCarrec)
IF NOT bDoAlternateVanArrivalCutscene
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, 500.0)
ELSE
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, 2500.0)
ENDIF
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[1].veh)
SET_VEHICLE_ENGINE_HEALTH(sGoldVans[1].veh, 1000.0)
SET_VEHICLE_PETROL_TANK_HEALTH(sGoldVans[1].veh, 1000.0)
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(sGoldVans[1].veh), 15.0)
ENDIF
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_ROADS_IN_ANGLED_AREA(<<328.408264,-737.851563,27.344345>>, <<387.132874,-603.286560,38.589233>>, 43.500000, FALSE, FALSE)
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100.0, TRUE)
CLEAR_AREA_OF_VEHICLES(<<358.3, -668.4, 28.8>>, 100.0)
CLEAR_ANGLED_AREA_OF_VEHICLES(<<327.230835,-653.433594,27.224365>>, <<421.565277,-676.612549,36.074821>>, 180.500000)
IF NOT bDoAlternateVanArrivalCutscene
camMain = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<292.380188,-641.046204,29.708914>>,<<-3.808809,-0.002426,-87.065468>>,37.777313, TRUE)
//SET_CAM_PARAMS(camMain, <<290.603699,-640.843933,29.566248>>,<<-3.532233,-0.002426,-101.519447>>,40.063507, 12000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
SHAKE_CAM(camMain, "HAND_SHAKE", 0.4)
ELSE
camMain = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<416.518524,-690.654175,29.633583>>,<<-2.970040,0.003319,58.762817>>,40.443851, TRUE)
SET_CAM_PARAMS(camMain, <<416.418121,-690.593140,31.897556>>,<<-2.970040,0.003319,58.762817>>,40.443851, 8000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
SHAKE_CAM(camMain, "HAND_SHAKE", 0.1)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
IF NOT bDoAlternateVanArrivalCutscene
SET_ENTITY_HEADING(sStartCar.veh, 68.8593)
SET_ENTITY_COORDS(sStartCar.veh, <<294.7272, -640.9750, 28.1689>>)
ELIF IS_ENTITY_IN_ANGLED_AREA(sStartCar.veh, <<405.685425,-672.307129,27.641361>>, <<405.843140,-733.908447,34.328587>>, 22.000000)
SET_ENTITY_HEADING(sStartCar.veh, 88.1695)
SET_ENTITY_COORDS(sStartCar.veh, <<423.8835, -674.2583, 28.2539>>)
ELIF IS_ENTITY_IN_ANGLED_AREA(sStartCar.veh, <<341.157104,-662.794556,27.787113>>, <<395.308899,-677.472595,34.335789>>, 25.250000)
SET_ENTITY_HEADING(sStartCar.veh, 341.0817)
SET_ENTITY_COORDS(sStartCar.veh, <<358.4151, -688.5298, 28.2433>>)
ENDIF
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sStartCar.veh)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sStartCar.veh)
ENDIF
IF bDoAlternateVanArrivalCutscene
CLEAR_AREA_OF_VEHICLES(<<358.3, -668.4, 28.8>>, 100.0)
ENDIF
//SET_ENTITY_VELOCITY(sStartCar.veh, <<0.0, 0.0, 0.0>>)
//SET_VEHICLE_ON_GROUND_PROPERLY(sStartCar.veh)
IF IS_ENTITY_ON_FIRE(sStartCar.veh)
STOP_ENTITY_FIRE(sStartCar.veh)
SET_VEHICLE_FIXED(sStartCar.veh)
SET_VEHICLE_ENGINE_HEALTH(sStartCar.veh, 1000.0)
ENDIF
ENDIF
TASK_LOOK_AT_COORD(PLAYER_PED_ID(), <<356.26, -679.22, 30.37>>, -1, SLF_WHILE_NOT_IN_FOV | SLF_SLOW_TURN_RATE)
SET_AUDIO_FLAG("AllowScoreAndRadio", FALSE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
KILL_FACE_TO_FACE_CONVERSATION()
NEW_LOAD_SCENE_STOP()
bCamIsInterpingToVans = FALSE
bTrevorSetToLookInVansArriveCut = FALSE
bHasFirstPersonFlashTriggered = FALSE
iCarCreationEvent = 0
SETUP_PC_CONTROLS()
SETTIMERB(0)
iCurrentEvent++
ELSE
//Keep the player waiting for the vans, play some dialogue.
IF NOT bHasTextLabelTriggered[FH3A_HOLD]
IF NOT bDoAlternateVanArrivalCutscene
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_HOLD", CONV_PRIORITY_MEDIUM)
OR TIMERB() > 15000
REPLAY_RECORD_BACK_FOR_TIME(8.0, 3.0, REPLAY_IMPORTANCE_HIGHEST)
bHasTextLabelTriggered[FH3A_HOLD] = TRUE
ENDIF
ELSE
bHasTextLabelTriggered[FH3A_HOLD] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
REQUEST_MODEL(modelStinger)
REQUEST_ANIM_DICT(strStingerAnims)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
SET_VEHICLE_BRAKE_LIGHTS(sStartCar.veh, FALSE)
ENDIF
//We have to turn off ambient traffic in the tunnels to avoid potential issues with them
IF NOT bDoAlternateVanArrivalCutscene
REQUEST_MODEL(EMPEROR)
REQUEST_MODEL(HABANERO)
IF NOT bTrevorSetToLookInVansArriveCut
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND TIMERB() > 700
TASK_LOOK_AT_COORD(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<398.45, -681.63, 30.37>>, -1, SLF_WHILE_NOT_IN_FOV | SLF_SLOW_TURN_RATE)
bTrevorSetToLookInVansArriveCut = TRUE
ENDIF
ENDIF
IF TIMERB() > 7000 //Dialogue roughly ends after 7500 ms
AND HAS_MODEL_LOADED(EMPEROR)
AND HAS_MODEL_LOADED(HABANERO)
VECTOR vPos
FLOAT fHeading
INT iRandom
BOOL bCreatedCarThisFrame
MODEL_NAMES modelVehicle
//If the player skipped the cutscene then create all of the cars at once, otherwise create one per frame.
WHILE iCarCreationEvent < 3
AND NOT bCreatedCarThisFrame
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
modelVehicle = EMPEROR
ELSE
modelVehicle = HABANERO
ENDIF
iRandom = GET_RANDOM_INT_IN_RANGE(0, 4)
IF iRandom = 0
vPos = <<132.4302, -581.0699, 30.4622>>
fHeading = 251.6688
ELIF iRandom = 1
vPos = <<153.7827, -587.8965, 29.7356>>
fHeading = 254.6748
ELIF iRandom = 2
vPos = <<199.6922, -596.1505, 28.3695>>
fHeading = 67.4431
ELIF iRandom = 3
vPos = <<99.5932, -563.0226, 30.6069>>
fHeading = 70.9581
ENDIF
CREATE_RANDOM_CAR_AT_POS(modelVehicle, vPos, fHeading)
iCarCreationEvent++
IF NOT IS_SCREEN_FADED_OUT()
bCreatedCarThisFrame = TRUE
ENDIF
ENDWHILE
IF iCarCreationEvent >= 3
SET_MODEL_AS_NO_LONGER_NEEDED(EMPEROR)
SET_MODEL_AS_NO_LONGER_NEEDED(HABANERO)
ENDIF
ENDIF
ENDIF
IF NOT bDoAlternateVanArrivalCutscene
IF NOT bHasTextLabelTriggered[FH3A_WAIT]
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_WAIT", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(5.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
bHasTextLabelTriggered[FH3A_WAIT] = TRUE
ENDIF
ENDIF
IF NOT bCamIsInterpingToVans
IF TIMERB() > 2500
SET_CAM_PARAMS(camMain, <<292.387848,-641.194458,29.708914>>,<<-3.808809,-0.002426,-98.072250>>,37.777313, 4000, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
bCamIsInterpingToVans = TRUE
ENDIF
ENDIF
ENDIF
//Handle the first person flash.
IF NOT bHasFirstPersonFlashTriggered
AND NOT IS_SCREEN_FADED_OUT()
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON
OR GET_FOLLOW_VEHICLE_CAM_ZOOM_LEVEL() = VEHICLE_ZOOM_LEVEL_BONNET
IF (bDoAlternateVanArrivalCutscene AND TIMERB() > 3700)
OR (NOT bDoAlternateVanArrivalCutscene AND TIMERB() > 8200)
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] Triggering flash: TIMERB = ", TIMERB())
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bHasFirstPersonFlashTriggered = TRUE
ENDIF
ENDIF
ENDIF
IF ((NOT bDoAlternateVanArrivalCutscene AND TIMERB() > 8500) OR (bDoAlternateVanArrivalCutscene AND TIMERB() > 4000))
AND (NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData) OR bHasFirstPersonFlashTriggered) //Don't check text for first-person as it prevents getting accurate timings for the first-person flash.
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, 5250.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[0].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
SET_ENTITY_VELOCITY(sGoldVans[0].veh, <<0.0, 0.0, 0.0>>)
SET_ENTITY_COORDS(sGoldVans[0].veh, <<378.6022, -673.4838, 28.3044>>)
SET_ENTITY_HEADING(sGoldVans[0].veh, 71.8782)
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[0].veh)
SET_VEHICLE_FORWARD_SPEED(sGoldVans[0].veh, 9.0)
ENDIF
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, 4000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[1].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
SET_ENTITY_VELOCITY(sGoldVans[1].veh, <<0.0, 0.0, 0.0>>)
SET_ENTITY_COORDS(sGoldVans[1].veh, <<393.5128, -675.4417, 28.2723>>)
SET_ENTITY_HEADING(sGoldVans[1].veh, 79.9870)
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[1].veh)
SET_VEHICLE_FORWARD_SPEED(sGoldVans[1].veh, 9.0)
ENDIF
REMOVE_VEHICLE_RECORDING(CARREC_GOLD_VANS_APPEAR, strCarrec)
ENDIF
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
TASK_CLEAR_LOOK_AT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(EMPEROR)
SET_MODEL_AS_NO_LONGER_NEEDED(HABANERO)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
IF NOT IS_SCREEN_FADED_IN()
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_IN()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
WAIT(0)
ENDWHILE
ENDIF
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(1.0)
SETTIMERB(0)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
iCurrentEvent = 50
ELSE
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
DO_FADE_OUT_WITH_WAIT()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
SETTIMERB(10000)
ENDIF
ENDIF
BREAK
CASE 50 //Place the stinger in the tunnel before the vans get there.
REQUEST_ANIM_DICT(strStingerAnims)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_DISTRICT_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_VEHICLE_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_STREET_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME)
IF NOT IS_ENTITY_DEAD(sStartCar.veh)
IF TIMERB() < 100
SET_VEHICLE_BRAKE_LIGHTS(sStartCar.veh, FALSE)
ENDIF
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
SET_BLIP_ALPHA(sLocatesData.LocationBlip, 0)
SET_BLIP_ROUTE(sLocatesData.LocationBlip, FALSE)
//Do locate check just to draw chevron.
//IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vTunnelPos, <<2.0, 2.0, LOCATE_SIZE_HEIGHT>>, TRUE)
IF NOT bHasTextLabelTriggered[FH3A_DROP]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_DROP", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(4.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
bHasTextLabelTriggered[FH3A_DROP] = TRUE
ENDIF
ENDIF
ELIF NOT bHasTextLabelTriggered[F3A_STINGER]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_NOW("F3A_STINGER", DEFAULT_GOD_TEXT_TIME, 0)
bHasTextLabelTriggered[F3A_STINGER] = TRUE
SETTIMERB(0)
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_PROMPT]
IF TIMERB() > 5000
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_PROMPT", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_PROMPT] = TRUE
ENDIF
ENDIF
ENDIF
IF NOT DOES_BLIP_EXIST(blipCurrentObjective)
blipCurrentObjective = CREATE_BLIP_FOR_COORD(vTunnelPos, TRUE)
ENDIF
IF NOT DOES_BLIP_EXIST(sGoldVanPeds[CASEY_ID].blip)
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
sGoldVanPeds[CASEY_ID].blip = CREATE_BLIP_FOR_PED(sGoldVanPeds[CASEY_ID].ped, TRUE)
ENDIF
IF NOT DOES_BLIP_EXIST(sGoldVanPeds[VAN_DRIVER_2].blip)
AND NOT IS_PED_INJURED(sGoldVanPeds[VAN_DRIVER_2].ped)
sGoldVanPeds[VAN_DRIVER_2].blip = CREATE_BLIP_FOR_PED(sGoldVanPeds[VAN_DRIVER_2].ped, TRUE)
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<295.067169,-645.779785,27.333458>>, <<209.385574,-602.962524,34.435322>>, 15.000000)
AND IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sStartCar.veh)
IF NOT bHasTextLabelTriggered[F3A_STINGHELP]
PRINT_HELP("F3A_STINGHELP")
bHasTextLabelTriggered[F3A_STINGHELP] = TRUE
ENDIF
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_SCRIPT_PAD_RIGHT)
IF DOES_ENTITY_EXIST(objStinger)
AND HAS_ANIM_DICT_LOADED(strStingerAnims)
AND IS_VEHICLE_DRIVEABLE(sStartCar.veh)
AND DOES_ENTITY_HAVE_PHYSICS(objStinger)
IF DOES_BLIP_EXIST(blipCurrentObjective)
REMOVE_BLIP(blipCurrentObjective)
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(0.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
vStingerDropPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sStartCar.veh, <<0.0, -2.8, 0.0>>)
SET_ENTITY_VISIBLE(objStinger, TRUE)
//SET_ENTITY_COORDS_NO_OFFSET(objStinger, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sStartCar.veh, <<-1.5, -2.8, -0.4>>)) //This spawns it dead centre.
SET_ENTITY_COORDS_NO_OFFSET(objStinger, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sStartCar.veh, <<-1.0, -2.8, -0.4>>)) //This is better for the scripted cam.
SET_ENTITY_HEADING(objStinger, GET_ENTITY_HEADING(sStartCar.veh) + 90.0)
ACTIVATE_PHYSICS(objStinger)
SET_ENTITY_DYNAMIC(objStinger, TRUE)
PLAY_ENTITY_ANIM(objStinger, "P_Stinger_S_deploy", strStingerAnims, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.0)
PLAY_SOUND_FROM_ENTITY(-1, "DROP_STINGER", sStartCar.veh, "BIG_SCORE_3A_SOUNDS")
SET_ENTITY_VELOCITY(objStinger,
GET_ENTITY_VELOCITY(sStartCar.veh) - (CONVERT_ROTATION_TO_DIRECTION_VECTOR(GET_ENTITY_ROTATION(sStartCar.veh)) * 5.0))
CLEAR_HELP()
CLEAR_PRINTS()
//If the stinger was dropped while the vans were there then just fail the mission straight away.
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF VDIST2(GET_ENTITY_COORDS(sGoldVans[0].veh), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 1600.0
IF GET_ENTITY_SPEED(sGoldVans[0].veh) < 1.0
MISSION_FAILED(FAILED_SPOOKED_VAN_PEDS)
ENDIF
ENDIF
ENDIF
//Do a scripted cam showing the stinger.
DESTROY_ALL_CAMS()
SET_USE_HI_DOF()
camMain = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
ATTACH_CAM_TO_ENTITY(camMain, sStartCar.veh, <<0.1216, -0.4534, -0.3052>>)
POINT_CAM_AT_ENTITY(camMain, sStartCar.veh, <<-0.0526, -3.4347, -0.0197>>)
SHAKE_CAM(camMain, "ROAD_VIBRATION_SHAKE", GET_ENTITY_SPEED(sStartCar.veh) * 0.02)
SET_CAM_FOV(camMain, 50.0000)
SET_CAM_DOF_PLANES(camMain, 0.0, 0.0, 10000.0, 10000.0)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISABLE_PLAYER_VEHICLE_CONTROLS_THIS_FRAME()
REPLAY_RECORD_BACK_FOR_TIME(0.0, 2.0, REPLAY_IMPORTANCE_HIGHEST)
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME()
SETTIMERB(0)
iCurrentEvent++
ENDIF
ENDIF
ELIF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_STINGHELP")
CLEAR_HELP()
ENDIF
ELSE
IF DOES_BLIP_EXIST(blipCurrentObjective)
REMOVE_ALL_BLIPS()
ENDIF
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_STINGHELP")
CLEAR_HELP()
ENDIF
ENDIF
ENDIF
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vTunnelPos) > 40000.0
MISSION_FAILED(FAILED_STINGER_NOT_IN_TIME)
ENDIF
BREAK
CASE 51
BOOL bStartCutscene
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
IF TIMERB() < 1000
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT) //Prevents the lights/horn coming on straight after deploying the stinger with the same button.
ENDIF
IF DOES_CAM_EXIST(camMain)
DISABLE_PLAYER_VEHICLE_CONTROLS_THIS_FRAME()
SET_USE_HI_DOF()
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME()
IF TIMERB() > 1500
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDIF
ELSE
IF NOT bHasTextLabelTriggered[FH3A_STINGER] //Trevor says "let's move"
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_STINGER", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_STINGER] = TRUE
ENDIF
ENDIF
ELIF NOT bHasTextLabelTriggered[F3A_WAITVAN] //God text to move out of the way.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_NOW("F3A_WAITVAN", DEFAULT_GOD_TEXT_TIME, 0)
bHasTextLabelTriggered[F3A_WAITVAN] = TRUE
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_STOP] //Trevor says hurry up if the player still hasn't moved after the god text has finished.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
IF VDIST2(GET_ENTITY_COORDS(sStartCar.veh), vStingerDropPos) < 16.0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_STOP", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_STOP] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
VECTOR vStingerOffsetFromVan, vPlayerOffsetFromVan, vPlayerOffsetFromFrontVan
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
AND IS_VEHICLE_DRIVEABLE(sStartCar.veh)
vStingerOffsetFromVan = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(sGoldVans[0].veh, vStingerDropPos)
vPlayerOffsetFromVan = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(sGoldVans[1].veh, GET_ENTITY_COORDS(sStartCar.veh))
vPlayerOffsetFromFrontVan = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(sGoldVans[0].veh, GET_ENTITY_COORDS(sStartCar.veh))
//PRINTLN(vOffset)
IF vStingerOffsetFromVan.y < 15.0
IF ABSF(vPlayerOffsetFromFrontVan.y) > 16.0 OR ABSF(vPlayerOffsetFromFrontVan.x) > 7.0
IF (vStingerOffsetFromVan.x > -3.0 AND vStingerOffsetFromVan.x < 4.5)
AND vStingerOffsetFromVan.y > -2.0
bStartCutscene = TRUE
ELSE
//Stinger was placed somewhere where the van won't hit it.
MISSION_FAILED(FAILED_MISSED_STINGER)
ENDIF
ELSE
MISSION_FAILED(FAILED_SPOOKED_VAN_PEDS)
ENDIF
ENDIF
//1047839 - Fail if the player tries to drive out the tunnel.
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<305.131708,-649.726440,28.332701>>, <<336.571625,-661.244324,34.574265>>, 28.750000)
MISSION_FAILED(FAILED_SPOOKED_VAN_PEDS)
ENDIF
ENDIF
//Prevent the player from leaving the tunnel, as streaming won't be able to handle the jump back for the cutscene.
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<48.075649,-554.890991,29.939941>>, <<143.673492,-581.898010,34.491451>>, 18.750000)
OR (IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<328.173737,-656.818115,26.821844>>, <<380.210327,-676.598755,39.071918>>, 91.250000)
AND vPlayerOffsetFromVan.y < 1.0)
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
AND IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sStartCar.veh)
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(sStartCar.veh, DEFAULT, -1)
//Start the cutscene early if the player drove off and the vans aren't in view.
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND NOT IS_ENTITY_ON_SCREEN(sGoldVans[0].veh)
bStartCutscene = TRUE
ENDIF
ENDIF
ENDIF
//Start the cutscene if any of the conditions were met.
IF bStartCutscene
CLEAR_PRINTS()
REMOVE_ALL_BLIPS()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() //In case the "hurry up" line was playing, then the player moves out the way.
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
//Burst vehicle tyres if they drive over the stinger.
VEHICLE_INDEX vehClosest
vehClosest = GET_CLOSEST_VEHICLE(vStingerDropPos, 10.0, DUMMY_MODEL_FOR_SCRIPT, GET_TRAFFIC_AND_PLAYER_VEHICLE_SEARCH_FLAGS())
IF IS_VEHICLE_DRIVEABLE(vehClosest)
AND vehClosest != sGoldVans[0].veh
AND NOT IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(vehClosest))
VECTOR vMinOffset, vMaxOffset, vWheelPos1, vWheelPos2, vWheelPos3, vWheelPos4
vMinOffset = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objStinger, <<0.0, -0.5, -0.5>>)
vMaxOffset = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objStinger, <<0.0, 3.5, 1.5>>)
//GET_ENTITY_BONE_INDEX_BY_NAME
vWheelPos1 = GET_WORLD_POSITION_OF_ENTITY_BONE(vehClosest, GET_ENTITY_BONE_INDEX_BY_NAME(vehClosest, "wheel_lf"))
vWheelPos2 = GET_WORLD_POSITION_OF_ENTITY_BONE(vehClosest, GET_ENTITY_BONE_INDEX_BY_NAME(vehClosest, "wheel_rf"))
vWheelPos3 = GET_WORLD_POSITION_OF_ENTITY_BONE(vehClosest, GET_ENTITY_BONE_INDEX_BY_NAME(vehClosest, "wheel_rr"))
vWheelPos4 = GET_WORLD_POSITION_OF_ENTITY_BONE(vehClosest, GET_ENTITY_BONE_INDEX_BY_NAME(vehClosest, "wheel_lr"))
IF IS_POINT_IN_ANGLED_AREA(vWheelPos1, vMinOffset, vMaxOffset, 0.8)
IF NOT IS_VEHICLE_TYRE_BURST(vehClosest, SC_WHEEL_CAR_FRONT_LEFT)
SET_VEHICLE_TYRE_BURST(vehClosest, SC_WHEEL_CAR_FRONT_LEFT, TRUE)
ENDIF
ENDIF
IF IS_POINT_IN_ANGLED_AREA(vWheelPos2, vMinOffset, vMaxOffset, 0.8)
IF NOT IS_VEHICLE_TYRE_BURST(vehClosest, SC_WHEEL_CAR_FRONT_RIGHT)
SET_VEHICLE_TYRE_BURST(vehClosest, SC_WHEEL_CAR_FRONT_RIGHT, TRUE)
ENDIF
ENDIF
IF IS_POINT_IN_ANGLED_AREA(vWheelPos3, vMinOffset, vMaxOffset, 0.8)
IF NOT IS_VEHICLE_TYRE_BURST(vehClosest, SC_WHEEL_CAR_REAR_RIGHT)
SET_VEHICLE_TYRE_BURST(vehClosest, SC_WHEEL_CAR_REAR_RIGHT, TRUE)
ENDIF
ENDIF
IF IS_POINT_IN_ANGLED_AREA(vWheelPos4, vMinOffset, vMaxOffset, 0.8)
IF NOT IS_VEHICLE_TYRE_BURST(vehClosest, SC_WHEEL_CAR_REAR_LEFT)
SET_VEHICLE_TYRE_BURST(vehClosest, SC_WHEEL_CAR_REAR_LEFT, TRUE)
ENDIF
ENDIF
ENDIF
//Need to keep some map streamed in for the next shot.
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_START_SPHERE(<<395.5, -697.8, 30.1>>, 50.0)
ENDIF
//Pre-stream other assets
LOAD_STREAM("Trucks_Hijack", "BIG_SCORE_3A_SOUNDS")
BREAK
ENDSWITCH
IF iCurrentEvent > 0
SWITCH iMusicTriggerEvent
CASE 0 //Trigger the score five seconds after the van arrive cutscene starts (do this outside the main stages in case the player skips the cutscene before 5 seconds has passed).
IF GET_GAME_TIMER() - iMusicStartTimer > 5000
TRIGGER_MUSIC_EVENT("FH2A_MISSION_START_ST")
iMusicStartTimer = GET_GAME_TIMER()
iMusicTriggerEvent++
ENDIF
BREAK
CASE 1 //Prepare the one-shot music trigger for the next cutscene in advance.
IF bHasTextLabelTriggered[F3A_WAITVAN]
AND GET_GAME_TIMER() - iMusicStartTimer > 5000
PREPARE_MUSIC_EVENT("FH2A_MISSION_START_OS")
ENDIF
BREAK
ENDSWITCH
ENDIF
//Audio scenes.
SWITCH iStingerAudioSceneEvent
CASE 0 //First audio scene for the car journey.
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sStartCar.veh)
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_TUNNEL")
START_AUDIO_SCENE("BS_2A_GET_TO_TUNNEL")
ENDIF
iStingerAudioSceneEvent++
ENDIF
ENDIF
BREAK
CASE 1 //Update audio scene when the truck cutscene starts (player control turned off at this point).
IF NOT IS_PLAYER_CONTROL_ON(PLAYER_ID())
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_TUNNEL")
STOP_AUDIO_SCENE("BS_2A_GET_TO_TUNNEL")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_TRUCKS_ARRIVE")
START_AUDIO_SCENE("BS_2A_TRUCKS_ARRIVE")
ENDIF
iStingerAudioSceneEvent++
ENDIF
BREAK
CASE 2 //Update audio scenes when the truck cutscene ends.
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_TRUCKS_ARRIVE")
STOP_AUDIO_SCENE("BS_2A_TRUCKS_ARRIVE")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_DROP_STINGER")
START_AUDIO_SCENE("BS_2A_DROP_STINGER")
ENDIF
iStingerAudioSceneEvent++
ENDIF
BREAK
ENDSWITCH
//Manage the vans: once the player gets close, tell them to drive to the bank.
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
AND IS_VEHICLE_DRIVEABLE(sStartCar.veh)
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
AND NOT IS_PED_INJURED(sGoldVanPeds[VAN_DRIVER_2].ped)
REQUEST_WAYPOINT_RECORDING(strWaypointVehVansToBank)
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehVansToBank)
IF GET_SCRIPT_TASK_STATUS(sGoldVanPeds[CASEY_ID].ped, SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) != PERFORMING_TASK
AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(sGoldVanPeds[CASEY_ID].ped, sGoldVans[0].veh, strWaypointVehVansToBank, DRIVINGMODE_STOPFORCARS_STRICT, 78,
EWAYPOINT_DEFAULT, -1, 15.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[CASEY_ID].ped, TRUE)
ENDIF
IF GET_SCRIPT_TASK_STATUS(sGoldVanPeds[VAN_DRIVER_2].ped, SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) != PERFORMING_TASK
AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(sGoldVanPeds[VAN_DRIVER_2].ped, sGoldVans[1].veh, strWaypointVehVansToBank, DRIVINGMODE_STOPFORCARS_STRICT, 78,
EWAYPOINT_DEFAULT, -1, 15.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[VAN_DRIVER_2].ped, TRUE)
ENDIF
ENDIF
ENDIF
//Fail if the player sits in front of the vans.
IF GET_ENTITY_SPEED(sGoldVans[0].veh) < 1.0
IF GET_GAME_TIMER() - iTimeVansStopped > 15000
MISSION_FAILED(FAILED_SPOOKED_VAN_PEDS)
ENDIF
ELSE
iTimeVansStopped = GET_GAME_TIMER()
ENDIF
//Fail if they get to the tunnel before you plant the stinger
IF NOT DOES_ENTITY_EXIST(objStinger)
AND IS_ENTITY_IN_ANGLED_AREA(sGoldVans[0].veh, <<279.485504,-648.833862,28.325171>>, <<284.913147,-633.059021,32.177643>>, 27.250000)
MISSION_FAILED(FAILED_STINGER_NOT_IN_TIME)
ENDIF
//Fail if the player collides into either of the trucks, or if they're damaged in any way by the player.
IF IS_ENTITY_TOUCHING_ENTITY(sStartCar.veh, sGoldVans[0].veh)
OR IS_ENTITY_TOUCHING_ENTITY(sStartCar.veh, sGoldVans[1].veh)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sGoldVans[0].veh, PLAYER_PED_ID())
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sGoldVans[1].veh, PLAYER_PED_ID())
MISSION_FAILED(FAILED_SPOOKED_VAN_PEDS)
ENDIF
ENDIF
//Stage-specific fail conditions
IF NOT IS_VEHICLE_DRIVEABLE(sStartCar.veh, TRUE)
MISSION_FAILED(FAILED_START_CAR_DESTROYED)
ELSE
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
IF IS_VEHICLE_PERMANENTLY_STUCK(sStartCar.veh)
MISSION_FAILED(FAILED_CAR_STUCK)
ENDIF
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sStartCar.veh)) > 40000.0
MISSION_FAILED(FAILED_ABANDONED_CAR)
ENDIF
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
REMOVE_ALL_BLIPS()
CLEAR_PRINTS()
CLEAR_HELP()
REMOVE_VEHICLE_RECORDING(CARREC_GOLD_VANS_APPEAR, strCarrec)
IF bFranklinsBikeAudioSceneActive
STOP_AUDIO_SCENE("BIG_SCORE_2A_Boost_Franklins_Bike")
bFranklinsBikeAudioSceneActive = FALSE
ENDIF
CLEANUP_PC_CONTROLS()
eMissionStage = STAGE_VAN_CRASH_CUTSCENE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_VAN_CRASH_CUTSCENE)
ENDIF
ENDPROC
PROC VAN_CRASH_CUTSCENE()
INT i = 0
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF SETUP_REQ_PLAYER_IS_MICHAEL()
AND SETUP_REQ_TREVOR(<<242.4482, -616.4299, 27.6035>>, 215.3280)
AND SETUP_REQ_MAIN_DRIVER(<<248.2831, -614.3350, 27.7058>>, 218.3951)
AND SETUP_REQ_MAIN_GUNMAN(<<249.2831, -614.3350, 27.7058>>, 218.3951)
AND SETUP_REQ_START_CAR(<<241.8352, -613.7300, 27.5132>>, 119.6201)
AND SETUP_REQ_BANK_SECURITY()
AND SETUP_REQ_GOLD_VANS_PRE_HIJACK(<<0.0, 0.0, 0.0>>, 0.0, <<0.0, 0.0, 0.0>>, 0.0)
AND SETUP_REQ_TUNNEL_INTERIOR_LOADED()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<243.3412, -611.8222, 27.6962>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 232.4222)
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
ENDIF
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_HIJACK_01")
REQUEST_MODEL(modelStinger)
REQUEST_ANIM_DICT(strStingerAnims)
REQUEST_VEHICLE_RECORDING(CARREC_VAN_STINGER_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_VAN_STINGER_2, strCarrec)
REQUEST_PTFX_ASSET()
LOAD_STREAM("Trucks_Hijack", "BIG_SCORE_3A_SOUNDS")
IF HAS_MODEL_LOADED(modelStinger)
AND HAS_ANIM_DICT_LOADED(strStingerAnims)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_VAN_STINGER_1, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_VAN_STINGER_2, strCarrec)
AND HAS_PTFX_ASSET_LOADED()
AND LOAD_STREAM("Trucks_Hijack", "BIG_SCORE_3A_SOUNDS")
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
IF IS_SCREEN_FADED_OUT()
REQUEST_COLLISION_AT_COORD(<<243.3412, -611.8222, 27.6962>>)
LOAD_SCENE(<<264.9509, -629.4653, 27.8277>>)
WAIT(1000)
TRIGGER_MUSIC_EVENT("FH2A_MISSION_RESTART")
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_LOCKED_PLAYER_INSIDE)
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, CARREC_VAN_STINGER_1, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, 9500.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[0].veh)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
SET_VEHICLE_DOORS_LOCKED(sGoldVans[1].veh, VEHICLELOCK_LOCKED_PLAYER_INSIDE)
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, CARREC_VAN_STINGER_2, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, 9500.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[1].veh)
ENDIF
ENDIF
SET_ROADS_IN_AREA(<<320.0534, -700.1548, 28.2937>>, <<393.6534, -633.9548, 48.2937>>, FALSE)
SET_ROADS_IN_ANGLED_AREA(<<328.408264,-737.851563,27.344345>>, <<387.132874,-603.286560,38.589233>>, 43.500000, FALSE, FALSE)
CLEAR_AREA(<<292.7276, -640.21, 28.1260>>, 300.0, TRUE)
IF NOT DOES_ENTITY_EXIST(objStinger)
objStinger = CREATE_OBJECT(modelStinger, <<292.7276, -640.21, 28.1260>>)
ENDIF
SET_ENTITY_COORDS(objStinger, <<292.7276, -640.21, 28.1760>>)
SET_ENTITY_ROTATION(objStinger, <<2.5, 0.0, 160.2906>>)
//APPLY_FORCE_TO_ENTITY(objStinger, APPLY_TYPE_IMPULSE, <<0.0, 0.0, -0.01>>, <<0.0, 0.0, 0.0>>, 0, TRUE, TRUE, TRUE)
FREEZE_ENTITY_POSITION(objStinger, TRUE)
PLAY_ENTITY_ANIM(objStinger, "P_Stinger_S_idle_deployed", strStingerAnims, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.99)
SET_MODEL_AS_NO_LONGER_NEEDED(modelStinger)
REPEAT COUNT_OF(sGoldVanPeds) i
IF NOT IS_PED_INJURED(sGoldVanPeds[i].ped)
TASK_STAND_STILL(sGoldVanPeds[i].ped, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[i].ped, TRUE)
ENDIF
ENDREPEAT
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
SET_ENTITY_COORDS(sStartCar.veh, <<241.8352, -613.7300, 27.5132>>)
SET_ENTITY_HEADING(sStartCar.veh, 242.2577)
SET_VEHICLE_RADIO_ENABLED(sStartCar.veh, FALSE)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF IS_PED_IN_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
TASK_STAND_STILL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -1)
REMOVE_PED_FROM_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
IF IS_PED_IN_GROUP(sCrew[CREW_DRIVER].ped)
TASK_STAND_STILL(sCrew[CREW_DRIVER].ped, -1)
REMOVE_PED_FROM_GROUP(sCrew[CREW_DRIVER].ped)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_DRIVER].ped, TRUE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
IF IS_PED_IN_GROUP(sCrew[CREW_GUNMAN].ped)
TASK_STAND_STILL(sCrew[CREW_GUNMAN].ped, -1)
REMOVE_PED_FROM_GROUP(sCrew[CREW_GUNMAN].ped)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_GUNMAN].ped, TRUE)
ENDIF
ENDIF
STOP_AUDIO_SCENES()
IF LOAD_STREAM("Trucks_Hijack", "BIG_SCORE_3A_SOUNDS")
PLAY_STREAM_FRONTEND()
ENDIF
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<243.3412, -611.8222, 27.6962>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 232.4222)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, 300, TRUE)
camMain = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA",<<291.629791,-640.293152,28.286768>>,<<5.630339,0.007819,-121.191566>>,38.770943, TRUE)
SET_CAM_PARAMS(camMain,<<291.632172,-640.294800,28.287039>>,<<6.698129,0.007819,-121.191566>>,38.770943, 1550, GRAPH_TYPE_ACCEL, GRAPH_TYPE_ACCEL)
SHAKE_CAM(camMain, "HAND_SHAKE", 0.2)
SET_ROOM_FOR_GAME_VIEWPORT_BY_NAME("GtaMloRoom001")
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
IF NOT IS_SCREEN_FADED_IN()
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_IN()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
WAIT(0)
ENDWHILE
ENDIF
//Add this cutscene to the captured footage.
IF NOT bReplayEventStarted
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
bReplayEventStarted = TRUE
ENDIF
NEW_LOAD_SCENE_STOP()
SETTIMERA(0)
SETTIMERB(0)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
IF IS_ENTITY_PLAYING_ANIM(objStinger, strStingerAnims, "P_Stinger_S_Deploy")
IF GET_ENTITY_ANIM_CURRENT_TIME(objStinger, strStingerAnims, "P_Stinger_S_Deploy") < 0.99
SET_ENTITY_ANIM_CURRENT_TIME(objStinger, strStingerAnims, "P_Stinger_S_Deploy", 0.99)
SET_ENTITY_ANIM_SPEED(objStinger, strStingerAnims, "P_Stinger_S_Deploy", 0.0)
ENDIF
ENDIF
FLOAT fVanPlaybackTime = 0.0
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
fVanPlaybackTime = GET_TIME_POSITION_IN_RECORDING(sGoldVans[0].veh)
ENDIF
ENDIF
REQUEST_ANIM_DICT(strAnimsHijack)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
SET_FORCE_HD_VEHICLE(sGoldVans[0].veh, TRUE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
SET_FORCE_HD_VEHICLE(sGoldVans[1].veh, TRUE)
ENDIF
SWITCH iCurrentEvent
CASE 0
PREPARE_MUSIC_EVENT("FH2A_MISSION_START_OS")
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF fVanPlaybackTime > 10960.0
//FORCE_ROOM_FOR_GAME_VIEWPORT(interiorTunnel3, HASH("GtaMloRoom017")) //Maybe need to wait a frame?
//WAIT(0)
SHAKE_CAM(camMain, "HAND_SHAKE", 0.3)
SET_CAM_PARAMS(camMain, <<267.228760,-642.403564,28.581345>>, <<2.570032,-0.036703,-87.163521>>, 21.916695, 0)
SET_CAM_PARAMS(camMain, <<267.228760,-642.403564,28.581345>>, <<6.112918,-0.036703,-55.098663>>, 26.457375, CEIL(12276.0 - 10960.0),
GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
//SET_ROOM_FOR_GAME_VIEWPORT_BY_NAME("GtaMloRoom001")
IF NOT IS_ENTITY_DEAD(sGoldVans[0].veh)
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_bigscore_tyre_spiked", sGoldVans[0].veh, <<-1.500, 3.000, -0.300>>, <<0.0, 0.0, 180.0>>)
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_bigscore_tyre_spiked", sGoldVans[0].veh, <<1.500, 3.000, -0.300>>, <<0.0, 0.0, 0.0>>)
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_FRONT_LEFT, FALSE, 1)
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_FRONT_RIGHT, FALSE, 1)
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_LEFT, FALSE, 1)
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_RIGHT, FALSE, 1)
SET_VEHICLE_TYRES_CAN_BURST(sGoldVans[0].veh, FALSE)
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_HIJACK_01")
PLAY_SOUND_FROM_ENTITY(-1, "BLOWOUT", sGoldVans[0].veh, "BIG_SCORE_3A_SOUNDS")
ENDIF
ENDIF
FREEZE_ENTITY_POSITION(objStinger, TRUE)
TRIGGER_MUSIC_EVENT("FH2A_MISSION_START_OS")
//This is a good moment to pre-load the hijack conversation (on disc-builds this takes a while to load).
ADD_PED_FOR_DIALOGUE(sConversationPeds, 3, sCrew[CREW_GUNMAN].ped, "GUNMAN1")
PRELOAD_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS1_LI", CONV_PRIORITY_MEDIUM)
SETTIMERB(0)
iCurrentEvent++
ENDIF
ENDIF
BREAK
CASE 1
IF TIMERB() > 350
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_bigscore_tyre_spiked", sGoldVans[0].veh, <<-1.500, -3.000, -0.300>>, <<0.0, 0.0, 180.0>>)
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_bigscore_tyre_spiked", sGoldVans[0].veh, <<1.500, -3.000, -0.300>>, <<0.0, 0.0, 0.0>>)
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 2
IF fVanPlaybackTime > 12276.0
SET_CAM_PARAMS(camMain, <<254.448059,-621.939453,28.652695>>,<<0.059326,-0.075160,-130.091187>>,39.955532, 0)
SET_CAM_PARAMS(camMain, <<254.448059,-621.939453,28.652695>>,<<3.515683,-0.032602,-141.296677>>,39.955532, 2500, GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 3
IF fVanPlaybackTime > 12624.0
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_bigscore_tyre_spiked", sGoldVans[1].veh, <<-1.500, 3.000, -0.300>>, <<0.0, 0.0, 180.0>>)
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_bigscore_tyre_spiked", sGoldVans[1].veh, <<1.500, 3.000, -0.300>>, <<0.0, 0.0, 0.0>>)
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_FRONT_LEFT, FALSE, 1.0)
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_FRONT_RIGHT, FALSE, 1.0)
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_REAR_LEFT, FALSE, 1.0)
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_REAR_RIGHT, FALSE, 1.0)
SET_VEHICLE_TYRES_CAN_BURST(sGoldVans[1].veh, FALSE)
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_HIJACK_01")
PLAY_SOUND_FROM_ENTITY(-1, "BLOWOUT_B", sGoldVans[1].veh, "BIG_SCORE_3A_SOUNDS")
ENDIF
SETTIMERB(0)
iCurrentEvent++
ENDIF
ENDIF
BREAK
CASE 4
IF TIMERB() > 350
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_bigscore_tyre_spiked", sGoldVans[1].veh, <<-1.500, -3.000, -0.300>>, <<0.0, 0.0, 180.0>>)
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_bigscore_tyre_spiked", sGoldVans[1].veh, <<1.500, -3.000, -0.300>>, <<0.0, 0.0, 0.0>>)
SETTIMERB(0)
iCurrentEvent++
ENDIF
ENDIF
BREAK
CASE 5 //Start the mocap after the scripted shot of the vans arriving finishes.
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh) AND GET_ENTITY_SPEED(sGoldVans[1].veh) < 0.1
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
BREAK
ENDSWITCH
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
IF bReplayEventStarted
REPLAY_STOP_EVENT()
bReplayEventStarted = FALSE
ENDIF
eSectionStage = SECTION_STAGE_SKIP
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
CLEAR_PRINTS()
REMOVE_ALL_BLIPS()
IF bReplayEventStarted
REPLAY_STOP_EVENT()
bReplayEventStarted = FALSE
ENDIF
REMOVE_PTFX_ASSET()
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_HIJACK_01")
eMissionStage = STAGE_HIJACK_VANS
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
DO_FADE_OUT_WITH_WAIT()
STOP_STREAM()
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDPROC
PROC HIJACK_VANS_PART_2()
INT i = 0
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_AIM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_RADIO_WHEEL)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CELLPHONE_UP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK1)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
//DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
REQUEST_MODEL(modelStinger)
REQUEST_ANIM_DICT(strStingerAnims)
IF SETUP_REQ_PLAYER_IS_MICHAEL()
AND SETUP_REQ_TREVOR(<<242.4482, -616.4299, 27.6035>>, 215.3280)
AND SETUP_REQ_MAIN_DRIVER(<<248.2831, -614.3350, 27.7058>>, 218.3951)
AND SETUP_REQ_MAIN_GUNMAN(<<249.2831, -614.3350, 27.7058>>, 218.3951)
AND SETUP_REQ_START_CAR(<<241.8352, -613.7300, 27.5132>>, 119.6201)
AND SETUP_REQ_BANK_SECURITY()
AND SETUP_REQ_GOLD_VANS_PRE_HIJACK(<<0.0, 0.0, 0.0>>, 0.0, <<0.0, 0.0, 0.0>>, 0.0)
AND SETUP_REQ_TUNNEL_INTERIOR_LOADED()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
AND HAS_ANIM_DICT_LOADED(strStingerAnims)
AND HAS_MODEL_LOADED(modelStinger)
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<243.3412, -611.8222, 27.6962>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 232.4222)
objStinger = CREATE_OBJECT(modelStinger, <<292.7276, -640.21, 28.1260>>)
SET_ENTITY_COORDS(objStinger, <<292.7276, -640.21, 28.1760>>)
SET_ENTITY_ROTATION(objStinger, <<2.5, 0.0, 160.2906>>)
FREEZE_ENTITY_POSITION(objStinger, TRUE)
PLAY_ENTITY_ANIM(objStinger, "P_Stinger_S_idle_deployed", strStingerAnims, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.99)
SET_MODEL_AS_NO_LONGER_NEEDED(modelStinger)
SETUP_REQ_VAN_TYRES_ARE_BURST()
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_ANIM_DICT(strAnimsHijack)
IF HAS_ANIM_DICT_LOADED(strAnimsHijack)
IF IS_SCREEN_FADED_OUT()
//Preload the conversation in case the previous cutscene was skipped.
ADD_PED_FOR_DIALOGUE(sConversationPeds, 3, sCrew[CREW_GUNMAN].ped, "GUNMAN1")
PRELOAD_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS1_LI", CONV_PRIORITY_MEDIUM)
REQUEST_COLLISION_AT_COORD(<<237.6041, -613.1452, 28.1464>>)
LOAD_SCENE(<<237.6041, -613.1452, 28.1464>>)
WAIT(1000)
TRIGGER_MUSIC_EVENT("FH2A_MISSION_RESTART")
ENDIF
//Create the synched scenes.
iSyncSceneHijackCars = CREATE_SYNCHRONIZED_SCENE(<<251.686, -623.183, 27.566>>, <<-0.000, 0.000, -0.360>>)
//Place the vans into their positions, and guarantee the tyres are down.
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
ENDIF
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_FRONT_LEFT)
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_FRONT_LEFT, FALSE, 1.0)
ENDIF
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_FRONT_RIGHT)
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_FRONT_RIGHT, FALSE, 1.0)
ENDIF
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_REAR_LEFT)
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_REAR_LEFT, FALSE, 1.0)
ENDIF
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_REAR_RIGHT)
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_REAR_RIGHT, FALSE, 1.0)
ENDIF
SET_VEHICLE_TYRES_CAN_BURST(sGoldVans[1].veh, FALSE)
PLAY_SYNCHRONIZED_ENTITY_ANIM(sGoldVans[1].veh, iSyncSceneHijackCars, "_leadin_stickup_stockade_b", strAnimsHijack, INSTANT_BLEND_IN, DEFAULT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
//SET_ENTITY_COORDS_NO_OFFSET(sGoldVans[1].veh, <<262.6830, -627.0226, 28.2027>>)
//SET_ENTITY_ROTATION(sGoldVans[1].veh, <<-0.5864, 1.8133, 87.6112>>)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
SET_ENTITY_HEADING(sStartCar.veh, 62.0345)
SET_ENTITY_COORDS(sStartCar.veh, <<248.5367, -618.7416, 27.5541>>)
//SET_VEHICLE_ON_GROUND_PROPERLY(sStartCar.veh)
SET_VEHICLE_RADIO_ENABLED(sStartCar.veh, FALSE)
SET_VEHICLE_DOORS_LOCKED(sStartCar.veh, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
//PLAY_SYNCHRONIZED_ENTITY_ANIM(sStartCar.veh, iSyncSceneHijackCars, "_leadin_stickup_dubsta", strAnimsHijack, INSTANT_BLEND_IN, DEFAULT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
PLAY_ENTITY_ANIM(sStartCar.veh, "_leadin_Stickup_DUBSTA_allDOORS", strAnimsHijack, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.0, ENUM_TO_INT(AF_USE_KINEMATIC_PHYSICS))
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(sStartCar.veh)
SET_VEHICLE_DOOR_SHUT(sStartCar.veh, SC_DOOR_FRONT_LEFT, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sStartCar.veh, VS_DRIVER)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_ASSAULTRIFLE, 300, TRUE)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ASSAULTRIFLE, TRUE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
ENDIF
//Get the crew members ready: they start in the car with their guns.
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
CLEAR_PED_TASKS_IMMEDIATELY(sCrew[CREW_DRIVER].ped)
IF NOT HAS_PED_GOT_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_ASSAULTRIFLE)
GIVE_WEAPON_TO_PED(sCrew[CREW_DRIVER].ped, WEAPONTYPE_ASSAULTRIFLE, INFINITE_AMMO)
ENDIF
SET_CURRENT_PED_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_ASSAULTRIFLE, TRUE)
TASK_SYNCHRONIZED_SCENE(sCrew[CREW_DRIVER].ped, iSyncSceneHijackCars, strAnimsHijack, "_leadin_stickup_henchman_a", INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT | RBF_MELEE | RBF_FALLING)
SET_FORCE_FOOTSTEP_UPDATE(sCrew[CREW_DRIVER].ped, TRUE)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
CLEAR_PED_TASKS_IMMEDIATELY(sCrew[CREW_GUNMAN].ped)
IF NOT HAS_PED_GOT_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_ASSAULTRIFLE)
GIVE_WEAPON_TO_PED(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_ASSAULTRIFLE, INFINITE_AMMO)
ENDIF
SET_CURRENT_PED_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_ASSAULTRIFLE, TRUE)
TASK_SYNCHRONIZED_SCENE(sCrew[CREW_GUNMAN].ped, iSyncSceneHijackCars, strAnimsHijack, "_leadin_stickup_henchman_b", INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT | RBF_MELEE | RBF_FALLING)
SET_FORCE_FOOTSTEP_UPDATE(sCrew[CREW_GUNMAN].ped, TRUE)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
CLEAR_PED_TASKS_IMMEDIATELY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_ASSAULTRIFLE)
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_ASSAULTRIFLE, 500)
ENDIF
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_ASSAULTRIFLE, TRUE)
TASK_SYNCHRONIZED_SCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], iSyncSceneHijackCars, strAnimsHijack, "_leadin_stickup_trevor", INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT | RBF_MELEE | RBF_FALLING)
SET_FORCE_FOOTSTEP_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
ENDIF
ENDIF
WAIT(0)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
ENDIF
//If none of the tyres burst (e.g. cutscene was skipped) then burst them now.
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_FRONT_LEFT)
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_FRONT_LEFT, FALSE, 1.0)
ENDIF
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_FRONT_RIGHT)
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_FRONT_RIGHT, FALSE, 1.0)
ENDIF
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_LEFT)
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_LEFT, FALSE, 1.0)
ENDIF
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_RIGHT)
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_RIGHT, FALSE, 1.0)
ENDIF
SET_VEHICLE_TYRES_CAN_BURST(sGoldVans[0].veh, FALSE)
SET_ENTITY_COORDS_NO_OFFSET(sGoldVans[0].veh, <<252.2688, -627.3983, 28.1011>>)
SET_ENTITY_ROTATION(sGoldVans[0].veh, <<0.5062, -2.3079, 18.8871>>)
PLAY_ENTITY_ANIM(sGoldVans[0].veh, "_LeadIn_Stickup_STOCKADE_A_FPS_door", strAnimsHijack, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.0, ENUM_TO_INT(AF_USE_KINEMATIC_PHYSICS))
//BRING_VEHICLE_TO_HALT(sGoldVans[0].veh, 0.0, 60)
//PLAY_SYNCHRONIZED_ENTITY_ANIM(sGoldVans[0].veh, iSyncSceneHijackCars, "_LeadIn_Stickup_STOCKADE_A_FPS_door", strAnimsHijack, INSTANT_BLEND_IN, DEFAULT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
ENDIF
//Get the hostages playing their synced scenes.
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
TASK_PLAY_ANIM(sGoldVanPeds[CASEY_ID].ped, strAnimsHijack, "_leadin_idles_victim_a", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sGoldVanPeds[CASEY_ID].ped)
SET_ENTITY_IS_TARGET_PRIORITY(sGoldVanPeds[CASEY_ID].ped, TRUE)
SET_FORCE_FOOTSTEP_UPDATE(sGoldVanPeds[CASEY_ID].ped, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[CASEY_ID].ped, TRUE)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[1].ped)
CLEAR_PED_TASKS_IMMEDIATELY(sGoldVanPeds[1].ped)
TASK_SYNCHRONIZED_SCENE(sGoldVanPeds[1].ped, iSyncSceneHijackCars, strAnimsHijack, "_leadin_stickup_victim_b", INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT | RBF_MELEE | RBF_FALLING)
SET_FORCE_FOOTSTEP_UPDATE(sGoldVanPeds[1].ped, TRUE)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[2].ped)
CLEAR_PED_TASKS_IMMEDIATELY(sGoldVanPeds[2].ped)
TASK_SYNCHRONIZED_SCENE(sGoldVanPeds[2].ped, iSyncSceneHijackCars, strAnimsHijack, "_leadin_stickup_victim_c", INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT | RBF_MELEE | RBF_FALLING)
SET_FORCE_FOOTSTEP_UPDATE(sGoldVanPeds[2].ped, TRUE)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[3].ped)
CLEAR_PED_TASKS_IMMEDIATELY(sGoldVanPeds[3].ped)
TASK_SYNCHRONIZED_SCENE(sGoldVanPeds[3].ped, iSyncSceneHijackCars, strAnimsHijack, "_leadin_stickup_victim_d", INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT | RBF_MELEE | RBF_FALLING)
SET_FORCE_FOOTSTEP_UPDATE(sGoldVanPeds[3].ped, TRUE)
ENDIF
SET_WANTED_LEVEL_MULTIPLIER(0.0)
//Remove previous assets.
REMOVE_ALL_AUDIO_SCENES()
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_1, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_2, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_BUDDIES, strCarrec)
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(180.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
IF NOT IS_SCREEN_FADED_IN()
CLEAR_AREA(<<251.686, -623.183, 27.566>>, 500.0, TRUE)
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_IN()
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
SET_FORCE_HD_VEHICLE(sGoldVans[0].veh, TRUE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
SET_FORCE_HD_VEHICLE(sGoldVans[1].veh, TRUE)
ENDIF
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
WAIT(0)
ENDWHILE
ENDIF
//A couple of cars are potentially spawning in the frame wait, so clear again.
CLEAR_AREA_OF_VEHICLES(<<251.686, -623.183, 27.566>>, 500.0, TRUE)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
sGoldVanPeds[CASEY_ID].iEvent = 0
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SETTIMERA(0)
SETTIMERB(0)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
IF IS_ENTITY_PLAYING_ANIM(objStinger, strStingerAnims, "P_Stinger_S_Deploy")
IF GET_ENTITY_ANIM_CURRENT_TIME(objStinger, strStingerAnims, "P_Stinger_S_Deploy") < 0.99
SET_ENTITY_ANIM_CURRENT_TIME(objStinger, strStingerAnims, "P_Stinger_S_Deploy", 0.99)
SET_ENTITY_ANIM_SPEED(objStinger, strStingerAnims, "P_Stinger_S_Deploy", 0.0)
ENDIF
ENDIF
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<220.055954,-607.254761,27.220724>>, <<266.921509,-633.257568,32.445583>>, 23.250000)
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
SET_FORCE_HD_VEHICLE(sGoldVans[0].veh, TRUE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
SET_FORCE_HD_VEHICLE(sGoldVans[1].veh, TRUE)
ENDIF
REQUEST_CUTSCENE("bs_2a_mcs_1")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_1")
SETUP_REQ_FORCED_CREW()
SETUP_REQ_CREW_VAN(<<353.1693, -644.8009, 28.2688>>, 148.9754)
IF NOT bHasTextLabelTriggered[FH3A_MCS1_LI]
BEGIN_PRELOADED_CONVERSATION()
//ADD_PED_FOR_DIALOGUE(sConversationPeds, 3, sCrew[CREW_GUNMAN].ped, "GUNMAN1")
//IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS1_LI", CONV_PRIORITY_MEDIUM)
// bHasTextLabelTriggered[FH3A_MCS1_LI] = TRUE
//ENDIF
ELIF NOT bHasTextLabelTriggered[F3A_JACKVANS]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
//PRINT_NOW("F3A_JACKVANS", DEFAULT_GOD_TEXT_TIME, 0)
bHasTextLabelTriggered[F3A_JACKVANS] = TRUE
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_THR]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_THR", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_THR] = TRUE
ENDIF
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_PED_RESET_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PRF_DisableFriendlyGunReactAudio, TRUE)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_PED_RESET_FLAG(sCrew[CREW_DRIVER].ped, PRF_DisableFriendlyGunReactAudio, TRUE)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_PED_RESET_FLAG(sCrew[CREW_DRIVER].ped, PRF_DisableFriendlyGunReactAudio, TRUE)
ENDIF
SWITCH iCurrentEvent
CASE 0 //Get the buddies out of the car
REPLAY_RECORD_BACK_FOR_TIME(0.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
SETTIMERB(0)
iCurrentEvent++
BREAK
CASE 1
IF TIMERB() > 1800
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 2
IF (IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneHijackCars) AND GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneHijackCars) >= 0.98)
//OR (bHasTextLabelTriggered[FH3A_MCS1_LI] AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND TIMERB() > 3000)
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
BREAK
ENDSWITCH
IF sGoldVanPeds[CASEY_ID].iEvent = 0
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF (NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND (IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), sGoldVanPeds[CASEY_ID].ped) OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sGoldVanPeds[CASEY_ID].ped))
AND TIMERA() > 5700)
OR TIMERA() > 9500
PLAY_PED_AMBIENT_SPEECH(sGoldVanPeds[CASEY_ID].ped, "AIMED_AT_BY_PLAYER", SPEECH_PARAMS_FORCE)
iSyncSceneHijackCasey = CREATE_SYNCHRONIZED_SCENE(<<251.686, -623.183, 27.566>>, <<-0.000, 0.000, -0.360>>)
TASK_SYNCHRONIZED_SCENE(sGoldVanPeds[CASEY_ID].ped, iSyncSceneHijackCasey, strAnimsHijack, "_LeadIn_Stickup_michaels_VICTIM_A", WALK_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT | RBF_MELEE | RBF_FALLING, INSTANT_BLEND_IN)
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncSceneHijackCasey, FALSE)
SET_VEHICLE_DOOR_OPEN(sGoldVans[0].veh, SC_DOOR_FRONT_LEFT)
//PLAY_ENTITY_ANIM(sGoldVans[0].veh, "_LeadIn_Stickup_michaels_STOCKADE_A_FDS_door", strAnimsHijack, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.0, ENUM_TO_INT(AF_USE_KINEMATIC_PHYSICS))
sGoldVanPeds[CASEY_ID].iTimer = GET_GAME_TIMER()
sGoldVanPeds[CASEY_ID].iEvent++
ENDIF
ENDIF
ELSE
IF GET_GAME_TIMER() - sGoldVanPeds[CASEY_ID].iTimer > 2000
PLAY_PED_AMBIENT_SPEECH(sGoldVanPeds[CASEY_ID].ped, "GENERIC_FRIGHTENED_MED", SPEECH_PARAMS_FORCE)
sGoldVanPeds[CASEY_ID].iTimer = GET_GAME_TIMER()
ENDIF
ENDIF
IF GET_GAME_TIMER() - iHijackSpeechTimer > 1000
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
INT iSpeaker = GET_RANDOM_INT_IN_RANGE(1, 4)
IF NOT IS_PED_INJURED(sGoldVanPeds[iSpeaker].ped)
PLAY_PED_AMBIENT_SPEECH(sGoldVanPeds[iSpeaker].ped, "GENERIC_FRIGHTENED_MED", SPEECH_PARAMS_FORCE)
iHijackSpeechTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(0, 500)
ENDIF
ENDIF
REPEAT COUNT_OF(sGoldVanPeds) i
IF NOT IS_PED_INJURED(sGoldVanPeds[i].ped)
//Do instant deaths on any ped if the player tries to shoot them.
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sGoldVanPeds[i].ped, PLAYER_PED_ID())
APPLY_DAMAGE_TO_PED(sGoldVanPeds[i].ped, GET_ENTITY_HEALTH(sGoldVanPeds[i].ped) + 50, TRUE)
ENDIF
ENDIF
ENDREPEAT
//Crew van behaviour: get them to drive around the corner.
IF IS_VEHICLE_DRIVEABLE(vehBuddyVan)
AND NOT IS_PED_INJURED(sCrew[CREW_FORCED_DRIVER].ped)
AND NOT IS_PED_INJURED(sCrew[CREW_FORCED_GUNMAN].ped)
IF NOT IS_PED_IN_VEHICLE(sCrew[CREW_FORCED_DRIVER].ped, vehBuddyVan)
SET_PED_INTO_VEHICLE(sCrew[CREW_FORCED_DRIVER].ped, vehBuddyVan)
ELSE
IF GET_SCRIPT_TASK_STATUS(sCrew[CREW_FORCED_DRIVER].ped, SCRIPT_TASK_VEHICLE_DRIVE_TO_COORD) != PERFORMING_TASK
IF TIMERA() > 10500
TASK_VEHICLE_DRIVE_TO_COORD(sCrew[CREW_FORCED_DRIVER].ped, vehBuddyVan, <<271.2136, -635.4591, 27.5957>>, 20.0,
DRIVINGSTYLE_NORMAL, modelBuddyVan, DRIVINGMODE_PLOUGHTHROUGH, 5.0, 20.0)
ENDIF
ENDIF
ENDIF
IF NOT IS_PED_IN_VEHICLE(sCrew[CREW_FORCED_GUNMAN].ped, vehBuddyVan)
SET_PED_INTO_VEHICLE(sCrew[CREW_FORCED_GUNMAN].ped, vehBuddyVan, VS_FRONT_RIGHT)
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REMOVE_ALL_BLIPS()
KILL_FACE_TO_FACE_CONVERSATION()
eMissionStage = STAGE_HIJACK_CUTSCENE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_HIJACK_CUTSCENE)
ENDIF
ENDPROC
PROC HIJACK_CUTSCENE()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF SETUP_REQ_PLAYER_IS_MICHAEL()
AND SETUP_REQ_TREVOR(<<242.4482, -616.4299, 27.6035>>, 215.3280)
AND SETUP_REQ_MAIN_DRIVER(<<248.2831, -614.3350, 27.7058>>, 218.3951)
AND SETUP_REQ_MAIN_GUNMAN(<<249.2831, -614.3350, 27.7058>>, 218.3951)
AND SETUP_REQ_START_CAR(<<241.8352, -613.7300, 27.5132>>, 119.6201)
AND SETUP_REQ_BANK_SECURITY()
AND SETUP_REQ_GOLD_VANS_PRE_HIJACK(<<0.0, 0.0, 0.0>>, 0.0, <<0.0, 0.0, 0.0>>, 0.0)
AND SETUP_REQ_TUNNEL_INTERIOR_LOADED()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<243.3412, -611.8222, 27.6962>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 232.4222)
SETUP_REQ_VAN_TYRES_ARE_BURST()
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
//2016339 - Don't remove player control until the cutscene has fully started. Instead, disable the controls we don't want the player to use.
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_AIM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_RADIO_WHEEL)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CELLPHONE_UP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK1)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
SET_FORCE_HD_VEHICLE(sGoldVans[0].veh, TRUE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
SET_FORCE_HD_VEHICLE(sGoldVans[1].veh, TRUE)
ENDIF
SETUP_REQ_FORCED_CREW(TRUE)
SETUP_REQ_CREW_VAN(<<358.6120, -637.1446, 28.9746>>, 0.0, TRUE)
REQUEST_CUTSCENE("bs_2a_mcs_1")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_1")
IF SETUP_REQ_FORCED_CREW()
AND SETUP_REQ_CREW_VAN(<<358.6120, -637.1446, 28.9746>>)
AND HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
IF IS_SCREEN_FADED_OUT()
REQUEST_COLLISION_AT_COORD(<<243.3412, -611.8222, 27.6962>>)
LOAD_SCENE(<<264.9509, -629.4653, 27.8277>>)
WAIT(1000)
TRIGGER_MUSIC_EVENT("FH2A_MISSION_RESTART")
ENDIF
REMOVE_ALL_AUDIO_SCENES()
//Register entities
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
//STOP_SYNCHRONIZED_ENTITY_ANIM(sGoldVans[0].veh, NORMAL_BLEND_OUT, TRUE)
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_LOCKED_PLAYER_INSIDE)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[0].veh, "Trevors_Truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, DUMMY_MODEL_FOR_SCRIPT, CEO_IS_CASCADE_SHADOW_FOCUS_ENTITY_DURING_EXIT)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
//STOP_SYNCHRONIZED_ENTITY_ANIM(sGoldVans[1].veh, NORMAL_BLEND_OUT, TRUE)
SET_VEHICLE_DOORS_LOCKED(sGoldVans[1].veh, VEHICLELOCK_LOCKED_PLAYER_INSIDE)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[1].veh, "Michaels_Truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vehBuddyVan)
REGISTER_ENTITY_FOR_CUTSCENE(vehBuddyVan, "FBI_2_Burrito_Van", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
STOP_SYNCHRONIZED_ENTITY_ANIM(sStartCar.veh, WALK_BLEND_OUT, TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(sStartCar.veh, "EXL_2_abandoned_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
STOP_SYNCHRONIZED_ENTITY_ANIM(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WALK_BLEND_OUT, TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
SET_FORCE_FOOTSTEP_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
STOP_SYNCHRONIZED_ENTITY_ANIM(sGoldVanPeds[CASEY_ID].ped, WALK_BLEND_OUT, TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[CASEY_ID].ped, "Casey", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
SET_FORCE_FOOTSTEP_UPDATE(sGoldVanPeds[CASEY_ID].ped, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[CASEY_ID].ped, FALSE)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[1].ped)
STOP_SYNCHRONIZED_ENTITY_ANIM(sGoldVanPeds[1].ped, WALK_BLEND_OUT, TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[1].ped, "Left_Security", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
SET_FORCE_FOOTSTEP_UPDATE(sGoldVanPeds[1].ped, FALSE)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[2].ped)
STOP_SYNCHRONIZED_ENTITY_ANIM(sGoldVanPeds[2].ped, WALK_BLEND_OUT, TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[2].ped, "Middle_Security", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
SET_FORCE_FOOTSTEP_UPDATE(sGoldVanPeds[2].ped, FALSE)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[3].ped)
STOP_SYNCHRONIZED_ENTITY_ANIM(sGoldVanPeds[3].ped, WALK_BLEND_OUT, TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[3].ped, "Right_Security", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
SET_FORCE_FOOTSTEP_UPDATE(sGoldVanPeds[3].ped, FALSE)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_FORCED_GUNMAN].ped)
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_FORCED_GUNMAN].ped, "gunman_selection_2", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_FORCED_DRIVER].ped)
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_FORCED_DRIVER].ped, "driver_selection_2", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
STOP_SYNCHRONIZED_ENTITY_ANIM(sCrew[CREW_GUNMAN].ped, WALK_BLEND_OUT, TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_GUNMAN].ped, "gunman_selection_1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
SET_FORCE_FOOTSTEP_UPDATE(sCrew[CREW_GUNMAN].ped, FALSE)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
STOP_SYNCHRONIZED_ENTITY_ANIM(sCrew[CREW_DRIVER].ped, WALK_BLEND_OUT, TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_DRIVER].ped, "Driver_selection_1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
SET_FORCE_FOOTSTEP_UPDATE(sCrew[CREW_DRIVER].ped, FALSE)
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
IF NOT IS_SCREEN_FADED_IN()
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_IN()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
WAIT(0)
ENDWHILE
ENDIF
SETTIMERA(0)
SETTIMERB(0)
bPlayersCarExitStateHasBeenHit = FALSE
iCurrentEvent = 0
iMusicTriggerEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
SWITCH iCurrentEvent
CASE 0
IF IS_CUTSCENE_PLAYING()
CLEAR_AREA(<<292.7276, -640.21, 28.1260>>, 300.0, TRUE)
SET_CLOCK_TIME(8, 15, 0)
CLEAR_PRINTS()
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
REMOVE_ANIM_DICT(strAnimsHijack)
SET_VEHICLE_MODEL_PLAYER_WILL_EXIT_SCENE(CAVALCADE2)
//Unfreeze the vehicles (they may have been frozen for the hijack sequence).
iCurrentEvent++
ENDIF
BREAK
CASE 1
IF NOT IS_CUTSCENE_ACTIVE()
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
IF IS_CUTSCENE_PLAYING()
IF iMusicTriggerEvent = 0
IF GET_CUTSCENE_TIME() > 0
TRIGGER_MUSIC_EVENT("FH2A_STOP_TRACK")
iMusicTriggerEvent++
ENDIF
ELIF iMusicTriggerEvent = 1
IF GET_CUTSCENE_TIME() > 20000
TRIGGER_MUSIC_EVENT("FH2A_VAN_ST")
iMusicTriggerEvent++
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF IS_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_FRONT_LEFT)
IF GET_CUTSCENE_TIME() > 5000
AND (GET_CUTSCENE_TIME() < 10000 OR bSkippedMocap)
FIX_ALL_VEHICLE_TYRES(sGoldVans[0].veh)
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
IF IS_VEHICLE_TYRE_BURST(sStartCar.veh, SC_WHEEL_CAR_FRONT_LEFT)
OR IS_VEHICLE_TYRE_BURST(sStartCar.veh, SC_WHEEL_CAR_FRONT_RIGHT)
OR IS_VEHICLE_TYRE_BURST(sStartCar.veh, SC_WHEEL_CAR_REAR_LEFT)
OR IS_VEHICLE_TYRE_BURST(sStartCar.veh, SC_WHEEL_CAR_REAR_RIGHT)
FIX_ALL_VEHICLE_TYRES(sStartCar.veh)
ENDIF
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-13.0 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_Truck")
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
SET_VEHICLE_DOORS_SHUT(sGoldVans[0].veh)
SET_VEHICLE_ENGINE_ON(sGoldVans[0].veh, TRUE, TRUE)
ENDIF
bPlayersCarExitStateHasBeenHit = TRUE
ELIF NOT bPlayersCarExitStateHasBeenHit
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION(sGoldVans[0].veh)
ENDIF
ENDIF
//IF CAN_SET_EXIT_STATE_FOR_CAMERA()
//SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
//SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
//ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), FALSE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
IF NOT bSkippedMocap
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
CLEAR_AREA_OF_VEHICLES(<<305.7, -649.8, 28.5>>, 500.0)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Casey")
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
SET_PED_INTO_VEHICLE(sGoldVanPeds[CASEY_ID].ped, sGoldVans[0].veh, VS_FRONT_RIGHT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sGoldVanPeds[CASEY_ID].ped)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_Truck")
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
FIX_ALL_VEHICLE_TYRES(sGoldVans[1].veh)
SET_VEHICLE_DOORS_SHUT(sGoldVans[1].veh)
//SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[1].veh)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF IS_PED_IN_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
REMOVE_PED_FROM_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("gunman_selection_1")
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
SET_PED_INTO_VEHICLE(sCrew[CREW_GUNMAN].ped, sGoldVans[1].veh, VS_FRONT_RIGHT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sCrew[CREW_GUNMAN].ped)
IF IS_PED_IN_GROUP(sCrew[CREW_GUNMAN].ped)
REMOVE_PED_FROM_GROUP(sCrew[CREW_GUNMAN].ped)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Driver_selection_1")
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
SET_PED_INTO_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldVans[1].veh, VS_BACK_LEFT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sCrew[CREW_DRIVER].ped)
IF IS_PED_IN_GROUP(sCrew[CREW_DRIVER].ped)
REMOVE_PED_FROM_GROUP(sCrew[CREW_DRIVER].ped)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("EXL_2_abandoned_car")
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
//SET_VEHICLE_FORWARD_SPEED(sStartCar.veh, 6.0)
SET_VEHICLE_DOORS_SHUT(sStartCar.veh)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("FBI_2_Burrito_Van")
IF IS_VEHICLE_DRIVEABLE(vehBuddyVan)
SET_ENTITY_COORDS(vehBuddyVan, <<270.5670, -634.9897, 28.0222>>)
SET_ENTITY_HEADING(vehBuddyVan, 156.3148)
SET_VEHICLE_ON_GROUND_PROPERLY(vehBuddyVan)
SET_VEHICLE_DOORS_SHUT(vehBuddyVan)
ENDIF
ENDIF
//First forced gunman gets in the start car.
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("gunman_selection_2")
IF NOT IS_PED_INJURED(sCrew[CREW_FORCED_GUNMAN].ped)
AND IS_VEHICLE_DRIVEABLE(sStartCar.veh)
CLEAR_PED_TASKS_IMMEDIATELY(sCrew[CREW_FORCED_GUNMAN].ped)
SET_PED_INTO_VEHICLE(sCrew[CREW_FORCED_GUNMAN].ped, sStartCar.veh, VS_DRIVER)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sCrew[CREW_FORCED_GUNMAN].ped)
TASK_VEHICLE_DRIVE_TO_COORD(sCrew[CREW_FORCED_GUNMAN].ped, sStartCar.veh, <<-52.8134, -539.5832, 39.4661>>, 30.0, DRIVINGSTYLE_NORMAL, modelStartCar, DRIVINGMODE_AVOIDCARS, 10.0, 15.0)
ENDIF
ENDIF
//Second one takes the van.
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("driver_selection_2")
IF NOT IS_PED_INJURED(sCrew[CREW_FORCED_DRIVER].ped)
AND IS_VEHICLE_DRIVEABLE(vehBuddyVan)
CLEAR_PED_TASKS_IMMEDIATELY(sCrew[CREW_FORCED_DRIVER].ped)
SET_PED_INTO_VEHICLE(sCrew[CREW_FORCED_DRIVER].ped, vehBuddyVan, VS_DRIVER)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sCrew[CREW_FORCED_DRIVER].ped)
TASK_VEHICLE_DRIVE_TO_COORD(sCrew[CREW_FORCED_DRIVER].ped, vehBuddyVan, <<502.8169, -1720.6942, 28.2174>>, 30.0, DRIVINGSTYLE_NORMAL,
modelBuddyVan, DRIVINGMODE_STOPFORCARS, 3.0, 3.0)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("left_security")
IF NOT IS_PED_INJURED(sGoldVanPeds[1].ped)
AND IS_VEHICLE_DRIVEABLE(vehBuddyVan)
CLEAR_PED_TASKS_IMMEDIATELY(sCrew[CREW_FORCED_DRIVER].ped)
SET_PED_INTO_VEHICLE(sGoldVanPeds[1].ped, vehBuddyVan, VS_BACK_LEFT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sGoldVanPeds[1].ped)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("middle_security")
IF NOT IS_PED_INJURED(sGoldVanPeds[2].ped)
AND IS_VEHICLE_DRIVEABLE(vehBuddyVan)
CLEAR_PED_TASKS_IMMEDIATELY(sCrew[CREW_FORCED_DRIVER].ped)
SET_PED_INTO_VEHICLE(sGoldVanPeds[2].ped, vehBuddyVan, VS_BACK_RIGHT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sGoldVanPeds[2].ped)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("right_security")
REMOVE_PED(sGoldVanPeds[3].ped, TRUE)
ENDIF
BREAK
ENDSWITCH
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
bSkippedMocap = TRUE
eSectionStage = SECTION_STAGE_SKIP
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REPLAY_STOP_EVENT()
CLEAR_PRINTS()
REMOVE_ALL_BLIPS()
REMOVE_OBJECT(objStinger, TRUE)
REMOVE_ANIM_DICT(strStingerAnims)
REMOVE_PTFX_ASSET()
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_HIJACK_01")
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_1, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_2, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_BUDDIES, strCarrec)
SET_ROADS_BACK_TO_ORIGINAL(<<320.0534, -700.1548, 28.2937>>, <<393.6534, -633.9548, 48.2937>>)
CLOSE_TUNNEL_PAVEMENTS(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
eMissionStage = STAGE_DRIVE_TO_BANK
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_DRIVE_TO_BANK)
ENDIF
ENDPROC
PROC DRIVE_TO_BANK()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF iCurrentEvent != 99
IF SETUP_REQ_TUNNEL_INTERIOR_LOADED()
IF bHasUsedCheckpoint
START_REPLAY_SETUP(<<245.3721, -618.3200, 27.6025>>, 0.0, FALSE)
iCurrentEvent = 99
ELSE
//Fix for B*528757: Guarantee that the tunnel is loaded first before trying to set up everything else.
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<245.3721, -618.3200, 27.6025>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(<<245.3721, -618.3200, 28.6025>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ENDIF
ELSE
IF SETUP_REQ_PLAYER_IS_MICHAEL()
AND SETUP_REQ_GOLD_VANS_PRE_HIJACK(<<245.3721, -618.3200, 27.6025>>, 61.8374, <<264.9509, -629.4653, 27.8277>>, 61.4195, TRUE)
AND SETUP_REQ_MAIN_DRIVER(<<243.3721, -618.3200, 27.6025>>, 269.1434)
AND SETUP_REQ_MAIN_GUNMAN(<<244.3721, -618.3200, 27.6025>>, 269.1434)
AND SETUP_REQ_TREVOR(<<245.3721, -620.3200, 27.6025>>, 269.1434)
AND SETUP_REQ_START_CAR(<<228.3, -608.1, 27.16>>, 65.89)
AND SETUP_REQ_BANK_SECURITY()
AND SETUP_REQ_FORCED_CREW()
AND SETUP_REQ_CREW_VAN(<<270.5670, -634.9897, 28.0222>>, 156.3148)
AND SETUP_REQ_TUNNEL_INTERIOR_LOADED()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
SETUP_REQ_GOLD_VANS_PRE_HIJACK(<<245.3721, -618.3200, 27.6025>>, 61.8374, <<264.9509, -629.4653, 27.8277>>, 61.4195, FALSE) //883924 - Creating the vans too early meant they would fall through the map.
WAIT(0)
REMOVE_PED(sGoldVanPeds[3].ped, TRUE)
IF IS_VEHICLE_DRIVEABLE(vehBuddyVan)
IF NOT IS_PED_INJURED(sCrew[CREW_FORCED_DRIVER].ped)
SET_PED_INTO_VEHICLE(sCrew[CREW_FORCED_DRIVER].ped, vehBuddyVan, VS_DRIVER)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[1].ped)
SET_PED_INTO_VEHICLE(sGoldVanPeds[1].ped, vehBuddyVan, VS_BACK_LEFT)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[2].ped)
SET_PED_INTO_VEHICLE(sGoldVanPeds[2].ped, vehBuddyVan, VS_BACK_RIGHT)
ENDIF
SET_VEHICLE_DOORS_LOCKED(vehBuddyVan, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
SET_ENTITY_HEADING(sGoldVans[0].veh, 61.8374)
SET_ENTITY_COORDS(sGoldVans[0].veh, <<245.3721, -618.3200, 27.6025>>)
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_LOCKED_PLAYER_INSIDE)
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
SET_PED_INTO_VEHICLE(sGoldVanPeds[CASEY_ID].ped, sGoldVans[0].veh, VS_FRONT_RIGHT)
ENDIF
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
SET_ENTITY_HEADING(sGoldVans[1].veh, 61.4195)
SET_ENTITY_COORDS(sGoldVans[1].veh, <<264.9509, -629.4653, 27.8277>>)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
SET_PED_INTO_VEHICLE(sCrew[CREW_GUNMAN].ped, sGoldVans[1].veh, VS_FRONT_RIGHT)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_PED_INTO_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldVans[1].veh, VS_BACK_LEFT)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
SET_VEHICLE_ON_GROUND_PROPERLY(sStartCar.veh)
IF NOT IS_PED_INJURED(sCrew[CREW_FORCED_GUNMAN].ped)
SET_PED_INTO_VEHICLE(sCrew[CREW_FORCED_GUNMAN].ped, sStartCar.veh, VS_DRIVER)
ENDIF
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
//Remove anything that should leave during the previous cutscene, one hostage goes with the main crew, another two go with the forced crew.
REMOVE_PED(sGoldVanPeds[3].ped, TRUE)
REMOVE_OBJECT(objStinger, TRUE)
SETUP_REQ_CREW_HAVE_SHOTGUNS()
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
SET_ROADS_IN_AREA(<<-142.7897, -705.0483, 30.9823>>, <<-37.9477, -555.9297, 41.7746>>, FALSE)
SET_ROADS_BLOCKED_FOR_BANK_DRIVE(TRUE)
iNavmeshBlockBankEntrance = ADD_NAVMESH_BLOCKING_OBJECT(<<-89.0, -677.0, 34.4>>, <<20.0, 8.0, 5.0>>, DEG_TO_RAD(-111.3))
SET_PED_NON_CREATION_AREA(<<-103.5288, -691.6404, 17.4339>>, <<-69.4190, -655.5072, 37.4339>>)
CLEAR_AREA_OF_COPS(GET_ENTITY_COORDS(PLAYER_PED_ID()), 500.0)
SET_CREATE_RANDOM_COPS(FALSE)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(1.0)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2A_VAN_RESTART")
CLEAR_AREA_OF_VEHICLES(<<305.7, -649.8, 28.5>>, 500.0)
ENDIF
//Allow the radio for the drive.
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
SET_VEHICLE_RADIO_ENABLED(sGoldVans[0].veh, TRUE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
SET_VEHICLE_DOORS_SHUT(sGoldVans[1].veh)
SET_VEHICLE_DOORS_LOCKED(sGoldVans[1].veh, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
AND NOT IS_PED_IN_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldVans[1].veh)
SET_PED_INTO_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldVans[1].veh, VS_BACK_LEFT)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
SET_VEHICLE_FORWARD_SPEED(sStartCar.veh, 6.0)
SET_VEHICLE_DOORS_LOCKED(sStartCar.veh, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_DRIVE_TO_BANK")
START_AUDIO_SCENE("BS_2A_DRIVE_TO_BANK")
ENDIF
IF NOT IS_SCREEN_FADED_IN()
SET_CLOCK_TIME(8, 15, 0)
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_IN()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
SET_VEHICLE_FORWARD_SPEED(sStartCar.veh, 6.0)
ENDIF
WAIT(0)
ENDWHILE
ENDIF
bVanTyreBurst = FALSE
bCustomGpsActive = FALSE
bBarriersAddedToBankInterior = FALSE
iTimeSinceVanLastDamaged = 0
fPrevDistanceFromBank = 0.0
sTrevor.iEvent = 0
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_DRIVE_TO_BANK, "DRIVE_TO_BANK")
REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
//Set the base value for number of crashes.
STAT_GET_INT(SP0_NUMBER_CRASHES_CARS, iPrevNumVanCrashes)
SETTIMERB(0)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
#IF IS_DEBUG_BUILD
DONT_DO_J_SKIP(sLocatesData)
#ENDIF
IF TIMERB() < 8000
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
ENDIF
//Load path nodes based on where the buddies go in their tasks below.
//REQUEST_PATH_NODES_IN_AREA_THIS_FRAME(-152.8134, -1820.6942, 602.8169, 282.4809)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF NOT DOES_BLIP_EXIST(sGoldVans[1].blip)
sGoldVans[1].blip = CREATE_BLIP_FOR_COORD(GET_ENTITY_COORDS(sGoldVans[1].veh))
SET_BLIP_COLOUR(sGoldVans[1].blip, BLIP_COLOUR_BLUE)
SET_BLIP_NAME_FROM_TEXT_FILE(sGoldVans[1].blip, "BLIP_VEH")
ELSE
VECTOR vBlipPosition = GET_BLIP_COORDS(sGoldVans[1].blip)
VECTOR vVehiclePosition = GET_ENTITY_COORDS(sGoldVans[1].veh)
vBlipPosition.X = vBlipPosition.X + ((vVehiclePosition.X - vBlipPosition.X) * 0.1)
vBlipPosition.Y = vBlipPosition.Y + ((vVehiclePosition.Y - vBlipPosition.Y) * 0.1)
vBlipPosition.Z = vBlipPosition.Z + ((vVehiclePosition.Z - vBlipPosition.Z) * 0.1)
SET_BLIP_COORDS(sGoldVans[1].blip, vBlipPosition)
ENDIF
ENDIF
FLOAT fDistToBank = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vOutsideSecurityGate)
BOOL bDontPlayDialogueAtBank = (fDistToBank < (42.0 * 42.0))
//940149 - the player is locked inside the van, disable the exit button too to prevent any attempts to leave.
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
SETUP_REQ_SECURITY_BARRIERS()
//Need to grab the car park interior due to having to set the doors as part of it across the whole mission.
IF NOT bBarriersAddedToBankInterior
IF DOES_ENTITY_EXIST(objSecurityBarriers[0])
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(objSecurityBarriers[0])) < 10000.0
IF interiorBankCarPark = NULL
interiorBankCarPark = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-1.2993, -678.8333, 33.7190>>, "dt1_03_carpark")
ELSE
IF IS_INTERIOR_READY(interiorBankCarPark)
FORCE_ROOM_FOR_ENTITY(objSecurityBarriers[0], interiorBankCarPark, HASH("GtaMloRoom002"))
bBarriersAddedToBankInterior = TRUE
ELSE
PIN_INTERIOR_IN_MEMORY(interiorBankCarPark)
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH iCurrentEvent
CASE 0
DRAW_CLOCK("F3A_TRUCKCLOCK", TRUE, 9, 0, TIMER_STYLE_DONTUSEMILLISECONDS)
UPDATE_SECURITY_GUARD_IDLES()
IF NOT bHasTextLabelTriggered[FH3A_GOING]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_GOING", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_GOING] = TRUE
ENDIF
ENDIF
ENDIF
//NOTE: using a custom area check, so this command is just handling blips etc and not progressing the mission.
IF IS_PLAYER_AT_LOCATION_WITH_BUDDY_IN_VEHICLE(sLocatesData, vOutsideSecurityGate, <<0.001, 0.001, LOCATE_SIZE_HEIGHT>>, TRUE, sGoldVanPeds[CASEY_ID].ped,
sGoldVans[0].veh, "F3A_GOTOBANK", "F3A_WORKER", "F3A_GETINVAN", "F3A_GETBACKVAN", FALSE, TRUE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF IS_ENTITY_IN_ANGLED_AREA(sGoldVans[0].veh, <<-75.195908,-682.383057,32.872246>>, <<-83.605576,-679.183838,37.291779>>, 10.250000)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
eSectionStage = SECTION_STAGE_CLEANUP
ELSE
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT bHasTextLabelTriggered[FH3A_CHAT4]
AND CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_CHAT4", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_CHAT4] = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF bCustomGPSActive
SET_GPS_CUSTOM_ROUTE_RENDER(FALSE, 18, 30)
CLEAR_GPS_CUSTOM_ROUTE()
bCustomGPSActive = FALSE
ENDIF
ENDIF
ENDIF
//Play some dialogue from Trevor if the player takes their time.
IF NOT bHasTextLabelTriggered[FH3A_LATE]
IF GET_CLOCK_HOURS() >= 9
AND eSectionStage != SECTION_STAGE_CLEANUP
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LATE", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_LATE] = TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
//Kill the main conversation early, this is so it doesn't interfere with any preloading next stage.
IF bDontPlayDialogueAtBank
TEXT_LABEL strCurrentRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF ARE_STRINGS_EQUAL(strCurrentRoot, "FH3A_CHAT4")
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
//Request assets for next stage in advance.
IF fDistToBank < 22500.0
REQUEST_VEHICLE_RECORDING(CARREC_BANK_PARK_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_BANK_PARK_2, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_BANK_LEAVE_GATE, strCarrec)
REQUEST_ANIM_DICT(strAnimIG2)
REQUEST_MODEL(modelIDCard)
REQUEST_ANIM_DICT("map_objects")
SETUP_REQ_BANK_WORKER(<<-5.6968, -659.2569, 32.4827>>, 194.4753, TRUE)
SETUP_REQ_BANK_WORKER_WALKIE_TALKIE(TRUE)
SETUP_REQ_BANK_SECURITY()
ENDIF
//Remove the tunnel interiors once the buddy has left.
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF IS_ENTITY_IN_ANGLED_AREA(sGoldVans[1].veh, <<121.167610,-573.820129,30.425274>>, <<113.940147,-571.216553,36.674660>>, 34.000000)
IF interiorTunnel != NULL
UNPIN_INTERIOR(interiorTunnel)
interiorTunnel = NULL
ENDIF
IF interiorTunnel2 != NULL
UNPIN_INTERIOR(interiorTunnel2)
interiorTunnel2 = NULL
ENDIF
IF interiorTunnel3 != NULL
UNPIN_INTERIOR(interiorTunnel3)
interiorTunnel3 = NULL
ENDIF
ENDIF
ENDIF
//Trevor behaviour: follows the player and parks nearby and waits for the player to enter the area.
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF IS_PED_IN_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
REMOVE_PED_FROM_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
VECTOR vTrevorPos = GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
VECTOR vParkPos1 = <<-111.2413, -652.2602, 34.8744>>
VECTOR vClosetNodePos, vWarpNodePos, vWarpNodePos2
//VECTOR vParkPos2 = <<-101.2792, -689.6624, 33.8881>>
INT iClosestNodePlayer, iClosestNodeTrevor
SWITCH sTrevor.iEvent
CASE 0 //Use a waypoint recording
REQUEST_WAYPOINT_RECORDING(strWaypointVehGotoBank)
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehGotoBank)
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointVehGotoBank, vPlayerPos, iClosestNodePlayer)
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointVehGotoBank, vTrevorPos, iClosestNodeTrevor)
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) != PERFORMING_TASK
IF VDIST2(vTrevorPos, vParkPos1) > 64.0
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh, strWaypointVehGotoBank,
DRIVINGMODE_AVOIDCARS, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, -1, 40.0)
TASK_LOOK_AT_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
ENDIF
ELSE
IF iClosestNodePlayer - iClosestNodeTrevor < 3
AND VDIST2(vOutsideSecurityGate, GET_ENTITY_COORDS(PLAYER_PED_ID())) > 100.0
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
SET_DRIVE_TASK_CRUISE_SPEED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.0)
ELSE
SET_DRIVE_TASK_CRUISE_SPEED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 40.0)
ENDIF
ENDIF
//Warp if he gets too far behind.
IF iClosestNodePlayer - iClosestNodeTrevor > 9
WAYPOINT_RECORDING_GET_COORD(strWaypointVehGotoBank, iClosestNodePlayer, vClosetNodePos)
IF VDIST2(vClosetNodePos, vPlayerPos) < 625.0
WAYPOINT_RECORDING_GET_COORD(strWaypointVehGotoBank, iClosestNodePlayer - 5, vWarpNodePos)
WAYPOINT_RECORDING_GET_COORD(strWaypointVehGotoBank, iClosestNodePlayer - 4, vWarpNodePos2)
IF NOT IS_SPHERE_VISIBLE(vWarpNodePos, 3.0)
AND VDIST2(vWarpNodePos, vParkPos1) > 64.0
CLEAR_AREA(vWarpNodePos, 3.0, TRUE)
SET_ENTITY_HEADING(sGoldVans[1].veh, GET_HEADING_FROM_VECTOR_2D(vWarpNodePos2.x - vWarpNodePos.x, vWarpNodePos2.y - vWarpNodePos.y))
SET_ENTITY_COORDS(sGoldVans[1].veh, vWarpNodePos)
SET_VEHICLE_FORWARD_SPEED(sGoldVans[1].veh, 20.0)
CLEAR_PED_TASKS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
ENDIF
ENDIF
ENDIF
//Vehicle recording version
/*REQUEST_WAYPOINT_RECORDING(strWaypointVehGotoBank)
REQUEST_VEHICLE_RECORDING(801, strCarrec)
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehGotoBank)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(801, strCarrec)
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointVehGotoBank, GET_ENTITY_COORDS(sGoldVans[0].veh), iClosestNodePlayer)
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointVehGotoBank, vTrevorPos, iClosestNodeTrevor)
IF iClosestNodePlayer - iClosestNodeTrevor > 3
IF VDIST2(vTrevorPos, vParkPos1) > 25.0
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
IF NOT IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
START_PLAYBACK_RECORDED_VEHICLE_USING_AI(sGoldVans[1].veh, 801, strCarrec, 30.0, DRIVINGMODE_AVOIDCARS)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
ENDIF
ENDIF
ELSE
IF VDIST2(vOutsideSecurityGate, GET_ENTITY_COORDS(PLAYER_PED_ID())) > 100.0
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
IF IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
ENDIF
ENDIF
ENDIF
ENDIF*/
//Drive straight to coords version.
/*REQUEST_WAYPOINT_RECORDING(strWaypointVehGotoBank)
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehGotoBank)
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) != PERFORMING_TASK
IF VDIST2(vTrevorPos, vParkPos1) > 25.0
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
TASK_VEHICLE_DRIVE_TO_COORD(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh, vParkPos1, 30.0, DRIVINGSTYLE_NORMAL, GET_ENTITY_MODEL(sGoldVans[1].veh),
DRIVINGMODE_AVOIDCARS, 2.0, 3.0)
ENDIF
ELSE
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointVehGotoBank, GET_ENTITY_COORDS(sGoldVans[0].veh), iClosestNodePlayer)
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointVehGotoBank, vTrevorPos, iClosestNodeTrevor)
IF iClosestNodePlayer - iClosestNodeTrevor < 3
AND VDIST2(vOutsideSecurityGate, GET_ENTITY_COORDS(PLAYER_PED_ID())) > 100.0
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
SET_DRIVE_TASK_CRUISE_SPEED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.0)
ELSE
SET_DRIVE_TASK_CRUISE_SPEED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 30.0)
ENDIF
ENDIF
ENDIF*/
IF iCurrentEvent >= 5
sTrevor.iEvent++
ENDIF
BREAK
CASE 1 //Once player starts going inside use a waypoint recording as there are no road nodes.
REQUEST_WAYPOINT_RECORDING(strWaypointVehEnterBank)
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehEnterBank)
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) != PERFORMING_TASK
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh, strWaypointVehEnterBank,
DRIVINGMODE_STOPFORCARS_IGNORELIGHTS, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, -1, 10.0)
SET_DRIVE_TASK_CRUISE_SPEED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 20.0)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
//Forced crew 2 drives off in the van. Delete all of them once they're off-screen.
IF DOES_ENTITY_EXIST(vehBuddyVan)
//Fail if the player messes with this car before it's deleted.
IF NOT IS_VEHICLE_DRIVEABLE(vehBuddyVan)
MISSION_FAILED(FAILED_START_CAR_DESTROYED)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_FORCED_DRIVER].ped)
AND IS_VEHICLE_DRIVEABLE(vehBuddyVan)
IF NOT IS_PED_SITTING_IN_VEHICLE(sCrew[CREW_FORCED_DRIVER].ped, vehBuddyVan)
IF GET_SCRIPT_TASK_STATUS(sCrew[CREW_FORCED_DRIVER].ped, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
TASK_ENTER_VEHICLE(sCrew[CREW_FORCED_DRIVER].ped, vehBuddyVan, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_FORCED_DRIVER].ped, TRUE)
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(sCrew[CREW_FORCED_DRIVER].ped, SCRIPT_TASK_VEHICLE_DRIVE_TO_COORD) != PERFORMING_TASK
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(sCrew[CREW_FORCED_DRIVER].ped, vehBuddyVan, <<502.8169, -1720.6942, 28.2174>>, 30.0, DRIVINGMODE_STOPFORCARS | DF_UseSwitchedOffNodes, 3.0)
ENDIF
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sCrew[CREW_FORCED_DRIVER].ped)) > 10000.0
IF NOT IS_ENTITY_ON_SCREEN(sCrew[CREW_FORCED_DRIVER].ped)
REMOVE_PED(sCrew[CREW_FORCED_DRIVER].ped, TRUE)
REMOVE_PED(sGoldVanPeds[1].ped, TRUE)
REMOVE_PED(sGoldVanPeds[2].ped, TRUE)
REMOVE_VEHICLE(vehBuddyVan, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Forced crew 1 drives off in the start car.
IF DOES_ENTITY_EXIST(sStartCar.veh)
//Fail if the player messes with this car before it's deleted.
IF NOT IS_VEHICLE_DRIVEABLE(sStartCar.veh, TRUE)
MISSION_FAILED(FAILED_START_CAR_DESTROYED)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_FORCED_GUNMAN].ped)
AND IS_VEHICLE_DRIVEABLE(sStartCar.veh)
IF NOT IS_PED_SITTING_IN_VEHICLE(sCrew[CREW_FORCED_GUNMAN].ped, sStartCar.veh)
IF GET_SCRIPT_TASK_STATUS(sCrew[CREW_FORCED_GUNMAN].ped, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
TASK_ENTER_VEHICLE(sCrew[CREW_FORCED_GUNMAN].ped, sStartCar.veh, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_FORCED_GUNMAN].ped, TRUE)
ENDIF
ELSE
SET_VEHICLE_DOOR_CONTROL(sStartCar.veh, SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOOR_CONTROL(sStartCar.veh, SC_DOOR_FRONT_RIGHT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOOR_CONTROL(sStartCar.veh, SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOOR_CONTROL(sStartCar.veh, SC_DOOR_REAR_RIGHT, DT_DOOR_INTACT, 0.0)
SEQUENCE_INDEX seq
IF GET_SCRIPT_TASK_STATUS(sCrew[CREW_FORCED_GUNMAN].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
OPEN_SEQUENCE_TASK(seq)
TASK_VEHICLE_DRIVE_TO_COORD(NULL, sStartCar.veh, <<-52.8134, -539.5832, 39.4661>>, 20.0, DRIVINGSTYLE_ACCURATE, modelStartCar, DRIVINGMODE_AVOIDCARS | DF_UseSwitchedOffNodes, 10.0, 15.0)
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, sStartCar.veh, <<205.7986, 182.4809, 104.3646>>, 20.0, DRIVINGMODE_AVOIDCARS | DF_UseSwitchedOffNodes, 3.0)
TASK_VEHICLE_DRIVE_WANDER(NULL, sStartCar.veh, 30.0, DRIVINGMODE_AVOIDCARS | DF_UseSwitchedOffNodes)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sCrew[CREW_FORCED_GUNMAN].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_FORCED_GUNMAN].ped, TRUE)
ENDIF
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sCrew[CREW_FORCED_GUNMAN].ped)) > 10000.0
IF NOT IS_ENTITY_ON_SCREEN(sCrew[CREW_FORCED_GUNMAN].ped)
REMOVE_PED(sCrew[CREW_FORCED_GUNMAN].ped, TRUE)
REMOVE_VEHICLE(sStartCar.veh, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
IF bDebugDrawGateCollision
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
IF DOES_ENTITY_EXIST(objSecurityGateCollision[0])
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objSecurityGateCollision[0], <<0.0, 0.0, 0.0>>), 0.1)
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objSecurityGateCollision[0], <<-3.0, 0.0, 0.0>>), 0.1)
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objSecurityGateCollision[0], <<3.0, 0.0, 0.0>>), 0.1)
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objSecurityGateCollision[0], <<0.0, 0.0, 2.0>>), 0.1)
ENDIF
IF DOES_ENTITY_EXIST(objSecurityGateCollision[1])
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objSecurityGateCollision[1], <<0.0, 0.0, 0.0>>), 0.1)
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objSecurityGateCollision[1], <<-3.0, 0.0, 0.0>>), 0.1)
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objSecurityGateCollision[1], <<3.0, 0.0, 0.0>>), 0.1)
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objSecurityGateCollision[1], <<0.0, 0.0, 2.0>>), 0.1)
ENDIF
ENDIF
#ENDIF
//Fail for the player's van getting stuck
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF IS_VEHICLE_PERMANENTLY_STUCK(sGoldVans[0].veh)
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
MISSION_FAILED(FAILED_VAN_STUCK)
ENDIF
ENDIF
//Fail if the player hurts the security ped.
IF NOT IS_PED_INJURED(pedGateSecurity)
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedGateSecurity, PLAYER_PED_ID())
OR IS_PED_RAGDOLL(pedGateSecurity)
OR (IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh) AND GET_ENTITY_SPEED(sGoldVans[0].veh) > 1.0 AND IS_ENTITY_TOUCHING_ENTITY(sGoldVans[0].veh, pedGateSecurity))
MISSION_FAILED(FAILED_ALERTED_BANK_BY_KILLING_SECURITY)
ENDIF
ENDIF
//Fail if the player causes explosions around the entrance.
ENTITY_INDEX entityExplosion = GET_OWNER_OF_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, <<-106.440224,-635.586426,25.639248>>, <<49.404850,-692.630066,66.712708>>, 120.750000)
IF NOT IS_ENTITY_DEAD(entityExplosion)
IF IS_ENTITY_A_PED(entityExplosion)
IF GET_PED_INDEX_FROM_ENTITY_INDEX(entityExplosion) = PLAYER_PED_ID()
#IF IS_DEBUG_BUILD
PRINTLN("finale_heist2A.sc - Explosion triggered at bank.")
#ENDIF
MISSION_FAILED(FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS)
ENDIF
ENDIF
ENDIF
//Fail if the player shoots around the entrance.
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-153.177765,-649.173767,30.428072>>, <<104.136414,-744.619141,56.003754>>, 128.500000)
IF IS_PED_SHOOTING(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD
PRINTLN("finale_heist2A.sc - Player shooting at bank.")
#ENDIF
MISSION_FAILED(FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS)
ENDIF
ENDIF
//Fail for getting a wanted level.
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
MISSION_FAILED(FAILED_ALERTED_COPS)
ENDIF
//Fail for damaging the vans too much
IF HAS_VEHICLE_HAD_MULTIPLE_PARTS_DAMAGED(sGoldVans[0].veh, 2)
MISSION_FAILED(FAILED_MICHAEL_VAN_TOO_DAMAGED)
ENDIF
IF HAS_VEHICLE_HAD_MULTIPLE_PARTS_DAMAGED(sGoldVans[1].veh, 3)
AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sGoldVans[1].veh, PLAYER_PED_ID())
MISSION_FAILED(FAILED_TREVOR_VAN_TOO_DAMAGED)
ENDIF
INT iNumCrashes
STAT_GET_INT(SP0_NUMBER_CRASHES_CARS, iNumCrashes)
//Play some dialogue from Trevor if the player crashes.
IF iNumCrashes > iPrevNumVanCrashes
AND NOT bDontPlayDialogueAtBank
IF GET_GAME_TIMER() - iTimeSinceVanLastDamaged > 8000
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MESS", CONV_PRIORITY_MEDIUM)
iTimeSinceVanLastDamaged = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF GET_ENTITY_SPEED(sGoldVans[0].veh) > 5.0
iTimeSinceVanLastMovedQuickly = GET_GAME_TIMER()
ENDIF
//If the player picked a bad gunman for the tyre changing bit then one of the tyres bursts.
IF NOT bVanTyreBurst
IF NOT bPickedGoodSecondGunman
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh)
REQUEST_PTFX_ASSET()
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_RIGHT)
IF fDistToBank < 10000.0
AND HAS_PTFX_ASSET_LOADED()
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_RIGHT, FALSE, 1.0)
SET_VEHICLE_TYRES_CAN_BURST(sGoldVans[0].veh, FALSE)
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_bigscore_tyre_spiked", sGoldVans[0].veh, <<1.500, -3.000, -0.300>>, <<0.0, 0.0, 0.0>>)
bVanTyreBurst = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF bHasTextLabelTriggered[FH3A_GOING]
AND NOT bHasTextLabelTriggered[FH3A_BURST]
AND NOT bDontPlayDialogueAtBank
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_BURST", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_BURST] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//If the player drives off course for a sustained period then play dialogue.
IF fDistToBank > fPrevDistanceFromBank
IF GET_GAME_TIMER() - iWrongWayDialogueTimer > 3000
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_WRONG", CONV_PRIORITY_MEDIUM)
iWrongWayDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 5000)
ENDIF
ENDIF
ENDIF
ELSE
iWrongWayDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
//Fail for taking too long to get to the bank.
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-72.879677,-682.367188,34.794189>>, <<-124.106529,-663.455139,40.755051>>, 40.750000)
//Fail if the player is near the bank entrance and crashes the van.
IF iNumCrashes > iPrevNumVanCrashes
//The stat is a bit too sensitive for this situation, so check how fast the van was going recently.
IF GET_GAME_TIMER() - iTimeSinceVanLastMovedQuickly < 1000
#IF IS_DEBUG_BUILD
PRINTLN("finale_heist2A.sc - Player crashed at bank.")
#ENDIF
MISSION_FAILED(FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS)
ENDIF
ENDIF
ENDIF
IF eSectionStage != SECTION_STAGE_CLEANUP
IF GET_CLOCK_HOURS() >= 9
AND GET_CLOCK_MINUTES() >= 15
MISSION_FAILED(FAILED_ALERTED_BANK_VIA_GPS)
ENDIF
ENDIF
iPrevNumVanCrashes = iNumCrashes
fPrevDistanceFromBank = fDistToBank
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REMOVE_ALL_BLIPS()
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
KILL_FACE_TO_FACE_CONVERSATION()
SETTIMERB(0)
REMOVE_PED(sCrew[CREW_FORCED_GUNMAN].ped, TRUE)
REMOVE_PED(sCrew[CREW_FORCED_DRIVER].ped, TRUE)
REMOVE_PED(sGoldVanPeds[1].ped, TRUE)
REMOVE_PED(sGoldVanPeds[2].ped, TRUE)
REMOVE_VEHICLE(sStartCar.veh, TRUE)
SET_ROADS_BLOCKED_FOR_BANK_DRIVE(FALSE)
REMOVE_ANIM_DICT(strAnimIG1)
REMOVE_PTFX_ASSET()
REMOVE_VEHICLE_ASSET(modelStartCar)
IF bCustomGPSActive
SET_GPS_MULTI_ROUTE_RENDER(FALSE)
SET_GPS_CUSTOM_ROUTE_RENDER(FALSE, 18, 30)
CLEAR_GPS_CUSTOM_ROUTE()
CLEAR_GPS_MULTI_ROUTE()
bCustomGPSActive = FALSE
ENDIF
IF interiorTunnel != NULL
UNPIN_INTERIOR(interiorTunnel)
interiorTunnel = NULL
ENDIF
IF interiorTunnel2 != NULL
UNPIN_INTERIOR(interiorTunnel2)
interiorTunnel2 = NULL
ENDIF
IF interiorTunnel3 != NULL
UNPIN_INTERIOR(interiorTunnel3)
interiorTunnel3 = NULL
ENDIF
REMOVE_WAYPOINT_RECORDING(strWaypointVehEnterBank)
REMOVE_WAYPOINT_RECORDING(strWaypointVehGotoBank)
eMissionStage = STAGE_BANK_PARK_CUTSCENE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
CLEAR_PRINTS()
REPLAY_RECORD_BACK_FOR_TIME(5.0, 2.0, REPLAY_IMPORTANCE_HIGHEST)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
SET_PED_INTO_VEHICLE(sGoldVanPeds[CASEY_ID].ped, sGoldVans[0].veh, VS_FRONT_RIGHT)
ENDIF
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh)
SET_ENTITY_COORDS(sGoldVans[0].veh, <<-77.3776, -679.9720, 33.2765>>)
SET_ENTITY_HEADING(sGoldVans[0].veh, 253.4059)
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[0].veh)
ENDIF
WHILE NOT SETUP_REQ_SECURITY_BARRIERS()
WAIT(0)
ENDWHILE
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDPROC
PROC BANK_PARK_CUTSCENE_2()
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
IF bHasUsedCheckpoint
START_REPLAY_SETUP(<<-77.3776, -679.9720, 33.2765>>, 0.0, FALSE)
iCurrentEvent = 99
ELSE
//Fix for B*528757: Guarantee that the tunnel is loaded first before trying to set up everything else.
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-77.3776, -679.9720, 33.2765>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ELSE
IF SETUP_REQ_PLAYER_IS_MICHAEL()
AND SETUP_REQ_GOLD_VANS_POST_HIJACK(<<-77.3776, -679.9720, 33.2765>>, 253.4059, <<419.8341, -678.7876, 28.9040>>, 69.4937)
AND SETUP_REQ_MAIN_DRIVER(<<-4.2024, -675.4505, 31.3410>>, 269.1434)
AND SETUP_REQ_MAIN_GUNMAN(<<-5.2024, -675.4505, 31.3410>>, 269.1434)
AND SETUP_REQ_TREVOR(<<-77.3776, -674.9720, 33.2765>>, 269.1434)
AND SETUP_REQ_BANK_SECURITY()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-8.63, -671.79, 31.3406>>, -136.525)
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
WHILE NOT SETUP_REQ_SECURITY_BARRIERS()
WAIT(0)
ENDWHILE
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
SET_ENTITY_HEADING(sGoldVans[0].veh, 253.4059)
SET_ENTITY_COORDS(sGoldVans[0].veh, <<-77.3776, -679.9720, 33.2765>>)
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[0].veh)
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_LOCKED_PLAYER_INSIDE)
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
SET_PED_INTO_VEHICLE(sGoldVanPeds[CASEY_ID].ped, sGoldVans[0].veh, VS_FRONT_RIGHT)
ENDIF
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
SET_VEHICLE_DOORS_LOCKED(sGoldVans[1].veh, VEHICLELOCK_UNLOCKED)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_PED_INTO_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldVans[1].veh, VS_FRONT_RIGHT)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
SET_PED_INTO_VEHICLE(sCrew[CREW_GUNMAN].ped, sGoldVans[1].veh, VS_BACK_LEFT)
ENDIF
ENDIF
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_VEHICLE_RECORDING(CARREC_BANK_PARK_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_BANK_PARK_2, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_BANK_LEAVE_GATE, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_BANK_TREVOR, strCarrec)
REQUEST_ANIM_DICT(strAnimIG2)
REQUEST_MODEL(modelIDCard)
REQUEST_ANIM_DICT("map_objects")
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
IF NOT bHasTextLabelTriggered[FH3A_GATE_PRELOAD]
IF NOT IS_PED_INJURED(pedGateSecurity)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, pedGateSecurity, "BS2BankSecurity")
ENDIF
IF PRELOAD_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_GATE", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_GATE_PRELOAD] = TRUE
ENDIF
ENDIF
BOOL bPreloadedConversationIsReady = FALSE
IF bHasTextLabelTriggered[FH3A_GATE_PRELOAD]
IF GET_IS_PRELOADED_CONVERSATION_READY()
OR TIMERB() > 3000
bPreloadedConversationIsReady = TRUE
ENDIF
ENDIF
IF SETUP_REQ_BANK_WORKER(<<-5.6968, -661.2569, 32.4827>>, 194.4753)
AND SETUP_REQ_BANK_WORKER_WALKIE_TALKIE()
AND SETUP_REQ_BANK_INTERIOR_LOADED()
AND SETUP_REQ_BACKGROUND_CAR_PARK_INTERIOR_LOADED()
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_BANK_PARK_1, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_BANK_PARK_2, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_BANK_LEAVE_GATE, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_BANK_TREVOR, strCarrec)
AND HAS_ANIM_DICT_LOADED("map_objects")
AND HAS_ANIM_DICT_LOADED(strAnimIG2)
AND HAS_MODEL_LOADED(modelIDCard)
AND (NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData) OR bPreloadedConversationIsReady)
AND TIMERB() > 700
CLEAR_PRINTS()
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2A_VAN_RESTART")
WAIT(0)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 10.0, TRUE)
objIDCard = CREATE_OBJECT(modelIDCard, GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<0.0, 0.0, 1.0>>)
ATTACH_ENTITY_TO_ENTITY(objIDCard, sGoldVanPeds[CASEY_ID].ped, GET_PED_BONE_INDEX(sGoldVanPeds[CASEY_ID].ped, BONETAG_PH_R_HAND), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
SET_MODEL_AS_NO_LONGER_NEEDED(modelIDCard)
//SET_ENTITY_COORDS(sGoldVans[0].veh, <<-78.3811, -680.3818, 33.3975>>)
//SET_ENTITY_HEADING(sGoldVans[0].veh, 253.0606)
//SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[0].veh)
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, CARREC_BANK_LEAVE_GATE, strCarrec)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[0].veh)
SET_PLAYBACK_SPEED(sGoldVans[0].veh, 0.0)
SET_VEHICLE_ENGINE_HEALTH(sGoldVans[0].veh, 1000.0)
SET_VEHICLE_PETROL_TANK_HEALTH(sGoldVans[0].veh, 1000.0)
//RESET_VEHICLE_WHEELS(sGoldVans[0].veh, FALSE)
//Place Trevor nearby in case he got stuck during the journey.
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
CLEAR_AREA(<<-111.2413, -652.2602, 34.8744>>, 10.0, TRUE)
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, CARREC_BANK_TREVOR, strCarrec)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[1].veh)
SET_VEHICLE_ENGINE_HEALTH(sGoldVans[1].veh, 1000.0)
SET_VEHICLE_PETROL_TANK_HEALTH(sGoldVans[1].veh, 1000.0)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF IS_PED_IN_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
REMOVE_PED_FROM_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
TASK_CLEAR_LOOK_AT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
CLEAR_PED_TASKS_IMMEDIATELY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh, VS_DRIVER)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
ENDIF
sTrevor.iEvent = 0
ENDIF
ROLL_DOWN_WINDOWS(sGoldVans[0].veh)
SET_VEHICLE_RADIO_ENABLED(sGoldVans[0].veh, FALSE)
//The bank worker and the security guard in this cutscene share the same speaker number, so make sure the guard takes priority here.
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, pedGateSecurity, "BS2BankSecurity")
REMOVE_ALL_AUDIO_SCENES()
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_PARK_UP_CUTSCENE")
START_AUDIO_SCENE("BS_2A_PARK_UP_CUTSCENE")
ENDIF
//Two synced scenes are required for this point: one attached to the car for the peds inside and one not attached for the camera and guard.
iSyncSceneArriveAtBank = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncSceneArriveAtBank, sGoldVans[0].veh, 0)
iSyncSceneArriveAtBank2 = CREATE_SYNCHRONIZED_SCENE(GET_ENTITY_COORDS(sGoldVans[0].veh), GET_ENTITY_ROTATION(sGoldVans[0].veh))
camMain = CREATE_CAM("DEFAULT_ANIMATED_CAMERA")
PLAY_SYNCHRONIZED_CAM_ANIM(camMain, iSyncSceneArriveAtBank2, "check_id_cam", strAnimIG2)
SET_CAM_ACTIVE(camMain, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(sGoldVanPeds[CASEY_ID].ped)
IF NOT IS_PED_INJURED(pedGateSecurity)
CLEAR_PED_TASKS_IMMEDIATELY(pedGateSecurity)
TASK_SYNCHRONIZED_SCENE(pedGateSecurity, iSyncSceneArriveAtBank2, strAnimIG2, "check_id_guard", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
ENDIF
TASK_SYNCHRONIZED_SCENE(sGoldVanPeds[CASEY_ID].ped, iSyncSceneArriveAtBank, strAnimIG2, "check_id_guy", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSyncSceneArriveAtBank, strAnimIG2, "check_id_player0", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 200.0, TRUE)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SETTIMERB(0)
iCurrentEvent = 0
bSkippedMocap = FALSE
TRIGGER_MUSIC_EVENT("FH2A_ARRIVE_BANK")
NEW_LOAD_SCENE_START_SPHERE(<<-4.3, -685.2, 33.0>>, 50.0)
REMOVE_MICHAEL_SHOTGUN_SILENCER()
IF NOT IS_SCREEN_FADED_IN()
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_IN()
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
WAIT(0)
ENDWHILE
ENDIF
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
IF NOT bHasTextLabelTriggered[FH3A_GATE]
IF NOT bHasTextLabelTriggered[FH3A_GATE_PRELOAD]
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_GATE", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_GATE] = TRUE
ENDIF
ELSE
BEGIN_PRELOADED_CONVERSATION()
bHasTextLabelTriggered[FH3A_GATE] = TRUE
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
//IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
// PRINTLN(GET_TIME_POSITION_IN_RECORDING(sGoldVans[1].veh))
//ENDIF
SWITCH sTrevor.iEvent
CASE 0 //Once Trevor's recording reaches the waiting point then pause playback.
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
IF GET_TIME_POSITION_IN_RECORDING(sGoldVans[1].veh) > 10000.0
SET_PLAYBACK_SPEED(sGoldVans[1].veh, 0.0)
sTrevor.iTimer = 0
sTrevor.iEvent++
ENDIF
ENDIF
BREAK
CASE 1 //Once Michael leaves have Trevor follow.
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
IF sTrevor.iTimer = 0
IF GET_ENTITY_SPEED(sGoldVans[0].veh) > 1.0
sTrevor.iTimer = GET_GAME_TIMER()
ENDIF
ELIF GET_GAME_TIMER() - sTrevor.iTimer > 100
SET_PLAYBACK_SPEED(sGoldVans[1].veh, 1.0)
sTrevor.iTimer = 0
sTrevor.iEvent++
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
SWITCH iCurrentEvent
CASE 0 //Start the door opening.
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneArriveAtBank)
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_BANK_DOOR")
AND HAS_ANIM_DICT_LOADED("map_objects")
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneArriveAtBank) > 0.7
PLAY_SOUND_FROM_ENTITY(iBankGateOpenSound, "BANK_DOOR_OPEN", objSecurityBarriers[0], "BIG_SCORE_3A_SOUNDS")
PLAY_ENTITY_ANIM(objSecurityBarriers[0], "p_sec_gate_01_s_open", "map_objects", 4.0, FALSE, TRUE)
iCurrentEvent++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1 //Start Michael driving
IF IS_ENTITY_PLAYING_ANIM(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_open")
IF GET_ENTITY_ANIM_CURRENT_TIME(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_open") < 0.7
SET_ENTITY_ANIM_CURRENT_TIME(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_open", 0.7)
ENDIF
ENDIF
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneArriveAtBank)
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_BANK_DOOR")
AND HAS_ANIM_DICT_LOADED("map_objects")
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneArriveAtBank) > 0.825
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
SET_PLAYBACK_SPEED(sGoldVans[0].veh, 1.0)
ENDIF
ENDIF
iCurrentEvent++
ENDIF
ENDIF
ENDIF
BREAK
CASE 2 //Wait for the anim to finish, then start the next shot for the vans driving in.
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneArriveAtBank)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
AND NOT IS_PED_INJURED(pedGateSecurity)
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
AND NOT IS_PED_INJURED(sBankWorker.ped)
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneArriveAtBank) > 0.99
STOP_SYNCHRONIZED_ENTITY_ANIM(PLAYER_PED_ID(), INSTANT_BLEND_OUT, TRUE)
STOP_SYNCHRONIZED_ENTITY_ANIM(sGoldVanPeds[CASEY_ID].ped, INSTANT_BLEND_OUT, TRUE)
STOP_SYNCHRONIZED_ENTITY_ANIM(pedGateSecurity, INSTANT_BLEND_OUT, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(sGoldVanPeds[CASEY_ID].ped)
CLEAR_PED_TASKS_IMMEDIATELY(pedGateSecurity)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh, VS_DRIVER)
SET_PED_INTO_VEHICLE(sGoldVanPeds[CASEY_ID].ped, sGoldVans[0].veh, VS_FRONT_RIGHT)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
ENDIF
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, CARREC_BANK_PARK_1, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, 4000.0)
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_UNLOCKED)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[0].veh)
IF IS_ENTITY_PLAYING_ANIM(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_open")
SET_ENTITY_ANIM_CURRENT_TIME(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_open", 0.99)
ENDIF
TASK_LOOK_AT_ENTITY(sBankWorker.ped, sGoldVans[0].veh, -1, SLF_SLOW_TURN_RATE | SLF_WHILE_NOT_IN_FOV)
REMOVE_OBJECT(objIDCard, TRUE)
REMOVE_ANIM_DICT(strAnimIG2)
REMOVE_ANIM_DICT(strAnimIG1)
CLEAR_AREA(<<-5.6968, -659.2569, 32.4827>>, 300.0, TRUE)
SET_CREATE_RANDOM_COPS(TRUE) //This is turned off during the previous stage.
DESTROY_ALL_CAMS()
//camMain = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<6.112632,-692.414307,33.635040>>, <<-2.132627,0.000000,78.518257>>, 28.057642, TRUE)
//SET_CAM_PARAMS(camMain, <<6.112632,-692.414307,33.635040>>, <<-3.035543,0.000000,12.422817>>, 28.057642, 4200, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
camMain = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<6.375817,-679.126160,32.758102>>,<<0.387843,0.000150,106.671608>>,28.057642, TRUE)
SET_CAM_PARAMS(camMain, <<9.240410,-682.497559,32.337612>>,<<5.222656,0.048676,109.850189>>,28.057642, 4200, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
SHAKE_CAM(camMain, "HAND_SHAKE", 0.4)
SETTIMERB(0)
iCurrentEvent++
ENDIF
ENDIF
ENDIF
BREAK
CASE 3 //Wait for the second shot to start where the vans reverse into place.
UPDATE_BANK_EMPLOYEE_IDLES()
//Stop the bank gate sound once the anim finishes
IF NOT HAS_SOUND_FINISHED(iBankGateOpenSound)
IF IS_ENTITY_PLAYING_ANIM(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_open")
IF GET_ENTITY_ANIM_CURRENT_TIME(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_open") > 0.97
STOP_SOUND(iBankGateOpenSound)
ENDIF
ELSE
STOP_SOUND(iBankGateOpenSound)
ENDIF
ENDIF
IF TIMERB() > 4500
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, 500.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[0].veh)
ENDIF
//Trevor is still playing the first recording, so switch him to the new one.
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
ENDIF
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, CARREC_BANK_PARK_2, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, 6000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[1].veh)
SET_ENTITY_COLLISION(sGoldVans[1].veh, FALSE)
//SET_CAM_PARAMS(camMain, <<-6.617867,-659.494019,34.851814>>,<<-5.898299,-0.014693,-160.371338>>,28.057642, 0)
//SET_CAM_PARAMS(camMain, <<-6.665196,-659.435852,34.169460>>,<<-5.898299,-0.014693,-163.004089>>,28.057642, 5000, GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
SET_CAM_PARAMS(camMain, <<-5.612391,-662.020142,35.009270>>,<<-6.539274,-0.038196,-167.348267>>,28.057642, 0)
SET_CAM_PARAMS(camMain, <<-6.440382,-659.405029,34.115765>>,<<-5.598649,-0.038196,-168.676910>>,28.057642, 8000, GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
SHAKE_CAM(camMain, "HAND_SHAKE", 0.2)
TASK_LOOK_AT_ENTITY(sBankWorker.ped, sGoldVans[1].veh, -1, SLF_EXTEND_PITCH_LIMIT | SLF_SLOW_TURN_RATE | SLF_WHILE_NOT_IN_FOV)
SETTIMERB(0)
sBankWorker.iEvent = 0
iCurrentEvent++
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF NOT GET_IS_VEHICLE_ENGINE_RUNNING(sGoldVans[0].veh)
SET_VEHICLE_ENGINE_ON(sGoldVans[0].veh, TRUE, TRUE)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF NOT GET_IS_VEHICLE_ENGINE_RUNNING(sGoldVans[1].veh)
SET_VEHICLE_ENGINE_ON(sGoldVans[1].veh, TRUE, TRUE)
ENDIF
ENDIF
BREAK
CASE 4 //Once the vans have parked start the mocap for everyone getting out.
UPDATE_BANK_EMPLOYEE_IDLES()
REQUEST_CUTSCENE("bs_2a_mcs_2")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_2")
REQUEST_WEAPON_ASSET(WEAPONTYPE_PUMPSHOTGUN)
REQUEST_WEAPON_ASSET(WEAPONTYPE_CARBINERIFLE)
IF sBankWorker.iEvent = 0
IF TIMERB() > 3000
AND NOT IS_PED_INJURED(sBankWorker.ped)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
TASK_LOOK_AT_ENTITY(sBankWorker.ped, sGoldVans[0].veh, -1, SLF_EXTEND_PITCH_LIMIT | SLF_SLOW_TURN_RATE | SLF_WHILE_NOT_IN_FOV)
sBankWorker.iEvent++
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
IF GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(CARREC_BANK_PARK_1, strCarrec) - GET_TIME_POSITION_IN_RECORDING(sGoldVans[0].veh) < 200
SET_PLAYBACK_SPEED(sGoldVans[0].veh, 0.0)
ENDIF
ENDIF
IF TIMERB() > 2000
SET_ENTITY_COLLISION(sGoldVans[1].veh, TRUE)
ENDIF
IF HAS_CUTSCENE_LOADED()
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_PUMPSHOTGUN)
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_CARBINERIFLE)
AND GET_ENTITY_SPEED(sGoldVans[0].veh) < 0.1
AND GET_ENTITY_SPEED(sGoldVans[1].veh) < 0.1
//AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
//Set the bank gates into their final position.
IF NOT HAS_SOUND_FINISHED(iBankGateOpenSound)
STOP_SOUND(iBankGateOpenSound)
ENDIF
NEW_LOAD_SCENE_STOP()
IF interiorBackgroundCarPark != NULL
UNPIN_INTERIOR(interiorBackgroundCarPark)
interiorBackgroundCarPark = NULL
ENDIF
SETUP_REQ_BANK_PEDS_READY_FOR_WALK(TRUE)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
ENDIF
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_FRONT_RIGHT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_ENGINE_ON(sGoldVans[0].veh, FALSE, FALSE)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[0].veh, "Trevors_truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
ENDIF
IF TIMERB() > 2000
SET_ENTITY_COLLISION(sGoldVans[1].veh, TRUE)
ENDIF
SET_VEHICLE_ENGINE_ON(sGoldVans[1].veh, FALSE, FALSE)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[1].veh, "Michaels_truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN)
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN, 100)
ENDIF
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN, TRUE)
objTrevorsWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN)
REGISTER_ENTITY_FOR_CUTSCENE(objTrevorsWeapon, "Trevors_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, sBankWorker.ped, "BankLiaison")
TASK_CLEAR_LOOK_AT(sBankWorker.ped)
REGISTER_ENTITY_FOR_CUTSCENE(sBankWorker.ped, "Bank_Employee", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_ENTITY_MODEL(sBankWorker.ped))
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_GUNMAN].ped, "gunman_selection_1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_DRIVER].ped, "driver_selection", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
IF NOT HAS_PED_GOT_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_ASSAULTRIFLE)
GIVE_WEAPON_TO_PED(sCrew[CREW_DRIVER].ped, WEAPONTYPE_ASSAULTRIFLE, 100)
ENDIF
SET_CURRENT_PED_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_ASSAULTRIFLE, TRUE)
objGunmansWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(sCrew[CREW_DRIVER].ped, WEAPONTYPE_ASSAULTRIFLE)
REGISTER_ENTITY_FOR_CUTSCENE(objGunmansWeapon, "HC_Gunman_Rifle", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[CASEY_ID].ped, "Casey", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
//Setup all the weapons
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100)
ENDIF
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, TRUE)
objMichaelsWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
REGISTER_ENTITY_FOR_CUTSCENE(objMichaelsWeapon, "Michaels_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
TRIGGER_MUSIC_EVENT("FH2A_ARRIVE_BANK_2")
REMOVE_ALL_AUDIO_SCENES()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
START_CUTSCENE()
SETTIMERB(0)
//iCutsceneCamEvent = 0
iMusicTriggerEvent = 0
iCurrentEvent++
ENDIF
ENDIF
BREAK
CASE 5
//Request assets for the next section in advance.
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterTop)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterTopLeft)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterTopRight)
IF DOES_CAM_EXIST(camMain)
IF IS_CUTSCENE_PLAYING()
DESTROY_CAM(camMain)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDIF
ENDIF
SEQUENCE_INDEX seq
//Music events during the cutscene.
IF IS_CUTSCENE_PLAYING()
IF iMusicTriggerEvent = 0
PREPARE_MUSIC_EVENT("FH2A_ENTER_BANK_MA")
IF GET_CUTSCENE_TIME() > 34500
TRIGGER_MUSIC_EVENT("FH2A_ENTER_BANK_MA")
iMusicTriggerEvent++
ENDIF
ELIF iMusicTriggerEvent = 1
IF GET_CUTSCENE_TIME() > 55300
TRIGGER_MUSIC_EVENT("FH2A_ACCESS_BANK_MA")
iMusicTriggerEvent++
ENDIF
ENDIF
REMOVE_OBJECT(objBankWorkerWalkieTalkie, TRUE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ENDIF
//Start the walking tasks
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor", GET_ENTITY_MODEL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
//SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<-5.7, -658.9, 32.4824>>, TRUE, TRUE)
//SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -7.2)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterTopRight, 3, DEFAULT, 15)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<9.2644, -671.3203, 32.4503>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 0.5, DEFAULT, -20.7)
//TASK_TURN_PED_TO_FACE_COORD(NULL, <<9.9, -667.8, 33.9>>)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN, TRUE)
FORCE_PED_MOTION_STATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Casey", GET_ENTITY_MODEL(sGoldVanPeds[CASEY_ID].ped))
SET_ENTITY_COORDS(sGoldVanPeds[CASEY_ID].ped, <<-4.0596, -656.1756, 32.4509>>, TRUE, TRUE)
SET_ENTITY_HEADING(sGoldVanPeds[CASEY_ID].ped, 33.4509)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterTopLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT, 17)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<11.5542, -671.6187, 32.4502>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 0.5, DEFAULT, 7.0)
//TASK_TURN_PED_TO_FACE_COORD(NULL, <<9.9, -667.8, 33.9>>)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[CASEY_ID].ped, TRUE)
FORCE_PED_MOTION_STATE(sGoldVanPeds[CASEY_ID].ped, MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Bank_Employee", GET_ENTITY_MODEL(sBankWorker.ped))
SET_ENTITY_COORDS(sBankWorker.ped, <<-3.5995, -656.8430, 32.4511>>, TRUE, TRUE)
SET_ENTITY_HEADING(sBankWorker.ped, -72.7)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterTop, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT, 32)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<11.844791,-669.347351, 32.4507>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 0.5, DEFAULT, 50.4)
//TASK_TURN_PED_TO_FACE_COORD(NULL, <<9.9, -667.8, 33.9>>)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
CLEAR_SEQUENCE_TASK(seq)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBankWorker.ped, TRUE)
FORCE_PED_MOTION_STATE(sBankWorker.ped, MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(sGoldVans[0].veh)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_truck")
SET_ENTITY_HEADING(sGoldVans[0].veh, -176.386)
SET_ENTITY_COORDS(sGoldVans[0].veh, <<-6.911, -667.815, 31.3154>>)
SET_VEHICLE_DOOR_SHUT(sGoldVans[0].veh, SC_DOOR_REAR_LEFT, TRUE)
SET_VEHICLE_DOOR_SHUT(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT, TRUE)
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(sGoldVans[1].veh)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_truck")
SET_ENTITY_HEADING(sGoldVans[1].veh, -174.161)
SET_ENTITY_COORDS(sGoldVans[1].veh, <<-2.283, -667.746, 31.3231>>)
SET_VEHICLE_DOOR_SHUT(sGoldVans[1].veh, SC_DOOR_REAR_LEFT, TRUE)
SET_VEHICLE_DOOR_SHUT(sGoldVans[1].veh, SC_DOOR_REAR_RIGHT, TRUE)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael", GET_ENTITY_MODEL(PLAYER_PED_ID()))
//SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-4.5, -661.4, 32.4824>>, TRUE, TRUE)
//SET_ENTITY_HEADING(PLAYER_PED_ID(), 31.0)
//SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, TRUE)
//FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE, TRUE, FAUS_CUTSCENE_EXIT)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_weapon")
GIVE_WEAPON_OBJECT_TO_PED(objMichaelsWeapon, PLAYER_PED_ID())
REMOVE_OBJECT(objMichaelsWeapon, TRUE)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("HC_Gunman_Weapon")
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
GIVE_WEAPON_OBJECT_TO_PED(objGunmansWeapon, sCrew[CREW_DRIVER].ped)
REMOVE_OBJECT(objGunmansWeapon, TRUE)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_weapon")
GIVE_WEAPON_OBJECT_TO_PED(objTrevorsWeapon, sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
REMOVE_OBJECT(objTrevorsWeapon, TRUE)
ENDIF
IF NOT IS_CUTSCENE_ACTIVE()
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
BREAK
ENDSWITCH
IF NOT bSkippedMocap
IF (NOT IS_CUTSCENE_PLAYING() AND IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY())
OR WAS_CUTSCENE_SKIPPED()
bSkippedMocap = TRUE
eSectionStage = SECTION_STAGE_SKIP
ENDIF
ENDIF
//Move the bank gate collision to match the anim
IF IS_ENTITY_PLAYING_ANIM(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_open")
FLOAT fAnimTime = GET_ENTITY_ANIM_CURRENT_TIME(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_open")
SET_ENTITY_COORDS(objSecurityGateCollision[0], vGate1 + <<0.0, 0.0, 0.3 + (fAnimTime * 4.0)>>)
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REPLAY_STOP_EVENT()
REMOVE_ANIM_DICT(strAnimIG3)
REMOVE_VEHICLE_RECORDING(CARREC_BANK_PARK_1, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_BANK_PARK_2, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_BANK_LEAVE_GATE, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_BANK_TREVOR, strCarrec)
//Close the gate.
PLAY_ENTITY_ANIM(objSecurityBarriers[0], "p_sec_gate_01_s_close", "map_objects", 4.0, FALSE, TRUE)
SET_ENTITY_COORDS(objSecurityGateCollision[0], vGate1 + <<0.0, 0.0, 0.1>>)
REMOVE_OBJECT(objMichaelsWeapon, TRUE)
REMOVE_OBJECT(objTrevorsWeapon, TRUE)
REMOVE_OBJECT(objGunmansWeapon, TRUE)
REMOVE_OBJECT(objIDCard, TRUE)
//Delete the bank worker's walkie talkie, as it doesn't fit with the normal idles/walks.
REMOVE_OBJECT(objBankWorkerWalkieTalkie, TRUE)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
SET_ENTITY_LOAD_COLLISION_FLAG(sGoldVans[1].veh, FALSE)
ENDIF
IF NOT HAS_SOUND_FINISHED(iBankGateOpenSound)
STOP_SOUND(iBankGateOpenSound)
ENDIF
//This was set up during the drive to the bank, now should be safe to remove.
IF iNavmeshBlockBankEntrance != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(iNavmeshBlockBankEntrance)
iNavmeshBlockBankEntrance = -1
ENDIF
IF interiorBackgroundCarPark != NULL
UNPIN_INTERIOR(interiorBackgroundCarPark)
interiorBackgroundCarPark = NULL
ENDIF
NEW_LOAD_SCENE_STOP()
CLEAR_PED_NON_CREATION_AREA()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_WALK_TO_LIFT_1
ENDIF
//Can't use Z-skip for this due to streaming issues, also need to assign the tasks at some point as the mocap may not have started so we can't rely on the exit states.
IF eSectionStage = SECTION_STAGE_SKIP
DO_FADE_OUT_WITH_WAIT()
STOP_SYNCHRONIZED_ENTITY_ANIM(PLAYER_PED_ID(), INSTANT_BLEND_OUT, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-4.5, -661.4, 32.4824>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 31.0)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
NEW_LOAD_SCENE_STOP()
STOP_CUTSCENE()
REMOVE_CUTSCENE()
CANCEL_ALL_PREPARED_MUSIC_EVENTS()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterTop)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterTopLeft)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterTopRight)
WHILE IS_CUTSCENE_ACTIVE()
OR NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterTop)
OR NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterTopLeft)
OR NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterTopRight)
OR NOT SETUP_REQ_BANK_INTERIOR_LOADED()
WAIT(0)
ENDWHILE
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<-4.5, -661.4, 32.4824>>, 15.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
WAIT(1000) //Allow some time before fading in.
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
ENDIF
SET_ENTITY_HEADING(sGoldVans[0].veh, -176.386)
SET_ENTITY_COORDS(sGoldVans[0].veh, <<-6.911, -667.815, 31.3154>>)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
ENDIF
SET_ENTITY_COLLISION(sGoldVans[1].veh, TRUE)
SET_ENTITY_HEADING(sGoldVans[1].veh, -174.161)
SET_ENTITY_COORDS(sGoldVans[1].veh, <<-2.283, -667.746, 31.3231>>)
ENDIF
//Get everyone out the cars.
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<-5.7, -658.9, 32.4824>>)
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -7.2)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
STOP_SYNCHRONIZED_ENTITY_ANIM(sGoldVanPeds[CASEY_ID].ped, INSTANT_BLEND_OUT, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(sGoldVanPeds[CASEY_ID].ped)
SET_ENTITY_COORDS(sGoldVanPeds[CASEY_ID].ped, <<-4.0596, -656.1756, 32.4509>>, TRUE, TRUE)
SET_ENTITY_HEADING(sGoldVanPeds[CASEY_ID].ped, 33.4509)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
STOP_SYNCHRONIZED_ENTITY_ANIM(sBankWorker.ped, INSTANT_BLEND_OUT, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(sBankWorker.ped)
SET_ENTITY_COORDS(sBankWorker.ped, <<-3.5995, -656.8430, 32.4511>>)
SET_ENTITY_HEADING(sBankWorker.ped, -72.7)
ENDIF
IF NOT IS_PED_INJURED(pedGateSecurity)
STOP_SYNCHRONIZED_ENTITY_ANIM(pedGateSecurity, INSTANT_BLEND_OUT, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(pedGateSecurity)
ENDIF
//Get the right weapons equipped.
SETUP_REQ_BANK_PEDS_READY_FOR_WALK(TRUE)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, TRUE)
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDPROC
PROC WALK_TO_LIFT_1()
SEQUENCE_INDEX seq
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
IF SETUP_REQ_PLAYER_IS_MICHAEL()
AND SETUP_REQ_BANK_INTERIOR_LOADED()
IF bHasUsedCheckpoint
START_REPLAY_SETUP(<<-4.9754, -660.9686, 32.4189>>, 0.0, FALSE, TRUE)
iCurrentEvent = 99
ELSE
//Fix for B*528757: Guarantee that the tunnel is loaded first before trying to set up everything else.
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-4.9754, -660.9686, 32.4189>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<-4.9754, -660.9686, 32.4189>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ENDIF
ELSE
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterTop)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterTopLeft)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterTopRight)
REQUEST_WEAPON_ASSET(WEAPONTYPE_PUMPSHOTGUN)
REQUEST_WEAPON_ASSET(WEAPONTYPE_CARBINERIFLE)
REQUEST_ANIM_DICT("map_objects")
IF SETUP_REQ_BANK_WORKER(<<-3.5995, -656.8430, 32.4511>>, -72.7)
AND SETUP_REQ_GOLD_VANS_AT_BANK()
AND SETUP_REQ_MAIN_DRIVER(<<-4.2024, -675.4505, 31.3410>>, 269.1434)
AND SETUP_REQ_MAIN_GUNMAN(<<-5.2024, -675.4505, 31.3410>>, 269.1434)
AND SETUP_REQ_TREVOR(<<-5.7, -658.9, 32.4824>>, -7.2)
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-4.0596, -656.1756, 32.4509>>, 33.4509)
AND SETUP_REQ_SECURITY_BARRIERS()
AND SETUP_REQ_BANK_SECURITY()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterTop)
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterTopLeft)
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterTopRight)
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_PUMPSHOTGUN)
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_CARBINERIFLE)
AND HAS_ANIM_DICT_LOADED("map_objects")
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
SETUP_REQ_BANK_PEDS_READY_FOR_WALK(TRUE)
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
REMOVE_MICHAEL_SHOTGUN_SILENCER()
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, TRUE)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-4.5, -661.4, 32.4824>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 31.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
WAIT(1000) //B*635494 - Allow some time before fading in.
//Start the walking tasks
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
//Reposition the crew members in front of the trucks
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
SET_CURRENT_PED_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_CURRENT_PED_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
ENDIF
//If the gate anim started playing in the previous frame force it to reach the end
IF IS_ENTITY_PLAYING_ANIM(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_close")
SET_ENTITY_ANIM_CURRENT_TIME(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_close", 0.99)
ENDIF
SETTIMERA(0)
SETTIMERB(0)
//If we skipped here (either Z-skip or cutscene skip) make sure the peds perform their tasks.
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2A_ACCESS_BANK_RESTART")
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterTopRight, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT, 15)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<9.2644, -671.3203, 32.4503>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 0.5, DEFAULT, -20.7)
//TASK_TURN_PED_TO_FACE_COORD(NULL, <<9.9, -667.8, 33.9>>)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterTopLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT, 17)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<11.5542, -671.6187, 32.4502>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 0.5, DEFAULT, 7.0)
//TASK_TURN_PED_TO_FACE_COORD(NULL, <<9.9, -667.8, 33.9>>)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[CASEY_ID].ped, TRUE)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterTop, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT, 32)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<11.844791,-669.347351, 32.4507>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 0.5, DEFAULT, 50.4)
//TASK_TURN_PED_TO_FACE_COORD(NULL, <<9.9, -667.8, 33.9>>)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
CLEAR_SEQUENCE_TASK(seq)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBankWorker.ped, TRUE)
ENDIF
ENDIF
//The bank worker and the security guard from the previous cutscene share the same speaker number, so make sure the bank worker is set up.
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, sBankWorker.ped, "BankLiaison")
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_FOLLOW_MANAGER")
START_AUDIO_SCENE("BS_2A_FOLLOW_MANAGER")
ENDIF
DO_FADE_IN_WITH_WAIT()
bPlayedLiftSound = FALSE
fLiftOpenRatio = 0.0
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_FINELEVDOOR01, <<11.7, -668.5, 32.4>>, FALSE)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_FINELEVDOOR01, <<8.8, -668.7, 32.4>>, FALSE)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_BANK_TOUR, "COLLECT_GOLD_FROM_BANK")
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
REPLAY_RECORD_BACK_FOR_TIME(0.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
bClosedVaultDoor = FALSE
iCurrentEvent = 0
iGameplayHintEvent = 0
sBankWorker.iEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
//Create the vault worker and trolleys in advance
SETUP_REQ_VAULT_WORKER(<<-6.0290, -686.3659, 15.1306>>, 161.4787)
SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
//Require lift sounds throughout
REQUEST_SCRIPT_AUDIO_BANK("Freight_Elevator")
IF NOT IS_PED_INJURED(sBankWorker.ped)
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
IF NOT DOES_BLIP_EXIST(sBankWorker.blip)
sBankWorker.blip = CREATE_BLIP_FOR_ENTITY(sBankWorker.ped)
SET_BLIP_NAME_FROM_TEXT_FILE(sBankWorker.blip, "F3A_WORKNAME")
ENDIF
SWITCH iCurrentEvent
CASE 0
//SET_PED_MOVE_RATE_OVERRIDE(sBankWorker.ped, 1.1)
//SET_PED_MOVE_RATE_OVERRIDE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.9)
//Rubber banding on peds to keep them close
IF NOT IS_ENTITY_IN_ANGLED_AREA(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<10.596344,-673.539246,32.211445>>, <<9.996563,-667.079468,35.699215>>, 4.000000)
RUBBER_BAND_WALKING_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.94, 7.0, 10.0)
ENDIF
IF NOT IS_ENTITY_IN_ANGLED_AREA(sBankWorker.ped, <<10.596344,-673.539246,32.211445>>, <<9.996563,-667.079468,35.699215>>, 4.000000)
RUBBER_BAND_WALKING_PED(sBankWorker.ped, 1.12, 7.0, 10.0)
ENDIF
IF NOT IS_ENTITY_IN_ANGLED_AREA(sGoldVanPeds[CASEY_ID].ped, <<10.596344,-673.539246,32.211445>>, <<9.996563,-667.079468,35.699215>>, 4.000000)
RUBBER_BAND_WALKING_PED(sGoldVanPeds[CASEY_ID].ped, 1.07, 7.0, 10.0)
ENDIF
REQUEST_CUTSCENE("BS_2A_MCS_3_alt")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("BS_2A_MCS_3_alt")
IF VDIST2(GET_ENTITY_COORDS(sBankWorker.ped), vLiftTop1) < 49.0
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_OPEN, vLiftTop1, vLiftTop2, modelLiftDoor)
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<10.640754,-673.535767,32.479485>>, <<9.958423,-665.871521,35.949272>>, 4.000000)
//IF (GET_SCRIPT_TASK_STATUS(sBankWorker.ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
//AND GET_SCRIPT_TASK_STATUS(sGoldVanPeds[CASEY_ID].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK)
//OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<10.773432,-673.525513,32.485138>>, <<10.276505,-668.525818,34.949657>>, 3.250000)
eSectionStage = SECTION_STAGE_CLEANUP
//ENDIF
ENDIF
BREAK
ENDSWITCH
SWITCH iGameplayHintEvent
CASE 0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<7.217823,-664.156372,32.450058>>, <<10.608177,-658.160156,35.449062>>, 1.250000)
SET_GAMEPLAY_COORD_HINT(<<10.6, -673.3, 33.7934>>, -1, 2000)
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(0.8)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(0.015)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(0.2)
SET_GAMEPLAY_HINT_FOV(40.0)
SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), <<10.2414, -668.6328, 32.6694>>, PEDMOVE_WALK, -1, 0.25, ENAV_NO_STOPPING)
//TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(), <<10.1914, -671.6328, 32.6694>>, PEDMOVE_WALK)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 2.0, REPLAY_IMPORTANCE_HIGHEST)
iGameplayHintEvent++
ENDIF
BREAK
ENDSWITCH
//Chat between Trevor
IF NOT bHasTextLabelTriggered[F3A_FOLLOW]
PRINT_NOW("F3A_FOLLOW", DEFAULT_GOD_TEXT_TIME, 0)
bHasTextLabelTriggered[F3A_FOLLOW] = TRUE
ELSE
IF NOT bHasTextLabelTriggered[FH3A_LIASON]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])) < 36.0
AND NOT IS_ENTITY_IN_ANGLED_AREA(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<10.596344,-673.539246,32.211445>>, <<9.996563,-667.079468,35.699215>>, 4.000000)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LIASON", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_LIASON] = TRUE
ENDIF
ENDIF
ELSE
//Kill the conversation before the player approaches the lift, to avoid having to cut a line off mid-way for the cutscene.
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<11.997320,-661.298523,32.448719>>, <<4.313392,-661.590698,34.950577>>, 6.000000)
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
//Play a line if the player lags behind
IF NOT bHasTextLabelTriggered[FH3A_LAG1]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT IS_MESSAGE_BEING_DISPLAYED() OR NOT IS_SUBTITLE_PREFERENCE_SWITCHED_ON()
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])) > 49.0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LAG", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_LAG1] = TRUE
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
ENDIF
//Play the lag line again if the player just stands by the elevator and doesn't get in.
IF NOT bHasTextLabelTriggered[FH3A_LAG1B]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
IF GET_GAME_TIMER() - iTrevorLagDialogueTimer > 6000
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LAG", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_LAG1B] = TRUE
ENDIF
ENDIF
ELSE
iTrevorLagDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
//Get the manager to look at the player.
IF sBankWorker.iEvent = 0
IF IS_ENTITY_IN_ANGLED_AREA(sBankWorker.ped, <<10.773432,-673.525513,32.485138>>, <<10.276505,-668.525818,34.949657>>, 3.250000)
//AND GET_SCRIPT_TASK_STATUS(sBankWorker.ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
TASK_LOOK_AT_ENTITY(sBankWorker.ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
sBankWorker.iEvent++
ENDIF
ENDIF
//Fail if the player tries to leave the area.
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<14.952208,-672.626892,31.232529>>, <<27.430967,-677.752441,34.482529>>, 4.750000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-61.700726,-693.533020,31.268063>>, <<-56.521435,-680.950562,34.601341>>, 4.750000)
MISSION_FAILED(FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS)
ENDIF
IF IS_PLAYER_ACTING_SUSPICIOUS_IN_BANK()
MISSION_FAILED(FAILED_SPOOKED_BANK_WORKERS)
ENDIF
//Disable any weapon controls to prevent shenanigans.
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
CLEAR_PRINTS()
CLEAR_HELP()
REMOVE_ALL_BLIPS()
KILL_FACE_TO_FACE_CONVERSATION()
IF NOT HAS_SOUND_FINISHED(iLiftSoundID)
STOP_SOUND(iLiftSoundID)
ENDIF
eMissionStage = STAGE_LIFT_CUTSCENE_1
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_LIFT_CUTSCENE_1)
ENDIF
ENDPROC
PROC LIFT_CUTSCENE_1()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<10.5, -671.6, 32.44>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
IF SETUP_REQ_PLAYER_IS_MICHAEL()
AND SETUP_REQ_BANK_INTERIOR_LOADED()
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<10.5, -671.6, 32.44>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ELSE
IF SETUP_REQ_BANK_WORKER(<<-3.61, -657.35, 32.4518>>, 263.770699)
AND SETUP_REQ_VAULT_WORKER(<<-6.0290, -686.3659, 15.1306>>, 161.4787)
AND SETUP_REQ_GOLD_VANS_AT_BANK()
AND SETUP_REQ_MAIN_DRIVER(<<-6.5872, -671.7311, 31.3406>>, 269.1434)
AND SETUP_REQ_MAIN_GUNMAN(<<-7.5872, -671.7311, 31.3406>>, 269.1434)
AND SETUP_REQ_TREVOR(<<-5.53, -658.22, 32.4518>>, -153.477966)
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-4.68, -657.71, 33.429>>, -127.999458)
AND SETUP_REQ_SECURITY_BARRIERS()
AND SETUP_REQ_BANK_SECURITY()
AND SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
SETUP_REQ_BANK_PEDS_READY_FOR_WALK()
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
REMOVE_MICHAEL_SHOTGUN_SILENCER()
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_CUTSCENE("BS_2A_MCS_3_alt")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("BS_2A_MCS_3_alt")
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2A_ACCESS_BANK_RESTART")
WAIT(0)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
TASK_CLEAR_LOOK_AT(sBankWorker.ped)
REGISTER_ENTITY_FOR_CUTSCENE(sBankWorker.ped, "Bank_Employee", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_ENTITY_MODEL(sBankWorker.ped))
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[CASEY_ID].ped, "Casey", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
TRIGGER_MUSIC_EVENT("FH2A_ENTER_LIFT")
DO_FADE_IN_WITH_WAIT()
bSkippedMocap = FALSE
iMusicTriggerEvent = 0
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
REQUEST_SCRIPT_AUDIO_BANK("Freight_Elevator")
DISABLE_CONTROL_ACTION(PLAYER_CONTROL,INPUT_NEXT_CAMERA)
SWITCH iCurrentEvent
CASE 0 //Play the lift entry mocap
REQUEST_ANIM_DICT(strAnimLiftLeadOut)
//Handle lift doors and audio.
SWITCH iMusicTriggerEvent
CASE 0
IF IS_CUTSCENE_PLAYING()
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
STOP_GAMEPLAY_HINT(TRUE)
REMOVE_ALL_AUDIO_SCENES()
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_INSTANT_CLOSE, vLiftBottom1, vLiftBottom2, modelLiftDoor, FALSE)
fLiftOpenRatio = 1.0
bPlayedLiftSound = FALSE
iMusicTriggerEvent++
ENDIF
BREAK
CASE 1
PREPARE_MUSIC_EVENT("FH2A_BANK_MID")
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
AND GET_CUTSCENE_TIME() > 500
NEW_LOAD_SCENE_START_SPHERE(<<-0.1, -706.2, 16.6>>, 5.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
ENDIF
IF IS_CUTSCENE_PLAYING()
IF GET_CUTSCENE_TIME() > 5100
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_CLOSE, vLiftTop1, vLiftTop2, modelLiftDoor)
ENDIF
ENDIF
BREAK
ENDSWITCH
//Preload the lift conversation.
IF NOT bHasTextLabelTriggered[FH3A_MCS3_LO_PRELOAD]
IF sConversationPeds.PedInfo[5].Index != sGoldVanPeds[CASEY_ID].ped
ADD_PED_FOR_DIALOGUE(sConversationPeds, 5, sGoldVanPeds[CASEY_ID].ped, "CASEY")
ENDIF
IF sConversationPeds.PedInfo[8].Index != sBankWorker.ped
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, sBankWorker.ped, "BankLiaison")
ENDIF
IF PRELOAD_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS3_LO", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_MCS3_LO_PRELOAD] = TRUE
ENDIF
ENDIF
IF HAS_ANIM_DICT_LOADED(strAnimLiftLeadOut)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<-1.26, -705.72, 15.3>>)
iSyncSceneLiftLeadOut[0] = CREATE_SYNCHRONIZED_SCENE(<<-1.233, -702.975, 15.136>>, <<-0.000, 0.000, 160.0>>)
TASK_SYNCHRONIZED_SCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], iSyncSceneLiftLeadOut[0], strAnimLiftLeadOut, "trevor_leadout_action",
INSTANT_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT)
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN, TRUE)
RETAIN_ENTITY_IN_INTERIOR(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], interiorBank)
//FORCE_PED_MOTION_STATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Casey")
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
SET_ENTITY_COORDS(sGoldVanPeds[CASEY_ID].ped, <<0.6, -707.0, 15.3>>)
iSyncSceneLiftLeadOut[1] = CREATE_SYNCHRONIZED_SCENE(<<-1.233, -702.975, 15.136>>, <<-0.000, 0.000, 160.0>>)
TASK_SYNCHRONIZED_SCENE(sGoldVanPeds[CASEY_ID].ped, iSyncSceneLiftLeadOut[1], strAnimLiftLeadOut, "casey_leadout_action",
INSTANT_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT)
RETAIN_ENTITY_IN_INTERIOR(sGoldVanPeds[CASEY_ID].ped, interiorBank)
FORCE_ROOM_FOR_ENTITY(sGoldVanPeds[CASEY_ID].ped, interiorBank, HASH("GtaMloRoom013"))
//FORCE_PED_MOTION_STATE(sGoldVanPeds[CASEY_ID].ped, MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sGoldVanPeds[CASEY_ID].ped)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Bank_Employee")
AND NOT IS_PED_INJURED(sBankWorker.ped)
SET_ENTITY_COORDS(sBankWorker.ped, <<1.2, -705.5, 15.3>>)
iSyncSceneLiftLeadOut[2] = CREATE_SYNCHRONIZED_SCENE(<<-1.233, -702.975, 15.136>>, <<-0.000, 0.000, 160.0>>)
TASK_SYNCHRONIZED_SCENE(sBankWorker.ped, iSyncSceneLiftLeadOut[2], strAnimLiftLeadOut, "bankman_leadout_action",
INSTANT_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT)
RETAIN_ENTITY_IN_INTERIOR(sBankWorker.ped, interiorBank)
FORCE_ROOM_FOR_ENTITY(sBankWorker.ped, interiorBank, HASH("GtaMloRoom013"))
//FORCE_PED_MOTION_STATE(sBankWorker.ped, MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sBankWorker.ped)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-0.6656, -707.2256, 15.1307>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 337.8443)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, TRUE)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE, TRUE, FAUS_CUTSCENE_EXIT)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
//Play idle animation with camera data to lock player in place and limit view to a spring [MT]
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
TASK_PLAY_ANIM (PLAYER_PED_ID(), strAnimLiftLeadOut, "PLAYER_SHOTGUN_LOOP", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING, 0, FALSE, AIK_USE_FP_ARM_RIGHT | AIK_USE_FP_ARM_LEFT )
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
//IF interiorBank != NULL
// FORCE_ROOM_FOR_GAME_VIEWPORT(interiorBank, HASH("GtaMloRoom013"))
//ENDIF
ENDIF
IF NOT IS_CUTSCENE_ACTIVE()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
IF NOT IS_SCREEN_FADED_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
NEW_LOAD_SCENE_STOP()
iMusicTriggerEvent = 0
iCurrentEvent++
ENDIF
ELSE
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE)
ENDIF
BREAK
CASE 1 //Wait for the synced scene to finish
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottom)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomLeft)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomRight)
SEQUENCE_INDEX seq
INT iWaypointStopNode
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottom)
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointLiftExitBottom, <<-3.4008, -694.3450, 15.1556>>, iWaypointStopNode)
ENDIF
IF NOT bHasTextLabelTriggered[FH3A_MCS3_LO]
IF sConversationPeds.PedInfo[5].Index != sGoldVanPeds[CASEY_ID].ped
ADD_PED_FOR_DIALOGUE(sConversationPeds, 5, sGoldVanPeds[CASEY_ID].ped, "CASEY")
ENDIF
IF sConversationPeds.PedInfo[8].Index != sBankWorker.ped
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, sBankWorker.ped, "BankLiaison")
ENDIF
IF bHasTextLabelTriggered[FH3A_MCS3_LO_PRELOAD]
BEGIN_PRELOADED_CONVERSATION()
bHasTextLabelTriggered[FH3A_MCS3_LO] = TRUE
ELSE
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS3_LO", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_MCS3_LO] = TRUE
ENDIF
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_MCS3_LO_7]
//The last line plays too soon, split it from the rest of the dialgue.
/*IF IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
TEXT_LABEL strCurrentLine
strCurrentLine = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL()
IF ARE_STRINGS_EQUAL(strCurrentLine, "FH3A_MCS3_LO_6")
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLiftLeadOut[2]) > 0.85
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS3_LO", "FH3A_MCS3_LO_7", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_MCS3_LO_7] = TRUE
ENDIF
ENDIF*/
ENDIF
SWITCH iMusicTriggerEvent
CASE 0 //Play lift move sound
IF HAS_SOUND_FINISHED(iLiftMoveSoundID)
PLAY_SOUND_FROM_COORD(iLiftMoveSoundID, "FREIGHT_ELEVATOR_01_MOTOR", GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<0.0, 0.0, 3.0>>)
ENDIF
SHAKE_GAMEPLAY_CAM("SKY_DIVING_SHAKE", 0.02)
iMusicTriggerEvent++
BREAK
CASE 1 //Stop lift sound
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLiftLeadOut[2]) > 0.82
IF NOT HAS_SOUND_FINISHED(iLiftMoveSoundID)
STOP_SOUND(iLiftMoveSoundID)
ENDIF
STOP_GAMEPLAY_CAM_SHAKING(TRUE)
iMusicTriggerEvent++
ENDIF
BREAK
CASE 2 //Open door.
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLiftLeadOut[2]) > 0.85
fLiftOpenRatio = 0.0
bPlayedLiftSound = FALSE
iMusicTriggerEvent++
ENDIF
BREAK
CASE 3
IF PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_OPEN, vLiftBottom1, vLiftBottom2, modelLiftDoor)
iMusicTriggerEvent++
ENDIF
BREAK
ENDSWITCH
IF NOT IS_PLAYER_CONTROL_ON(PLAYER_ID())
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLiftLeadOut[0])
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLiftLeadOut[0]) > 0.93
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
// Clear tasks to remove limited camera animation [MT]
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
CLEAR_PED_TASKS(PLAYER_PED_ID())
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLiftLeadOut[0])
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLiftLeadOut[0]) > 0.96
STOP_SYNCHRONIZED_ENTITY_ANIM(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WALK_BLEND_OUT, TRUE)
iSyncSceneLiftLeadOut[0] = -1
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottomLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iWaypointStopNode)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-5.8, -689.6968, 15.1556>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
CLEAR_SEQUENCE_TASK(seq)
FORCE_PED_MOTION_STATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], MS_ON_FOOT_WALK)
ENDIF
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLiftLeadOut[1])
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLiftLeadOut[1]) > 0.96
STOP_SYNCHRONIZED_ENTITY_ANIM(sGoldVanPeds[CASEY_ID].ped, WALK_BLEND_OUT, TRUE)
iSyncSceneLiftLeadOut[1] = -1
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottomRight, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iWaypointStopNode)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-4.9572, -689.6028, 15.1556>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
FORCE_PED_MOTION_STATE(sGoldVanPeds[CASEY_ID].ped, MS_ON_FOOT_WALK)
ENDIF
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
IF NOT DOES_BLIP_EXIST(sBankWorker.blip)
sBankWorker.blip = CREATE_BLIP_FOR_ENTITY(sBankWorker.ped)
SET_BLIP_NAME_FROM_TEXT_FILE(sBankWorker.blip, "F3A_WORKNAME")
ENDIF
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLiftLeadOut[2])
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLiftLeadOut[2]) > 0.96
STOP_SYNCHRONIZED_ENTITY_ANIM(sBankWorker.ped, WALK_BLEND_OUT, TRUE)
iSyncSceneLiftLeadOut[2] = -1
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottom, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iWaypointStopNode)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-4.7, -688.6003, 15.1306>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
CLEAR_SEQUENCE_TASK(seq)
FORCE_PED_MOTION_STATE(sBankWorker.ped, MS_ON_FOOT_WALK)
ENDIF
ENDIF
ENDIF
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLiftLeadOut[0])
AND NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLiftLeadOut[1])
AND NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLiftLeadOut[2])
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
BREAK
ENDSWITCH
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REPLAY_STOP_EVENT()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
KILL_FACE_TO_FACE_CONVERSATION()
REMOVE_ANIM_DICT(strAnimLiftLeadOut)
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
ENDIF
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_WALK_TO_VAULT
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
BOOL bTopDoorWasMidClosing = FALSE
IF IS_CUTSCENE_PLAYING()
IF GET_CUTSCENE_TIME() > 5100 AND GET_CUTSCENE_TIME() < 10100
bTopDoorWasMidClosing = TRUE
ENDIF
ENDIF
IF NOT IS_SCREEN_FADED_OUT()
IF NOT IS_SCREEN_FADING_OUT()
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_OUT()
IF bTopDoorWasMidClosing
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_CLOSE, vLiftTop1, vLiftTop2, modelLiftDoor, FALSE)
ENDIF
WAIT(0)
ENDWHILE
ENDIF
JUMP_TO_STAGE(STAGE_WALK_TO_VAULT)
ENDIF
ENDPROC
PROC WALK_TO_VAULT()
SEQUENCE_INDEX seq
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
//Interior needs to be loaded first, to stop entities falling through the map
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-0.65, -707.22, 15.1306>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
IF SETUP_REQ_PLAYER_IS_MICHAEL()
AND SETUP_REQ_BANK_INTERIOR_LOADED()
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<-0.65, -707.22, 15.1306>>, 20.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ELSE
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottom)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomLeft)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomRight)
IF SETUP_REQ_BANK_WORKER(<<-0.7164, -700.7703, 15.1309>>, 27.6258)
AND SETUP_REQ_VAULT_WORKER(<<-6.0290, -686.3659, 15.1306>>, 161.4787)
AND SETUP_REQ_GOLD_VANS_AT_BANK()
AND SETUP_REQ_MAIN_DRIVER(<<-6.5872, -671.7311, 31.3406>>, 269.1434)
AND SETUP_REQ_MAIN_GUNMAN(<<-7.5872, -671.7311, 31.3406>>, 269.1434)
AND SETUP_REQ_TREVOR(<<0.1575, -703.0106, 15.1309>>, 12.6224)
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<0.6822, -701.7074, 15.1309>>, 20.3976)
AND SETUP_REQ_SECURITY_BARRIERS()
AND SETUP_REQ_BANK_SECURITY()
AND SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottom)
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottomLeft)
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottomRight)
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
SETUP_REQ_BANK_PEDS_READY_FOR_WALK()
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
REMOVE_MICHAEL_SHOTGUN_SILENCER()
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-0.65, -707.22, 15.1306>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), -24.06)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
INT iWaypointStopNode
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointLiftExitBottom, <<-3.4008, -694.3450, 15.1556>>, iWaypointStopNode)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottomLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iWaypointStopNode)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-5.8, -689.6968, 15.1556>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottomRight, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iWaypointStopNode)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-4.9572, -689.6028, 15.1556>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottom, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iWaypointStopNode)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-4.7, -688.6003, 15.1306>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vVaultDoorPos, 5.0, modelVaultDoor)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelVaultDoor, vVaultDoorPos, TRUE, 0.0)
ENDIF
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_INSTANT_OPEN, vLiftBottom1, vLiftBottom2, modelLiftDoor)
fLiftOpenRatio = 1.0
bPlayedLiftSound = FALSE
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
IF IS_SCREEN_FADED_OUT()
//Skipped to this point: restart the music stream.
TRIGGER_MUSIC_EVENT("FH2A_BANK_MID_RESTART")
ELSE
TRIGGER_MUSIC_EVENT("FH2A_BANK_MID")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_VAULT")
START_AUDIO_SCENE("BS_2A_GET_TO_VAULT")
ENDIF
DO_FADE_IN_WITH_WAIT()
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
bClosedVaultDoor = FALSE
fLiftOpenRatio = 1.0
iLiftEvent = 0
bPlayedLiftSound = TRUE
iCurrentEvent = 0
iGameplayHintEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
REPLAY_RECORD_BACK_FOR_TIME(3.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
UPDATE_VAULT_WORKER_IDLES()
IF NOT IS_PED_INJURED(sBankWorker.ped)
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
RUBBER_BAND_WALKING_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.93)
RUBBER_BAND_WALKING_PED(sBankWorker.ped, 1.0)
RUBBER_BAND_WALKING_PED(sGoldVanPeds[CASEY_ID].ped, 1.0)
SWITCH iCurrentEvent
CASE 0 //Back up in the elevator
IF NOT DOES_BLIP_EXIST(sBankWorker.blip)
sBankWorker.blip = CREATE_BLIP_FOR_ENTITY(sBankWorker.ped)
SET_BLIP_NAME_FROM_TEXT_FILE(sBankWorker.blip, "F3A_WORKNAME")
ENDIF
REQUEST_CUTSCENE("bs_2a_mcs_4")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_4")
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-0.654319,-696.364868,15.130766>>, <<-7.095732,-700.145325,17.630766>>, 1.000000)
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
BREAK
ENDSWITCH
SWITCH iGameplayHintEvent
CASE 0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-3.877056,-701.371399,14.261276>>, <<1.083258,-697.605896,17.728502>>, 4.000000)
SET_GAMEPLAY_COORD_HINT(<<-6.0877, -686.4245, 16.5762>>, -1, 2000)
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(0.5)
//SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(-0.9)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(0.015)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(0.2)
SET_GAMEPLAY_HINT_FOV(40.0)
SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), <<-4.7636, -689.6049, 15.2538>>, PEDMOVE_WALK, -1, 0.25, ENAV_NO_STOPPING)
//TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(), <<-4.7636, -689.6049, 15.2538>>, PEDMOVE_WALK)
iGameplayHintEvent++
ENDIF
BREAK
ENDSWITCH
ENDIF
//Dialogue
IF NOT bHasTextLabelTriggered[FH3A_WORKER] //Vault worker says a line when he sees them approach.
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_WORKER", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_WORKER] = TRUE
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_VAULT] //Trevor says a line when approaching the vault door.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_VAULT", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_VAULT] = TRUE
ENDIF
ENDIF
ENDIF
//Play a line if the player lags behind
IF NOT bHasTextLabelTriggered[FH3A_LAG2]
IF NOT IS_MESSAGE_BEING_DISPLAYED() OR NOT IS_SUBTITLE_PREFERENCE_SWITCHED_ON()
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])) > 64.0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LAG", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_LAG2] = TRUE
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
ENDIF
REQUEST_SCRIPT_AUDIO_BANK("Freight_Elevator")
//Open/close the lift manually, sync sounds to match
IF iLiftEvent = 0
//PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_OPEN, vLiftBottom1, vLiftBottom2, modelLiftDoor)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-4.281778,-701.224304,15.042150>>, <<-0.120090,-697.080261,17.881498>>, 1.500000)
fLiftOpenRatio = 1.0
bPlayedLiftSound = FALSE
iLiftEvent++
ENDIF
ELIF iLiftEvent = 1
IF PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_CLOSE, vLiftBottom1, vLiftBottom2, modelLiftDoor)
iLiftEvent++
ENDIF
ENDIF
IF NOT bClosedVaultDoor
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vVaultDoorPos, 5.0, modelVaultDoor)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelVaultDoor, vVaultDoorPos, TRUE, 0.0)
bClosedVaultDoor = TRUE
ENDIF
ENDIF
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
IF IS_PLAYER_ACTING_SUSPICIOUS_IN_BANK()
MISSION_FAILED(FAILED_SPOOKED_BANK_WORKERS)
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
CLEAR_PRINTS()
REMOVE_ALL_BLIPS()
IF NOT HAS_SOUND_FINISHED(iLiftSoundID)
STOP_SOUND(iLiftSoundID)
ENDIF
eMissionStage = STAGE_VAULT_OPEN_CUTSCENE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_VAULT_OPEN_CUTSCENE)
ENDIF
ENDPROC
PROC VAULT_OPEN_CUTSCENE()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-4.51, -689.49, 15.1306>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
IF SETUP_REQ_PLAYER_IS_MICHAEL()
AND SETUP_REQ_BANK_INTERIOR_LOADED()
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<-4.51, -689.49, 15.1306>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ELSE
IF SETUP_REQ_BANK_WORKER(<<-2.314122,-662.947083,15.1306>>, 263.770699)
AND SETUP_REQ_VAULT_WORKER(<<-6.0290, -686.3659, 15.1306>>, 161.4787)
AND SETUP_REQ_GOLD_VANS_AT_BANK()
AND SETUP_REQ_MAIN_DRIVER(<<-6.5872, -671.7311, 31.3406>>, 269.1434)
AND SETUP_REQ_MAIN_GUNMAN(<<-7.5872, -671.7311, 31.3406>>, 269.1434)
AND SETUP_REQ_TREVOR(<<-0.848102,-665.244019,15.1306>>, -153.477966)
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-1.900313,-666.880005,15.1306>>, -127.999458)
AND SETUP_REQ_SECURITY_BARRIERS()
AND SETUP_REQ_BANK_SECURITY()
AND SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
SETUP_REQ_BANK_PEDS_READY_FOR_WALK()
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
REMOVE_MICHAEL_SHOTGUN_SILENCER()
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vVaultDoorPos, 5.0, modelVaultDoor)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelVaultDoor, vVaultDoorPos, TRUE, 0.0)
ENDIF
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_CUTSCENE("bs_2a_mcs_4")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_4")
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
REGISTER_ENTITY_FOR_CUTSCENE(sBankWorker.ped, "Bank_Employee", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_ENTITY_MODEL(sBankWorker.ped))
ENDIF
IF NOT IS_PED_INJURED(sVaultWorker.ped)
REGISTER_ENTITY_FOR_CUTSCENE(sVaultWorker.ped, "Vault_Guy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_ENTITY_MODEL(sVaultWorker.ped))
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[CASEY_ID].ped, "Casey", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
objMichaelsWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
REGISTER_ENTITY_FOR_CUTSCENE(objMichaelsWeapon, "Michaels_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
objTrevorsWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
REGISTER_ENTITY_FOR_CUTSCENE(objTrevorsWeapon, "Trevors_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2A_BANK_MID_RESTART")
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_VAULT")
START_AUDIO_SCENE("BS_2A_GET_TO_VAULT")
ENDIF
ENDIF
DO_FADE_IN_WITH_WAIT()
bSkippedMocap = FALSE
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
IF NOT bSkippedMocap
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
bSkippedMocap = TRUE
eSectionStage = SECTION_STAGE_SKIP
ENDIF
ENDIF
SEQUENCE_INDEX seq
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottom)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomLeft)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomRight)
INT iNumNodesInWaypoint
SWITCH iCurrentEvent
CASE 0
IF IS_CUTSCENE_PLAYING()
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
STOP_GAMEPLAY_HINT(TRUE)
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vVaultDoorPos, 8.0, modelVaultDoor)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelVaultDoor, vVaultDoorPos, TRUE, 1.273)
ENDIF
//CREATE_MODEL_HIDE(vVaultDoorPos, 8.0, modelVaultDoor, TRUE)
iCurrentEvent++
ENDIF
BREAK
ENDSWITCH
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor", GET_ENTITY_MODEL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
//SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<0.68, -667.42, 15.1306>>, TRUE, TRUE)
//SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -143.239449)
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottomRight)
WAYPOINT_RECORDING_GET_NUM_POINTS(strWaypointLiftExitBottomRight, iNumNodesInWaypoint)
ENDIF
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottomRight, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iNumNodesInWaypoint - 3)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-0.2089, -663.8649, 15.1556>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING, 14.1)
TASK_TURN_PED_TO_FACE_COORD(NULL, <<-2.0, -658.0, 16.8>>)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
CLEAR_SEQUENCE_TASK(seq)
FORCE_PED_MOTION_STATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Casey", GET_ENTITY_MODEL(sGoldVanPeds[CASEY_ID].ped))
SET_ENTITY_COORDS(sGoldVanPeds[CASEY_ID].ped, <<-5.8014, -688.0304, 15.1306>>, TRUE, TRUE)
SET_ENTITY_HEADING(sGoldVanPeds[CASEY_ID].ped, 316.4831)
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottomLeft)
WAYPOINT_RECORDING_GET_NUM_POINTS(strWaypointLiftExitBottomLeft, iNumNodesInWaypoint)
ENDIF
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottomLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iNumNodesInWaypoint - 4)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-1.8, -664.0665, 15.1556>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING, -23.0)
TASK_TURN_PED_TO_FACE_COORD(NULL, <<1.7, -657.2, 16.5>>)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
FORCE_PED_MOTION_STATE(sGoldVanPeds[CASEY_ID].ped, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Bank_Employee", GET_ENTITY_MODEL(sBankWorker.ped))
SET_ENTITY_COORDS(sBankWorker.ped, <<-4.4338, -687.1326, 15.1306>>, TRUE, TRUE)
SET_ENTITY_HEADING(sBankWorker.ped, 331.3175)
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottom)
WAYPOINT_RECORDING_GET_NUM_POINTS(strWaypointLiftExitBottom, iNumNodesInWaypoint)
ENDIF
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottom, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iNumNodesInWaypoint - 3)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-2.4, -663.0, 15.1307>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING, -119.7)
TASK_TURN_PED_TO_FACE_COORD(NULL, <<7.01, -668.95, 16.5>>)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
CLEAR_SEQUENCE_TASK(seq)
FORCE_PED_MOTION_STATE(sBankWorker.ped, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sVaultWorker.ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Vault_Guy", GET_ENTITY_MODEL(sVaultWorker.ped))
UPDATE_VAULT_WORKER_IDLES(TRUE)
//SET_ENTITY_COORDS(sVaultWorker.ped, <<-0.2, -677.3, 15.1306>>, TRUE, TRUE)
//SET_ENTITY_HEADING(sVaultWorker.ped, 158.5)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael", GET_ENTITY_MODEL(PLAYER_PED_ID()))
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, TRUE)
IF NOT bSkippedMocap
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 2000, -21.9, FALSE)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_weapon")
GIVE_WEAPON_OBJECT_TO_PED(objMichaelsWeapon, PLAYER_PED_ID())
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_weapon")
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
GIVE_WEAPON_OBJECT_TO_PED(objTrevorsWeapon, sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
OR bSkippedMocap
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vVaultDoorPos, 8.0, modelVaultDoor)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelVaultDoor, vVaultDoorPos, TRUE, 1.273)
ENDIF
//REMOVE_MODEL_HIDE(vVaultDoorPos, 8.0, modelVaultDoor, FALSE)
ENDIF
IF NOT IS_CUTSCENE_ACTIVE()
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REPLAY_STOP_EVENT()
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_INSTANT_CLOSE, vLiftBottom1, vLiftBottom2, modelLiftDoor)
fLiftOpenRatio = 0.0
bPlayedLiftSound = FALSE
//If the mocap is skipped then the peds bump into each other, so reposition them to where they would be on a Z-skip.
IF bSkippedMocap
AND IS_SCREEN_FADED_OUT()
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-3.6537, -686.9020, 15.1306>>, TRUE, TRUE)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 331.3624)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<-3.0, -684.2, 15.1306>>, TRUE, TRUE)
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -28.64)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
SET_ENTITY_COORDS(sBankWorker.ped, <<-1.52, -681.30, 15.1306>>, TRUE, TRUE)
SET_ENTITY_HEADING(sBankWorker.ped, -32.08)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
SET_ENTITY_COORDS(sGoldVanPeds[CASEY_ID].ped, <<-1.3, -683.1, 15.1306>>, TRUE, TRUE)
SET_ENTITY_HEADING(sGoldVanPeds[CASEY_ID].ped, -28.64)
ENDIF
ENDIF
//REMOVE_MODEL_HIDE(vVaultDoorPos, 8.0, modelVaultDoor, FALSE)
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_WALK_TO_GOLD
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
STOP_CUTSCENE()
REMOVE_CUTSCENE()
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottom)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomLeft)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomRight)
WHILE NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottom)
OR NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottomLeft)
OR NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottomRight)
WAIT(0)
ENDWHILE
bSkippedMocap = TRUE
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDPROC
PROC WALK_TO_GOLD()
SEQUENCE_INDEX seq
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
//Interior needs to be loaded first, to stop entities falling through the map
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-4.51, -689.49, 15.1306>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
IF SETUP_REQ_PLAYER_IS_MICHAEL()
AND SETUP_REQ_BANK_INTERIOR_LOADED()
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<-4.51, -689.49, 15.1306>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ELSE
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottom)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomLeft)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomRight)
IF SETUP_REQ_BANK_WORKER(<<-1.52, -681.30, 15.1306>>, -32.08)
AND SETUP_REQ_VAULT_WORKER(<<-3.66, -690.01, 15.1306>>, 99.69)
AND SETUP_REQ_GOLD_VANS_AT_BANK()
AND SETUP_REQ_MAIN_DRIVER(<<-6.5872, -671.7311, 31.3406>>, 269.1434)
AND SETUP_REQ_MAIN_GUNMAN(<<-7.5872, -671.7311, 31.3406>>, 269.1434)
AND SETUP_REQ_TREVOR(<<-2.43, -684.33, 15.1306>>, -28.64)
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-2.19, -682.82, 15.1306>>, 0.0)
AND SETUP_REQ_SECURITY_BARRIERS()
AND SETUP_REQ_BANK_SECURITY()
AND SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottom)
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottomLeft)
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottomRight)
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
SETUP_REQ_BANK_PEDS_READY_FOR_WALK()
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
REMOVE_MICHAEL_SHOTGUN_SILENCER()
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-4.8836, -688.7708, 15.1308>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 336.3668)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
INT iNumNodesInWaypoint
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
WAYPOINT_RECORDING_GET_NUM_POINTS(strWaypointLiftExitBottomRight, iNumNodesInWaypoint)
OPEN_SEQUENCE_TASK(seq)
TASK_PAUSE(NULL, 1000)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottomRight, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iNumNodesInWaypoint - 3)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-0.2089, -663.8649, 15.1556>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING, 14.1)
TASK_TURN_PED_TO_FACE_COORD(NULL, <<-2.0, -658.0, 16.8>>)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
WAYPOINT_RECORDING_GET_NUM_POINTS(strWaypointLiftExitBottomLeft, iNumNodesInWaypoint)
OPEN_SEQUENCE_TASK(seq)
TASK_PAUSE(NULL, 1300)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottomLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iNumNodesInWaypoint - 4)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-1.8, -664.0665, 15.1556>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING, -23.0)
TASK_TURN_PED_TO_FACE_COORD(NULL, <<1.7, -657.2, 16.5>>)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
WAYPOINT_RECORDING_GET_NUM_POINTS(strWaypointLiftExitBottom, iNumNodesInWaypoint)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottom, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iNumNodesInWaypoint - 3)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-2.4, -663.0, 15.1307>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING, -119.7)
TASK_TURN_PED_TO_FACE_COORD(NULL, <<7.01, -668.95, 16.5>>)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vVaultDoorPos, 5.0, modelVaultDoor)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelVaultDoor, vVaultDoorPos, TRUE, 1.6)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2A_BANK_MID_RESTART")
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_VAULT")
START_AUDIO_SCENE("BS_2A_GET_TO_VAULT")
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sVaultWorker.ped)
TASK_LOOK_AT_ENTITY(sVaultWorker.ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
ENDIF
DO_FADE_IN_WITH_WAIT()
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
iCurrentEvent = 0
iGameplayHintEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
UPDATE_VAULT_WORKER_IDLES()
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
IF NOT IS_PED_INJURED(sBankWorker.ped)
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
RUBBER_BAND_WALKING_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.93)
RUBBER_BAND_WALKING_PED(sBankWorker.ped, 1.0)
RUBBER_BAND_WALKING_PED(sGoldVanPeds[CASEY_ID].ped, 1.0)
SWITCH iCurrentEvent
CASE 0 //Back up in the elevator
IF NOT DOES_BLIP_EXIST(sBankWorker.blip)
sBankWorker.blip = CREATE_BLIP_FOR_ENTITY(sBankWorker.ped)
SET_BLIP_NAME_FROM_TEXT_FILE(sBankWorker.blip, "F3A_WORKNAME")
ENDIF
REQUEST_CUTSCENE("bs_2a_mcs_5")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_5")
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-0.777570,-668.833984,15.130619>>, <<7.135055,-658.786804,17.971445>>, 2.250000)
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
BREAK
ENDSWITCH
SWITCH iGameplayHintEvent
CASE 0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1.552530,-673.366821,14.130619>>, <<3.509254,-674.941711,17.630619>>, 2.000000)
SET_GAMEPLAY_COORD_HINT(<<-0.6273, -660.5535, 16.3168>>, -1, 2500)
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(0.75)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(0.015)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(0.2)
SET_GAMEPLAY_HINT_FOV(40.0)
SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<0.8, -669.3, 15.2893>>, PEDMOVE_WALK, -1, 0.25, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-0.2, -664.7, 15.2893>>, PEDMOVE_WALK, -1, 0.25, ENAV_NO_STOPPING)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), seq)
CLEAR_SEQUENCE_TASK(seq)
//TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), <<2.0, -666.2, 15.2893>>, PEDMOVE_WALK, -1, 0.25, ENAV_NO_STOPPING)
//TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(), <<2.0, -666.2, 15.2893>>, PEDMOVE_WALK)
iGameplayHintEvent++
ENDIF
BREAK
ENDSWITCH
IF NOT bHasTextLabelTriggered[FH3A_WALK] //Michael says a line after walking into vault.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<0.803486,-681.658264,15.130619>>, <<-3.866011,-679.937256,17.630619>>, 7.750000)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_WALK", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_WALK] = TRUE
ENDIF
ENDIF
ENDIF
//Play a line if the player lags behind
IF NOT bHasTextLabelTriggered[FH3A_LAG3]
IF NOT IS_MESSAGE_BEING_DISPLAYED() OR NOT IS_SUBTITLE_PREFERENCE_SWITCHED_ON()
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])) > 64.0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LAG", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_LAG3] = TRUE
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
IF IS_PLAYER_ACTING_SUSPICIOUS_IN_BANK()
MISSION_FAILED(FAILED_SPOOKED_BANK_WORKERS)
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REPLAY_RECORD_BACK_FOR_TIME(4.0, 2.0, REPLAY_IMPORTANCE_HIGHEST)
CLEAR_PRINTS()
REMOVE_ALL_BLIPS()
eMissionStage = STAGE_COLLECT_GOLD_CUTSCENE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_COLLECT_GOLD_CUTSCENE)
ENDIF
ENDPROC
PROC COLLECT_GOLD_CUTSCENE()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-3.0475, -665.4576, 15.1306>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
IF SETUP_REQ_PLAYER_IS_MICHAEL()
AND SETUP_REQ_BANK_INTERIOR_LOADED()
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<-3.0475, -665.4576, 15.1306>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ELSE
IF SETUP_REQ_BANK_WORKER(<<-2.314122,-662.947083,15.1306>>, 263.770699)
AND SETUP_REQ_VAULT_WORKER(<<-6.0290, -686.3659, 15.1306>>, 161.4787)
AND SETUP_REQ_GOLD_VANS_AT_BANK()
AND SETUP_REQ_MAIN_DRIVER(<<-6.5872, -671.7311, 31.3406>>, 269.1434)
AND SETUP_REQ_MAIN_GUNMAN(<<-7.5872, -671.7311, 31.3406>>, 269.1434)
AND SETUP_REQ_TREVOR(<<-0.848102,-665.244019,15.1306>>, -153.477966)
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-1.900313,-666.880005,15.1306>>, -127.999458)
AND SETUP_REQ_SECURITY_BARRIERS()
AND SETUP_REQ_BANK_SECURITY()
AND SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
SETUP_REQ_BANK_PEDS_READY_FOR_WALK()
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
REMOVE_MICHAEL_SHOTGUN_SILENCER()
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_CUTSCENE("bs_2a_mcs_5")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_5")
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
REGISTER_ENTITY_FOR_CUTSCENE(sBankWorker.ped, "Bank_Employee", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_ENTITY_MODEL(sBankWorker.ped))
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[CASEY_ID].ped, "Casey", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(objGoldTrolleys[0], "GoldCargo", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
REGISTER_ENTITY_FOR_CUTSCENE(objGoldTrolleys[1], "GoldCargo^1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
objMichaelsWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
REGISTER_ENTITY_FOR_CUTSCENE(objMichaelsWeapon, "Michaels_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2A_BANK_MID_RESTART")
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_VAULT")
START_AUDIO_SCENE("BS_2A_GET_TO_VAULT")
ENDIF
ENDIF
DO_FADE_IN_WITH_WAIT()
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
IF NOT bSkippedMocap
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
bSkippedMocap = TRUE
eSectionStage = SECTION_STAGE_SKIP
ENDIF
ENDIF
//Request assets for next section in advance.
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottom)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottomLeft)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottomRight)
REQUEST_ANIM_DICT(strAnimIG5)
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
SEQUENCE_INDEX seq
IF IS_CUTSCENE_PLAYING()
SWITCH iCurrentEvent
CASE 0
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
STOP_GAMEPLAY_HINT(TRUE)
iCurrentEvent++
BREAK
CASE 1
IF GET_CUTSCENE_TIME() > 5000
SET_TROLLEY_SOUNDS_ACTIVE(TRUE)
iCurrentEvent++
ENDIF
BREAK
ENDSWITCH
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor", GET_ENTITY_MODEL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("GoldCargo^1")
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<2.7, -667.4, 15.1306>>, TRUE, TRUE)
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 169.8)
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[1], sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_UNARMED, TRUE)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterBottomRight, 0, EWAYPOINT_START_FROM_CLOSEST_POINT)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
CLEAR_SEQUENCE_TASK(seq)
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], objGoldTrolleys[1], TRUE, FALSE, TRUE)
FORCE_PED_MOTION_STATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Casey", GET_ENTITY_MODEL(sGoldVanPeds[CASEY_ID].ped))
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("GoldCargo")
SET_ENTITY_COORDS(sGoldVanPeds[CASEY_ID].ped, <<2.0, -671.6, 15.1306>>, TRUE, TRUE)
SET_ENTITY_HEADING(sGoldVanPeds[CASEY_ID].ped, 158.5)
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[0], sGoldVanPeds[CASEY_ID].ped, -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterBottomLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sGoldVanPeds[CASEY_ID].ped, objGoldTrolleys[0], TRUE, FALSE, TRUE)
FORCE_PED_MOTION_STATE(sGoldVanPeds[CASEY_ID].ped, MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Bank_Employee", GET_ENTITY_MODEL(sBankWorker.ped))
SET_ENTITY_COORDS(sBankWorker.ped, <<-0.2, -677.3, 15.1306>>, TRUE, TRUE)
SET_ENTITY_HEADING(sBankWorker.ped, 158.5)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterBottom, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, 24)
//TASK_GO_STRAIGHT_TO_COORD(NULL, <<2.9645, -702.7947, 15.1308>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 33.1252) //Outside lift.
TASK_GO_STRAIGHT_TO_COORD(NULL, <<1.9, -705.2, 15.1308>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP) //Cutscene pos.
TASK_TURN_PED_TO_FACE_COORD(NULL, <<1.1275, -703.0607, 16.7345>>)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
CLEAR_SEQUENCE_TASK(seq)
FORCE_PED_MOTION_STATE(sBankWorker.ped, MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
IF NOT bSkippedMocap
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_weapon")
GIVE_WEAPON_OBJECT_TO_PED(objMichaelsWeapon, PLAYER_PED_ID())
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objMichaelsWeapon)
ENDIF
IF NOT IS_CUTSCENE_ACTIVE()
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
DISABLE_COMBAT_CONTROLS_THIS_FRAME() //In case player control turned back on for the exit state.
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
iCurrentEvent = 0
REMOVE_OBJECT(objMichaelsWeapon, TRUE)
REMOVE_WAYPOINT_RECORDING(strWaypointLiftExitBottom)
REMOVE_WAYPOINT_RECORDING(strWaypointLiftExitBottomLeft)
REMOVE_WAYPOINT_RECORDING(strWaypointLiftExitBottomRight)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
REPLAY_STOP_EVENT()
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_WALK_TO_LIFT_2
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
STOP_CUTSCENE()
REMOVE_CUTSCENE()
REPLAY_CANCEL_EVENT()
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottom)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottomLeft)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottomRight)
REQUEST_ANIM_DICT(strAnimIG5)
WHILE NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterBottom)
OR NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterBottomLeft)
OR NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterBottomRight)
OR NOT HAS_ANIM_DICT_LOADED(strAnimIG5)
WAIT(0)
ENDWHILE
bSkippedMocap = TRUE
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDPROC
PROC WALK_TO_LIFT_2()
SEQUENCE_INDEX seq
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
//Interior needs to be loaded first, to stop entities falling through the map
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-3.0475, -665.4576, 15.1306>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
IF SETUP_REQ_PLAYER_IS_MICHAEL()
AND SETUP_REQ_BANK_INTERIOR_LOADED()
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<-3.0475, -665.4576, 15.1306>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ELSE
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottom)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottomLeft)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottomRight)
REQUEST_ANIM_DICT(strAnimIG5)
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
IF SETUP_REQ_BANK_WORKER(<<-0.2, -677.3, 15.1306>>, 158.5)
AND SETUP_REQ_VAULT_WORKER(<<-6.0290, -686.3659, 15.1306>>, 161.4787)
AND SETUP_REQ_GOLD_VANS_AT_BANK()
AND SETUP_REQ_MAIN_DRIVER(<<-6.5872, -671.7311, 31.3406>>, 269.1434)
AND SETUP_REQ_MAIN_GUNMAN(<<-7.5872, -671.7311, 31.3406>>, 269.1434)
AND SETUP_REQ_TREVOR(<<2.7, -667.4, 15.1306>>, 169.8)
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<2.0, -671.6, 15.1306>>, 158.5)
AND SETUP_REQ_SECURITY_BARRIERS()
AND SETUP_REQ_BANK_SECURITY()
AND SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterBottom)
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterBottomLeft)
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterBottomRight)
AND HAS_ANIM_DICT_LOADED(strAnimIG5)
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
SETUP_REQ_BANK_PEDS_READY_FOR_WALK()
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
REMOVE_MICHAEL_SHOTGUN_SILENCER()
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-1.80, -664.26, 15.1306>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), -152.406774)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[1], sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_UNARMED, TRUE)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterBottomRight, 0, EWAYPOINT_START_FROM_CLOSEST_POINT)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
CLEAR_SEQUENCE_TASK(seq)
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], objGoldTrolleys[1], TRUE, FALSE, TRUE)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[0], sGoldVanPeds[CASEY_ID].ped, -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterBottomLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sGoldVanPeds[CASEY_ID].ped, objGoldTrolleys[0], TRUE, FALSE, TRUE)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterBottom, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, 24)
//TASK_GO_STRAIGHT_TO_COORD(NULL, <<2.9645, -702.7947, 15.1308>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 33.1252) //Outside lift.
TASK_GO_STRAIGHT_TO_COORD(NULL, <<1.9, -705.2, 15.1308>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP) //Cutscene pos.
TASK_TURN_PED_TO_FACE_COORD(NULL, <<1.1275, -703.0607, 16.7345>>)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottom)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottomLeft)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottomRight)
REQUEST_ANIM_DICT(strAnimIG5)
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterBottom)
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterBottomLeft)
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterBottomRight)
AND HAS_ANIM_DICT_LOADED(strAnimIG5)
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2A_BANK_MID_RESTART")
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_VAULT")
START_AUDIO_SCENE("BS_2A_GET_TO_VAULT")
ENDIF
ENDIF
SETTIMERB(0)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_PED_CAPSULE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.5)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
SET_PED_CAPSULE(sGoldVanPeds[CASEY_ID].ped, 0.5)
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(2.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
SET_TROLLEY_SOUNDS_ACTIVE(TRUE)
DO_FADE_IN_WITH_WAIT()
sMichael.iEvent = 0
sVaultWorker.iEvent = 0
sBankWorker.iEvent = 0
bWorkerLeftVault = FALSE
bHostageLeftVault = FALSE
bPlayerLeftVault = FALSE
bTrevorLeftVault = FALSE
fLiftOpenRatio = 0.0
iGameplayHintEvent = 0
bPlayedLiftSound = FALSE
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_UNLOCK, vLiftBottom1, vLiftBottom2, modelLiftDoor)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_BANK_DOOR")
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
IF NOT IS_PED_INJURED(sBankWorker.ped)
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
RUBBER_BAND_WALKING_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.93, 5.0, 15.0)
RUBBER_BAND_WALKING_PED(sBankWorker.ped, 1.08, 5.0, 15.0)
RUBBER_BAND_WALKING_PED(sGoldVanPeds[CASEY_ID].ped, 1.10, 5.0, 15.0)
SET_PED_MOVE_RATE_OVERRIDE(PLAYER_PED_ID(), 0.97)
REQUEST_SCRIPT_AUDIO_BANK("Freight_Elevator")
IF TIMERB() < 1000
UPDATE_TROLLEY_WALK_ANIMS(FALSE, FALSE, TRUE)
ELSE
UPDATE_TROLLEY_WALK_ANIMS()
ENDIF
SWITCH iCurrentEvent
CASE 0 //Back up in the elevator
REQUEST_CUTSCENE("bs_2a_mcs_6")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_6")
IF NOT DOES_BLIP_EXIST(sBankWorker.blip)
sBankWorker.blip = CREATE_BLIP_FOR_ENTITY(sBankWorker.ped)
SET_BLIP_NAME_FROM_TEXT_FILE(sBankWorker.blip, "F3A_WORKNAME")
ENDIF
//Bank worker stands outside lift first (to allow room for trolleys).
/*IF VDIST2(GET_ENTITY_COORDS(sBankWorker.ped), <<2.9645, -702.7947, 15.1308>>) > 4.0
AND GET_SCRIPT_TASK_STATUS(sBankWorker.ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterBottom, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, 24)
TASK_GO_STRAIGHT_TO_COORD(NULL, <<2.9645, -702.7947, 15.1308>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 33.1252) //Oustside lift.
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF*/
IF VDIST2(GET_ENTITY_COORDS(sBankWorker.ped), vLiftBottom1) < 49.0
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_OPEN, vLiftBottom1, vLiftBottom2, modelLiftDoor)
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-0.944279,-708.157898,14.880627>>, <<1.774363,-700.803101,18.131031>>, 4.000000)
IF (GET_SCRIPT_TASK_STATUS(sBankWorker.ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND GET_ENTITY_SPEED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) < 1.0)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-0.758487,-708.129211,15.130634>>, <<0.732468,-703.698669,17.881027>>, 3.500000)
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDIF
BREAK
ENDSWITCH
SWITCH iGameplayHintEvent
CASE 0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-0.430255,-696.756348,14.175640>>, <<-5.093378,-700.722168,17.631031>>, 4.000000)
SET_GAMEPLAY_COORD_HINT(<<1.9453, -705.3939, 16.6141>>, -1, 2000)
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(0.8)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(0.015)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(0.2)
SET_GAMEPLAY_HINT_FOV(40.0)
SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), <<1.0, -702.4409, 15.2546>>, PEDMOVE_WALK, -1, 0.25, ENAV_NO_STOPPING)
//TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(), <<1.0, -702.4409, 15.2546>>, PEDMOVE_WALK)
iGameplayHintEvent++
ENDIF
BREAK
ENDSWITCH
ENDIF
//Chat between Trevor and the liason.
IF NOT bHasTextLabelTriggered[FH3A_PSHTROL]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_PSHTROL", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_PSHTROL] = TRUE
ENDIF
ENDIF
ELSE
//Kill the conversation before the player approaches the lift, to avoid having to cut a line off mid-way for the cutscene.
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<0.006684,-695.472107,15.133235>>, <<-6.646950,-700.182800,17.631029>>, 1.000000)
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
//Play a line if the player lags behind
IF NOT bHasTextLabelTriggered[FH3A_LAG4]
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])) > 64.0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LAG", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_LAG4] = TRUE
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
//Close the vault door once everyone has left the vault
IF NOT IS_PED_INJURED(sBankWorker.ped)
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
IF NOT bWorkerLeftVault
bWorkerLeftVault = IS_ENTITY_IN_ANGLED_AREA(sBankWorker.ped, <<-9.435379,-688.462769,15.130812>>, <<0.869906,-692.525757,17.631247>>, 1.500000)
ENDIF
IF NOT bTrevorLeftVault
bTrevorLeftVault = IS_ENTITY_IN_ANGLED_AREA(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<-9.435379,-688.462769,15.130812>>, <<0.869906,-692.525757,17.631247>>, 1.500000)
ENDIF
IF NOT bHostageLeftVault
bHostageLeftVault = IS_ENTITY_IN_ANGLED_AREA(sGoldVanPeds[CASEY_ID].ped, <<-9.435379,-688.462769,15.130812>>, <<0.869906,-692.525757,17.631247>>, 1.500000)
ENDIF
ENDIF
IF NOT bPlayerLeftVault
//bPlayerLeftVault = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-0.415301,-696.714905,15.275375>>, <<-15.518509,-696.049011,17.630766>>, 1.250000)
bPlayerLeftVault = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-4.294104,-690.640320,15.130766>>, <<-5.094479,-692.881531,17.630766>>, 12.250000)
ENDIF
//Update the vault worker's behaviour: plays an anim to close the door, then returns to idle.
IF NOT IS_PED_INJURED(sVaultWorker.ped)
VECTOR vInitialWaitPos, vInitialWaitRot, vInitialDoorPos, vInitialDoorRot
VECTOR vSyncScenePos = <<-5.017, -685.369, 15.909>>
VECTOR vSyncSceneRot = <<0.000, 0.000, -20.000>>
SWITCH sVaultWorker.iEvent
CASE 0 //Play an idle loop.
REQUEST_ANIM_DICT(strAnimIG6)
REQUEST_MODEL(modelFakeVaultDoor)
REQUEST_MODEL(modelWalkieTalkie)
REQUEST_SCRIPT_AUDIO_BANK("Vault_Door")
IF HAS_ANIM_DICT_LOADED(strAnimIG6)
AND HAS_MODEL_LOADED(modelFakeVaultDoor)
vInitialWaitPos = GET_ANIM_INITIAL_OFFSET_POSITION(strAnimIG6, "close_vaultdoor", vSyncScenePos, vSyncSceneRot, 0.0)
vInitialWaitRot = GET_ANIM_INITIAL_OFFSET_ROTATION(strAnimIG6, "close_vaultdoor", vSyncScenePos, vSyncSceneRot, 0.0)
vInitialDoorPos = GET_ANIM_INITIAL_OFFSET_POSITION(strAnimIG6, "Close_VaultDoor_Door", vSyncScenePos, vSyncSceneRot, 0.0)
vInitialDoorRot = GET_ANIM_INITIAL_OFFSET_ROTATION(strAnimIG6, "Close_VaultDoor_Door", vSyncScenePos, vSyncSceneRot, 0.0)
//Hide the map version of the door and create one that can be animated.
CREATE_MODEL_HIDE(vSyncScenePos, 3.0, modelVaultDoor, FALSE)
objFakeVaultDoor = CREATE_OBJECT_NO_OFFSET(modelFakeVaultDoor, vInitialDoorPos)
SET_ENTITY_ROTATION(objFakeVaultDoor, vInitialDoorRot)
FREEZE_ENTITY_POSITION(objFakeVaultDoor, TRUE)
FORCE_ROOM_FOR_ENTITY(objFakeVaultDoor, interiorBank, HASH("GtaMloRoom009"))
SET_MODEL_AS_NO_LONGER_NEEDED(modelFakeVaultDoor)
SET_ENTITY_COORDS(sVaultWorker.ped, vInitialWaitPos)
SET_ENTITY_HEADING(sVaultWorker.ped, vInitialWaitRot.z)
//Create a walkie-talkie for the worker to hold.
objWalkieTalkie = CREATE_OBJECT_NO_OFFSET(modelWalkieTalkie, vInitialDoorPos)
ATTACH_ENTITY_TO_ENTITY(objWalkieTalkie, sVaultWorker.ped, GET_PED_BONE_INDEX(sVaultWorker.ped, BONETAG_PH_L_HAND), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
SET_MODEL_AS_NO_LONGER_NEEDED(modelWalkieTalkie)
TASK_PLAY_ANIM(sVaultWorker.ped, strAnimIG6, "Wait_Loop", NORMAL_BLEND_IN, WALK_BLEND_OUT, -1, AF_LOOPING | AF_USE_KINEMATIC_PHYSICS)
TASK_LOOK_AT_ENTITY(sVaultWorker.ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
sVaultWorker.iEvent++
ENDIF
BREAK
CASE 1 //Play the close door anim.
//When the player goes near the worker give him a lookat task.
IF bWorkerLeftVault
AND bHostageLeftVault
AND bPlayerLeftVault
AND bTrevorLeftVault
iVaultWorkerSyncScene = CREATE_SYNCHRONIZED_SCENE(vSyncScenePos, vSyncSceneRot)
TASK_CLEAR_LOOK_AT(sVaultWorker.ped)
TASK_SYNCHRONIZED_SCENE(sVaultWorker.ped, iVaultWorkerSyncScene, strAnimIG6, "close_vaultdoor", WALK_BLEND_IN, WALK_BLEND_OUT,
SYNCED_SCENE_USE_PHYSICS, RBF_NONE)
FREEZE_ENTITY_POSITION(objFakeVaultDoor, FALSE)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objFakeVaultDoor, iVaultWorkerSyncScene, "Close_VaultDoor_Door", strAnimIG6,
NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
sVaultWorker.iEvent++
ENDIF
BREAK
CASE 2 //Return to idle loop.
IF IS_SYNCHRONIZED_SCENE_RUNNING(iVaultWorkerSyncScene)
FLOAT fScenePhase
fScenePhase = GET_SYNCHRONIZED_SCENE_PHASE(iVaultWorkerSyncScene)
//Play a sound for the door
IF fScenePhase > 0.196
IF fScenePhase < 0.405
IF HAS_SOUND_FINISHED(iVaultDoorCloseSoundID)
AND REQUEST_SCRIPT_AUDIO_BANK("Vault_Door")
PLAY_SOUND_FROM_COORD(iVaultDoorCloseSoundID, "VAULT_DOOR_CLOSE", <<-3.4801, -686.1755, 16.1308>>)
ENDIF
ELSE
IF NOT HAS_SOUND_FINISHED(iVaultDoorCloseSoundID)
STOP_SOUND(iVaultDoorCloseSoundID)
ENDIF
ENDIF
ENDIF
IF fScenePhase > 0.99
STOP_SYNCHRONIZED_ENTITY_ANIM(sVaultWorker.ped, NORMAL_BLEND_OUT, TRUE)
TASK_PLAY_ANIM(sVaultWorker.ped, strAnimIG6, "Wait_Loop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
TASK_LOOK_AT_ENTITY(sVaultWorker.ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
sVaultWorker.iEvent++
ENDIF
//Fail if the player tries to walk back in.
IF fScenePhase > 0.2 AND fScenePhase < 0.9
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<1.651060,-674.266541,15.130766>>, <<-4.217375,-689.260010,17.630766>>, 6.500000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<5.924709,-660.075928,15.130619>>, <<-3.049540,-684.865051,18.630619>>, 16.750000)
STOP_SYNCHRONIZED_ENTITY_ANIM(sVaultWorker.ped, NORMAL_BLEND_OUT, TRUE)
IF DOES_ENTITY_EXIST(objFakeVaultDoor)
STOP_SYNCHRONIZED_ENTITY_ANIM(objFakeVaultDoor, NORMAL_BLEND_OUT, TRUE)
ENDIF
IF NOT HAS_SOUND_FINISHED(iVaultDoorCloseSoundID)
STOP_SOUND(iVaultDoorCloseSoundID)
ENDIF
TASK_SMART_FLEE_PED(sVaultWorker.ped, PLAYER_PED_ID(), 50.0, -1)
IF DOES_ENTITY_EXIST(objWalkieTalkie)
AND IS_ENTITY_ATTACHED_TO_ENTITY(objWalkieTalkie, sVaultWorker.ped)
DETACH_ENTITY(objWalkieTalkie, TRUE, FALSE)
ENDIF
MISSION_FAILED(FAILED_SPOOKED_BANK_WORKERS)
ENDIF
ENDIF
//Sync dialogue.
IF NOT bHasTextLabelTriggered[FH3A_SEEN_1]
IF sConversationPeds.PedInfo[6].Index != sVaultWorker.ped
ADD_PED_FOR_DIALOGUE(sConversationPeds, 6, sVaultWorker.ped, "FH3VAULT")
ENDIF
IF fScenePhase > 0.108
IF fScenePhase < 0.15
//PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(sVaultWorker.ped, "FH3A_CDAA", "FH3VAULT", SPEECH_PARAMS_FORCE_NORMAL)
//bHasTextLabelTriggered[FH3A_SEEN_1] = TRUE
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SEEN", "FH3A_SEEN_1", CONV_PRIORITY_AMBIENT_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
bHasTextLabelTriggered[FH3A_SEEN_1] = TRUE
ENDIF
ELSE
bHasTextLabelTriggered[FH3A_SEEN_1] = TRUE
ENDIF
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_SEEN_2]
IF fScenePhase > 0.755
IF fScenePhase < 0.81
//PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(sVaultWorker.ped, "FH3A_CDAB", "FH3VAULT", SPEECH_PARAMS_FORCE_NORMAL)
//bHasTextLabelTriggered[FH3A_SEEN_2] = TRUE
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SEEN", "FH3A_SEEN_2", CONV_PRIORITY_AMBIENT_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
bHasTextLabelTriggered[FH3A_SEEN_2] = TRUE
ENDIF
ELSE
bHasTextLabelTriggered[FH3A_SEEN_2] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
//Get the manager to look at the player.
IF sBankWorker.iEvent = 0
IF IS_ENTITY_IN_ANGLED_AREA(sBankWorker.ped, <<-0.758487,-708.129211,15.130634>>, <<0.732468,-703.698669,17.881027>>, 3.500000)
AND GET_SCRIPT_TASK_STATUS(sBankWorker.ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
TASK_LOOK_AT_ENTITY(sBankWorker.ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
sBankWorker.iEvent++
ENDIF
ENDIF
//TODO 655058: Have the player look at the vault worker when nearby
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sVaultWorker.ped)) < 36.0
IF sMichael.iEvent = 0
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sVaultWorker.ped, -1)
sMichael.iEvent = 1
ENDIF
ELSE
IF sMichael.iEvent = 1
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
sMichael.iEvent = 0
ENDIF
ENDIF
ENDIF
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
IF IS_PLAYER_ACTING_SUSPICIOUS_IN_BANK()
MISSION_FAILED(FAILED_SPOOKED_BANK_WORKERS)
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REPLAY_RECORD_BACK_FOR_TIME(4.0, 2.0, REPLAY_IMPORTANCE_HIGHEST)
CLEAR_PRINTS()
REMOVE_ALL_BLIPS()
REMOVE_WAYPOINT_RECORDING(strWaypointLiftEnterBottom)
REMOVE_WAYPOINT_RECORDING(strWaypointLiftEnterTopLeft)
REMOVE_WAYPOINT_RECORDING(strWaypointLiftEnterTopRight)
REMOVE_OBJECT(objWalkieTalkie, TRUE)
REMOVE_PED(sVaultWorker.ped, TRUE)
REMOVE_OBJECT(objFakeVaultDoor, TRUE)
IF NOT HAS_SOUND_FINISHED(iVaultDoorCloseSoundID)
STOP_SOUND(iVaultDoorCloseSoundID)
ENDIF
REMOVE_ANIM_DICT(strAnimIG6)
REMOVE_ANIM_DICT(strVaultWorkerAnims)
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Vault_Door")
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_BANK_DOOR")
eMissionStage = STAGE_LIFT_CUTSCENE_2
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_LIFT_CUTSCENE_2)
ENDIF
ENDPROC
PROC LIFT_CUTSCENE_2()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<10.5, -671.6, 32.44>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
IF SETUP_REQ_PLAYER_IS_MICHAEL()
AND SETUP_REQ_BANK_INTERIOR_LOADED()
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<10.5, -671.6, 32.44>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ELSE
IF SETUP_REQ_BANK_WORKER(<<-2.314122,-662.947083,15.1306>>, 263.770699)
AND SETUP_REQ_VAULT_WORKER(<<-6.0290, -686.3659, 15.1306>>, 161.4787)
AND SETUP_REQ_GOLD_VANS_AT_BANK()
AND SETUP_REQ_MAIN_DRIVER(<<-6.5872, -671.7311, 31.3406>>, 269.1434)
AND SETUP_REQ_MAIN_GUNMAN(<<-7.5872, -671.7311, 31.3406>>, 269.1434)
AND SETUP_REQ_TREVOR(<<-0.848102,-665.244019,15.1306>>, -153.477966)
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-1.900313,-666.880005,15.1306>>, -127.999458)
AND SETUP_REQ_SECURITY_BARRIERS()
AND SETUP_REQ_BANK_SECURITY()
AND SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
SETUP_REQ_BANK_PEDS_READY_FOR_WALK()
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
REMOVE_MICHAEL_SHOTGUN_SILENCER()
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
//Bottom door
//2.10, -704.07, 15.13
//Top door
//11.66, -668.47, 32.45
//Difference
//9.56, 35.6, 17.32
//Bottom cutscene node MCS_6
//14.810, -688.770, 44.960
//Potential top node
//24.37, -653.17, 62.28
//Fudged position
//16.770, -649.170, 62.280
REQUEST_CUTSCENE("bs_2a_mcs_6")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_6")
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
TASK_CLEAR_LOOK_AT(sBankWorker.ped) //May have carried over from previous section.
REGISTER_ENTITY_FOR_CUTSCENE(sBankWorker.ped, "Bank_Employee", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_ENTITY_MODEL(sBankWorker.ped))
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[CASEY_ID].ped, "Casey", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
DETACH_ENTITY(objGoldTrolleys[0])
DETACH_ENTITY(objGoldTrolleys[1])
REGISTER_ENTITY_FOR_CUTSCENE(objGoldTrolleys[0], "Prop_Large_gold", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_ENTITY_MODEL(objGoldTrolleys[0]))
REGISTER_ENTITY_FOR_CUTSCENE(objGoldTrolleys[1], "Prop_Large_gold^1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_ENTITY_MODEL(objGoldTrolleys[1]))
SET_TROLLEY_SOUNDS_ACTIVE(FALSE)
//SET_CUTSCENE_TRIGGER_AREA(<<0.0, 0.0, 0.0>>, 0.0, 24.82, 0.0)
//START_CUTSCENE_AT_COORDS(<<16.770, -649.170, 62.280>>)
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2A_BANK_MID_RESTART")
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_VAULT")
START_AUDIO_SCENE("BS_2A_GET_TO_VAULT")
ENDIF
ENDIF
TRIGGER_MUSIC_EVENT("FH2A_GOLD")
DO_FADE_IN_WITH_WAIT()
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
IF NOT bSkippedMocap
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
bSkippedMocap = TRUE
eSectionStage = SECTION_STAGE_SKIP
ENDIF
ENDIF
//Request assets for next section in advance.
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitTop)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitTopLeft)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitTopRight)
REQUEST_ANIM_DICT(strAnimIG5)
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
SEQUENCE_INDEX seq
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor", GET_ENTITY_MODEL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Prop_Large_gold^1", GET_ENTITY_MODEL(objGoldTrolleys[1]))
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<11.0, -668.3, 32.44>>, TRUE, TRUE)
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 8.664)
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[1], sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_UNARMED, TRUE)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitTopRight, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
CLEAR_SEQUENCE_TASK(seq)
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], objGoldTrolleys[1], TRUE, FALSE, TRUE)
FORCE_PED_MOTION_STATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Casey", GET_ENTITY_MODEL(sGoldVanPeds[CASEY_ID].ped))
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Prop_Large_gold", GET_ENTITY_MODEL(objGoldTrolleys[0]))
SET_ENTITY_COORDS(sGoldVanPeds[CASEY_ID].ped, <<10.3, -664.3, 32.44>>, TRUE, TRUE)
SET_ENTITY_HEADING(sGoldVanPeds[CASEY_ID].ped, 11.8)
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[0], sGoldVanPeds[CASEY_ID].ped, -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitTopLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sGoldVanPeds[CASEY_ID].ped, objGoldTrolleys[0], TRUE, FALSE, TRUE)
FORCE_PED_MOTION_STATE(sGoldVanPeds[CASEY_ID].ped, MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Bank_Employee")
SET_ENTITY_COORDS(sBankWorker.ped, <<7.9, -661.3, 32.44>>)
SET_ENTITY_HEADING(sBankWorker.ped, 42.3)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitTop, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS, 17)
TASK_GO_STRAIGHT_TO_COORD(NULL, vBankWorkerExit, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 49.5274)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
CLEAR_SEQUENCE_TASK(seq)
FORCE_PED_MOTION_STATE(sBankWorker.ped, MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael", GET_ENTITY_MODEL(PLAYER_PED_ID()))
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<10.5094, -672.1926, 32.4495>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 3.5059)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, TRUE)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE, TRUE, FAUS_CUTSCENE_EXIT)
IF NOT bSkippedMocap
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ENDIF
IF NOT IS_CUTSCENE_ACTIVE()
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_CUTSCENE_TIME())
#ENDIF
SWITCH iCurrentEvent
CASE 0
IF IS_CUTSCENE_PLAYING()
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
STOP_GAMEPLAY_HINT(TRUE)
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_INSTANT_OPEN, vLiftTop1, vLiftTop2, modelLiftDoor)
fLiftOpenRatio = 1.0
bPlayedLiftSound = FALSE
iCurrentEvent++
ENDIF
BREAK
CASE 1
IF GET_CUTSCENE_TIME() > 2500
IF PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_CLOSE, vLiftBottom1, vLiftBottom2, modelLiftDoor)
iCurrentEvent++
ENDIF
ENDIF
BREAK
CASE 2
IF GET_CUTSCENE_TIME() > 5000
SET_TROLLEY_SOUNDS_ACTIVE(TRUE)
fLiftOpenRatio = 0.0
bPlayedLiftSound = FALSE
iCurrentEvent++
ENDIF
BREAK
CASE 3
IF GET_CUTSCENE_TIME() > 20500
IF PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_OPEN, vLiftBottom1, vLiftBottom2, modelLiftDoor)
iCurrentEvent++
ENDIF
ENDIF
BREAK
ENDSWITCH
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
//NEW_LOAD_SCENE_START(<<10.5403, -673.2892, 34.0379>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-1.2445, 0.0019, 3.4569>>), 20.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
NEW_LOAD_SCENE_START_SPHERE(<<9.6, -666.4, 33.3>>, 15.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
ENDIF
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REPLAY_STOP_EVENT()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_WALK_TO_VANS
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
REPLAY_CANCEL_EVENT()
STOP_CUTSCENE()
REMOVE_CUTSCENE()
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitTop)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitTopLeft)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitTopRight)
REQUEST_ANIM_DICT(strAnimIG5)
WHILE NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitTop)
OR NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitTopLeft)
OR NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitTopRight)
OR NOT HAS_ANIM_DICT_LOADED(strAnimIG5)
WAIT(0)
ENDWHILE
bSkippedMocap = TRUE
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDPROC
PROC WALK_TO_VANS()
SEQUENCE_INDEX seq
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
//Interior needs to be loaded first, to stop entities falling through the map
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<10.5, -671.6, 32.44>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
IF SETUP_REQ_PLAYER_IS_MICHAEL()
AND SETUP_REQ_BANK_INTERIOR_LOADED()
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<10.5, -671.6, 32.44>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
WAIT(1000)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ELSE
REQUEST_ANIM_DICT(strAnimIG5)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitTop)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitTopLeft)
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitTopRight)
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
IF SETUP_REQ_BANK_WORKER(<<7.9, -661.3, 32.44>>, 42.3)
AND SETUP_REQ_VAULT_WORKER(<<-6.0290, -686.3659, 15.1306>>, 161.4787)
AND SETUP_REQ_GOLD_VANS_AT_BANK()
AND SETUP_REQ_MAIN_DRIVER(<<-6.5872, -671.7311, 31.3406>>, 269.1434)
AND SETUP_REQ_MAIN_GUNMAN(<<-7.5872, -671.7311, 31.3406>>, 269.1434)
AND SETUP_REQ_TREVOR(<<11.0, -668.3, 32.44>>, 8.664)
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<10.3, -664.3, 32.44>>, 11.8)
AND SETUP_REQ_SECURITY_BARRIERS()
AND SETUP_REQ_BANK_SECURITY()
AND SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
IF HAS_ANIM_DICT_LOADED(strAnimIG5)
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitTop)
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitTopLeft)
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitTopRight)
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
SETUP_REQ_BANK_PEDS_READY_FOR_WALK()
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
REMOVE_MICHAEL_SHOTGUN_SILENCER()
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<10.5, -671.6, 32.44>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 6.7)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[1], sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_UNARMED, TRUE)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitTopRight, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
CLEAR_SEQUENCE_TASK(seq)
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], objGoldTrolleys[1], TRUE, FALSE, TRUE)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[0], sGoldVanPeds[CASEY_ID].ped, -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitTopLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sGoldVanPeds[CASEY_ID].ped, objGoldTrolleys[0], TRUE, FALSE, TRUE)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitTop, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS, 17)
TASK_GO_STRAIGHT_TO_COORD(NULL, vBankWorkerExit, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 49.5274)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_INSTANT_OPEN, vLiftTop1, vLiftTop2, modelLiftDoor)
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2A_CARTS_RESTART")
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_VAULT")
START_AUDIO_SCENE("BS_2A_GET_TO_VAULT")
ENDIF
ELSE
TRIGGER_MUSIC_EVENT("FH2A_CARTS_MA")
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_PED_CAPSULE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.5)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
SET_PED_CAPSULE(sGoldVanPeds[CASEY_ID].ped, 0.5)
ENDIF
SETTIMERB(0)
REPLAY_RECORD_BACK_FOR_TIME(0.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
SET_TROLLEY_SOUNDS_ACTIVE(TRUE)
DO_FADE_IN_WITH_WAIT() //In case of skip.
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
NEW_LOAD_SCENE_STOP() //From previous section.
iLiftEvent = 0
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
IF NOT IS_PED_INJURED(sBankWorker.ped)
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
RUBBER_BAND_WALKING_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.91)
RUBBER_BAND_WALKING_PED(sBankWorker.ped, 1.0)
RUBBER_BAND_WALKING_PED(sGoldVanPeds[CASEY_ID].ped, 1.0)
REQUEST_SCRIPT_AUDIO_BANK("Freight_Elevator")
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
IF TIMERB() < 1000
UPDATE_TROLLEY_WALK_ANIMS(FALSE, FALSE, TRUE)
ELSE
UPDATE_TROLLEY_WALK_ANIMS()
ENDIF
SWITCH iCurrentEvent
CASE 0
//Open/close the lift manually, sync sounds to match
IF iLiftEvent = 0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<6.687630,-664.025696,31.950871>>, <<6.645411,-656.735718,35.200790>>, 1.500000)
fLiftOpenRatio = 1.0
bPlayedLiftSound = FALSE
iLiftEvent++
ENDIF
ELIF iLiftEvent = 1
IF PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_CLOSE, vLiftTop1, vLiftTop2, modelLiftDoor)
iLiftEvent++
ENDIF
ENDIF
//Start requesting the next mocap
REQUEST_CUTSCENE("BS_2A_MCS_7_P1")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("BS_2A_MCS_7_P1")
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<3.760101,-655.617981,32.450539>>, <<-10.188398,-657.055481,35.201187>>, 3.750000)
IF IS_ENTITY_IN_ANGLED_AREA(objGoldTrolleys[0], <<1.681838,-660.596497,32.481625>>, <<-11.531109,-661.686096,35.231617>>, 4.50000)
bHasTextLabelTriggered[F3A_GETINVAN] = FALSE
CLEAR_PRINTS()
REMOVE_ALL_BLIPS()
SETTIMERB(0)
iCurrentEvent = 10
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDIF
BREAK
ENDSWITCH
//Chat between Trevor and the liason.
IF NOT bHasTextLabelTriggered[FH3A_TROLLEY]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_TROLLEY", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_TROLLEY] = TRUE
ENDIF
ENDIF
ELSE
//Kill the conversation before the player approaches the lift, to avoid having to cut a line off mid-way for the cutscene.
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-5.126129,-656.038208,32.450607>>, <<2.8,-657.035815,34.951149>>, 5.250000)
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
//Play a line if the player lags behind
IF NOT bHasTextLabelTriggered[FH3A_LAG5]
IF NOT IS_MESSAGE_BEING_DISPLAYED() OR NOT IS_SUBTITLE_PREFERENCE_SWITCHED_ON()
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])) > 64.0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LAG", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_LAG5] = TRUE
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
IF IS_PLAYER_ACTING_SUSPICIOUS_IN_BANK()
MISSION_FAILED(FAILED_SPOOKED_BANK_WORKERS)
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REPLAY_RECORD_BACK_FOR_TIME(3.0, 1.0, REPLAY_IMPORTANCE_HIGHEST)
CLEAR_PRINTS()
CLEAR_HELP()
REMOVE_ALL_BLIPS()
REMOVE_WAYPOINT_RECORDING(strWaypointLiftExitTop)
REMOVE_WAYPOINT_RECORDING(strWaypointLiftEnterTop)
REMOVE_WAYPOINT_RECORDING(strWaypointLiftExitBottom)
REMOVE_ANIM_DICT(strAnimIG6)
IF NOT HAS_SOUND_FINISHED(iLiftSoundID)
STOP_SOUND(iLiftSoundID)
ENDIF
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Freight_Elevator")
eMissionStage = STAGE_LOAD_GOLD_IN_VANS_CUTSCENE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_LOAD_GOLD_IN_VANS_CUTSCENE)
ENDIF
ENDPROC
PROC LOAD_GOLD_INTO_VANS_CUTSCENE()
SEQUENCE_INDEX seq
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-3.6475, -661.4576, 33.3306>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
IF SETUP_REQ_PLAYER_IS_MICHAEL()
AND SETUP_REQ_BANK_INTERIOR_LOADED()
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<-3.6475, -661.4576, 33.3306>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
WAIT(1000)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ELSE
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
IF SETUP_REQ_BANK_WORKER(<<-2.314122,-662.947083,15.1306>>, 263.770699)
AND SETUP_REQ_GOLD_VANS_AT_BANK()
AND SETUP_REQ_MAIN_DRIVER(<<-6.5872, -671.7311, 31.3406>>, 269.1434)
AND SETUP_REQ_MAIN_GUNMAN(<<-7.5872, -671.7311, 31.3406>>, 269.1434)
AND SETUP_REQ_TREVOR(<<-0.848102,-665.244019,15.1306>>, -153.477966)
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-1.900313,-666.880005,15.1306>>, -127.999458)
AND SETUP_REQ_SECURITY_BARRIERS()
AND SETUP_REQ_BANK_SECURITY()
AND SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
SETUP_REQ_BANK_PEDS_READY_FOR_WALK()
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
REMOVE_MICHAEL_SHOTGUN_SILENCER()
//Open the back doors on the vans
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
SET_VEHICLE_DOOR_OPEN(sGoldVans[0].veh, SC_DOOR_REAR_LEFT)
SET_VEHICLE_DOOR_OPEN(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
SET_VEHICLE_DOOR_OPEN(sGoldVans[1].veh, SC_DOOR_REAR_LEFT)
SET_VEHICLE_DOOR_OPEN(sGoldVans[1].veh, SC_DOOR_REAR_RIGHT)
ENDIF
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-3.0475, -665.4576, 15.1306>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 250.9940)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_UNARMED, TRUE)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_CUTSCENE("BS_2A_MCS_7_P1")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("BS_2A_MCS_7_P1")
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_FRONT_RIGHT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT, DT_DOOR_INTACT, 0.0)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[0].veh, "Trevors_truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_FRONT_RIGHT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_REAR_RIGHT, DT_DOOR_INTACT, 0.0)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[1].veh, "Michaels_truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_PED_CAPSULE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.)
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
REGISTER_ENTITY_FOR_CUTSCENE(sBankWorker.ped, "Bank_Employee", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_ENTITY_MODEL(sBankWorker.ped))
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
SET_PED_LOD_MULTIPLIER(sCrew[CREW_GUNMAN].ped, 1.5)
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_GUNMAN].ped, "gunman_selection_1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
IF NOT HAS_PED_GOT_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, 100)
ENDIF
SET_CURRENT_PED_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
objGunmansWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE)
REGISTER_ENTITY_FOR_CUTSCENE(objGunmansWeapon, "HC_Gunman_Rifle", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_PED_LOD_MULTIPLIER(sCrew[CREW_DRIVER].ped, 1.5)
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_DRIVER].ped, "driver_selection", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
IF NOT HAS_PED_GOT_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE, 100)
ENDIF
SET_CURRENT_PED_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
objDriversWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE)
REGISTER_ENTITY_FOR_CUTSCENE(objDriversWeapon, "HC_Driver_Rifle", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
SET_PED_CAPSULE(sGoldVanPeds[CASEY_ID].ped, 0.0)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[CASEY_ID].ped, "Casey", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
//Setup all the weapons
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100)
ENDIF
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, TRUE)
objMichaelsWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
REGISTER_ENTITY_FOR_CUTSCENE(objMichaelsWeapon, "Michaels_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
DETACH_ENTITY(objGoldTrolleys[0])
DETACH_ENTITY(objGoldTrolleys[1])
REGISTER_ENTITY_FOR_CUTSCENE(objGoldTrolleys[0], "GoldCargo", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
REGISTER_ENTITY_FOR_CUTSCENE(objGoldTrolleys[1], "GoldCargo^1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
SET_TROLLEY_SOUNDS_ACTIVE(TRUE)
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
REMOVE_ALL_AUDIO_SCENES()
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2A_CARTS_RESTART")
ENDIF
DO_FADE_IN_WITH_WAIT()
iMusicTriggerEvent = 0
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
IF NOT bSkippedMocap
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
bSkippedMocap = TRUE
eSectionStage = SECTION_STAGE_SKIP
ENDIF
ENDIF
//Request assets for next section in advance.
REQUEST_WAYPOINT_RECORDING(strWaypointVehLeaveBank)
REQUEST_VEHICLE_RECORDING(CARREC_BANK_LEAVE, strCarrec)
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF IS_CUTSCENE_PLAYING()
IF iCurrentEvent = 0
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
CLEAR_AREA_OF_PEDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), 300.0)
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 300.0)
iCurrentEvent++
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<0.4, -662.530, 32.4815>>, PEDMOVE_WALK, DEFAULT, 0.5, ENAV_NO_STOPPING)
TASK_ENTER_VEHICLE(NULL, sGoldVans[1].veh, DEFAULT, VS_DRIVER, PEDMOVE_WALK)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("gunman_selection_1")
SET_PED_INTO_VEHICLE(sCrew[CREW_GUNMAN].ped, sGoldVans[1].veh, VS_BACK_RIGHT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sCrew[CREW_GUNMAN].ped)
SET_PED_LOD_MULTIPLIER(sCrew[CREW_GUNMAN].ped, 1.0)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("driver_selection")
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<0.7, -667.0, 32.4815>>, PEDMOVE_WALK, DEFAULT, 0.5, ENAV_NO_STOPPING)
TASK_ENTER_VEHICLE(NULL, sGoldVans[1].veh, DEFAULT, VS_FRONT_RIGHT, PEDMOVE_WALK)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sCrew[CREW_DRIVER].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
SET_PED_LOD_MULTIPLIER(sCrew[CREW_DRIVER].ped, 1.0)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Casey")
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<0.1678, -661.1131, 32.4818>>, PEDMOVE_WALK, DEFAULT, 0.5, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<0.5, -666.4, 31.6818>>, PEDMOVE_WALK, DEFAULT, 0.5, ENAV_NO_STOPPING)
TASK_ENTER_VEHICLE(NULL, sGoldVans[0].veh, DEFAULT, VS_FRONT_RIGHT, PEDMOVE_WALK)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, TRUE)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE, FALSE, FAUS_CUTSCENE_EXIT)
IF NOT bSkippedMocap
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
TRIGGER_MUSIC_EVENT("FH2A_LEAVE_BANK_MA")
iMusicTriggerEvent++
ENDIF
IF iMusicTriggerEvent = 0
PREPARE_MUSIC_EVENT("FH2A_LEAVE_BANK_MA")
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Bank_Employee")
//Currently don't need to do anything.
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("GoldCargo")
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("GoldCargo^1")
SETUP_REQ_GOLD_TROLLEYS_IN_VANS(TRUE)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_truck")
SET_VEHICLE_ENGINE_ON(sGoldVans[0].veh, TRUE, TRUE)
SET_VEHICLE_DOORS_SHUT(sGoldVans[0].veh)
SET_ENTITY_VELOCITY(sGoldVans[0].veh, <<0.0, 0.0, 0.0>>)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_truck")
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_BANK_LEAVE, strCarrec)
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehLeaveBank)
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, CARREC_BANK_LEAVE, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, 0.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[1].veh)
SET_PLAYBACK_SPEED(sGoldVans[1].veh, 0.0)
ELSE
SET_ENTITY_HEADING(sGoldVans[1].veh, -174.161)
SET_ENTITY_COORDS(sGoldVans[1].veh, <<-2.283, -667.746, 31.3231>>)
ENDIF
SET_VEHICLE_DOORS_SHUT(sGoldVans[1].veh)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_weapon")
GIVE_WEAPON_OBJECT_TO_PED(objMichaelsWeapon, PLAYER_PED_ID())
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("HC_Gunman_Rifle")
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
GIVE_WEAPON_OBJECT_TO_PED(objGunmansWeapon, sCrew[CREW_GUNMAN].ped)
REMOVE_OBJECT(objGunmansWeapon, TRUE)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("HC_Driver_Rifle")
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
GIVE_WEAPON_OBJECT_TO_PED(objDriversWeapon, sCrew[CREW_DRIVER].ped)
REMOVE_OBJECT(objDriversWeapon, TRUE)
ENDIF
ENDIF
ENDIF
IF NOT IS_CUTSCENE_ACTIVE()
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
DISABLE_COMBAT_CONTROLS_THIS_FRAME(TRUE)
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
iCurrentEvent = 0
REPLAY_STOP_EVENT()
IF DOES_CAM_EXIST(camMain)
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, TRUE, 1000)
ENDIF
REMOVE_ANIM_DICT(strAnimIG5)
REMOVE_OBJECT(objGunmansWeapon, TRUE)
REMOVE_OBJECT(objDriversWeapon, TRUE)
SET_TROLLEY_SOUNDS_ACTIVE(FALSE)
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_LEAVE_BANK
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
STOP_CUTSCENE()
REMOVE_CUTSCENE()
CANCEL_ALL_PREPARED_MUSIC_EVENTS()
REQUEST_WAYPOINT_RECORDING(strWaypointVehLeaveBank)
REQUEST_VEHICLE_RECORDING(CARREC_BANK_LEAVE, strCarrec)
WHILE NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehLeaveBank)
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_BANK_LEAVE, strCarrec)
WAIT(0)
ENDWHILE
bSkippedMocap = TRUE
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDPROC
PROC LEAVE_BANK()
SEQUENCE_INDEX seq
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
IF SETUP_REQ_PLAYER_IS_MICHAEL()
AND SETUP_REQ_BANK_INTERIOR_LOADED()
IF bHasUsedCheckpoint
START_REPLAY_SETUP(<<-6.9994, -662.0037, 32.4819>>, 283.9521, FALSE, TRUE)
iCurrentEvent = 99
ELSE
//Fix for B*528757: Guarantee that the tunnel is loaded first before trying to set up everything else.
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-6.9994, -662.0037, 32.4819>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 283.9521)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<-6.9994, -662.0037, 32.4819>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
ELSE
IF SETUP_REQ_BANK_WORKER(<<-9.0005, -661.1465, 32.4815>>, 259.9744)
AND SETUP_REQ_GOLD_VANS_AT_BANK()
AND SETUP_REQ_MAIN_DRIVER(<<-5.314122,-662.947083,15.1306>>, 269.1434)
AND SETUP_REQ_MAIN_GUNMAN(<<-6.314122,-662.947083,15.1306>>, 269.1434)
AND SETUP_REQ_TREVOR(<<-0.848102,-665.244019, 15.1306>>, -153.477966)
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-1.900313,-666.880005,15.1306>>, -127.999458)
AND SETUP_REQ_SECURITY_BARRIERS()
AND SETUP_REQ_BANK_SECURITY()
AND SETUP_REQ_GOLD_TROLLEYS_IN_VANS(TRUE)
AND SETUP_REQ_CREW_IN_GOLD_VANS(FALSE)
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
REMOVE_MICHAEL_SHOTGUN_SILENCER()
WHILE NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
OR (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
WAIT(0)
ENDWHILE
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<-3.456, -662.13, 32.4821>>)
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 13.65)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<0.4, -662.530, 32.4815>>, PEDMOVE_WALK, DEFAULT, 0.5, ENAV_NO_STOPPING)
TASK_ENTER_VEHICLE(NULL, sGoldVans[1].veh, DEFAULT, VS_DRIVER, PEDMOVE_WALK)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped, <<0.8804, -662.3219, 32.4815>>)
SET_ENTITY_HEADING(sCrew[CREW_DRIVER].ped, -175.62)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<0.7, -667.0, 32.4815>>, PEDMOVE_WALK, DEFAULT, 0.5, ENAV_NO_STOPPING)
TASK_ENTER_VEHICLE(NULL, sGoldVans[1].veh, DEFAULT, VS_FRONT_RIGHT, PEDMOVE_WALK)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sCrew[CREW_DRIVER].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
SET_ENTITY_COORDS(sGoldVanPeds[CASEY_ID].ped, <<-1.2656, -660.8115, 32.4817>>)
SET_ENTITY_HEADING(sGoldVanPeds[CASEY_ID].ped, -87.68)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<0.1678, -661.1131, 32.4818>>, PEDMOVE_WALK, DEFAULT, 0.5, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<0.5, -666.4, 31.6818>>, PEDMOVE_WALK, DEFAULT, 0.5, ENAV_NO_STOPPING)
TASK_ENTER_VEHICLE(NULL, sGoldVans[0].veh, DEFAULT, VS_FRONT_RIGHT, PEDMOVE_WALK)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-6.9994, -662.0037, 32.4819>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 283.9521)
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_WAYPOINT_RECORDING(strWaypointVehLeaveBank)
REQUEST_VEHICLE_RECORDING(CARREC_BANK_LEAVE, strCarrec)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehLeaveBank)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_BANK_LEAVE, strCarrec)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_PED_CAN_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
IF IS_PED_IN_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
REMOVE_PED_FROM_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
SET_PED_CAN_RAGDOLL(sGoldVanPeds[CASEY_ID].ped, FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(sGoldVanPeds[CASEY_ID].ped, RELGROUPHASH_PLAYER)
ENDIF
IF NOT IS_PED_INJURED(sBankWorker.ped)
TASK_LOOK_AT_ENTITY(sBankWorker.ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
ENDIF
DELETE_OBJECT(objSecurityGateCollision[1])
DELETE_OBJECT(objSecurityBarriers[1])
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_UNLOCKED)
SET_VEHICLE_ENGINE_ON(sGoldVans[0].veh, TRUE, TRUE)
SET_VEHICLE_RADIO_ENABLED(sGoldVans[0].veh, TRUE)
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, FALSE)
//Turn off the road outside the bank so Trevor's van doesn't crash into vehicles.
SET_ROADS_IN_ANGLED_AREA(<<96.116104,-572.902649,25.195431>>, <<26.738914,-761.622437,39.121941>>, 16.750000, FALSE, FALSE)
CLEAR_AREA(<<72.2324, -631.7999, 30.5926>>, 30.0, TRUE)
sTrevor.iEvent = 0
sMichael.iEvent = 0
sBankWorker.iEvent = 0
sGoldVanPeds[CASEY_ID].iEvent = 0
sCrew[CREW_DRIVER].iEvent = 0
sCrew[CREW_GUNMAN].iEvent = 0
REMOVE_OBJECT(objMichaelsWeapon)
//NG 1724354 - on nextgen there's a high chance of peds spawning where the vans leave the bank.
BLOCK_PAVEMENTS_AT_BANK_EXIT(TRUE)
CLEAR_AREA_OF_PEDS(<<67.8, -632.0, 31.4>>, 3.0)
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_LEAVE_BANK")
START_AUDIO_SCENE("BS_2A_LEAVE_BANK")
ENDIF
IF IS_SCREEN_FADED_OUT()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
WAIT(500) //This is to allow the AI tasks to start before fading in.
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2A_LEAVE_BANK_RESTART")
ENDIF
ENDIF
SETTIMERA(0)
IF NOT IS_SCREEN_FADED_IN()
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_IN()
DISABLE_COMBAT_CONTROLS_THIS_FRAME(TRUE)
WAIT(0)
ENDWHILE
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
IF interiorBank != NULL
UNPIN_INTERIOR(interiorBank)
interiorBank = NULL
ENDIF
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_LEAVE_BANK, "LEAVE_BANK")
STAT_GET_INT(SP0_NUMBER_CRASHES_CARS, iPrevNumVanCrashes)
REPLAY_RECORD_BACK_FOR_TIME(0.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
iBankDoorState = 0
iPrevNumVanCrashes = 0
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_ForcePlayerToEnterVehicleThroughDirectDoorOnly, TRUE)
REQUEST_VEHICLE_ASSET(modelGoldVan, ENUM_TO_INT(VRF_REQUEST_ENTRY_ANIMS | VRF_REQUEST_ALTERNATE_ENTRY_ANIMS))
#IF IS_DEBUG_BUILD
DONT_DO_J_SKIP(sLocatesData)
#ENDIF
IF sMichael.iEvent = 0
IF NOT bHasTextLabelTriggered[FH3A_MCS7LO1]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS7LO1", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_MCS7LO1] = TRUE
ENDIF
ENDIF
ENDIF
IS_PLAYER_AT_LOCATION_IN_VEHICLE(sLocatesData, vBankExit, <<0.001, 0.001, LOCATE_SIZE_HEIGHT>>, FALSE, sGoldVans[0].veh,
"F3A_FOLLOWTREV", "F3A_GETINVAN", "F3A_GETBACKVAN", FALSE)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh, TRUE)
sMichael.iEvent++
ENDIF
ENDIF
ELSE
IS_PLAYER_AT_LOCATION_WITH_BUDDY_IN_VEHICLE(sLocatesData, vBankExit, <<0.001, 0.001, LOCATE_SIZE_HEIGHT>>, FALSE, sGoldVanPeds[CASEY_ID].ped, sGoldVans[0].veh,
"F3A_FOLLOWTREV", "F3A_LEFTCASE", "F3A_GETINVAN", "F3A_GETBACKVAN", FALSE)
ENDIF
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
SET_BLIP_ALPHA(sLocatesData.LocationBlip, 0)
SET_BLIP_ROUTE(sLocatesData.LocationBlip, FALSE)
ELSE
IF DOES_BLIP_EXIST(sGoldVans[1].blip)
REMOVE_BLIP(sGoldVans[1].blip)
ENDIF
ENDIF
SWITCH iCurrentEvent
CASE 0 //Wait for Michael and Casey to get in the car
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), 0.98)
DISABLE_COMBAT_CONTROLS_THIS_FRAME(TRUE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
SET_PED_CAN_RAGDOLL(sGoldVanPeds[CASEY_ID].ped, TRUE)
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_LOCKED_PLAYER_INSIDE)
SETTIMERA(0)
iCurrentEvent++
ENDIF
//Fail if the player tries to leave the bank at this point without the gold.
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sGoldVans[0].veh)) > 3600.0
MISSION_FAILED(FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS)
ENDIF
ENDIF
BREAK
CASE 1 //Franklin contacts Michael on the headset.
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF NOT DOES_BLIP_EXIST(sGoldVans[1].blip)
sGoldVans[1].blip = CREATE_BLIP_FOR_VEHICLE(sGoldVans[1].veh)
ENDIF
//Play a "let's go" conversation.
IF NOT bHasTextLabelTriggered[FH3A_GOING2]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_GOING2", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_GOING2] = TRUE
ENDIF
ENDIF
ENDIF
IF SETUP_REQ_FRANKLIN(<<150.2, -752.6, 263.1>>)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
FREEZE_ENTITY_POSITION(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
SET_ENTITY_COLLISION(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
ENDIF
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
AND TIMERA() > 15000
iCurrentEvent++
ENDIF
ENDIF
ENDIF
BREAK
CASE 2 //Play conversation, then tell the player to switch.
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF NOT DOES_BLIP_EXIST(sGoldVans[1].blip)
sGoldVans[1].blip = CREATE_BLIP_FOR_VEHICLE(sGoldVans[1].veh)
ENDIF
REQUEST_CUSTOM_SWITCH_ASSETS()
SETUP_REQ_FRANKLIN(<<128.9, -1181.3, 30.0>>, 0.0, TRUE)
SETUP_REQ_LESTER(<<126.2, -1186.9, 29.0>>, 0.0, TRUE)
SETUP_REQ_HACKER(<<124.2, -1186.9, 29.0>>, 0.0, TRUE)
SETUP_REQ_TRAFFIC_LAPTOPS(<<127.4, -1184.4, 29.6>>, <<126.7, -1184.2, 29.6>>, 0.0, 0.0, TRUE)
SETUP_REQ_CHASE_CARS_START(TRUE)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF NOT bHasTextLabelTriggered[FH3A_RADIO]
//NOTE: there are issues with playing conversations with peds that are frozen (like Franklin), so add a NULL ped for him.
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, NULL, "FRANKLIN")
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RADIO", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
bHasTextLabelTriggered[FH3A_RADIO] = TRUE
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_FSEES]
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, NULL, "LESTER")
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, NULL, "FRANKLIN")
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_FSEES", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_FSEES] = TRUE
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_RESPOND]
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RESPOND", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_RESPOND] = TRUE
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_AWAY]
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, NULL, "FRANKLIN")
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_AWAY", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_AWAY] = TRUE
ENDIF
ELSE
SET_SELECTOR_PED_PRIORITY(sSelectorPeds, SELECTOR_PED_FRANKLIN, SELECTOR_PED_MICHAEL, SELECTOR_PED_TREVOR)
SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_TREVOR, TRUE)
PRINT_NOW("F3A_SWITCHFRAN", DEFAULT_GOD_TEXT_TIME, 0)
bHasTextLabelTriggered[F3A_SWITCHFRAN] = TRUE
SETTIMERB(0)
iCurrentEvent++
ENDIF
ENDIF
ENDIF
BREAK
CASE 3 //Wait for the switch to occur.
IF NOT DOES_BLIP_EXIST(sGoldVans[1].blip)
sGoldVans[1].blip = CREATE_BLIP_FOR_VEHICLE(sGoldVans[1].veh)
ENDIF
REQUEST_CUSTOM_SWITCH_ASSETS()
SETUP_REQ_FRANKLIN(<<128.9, -1181.3, 30.0>>, 0.0, TRUE)
SETUP_REQ_LESTER(<<126.2, -1186.9, 29.0>>, 0.0, TRUE)
SETUP_REQ_HACKER(<<124.2, -1186.9, 29.0>>, 0.0, TRUE)
SETUP_REQ_TRAFFIC_LAPTOPS(<<127.4, -1184.4, 29.6>>, <<126.7, -1184.2, 29.6>>, 0.0, 0.0, TRUE)
SETUP_REQ_CHASE_CARS_START(TRUE)
IF CAN_PLAYER_START_CUTSCENE()
IF UPDATE_SELECTOR_HUD(sSelectorPeds, FALSE)
OR TIMERB() > 25000
OR VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vChaseTriggerStart) < 10000.0
INFORM_MISSION_STATS_OF_INCREMENT(FH2A_SWITCHES)
//IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_GOGO", CONV_PRIORITY_MEDIUM)
eSectionStage = SECTION_STAGE_CLEANUP
//ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
//remove the car park interior.
IF interiorBankCarPark != NULL
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<-4.7, -669.0262, 33.9594>>) > 10000.0
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<56.906719,-704.206482,47.467571>>,<<32.000000,16.250000,17.500000>>)
REMOVE_OBJECT(objWalkieTalkie, TRUE)
REMOVE_OBJECT(objBankWorkerWalkieTalkie, TRUE)
REMOVE_PED(sBankWorker.ped, TRUE)
REMOVE_ANIM_DICT("map_objects")
REMOVE_ANIM_DICT(strManagerLeadOut)
REMOVE_VEHICLE_ASSET(modelGoldVan)
REMOVE_OBJECT(objSecurityBarriers[0], TRUE)
REMOVE_OBJECT(objSecurityBarriers[1], TRUE)
REMOVE_OBJECT(objSecurityGateCollision[0], TRUE)
REMOVE_OBJECT(objSecurityGateCollision[1], TRUE)
SET_BUILDING_STATE(BUILDINGNAME_ES_BANK_CAR_PARK_SHUTTERS, BUILDINGSTATE_NORMAL)
REMOVE_PED(pedGateSecurity, TRUE)
UNPIN_INTERIOR(interiorBankCarPark)
interiorBankCarPark = NULL
ENDIF
ENDIF
ENDIF
//Pre-stream the cutscene location.
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
IF bHasTextLabelTriggered[FH3A_AWAY]
//Lower the budgets to help with streaming.
SET_VEHICLE_POPULATION_BUDGET(1)
SET_PED_POPULATION_BUDGET(1)
NEW_LOAD_SCENE_START_SPHERE(<<134.9, -1181.2, 28.6>>, 12.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
ENDIF
ENDIF
//Pre-stream the music event that triggers on the switch.
PREPARE_MUSIC_EVENT("FH2A_TRAFFIC_START")
IF bHasTextLabelTriggered[F3A_SWITCHFRAN]
//Preload the next conversation.
IF NOT bHasTextLabelTriggered[FH3A_SWITCH_PRELOAD]
IF PRELOAD_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SWITCH", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_SWITCH_PRELOAD] = TRUE
ENDIF
ENDIF
//This used to trigger extra dialogue if the player didn't switch, but we need to preload the next conversation.
/*IF NOT bHasTextLabelTriggered[FH3A_NOGO]
IF TIMERB() > 12500
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, NULL, "FRANKLIN")
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_NOGO", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_NOGO] = TRUE
ENDIF
ENDIF
ENDIF*/
ENDIF
//Fail for getting a wanted level.
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
MISSION_FAILED(FAILED_ALERTED_COPS)
ENDIF
//Control the bank door.
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF iBankDoorState = 0
IF VDIST2(GET_ENTITY_COORDS(sGoldVans[1].veh), <<60.2288, -632.9772, 31.8562>>) < 900.0
OR VDIST2(GET_ENTITY_COORDS(sGoldVans[0].veh), <<60.2288, -632.9772, 31.8562>>) < 400.0
DOOR_SYSTEM_SET_HOLD_OPEN(iBankExitBarrierHash, TRUE)
iBankDoorState = 1
ENDIF
ELSE
IF VDIST2(GET_ENTITY_COORDS(sGoldVans[1].veh), <<60.2288, -632.9772, 31.8562>>) > 900.0
AND VDIST2(GET_ENTITY_COORDS(sGoldVans[0].veh), <<60.2288, -632.9772, 31.8562>>) > 400.0
DOOR_SYSTEM_SET_HOLD_OPEN(iBankExitBarrierHash, FALSE)
iBankDoorState = 0
ENDIF
ENDIF
ENDIF
//Trevor plays back a recording to begin with, then switches to waypoint.
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
SWITCH sTrevor.iEvent
CASE 0 //Start playback once everyone is in the van.
IF IS_PED_SITTING_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh)
AND IS_PED_SITTING_IN_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldVans[1].veh)
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh)
AND IS_PED_IN_VEHICLE(sGoldVanPeds[CASEY_ID].ped, sGoldVans[0].veh)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
AND NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, CARREC_BANK_LEAVE, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, 0.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[1].veh)
ENDIF
SET_PLAYBACK_SPEED(sGoldVans[1].veh, 1.0)
sTrevor.iEvent++
ENDIF
ENDIF
BREAK
CASE 1 //Open the barrier once Trevor is close.
IF VDIST2(GET_ENTITY_COORDS(sGoldVans[1].veh), <<60.2288, -632.9772, 31.8562>>) < 400.0
sTrevor.iEvent++
sTrevor.iTimer = GET_GAME_TIMER()
ENDIF
BREAK
CASE 2 //Switch to waypoint after getting out of the car park.
IF GET_GAME_TIMER() - sTrevor.iTimer > 5500
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
ENDIF
IF NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh, strWaypointVehLeaveBank, DRIVINGMODE_STOPFORCARS, -1,
EWAYPOINT_START_FROM_CLOSEST_POINT, -1, 30.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
ELSE
sTrevor.iTimer = GET_GAME_TIMER()
sTrevor.iEvent++
ENDIF
ENDIF
BREAK
CASE 3 //Switch to AI if the waypoint recording finishes.
BOOL bSwitchToAI
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
INT iClosestNode, iMaxNodes
WAYPOINT_RECORDING_GET_NUM_POINTS(strWaypointVehLeaveBank, iMaxNodes)
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointVehLeaveBank, GET_ENTITY_COORDS(sGoldVans[1].veh), iClosestNode)
IF iMaxNodes - iClosestNode < 5
bSwitchToAI = TRUE
ENDIF
ELIF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE) != PERFORMING_TASK
AND GET_GAME_TIMER() - sTrevor.iTimer > 500
bSwitchToAI = TRUE
ENDIF
IF bSwitchToAI
//TASK_VEHICLE_DRIVE_TO_COORD(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh, <<-286.3095, -1286.0005, 29.9973>>, 25.0,
// DRIVINGSTYLE_NORMAL, GET_ENTITY_MODEL(sGoldVans[1].veh), DRIVINGMODE_STOPFORCARS, 5.0, 10.0)
//NG bug 1696456
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh, <<-274.6815, -1117.2107, 22.1099>>, 15.0,
DRIVINGMODE_STOPFORCARS, 5.0)
ENDIF
BREAK
ENDSWITCH
ENDIF
//Bank manager: walks back into the bank once everyone is in the cars.
IF NOT IS_PED_INJURED(sBankWorker.ped)
IF IS_PED_RAGDOLL(sBankWorker.ped) OR HAS_PED_RECEIVED_EVENT(sBankWorker.ped, EVENT_PED_COLLISION_WITH_PLAYER)
MISSION_FAILED(FAILED_SPOOKED_BANK_WORKERS)
ENDIF
SWITCH sBankWorker.iEvent
CASE 0 //Wait for player to go downstairs, then walk to scene position.
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-5.151732,-663.403198,31.088076>>, <<-4.253166,-672.639709,34.338078>>, 14.500000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<0.158653,-658.836792,32.230839>>, <<0.488017,-662.644226,35.482761>>, 3.000000)
sBankWorker.vDest = <<-5.300, -662.000, 33.480>>
iBankWorkerSyncScene = -1
sBankWorker.iEvent++
ENDIF
BREAK
CASE 1 //Once in position and the player is near their van then play the synced scene.
REQUEST_ANIM_DICT(strManagerLeadOut)
FLOAT fDistFromScene
fDistFromScene = VDIST(GET_ENTITY_COORDS(sBankWorker.ped), sBankWorker.vDest)
IF fDistFromScene > 1.5
IF GET_SCRIPT_TASK_STATUS(sBankWorker.ped, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) != PERFORMING_TASK
TASK_FOLLOW_NAV_MESH_TO_COORD(sBankWorker.ped, sBankWorker.vDest, PEDMOVE_WALK, -1, 0.2, ENAV_STOP_EXACTLY, -106.920)
ENDIF
ENDIF
IF HAS_ANIM_DICT_LOADED(strManagerLeadOut)
AND SETUP_REQ_BANK_WORKER_WALKIE_TALKIE(TRUE)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-3.919883,-669.252258,31.088078>>, <<-9.787007,-669.863098,34.447842>>, 4.000000)
OR IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh, TRUE)
IF fDistFromScene < 1.5
SETUP_REQ_BANK_WORKER_WALKIE_TALKIE()
iBankWorkerSyncScene = CREATE_SYNCHRONIZED_SCENE(<<-5.300, -662.000, 33.480>>, <<0.000, -0.000, -106.920>>)
TASK_SYNCHRONIZED_SCENE(sBankWorker.ped, iBankWorkerSyncScene, strManagerLeadOut, "leadout_wave_walkoff", WALK_BLEND_IN, SLOW_BLEND_OUT,
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT)
TASK_CLEAR_LOOK_AT(sBankWorker.ped)
sBankWorker.iEvent++
ENDIF
ENDIF
ENDIF
BREAK
CASE 2 //Go into walking task.
IF NOT bHasTextLabelTriggered[FH3A_MCS7LO2_1]
IF IS_SYNCHRONIZED_SCENE_RUNNING(iBankWorkerSyncScene)
IF GET_SYNCHRONIZED_SCENE_PHASE(iBankWorkerSyncScene) > 0.125
IF GET_SYNCHRONIZED_SCENE_PHASE(iBankWorkerSyncScene) < 0.15
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF sConversationPeds.PedInfo[8].Index != sBankWorker.ped
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, sBankWorker.ped, "BankLiaison")
ENDIF
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS7LO2", "FH3A_MCS7LO2_1", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(1.0, 3.0, REPLAY_IMPORTANCE_HIGHEST)
bHasTextLabelTriggered[FH3A_MCS7LO2_1] = TRUE
ENDIF
ENDIF
ELSE
//We missed the chance to play this line.
bHasTextLabelTriggered[FH3A_MCS7LO2_1] = TRUE
bHasTextLabelTriggered[FH3A_MCS7LO2_1_SKIPPED] = TRUE
ENDIF
ENDIF
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_MCS7LO2_2]
IF NOT bHasTextLabelTriggered[FH3A_MCS7LO2_1_SKIPPED]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF sConversationPeds.PedInfo[8].Index != sBankWorker.ped
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, sBankWorker.ped, "BankLiaison")
ENDIF
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS7LO2", "FH3A_MCS7LO2_2", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_MCS7LO2_2] = TRUE
ENDIF
ENDIF
ELSE
bHasTextLabelTriggered[FH3A_MCS7LO2_2] = TRUE
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_MCS7LO2_3]
IF GET_SYNCHRONIZED_SCENE_PHASE(iBankWorkerSyncScene) > 0.68
IF GET_SYNCHRONIZED_SCENE_PHASE(iBankWorkerSyncScene) < 0.7
IF sConversationPeds.PedInfo[8].Index != sBankWorker.ped
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, sBankWorker.ped, "BankLiaison")
ENDIF
//This line needs to be forced through, play it without subtitles if necessary.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS7LO2", "FH3A_MCS7LO2_3", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_MCS7LO2_3] = TRUE
ENDIF
ELSE
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS7LO2", "FH3A_MCS7LO2_3", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
bHasTextLabelTriggered[FH3A_MCS7LO2_3] = TRUE
ENDIF
ENDIF
ELSE
//We missed the chance to play this line.
bHasTextLabelTriggered[FH3A_MCS7LO2_3] = TRUE
ENDIF
ENDIF
ENDIF
IF (IS_SYNCHRONIZED_SCENE_RUNNING(iBankWorkerSyncScene) AND GET_SYNCHRONIZED_SCENE_PHASE(iBankWorkerSyncScene) > 0.99)
OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(iBankWorkerSyncScene)
IF IS_SYNCHRONIZED_SCENE_RUNNING(iBankWorkerSyncScene)
STOP_SYNCHRONIZED_ENTITY_ANIM(sBankWorker.ped, SLOW_BLEND_OUT, TRUE)
ENDIF
iBankWorkerSyncScene = -1
TASK_FOLLOW_NAV_MESH_TO_COORD(sBankWorker.ped, <<9.8060, -666.9023, 32.4493>>, PEDMOVE_WALK)
REMOVE_ANIM_DICT(strManagerLeadOut)
sBankWorker.iEvent++
ENDIF
BREAK
CASE 3 //Delete once out of view.
IF VDIST2(GET_ENTITY_COORDS(sBankWorker.ped), <<9.8060, -666.9023, 32.4493>>) < 4.0
REMOVE_OBJECT(objWalkieTalkie, TRUE)
REMOVE_PED(sBankWorker.ped, TRUE)
ENDIF
BREAK
ENDSWITCH
ENDIF
//Fail for the player's van getting stuck.
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF IS_VEHICLE_PERMANENTLY_STUCK(sGoldVans[0].veh)
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
MISSION_FAILED(FAILED_VAN_STUCK)
ENDIF
ENDIF
//Fail for crashing the van in the area.
INT iNumCrashes
STAT_GET_INT(SP0_NUMBER_CRASHES_CARS, iNumCrashes)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF GET_ENTITY_SPEED(sGoldVans[0].veh) > 5.0
iTimeSinceVanLastMovedQuickly = GET_GAME_TIMER()
ENDIF
ENDIF
//Fail for going in certain area of the bank.
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-127.548843,-662.109497,39.146435>>, <<-38.674873,-693.079834,30.838036>>, 18.250000)
//Fail if the player is near the bank entrance and crashes the van.
IF iNumCrashes > iPrevNumVanCrashes
//The stat is a bit too sensitive for this situation, so check how fast the van was going recently.
IF GET_GAME_TIMER() - iTimeSinceVanLastMovedQuickly < 1000
MISSION_FAILED(FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS)
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(),<<3.737513,-655.875000,31.700588>>, <<-4.347250,-656.102539,34.950783>>, 5.250000)
MISSION_FAILED(FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS)
ENDIF
IF IS_PLAYER_ACTING_SUSPICIOUS_IN_BANK()
MISSION_FAILED(FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS)
ENDIF
iPrevNumVanCrashes = iNumCrashes
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REPLAY_RECORD_BACK_FOR_TIME(3.0, 12.0, REPLAY_IMPORTANCE_HIGHEST)
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
REMOVE_ALL_BLIPS()
//Delete anything from the bank
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 8)
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 6)
BLOCK_PAVEMENTS_AT_BANK_EXIT(FALSE)
REMOVE_OBJECT(objWalkieTalkie, TRUE)
REMOVE_OBJECT(objBankWorkerWalkieTalkie, TRUE)
REMOVE_OBJECT(objSecurityBarriers[0])
REMOVE_OBJECT(objSecurityBarriers[1])
REMOVE_OBJECT(objSecurityGateCollision[0])
REMOVE_OBJECT(objSecurityGateCollision[1])
REMOVE_PED(sBankWorker.ped, TRUE)
REMOVE_PED(pedGateSecurity)
REMOVE_ANIM_DICT("map_objects")
REMOVE_ANIM_DICT(strManagerLeadOut)
//REQUEST_IPL("DT1_03_Shutter") //Put the original map gates back
SET_BUILDING_STATE(BUILDINGNAME_ES_BANK_CAR_PARK_SHUTTERS, BUILDINGSTATE_NORMAL)
REMOVE_WAYPOINT_RECORDING(strWaypointVehLeaveBank)
REMOVE_VEHICLE_RECORDING(CARREC_BANK_LEAVE, strCarrec)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
FREEZE_ENTITY_POSITION(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
SET_ENTITY_COLLISION(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
ENDIF
IF interiorBankCarPark != NULL
UNPIN_INTERIOR(interiorBankCarPark)
interiorBankCarPark = NULL
ENDIF
IF interiorBank != NULL
UNPIN_INTERIOR(interiorBank)
interiorBank = NULL
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_LEAVE_BANK")
STOP_AUDIO_SCENE("BS_2A_LEAVE_BANK")
ENDIF
CLEAR_SELECTOR_PED_PRIORITY(sSelectorPeds)
SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
eMissionStage = STAGE_SWAP_TO_FRANKLIN_CUTSCENE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh)
SET_ENTITY_COORDS(sGoldVans[0].veh, <<64.243668,-626.103149,31.742626>>)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
ENDIF
ENDIF
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDPROC
PROC SWAP_TO_FRANKLIN_CUTSCENE_NEW()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_AIM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_RADIO_WHEEL)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CELLPHONE_UP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK1)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() //Fix for bug 2176432
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF SETUP_REQ_PLAYER_IS_MICHAEL()
AND SETUP_REQ_GOLD_VANS_AT_BANK()
AND SETUP_REQ_MAIN_DRIVER(<<-5.314122,-662.947083,15.1306>>, 269.1434)
AND SETUP_REQ_MAIN_GUNMAN(<<-6.314122,-662.947083,15.1306>>, 269.1434)
AND SETUP_REQ_TREVOR(<<-0.848102,-665.244019, 15.1306>>, -153.477966)
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-1.900313,-666.880005,15.1306>>, -127.999458)
AND SETUP_REQ_GOLD_VANS_POST_HIJACK(<<-110.3915, -667.8174, 34.4690>>, 159.0429, <<-115.0201, -680.6793, 34.1122>>, 159.4947)
AND SETUP_REQ_GOLD_TROLLEYS_IN_VANS()
AND SETUP_REQ_CREW_IN_GOLD_VANS()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_CUSTOM_SWITCH_ASSETS()
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
//NEW_LOAD_SCENE_START(<<125.4, -1184.8, 30.1>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-11.3, 0.0, -60.8>>), 20.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
NEW_LOAD_SCENE_START_SPHERE(<<134.9, -1181.2, 28.6>>, 12.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
ENDIF
IF SETUP_REQ_FRANKLIN(<<128.9, -1181.3, 30.0>>, 0.0, TRUE)
AND SETUP_REQ_LESTER(<<126.2, -1186.9, 29.0>>, 0.0, TRUE)
AND SETUP_REQ_HACKER(<<124.2, -1186.9, 29.0>>, 0.0, TRUE)
AND SETUP_REQ_TRAFFIC_LAPTOPS(<<127.4, -1184.4, 29.6>>, <<126.7, -1184.2, 29.6>>, 0.0, 0.0, TRUE)
AND SETUP_REQ_CHASE_CARS_START(TRUE)
AND HAVE_CUSTOM_SWITCH_ASSETS_LOADED()
AND IS_NEW_LOAD_SCENE_ACTIVE()
HIDE_JUNK_FOR_SWITCH_CUTSCENE(TRUE)
SETUP_REQ_CHASE_CARS_START()
SETUP_REQ_FRANKLIN(<<128.9, -1181.3, 30.0>>)
SETUP_REQ_LESTER(<<126.2, -1186.9, 29.0>>, 0.0)
SETUP_REQ_HACKER(<<124.2, -1186.9, 29.0>>, 0.0)
SETUP_REQ_TRAFFIC_LAPTOPS(<<127.4, -1184.4, 29.6>>, <<126.7, -1184.2, 29.6>>, 0.0, 0.0)
SETUP_FRANKLIN_OUTFIT()
INITIALISE_TRAFFIC_GAME()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], <<138.4, -1212.8, 29.0>>)
FREEZE_ENTITY_POSITION(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(sGoldVans[0].veh)
SET_VEHICLE_RADIO_ENABLED(sGoldVans[0].veh, FALSE)
ENDIF
bTriggeredTrafficIntro = FALSE
IF IS_SCREEN_FADED_OUT()
WHILE GET_NUMBER_OF_STREAMING_REQUESTS() > 0
WAIT(0)
ENDWHILE
DO_FADE_IN_WITH_WAIT()
ENDIF
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
SWITCH iCurrentEvent
CASE 0 //Start the switch
INFORM_MISSION_STATS_OF_INCREMENT(FH2A_SWITCHES)
DISABLE_SELECTOR_THIS_FRAME()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], <<134.9, -1181.2, 28.6>>)
FREEZE_ENTITY_POSITION(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
SET_VEHICLE_DOORS_SHUT(sGoldCars[PLAYERS_GOLD_CAR].veh, TRUE)
ENDIF
CLEAR_PRINTS()
SETTIMERB(0)
eSwitchCamState = SWITCH_CAM_START_SPLINE1
iCurrentEvent++
FALLTHRU
CASE 1 //Run the switch and request all lead-in assets
REQUEST_STREAMED_TEXTURE_DICT(strTrafficTextures)
REQUEST_WAYPOINT_RECORDING(strWaypointVehTrafficMain)
IF NOT bRequestedTrafficScaleform
sfTrafficHud = REQUEST_SCALEFORM_MOVIE("traffic_cam")
bRequestedTrafficScaleform = TRUE
ENDIF
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
eSectionStage = SECTION_STAGE_SKIP
ENDIF
IF HANDLE_SWITCH_CAM(scsSwitchCam)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
CLEAR_PED_TASKS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
CLEAR_PED_TASKS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
ENDIF
//Reposition the vans to where they start in the traffic control game.
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
OR IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
ENDIF
SET_ENTITY_COORDS(sGoldVans[0].veh, <<-110.3915, -667.8174, 34.4690>>)
SET_ENTITY_HEADING(sGoldVans[0].veh, 159.0429)
SET_ENTITY_LOAD_COLLISION_FLAG(sGoldVans[0].veh, TRUE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sGoldVans[0].veh, TRUE)
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, TRUE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
OR IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
ENDIF
SET_ENTITY_COORDS(sGoldVans[1].veh, <<-115.0201, -680.6793, 34.1122>>)
SET_ENTITY_HEADING(sGoldVans[1].veh, 159.4947)
SET_ENTITY_LOAD_COLLISION_FLAG(sGoldVans[1].veh, TRUE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sGoldVans[1].veh, TRUE)
FREEZE_ENTITY_POSITION(sGoldVans[1].veh, TRUE)
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
TRIGGER_MUSIC_EVENT("FH2A_TRAFFIC_START")
IF HAS_STREAMED_TEXTURE_DICT_LOADED(strTrafficTextures)
AND HAS_SCALEFORM_MOVIE_LOADED(sfTrafficHud)
UPDATE_TRAFFIC_GAME() //Draws the loading overlay.
ENDIF
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
BREAK
ENDSWITCH
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
RELEASE_NAMED_SCRIPT_AUDIO_BANK(strAudioBankBigScoreLaptop)
REMOVE_ANIM_DICT(strAnimsCamShake)
NEW_LOAD_SCENE_STOP()
SET_TIME_SCALE(1.0)
CLEAR_FOCUS()
STOP_SOUND(iWooshSoundID)
KILL_FACE_TO_FACE_CONVERSATION()
eMissionStage = STAGE_TRAFFIC_CONTROL
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_TRAFFIC_CONTROL)
ENDIF
ENDPROC
PROC DO_TRAFFIC_CONTROL()
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() //Fix for bug 2176432
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
//NOTE: this is a checkpoint stage, but we shouldn't need to load the map as the splash screen hides everything.
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<44.0696, -870.6827, 29.4558>>) //This is a central point in the traffic grid, which should help with collision/streaming.
IF SETUP_REQ_PLAYER_IS_FRANKLIN()
IF SETUP_REQ_MICHAEL(<<140.4548, -1202.2416, 28.2951>>)
AND SETUP_REQ_TREVOR(<<141.4548, -1202.2416, 28.2951>>)
AND SETUP_REQ_MAIN_DRIVER(<<124.5559, -1190.2872, 28.2951>>, 173.7492)
AND SETUP_REQ_MAIN_GUNMAN(<<125.5559, -1190.2872, 28.2951>>, 173.7492)
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-1.900313,-666.880005,15.1306>>, -127.999458)
AND SETUP_REQ_CHASE_CARS_START()
AND SETUP_REQ_GOLD_VANS_POST_HIJACK(<<-110.3915, -667.8174, 34.4690>>, 159.0429, <<-115.0201, -680.6793, 34.1122>>, 159.4947)
AND SETUP_REQ_GOLD_TROLLEYS_IN_VANS()
AND SETUP_REQ_CREW_IN_GOLD_VANS()
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
SETUP_FRANKLIN_OUTFIT()
bTriggeredTrafficIntro = FALSE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
REQUEST_STREAMED_TEXTURE_DICT(strTrafficTextures)
REQUEST_WAYPOINT_RECORDING(strWaypointVehTrafficMain)
IF NOT bRequestedTrafficScaleform
sfTrafficHud = REQUEST_SCALEFORM_MOVIE("traffic_cam")
bRequestedTrafficScaleform = TRUE
ENDIF
IF HAS_STREAMED_TEXTURE_DICT_LOADED(strTrafficTextures)
AND HAS_SCALEFORM_MOVIE_LOADED(sfTrafficHud)
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehTrafficMain)
INITIALISE_TRAFFIC_GAME()
CLEAR_TRIGGERED_LABELS()
//Remove all assets from the lead-in.
REMOVE_OBJECT(objWalkieTalkie, TRUE)
REMOVE_OBJECT(objLaptops[0], TRUE)
REMOVE_OBJECT(objLaptops[1], TRUE)
REMOVE_OBJECT(objwalkingStick, TRUE)
REMOVE_PED(pedLester, TRUE)
REMOVE_PED(sCrew[CREW_HACKER].ped, TRUE)
REMOVE_ANIM_DICT(strAnimsTrafficSwitch)
SET_TIME_SCALE(1.0) // In case the switch cutscene was skipped.
CLEAR_AREA(<<-110.3915, -667.8174, 34.4690>>, 100.0, TRUE)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SET_ENTITY_LOAD_COLLISION_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
CLEAR_PED_TASKS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_ENTITY_LOAD_COLLISION_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
IF NOT IS_ENTITY_DEAD(sGoldVans[1].veh)
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh, VS_DRIVER)
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(sGoldVans[0].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
OR IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
ENDIF
SET_ENTITY_HEADING(sGoldVans[0].veh, 159.0429)
SET_ENTITY_COORDS(sGoldVans[0].veh, <<-110.3915, -667.8174, 34.4690>>)
SET_ENTITY_LOAD_COLLISION_FLAG(sGoldVans[0].veh, TRUE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sGoldVans[0].veh, TRUE)
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, TRUE)
SET_ENTITY_VELOCITY(sGoldVans[0].veh, <<0.0, 0.0, 0.0>>)
SET_VEHICLE_TYRE_FIXED(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_RIGHT) //In case this tyre was deliberately burst earlier, it may mess up the AI.
SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_ENTITY_COORDS(sGoldVans[0].veh) - <<0.0, 0.0, 5.0>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(sGoldVans[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
OR IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
ENDIF
CLEAR_AREA_OF_VEHICLES(<<-115.0201, -680.6793, 34.1122>>, 10.0)
SET_ENTITY_HEADING(sGoldVans[1].veh, 159.4947)
SET_ENTITY_COORDS(sGoldVans[1].veh, <<-115.0201, -680.6793, 34.1122>>)
SET_ENTITY_LOAD_COLLISION_FLAG(sGoldVans[1].veh, TRUE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sGoldVans[1].veh, TRUE)
SET_ENTITY_VELOCITY(sGoldVans[1].veh, <<0.0, 0.0, 0.0>>)
FREEZE_ENTITY_POSITION(sGoldVans[1].veh, TRUE)
ENDIF
IF NOT DOES_CAM_EXIST(camMain)
DESTROY_CAM(camMain)
ENDIF
IF IS_SCREEN_FADED_OUT()
LOAD_SCENE(<<44.0696, -870.6827, 29.4558>>)
WAIT(0)
ENDIF
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), FALSE)
SET_CREATE_RANDOM_COPS(FALSE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_POPULATION_BUDGET(0)
SET_PED_POPULATION_BUDGET(1)
SET_RANDOM_TRAINS(FALSE)
sbiTrafficControl = ADD_SCENARIO_BLOCKING_AREA(<<-9999.9, -9999.9, -9999.9>>, <<9999.9, 9999.9, 9999.9>>)
CLEAR_AREA(<<-111.8524, -673.9980, 34.3226>>, 1000.0, TRUE)
camMain = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", vTrafficGameMainCamPos, vTrafficGameMainCamRot, fTrafficGameMainCamFOV, TRUE)
SET_TIMECYCLE_MODIFIER("traffic_skycam")
SET_NOISEOVERIDE(TRUE)
SET_NOISINESSOVERIDE(sTrafficGame.fNoiseLevel)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE,DEFAULT, DEFAULT, TRUE)
SET_CAM_FAR_CLIP(camMain, 1000.0)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 7, NULL, "LESTER")
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, NULL, "FRANKLIN")
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(TRUE)
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE)
SETTIMERA(0)
//Disable all controls at first, so the player can't do things during the loading screen.
sTrafficGame.bAllowMovement = FALSE
sTrafficGame.bAllowCamSwitch = FALSE
sTrafficGame.bAllowSwitch = FALSE
//1836183 - If there's rain falling then change the weather type for the traffic control section.
IF IS_PREV_WEATHER_TYPE("RAIN")
OR IS_PREV_WEATHER_TYPE("THUNDER")
SET_WEATHER_TYPE_NOW("CLEAR")
ENDIF
IF NOT IS_SCREEN_FADED_IN()
TRIGGER_MUSIC_EVENT("FH2A_TRAFFIC_RESTART")
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_IN()
UPDATE_TRAFFIC_GAME()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
WAIT(0)
ENDWHILE
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_TRAFFIC_CONTROL_STAGE")
START_AUDIO_SCENE("BS_2A_TRAFFIC_CONTROL_STAGE")
ENDIF
bTrafficEndStreamingActive = FALSE
bTCPrimedTrevorNearMissDialogue = FALSE
bTCPrimedMichaelNearMissDialogue = FALSE
bMichaelReachedTrafficFinish = FALSE
bTrevorReachedTrafficFinish = FALSE
iRedLightDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 12000)
iRedLightHornTimer = 0
iTrafficBlipFlashTimer = 0
iTrafficLightOverrideEvent = 0
iTimeOfLastTrafficSwitch = 0
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_TRAFFIC_CONTROL, "TRAFFIC_CONTROL")
iTrafficControlHelpEvent = 0
iTrafficInstructionEvent = 0
iTCDialogueTimer = 0
iTrafficHighlightEvent = 0
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ELSE
//If we didn't skip here make sure the traffic game loading screen is drawn if we're waiting for assets to stream.
IF NOT IS_SCREEN_FADED_OUT()
IF HAS_STREAMED_TEXTURE_DICT_LOADED(strTrafficTextures)
AND HAS_SCALEFORM_MOVIE_LOADED(sfTrafficHud)
UPDATE_TRAFFIC_GAME()
ENDIF
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
//Handle the sequence of help: as help displays new buttons are unlocked
SWITCH iTrafficControlHelpEvent
CASE 0 //Franklin says "I'm in".
//Wait until the loading screen is done.
IF TIMERA() > 3000
sTrafficGame.bAllowMovement = FALSE
sTrafficGame.bAllowCamSwitch = TRUE
sTrafficGame.bAllowSwitch = TRUE
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_CAM", CONV_PRIORITY_MEDIUM)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, FALSE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sGoldVans[0].veh, TRUE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
FREEZE_ENTITY_POSITION(sGoldVans[1].veh, FALSE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sGoldVans[1].veh, TRUE)
ENDIF
iTrafficControlHelpEvent++
ENDIF
ENDIF
ELIF TIMERA() < 1000
//1902102 - Trevor's van seems to be sliding around the map for unknown reasons, repeatedly force it into the correct position while the scaleform intro is running.
IF NOT IS_ENTITY_DEAD(sGoldVans[1].veh)
SET_ENTITY_HEADING(sGoldVans[1].veh, 159.4947)
SET_ENTITY_COORDS(sGoldVans[1].veh, <<-115.0201, -680.6793, 34.1122>>)
ENDIF
ENDIF
BREAK
CASE 1 //God text.
//Once loading screen has finished display the god text.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
SETTIMERA(0)
PRINT_NOW("F3A_TRAFFIC", DEFAULT_GOD_TEXT_TIME, 0)
bHasTextLabelTriggered[F3A_TRAFFIC] = TRUE
iTrafficControlHelpEvent++
ENDIF
BREAK
CASE 2 //Overall description of game.
IF TIMERA() > 2000
SETTIMERA(0)
PRINT_HELP("F3A_TRAFDESC")
iTrafficControlHelpEvent++
IF iTrafficBlipFlashTimer = 0
iTrafficBlipFlashTimer = GET_GAME_TIMER() //This triggers the van blips to be revealed.
ENDIF
ENDIF
BREAK
CASE 3 //Switch lights help.
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
OR (sTrafficGame.bAllowMovement AND TIMERA() > 5000) //Display early if the player already switched lights
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
PRINT_HELP_FOREVER("F3A_TRAFHELP1A_KM")
ELSE
PRINT_HELP_FOREVER("F3A_TRAFHELP1A")
ENDIF
SETTIMERA(0)
iTrafficControlHelpEvent++
ENDIF
BREAK
CASE 4 //Cursor help.
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
IF bPCCursorAccept
OR (sTrafficGame.bAllowMovement AND TIMERA() > 5000)
SETTIMERA(0)
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
PRINT_HELP("F3A_TRAFHELP1C_KM")
ELSE
PRINT_HELP("F3A_TRAFHELP1C")
ENDIF
iTrafficControlHelpEvent++
ENDIF
ELSE
IF (IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SPRINT) AND TIMERA() > 1000)
OR (sTrafficGame.bAllowMovement AND TIMERA() > 5000)
SETTIMERA(0)
PRINT_HELP("F3A_TRAFHELP1C")
iTrafficControlHelpEvent++
ENDIF
ENDIF
BREAK
CASE 5 //Junction cam help.
IF (IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_VEH_CIN_CAM) OR IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL))
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_TRAFHELP1B")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_TRAFHELP1C")
CLEAR_HELP()
ENDIF
// Keyboard and mouse control help
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_TRAFHELP1B_KM")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_TRAFHELP1C_KM")
CLEAR_HELP()
ENDIF
ENDIF
//Camera moving help.
IF sTrafficGame.bJunctionCamActive
AND iHackerLevel = HACKER_LEVEL_GOOD
IF NOT bHasTextLabelTriggered[F3A_TRAFHELP1D]
AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_TRAFHELP3") //Merryweather help takes priority.
IF NOT IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
PRINT_HELP("F3A_TRAFHELP1D")
ELSE
PRINT_HELP("F3A_TRAFHELP1D_KM")
ENDIF
bHasTextLabelTriggered[F3A_TRAFHELP1D] = TRUE
bHasTextLabelTriggered[F3A_TRAFHELP1B] = TRUE //Don't need to show this any more.
ENDIF
ENDIF
ELSE
//Clear move cam help
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_TRAFHELP1D")
CLEAR_HELP()
ENDIF
//Clear cursor help as when the player moves the cursor.
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_TRAFHELP1C")
AND TIMERA() > 3000
IF ABSI(GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_MOVE_LR) - 128) > 10
OR ABSI(GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_MOVE_UD) - 128) > 10
CLEAR_HELP()
ENDIF
ENDIF
//Clear cursor help as when the player moves the cursor.
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_TRAFHELP1C_KM")
AND TIMERA() > 3000
IF bPCCursorMoved
CLEAR_HELP()
ENDIF
ENDIF
ENDIF
//Use cam help.
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
AND NOT sTrafficGame.bJunctionCamActive
AND iHackerLevel = HACKER_LEVEL_GOOD
IF NOT bHasTextLabelTriggered[F3A_TRAFHELP1B]
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
PRINT_HELP("F3A_TRAFHELP1B_KM")
ELSE
PRINT_HELP("F3A_TRAFHELP1B")
ENDIF
bHasTextLabelTriggered[F3A_TRAFHELP1B] = TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
//Hacker gives an intro as soon as the god text is finished.
IF NOT bHasTextLabelTriggered[FH3A_HACK]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND bHasTextLabelTriggered[F3A_TRAFFIC]
TEXT_LABEL strLabel
TEXT_LABEL strCrewVoiceName = ""
CrewMember eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER)
IF iHackerLevel = HACKER_LEVEL_GOOD
IF eCrewID = CM_HACKER_G_PAIGE
strLabel = "FH3A_HACK1"
strCrewVoiceName = "PAIGE"
ELIF eCrewID = CM_HACKER_M_CHRIS
strLabel = "FH3A_HACK2b"
strCrewVoiceName = "CHRISTIAN"
ELIF eCrewID = CM_HACKER_B_RICKIE_UNLOCK
strLabel = "FH3A_HACK3c"
strCrewVoiceName = "LIEngineer"
ENDIF
ELIF iHackerLevel = HACKER_LEVEL_MEDIUM
IF eCrewID = CM_HACKER_M_CHRIS
strLabel = "FH3A_HACK2"
strCrewVoiceName = "CHRISTIAN"
ELIF eCrewID = CM_HACKER_B_RICKIE_UNLOCK
strLabel = "FH3A_HACK3b"
strCrewVoiceName = "LIEngineer"
ENDIF
ELSE
strLabel = "FH3A_HACK3"
strCrewVoiceName = "LIEngineer"
ENDIF
ADD_PED_FOR_DIALOGUE(sConversationPeds, 7, NULL, strCrewVoiceName)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_HACK] = TRUE
ENDIF
ENDIF
ELSE
//Play dialogue whenever the lights are switched.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF iTimeOfLastTrafficSwitch != 0
INT iTimeSinceLastSwitch = GET_GAME_TIMER() - iTimeOfLastTrafficSwitch
IF iTimeSinceLastSwitch < 200
TEXT_LABEL strLabel
TEXT_LABEL strCrewVoiceName = ""
CrewMember eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER)
IF iHackerLevel = HACKER_LEVEL_GOOD
IF eCrewID = CM_HACKER_G_PAIGE
strLabel = "FH3A_HLIGHT1"
strCrewVoiceName = "PAIGE"
ELIF eCrewID = CM_HACKER_M_CHRIS
strLabel = "FH3A_HLIGHT4"
strCrewVoiceName = "CHRISTIAN"
ELIF eCrewID = CM_HACKER_B_RICKIE_UNLOCK
strLabel = "FH3A_HLIGHT5"
strCrewVoiceName = "LIEngineer"
ENDIF
ELIF iHackerLevel = HACKER_LEVEL_MEDIUM
IF eCrewID = CM_HACKER_M_CHRIS
strLabel = "FH3A_HLIGHT2"
strCrewVoiceName = "CHRISTIAN"
ELIF eCrewID = CM_HACKER_B_RICKIE_UNLOCK
strLabel = "FH3A_HLIGHT3"
strCrewVoiceName = "LIEngineer"
ENDIF
ELSE
strLabel = "FH3A_HLIGHT6"
strCrewVoiceName = "LIEngineer"
ENDIF
ADD_PED_FOR_DIALOGUE(sConversationPeds, 7, NULL, strCrewVoiceName)
CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
ENDIF
ENDIF
ENDIF
ENDIF
//Movement starts off disabled, enable once the player changes the first lights
//(also enable straight away on a retry).
IF NOT sTrafficGame.bAllowMovement
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SPRINT)
OR bPCCursorAccept
OR bRetryingTrafficSection
sTrafficGame.bAllowMovement = TRUE
//If the vans haven't been flashed yet just bypass it.
IF iTrafficBlipFlashTimer = 0
iTrafficBlipFlashTimer = GET_GAME_TIMER() - 5000
ENDIF
ENDIF
ENDIF
//Handle van and cops behaviour
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
VECTOR vMichaelPos = GET_ENTITY_COORDS(sGoldVans[0].veh)
VECTOR vTrevorPos = GET_ENTITY_COORDS(sGoldVans[1].veh)
VECTOR vFrontVanPos, vRearVanPos
INT iMichaelClosestWaypoint, iTrevorClosestWaypoint
//Work out which van is at the front: this is used later to determine triggers for dialogue, cops etc.
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointVehTrafficMain, vMichaelPos, iMichaelClosestWaypoint)
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointVehTrafficMain, vTrevorPos, iTrevorClosestWaypoint)
IF iMichaelClosestWaypoint > iTrevorClosestWaypoint
vFrontVanPos = vMichaelPos
vRearVanPos = vTrevorPos
ELSE
vFrontVanPos = vTrevorPos
vRearVanPos = vMichaelPos
ENDIF
REQUEST_MODEL(modelMerryCar)
REQUEST_MODEL(modelMerryweather)
//NOTE: Main car path through the current set of junctions is this (numbers correspond to the array elements):
// 0 1 ..... 2 ..... 3
// . . .
// . . .
// 4 ..... 5 6 ..... 7
// .
// .
// 8 9 10
// .
// .
// EXIT
SWITCH iCurrentEvent
CASE 0 //Once the first cop car is created play some dialogue.
IF DOES_ENTITY_EXIST(sTrafficGameCops[0].veh)
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 1
IF ((NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData) AND TIMERB() > 3000) OR TIMERB() > 10000)
AND NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
IF NOT bHasTextLabelTriggered[F3A_TRAFHELP3]
PRINT_HELP("F3A_TRAFHELP3")
bHasTextLabelTriggered[F3A_TRAFHELP3] = TRUE
ENDIF
ENDIF
IF VDIST2(vFrontVanPos, sTrafficJunction[7].sCrossings[TC_NORTH_JUNCTION].vCentre) < 1600.0
iCurrentEvent = 100
ENDIF
BREAK
CASE 100
//Request next cutscene assets in advance
REQUEST_VEHICLE_RECORDING(CARREC_COPS_VAN_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_COPS_VAN_2, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_COPS_COP_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_COPS_COP_2, strCarrec)
IF NOT bMichaelReachedTrafficFinish
bMichaelReachedTrafficFinish = IS_ENTITY_IN_ANGLED_AREA(sGoldVans[0].veh, <<78.806602,-1170.024292,28.179527>>, <<43.142773,-1173.263062,37.764736>>, 6.000000)
ENDIF
IF NOT bTrevorReachedTrafficFinish
bTrevorReachedTrafficFinish = IS_ENTITY_IN_ANGLED_AREA(sGoldVans[1].veh, <<78.806602,-1170.024292,28.179527>>, <<43.142773,-1173.263062,37.764736>>, 6.000000)
ENDIF
IF bMichaelReachedTrafficFinish
AND bTrevorReachedTrafficFinish
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
BREAK
ENDSWITCH
//Need to rewrite: create an UPDATE_TC_ENEMIES proc to handle this and the processing.
//Create the enemy cars when the player reaches certain bits of the chase
IF NOT sTrafficGameCops[0].bIsCreated
REQUEST_WAYPOINT_RECORDING(strWaypointVehTCGoon1)
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehTCGoon1)
IF VDIST2(vFrontVanPos, sTrafficJunction[4].sCrossings[TC_NORTH_JUNCTION].vCentre) < 10000.0
IF CREATE_TRAFFIC_CAR_USING_WAYPOINT(sTrafficGameCops[0], modelMerryCar, modelMerryweather, strWaypointVehTCGoon1, TRUE)
SET_VEHICLE_COLOURS(sTrafficGameCops[0].veh, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
SET_VEHICLE_EXTRA_COLOURS(sTrafficGameCops[0].veh, MERRY_CAR_COLOUR, 0)
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(sTrafficGameCops[0].veh, "0")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT sTrafficGameCops[1].bIsCreated
REQUEST_WAYPOINT_RECORDING(strWaypointVehTCGoon2)
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehTCGoon2)
IF VDIST2(vFrontVanPos, sTrafficJunction[5].sCrossings[TC_WEST_JUNCTION].vCentre) < 900.0
IF CREATE_TRAFFIC_CAR_USING_WAYPOINT(sTrafficGameCops[1], modelMerryCar, modelMerryweather, strWaypointVehTCGoon2, TRUE)
SET_VEHICLE_COLOURS(sTrafficGameCops[1].veh, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
SET_VEHICLE_EXTRA_COLOURS(sTrafficGameCops[1].veh, MERRY_CAR_COLOUR, 0)
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(sTrafficGameCops[1].veh, "1")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT sTrafficGameCops[2].bIsCreated
REQUEST_WAYPOINT_RECORDING(strWaypointVehTCGoon3)
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehTCGoon3)
IF VDIST2(vFrontVanPos, sTrafficJunction[3].sCrossings[TC_WEST_JUNCTION].vCentre) < 900.0
IF CREATE_TRAFFIC_CAR_USING_WAYPOINT(sTrafficGameCops[2], modelMerryCar, modelMerryweather, strWaypointVehTCGoon4, TRUE)
SET_VEHICLE_COLOURS(sTrafficGameCops[2].veh, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
SET_VEHICLE_EXTRA_COLOURS(sTrafficGameCops[2].veh, MERRY_CAR_COLOUR, 0)
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(sTrafficGameCops[2].veh, "2")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT sTrafficGameCops[3].bIsCreated
REQUEST_WAYPOINT_RECORDING(strWaypointVehTCGoon4)
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehTCGoon4)
IF VDIST2(vFrontVanPos, sTrafficJunction[7].sCrossings[TC_WEST_JUNCTION].vCentre) < 3600.0
IF CREATE_TRAFFIC_CAR_USING_WAYPOINT(sTrafficGameCops[3], modelMerryCar, modelMerryweather, strWaypointVehTCGoon3, TRUE)
SET_VEHICLE_COLOURS(sTrafficGameCops[3].veh, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
SET_VEHICLE_EXTRA_COLOURS(sTrafficGameCops[3].veh, MERRY_CAR_COLOUR, 0)
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(sTrafficGameCops[3].veh, "3")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT sTrafficGameCops[4].bIsCreated
REQUEST_WAYPOINT_RECORDING(strWaypointVehTCGoon5)
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehTCGoon5)
IF VDIST2(vFrontVanPos, sTrafficJunction[7].sCrossings[TC_NORTH_JUNCTION].vCentre) < 3600.0
IF CREATE_TRAFFIC_CAR_USING_WAYPOINT(sTrafficGameCops[4], modelMerryCar, modelMerryweather, strWaypointVehTCGoon5, TRUE)
SET_VEHICLE_COLOURS(sTrafficGameCops[4].veh, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
SET_VEHICLE_EXTRA_COLOURS(sTrafficGameCops[4].veh, MERRY_CAR_COLOUR, 0)
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(sTrafficGameCops[4].veh, "4")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT sTrafficGameCops[5].bIsCreated
REQUEST_WAYPOINT_RECORDING(strWaypointVehTCGoon6)
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehTCGoon6)
IF VDIST2(vFrontVanPos, sTrafficJunction[7].sCrossings[TC_NORTH_JUNCTION].vCentre) < 900.0
IF CREATE_TRAFFIC_CAR_USING_WAYPOINT(sTrafficGameCops[5], modelMerryCar, modelMerryweather, strWaypointVehTCGoon6, TRUE)
SET_VEHICLE_COLOURS(sTrafficGameCops[5].veh, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
SET_VEHICLE_EXTRA_COLOURS(sTrafficGameCops[5].veh, MERRY_CAR_COLOUR, 0)
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(sTrafficGameCops[5].veh, "5")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Highlight enemy cars as they enter the screen, also play dialogue when the flash occurs
SWITCH iTrafficHighlightEvent
CASE 0
IF NOT IS_ENTITY_DEAD(sTrafficGameCops[0].veh)
IF IS_ENTITY_ON_SCREEN(sTrafficGameCops[0].veh)
sTrafficGameCops[0].iFlashTimer = GET_GAME_TIMER()
sTrafficGame.vehIndicatorTarget = sTrafficGameCops[0].veh
iTCDialogueTimer = GET_GAME_TIMER()
iTrafficHighlightEvent++
ENDIF
ENDIF
BREAK
CASE 1
IF NOT IS_ENTITY_DEAD(sTrafficGameCops[1].veh)
IF IS_ENTITY_ON_SCREEN(sTrafficGameCops[1].veh)
sTrafficGameCops[1].iFlashTimer = GET_GAME_TIMER()
sTrafficGame.vehIndicatorTarget = sTrafficGameCops[1].veh
iTCDialogueTimer = GET_GAME_TIMER()
iTrafficHighlightEvent++
ENDIF
ENDIF
BREAK
CASE 2
IF NOT IS_ENTITY_DEAD(sTrafficGameCops[2].veh)
IF IS_ENTITY_ON_SCREEN(sTrafficGameCops[2].veh)
sTrafficGameCops[2].iFlashTimer = GET_GAME_TIMER()
sTrafficGame.vehIndicatorTarget = sTrafficGameCops[2].veh
iTCDialogueTimer = GET_GAME_TIMER()
iTrafficHighlightEvent++
ENDIF
ENDIF
BREAK
CASE 3
IF NOT IS_ENTITY_DEAD(sTrafficGameCops[3].veh)
IF IS_ENTITY_ON_SCREEN(sTrafficGameCops[3].veh)
sTrafficGameCops[3].iFlashTimer = GET_GAME_TIMER()
sTrafficGame.vehIndicatorTarget = sTrafficGameCops[3].veh
iTCDialogueTimer = GET_GAME_TIMER()
iTrafficHighlightTimer = 0
iTrafficHighlightEvent++
ENDIF
ENDIF
BREAK
CASE 4
IF NOT IS_ENTITY_DEAD(sTrafficGameCops[4].veh)
IF IS_ENTITY_ON_SCREEN(sTrafficGameCops[4].veh)
IF iTrafficHighlightTimer = 0
iTrafficHighlightTimer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - iTrafficHighlightTimer > 7000
sTrafficGameCops[4].iFlashTimer = GET_GAME_TIMER()
sTrafficGame.vehIndicatorTarget = sTrafficGameCops[4].veh
iTCDialogueTimer = GET_GAME_TIMER()
iTrafficHighlightEvent++
ENDIF
ENDIF
ENDIF
BREAK
CASE 5
IF NOT IS_ENTITY_DEAD(sTrafficGameCops[5].veh)
IF IS_ENTITY_ON_SCREEN(sTrafficGameCops[5].veh)
sTrafficGameCops[5].iFlashTimer = GET_GAME_TIMER()
sTrafficGame.vehIndicatorTarget = sTrafficGameCops[5].veh
iTCDialogueTimer = GET_GAME_TIMER()
iTrafficHighlightEvent++
ENDIF
ENDIF
BREAK
ENDSWITCH
//Some lights are fudged to green at specific points, to force the player to change them.
SWITCH iTrafficLightOverrideEvent
CASE 0 //First enemy car: set the the first lights they approach to green.
IF NOT IS_ENTITY_DEAD(sTrafficGameCops[0].veh)
IF VDIST2(GET_ENTITY_COORDS(sTrafficGameCops[0].veh), sTrafficJunction[7].vCentre) < 22500.0
IF GET_GAME_TIMER() - sTrafficJunction[7].iChangeTimer > 2000
IF sTrafficJunction[7].sCrossings[TC_EAST_JUNCTION].bIsBlocked
INT j
REPEAT 4 j
sTrafficJunction[7].sCrossings[j].bIsBlocked = NOT sTrafficJunction[7].sCrossings[j].bIsBlocked
ENDREPEAT
ENDIF
sTrafficJunction[7].iChangeTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(-3000, 3000)
iTrafficLightOverrideEvent++
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
//While the indicator is flashing play some relevant dialogue.
IF GET_GAME_TIMER() - iTCDialogueTimer < 5000
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND bHasTextLabelTriggered[FH3A_HACK]
IF sTrafficGame.vehIndicatorTarget = sTrafficGameCops[0].veh
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MERRYE", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_FSEES] = TRUE
iTCDialogueTimer -= 20000 //Prevents the dialogue triggering again until a new car appears.
ENDIF
ELIF sTrafficGame.vehIndicatorTarget = sTrafficGameCops[1].veh
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MERRY", CONV_PRIORITY_MEDIUM)
iTCDialogueTimer -= 20000
ENDIF
ELIF sTrafficGame.vehIndicatorTarget = sTrafficGameCops[2].veh
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MERRYW", CONV_PRIORITY_MEDIUM)
iTCDialogueTimer -= 20000
ENDIF
ELIF sTrafficGame.vehIndicatorTarget = sTrafficGameCops[3].veh
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MERRYS", CONV_PRIORITY_MEDIUM)
iTCDialogueTimer -= 20000
ENDIF
/*ELIF sTrafficGame.vehIndicatorTarget = sTrafficGameCops[4].veh
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MERRYS", CONV_PRIORITY_MEDIUM)
iTCDialogueTimer -= 20000
ENDIF*/
ELIF sTrafficGame.vehIndicatorTarget = sTrafficGameCops[5].veh
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MERRYN", CONV_PRIORITY_MEDIUM)
iTCDialogueTimer -= 20000
ENDIF
ENDIF
ENDIF
//Update main vans
TRAFFIC_CAR_STATE eMichaelState, eTrevorState
IF sTrafficGame.bAllowSwitch
eMichaelState = UPDATE_TRAFFIC_CAR_WAYPOINT_MOVEMENT(sGoldVans[0].veh, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], strWaypointVehTrafficMain, DRIVINGMODE_STOPFORCARS_IGNORELIGHTS, sGoldVans[1].veh)
eTrevorState = UPDATE_TRAFFIC_CAR_WAYPOINT_MOVEMENT(sGoldVans[1].veh, sSelectorPeds.pedID[SELECTOR_PED_TREVOR], strWaypointVehTrafficMain, DRIVINGMODE_STOPFORCARS_IGNORELIGHTS)
ELSE
eMichaelState = TC_STATE_MOVING
eTrevorState = TC_STATE_MOVING
ENDIF
//Update cops: always driving, currently they stop at the lights.
INT iNumCopCarsProcessedThisFrame = 0
INT iNumCopCars = COUNT_OF(sTrafficGameCops)
WHILE iCurrentCopCarToProcess < iNumCopCars
AND iNumCopCarsProcessedThisFrame < 2
UPDATE_TRAFFIC_GAME_CAR(sTrafficGameCops[iCurrentCopCarToProcess], sTrafficGameCops[iCurrentCopCarToProcess].strCurrentWaypoint,
<<0.0, 0.0, 0.0>>, DRIVINGMODE_STOPFORCARS_IGNORELIGHTS)
IF NOT IS_ENTITY_DEAD(sTrafficGameCops[iCurrentCopCarToProcess].veh)
//Delete the car once it's out of view of the main cam.
IF sTrafficGameCops[iCurrentCopCarToProcess].bIsOffScreen
REMOVE_PED(sTrafficGameCops[iCurrentCopCarToProcess].ped, TRUE)
REMOVE_VEHICLE(sTrafficGameCops[iCurrentCopCarToProcess].veh, TRUE)
ENDIF
ENDIF
iNumCopCarsProcessedThisFrame++
iCurrentCopCarToProcess++
ENDWHILE
IF iCurrentCopCarToProcess >= iNumCopCars
iCurrentCopCarToProcess = 0
ENDIF
//Update traffic cars when viewing a junction: when they get too far from the current junction warp them back in a random off-screen spot.
//NOTE: the number of cars processed per frame is limited as it's CPU-heavy, there shouldn't be anything in here that needs to be called every frame.
INT iNumTrafficProcessedThisFrame = 0
INT iNumTrafficCars = COUNT_OF(sTrafficGameCars)
WHILE iCurrentTrafficCarToProcess < iNumTrafficCars
AND iNumTrafficProcessedThisFrame < 3
IF NOT sTrafficGameCars[iCurrentTrafficCarToProcess].bIsCreated
//Create traffic car.
REQUEST_MODEL(modelDefaultTCCar)
REQUEST_MODEL(modelDefaultTCCar2)
REQUEST_MODEL(modelDefaultTCPed)
IF HAS_MODEL_LOADED(modelDefaultTCCar)
AND HAS_MODEL_LOADED(modelDefaultTCCar2)
AND HAS_MODEL_LOADED(modelDefaultTCPed)
IF GET_RANDOM_BOOL()
sTrafficGameCars[iCurrentTrafficCarToProcess].veh = CREATE_VEHICLE(modelDefaultTCCar, GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<iCurrentTrafficCarToProcess * 5.0, 0.0, 20.0>>)
ELSE
sTrafficGameCars[iCurrentTrafficCarToProcess].veh = CREATE_VEHICLE(modelDefaultTCCar2, GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<iCurrentTrafficCarToProcess * 5.0, 0.0, 20.0>>)
ENDIF
sTrafficGameCars[iCurrentTrafficCarToProcess].ped = CREATE_PED_INSIDE_VEHICLE(sTrafficGameCars[iCurrentTrafficCarToProcess].veh, PEDTYPE_MISSION, modelDefaultTCPed, VS_DRIVER)
sTrafficGameCars[iCurrentTrafficCarToProcess].bIsCreated = TRUE
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sTrafficGameCars[iCurrentTrafficCarToProcess].veh, TRUE)
FREEZE_ENTITY_POSITION(sTrafficGameCars[iCurrentTrafficCarToProcess].veh, TRUE)
ENDIF
ELSE
IF IS_VEHICLE_DRIVEABLE(sTrafficGameCars[iCurrentTrafficCarToProcess].veh)
IF sTrafficGame.bJunctionCamActive
//Update traffic cars.
UPDATE_TRAFFIC_CAR_TASK_MOVEMENT(sTrafficGameCars[iCurrentTrafficCarToProcess].veh, sTrafficGameCars[iCurrentTrafficCarToProcess].ped,
sTrafficGameCars[iCurrentTrafficCarToProcess].vCurrentDest, DRIVINGMODE_STOPFORCARS_IGNORELIGHTS)
//When the cars go off-screen put them back.
IF VDIST2(GET_ENTITY_COORDS(sTrafficGameCars[iCurrentTrafficCarToProcess].veh), sTrafficJunction[sTrafficGame.iSelection].vCentre) > 10000.0
AND NOT IS_ENTITY_ON_SCREEN(sTrafficGameCars[iCurrentTrafficCarToProcess].veh)
SET_TRAFFIC_CAR_RANDOM_POSITION_AROUND_JUNCTION(sTrafficGameCars[iCurrentTrafficCarToProcess], sTrafficGame.iSelection, TRUE, 60.0, 90.0)
ENDIF
ELSE
//If the car is in the way of the vans then warp it (only when using the overhead cam).
IF IS_ENTITY_IN_ANGLED_AREA(sTrafficGameCars[iCurrentTrafficCarToProcess].veh,
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[0].veh, <<0.0, 3.1, -0.66>>),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[0].veh, <<0.0, 10.1, 2.66>>), 6.0)
OR IS_ENTITY_IN_ANGLED_AREA(sTrafficGameCars[iCurrentTrafficCarToProcess].veh,
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[1].veh, <<0.0, 3.1, -0.66>>),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[1].veh, <<0.0, 10.1, 2.66>>), 6.0)
SET_ENTITY_COORDS(sTrafficGameCars[iCurrentTrafficCarToProcess].veh, GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<iCurrentTrafficCarToProcess * 5.0, 0.0, 20.0>>)
FREEZE_ENTITY_POSITION(sTrafficGameCars[iCurrentTrafficCarToProcess].veh, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
iNumTrafficProcessedThisFrame++
iCurrentTrafficCarToProcess++
ENDWHILE
IF iCurrentTrafficCarToProcess >= iNumTrafficCars
iCurrentTrafficCarToProcess = 0
ENDIF
//Get the closest junction to Michael and Trevor: these are used for a number of different things later (e.g. dialogue, fudging lights, etc).
INT iTrevorClosestJunction, iMichaelClosestJunction
FLOAT fTrevorClosestJunctionDist, fMichaelClosestJunctionDist
GET_CLOSEST_JUNCTION_TO_COORDS(vTrevorPos, iTrevorClosestJunction, fTrevorClosestJunctionDist)
GET_CLOSEST_JUNCTION_TO_COORDS(vMichaelPos, iMichaelClosestJunction, fMichaelClosestJunctionDist)
//B*1082122: Freeze lights that the player peds are close to, so they don't switch at the last second.
IF fTrevorClosestJunctionDist < 2500.0
sTrafficJunction[iTrevorClosestJunction].bLightsFrozen = TRUE
ELSE
IF (iMichaelClosestJunction != iTrevorClosestJunction)
OR (iMichaelClosestJunction = iTrevorClosestJunction AND fMichaelClosestJunctionDist > 2500.0)
sTrafficJunction[iTrevorClosestJunction].bLightsFrozen = FALSE
ENDIF
ENDIF
IF fMichaelClosestJunctionDist < 2500.0
sTrafficJunction[iMichaelClosestJunction].bLightsFrozen = TRUE
ELSE
IF (iMichaelClosestJunction != iTrevorClosestJunction)
OR (iMichaelClosestJunction = iTrevorClosestJunction AND fTrevorClosestJunctionDist > 2500.0)
sTrafficJunction[iMichaelClosestJunction].bLightsFrozen = FALSE
ENDIF
ENDIF
UPDATE_TRAFFIC_GAME()
//Set the player in a central point that should help stream the area.
VECTOR vPlayerPos = vTrafficGameMainCamPos
IF sTrafficGame.bJunctionCamActive
vPlayerPos = sTrafficJunction[sTrafficGame.iSelection].vCentre + <<0.0, 0.0, 4.0>>
ENDIF
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vPlayerPos) > 25.0
SET_ENTITY_COORDS(PLAYER_PED_ID(), vPlayerPos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), sTrafficJunction[sTrafficGame.iSelection].vCamRot.z)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
ENDIF
//Once the cars get close to the exit start streaming in the shootout area.
IF NOT bTrafficEndStreamingActive
IF NOT STREAMVOL_IS_VALID(svChaseStart)
IF VDIST2(vFrontVanPos, <<132.7, -1226.1, 29.8>>) < 40000.0
IF sTrafficGame.bJunctionStreamingActive
NEW_LOAD_SCENE_STOP()
sTrafficGame.bJunctionStreamingActive = FALSE
ENDIF
//svChaseStart = STREAMVOL_CREATE_SPHERE(<<132.7, -1226.1, 29.8>>, 15.0, FLAG_MAPDATA)
svChaseStart = STREAMVOL_CREATE_FRUSTUM(<<139.516541,-1184.388794,32.141018>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-4.597814,0.269738,161.160843>>), 70.0, FLAG_MAPDATA | FLAG_COLLISIONS_MOVER)
bTrafficEndStreamingActive = TRUE
ENDIF
ENDIF
ELSE
REQUEST_MODEL(modelHobo)
ENDIF
//DIALOGUE
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND bHasTextLabelTriggered[FH3A_HACK]
//Response to dialogue for first Merryweather car showing up.
IF bHasTextLabelTriggered[FH3A_FSEES]
IF NOT bHasTextLabelTriggered[FH3A_JUNCT2]
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_JUNCT2", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_JUNCT2] = TRUE
ENDIF
ENDIF
ENDIF
//Play some dialogue when the rear car is approaching the destination.
IF NOT bHasTextLabelTriggered[FH3A_NEARLY]
IF VDIST2(vRearVanPos, sTrafficJunction[9].sCrossings[TC_NORTH_JUNCTION].vCentre) < 10000.0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_NEARLY", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_NEARLY] = TRUE
ENDIF
ENDIF
ENDIF
//Play instructions from Franklin about which way to turn.
FLOAT fDistToNextJunction
SWITCH iTrafficInstructionEvent
CASE 0
fDistToNextJunction = VDIST2(vFrontVanPos, sTrafficJunction[4].sCrossings[TC_NORTH_JUNCTION].vCentre)
IF fDistToNextJunction < 6400.0
IF fDistToNextJunction > VDIST2(vFrontVanPos, sTrafficJunction[4].vCentre)
iTrafficInstructionEvent++
ELSE
//Currently testing not playing dialogue for the first turn, as Trevor also has dialogue here.
//IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LEFT", CONV_PRIORITY_MEDIUM)
iTrafficInstructionEvent++
//ENDIF
ENDIF
ENDIF
BREAK
CASE 1
fDistToNextJunction = VDIST2(vFrontVanPos, sTrafficJunction[5].sCrossings[TC_WEST_JUNCTION].vCentre)
IF fDistToNextJunction < 6400.0
IF fDistToNextJunction > VDIST2(vFrontVanPos, sTrafficJunction[5].vCentre)
iTrafficInstructionEvent++
ELSE
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LEFT", CONV_PRIORITY_MEDIUM)
iTrafficInstructionEvent++
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
fDistToNextJunction = VDIST2(vFrontVanPos, sTrafficJunction[1].sCrossings[TC_SOUTH_JUNCTION].vCentre)
IF fDistToNextJunction < 6400.0
IF fDistToNextJunction > VDIST2(vFrontVanPos, sTrafficJunction[1].vCentre)
iTrafficInstructionEvent++
ELSE
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RIGHT", CONV_PRIORITY_MEDIUM)
iTrafficInstructionEvent++
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
fDistToNextJunction = VDIST2(vFrontVanPos, sTrafficJunction[2].sCrossings[TC_WEST_JUNCTION].vCentre)
IF fDistToNextJunction < 6400.0
IF fDistToNextJunction > VDIST2(vFrontVanPos, sTrafficJunction[2].vCentre)
iTrafficInstructionEvent++
ELSE
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_STRAIGH", CONV_PRIORITY_MEDIUM)
iTrafficInstructionEvent++
ENDIF
ENDIF
ENDIF
BREAK
CASE 4
fDistToNextJunction = VDIST2(vFrontVanPos, sTrafficJunction[3].sCrossings[TC_WEST_JUNCTION].vCentre)
IF fDistToNextJunction < 6400.0
IF fDistToNextJunction > VDIST2(vFrontVanPos, sTrafficJunction[3].vCentre)
iTrafficInstructionEvent++
ELSE
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RIGHT", CONV_PRIORITY_MEDIUM)
iTrafficInstructionEvent++
ENDIF
ENDIF
ENDIF
BREAK
CASE 5
fDistToNextJunction = VDIST2(vFrontVanPos, sTrafficJunction[7].sCrossings[TC_NORTH_JUNCTION].vCentre)
IF fDistToNextJunction < 6400.0
IF fDistToNextJunction > VDIST2(vFrontVanPos, sTrafficJunction[7].vCentre)
iTrafficInstructionEvent++
ELSE
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RIGHT", CONV_PRIORITY_MEDIUM)
iTrafficInstructionEvent++
ENDIF
ENDIF
ENDIF
BREAK
CASE 6
fDistToNextJunction = VDIST2(vFrontVanPos, sTrafficJunction[7].sCrossings[TC_EAST_JUNCTION].vCentre)
IF fDistToNextJunction < 6400.0
IF fDistToNextJunction > VDIST2(vFrontVanPos, sTrafficJunction[7].vCentre)
iTrafficInstructionEvent++
ELSE
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LEFT", CONV_PRIORITY_MEDIUM)
iTrafficInstructionEvent++
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
IF eMichaelState = TC_STATE_STOPPED_AT_RED OR eTrevorState = TC_STATE_STOPPED_AT_RED
//Play some dialogue if Michael or Trevor are stuck at a junction.
IF bHasTextLabelTriggered[FH3A_HACK] //Don't play until after the intro text.
IF GET_GAME_TIMER() - iRedLightDialogueTimer > 0
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF eTrevorState = TC_STATE_STOPPED_AT_RED
IF sTrafficGame.bAllowMovement
//Generic stop lines for every other red light.
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_TRED2", CONV_PRIORITY_MEDIUM)
sTrafficJunction[iTrevorClosestJunction].bPlayedLightStatusDialogue = TRUE
iRedLightDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 12000)
ENDIF
ELSE
IF NOT bHasTextLabelTriggered[FH3A_RED] //Trevor says he's stuck at the first light.
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RED", CONV_PRIORITY_MEDIUM)
iRedLightDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 12000)
bHasTextLabelTriggered[FH3A_RED] = TRUE
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_IMPAT] //Trevor gets impatient at the first light.
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_IMPAT", CONV_PRIORITY_MEDIUM)
iRedLightDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 12000)
bHasTextLabelTriggered[FH3A_IMPAT] = TRUE
ENDIF
ENDIF
ENDIF
ELSE
//Only play Michael's line if he has been separated from Trevor.
IF iTrevorClosestWaypoint - iMichaelClosestWaypoint >= 10
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SPLIT", CONV_PRIORITY_MEDIUM)
iRedLightDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 12000)
ENDIF
ENDIF
ENDIF
ENDIF
//TODO 547911: If the player is using a junction cam have the stopped van honk their horn.
IF sTrafficGame.bJunctionCamActive
IF GET_GAME_TIMER() - iRedLightHornTimer > 0
IF eMichaelState = TC_STATE_STOPPED_AT_RED
IF IS_ENTITY_ON_SCREEN(sGoldVans[0].veh)
START_VEHICLE_HORN(sGoldVans[0].veh, 2000)
iRedLightHornTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 12000)
ENDIF
ELSE
IF IS_ENTITY_ON_SCREEN(sGoldVans[1].veh)
START_VEHICLE_HORN(sGoldVans[1].veh, 2000)
iRedLightHornTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 12000)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELIF eTrevorState = TC_STATE_GOING_THROUGH_GREEN
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND bHasTextLabelTriggered[FH3A_HACK]
//Play a line from Trevor if he passes through a light for the first time and it's already green.
IF NOT sTrafficJunction[iTrevorClosestJunction].bPlayedLightStatusDialogue
IF iTrevorClosestJunction = 0
//Play custom dialogue for the first junction.
IF NOT bHasTextLabelTriggered[FH3A_GREEN]
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_GREEN", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_GREEN] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MGREEN", CONV_PRIORITY_MEDIUM)
sTrafficJunction[iTrevorClosestJunction].bPlayedLightStatusDialogue = TRUE
iRedLightDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 12000)
ENDIF
ENDIF
ELSE
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_TGREEN", CONV_PRIORITY_MEDIUM)
sTrafficJunction[iTrevorClosestJunction].bPlayedLightStatusDialogue = TRUE
iRedLightDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 3000)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
//If no one is passing through lights keep the timer updated so once they stop it takes a few seconds before they say something.
IF GET_GAME_TIMER() - iRedLightDialogueTimer > -500
iRedLightDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 3000)
ENDIF
ENDIF
FLOAT fClosestMerryDistFromMike, fClosestMerryDistFromTrev
TEXT_LABEL strNearMissLabel
VEHICLE_INDEX vehClosestCarToMike = TC_GET_CLOSEST_ENEMY_CAR_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], fClosestMerryDistFromMike)
VEHICLE_INDEX vehClosestCarToTrev = TC_GET_CLOSEST_ENEMY_CAR_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], fClosestMerryDistFromTrev)
//PRINTLN(fClosestMerryDistFromMike, " ", fClosestMerryDistFromTrev)
IF NOT IS_ENTITY_DEAD(vehClosestCarToMike)
//Fail if any of the enemies catch up to Michael/Trevor.
IF fClosestMerryDistFromMike < 5000.0
IF fClosestMerryDistFromMike < 3600.0
OR (GET_ENTITY_SPEED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) < 0.5 AND GET_ENTITY_SPEED(vehClosestCarToMike) < 0.5)
MISSION_FAILED(FAILED_CAUGHT_DURING_TRAFFIC_CONTROL)
ENDIF
ENDIF
//Play dialogue if a Merryweather car is getting close, then again if they manage to escape.
IF NOT bTCPrimedMichaelNearMissDialogue
//Merryweather car is heading towards Trevor and getting close.
IF fClosestMerryDistFromMike < 15625.0
AND fPrevClosestMerryDistMike > fClosestMerryDistFromMike
AND GET_GAME_TIMER() - iTCNearMissDialogueTimer > 15000
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
strNearMissLabel = GET_NEAR_MISS_TEXT_LABEL(sGoldVans[0].veh, GET_ENTITY_COORDS(vehClosestCarToMike))
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strNearMissLabel, CONV_PRIORITY_MEDIUM)
iTCNearMissDialogueTimer = GET_GAME_TIMER()
bTCPrimedMichaelNearMissDialogue = TRUE
ENDIF
ENDIF
ENDIF
ELSE
//Merryweather car is heading away from Trevor.
IF fClosestMerryDistFromMike > 6400.0
AND fClosestMerryDistFromTrev > 6400.0
AND fPrevClosestMerryDistMike < fClosestMerryDistFromMike
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF fClosestMerryDistFromMike < 14400.0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_NEAR", CONV_PRIORITY_MEDIUM)
bTCPrimedMichaelNearMissDialogue = FALSE
ENDIF
ELSE
//There wasn't enough time to play the dialogue before Trevor moved away, so just reset.
bTCPrimedMichaelNearMissDialogue = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(vehClosestCarToTrev)
IF fClosestMerryDistFromTrev < 5000.0
IF fClosestMerryDistFromMike < 3600.0
OR (GET_ENTITY_SPEED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) < 0.5 AND GET_ENTITY_SPEED(vehClosestCarToTrev) < 0.5)
MISSION_FAILED(FAILED_CAUGHT_DURING_TRAFFIC_CONTROL)
ENDIF
ENDIF
//Play dialogue if a Merryweather car is getting close, then again if they manage to escape.
IF NOT bTCPrimedTrevorNearMissDialogue
//Merryweather car is heading towards Trevor and getting close.
IF fClosestMerryDistFromTrev < 15625.0
AND fPrevClosestMerryDistTrev > fClosestMerryDistFromTrev
AND GET_GAME_TIMER() - iTCNearMissDialogueTimer > 15000
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
strNearMissLabel = GET_NEAR_MISS_TEXT_LABEL(sGoldVans[1].veh, GET_ENTITY_COORDS(vehClosestCarToTrev))
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strNearMissLabel, CONV_PRIORITY_MEDIUM)
iTCNearMissDialogueTimer = GET_GAME_TIMER()
bTCPrimedTrevorNearMissDialogue = TRUE
ENDIF
ENDIF
ENDIF
ELSE
//Merryweather car is heading away from Trevor.
IF fClosestMerryDistFromTrev > 6400.0
AND fClosestMerryDistFromMike > 6400.0
AND fPrevClosestMerryDistTrev < fClosestMerryDistFromTrev
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF fClosestMerryDistFromTrev < 14400.0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_NEAR", CONV_PRIORITY_MEDIUM)
bTCPrimedTrevorNearMissDialogue = FALSE
ENDIF
ELSE
//There wasn't enough time to play the dialogue before Trevor moved away, so just reset.
bTCPrimedTrevorNearMissDialogue = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
fPrevClosestMerryDistMike = fClosestMerryDistFromMike
fPrevClosestMerryDistTrev = fClosestMerryDistFromTrev
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
SET_MODEL_AS_NO_LONGER_NEEDED(modelDefaultTCPed)
SET_MODEL_AS_NO_LONGER_NEEDED(modelDefaultTCCar)
SET_MODEL_AS_NO_LONGER_NEEDED(modelDefaultTCCar2)
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 7)
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
IF sbiTrafficControl != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbiTrafficControl)
ENDIF
//Reset any collision flags turned on for this section
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
SET_ENTITY_LOAD_COLLISION_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
SET_ENTITY_LOAD_COLLISION_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sGoldVans[0].veh, TRUE)
SET_ENTITY_LOAD_COLLISION_FLAG(sGoldVans[0].veh, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sGoldVans[1].veh, TRUE)
SET_ENTITY_LOAD_COLLISION_FLAG(sGoldVans[1].veh, FALSE)
ENDIF
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_TRAFFIC_CONTROL_FAIL")
eMissionStage = STAGE_ARRIVAL_CUTSCENE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDPROC
PROC ARRIVAL_CUTSCENE()
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() //Fix for bug 2176432
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
IF bHasUsedCheckpoint
START_REPLAY_SETUP(<<143.59, -1198.29, 28.2951>>, 0.0, FALSE)
iCurrentEvent = 99
ELSE
//Fix for B*528757: Guarantee that the tunnel is loaded first before trying to set up everything else.
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<143.59, -1198.29, 28.2951>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<143.59, -1198.29, 28.2951>>, 100.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ELSE
IF SETUP_REQ_PLAYER_IS_FRANKLIN()
IF SETUP_REQ_MICHAEL(<<140.4548, -1202.2416, 28.2951>>)
AND SETUP_REQ_TREVOR(<<141.4548, -1202.2416, 28.2951>>)
AND SETUP_REQ_MAIN_DRIVER(<<124.5559, -1190.2872, 28.2951>>, 173.7492)
AND SETUP_REQ_MAIN_GUNMAN(<<125.5559, -1190.2872, 28.2951>>, 173.7492)
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-1.900313,-666.880005,15.1306>>, -127.999458)
AND SETUP_REQ_CHASE_CARS_START()
AND SETUP_REQ_GOLD_VANS_AT_TRANSFER_POINT(FALSE, FALSE)
AND SETUP_REQ_GOLD_TROLLEYS_IN_VANS()
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
SETUP_REQ_CREW_IN_GOLD_VANS()
SETUP_FRANKLIN_OUTFIT()
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
REQUEST_VEHICLE_RECORDING(CARREC_COPS_VAN_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_COPS_VAN_2, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_COPS_COP_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_COPS_COP_2, strCarrec)
REQUEST_MODEL(modelMerryweather)
REQUEST_MODEL(modelHobo)
REQUEST_ANIM_DICT(strVanArriveCamAnim)
REQUEST_WAYPOINT_RECORDING(strWaypointHobo)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_VAN_1, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_VAN_2, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_COP_1, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_COP_2, strCarrec)
AND HAS_MODEL_LOADED(modelHobo)
AND HAS_ANIM_DICT_LOADED(strVanArriveCamAnim)
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointHobo)
IF NOT IS_SCREEN_FADED_OUT()
UPDATE_TRAFFIC_GAME(FALSE)
ENDIF
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
//Clean up the traffic game in the same frame to avoid pops.
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED(strTrafficTextures)
IF bDisabledSwitch
ENABLE_SELECTOR()
bDisabledSwitch = FALSE
ENDIF
IF bRequestedTrafficScaleform
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(sfTrafficHud)
bRequestedTrafficScaleform = FALSE
ENDIF
IF NOT HAS_SOUND_FINISHED(sTrafficGame.iBackgroundSound)
STOP_SOUND(sTrafficGame.iBackgroundSound)
ENDIF
IF NOT HAS_SOUND_FINISHED(sTrafficGame.iStaticSound)
STOP_SOUND(sTrafficGame.iStaticSound)
ENDIF
IF bTrafficGameAudioSceneActive
STOP_AUDIO_SCENE("BIG_SCORE_TRAFFIC_CONTROL_SCENE")
bTrafficGameAudioSceneActive = FALSE
ENDIF
REMOVE_ALL_AUDIO_SCENES()
STOP_STREAM()
bTrafficAudioStreamActive = FALSE
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(1.0)
CLEAR_PRINTS()
CLEAR_HELP()
INT i = 0
REPEAT COUNT_OF(sTrafficGameCops) i
REMOVE_PED(sTrafficGameCops[i].ped, TRUE)
REMOVE_VEHICLE(sTrafficGameCops[i].veh, TRUE)
ENDREPEAT
REPEAT COUNT_OF(sTrafficGameCars) i
REMOVE_PED(sTrafficGameCars[i].ped, TRUE)
REMOVE_VEHICLE(sTrafficGameCars[i].veh, TRUE)
ENDREPEAT
REPEAT COUNT_OF(sGoldCars) i
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
SET_VEHICLE_DOORS_SHUT(sGoldCars[i].veh)
ENDIF
ENDREPEAT
SETUP_REQ_CREW_HAVE_CORRECT_WEAPONS_FOR_SHOOTOUT()
SETUP_REQ_GOLD_TROLLEYS_IN_VANS() //Trolley will be offset for buddy, so reset it here.
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_FRONT_RIGHT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOORS_SHUT(sGoldVans[0].veh)
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_UNLOCKED) //In case they were locked earlier.
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, CARREC_COPS_VAN_1, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, 5000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[0].veh)
SET_HORN_ENABLED(sGoldVans[0].veh, FALSE) //Potential fix for B*598101
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_FRONT_RIGHT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_REAR_RIGHT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOORS_SHUT(sGoldVans[1].veh)
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, CARREC_COPS_VAN_2, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, 3000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[1].veh)
SET_HORN_ENABLED(sGoldVans[1].veh, FALSE)
ENDIF
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<126.9, -1182.5, 28.2951>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), -178.5)
//Clear up traffic cam first
CLEAR_TIMECYCLE_MODIFIER()
SET_NOISEOVERIDE(FALSE)
DESTROY_ALL_CAMS()
CLEAR_AREA_OF_PEDS(vChaseTriggerStart, 300.0)
//Create hobos and get them running away.
SEQUENCE_INDEX seq
pedHobos[0] = CREATE_PED(PEDTYPE_CIVMALE, modelHobo, <<129.9348, -1210.9138, 28.2951>>, 183.9956)
pedHobos[1] = CREATE_PED(PEDTYPE_CIVMALE, modelHobo, <<143.7292, -1197.2333, 28.3355>>, 102.6304)
SET_MODEL_AS_NO_LONGER_NEEDED(modelHobo)
SET_PED_COMPONENT_VARIATION(pedHobos[0], PED_COMP_HEAD, 1, 0)
SET_PED_COMPONENT_VARIATION(pedHobos[0], PED_COMP_HAIR, 2, 0)
SET_PED_COMPONENT_VARIATION(pedHobos[0], PED_COMP_TORSO, 0, 2)
SET_PED_COMPONENT_VARIATION(pedHobos[0], PED_COMP_LEG, 0, 2)
SET_PED_COMPONENT_VARIATION(pedHobos[1], PED_COMP_HEAD, 0, 0)
SET_PED_COMPONENT_VARIATION(pedHobos[1], PED_COMP_HAIR, 1, 0)
SET_PED_COMPONENT_VARIATION(pedHobos[1], PED_COMP_TORSO, 2, 1)
SET_PED_COMPONENT_VARIATION(pedHobos[1], PED_COMP_LEG, 0, 1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedHobos[0], TRUE)
TASK_FOLLOW_NAV_MESH_TO_COORD(pedHobos[0], <<133.1677, -1261.4180, 28.4797>>, PEDMOVE_RUN, -1, 0.5, ENAV_NO_STOPPING)
IF IS_SCREEN_FADED_OUT()
FORCE_PED_MOTION_STATE(pedHobos[0], MS_ON_FOOT_RUN)
ENDIF
TASK_LOOK_AT_ENTITY(pedHobos[0], sGoldVans[0].veh, -1, SLF_WHILE_NOT_IN_FOV)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedHobos[1], TRUE)
OPEN_SEQUENCE_TASK(seq)
IF IS_SCREEN_FADED_OUT()
TASK_PAUSE(NULL, 1000)
ELSE
TASK_PAUSE(NULL, 500)
ENDIF
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointHobo, 0, EWAYPOINT_START_FROM_CLOSEST_POINT)
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<131.8, -1203.2, 28.6044>>, PEDMOVE_RUN, -1, 0.25, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<132.1, -1209.9, 28.4247>>, PEDMOVE_RUN, -1, 0.5, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<132.4963, -1266.7313, 28.3247>>, PEDMOVE_RUN, -1, 0.5, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(pedHobos[1], seq)
CLEAR_SEQUENCE_TASK(seq)
TASK_LOOK_AT_ENTITY(pedHobos[1], sGoldVans[1].veh, -1, SLF_WHILE_NOT_IN_FOV)
//Lower the budgets in advance (this will also help with cutscene streaming)
SET_PED_POPULATION_BUDGET(0)
SET_VEHICLE_POPULATION_BUDGET(0)
CLEAR_AREA(<<137.9836, -1201.9281, 28.4865>>, 1000.0, TRUE)
//camMain = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<139.516541,-1184.388794,32.141018>>,<<-4.597814,0.269738,161.160843>>,26.594543, TRUE)
//SET_CAM_PARAMS(camMain, <<139.576233,-1184.242798,30.182281>>,<<-1.150314,0.269738,142.363632>>,26.594543, 6000, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
camMain = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", TRUE)
PLAY_CAM_ANIM(camMain, "Vans2Cars_Arrival_Camera", strVanArriveCamAnim, <<150.0, -1212.13, 28.27>>, <<0.0, 0.0, 0.0>>)
//SHAKE_CAM(camMain, "HAND_SHAKE", 0.4)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
TRIGGER_MUSIC_EVENT("FH2A_TRAFFIC_END")
bPlayerInShootoutSafeArea = TRUE
DO_FADE_IN_WITH_WAIT()
IF STREAMVOL_IS_VALID(svChaseStart)
STREAMVOL_DELETE(svChaseStart)
svChaseStart = NULL
ENDIF
SETTIMERA(0)
SETTIMERB(0)
bSkippedMocap = FALSE
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ELSE
IF NOT IS_SCREEN_FADED_OUT()
UPDATE_TRAFFIC_GAME(TRUE)
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
SWITCH iCurrentEvent
CASE 0 //Start the mocap after the scripted shot of the vans arriving finishes.
REQUEST_CUTSCENE("bs_2a_mcs_8")
REQUEST_WEAPON_ASSET(WEAPONTYPE_CARBINERIFLE)
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_8")
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
eSectionStage = SECTION_STAGE_SKIP
ELSE
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
AND ABSF(GET_ENTITY_SPEED(sGoldVans[0].veh)) < 1.0
AND ABSF(GET_ENTITY_SPEED(sGoldVans[1].veh)) < 1.0
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_CARBINERIFLE)
AND HAS_CUTSCENE_LOADED()
/*CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, 1000, TRUE)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, TRUE)
objMachineGun = CREATE_WEAPON_OBJECT_FROM_CURRENT_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID())
REGISTER_ENTITY_FOR_CUTSCENE(objMachineGun, "W_AR_AssaultRifle", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)*/
FILL_PUSH_IN_DATA(sPushInData, sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CHAR_TREVOR, 0.5, 750, 750, 450, 450, 0.2)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[0].veh, "Michaels_Truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[1].veh, "Trevors_Truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE, 100)
ENDIF
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE, TRUE)
objTrevorsWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE)
objDriversWeapon = CREATE_WEAPON_OBJECT(WEAPONTYPE_ASSAULTRIFLE, 100, GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]), TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(objTrevorsWeapon, "HC_Gunman_Rifle", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
REGISTER_ENTITY_FOR_CUTSCENE(objDriversWeapon, "HC_Driver_Rifle", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_GUNMAN].ped, "gunman_selection_1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_DRIVER].ped, "driver_selection", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldCars[0].veh, "far_right_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldCars[1].veh, "middle_right_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldCars[2].veh, "middle_left_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[3].veh)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldCars[3].veh, "far_left_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
SET_ENTITY_VISIBLE(objGoldTrolleys[0], FALSE)
SET_ENTITY_VISIBLE(objGoldTrolleys[1], FALSE)
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
START_CUTSCENE(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH)
SETTIMERB(0)
bHitCutsceneCamExitState = FALSE
iMusicTriggerEvent = 0
iCurrentEvent++
ENDIF
ENDIF
BREAK
CASE 1
IF NOT bSkippedMocap
IF WAS_CUTSCENE_SKIPPED()
bSkippedMocap = TRUE
eSectionStage = SECTION_STAGE_SKIP
ENDIF
ENDIF
IF IS_CUTSCENE_PLAYING()
IF iMusicTriggerEvent = 0
IF GET_CUTSCENE_TIME() > 56000
TRIGGER_MUSIC_EVENT("FH2A_FIGHT_PRE")
iMusicTriggerEvent++
ENDIF
ELSE
PREPARE_MUSIC_EVENT("FH2A_FIGHT_MID")
ENDIF
//Set up the first wave of enemies
IF GET_CUTSCENE_TIME() > 59000
//From this point onwards they need to be in the cutscene.
MANAGE_SHOOTOUT_ENEMIES(FALSE, TRUE)
ELIF GET_CUTSCENE_TIME() > 50000
//Request the assets.
MANAGE_SHOOTOUT_ENEMIES(TRUE)
ENDIF
IF DOES_ENTITY_EXIST(pedHobos[0])
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
INT i
REPEAT COUNT_OF(sGoldCars) i
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
SET_VEHICLE_DOORS_SHUT(sGoldCars[i].veh)
SET_VEHICLE_DOOR_OPEN(sGoldCars[i].veh, SC_DOOR_BOOT, FALSE, TRUE)
ENDIF
ENDREPEAT
REMOVE_ANIM_DICT(strVanArriveCamAnim)
REMOVE_PED(pedHobos[0], TRUE)
ENDIF
REMOVE_PED(pedHobos[1], TRUE)
REMOVE_PED(sGoldVanPeds[CASEY_ID].ped, TRUE)
ENDIF
//Get the player into cover at the end of the cutscene.
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, DEFAULT, TRUE, TCF_CLEAR_TASK_INTERRUPT_CHECKS)
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
ENDIF
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<138.0075, -1201.9452, 28.3113>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 92.3275)
REMOVE_COVER_POINT(sTrevor.cover)
sTrevor.cover = ADD_COVER_POINT(<<138.0075, -1201.9452, 28.3113>>, 182.3275, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
//If we're in first person then don't place Trevor in cover as it causes issues.
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) != CAM_VIEW_MODE_FIRST_PERSON
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), <<137.9775, -1201.9205, 28.3121>>, 100000, FALSE, 0.0, TRUE, FALSE, sTrevor.cover)
ELSE
SET_ENTITY_HEADING(PLAYER_PED_ID(), 108.2275)
ENDIF
//GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, 600, TRUE)
//SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, TRUE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), TRUE)
//FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_DO_NOTHING, FALSE, FAUS_CUTSCENE_EXIT)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("HC_Gunman_Rifle")
GIVE_WEAPON_OBJECT_TO_PED(objTrevorsWeapon, GET_PED_INDEX(CHAR_TREVOR))
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("HC_Driver_Rifle")
REMOVE_OBJECT(objDriversWeapon, TRUE)
ENDIF
//Move Franklin out of the way so he doesn't pop on screen
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
SET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN), <<127.7625, -1208.8765, 28.2951>>)
SET_ENTITY_HEADING(GET_PED_INDEX(CHAR_FRANKLIN), 189.6171)
IF NOT HAS_PED_GOT_WEAPON(GET_PED_INDEX(CHAR_FRANKLIN), WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(GET_PED_INDEX(CHAR_FRANKLIN), WEAPONTYPE_CARBINERIFLE, 500, TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(GET_PED_INDEX(CHAR_FRANKLIN), WEAPONTYPE_CARBINERIFLE, TRUE)
TASK_AIM_GUN_AT_COORD(GET_PED_INDEX(CHAR_FRANKLIN), <<131.3, -1230.1, 29.8>>, -1, TRUE)
//FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_PED_INDEX(CHAR_FRANKLIN))
FORCE_PED_MOTION_STATE(GET_PED_INDEX(CHAR_FRANKLIN), MS_AIMING)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
SET_ENTITY_COORDS(GET_PED_INDEX(CHAR_MICHAEL), <<130.5688, -1202.8179, 28.3423>>)
SET_ENTITY_HEADING(GET_PED_INDEX(CHAR_MICHAEL), 271.5105)
IF NOT HAS_PED_GOT_WEAPON(GET_PED_INDEX(CHAR_MICHAEL), WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(GET_PED_INDEX(CHAR_MICHAEL), WEAPONTYPE_CARBINERIFLE, 500, TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(GET_PED_INDEX(CHAR_MICHAEL), WEAPONTYPE_CARBINERIFLE, TRUE)
SET_PED_COVER_POINT_AND_SPHERE(GET_PED_INDEX(CHAR_MICHAEL), sMichael.cover, <<130.5688, -1202.8179, 28.3423>>, 181.5105,
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60, FALSE)
TASK_PUT_PED_DIRECTLY_INTO_COVER(GET_PED_INDEX(CHAR_MICHAEL), <<130.5688, -1202.8179, 28.3423>>, 100000, FALSE, 0.0, TRUE, TRUE, sMichael.cover)
FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_PED_INDEX(CHAR_MICHAEL))
ENDIF
ENDIF
//2002220 - Make sure the van doors are open on their exit state.
IF NOT IS_ENTITY_DEAD(sGoldVans[0].veh)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_Truck")
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, FALSE)
SET_ENTITY_COORDS(sGoldVans[0].veh, <<126.4855, -1195.3433, 28.4754>>)
SET_ENTITY_HEADING(sGoldVans[0].veh, 85.6665)
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[0].veh)
SET_VEHICLE_DOOR_OPEN(sGoldVans[0].veh, SC_DOOR_REAR_LEFT, FALSE, TRUE)
SET_VEHICLE_DOOR_OPEN(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT, FALSE, TRUE)
SET_ENTITY_VISIBLE(objGoldTrolleys[0], TRUE)
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] ARRIVAL_CUTSCENE: Exit state for Michaels_Truck has been hit.")
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(sGoldVans[1].veh)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_Truck")
FREEZE_ENTITY_POSITION(sGoldVans[1].veh, FALSE)
SET_ENTITY_COORDS(sGoldVans[1].veh, <<124.6472, -1199.2728, 28.4650>>)
SET_ENTITY_HEADING(sGoldVans[1].veh, 89.8633)
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[1].veh)
SET_VEHICLE_DOOR_OPEN(sGoldVans[1].veh, SC_DOOR_REAR_LEFT, FALSE, TRUE)
SET_VEHICLE_DOOR_OPEN(sGoldVans[1].veh, SC_DOOR_REAR_RIGHT, FALSE, TRUE)
SET_ENTITY_VISIBLE(objGoldTrolleys[1], TRUE)
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] ARRIVAL_CUTSCENE: Exit state for Trevors_Truck has been hit.")
ENDIF
ENDIF
//2002220 - Move the crew members out of the way of the first-person view.
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("gunman_selection_1")
SET_ENTITY_COORDS(sCrew[CREW_GUNMAN].ped, <<135.3087, -1190.4631, 28.5013>>)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("driver_selection")
SET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped, <<131.6153, -1190.9659, 28.5028>>)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) != CAM_VIEW_MODE_FIRST_PERSON
SET_GAMEPLAY_CAM_RELATIVE_HEADING(180.0 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ELSE
RESET_PUSH_IN(sPushInData)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDIF
bHitCutsceneCamExitState = TRUE
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] ARRIVAL_CUTSCENE: Exit state for camera has been hit. Cutscene time = ", GET_CUTSCENE_TIME())
ENDIF
IF NOT bHitCutsceneCamExitState
//Handle the custom push-in if in first-person mode.
IF IS_CUTSCENE_PLAYING()
AND GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
INT iCamCutTime
iCamCutTime = 62566
//Failsafe in case the cutscene duration changes in the future.
IF iCamCutTime > GET_CUTSCENE_TOTAL_DURATION()
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] ARRIVAL_CUTSCENE: Cam cut time is later than the cutscene duration. Cutscene duration = ", GET_CUTSCENE_TOTAL_DURATION())
iCamCutTime = GET_CUTSCENE_TOTAL_DURATION()
ENDIF
IF iCamCutTime - GET_CUTSCENE_TIME() <= sPushInData.iCutTime
//Switch to Trevor during this section
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, DEFAULT, TRUE, TCF_CLEAR_TASK_INTERRUPT_CHECKS)
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
ENDIF
//The first-person view is taking the spline position as the direction the player should face after the cutscene. This is because the gameplay cam (which is the normal fallback)
//is never active during the cutscene. This bit of script forces the gameplay cam to be active so when we cut to first-person it'll take that position instead.
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(90.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE)
BYPASS_CUTSCENE_CAM_RENDERING_THIS_UPDATE()
HANDLE_PUSH_IN(sPushInData, FALSE, TRUE, TRUE, FALSE, TRUE)
//2005416 - Handle the push-in effect manually as the timing seems to be off by 50-100ms when using the header.
IF NOT sPushInData.bDonePostFX
IF iCamCutTime - GET_CUTSCENE_TIME() <= 305
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] ARRIVAL_CUTSCENE: Manually triggering effect, cutscene time = ", GET_CUTSCENE_TIME())
ANIMPOSTFX_PLAY("CamPushInTrevor", 0, FALSE)
sPushInData.bDonePostFX = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_CUTSCENE_ACTIVE()
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
BREAK
ENDSWITCH
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REPLAY_STOP_EVENT()
//Casey is no longer needed
REMOVE_PED(sGoldVanPeds[CASEY_ID].ped, TRUE)
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 5)
REMOVE_OBJECT(objTrevorsWeapon, TRUE)
REMOVE_OBJECT(objDriversWeapon, TRUE)
REMOVE_PED(pedHobos[0], TRUE)
REMOVE_PED(pedHobos[1], TRUE)
REMOVE_ANIM_DICT(strVanArriveCamAnim)
REMOVE_WAYPOINT_RECORDING(strWaypointHobo)
SETUP_REQ_BUDDIES_START_FIGHT()
IF IS_SCREEN_FADED_OUT()
SETUP_REQ_GOLD_VANS_AT_TRANSFER_POINT()
ELSE
SETUP_REQ_GOLD_VANS_AT_TRANSFER_POINT(FALSE, TRUE, FALSE)
ENDIF
SET_ENTITY_VISIBLE(objGoldTrolleys[0], TRUE)
SET_ENTITY_VISIBLE(objGoldTrolleys[1], TRUE)
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
eMissionStage = STAGE_SHOOTOUT
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
DO_FADE_OUT_WITH_WAIT()
STOP_CUTSCENE()
REMOVE_CUTSCENE()
WHILE IS_CUTSCENE_ACTIVE()
WAIT(0)
ENDWHILE
RESET_PUSH_IN(sPushInData)
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
ENDIF
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<137.9836, -1201.9281, 28.4865>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 187.6068)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(180.0 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
CLEAR_PED_TASKS_IMMEDIATELY(sCrew[CREW_GUNMAN].ped)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
CLEAR_PED_TASKS_IMMEDIATELY(sCrew[CREW_DRIVER].ped)
ENDIF
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDPROC
PROC DO_SHOOTOUT()
INT i = 0
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
IF SETUP_REQ_PLAYER_IS_TREVOR()
IF bHasUsedCheckpoint
START_REPLAY_SETUP(<<143.59, -1198.29, 28.2951>>, 0.0, FALSE)
iCurrentEvent = 99
ELSE
//Fix for B*528757: Guarantee that the tunnel is loaded first before trying to set up everything else.
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<143.59, -1198.29, 28.2951>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(GET_ENTITY_COORDS(PLAYER_PED_ID()), 200.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ENDIF
ELSE
IF SETUP_REQ_MICHAEL(<<130.1593, -1201.0360, 28.4717>>)
AND SETUP_REQ_FRANKLIN(<<127.7625, -1208.8765, 28.2951>>)
AND SETUP_REQ_MAIN_DRIVER(<<124.5559, -1190.2872, 28.2951>>, 173.7492)
AND SETUP_REQ_MAIN_GUNMAN(<<125.5559, -1190.2872, 28.2951>>, 173.7492)
AND SETUP_REQ_CHASE_CARS_START()
AND SETUP_REQ_GOLD_VANS_AT_TRANSFER_POINT()
AND SETUP_REQ_GOLD_TROLLEYS_IN_VANS()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
AND SETUP_REQ_CREW_HAVE_CORRECT_WEAPONS_FOR_SHOOTOUT()
IF SETUP_REQ_BUDDIES_START_FIGHT()
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
SETUP_FRANKLIN_OUTFIT()
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<137.9775, -1201.9205, 28.3121>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 177.0091)
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, 600, TRUE)
ENDIF
bPlayerInShootoutSafeArea = TRUE //Set this first as some enemies trigger immediately if it's FALSE.
//Create the first shootout set-pieces
WHILE NOT sCopsStart[0].bIsCreated
OR NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
OR (NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sCrew[CREW_GUNMAN].ped))
OR (NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sCrew[CREW_DRIVER].ped))
OR (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
OR (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]))
MANAGE_SHOOTOUT_ENEMIES()
WAIT(0)
ENDWHILE
SETUP_REQ_GOLD_VANS_AT_TRANSFER_POINT()
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_MODEL(modelMerryweather)
REQUEST_MODEL(modelMerryCar)
REQUEST_MODEL(modelGoldBar)
REQUEST_SCRIPT_AUDIO_BANK("FBI_HEIST_3B_SHOOTOUT")
IF HAS_MODEL_LOADED(modelMerryweather)
AND HAS_MODEL_LOADED(modelMerryCar)
AND HAS_MODEL_LOADED(modelGoldBar)
//Remove guns from crew.
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
SET_CURRENT_PED_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_UNARMED, TRUE)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_CURRENT_PED_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_UNARMED, TRUE)
ENDIF
//Collision needs to be turned off between the crew members and the cars as the synchronised scenes involve overlapping collision.
IF NOT IS_ENTITY_DEAD(sGoldCars[0].veh)
AND NOT IS_ENTITY_DEAD(sGoldCars[1].veh)
AND NOT IS_ENTITY_DEAD(sGoldCars[2].veh)
AND NOT IS_ENTITY_DEAD(sGoldCars[3].veh)
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[0].veh, sCrew[CREW_GUNMAN].ped, FALSE)
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[1].veh, sCrew[CREW_GUNMAN].ped, FALSE)
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[2].veh, sCrew[CREW_DRIVER].ped, FALSE)
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[3].veh, sCrew[CREW_DRIVER].ped, FALSE)
ENDIF
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SET_WANTED_LEVEL_MULTIPLIER(0.0)
SET_POLICE_RADAR_BLIPS(FALSE)
SET_RANDOM_TRAINS(FALSE)
sbiStripClub = ADD_SCENARIO_BLOCKING_AREA(<<135.1, -1363.4, 24.0>>, <<144.4, -1189.6, 54.1>>)
SET_ROADS_IN_AREA(<<-220.0, -1400.0, 0.0>>, <<500.0, -900.0, 100.0>>, FALSE)
CLEAR_AREA(<<137.9836, -1201.9281, 28.4865>>, 300.0, TRUE)
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), FALSE)
SET_CREATE_RANDOM_COPS(FALSE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
SET_PED_POPULATION_BUDGET(0)
SET_VEHICLE_POPULATION_BUDGET(0)
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(TRUE)
BLOCK_PEDS_SPAWNING_AT_UNDERPASS(TRUE)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_SHOOTOUT")
START_AUDIO_SCENE("BS_2A_SHOOTOUT")
ENDIF
REMOVE_COVER_POINT(sFranklin.cover)
REMOVE_COVER_POINT(sMichael.cover)
REMOVE_COVER_POINT(sTrevor.cover)
sFranklin.cover = NULL
sMichael.cover = NULL
sTrevor.cover = NULL
iNumFrontInfiniteEnemiesSpawned = 0
iNumFlankInfiniteEnemiesSpawned = 0
iCurrentTake = 0
iDisplayedTake = iCurrentTake
IF IS_SCREEN_FADED_OUT()
//If we skipped here do some extra setup.
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, 600, TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, TRUE)
REMOVE_COVER_POINT(sTrevor.cover)
sTrevor.cover = ADD_COVER_POINT(<<137.9775, -1201.9205, 28.3121>>, 177.0091, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) != CAM_VIEW_MODE_FIRST_PERSON
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), <<137.9775, -1201.9205, 28.3121>>, 100000, FALSE, 0.0, TRUE, FALSE, sTrevor.cover)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(180.0 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ELSE
SET_ENTITY_HEADING(PLAYER_PED_ID(), 108.2)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ENDIF
SETTIMERB(0)
WHILE TIMERB() < 1000
OR NOT sCopsStart[0].bIsCreated
MANAGE_SHOOTOUT_ENEMIES()
WAIT(0) //B*635611 - Allow some time before fading in.
ENDWHILE
//Make sure the buddies are in a task before fading in (this is more important for first-person view as they're on-screen).
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
SET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN), <<127.7625, -1208.8765, 28.2951>>)
SET_ENTITY_HEADING(GET_PED_INDEX(CHAR_FRANKLIN), 271.5105)
TASK_AIM_GUN_AT_COORD(GET_PED_INDEX(CHAR_FRANKLIN), <<131.3, -1230.1, 29.8>>, -1, TRUE)
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
SET_ENTITY_COORDS(GET_PED_INDEX(CHAR_MICHAEL), <<130.1593, -1201.0360, 28.4717>>)
SET_ENTITY_HEADING(GET_PED_INDEX(CHAR_MICHAEL), 271.5105)
TASK_AIM_GUN_AT_COORD(GET_PED_INDEX(CHAR_MICHAEL), <<131.3, -1230.1, 29.8>>, -1, TRUE)
ENDIF
TRIGGER_MUSIC_EVENT("FH2A_FIGHT_RESTART")
ELSE
TRIGGER_MUSIC_EVENT("FH2A_FIGHT_MID")
ENDIF
//Hide one of the fences at the back, so vehicles can drive through during the shootout.
CREATE_MODEL_HIDE(<<179.4, -1233.9, 29.2>>, 5.0, modelShootoutFence, TRUE)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_SHOOTING)
//Remove some other objects just for the shootout.
iNavmeshBlockShootout[0] = ADD_NAVMESH_BLOCKING_OBJECT(<<176.1, -1232.8, 28.7>>, <<20.0, 5.0, 5.0>>, DEG_TO_RAD(165.3))
iNavmeshBlockShootout[1] = ADD_NAVMESH_BLOCKING_OBJECT(<<118.9, -1239.1, 28.7>>, <<36.5, 3.0, 2.5>>, DEG_TO_RAD(94.9))
iNavmeshBlockShootout[2] = ADD_NAVMESH_BLOCKING_OBJECT(<<142.6, -1251.6, 29.6>>, <<15.0, 3.0, 4.5>>, DEG_TO_RAD(121.4))
iNavmeshBlockShootout[3] = ADD_NAVMESH_BLOCKING_OBJECT(<<161.19191, -1238.521545, 28.2>>, <<22.5, 4.0, 3.5>>, DEG_TO_RAD(-61.3))
iNavmeshBlockShootout[4] = ADD_NAVMESH_BLOCKING_OBJECT(<<83.4, -1194.3, 28.0>>, <<22.5, 4.0, 3.5>>, DEG_TO_RAD(-87.9))
SETUP_REQ_REMOVE_JUNK_FOR_SHOOTOUT(TRUE)
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
sMichael.vDest = <<0.0, 0.0, 0.0>>
sFranklin.vDest = <<0.0, 0.0, 0.0>>
sTrevor.vDest = <<0.0, 0.0, 0.0>>
sMichael.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT
sFranklin.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT
sTrevor.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT
iTrolleyEmptyingStage[0] = 0
iTrolleyEmptyingStage[1] = 0
IF NOT IS_SCREEN_FADED_IN()
//Open the doors on the vans (need to unfreeze them first)
IF NOT IS_ENTITY_DEAD(sGoldVans[0].veh)
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, FALSE)
SET_VEHICLE_DOOR_OPEN(sGoldVans[0].veh, SC_DOOR_REAR_LEFT, FALSE, TRUE)
SET_VEHICLE_DOOR_OPEN(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT, FALSE, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(sGoldVans[1].veh)
FREEZE_ENTITY_POSITION(sGoldVans[1].veh, FALSE)
SET_VEHICLE_DOOR_OPEN(sGoldVans[1].veh, SC_DOOR_REAR_LEFT, FALSE, TRUE)
SET_VEHICLE_DOOR_OPEN(sGoldVans[1].veh, SC_DOOR_REAR_RIGHT, FALSE, TRUE)
ENDIF
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_IN()
DISPLAY_TAKE()
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
WAIT(0)
ENDWHILE
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
CLEAR_AREA_OF_VEHICLES(<<137.9836, -1201.9281, 28.4865>>, 300.0)
ENDIF
//Unfreeze the cars for a bit and make sure the boots are open.
REPEAT COUNT_OF(sGoldCars) i
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
FREEZE_ENTITY_POSITION(sGoldCars[i].veh, FALSE)
SET_VEHICLE_DOOR_OPEN(sGoldCars[i].veh, SC_DOOR_BOOT, FALSE, TRUE)
SET_VEHICLE_DOORS_LOCKED(sGoldCars[i].veh, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
ENDIF
ENDREPEAT
SETTIMERA(0)
REPLAY_RECORD_BACK_FOR_TIME(0.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_SHOOTOUT, "SHOOTOUT")
eCurrentPlayer = SELECTOR_PED_TREVOR
eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_1
bBuddiesPushedToFlank = FALSE
bNearInfiniteFlankSpawnArea = FALSE
bDriverGoldBarsCreated = FALSE
bGunmanGoldBarsCreated = FALSE
bInSafeAreaForInfiniteFlankSpawn = FALSE
bFrozenVehiclesForShootout = FALSE
iMusicTriggerEvent = 0
iCurrentEvent = 0
iSwitchStage = 0
iShootoutEndTimer = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
BOOL bGunmanDroppedOffGold, bDriverDroppedOffGold
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
TEXT_LABEL strLabel
//PLAYER_SHOOTOUT_STATE ePlayerState
//SETUP_REQ_EXTRA_SHOOTOUT_COVER()
REQUEST_SCRIPT_AUDIO_BANK("FBI_HEIST_3B_SHOOTOUT")
bPlayerInShootoutSafeArea = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<120.063802,-1203.822021,27.795198>>, <<184.646594,-1199.640503,33.555710>>, 51.000000)
CHECK_LOCATES_FOR_SHOOTOUT()
MANAGE_SHOOTOUT_ENEMIES()
MANAGE_FREE_HOTSWAP()
UPDATE_CREW_MEMBER_CARRYING_GOLD(sCrew[CREW_DRIVER], strAnimIG7Driver, iDriverGoldSyncScene, objGoldBarsDriver, bDriverDroppedOffGold, bDriverGoldBarsCreated)
UPDATE_CREW_MEMBER_CARRYING_GOLD(sCrew[CREW_GUNMAN], strAnimIG7Gunman, iGunmanGoldSyncScene, objGoldBarsGunman, bGunmanDroppedOffGold, bGunmanGoldBarsCreated)
EMPTY_TROLLEY_DURING_SHOOTOUT(0)
EMPTY_TROLLEY_DURING_SHOOTOUT(1)
//To save on physics processing freeze the vans after the doors are open.
IF NOT bFrozenVehiclesForShootout
IF TIMERA() > 500
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, TRUE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
FREEZE_ENTITY_POSITION(sGoldVans[1].veh, TRUE)
ENDIF
REPEAT COUNT_OF(sGoldCars) i
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
FREEZE_ENTITY_POSITION(sGoldCars[i].veh, TRUE)
ENDIF
ENDREPEAT
bFrozenVehiclesForShootout = TRUE
ELSE
REPEAT COUNT_OF(sGoldCars) i
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
SET_VEHICLE_DOOR_OPEN(sGoldCars[i].veh, SC_DOOR_BOOT, FALSE, TRUE)
ENDIF
ENDREPEAT
ENDIF
ENDIF
//New shootout flow: currently disabled by default.
IF bDoNewVersionOfShootout
SWITCH eShootoutState
CASE SHOOTOUT_STATE_DEFEND_FRONT_1
IF sNooseRope1[0].iEvent > 0
OR (iNumAliveCopsStart = 0 AND iNumAliveCopsWave2 = 0)
iTimeLastFlankingEnemyDamaged = GET_GAME_TIMER()
eShootoutState = SHOOTOUT_STATE_DEFEND_FLANK_1
ENDIF
BREAK
CASE SHOOTOUT_STATE_DEFEND_FLANK_1
UPDATE_INFINITE_ENEMIES_FRONT(vPlayerPos, TRUE)
IF sVanCrash[0].bIsCreated
//OR (iNumAliveNooseRope1 = 0 AND iNumAliveVanFlank = 0 AND iNumAliveNooseAbove = 0 AND iNumAliveGoonsWave3b = 0)
OR (iNumAliveNooseRope1 = 0 AND iNumAliveVanFlank = 0 AND iNumAliveGoonsWave3b = 0)
//Remove the blocking area to allow the infinite enemies to start running in.
IF iNavmeshBlockShootout[0] != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(iNavmeshBlockShootout[0])
iNavmeshBlockShootout[0] = -1
ENDIF
//Clear any peds currently classed as damaged, as the objective was completed.
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
ELSE
//Keep the status of the buddies up to date: the player and one buddy go to the left, the other buddy stays at the front.
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
IF sTrevor.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FRONT
SET_SELECTOR_PED_SHOOTOUT_STATE(sTrevor, BUDDY_STATE_DEFENDING_FRONT)
ENDIF
IF sMichael.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FLANK_FAR
SET_SELECTOR_PED_SHOOTOUT_STATE(sMichael, BUDDY_STATE_DEFENDING_FLANK_FAR)
ENDIF
IF sFranklin.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FLANK_FAR
SET_SELECTOR_PED_SHOOTOUT_STATE(sFranklin, BUDDY_STATE_DEFENDING_FLANK_FAR)
ENDIF
ELIF eCurrentPlayer = SELECTOR_PED_MICHAEL
IF sTrevor.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FLANK_FAR
SET_SELECTOR_PED_SHOOTOUT_STATE(sTrevor, BUDDY_STATE_DEFENDING_FLANK_FAR)
ENDIF
IF sMichael.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FLANK_FAR
SET_SELECTOR_PED_SHOOTOUT_STATE(sMichael, BUDDY_STATE_DEFENDING_FLANK_FAR)
ENDIF
IF sFranklin.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FRONT
SET_SELECTOR_PED_SHOOTOUT_STATE(sFranklin, BUDDY_STATE_DEFENDING_FRONT)
ENDIF
ELIF eCurrentPlayer = SELECTOR_PED_TREVOR
IF sTrevor.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FLANK_FAR
SET_SELECTOR_PED_SHOOTOUT_STATE(sTrevor, BUDDY_STATE_DEFENDING_FLANK_FAR)
ENDIF
IF sMichael.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FLANK_FAR
SET_SELECTOR_PED_SHOOTOUT_STATE(sMichael, BUDDY_STATE_DEFENDING_FLANK_FAR)
ENDIF
IF sFranklin.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FRONT
SET_SELECTOR_PED_SHOOTOUT_STATE(sFranklin, BUDDY_STATE_DEFENDING_FRONT)
ENDIF
ENDIF
//If the player doesn't go to defend the flank then flag any buddy peds there as in danger.
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF (sMichael.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FLANK_FAR)
IF GET_GAME_TIMER() - sMichael.iTimeOfShootoutRouteSwitch > 10000
AND GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged > 10000
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, TRUE)
//Kill the buddy if the player doesn't go over after 30 seconds.
IF GET_GAME_TIMER() - sMichael.iTimeOfShootoutRouteSwitch > 30000
AND GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged > 30000
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
APPLY_DAMAGE_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 4000, TRUE)
ENDIF
ENDIF
//Play dialogue if they're in trouble.
IF NOT bHasTextLabelTriggered[FH3A_KOSHM]
IF GET_GAME_TIMER() - sMichael.iTimeOfShootoutRouteSwitch > 15000
AND GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged > 15000
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_KOSHM", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_KOSHM] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
ENDIF
ELSE
sMichael.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER()
bHasTextLabelTriggered[FH3A_KOSHM] = FALSE
ENDIF
ELSE
//This is the player, turn off and adjust the timer so switching away doesn't turn them red immediately.
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
IF GET_GAME_TIMER() - sMichael.iTimeOfShootoutRouteSwitch > 7000
sMichael.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER() - 7000
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF (sTrevor.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FLANK_FAR)
IF GET_GAME_TIMER() - sTrevor.iTimeOfShootoutRouteSwitch > 10000
AND GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged > 10000
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, TRUE)
//Kill the buddy if the player doesn't go over after 30 seconds.
IF GET_GAME_TIMER() - sTrevor.iTimeOfShootoutRouteSwitch > 30000
AND GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged > 30000
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
APPLY_DAMAGE_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 4000, TRUE)
ENDIF
ENDIF
//Play dialogue if they're in trouble.
IF NOT bHasTextLabelTriggered[FH3A_KOSHT]
IF GET_GAME_TIMER() - sTrevor.iTimeOfShootoutRouteSwitch > 15000
AND GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged > 15000
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_KOSHT", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_KOSHT] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
ENDIF
ELSE
sTrevor.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER()
bHasTextLabelTriggered[FH3A_KOSHT] = FALSE
ENDIF
ELSE
//This is the player, turn off and adjust the timer so switching away doesn't turn them red immediately.
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
IF GET_GAME_TIMER() - sTrevor.iTimeOfShootoutRouteSwitch > 7000
sTrevor.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER() - 7000
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
IF (sFranklin.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FLANK_FAR)
IF GET_GAME_TIMER() - sFranklin.iTimeOfShootoutRouteSwitch > 10000
AND GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged > 10000
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, TRUE)
//Kill the buddy if the player doesn't go over after 30 seconds.
IF GET_GAME_TIMER() - sFranklin.iTimeOfShootoutRouteSwitch > 30000
AND GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged > 30000
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
APPLY_DAMAGE_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 4000, TRUE)
ENDIF
ENDIF
//Play dialogue if they're in trouble.
IF NOT bHasTextLabelTriggered[FH3A_KOSHF]
IF GET_GAME_TIMER() - sFranklin.iTimeOfShootoutRouteSwitch > 15000
AND GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged > 15000
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_KOSHF", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_KOSHF] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
ENDIF
ELSE
sFranklin.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER()
bHasTextLabelTriggered[FH3A_KOSHF] = FALSE
ENDIF
ELSE
//This is the player, turn off and adjust the timer so switching away doesn't turn them red immediately.
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
IF GET_GAME_TIMER() - sFranklin.iTimeOfShootoutRouteSwitch > 7000
sFranklin.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER() - 7000
ENDIF
ENDIF
//Play some dialogue from whoever is staying to cover the front.
IF NOT bHasTextLabelTriggered[FH3A_FRONT]
IF bHasTextLabelTriggered[FH3A_LOOKL]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
AND (sMichael.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
strLabel = "FH3A_MFRONT"
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND (sTrevor.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
strLabel = "FH3A_TFRONT"
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
AND (sFranklin.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
strLabel = "FH3A_FFRONT"
ENDIF
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_FRONT] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE SHOOTOUT_STATE_DEFEND_FRONT_2
UPDATE_INFINITE_ENEMIES_FRONT(vPlayerPos, FALSE)
UPDATE_INFINITE_ENEMIES_FLANK(vPlayerPos, TRUE)
IF (iNumAliveVanCrash = 0 AND iNumAliveGoonsSnipe = 0)
SET_SELECTOR_PED_SHOOTOUT_STATE(sTrevor, BUDDY_STATE_DEFENDING_FLANK_FAR)
SET_SELECTOR_PED_SHOOTOUT_STATE(sMichael, BUDDY_STATE_DEFENDING_FLANK_FAR)
SET_SELECTOR_PED_SHOOTOUT_STATE(sFranklin, BUDDY_STATE_DEFENDING_FLANK_FAR)
//Clear any peds currently classed as damaged, as the objective was completed.
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
ELSE
//Keep the status of the buddies up to date: the player and one buddy go to the front, the other buddy stays at the left.
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
IF sTrevor.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FRONT
SET_SELECTOR_PED_SHOOTOUT_STATE(sTrevor, BUDDY_STATE_DEFENDING_FRONT)
ENDIF
IF sMichael.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FLANK_FAR
SET_SELECTOR_PED_SHOOTOUT_STATE(sMichael, BUDDY_STATE_DEFENDING_FLANK_FAR)
ENDIF
IF sFranklin.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FRONT
SET_SELECTOR_PED_SHOOTOUT_STATE(sFranklin, BUDDY_STATE_DEFENDING_FRONT)
ENDIF
ELIF eCurrentPlayer = SELECTOR_PED_MICHAEL
IF sTrevor.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FLANK_FAR
SET_SELECTOR_PED_SHOOTOUT_STATE(sTrevor, BUDDY_STATE_DEFENDING_FLANK_FAR)
ENDIF
IF sMichael.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FRONT
SET_SELECTOR_PED_SHOOTOUT_STATE(sMichael, BUDDY_STATE_DEFENDING_FRONT)
ENDIF
IF sFranklin.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FRONT
SET_SELECTOR_PED_SHOOTOUT_STATE(sFranklin, BUDDY_STATE_DEFENDING_FRONT)
ENDIF
ELIF eCurrentPlayer = SELECTOR_PED_TREVOR
IF sTrevor.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FRONT
SET_SELECTOR_PED_SHOOTOUT_STATE(sTrevor, BUDDY_STATE_DEFENDING_FRONT)
ENDIF
IF sMichael.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FLANK_FAR
SET_SELECTOR_PED_SHOOTOUT_STATE(sMichael, BUDDY_STATE_DEFENDING_FLANK_FAR)
ENDIF
IF sFranklin.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FRONT
SET_SELECTOR_PED_SHOOTOUT_STATE(sFranklin, BUDDY_STATE_DEFENDING_FRONT)
ENDIF
ENDIF
//If the player doesn't go to defend the front then flag any buddy peds there as in danger.
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF (sMichael.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
IF GET_GAME_TIMER() - sMichael.iTimeOfShootoutRouteSwitch > 10000
AND GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged > 10000
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, TRUE)
//Kill the buddy if the player doesn't go over after 30 seconds.
IF GET_GAME_TIMER() - sMichael.iTimeOfShootoutRouteSwitch > 30000
AND GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged > 30000
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
APPLY_DAMAGE_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 4000, TRUE)
ENDIF
ENDIF
//Play dialogue if they're in trouble.
IF NOT bHasTextLabelTriggered[FH3A_KOSHM]
IF GET_GAME_TIMER() - sMichael.iTimeOfShootoutRouteSwitch > 15000
AND GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged > 15000
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_KOSHM", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_KOSHM] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
ENDIF
ELSE
sMichael.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER()
bHasTextLabelTriggered[FH3A_KOSHM] = FALSE
ENDIF
ELSE
//This is the player, turn off and adjust the timer so switching away doesn't turn them red immediately.
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
IF GET_GAME_TIMER() - sMichael.iTimeOfShootoutRouteSwitch > 7000
sMichael.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER() - 7000
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF (sTrevor.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
IF GET_GAME_TIMER() - sTrevor.iTimeOfShootoutRouteSwitch > 10000
AND GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged > 10000
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, TRUE)
//Kill the buddy if the player doesn't go over after 30 seconds.
IF GET_GAME_TIMER() - sTrevor.iTimeOfShootoutRouteSwitch > 30000
AND GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged > 30000
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
APPLY_DAMAGE_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 4000, TRUE)
ENDIF
ENDIF
//Play dialogue if they're in trouble.
IF NOT bHasTextLabelTriggered[FH3A_KOSHT]
IF GET_GAME_TIMER() - sTrevor.iTimeOfShootoutRouteSwitch > 15000
AND GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged > 15000
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_KOSHT", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_KOSHT] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
ENDIF
ELSE
sTrevor.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER()
bHasTextLabelTriggered[FH3A_KOSHT] = FALSE
ENDIF
ELSE
//This is the player, turn off and adjust the timer so switching away doesn't turn them red immediately.
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
IF GET_GAME_TIMER() - sTrevor.iTimeOfShootoutRouteSwitch > 7000
sTrevor.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER() - 7000
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
IF (sFranklin.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
IF GET_GAME_TIMER() - sFranklin.iTimeOfShootoutRouteSwitch > 10000
AND GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged > 10000
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, TRUE)
//Kill the buddy if the player doesn't go over after 30 seconds.
IF GET_GAME_TIMER() - sFranklin.iTimeOfShootoutRouteSwitch > 30000
AND GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged > 30000
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
APPLY_DAMAGE_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 4000, TRUE)
ENDIF
ENDIF
//Play dialogue if they're in trouble.
IF NOT bHasTextLabelTriggered[FH3A_KOSHF]
IF GET_GAME_TIMER() - sFranklin.iTimeOfShootoutRouteSwitch > 15000
AND GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged > 15000
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_KOSHF", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_KOSHF] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
ENDIF
ELSE
sFranklin.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER()
bHasTextLabelTriggered[FH3A_KOSHF] = FALSE
ENDIF
ELSE
//This is the player, turn off and adjust the timer so switching away doesn't turn them red immediately.
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
IF GET_GAME_TIMER() - sFranklin.iTimeOfShootoutRouteSwitch > 7000
sFranklin.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER() - 7000
ENDIF
ENDIF
//Dialogue to play during the transition back to the front.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT bHasTextLabelTriggered[FH3A_FRONT2]
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
AND (sMichael.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
strLabel = "FH3A_MFRONT2"
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND (sTrevor.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
strLabel = "FH3A_TFRONT2"
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
AND (sFranklin.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
strLabel = "FH3A_FFRONT2"
ENDIF
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_FRONT2] = TRUE
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_STAY]
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
AND (sMichael.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FLANK_CLOSE OR sMichael.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FLANK_FAR)
strLabel = "FH3A_MSTAY"
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND (sTrevor.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FLANK_CLOSE OR sTrevor.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FLANK_FAR)
strLabel = "FH3A_TSTAY"
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
AND (sFranklin.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FLANK_CLOSE OR sFranklin.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FLANK_FAR)
strLabel = "FH3A_FSTAY"
ENDIF
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_STAY] = TRUE
ENDIF
ENDIF
//Dialogue for the snipers.
IF NOT bHasTextLabelTriggered[FH3A_SNIPE]
IF sGoonsSnipe[0].bIsCreated
PED_INDEX pedBuddyToSpeak
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
AND (sMichael.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
strLabel = "FH3A_MSNIPE"
pedBuddyToSpeak = sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND (sTrevor.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
strLabel = "FH3A_TSNIPE"
pedBuddyToSpeak = sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
AND (sFranklin.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
strLabel = "FH3A_FSNIPE"
pedBuddyToSpeak = sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]
ENDIF
IF NOT IS_PED_INJURED(pedBuddyToSpeak)
IF VDIST2(GET_ENTITY_COORDS(pedBuddyToSpeak), vPlayerPos) < 225.0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_SNIPE] = TRUE
iTimeSniperDialogueTriggered = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF iNumAliveGoonsSnipe > 0
//Play dialogue if snipers not killed after a while
IF NOT bHasTextLabelTriggered[FH3A_OUT]
IF GET_GAME_TIMER() - iTimeSniperDialogueTriggered > 12000
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
AND (sMichael.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
strLabel = "FH3A_OUTM"
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND (sTrevor.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
strLabel = "FH3A_OUTT"
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
AND (sFranklin.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
strLabel = "FH3A_OUTF"
ENDIF
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_OUT] = TRUE
ENDIF
ENDIF
ENDIF
ELSE
//Play dialogue immediately after the snipers are killed (the person who killed them speaks).
IF NOT bHasTextLabelTriggered[FH3A_GONE]
IF GET_GAME_TIMER() - iTimeSnipersKilledByPlayer < 2000
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
strLabel = "FH3A_GONEM"
ELIF eCurrentPlayer = SELECTOR_PED_TREVOR
strLabel = "FH3A_GONET"
ELIF eCurrentPlayer = SELECTOR_PED_FRANKLIN
strLabel = "FH3A_GONEF"
ENDIF
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_GONE] = TRUE
ENDIF
ELSE
bHasTextLabelTriggered[FH3A_GONE] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE SHOOTOUT_STATE_KILL_REMAINDER
UPDATE_INFINITE_ENEMIES_FRONT(vPlayerPos, FALSE)
UPDATE_INFINITE_ENEMIES_FLANK(vPlayerPos, FALSE)
INT iNumEnemiesLeft
iNumEnemiesLeft = iNumAliveNooseRope1 + iNumAliveVanCrash + iNumAliveVanFlank + iNumAliveCopsStart + iNumAliveCopsWave2 + iNumAliveGoonsWave3b + iNumAliveInfiniteEnemiesFront + iNumAliveInfiniteEnemiesFlank
IF iNumEnemiesLeft = 0
//All enemies are dead, time to cleanup
IF sGoonsWave3b[0].bIsCreated
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_TRIGGER, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_2, strCarrec)
REQUEST_VEHICLE_RECORDING(iCarrecChaseBuddy3, strCarrec)
REQUEST_MODEL(modelChaseCars)
ENDIF
IF iShootoutEndTimer = 0
iShootoutEndTimer = GET_GAME_TIMER()
ELSE
IF NOT bHasTextLabelTriggered[FH3A_SHEND]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SHEND", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_SHEND] = TRUE
ENDIF
ENDIF
ENDIF
IF GET_GAME_TIMER() - iShootoutEndTimer > 3000
AND NOT IS_SELECTOR_CAM_ACTIVE()
IF (bHasTextLabelTriggered[FH3A_SHEND] AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF))
OR GET_GAME_TIMER() - iShootoutEndTimer > 10000
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDIF
ENDIF
ENDIF
//Play some dialogue from Michael if we picked bad crew members to carry the gold.
IF NOT bPickedGoodGunman
OR NOT bPickedGoodCarDriver
IF NOT bHasTextLabelTriggered[FH3A_EXPLAIN]
IF iNumEnemiesLeft < 4
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, NULL, "LESTER")
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_EXPLAIN", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_EXPLAIN] = TRUE
ENDIF
ENDIF
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_NOTIME]
IF iNumEnemiesLeft < 3
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
OR (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) AND VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]), vPlayerPos) < 625.0)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_NOTIME1", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_NOTIME] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
SWITCH iCurrentEvent
CASE 0 //Main fight
//Note: the buddy behaviour has to come after deciding the routes, otherwise there's a single frame where the buddies think they're on the player's old route after a switch.
IF bDoNewVersionOfShootout
UPDATE_MICHAEL_DURING_SHOOTOUT()
UPDATE_FRANKLIN_DURING_SHOOTOUT()
UPDATE_TREVOR_DURING_SHOOTOUT()
ELSE
ENDIF
IF bPlayerInShootoutSafeArea
IF DOES_BLIP_EXIST(sCrew[CREW_GUNMAN].blip)
REMOVE_BLIP(sCrew[CREW_GUNMAN].blip)
ENDIF
IF DOES_BLIP_EXIST(sCrew[CREW_DRIVER].blip)
REMOVE_BLIP(sCrew[CREW_DRIVER].blip)
ENDIF
IF IS_THIS_PRINT_BEING_DISPLAYED("F3A_ABANCREW")
CLEAR_PRINTS()
ENDIF
IF NOT bHasTextLabelTriggered[F3A_KILLCOPS]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_NOW("F3A_KILLCOPS", DEFAULT_GOD_TEXT_TIME, 0)
bHasTextLabelTriggered[F3A_KILLCOPS] = TRUE
ENDIF
ENDIF
//Play dialogue for the second wave.
IF NOT bHasTextLabelTriggered[FH3A_CAR]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF sCopsWave2[0].iEvent > 0
IF GET_PLAYER_MODEL() = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_CARM", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_CAR] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_CAR", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_CAR] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Play dialogue when guys are on the bridge.
/*IF NOT bHasTextLabelTriggered[FH3A_LOOKUP]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF sNooseAbove[0].iEvent > 0
IF iBridgeNooseDialogueTimer = 0
iBridgeNooseDialogueTimer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - iBridgeNooseDialogueTimer > 3000
IF GET_PLAYER_MODEL() = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LOOKUP", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_LOOKUP] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LOOKT", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_LOOKUP] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF*/
//Play dialogue when the guys try to flank
IF NOT bHasTextLabelTriggered[FH3A_LOOKL]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF sNooseRope1[0].iEvent > 0
IF GET_PLAYER_MODEL() = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LOOKL", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_LOOKL] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LOOKLT", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_LOOKL] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
UPDATE_SHOOTOUT_DIALOGUE()
IF NOT bDoNewVersionOfShootout
IF iNumAliveNooseRope1 = 0
AND iNumAliveVanCrash = 0
AND iNumAliveVanFlank = 0
//AND iNumAliveNooseAbove = 0
AND iNumAliveCopsStart = 0
AND iNumAliveCopsWave2 = 0
AND iNumAliveGoonsWave3b = 0
//Request chase start assets in advance
IF sGoonsWave3b[0].bIsCreated
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_TRIGGER, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_2, strCarrec)
REQUEST_VEHICLE_RECORDING(iCarrecChaseBuddy3, strCarrec)
REQUEST_MODEL(modelChaseCars)
ENDIF
IF iShootoutEndTimer = 0
iShootoutEndTimer = GET_GAME_TIMER()
ELSE
IF NOT bHasTextLabelTriggered[FH3A_SHEND]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SHEND", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_SHEND] = TRUE
ENDIF
ENDIF
ENDIF
IF GET_GAME_TIMER() - iShootoutEndTimer > 3000
IF (bHasTextLabelTriggered[FH3A_SHEND] AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF))
OR GET_GAME_TIMER() - iShootoutEndTimer > 10000
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT DOES_BLIP_EXIST(sCrew[CREW_GUNMAN].blip)
sCrew[CREW_GUNMAN].blip = CREATE_BLIP_FOR_ENTITY(sCrew[CREW_GUNMAN].ped)
sCrew[CREW_DRIVER].blip = CREATE_BLIP_FOR_ENTITY(sCrew[CREW_DRIVER].ped)
ENDIF
IF NOT bHasTextLabelTriggered[F3A_ABANCREW]
PRINT_NOW("F3A_ABANCREW", DEFAULT_GOD_TEXT_TIME, 0)
bHasTextLabelTriggered[F3A_ABANCREW] = TRUE
ENDIF
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<93.896111,-1205.677368,27.795156>>, <<196.813644,-1198.531616,35.795170>>, 105.000000)
OR bNearInfiniteFlankSpawnArea
MISSION_FAILED(FAILED_ABANDONED_SHOOTOUT_CREW)
ENDIF
ENDIF
BREAK
ENDSWITCH
//Update buddy blips: remove the blip for whoever is the player, add blips for other buddies.
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
IF NOT DOES_BLIP_EXIST(sFranklin.blip)
sFranklin.blip = CREATE_BLIP_FOR_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
ENDIF
ELSE
IF DOES_BLIP_EXIST(sFranklin.blip)
REMOVE_BLIP(sFranklin.blip)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF NOT DOES_BLIP_EXIST(sMichael.blip)
sMichael.blip = CREATE_BLIP_FOR_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
ENDIF
ELSE
IF DOES_BLIP_EXIST(sMichael.blip)
REMOVE_BLIP(sMichael.blip)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF NOT DOES_BLIP_EXIST(sTrevor.blip)
sTrevor.blip = CREATE_BLIP_FOR_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
ENDIF
ELSE
IF DOES_BLIP_EXIST(sTrevor.blip)
REMOVE_BLIP(sTrevor.blip)
ENDIF
ENDIF
//Dialogue:
//If the shootout hasn't finished yet then play general dialogue.
IF iShootoutEndTimer = 0
UPDATE_BUDDY_SHOOTOUT_DIALOGUE(vPlayerPos)
ENDIF
//Music events: trigger event mid-way into the shootout.
IF iMusicTriggerEvent = 0
IF TIMERA() > 10000
PREPARE_MUSIC_EVENT("FH2A_FIGHT_DROP")
ENDIF
IF TIMERA() > 30000
TRIGGER_MUSIC_EVENT("FH2A_FIGHT_DROP")
iMusicTriggerEvent++
ELSE
//If the shootout was completed before the music change takes place then it needs to be cancelled.
IF eSectionStage = SECTION_STAGE_CLEANUP
CANCEL_MUSIC_EVENT("FH2A_FIGHT_DROP")
ENDIF
ENDIF
ENDIF
//Work out what the take should be: when the crew drop gold the take goes up a little bit, the rest is determined by killing enemies.
INT iDesiredTake = CONVERT_SHOOTOUT_PROGRESS_INTO_TAKE(iMaxTakeConsideringCrew)
IF iCurrentTake < iMaxTakeConsideringCrew
IF bGunmanDroppedOffGold
iCurrentTake += 500000
ENDIF
IF bDriverDroppedOffGold
iCurrentTake += 500000
ENDIF
ENDIF
IF iDesiredTake > iCurrentTake
iCurrentTake = iDesiredTake
ENDIF
IF iCurrentTake > iMaxTakeConsideringCrew
iCurrentTake = iMaxTakeConsideringCrew
ENDIF
DISPLAY_TAKE()
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REPLAY_RECORD_BACK_FOR_TIME(8.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
MANAGE_SHOOTOUT_ENEMIES() //Call this once more to ensure all enemies are guaranteed to be cleaned up
REMOVE_ANIM_DICT(strRappelAnims)
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold1A)
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold1B)
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold1C)
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold2A)
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold2B)
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold2C)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_VAN_1, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_VAN_2, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_COP_1, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_COPS_COP_2, strCarrec)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMerryweather)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMerryCar)
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldBar)
REMOVE_VEHICLE_ASSET(modelMerryCar)
REMOVE_WEAPON_ASSET(WEAPONTYPE_CARBINERIFLE)
REMOVE_WEAPON_ASSET(WEAPONTYPE_ADVANCEDRIFLE)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
//REMOVE_OBJECT(objShootoutPallet, FALSE)
REMOVE_OBJECT(objShootoutCover, FALSE)
REPEAT COUNT_OF(iNavmeshBlockShootout) i
IF iNavmeshBlockShootout[i] != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(iNavmeshBlockShootout[i])
iNavmeshBlockShootout[i] = -1
ENDIF
ENDREPEAT
SET_ROADS_BACK_TO_ORIGINAL(<<-220.0, -1400.0, 0.0>>, <<500.0, -900.0, 100.0>>)
SETTIMERA(0)
eMissionStage = STAGE_CHASE_START_CUTSCENE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_CHASE_START_CUTSCENE)
ENDIF
ENDPROC
PROC CHASE_START_CUTSCENE()
INT i = 0
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF SETUP_REQ_PLAYER_IS_TREVOR()
IF SETUP_REQ_MICHAEL(<<140.4548, -1202.2416, 28.2951>>)
AND SETUP_REQ_FRANKLIN(<<141.4548, -1202.2416, 28.2951>>)
AND SETUP_REQ_MAIN_DRIVER(<<124.5559, -1190.2872, 28.2951>>, 173.7492)
AND SETUP_REQ_MAIN_GUNMAN(<<125.5559, -1190.2872, 28.2951>>, 173.7492)
AND SETUP_REQ_CHASE_CARS_START()
AND SETUP_REQ_GOLD_VANS_AT_TRANSFER_POINT()
AND SETUP_REQ_GOLD_TROLLEYS_IN_VANS()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
IF SETUP_REQ_BUDDIES_START_FIGHT()
SETUP_FRANKLIN_OUTFIT()
REPEAT COUNT_OF(sGoldCars) i
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
SET_VEHICLE_DOOR_SHUT(sGoldCars[i].veh, SC_DOOR_BOOT)
ENDIF
ENDREPEAT
LOAD_SCENE(<<140.4548, -1202.2416, 28.2951>>)
WHILE NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
AND (NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sCrew[CREW_GUNMAN].ped))
AND (NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sCrew[CREW_DRIVER].ped))
AND (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
AND (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]))
WAIT(0)
ENDWHILE
WAIT(1000)
BLOCK_PEDS_SPAWNING_AT_UNDERPASS(TRUE)
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
CLEAR_AREA_OF_PEDS(vChaseTriggerStart, 300.0)
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_TRIGGER, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_2, strCarrec)
REQUEST_VEHICLE_RECORDING(iCarrecChaseBuddy3, strCarrec)
REQUEST_MODEL(modelChaseCars)
REQUEST_MODEL(modelEmptyTrolley)
REQUEST_CUTSCENE("bs_2a_mcs_8_p3")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_8_p3")
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_TRIGGER, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_1, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_2, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrecChaseBuddy3, strCarrec)
AND HAS_MODEL_LOADED(modelChaseCars)
AND HAS_MODEL_LOADED(modelEmptyTrolley)
AND HAS_CUTSCENE_LOADED()
AND TIMERA() > 1500 //Timer is set at the end of the previous section.
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2A_FIGHT_RESTART")
WAIT(0)
ENDIF
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
RELEASE_NAMED_SCRIPT_AUDIO_BANK("FBI_HEIST_3B_SHOOTOUT")
REPEAT COUNT_OF(sGoldCars) i
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
FREEZE_ENTITY_POSITION(sGoldCars[i].veh, FALSE)
SET_VEHICLE_DOORS_LOCKED(sGoldCars[i].veh, VEHICLELOCK_UNLOCKED)
ENDIF
ENDREPEAT
bUberPlaybackHasStartedFromMocap = FALSE
iCurrentTake = iMaxTakeConsideringCrew
iDisplayedTake = iCurrentTake
vehChaseTrigger = CREATE_VEHICLE(modelChaseCars, vChaseTriggerStart, fChaseTriggerHeading)
SET_ENTITY_COLLISION(vehChaseTrigger, FALSE)
SET_ENTITY_VISIBLE(vehChaseTrigger, FALSE)
SET_ENTITY_INVINCIBLE(vehChaseTrigger, TRUE)
FREEZE_ENTITY_POSITION(vehChaseTrigger, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelChaseCars)
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, FALSE)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[0].veh, "Michaels_truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
FREEZE_ENTITY_POSITION(sGoldVans[1].veh, FALSE)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[1].veh, "Trevors_truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
STOP_SYNCHRONIZED_ENTITY_ANIM(sCrew[CREW_GUNMAN].ped, INSTANT_BLEND_OUT, TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_GUNMAN].ped, "gunman_selection_1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
STOP_SYNCHRONIZED_ENTITY_ANIM(sCrew[CREW_DRIVER].ped, INSTANT_BLEND_OUT, TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_DRIVER].ped, "driver_selection", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldCars[0].veh, "far_right_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldCars[1].veh, "middle_right_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldCars[2].veh, "middle_left_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[3].veh)
REGISTER_ENTITY_FOR_CUTSCENE(sGoldCars[3].veh, "far_left_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
objEmptyTrolleys[0] = CREATE_OBJECT(modelEmptyTrolley, GET_ENTITY_COORDS(PLAYER_PED_ID()) - <<0.0, 0.0, 50.0>>)
REGISTER_ENTITY_FOR_CUTSCENE(objEmptyTrolleys[0], "GoldEmpty", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
objEmptyTrolleys[1] = CREATE_OBJECT(modelEmptyTrolley, GET_ENTITY_COORDS(PLAYER_PED_ID()) - <<0.0, 0.0, 55.0>>)
REGISTER_ENTITY_FOR_CUTSCENE(objEmptyTrolleys[1], "GoldEmpty^1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
SET_MODEL_AS_NO_LONGER_NEEDED(modelEmptyTrolley)
SET_MODEL_AS_NO_LONGER_NEEDED(modelContainerAlt1)
SET_MODEL_AS_NO_LONGER_NEEDED(modelContainerAlt2)
SET_MODEL_AS_NO_LONGER_NEEDED(modelContainerAlt3)
//Reset the no-collision flags from earlier.
IF NOT IS_ENTITY_DEAD(sGoldCars[0].veh)
AND NOT IS_ENTITY_DEAD(sGoldCars[1].veh)
AND NOT IS_ENTITY_DEAD(sGoldCars[2].veh)
AND NOT IS_ENTITY_DEAD(sGoldCars[3].veh)
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[0].veh, sCrew[CREW_GUNMAN].ped, TRUE)
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[1].veh, sCrew[CREW_GUNMAN].ped, TRUE)
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[2].veh, sCrew[CREW_DRIVER].ped, TRUE)
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[3].veh, sCrew[CREW_DRIVER].ped, TRUE)
ENDIF
REPEAT COUNT_OF(objGoldBarsDriver) i
REMOVE_OBJECT(objGoldBarsDriver[i], TRUE)
ENDREPEAT
REPEAT COUNT_OF(objGoldBarsGunman) i
REMOVE_OBJECT(objGoldBarsGunman[i], TRUE)
ENDREPEAT
REMOVE_ANIM_DICT(strAnimIG7Driver)
REMOVE_ANIM_DICT(strAnimIG7Gunman)
IF NOT HAS_SOUND_FINISHED(iMoneyCountSoundID)
STOP_SOUND(iMoneyCountSoundID)
ENDIF
TRIGGER_MUSIC_EVENT("FH2A_FIGHT_END")
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_BigScoreSubtle")
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
START_CUTSCENE()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
SETTIMERB(0)
REMOVE_ALL_AUDIO_SCENES()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
DO_FADE_IN_WITH_WAIT()
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
IF NOT bSkippedMocap
IF WAS_CUTSCENE_SKIPPED()
bSkippedMocap = TRUE
eSectionStage = SECTION_STAGE_SKIP
ENDIF
ENDIF
SWITCH iCurrentEvent
CASE 0
IF IS_CUTSCENE_PLAYING()
//Remove the cars when the cutscene starts to avoid any popping issues.
CLEAR_PRINTS()
CLEAR_HELP()
REMOVE_ALL_BLIPS()
CLEAR_ANGLED_AREA_OF_VEHICLES(<<134.162811,-1198.184937,25.988131>>, <<132.339874,-1275.314819,33.051426>>, 8.750000)
CLEAR_AREA_OF_OBJECTS(<<134.8234, -1196.9601, 28.4795>>, 20.0)
CLEAR_AREA_OF_PROJECTILES(<<134.8234, -1196.9601, 28.4795>>, 20.0)
IF NOT IS_ENTITY_DEAD(vehCopsStart[0])
AND IS_ENTITY_IN_ANGLED_AREA(vehCopsStart[0], <<134.162811,-1198.184937,25.988131>>, <<132.339874,-1275.314819,33.051426>>, 8.750000)
REMOVE_VEHICLE(vehCopsStart[0], TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(vehCopsStart[1])
AND IS_ENTITY_IN_ANGLED_AREA(vehCopsStart[1], <<134.162811,-1198.184937,25.988131>>, <<132.339874,-1275.314819,33.051426>>, 8.750000)
REMOVE_VEHICLE(vehCopsStart[1], TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(vehCopsWave2)
AND IS_ENTITY_IN_ANGLED_AREA(vehCopsWave2, <<134.162811,-1198.184937,25.988131>>, <<132.339874,-1275.314819,33.051426>>, 8.750000)
REMOVE_VEHICLE(vehCopsWave2, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(vehVanCrash)
AND IS_ENTITY_IN_ANGLED_AREA(vehVanCrash, <<134.162811,-1198.184937,25.988131>>, <<132.339874,-1275.314819,33.051426>>, 8.750000)
REMOVE_VEHICLE(vehVanCrash, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(vehNooseChopper1)
AND IS_ENTITY_IN_ANGLED_AREA(vehNooseChopper1, <<134.162811,-1198.184937,25.988131>>, <<132.339874,-1275.314819,33.051426>>, 8.750000)
REMOVE_VEHICLE(vehNooseChopper1, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(vehNooseWave1)
AND IS_ENTITY_IN_ANGLED_AREA(vehNooseWave1, <<134.162811,-1198.184937,25.988131>>, <<132.339874,-1275.314819,33.051426>>, 8.750000)
REMOVE_VEHICLE(vehNooseWave1, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(vehGoons3a)
AND IS_ENTITY_IN_ANGLED_AREA(vehGoons3a, <<134.162811,-1198.184937,25.988131>>, <<132.339874,-1275.314819,33.051426>>, 8.750000)
REMOVE_VEHICLE(vehGoons3a, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(vehGoons3b)
AND IS_ENTITY_IN_ANGLED_AREA(vehGoons3b, <<134.162811,-1198.184937,25.988131>>, <<132.339874,-1275.314819,33.051426>>, 8.750000)
REMOVE_VEHICLE(vehGoons3b, TRUE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
FIX_ALL_VEHICLE_TYRES(sGoldVans[0].veh)
ENDIF
SET_VEHICLE_MODEL_PLAYER_WILL_EXIT_SCENE(modelChaseCars)
SET_ENTITY_VISIBLE(objGoldTrolleys[0], FALSE)
SET_ENTITY_VISIBLE(objGoldTrolleys[1], FALSE)
REPEAT COUNT_OF(sGoldCars) i
IF NOT IS_ENTITY_DEAD(sGoldCars[i].veh)
//SET_VEHICLE_FIXED(sGoldCars[i].veh)
FIX_ALL_VEHICLE_TYRES(sGoldCars[i].veh)
SET_VEHICLE_ENGINE_HEALTH(sGoldCars[i].veh, 1000.0)
SET_VEHICLE_PETROL_TANK_HEALTH(sGoldCars[i].veh, 1000.0)
//SET_VEHICLE_DOOR_OPEN(sGoldCars[i].veh, SC_DOOR_BOOT, FALSE, TRUE)
ENDIF
ENDREPEAT
iCurrentEvent++
ENDIF
BREAK
CASE 1
IF IS_CUTSCENE_PLAYING()
IF GET_CUTSCENE_TIME() > 16100
TRIGGER_MUSIC_EVENT("FH2A_CARS")
iCurrentEvent++
ENDIF
ENDIF
BREAK
CASE 2
PREPARE_MUSIC_EVENT("FH2A_GETAWAY_DRIVE_MA")
BREAK
ENDSWITCH
//Exit states:
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ANIMPOSTFX_PLAY("SwitchSceneFranklin", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "Hit_1", "LONG_PLAYER_SWITCH_SOUNDS")
ENDIF
//Player goes in the last car.
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
IF GET_PLAYER_PED_MODEL(CHAR_FRANKLIN) != GET_ENTITY_MODEL(PLAYER_PED_ID())
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE)
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldCars[PLAYERS_GOLD_CAR].veh)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
IF NOT bSkippedMocap
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
ENDIF
ENDIF
//Michael goes in the first car
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
AND IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sGoldCars[0].veh)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
ENDIF
ENDIF
//Trevor gets into the second car
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldCars[1].veh)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
ENDIF
//Crew driver gets into the third car
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
AND IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("driver_selection")
SET_PED_INTO_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldCars[2].veh)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_DRIVER].ped, TRUE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sCrew[CREW_DRIVER].ped)
ENDIF
ENDIF
//Crew gunman takes cover by the vans
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("gunman_selection_1")
IF NOT HAS_PED_GOT_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
SET_ENTITY_COORDS(sCrew[CREW_GUNMAN].ped, <<128.2898, -1203.2582, 28.3282>>)
SET_ENTITY_HEADING(sCrew[CREW_GUNMAN].ped, 189.4779)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sCrew[CREW_GUNMAN].ped)
ENDIF
ENDIF
//Gold vans are positioned to a better location for the chase.
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_truck")
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, FALSE)
SET_ENTITY_COORDS(sGoldVans[0].veh, <<124.6597, -1200.9230, 28.4754>>)
//SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 0.0)
//SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOORS_SHUT(sGoldVans[0].veh, TRUE)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_truck")
FREEZE_ENTITY_POSITION(sGoldVans[1].veh, FALSE)
SET_ENTITY_COORDS(sGoldVans[1].veh, <<125.0192, -1197.5840, 28.4754>>)
//SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 0.0)
//SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_REAR_RIGHT, DT_DOOR_INTACT, 0.0)
SET_VEHICLE_DOORS_SHUT(sGoldVans[1].veh, TRUE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(objEmptyTrolleys[0])
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("GoldEmpty")
REMOVE_OBJECT(objEmptyTrolleys[0], TRUE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(objEmptyTrolleys[1])
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("GoldEmpty^1")
REMOVE_OBJECT(objEmptyTrolleys[1], TRUE)
ENDIF
ENDIF
//Buddy cars are set to play back recordings: they need to be ahead of the player when cutting back to gameplay.
FLOAT fChaseStartTime = 2300.0
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
AND IS_VEHICLE_DRIVEABLE(vehChaseTrigger)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("far_right_car")
SET_VEHICLE_DOORS_SHUT(sGoldCars[0].veh)
INITIALISE_UBER_PLAYBACK(strCarrec, CARREC_CHASE_TRIGGER)
LOAD_CHASE_UBER_DATA()
LOAD_ACTION_CAM_DATA()
FREEZE_ENTITY_POSITION(vehChaseTrigger, FALSE)
START_PLAYBACK_RECORDED_VEHICLE(vehChaseTrigger, CARREC_CHASE_TRIGGER, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehChaseTrigger, fChaseStartTime)
SET_UBER_PLAYBACK_TO_TIME_NOW(vehChaseTrigger, fChaseStartTime)
fUberPlaybackDensitySwitchOffRange = 250.0
allow_veh_to_stop_on_PLAYER_impact = TRUE
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02)
fChasePlaybackSpeed = 1.0
bTrafficDontSwitchToAI = TRUE
//Set the main cars to be a frame behind: this is how they would normally be as set-piece cars, but as they need to be moving instantly after the cutscene
//forcing playback update seems to put them a frame ahead.
START_PLAYBACK_RECORDED_VEHICLE(sGoldCars[0].veh, CARREC_CHASE_BUDDY_1, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldCars[0].veh, fChaseStartTime)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldCars[0].veh)
bUberPlaybackHasStartedFromMocap = TRUE
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("middle_right_car")
SET_VEHICLE_DOORS_SHUT(sGoldCars[1].veh)
START_PLAYBACK_RECORDED_VEHICLE(sGoldCars[1].veh, CARREC_CHASE_BUDDY_2, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldCars[1].veh, fChaseStartTime)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldCars[1].veh)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("middle_left_car")
SET_VEHICLE_DOORS_SHUT(sGoldCars[2].veh)
START_PLAYBACK_RECORDED_VEHICLE(sGoldCars[2].veh, iCarrecChaseBuddy3, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldCars[2].veh, fChaseStartTime)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldCars[2].veh)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("far_left_car")
SET_ENTITY_HEADING(sGoldCars[PLAYERS_GOLD_CAR].veh, 194.1942)
SET_ENTITY_COORDS(sGoldCars[PLAYERS_GOLD_CAR].veh, <<127.3749, -1186.2219, 28.5033>>)
SET_VEHICLE_DOORS_SHUT(sGoldCars[PLAYERS_GOLD_CAR].veh)
SET_VEHICLE_ENGINE_ON(sGoldCars[PLAYERS_GOLD_CAR].veh, TRUE, TRUE)
ENDIF
SET_VEHICLE_BRAKE_LIGHTS(sGoldCars[PLAYERS_GOLD_CAR].veh, FALSE)
ENDIF
IF NOT IS_CUTSCENE_ACTIVE()
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
IF bUberPlaybackHasStartedFromMocap
PRELOAD_ALL_CHASE_RECORDINGS(fChasePlaybackTime)
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
UPDATE_UBER_PLAYBACK(vehChaseTrigger, fChasePlaybackSpeed)
UPDATE_CHASE_SET_PIECES()
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REPLAY_STOP_EVENT()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
REMOVE_OBJECT(objGoldTrolleys[0], TRUE)
REMOVE_OBJECT(objGoldTrolleys[1], TRUE)
REMOVE_OBJECT(objEmptyTrolleys[0], TRUE)
REMOVE_OBJECT(objEmptyTrolleys[1], TRUE)
REMOVE_VEHICLE(vehCopsStart[0])
REMOVE_VEHICLE(vehCopsStart[1])
REMOVE_VEHICLE(vehCopsWave2)
REMOVE_VEHICLE(vehVanCrash)
REMOVE_VEHICLE(vehNooseChopper1)
REMOVE_VEHICLE(vehNooseWave1)
REMOVE_VEHICLE(vehGoons3a)
REMOVE_VEHICLE(vehGoons3b)
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_CHASE
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
STOP_CUTSCENE()
REMOVE_CUTSCENE()
REPLAY_CANCEL_EVENT()
CANCEL_ALL_PREPARED_MUSIC_EVENTS()
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDPROC
PROC DO_CHASE()
INT i = 0
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF SETUP_REQ_PLAYER_IS_FRANKLIN()
IF bHasUsedCheckpoint
START_REPLAY_SETUP(<<127.3, -1181.4, 29.5>>, fChaseTriggerHeading, FALSE)
ELSE
//Fix for B*528757: Guarantee that the tunnel is loaded first before trying to set up everything else.
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<127.3, -1181.4, 29.5>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(GET_ENTITY_COORDS(PLAYER_PED_ID()), 200.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
ENDIF
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_TRIGGER, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_2, strCarrec)
REQUEST_VEHICLE_RECORDING(iCarrecChaseBuddy3, strCarrec)
WHILE NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_TRIGGER, strCarrec)
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_1, strCarrec)
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_2, strCarrec)
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrecChaseBuddy3, strCarrec)
OR NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
OR NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
OR NOT DOES_ENTITY_EXIST(sCrew[CREW_DRIVER].ped)
OR NOT DOES_ENTITY_EXIST(sCrew[CREW_GUNMAN].ped)
OR NOT DOES_ENTITY_EXIST(sGoldCars[0].veh)
OR NOT DOES_ENTITY_EXIST(sGoldVans[0].veh)
SETUP_REQ_MICHAEL(<<140.4548, -1202.2416, 28.2951>>)
SETUP_REQ_TREVOR(<<141.4548, -1202.2416, 28.2951>>)
SETUP_REQ_MAIN_DRIVER(<<124.5559, -1190.2872, 28.2951>>, 173.7492)
SETUP_REQ_MAIN_GUNMAN(<<125.5559, -1190.2872, 28.2951>>, 173.7492)
SETUP_REQ_CHASE_CARS_START()
SETUP_REQ_GOLD_VANS_AT_TRANSFER_POINT(FALSE)
WAIT(0)
ENDWHILE
SETUP_REQ_BUDDIES_START_FIGHT()
PRELOAD_OUTFIT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], OUTFIT_P0_SECURITY)
PRELOAD_OUTFIT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], OUTFIT_P2_SECURITY)
REQUEST_DRIVER_SECURITY_OUTFIT()
REQUEST_GUNMAN_SECURITY_OUTFIT()
REQUEST_MODEL(modelChaseCars)
WHILE NOT HAS_MODEL_LOADED(modelChaseCars)
OR (NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped) AND NOT HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(sCrew[CREW_DRIVER].ped))
OR (NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped) AND NOT HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(sCrew[CREW_GUNMAN].ped))
WAIT(0)
ENDWHILE
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
SET_VEHICLE_DOOR_SHUT(sGoldCars[PLAYERS_GOLD_CAR].veh, SC_DOOR_BOOT)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldCars[PLAYERS_GOLD_CAR].veh)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
RELEASE_PED_PRELOAD_VARIATION_DATA(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
RELEASE_PED_PRELOAD_PROP_DATA(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldCars[1].veh)
ENDIF
SET_VEHICLE_DOOR_SHUT(sGoldCars[1].veh, SC_DOOR_BOOT)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
RELEASE_PED_PRELOAD_VARIATION_DATA(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
RELEASE_PED_PRELOAD_PROP_DATA(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sGoldCars[0].veh)
ENDIF
SET_VEHICLE_DOOR_SHUT(sGoldCars[0].veh, SC_DOOR_BOOT)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
RELEASE_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_DRIVER].ped)
RELEASE_PED_PRELOAD_PROP_DATA(sCrew[CREW_DRIVER].ped)
SET_PED_INTO_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldCars[2].veh)
ENDIF
SET_VEHICLE_DOOR_SHUT(sGoldCars[2].veh, SC_DOOR_BOOT)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
IF NOT HAS_PED_GOT_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE)
GIVE_WEAPON_TO_PED(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
RELEASE_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_GUNMAN].ped)
RELEASE_PED_PRELOAD_PROP_DATA(sCrew[CREW_GUNMAN].ped)
SET_ENTITY_COORDS(sCrew[CREW_GUNMAN].ped, <<128.2898, -1203.2582, 28.3282>>)
SET_ENTITY_HEADING(sCrew[CREW_GUNMAN].ped, 189.4779)
sCrew[CREW_GUNMAN].iEvent = 0
ENDIF
//Move the vans out of the way.
IF NOT IS_ENTITY_DEAD(sGoldVans[0].veh)
SET_ENTITY_COORDS(sGoldVans[0].veh, <<124.6597, -1200.9230, 28.4754>>)
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[0].veh)
ENDIF
IF NOT IS_ENTITY_DEAD(sGoldVans[1].veh)
SET_ENTITY_COORDS(sGoldVans[1].veh, <<125.0192, -1197.5840, 28.4754>>)
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[1].veh)
ENDIF
BLOCK_PEDS_SPAWNING_AT_UNDERPASS(TRUE)
CLEAR_AREA_OF_PEDS(vChaseTriggerStart, 300.0)
//Start the uber chase.
vehChaseTrigger = CREATE_VEHICLE(modelChaseCars, vChaseTriggerStart, fChaseTriggerHeading)
SET_ENTITY_COLLISION(vehChaseTrigger, FALSE)
SET_ENTITY_VISIBLE(vehChaseTrigger, FALSE)
SET_ENTITY_INVINCIBLE(vehChaseTrigger, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelChaseCars)
FLOAT fPlaybackStartTime = 1500.0
INITIALISE_UBER_PLAYBACK(strCarrec, CARREC_CHASE_TRIGGER)
LOAD_CHASE_UBER_DATA()
LOAD_ACTION_CAM_DATA()
START_PLAYBACK_RECORDED_VEHICLE(vehChaseTrigger, CARREC_CHASE_TRIGGER, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehChaseTrigger, fPlaybackStartTime)
SET_UBER_PLAYBACK_TO_TIME_NOW(vehChaseTrigger, fPlaybackStartTime)
fUberPlaybackDensitySwitchOffRange = 250.0
fUberMinTimeBeforePlaybackStartToCreate = 1000.0
allow_veh_to_stop_on_PLAYER_impact = TRUE
bTrafficDontSwitchToAI = TRUE
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02)
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
SET_VEHICLE_ENGINE_ON(sGoldCars[PLAYERS_GOLD_CAR].veh, TRUE, TRUE)
SET_ENTITY_COORDS(sGoldCars[PLAYERS_GOLD_CAR].veh, <<127.3749, -1186.2219, 28.5033>>)
SET_ENTITY_HEADING(sGoldCars[PLAYERS_GOLD_CAR].veh, 194.1942)
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldCars[PLAYERS_GOLD_CAR].veh)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldCars[PLAYERS_GOLD_CAR].veh, SC_DOOR_BOOT, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
START_PLAYBACK_RECORDED_VEHICLE(sGoldCars[0].veh, CARREC_CHASE_BUDDY_1, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldCars[0].veh, fPlaybackStartTime)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldCars[0].veh)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldCars[0].veh, SC_DOOR_BOOT, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
START_PLAYBACK_RECORDED_VEHICLE(sGoldCars[1].veh, CARREC_CHASE_BUDDY_2, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldCars[1].veh, fPlaybackStartTime)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldCars[1].veh)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldCars[1].veh, SC_DOOR_BOOT, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
START_PLAYBACK_RECORDED_VEHICLE(sGoldCars[2].veh, iCarrecChaseBuddy3, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldCars[2].veh, fPlaybackStartTime)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldCars[2].veh)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldCars[2].veh, SC_DOOR_BOOT, FALSE)
ENDIF
fChasePlaybackSpeed = 1.0
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
SET_PED_POPULATION_BUDGET(1)
SET_VEHICLE_POPULATION_BUDGET(1)
SET_STUNT_JUMPS_CAN_TRIGGER(FALSE)
SET_VEHICLE_POPULATION_BUDGET(1)
//Turn ragdoll back on for the peds left behind, to prevent issues with colliding with vehicles.
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
SET_PED_CAN_RAGDOLL(sCrew[CREW_GUNMAN].ped, TRUE)
sCrew[CREW_GUNMAN].iEvent = 0
ENDIF
SET_AGGRESSIVE_HORNS(TRUE)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 5)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SET_WANTED_LEVEL_MULTIPLIER(0.0)
//SET_MAX_WANTED_LEVEL(0)
//SET_FAKE_WANTED_LEVEL(5)
SET_POLICE_RADAR_BLIPS(TRUE)
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), FALSE)
SET_CREATE_RANDOM_COPS(FALSE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, FALSE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
SET_RANDOM_TRAINS(FALSE)
DELETE_ALL_TRAINS()
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(TRUE)
CLEAR_TRIGGERED_LABELS()
IF IS_SCREEN_FADED_OUT()
TRIGGER_MUSIC_EVENT("FH2A_GETAWAY_RESTART")
ELSE
TRIGGER_MUSIC_EVENT("FH2A_GETAWAY_DRIVE_MA")
ENDIF
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, FALSE)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1800)
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1800)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_PED_MAX_HEALTH(sCrew[CREW_DRIVER].ped, 1800)
SET_ENTITY_HEALTH(sCrew[CREW_DRIVER].ped, 1800)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sCrew[CREW_DRIVER].ped, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_DRIVER].ped, TRUE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
SET_VEHICLE_BRAKE_LIGHTS(sGoldCars[PLAYERS_GOLD_CAR].veh, FALSE)
ENDIF
//Gold trolleys are no longer needed (the van doors will be closed).
REMOVE_OBJECT(objGoldTrolleys[0], TRUE)
REMOVE_OBJECT(objGoldTrolleys[1], TRUE)
SET_FORCED_OBJECTS_FOR_CHASE(TRUE)
BLOCK_PEDS_DURING_CHASE(TRUE)
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_CHASE_MAIN")
START_AUDIO_SCENE("BS_2A_CHASE_MAIN")
ENDIF
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_DRIVING)
sCrew[CREW_FORCED_GUNMAN].iEvent = 0
bMichaelInvincibleDuringChase = FALSE
bHeliAudioSceneSet = FALSE
iChaseEndTimer = 0
iMusicTriggerEvent = 0
iJumpSlomoStage = 0
iGasTankerDialogueTimer = 0
iCurrentEvent = 0
iChaseAudioSceneEvent = 0
iCopsTailingFranklinEvent = 0
fUberPlaybackParkedCarCleanupDistance = 50.0
bPlayTruckMusicEvent = FALSE
iCurrentTake = iMaxTakeConsideringCrew
iDisplayedTake = iCurrentTake
iNumTimesPlayedTrevorLostDialogue = 0
iNumTimesPlayedMichaelLostDialogue = 0
iNumTimesPlayedTrevorFoundDialogue = 0
iNumTimesPlayedMichaelFoundDialogue = 0
iNumTimesPlayedCrewLostDialogue = 0
iLostDialogueTimer = 0
fCurrentTimeScale = 1.0
g_bBigScore2ARescuedBadDriver = FALSE
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_DOWN, TRUE)
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_UP, TRUE)
IF NOT IS_SCREEN_FADED_IN()
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_IN()
PRELOAD_ALL_CHASE_RECORDINGS(fChasePlaybackTime)
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
UPDATE_UBER_PLAYBACK(vehChaseTrigger, 1.0)
UPDATE_CHASE_SET_PIECES()
DISPLAY_TAKE()
WAIT(0)
ENDWHILE
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_CHASE, "CAR_CHASE")
SETTIMERA(0)
SETTIMERB(0)
REPLAY_RECORD_BACK_FOR_TIME(0.0, 14.0, REPLAY_IMPORTANCE_HIGHEST)
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
UPDATE_WANTED_POSITION_THIS_FRAME(PLAYER_ID())
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS_FOR_AMBIENT_PEDS_THIS_FRAME(TRUE)
REQUEST_SCRIPT_AUDIO_BANK("CAR_CRASHES_01")
IF fChasePlaybackTime < 70000.0
fUberMinTimeBeforePlaybackStartToCreate = 1500.0
ELSE
fUberMinTimeBeforePlaybackStartToCreate = 4000.0
ENDIF
DISPLAY_TAKE()
IF IS_VEHICLE_DRIVEABLE(vehChaseTrigger)
AND IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChaseTrigger)
fChasePlaybackTime = GET_TIME_POSITION_IN_RECORDING(vehChaseTrigger)
ELSE
IF NOT IS_ENTITY_STATIC(vehChaseTrigger)
FREEZE_ENTITY_POSITION(vehChaseTrigger, TRUE)
ENDIF
ENDIF
//Disable the player's brake lights at the start, as they flick on after the seamless blendout from the cutscene.
IF TIMERA() < 500
SET_VEHICLE_BRAKE_LIGHTS(sGoldCars[PLAYERS_GOLD_CAR].veh, FALSE)
ENDIF
//Distance is based on next closest car: one of the cars can crash halfway through so update relative to a different car when this happens.
FLOAT fDistToNextCar = 0.0
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh) AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[2].veh)
/*IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh) AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh) AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[1].veh)
PRINTLN(GET_TIME_POSITION_IN_RECORDING(sGoldCars[2].veh), " ", GET_TIME_POSITION_IN_RECORDING(sGoldCars[0].veh), " ", GET_TIME_POSITION_IN_RECORDING(sGoldCars[1].veh))
ENDIF*/
RUBBER_BAND_CHASE(fChasePlaybackSpeed, sGoldCars[PLAYERS_GOLD_CAR].veh, sGoldCars[2].veh)
fDistToNextCar = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sGoldCars[2].veh))
ELIF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
RUBBER_BAND_CHASE(fChasePlaybackSpeed, sGoldCars[PLAYERS_GOLD_CAR].veh, sGoldCars[1].veh)
fDistToNextCar = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sGoldCars[1].veh))
ENDIF
PRELOAD_ALL_CHASE_RECORDINGS(fChasePlaybackTime)
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
UPDATE_UBER_PLAYBACK(vehChaseTrigger, fChasePlaybackSpeed)
UPDATE_CHASE_SET_PIECES()
UPDATE_CHASE_COPS()
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, sGoldCars[2].veh)
//DO_CHASE_CAM(sGoldCars[2].veh, sGoldCars[PLAYERS_GOLD_CAR].veh)
ELSE
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, sGoldCars[1].veh)
ENDIF
//DO_CHASE_CAM(sGoldCars[1].veh, sGoldCars[PLAYERS_GOLD_CAR].veh)
ENDIF
//Get the closest vehicle to the player periodically: this is used to check dialogue and horn triggers elsewhere.
VEHICLE_INDEX vehClosest
IF GET_GAME_TIMER() - iClosestVehicleCheckTimer > 200
vehClosest = GET_CLOSEST_VEHICLE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 10.0, DUMMY_MODEL_FOR_SCRIPT, GET_TRAFFIC_VEHICLE_SEARCH_FLAGS())
iClosestVehicleCheckTimer = GET_GAME_TIMER()
ENDIF
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sGoldCars[PLAYERS_GOLD_CAR].veh)
IF IS_THIS_PRINT_BEING_DISPLAYED("F3A_GETBACKCAR")
CLEAR_PRINTS()
ENDIF
IF DOES_BLIP_EXIST(sGoldCars[PLAYERS_GOLD_CAR].blip)
REMOVE_BLIP(sGoldCars[PLAYERS_GOLD_CAR].blip)
ENDIF
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_ReduceEffectOfVehicleRamControlLoss, TRUE)
//Pre-stream final cutscene location once the player is about the reach the end.
IF fChasePlaybackTime > 100000.0
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(vehTrailer[0])) < 900.0
NEW_LOAD_SCENE_START_SPHERE(<<-1613.5, -724.0, 10.8>>, 60.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
ENDIF
ENDIF
ENDIF
ENDIF
//Help text (action cam is currently commented out
/*IF NOT IS_MESSAGE_BEING_DISPLAYED()
IF fChasePlaybackTime > 7000.0
AND NOT bHasTextLabelTriggered[F3A_CAMHELP]
IF fDistToNextCar < 2500.0
PRINT_HELP("F3A_CAMHELP")
bHasTextLabelTriggered[F3A_CAMHELP] = TRUE
ENDIF
ENDIF
ENDIF*/
//Chase dialogue.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//Play a line from Michael before the god text.
IF NOT bHasTextLabelTriggered[FH3A_DRIVEOF]
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_DRIVEOF", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_DRIVEOF] = TRUE
ENDIF
ELIF NOT bHasTextLabelTriggered[F3A_CHASE]
//This is also a good moment to play the custom police report.
PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_BS_2A_01")
PRINT_NOW("F3A_CHASE", DEFAULT_GOD_TEXT_TIME, 0)
bHasTextLabelTriggered[F3A_CHASE] = TRUE
ENDIF
//All dialogue below comes after the initial god text.
IF bHasTextLabelTriggered[F3A_CHASE]
//Dialogue if Franklin crashes into crew cars.
IF iChaseCrashTimer = 0 OR GET_GAME_TIMER() - iChaseCrashTimer > 20000
AND fChasePlaybackTime < 110000.0
IF (IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh) AND IS_ENTITY_TOUCHING_ENTITY(sGoldCars[PLAYERS_GOLD_CAR].veh, sGoldCars[2].veh))
IF NOT IS_ENTITY_ATTACHED(sGoldCars[2].veh)
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_HIT", CONV_PRIORITY_MEDIUM)
iChaseCrashTimer = GET_GAME_TIMER()
//Cancel any responses if this dialogue cuts in.
bMichaelSaidInstructionInChase = FALSE
ENDIF
ENDIF
ELIF (IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh) AND IS_ENTITY_TOUCHING_ENTITY(sGoldCars[PLAYERS_GOLD_CAR].veh, sGoldCars[1].veh))
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_HIT", CONV_PRIORITY_MEDIUM)
iChaseCrashTimer = GET_GAME_TIMER()
bMichaelSaidInstructionInChase = FALSE
ENDIF
ENDIF
ENDIF
IF fDistToNextCar < 2500.0
//Dialogue in here will be followed by a response from Trevor on some occasions.
IF NOT bMichaelSaidInstructionInChase
//Turn left.
IF (fChasePlaybackTime > 9000.0 AND fChasePlaybackTime < 10000.0)
OR (fChasePlaybackTime > 22000.0 AND fChasePlaybackTime < 23000.0)
OR (fChasePlaybackTime > 33000.0 AND fChasePlaybackTime < 34000.0)
OR (fChasePlaybackTime > 78000.0 AND fChasePlaybackTime < 79000.0)
OR (fChasePlaybackTime > 49000.0 AND fChasePlaybackTime < 50000.0)
bMichaelSaidInstructionInChase = CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LEFTM", CONV_PRIORITY_MEDIUM)
ENDIF
//Turn right.
IF (fChasePlaybackTime > 26000.0 AND fChasePlaybackTime < 27000.0)
OR (fChasePlaybackTime > 83000.0 AND fChasePlaybackTime < 84000.0)
bMichaelSaidInstructionInChase = CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RIGHT2", CONV_PRIORITY_MEDIUM)
ENDIF
//Go straight.
IF (fChasePlaybackTime > 18000.0 AND fChasePlaybackTime < 19000.0)
OR (fChasePlaybackTime > 73500.0 AND fChasePlaybackTime < 74500.0)
bMichaelSaidInstructionInChase = CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_STRAM", CONV_PRIORITY_MEDIUM)
ENDIF
//Michael gives general encouragement.
IF (fChasePlaybackTime > 13000.0 AND fChasePlaybackTime < 14000.0)
OR (fChasePlaybackTime > 31000.0 AND fChasePlaybackTime < 32000.0)
OR (fChasePlaybackTime > 58000.0 AND fChasePlaybackTime < 59000.0)
OR (fChasePlaybackTime > 94000.0 AND fChasePlaybackTime < 95000.0)
CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_KEEP", CONV_PRIORITY_MEDIUM)
ENDIF
//Dialogue when cops are getting close to crew.
IF GET_GAME_TIMER() - iCopsCollisionDialogueTimer > 10000
IF (fChasePlaybackTime > 16500.0 AND fChasePlaybackTime < 18500.0)
OR (fChasePlaybackTime > 37500.0 AND fChasePlaybackTime < 39500.0)
OR (fChasePlaybackTime > 75000.0 AND fChasePlaybackTime < 80500.0)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RAMMED", CONV_PRIORITY_MEDIUM)
iCopsCollisionDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
//Hard right.
IF (fChasePlaybackTime > 50000.0 AND fChasePlaybackTime < 52000.0)
IF NOT bHasTextLabelTriggered[FH3A_HARDR]
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_HARDR", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
bHasTextLabelTriggered[FH3A_HARDR] = TRUE
bMichaelSaidInstructionInChase = TRUE
ENDIF
ENDIF
ENDIF
//Rockford jump.
IF (fChasePlaybackTime > 59000.0 AND fChasePlaybackTime < 60000.0)
bMichaelSaidInstructionInChase = CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_ROCK", CONV_PRIORITY_MEDIUM)
ENDIF
//Doing the stunt jump.
IF (fChasePlaybackTime > 63300.0 AND fChasePlaybackTime < 64300.0)
IF NOT bHasTextLabelTriggered[FH3A_MJUMP]
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MJUMP", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
bHasTextLabelTriggered[FH3A_MJUMP] = TRUE
ENDIF
ENDIF
ENDIF
//Michael goes over the jump.
IF (fChasePlaybackTime > 65300.0 AND fChasePlaybackTime < 66300.0)
IF NOT bHasTextLabelTriggered[FH3A_GOOFF]
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_GOOFF", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_GOOFF] = TRUE
ENDIF
ENDIF
ENDIF
//Crew member goes over the jump.
IF (fChasePlaybackTime > 68700.0 AND fChasePlaybackTime < 69700.0)
IF NOT bHasTextLabelTriggered[FH3A_JUMP]
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_JUMP", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_JUMP] = TRUE
ENDIF
ENDIF
ENDIF
//Crew member reacts to the explosion.
IF (fChasePlaybackTime > 72000.0 AND fChasePlaybackTime < 73500.0)
IF NOT bHasTextLabelTriggered[FH3A_EXP]
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_EXP", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
bHasTextLabelTriggered[FH3A_EXP] = TRUE
ENDIF
ENDIF
ENDIF
//Michael sees the chopper.
IF (fChasePlaybackTime > 90500.0 AND fChasePlaybackTime < 93500.0)
IF NOT bHasTextLabelTriggered[FH3A_CHOP]
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_CHOP", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
bHasTextLabelTriggered[FH3A_CHOP] = TRUE
ENDIF
ENDIF
ENDIF
//Michael sees the tunnel.
IF (fChasePlaybackTime > 98000.0 AND fChasePlaybackTime < 100000.0)
IF NOT bHasTextLabelTriggered[FH3A_SEETUN]
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SEETUN", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
bHasTextLabelTriggered[FH3A_SEETUN] = TRUE
ENDIF
ENDIF
ENDIF
ELSE
INT iRandom = GET_RANDOM_INT_IN_RANGE(0, 3)
IF iRandom = 0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SARKY", CONV_PRIORITY_MEDIUM)
bMichaelSaidInstructionInChase = FALSE
ENDIF
ELIF iRandom = 1
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_ONM", CONV_PRIORITY_MEDIUM)
bMichaelSaidInstructionInChase = FALSE
ENDIF
ELSE
bMichaelSaidInstructionInChase = FALSE
ENDIF
ENDIF
IF NOT bHasTextLabelTriggered[FH3A_COPS]
//Cop roadblock by building site.
IF fChasePlaybackTime > 40500.0 AND fChasePlaybackTime < 42000.0
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_COPS", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_COPS] = TRUE
ENDIF
ENDIF
/*ELIF NOT bHasTextLabelTriggered[FH3A_COPSCREW]
IF fChasePlaybackTime < 44000.0
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_COPS", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_COPSCREW] = TRUE
ENDIF
ELSE
bHasTextLabelTriggered[FH3A_COPSCREW] = TRUE
ENDIF*/
ENDIF
//Go through building site.
IF fChasePlaybackTime > 42000.0 AND fChasePlaybackTime < 44000.0
IF NOT bHasTextLabelTriggered[FH3A_SITE]
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SITE", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_SITE] = TRUE
ENDIF
ENDIF
ENDIF
IF NOT bPickedGoodCarDriver
AND fChasePlaybackTime > 85000.0
AND IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
AND NOT g_bBigScore2ARescuedBadDriver
IF NOT bHasTextLabelTriggered[FH3A_LOST]
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LOST", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_LOST] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//Important dialogue about trucks: allow this to trigger from further back.
IF fDistToNextCar < 4900.0
//Get in truck dialogue: this syncs with a blip update.
IF NOT bHasTextLabelTriggered[FH3A_TRUCK]
IF fChasePlaybackTime > 101000.0
AND bSafeToDriveOntoTrucks
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_TRUCK", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_TRUCK] = TRUE
ENDIF
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_RTRUCK]
IF bPickedGoodCarDriver
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RTRUCK", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_RTRUCK] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RTRUCK2", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_RTRUCK] = TRUE
ENDIF
ENDIF
ELSE
//Extra lines from the good driver.
IF bPickedGoodCarDriver
IF NOT bHasTextLabelTriggered[FH3A_TRK]
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
AND NOT IS_ENTITY_ATTACHED(sGoldCars[2].veh)
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_TRK", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_TRK] = TRUE
ENDIF
ELSE
bHasTextLabelTriggered[FH3A_TRK] = TRUE
ENDIF
ELIF NOT bPlayerIsDrivingUpRamp
//Line encouraging the player.
IF NOT bHasTextLabelTriggered[FH3A_ENC]
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
AND IS_ENTITY_ATTACHED(sGoldCars[2].veh)
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_ENC", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_ENC] = TRUE
ENDIF
ENDIF
ENDIF
//Line if the player is running out of time.
IF NOT bHasTextLabelTriggered[FH3A_MAKE]
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
AND IS_ENTITY_ATTACHED(sGoldCars[2].veh)
IF fChasePlaybackTime > 114500.0
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_MAKE", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_MAKE] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF fChasePlaybackTime > 10000.0
IF fDistToNextCar > 10000.0
//Dialogue if Franklin falls too far behind: can be Trevor or Michael speaking
IF NOT bHasTextLabelTriggered[FH3A_WHERE]
IF GET_GAME_TIMER() - iLostDialogueTimer > 10000
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
IF iNumTimesPlayedTrevorLostDialogue < 3
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_WHERET", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_WHERE] = TRUE
bHasTextLabelTriggered[FH3A_WHF] = FALSE
bMichaelSaidInstructionInChase = FALSE
iNumTimesPlayedTrevorLostDialogue++
iLostDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ELSE
IF iNumTimesPlayedMichaelLostDialogue < 3
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_WHEREM", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_WHERE] = TRUE
bHasTextLabelTriggered[FH3A_WHF] = FALSE
iNumTimesPlayedMichaelLostDialogue++
iLostDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF iNumTimesPlayedCrewLostDialogue < 4
IF NOT bHasTextLabelTriggered[FH3A_WHF]
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_WHF", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_WHF] = TRUE
iNumTimesPlayedCrewLostDialogue++
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
//Once the player gets close enough flag the dialogue so it can be triggered later.
IF bHasTextLabelTriggered[FH3A_WHERE]
AND NOT bHasTextLabelTriggered[FH3A_TRUCK] //Don't trigger once we reach the trucks.
IF fDistToNextCar < 2500.0
BOOL bPlayedConvo
//Play a conversation with them noticing the player returned.
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
IF iNumTimesPlayedTrevorFoundDialogue < 2
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_FBACKT", CONV_PRIORITY_MEDIUM)
iNumTimesPlayedTrevorFoundDialogue++
bPlayedConvo = TRUE
ENDIF
ENDIF
ELSE
IF iNumTimesPlayedMichaelFoundDialogue < 2
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_FBACKM", CONV_PRIORITY_MEDIUM)
iNumTimesPlayedMichaelFoundDialogue++
bPlayedConvo = TRUE
ENDIF
ENDIF
ENDIF
IF bPlayedConvo
OR (iNumTimesPlayedMichaelFoundDialogue >= 2 AND iNumTimesPlayedTrevorFoundDialogue >= 2)
bHasTextLabelTriggered[FH3A_WHERE] = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Franklin says a line when the gas tanker blows up.
IF iGasTankerDialogueTimer != 0
IF NOT bHasTextLabelTriggered[FH3A_TANKER]
IF GET_GAME_TIMER() - iGasTankerDialogueTimer > 1000
AND GET_GAME_TIMER() - iGasTankerDialogueTimer < 5000
IF IS_SPHERE_VISIBLE(<<-338.5, -184.3, 40.7>>, 5.0)
AND fChasePlaybackSpeed > 0.7
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_TANKER", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(5.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
bHasTextLabelTriggered[FH3A_TANKER] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//If the truck driver is bad the good car driver will comment.
IF NOT bHasTextLabelTriggered[FH3A_BADTRK]
IF NOT bPickedGoodTruckDriver
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
VECTOR vTrailerPos = GET_ENTITY_COORDS(vehTrailer[0])
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF VDIST2(vTrailerPos, vPlayerPos) < 10000.0
AND ABSF(vTrailerPos.z - vPlayerPos.z) < 10.0 //Don't trigger if the player starts driving off above the tunnel.
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_BADTRK", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_BADTRK] = TRUE
ENDIF
ENDIF
ENDIF
ELSE
bHasTextLabelTriggered[FH3A_BADTRK] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//God text at end: instructs player to drive onto the truck
IF fChasePlaybackTime > 90000.0
IF bHasTextLabelTriggered[FH3A_RTRUCK]
AND bHasTextLabelTriggered[FH3A_BADTRK]
IF NOT DOES_BLIP_EXIST(blipCurrentObjective)
AND NOT IS_ENTITY_DEAD(vehTrailer[0])
REMOVE_ALL_BLIPS()
blipCurrentObjective = CREATE_BLIP_FOR_ENTITY(vehTrailer[0])
ENDIF
IF NOT bHasTextLabelTriggered[F3A_TRUCK]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
AND bSafeToDriveOntoTrucks
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
PRINT_NOW("F3A_TRUCK", DEFAULT_GOD_TEXT_TIME, 0)
bHasTextLabelTriggered[F3A_TRUCK] = TRUE
ENDIF
ENDIF
ENDIF
//Do some slomo on the stunt jump
SWITCH iJumpSlomoStage
CASE 0
IF fChasePlaybackTime > 45000.0
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_MUSCLE_JUMP")
IF IS_ENTITY_IN_AIR(sGoldCars[PLAYERS_GOLD_CAR].veh)
AND GET_ENTITY_SPEED(sGoldCars[PLAYERS_GOLD_CAR].veh) > 5.0
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-268.697235,-209.381454,37.027538>>, <<-240.500488,-209.981812,51.379856>>, 16.000000)
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_MUSCLE_JUMP")
PLAY_SOUND_FROM_ENTITY(-1, "Muscle_Jump", sGoldCars[PLAYERS_GOLD_CAR].veh, "BIG_SCORE_3A_SOUNDS")
ENDIF
ACTIVATE_AUDIO_SLOWMO_MODE("SLOWMO_BIG_SCORE_JUMP")
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", TRUE)
//Record footage of the player doing the jump.
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
fCurrentTimeScale = 1.0
bSlomoActive = TRUE
iJumpSlomoStage++
ENDIF
ENDIF
BREAK
CASE 1
fCurrentTimeScale = fCurrentTimeScale -@ 2.0
IF fCurrentTimeScale < 0.25
fCurrentTimeScale = 0.25
ENDIF
SET_TIME_SCALE(fCurrentTimeScale)
IF NOT IS_ENTITY_IN_AIR(sGoldCars[PLAYERS_GOLD_CAR].veh)
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_MUSCLE_JUMP")
PLAY_SOUND_FROM_ENTITY(-1, "Muscle_Land", sGoldCars[PLAYERS_GOLD_CAR].veh, "BIG_SCORE_3A_SOUNDS")
ENDIF
DEACTIVATE_AUDIO_SLOWMO_MODE("SLOWMO_BIG_SCORE_JUMP")
iJumpSlomoStage++
ENDIF
BREAK
CASE 2
fCurrentTimeScale = fCurrentTimeScale +@ 2.0
IF fCurrentTimeScale > 1.0
fCurrentTimeScale = 1.0
ENDIF
SET_TIME_SCALE(fCurrentTimeScale)
IF fCurrentTimeScale = 1.0
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", FALSE)
bSlomoActive = FALSE
iJumpSlomoStage++
ENDIF
BREAK
CASE 3
IF fChasePlaybackTime > 85000.0
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_MUSCLE_JUMP")
ENDIF
BREAK
ENDSWITCH
//Music events during chase.
SWITCH iMusicTriggerEvent
CASE 0 //Slomo jump start.
IF fChasePlaybackTime > 25000.0
PREPARE_MUSIC_EVENT("FH2A_JUMP_START")
IF bSlomoActive
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_STUNT_JUMP")
START_AUDIO_SCENE("BS_2A_STUNT_JUMP")
ENDIF
TRIGGER_MUSIC_EVENT("FH2A_JUMP_START")
iMusicTriggerEvent++
ENDIF
//Skip this event if the player missed the jump.
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(vehTrailer[0])) < 2500.0
CANCEL_MUSIC_EVENT("FH2A_JUMP_START")
iMusicTriggerEvent = 10
ENDIF
ENDIF
ENDIF
BREAK
CASE 1 //Slomo jump end.
IF NOT bSlomoActive
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_STUNT_JUMP")
STOP_AUDIO_SCENE("BS_2A_STUNT_JUMP")
ENDIF
TRIGGER_MUSIC_EVENT("FH2A_JUMP_LAND_MA")
iMusicTriggerEvent = 10
ENDIF
BREAK
CASE 10 //Entered tunnel
IF fChasePlaybackTime > 90000.0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1136.715332,-652.429749,9.754271>>, <<-1149.459961,-662.953308,19.357641>>, 52.750000)
TRIGGER_MUSIC_EVENT("FH2A_ENTER_TUNNEL")
iMusicTriggerEvent++
ENDIF
ENDIF
BREAK
CASE 11 //Made it onto truck.
IF fChasePlaybackTime > 100000.0
PREPARE_MUSIC_EVENT("FH2A_ENTER_TRUCK")
IF bPlayTruckMusicEvent //This gets set when the player hits the locate on the truck.
TRIGGER_MUSIC_EVENT("FH2A_ENTER_TRUCK")
iMusicTriggerEvent++
ENDIF
ENDIF
BREAK
ENDSWITCH
//Main audio scenes during chase.
SWITCH iChaseAudioSceneEvent
CASE 0 //Once the player reaches the tunnel change scenes.
IF fChasePlaybackTime > 90000.0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1136.715332,-652.429749,9.754271>>, <<-1149.459961,-662.953308,19.357641>>, 52.750000)
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CHASE_MAIN")
STOP_AUDIO_SCENE("BS_2A_CHASE_MAIN")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_DRIVE_INTO_TRUCK")
START_AUDIO_SCENE("BS_2A_DRIVE_INTO_TRUCK")
ENDIF
iChaseAudioSceneEvent++
ENDIF
ENDIF
BREAK
ENDSWITCH
//Cop heli audio scene
IF NOT bHeliAudioSceneSet
IF DOES_ENTITY_EXIST(pedHeliGunner)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-1023.497925,-587.214844,32.478542>>,<<37.750000,49.000000,17.000000>>)
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_CHASE_TUNNEL_CHOPPER")
START_AUDIO_SCENE("BS_2A_CHASE_TUNNEL_CHOPPER")
bHeliAudioSceneSet = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CHASE_TUNNEL_CHOPPER")
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1144.928955,-656.833252,9.215416>>, <<-1152.370605,-661.714722,17.095579>>, 50.500000)
STOP_AUDIO_SCENE("BS_2A_CHASE_TUNNEL_CHOPPER")
ENDIF
ENDIF
ENDIF
IF vehClosest != sGoldCars[0].veh
AND vehClosest != sGoldCars[1].veh
AND vehClosest != sGoldCars[2].veh
//Horns
UPDATE_CHASE_HORNS(iChaseHornTimer, vehClosest)
//Ambient dialogue
UPDATE_CHASE_AMBIENT_SHOUTS(iAmbientDialogueTimer, sGoldCars[PLAYERS_GOLD_CAR].veh, vehClosest)
ENDIF
ELSE
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sGoldCars[PLAYERS_GOLD_CAR].veh)
//Blip the vehicle and tell the player to get back in.
IF NOT DOES_BLIP_EXIST(sGoldCars[PLAYERS_GOLD_CAR].blip)
REMOVE_ALL_BLIPS()
sGoldCars[PLAYERS_GOLD_CAR].blip = CREATE_BLIP_FOR_VEHICLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
ENDIF
IF NOT bHasTextLabelTriggered[F3A_GETBACKCAR]
PRINT_NOW("F3A_GETBACKCAR", DEFAULT_GOD_TEXT_TIME, 0)
bHasTextLabelTriggered[F3A_GETBACKCAR] = TRUE
ENDIF
ENDIF
//Clear any text that should not appear outside the car.
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_CAMHELP")
CLEAR_HELP()
ENDIF
//If the player ditched the car during the slomo sequence go back into regular time.
IF bSlomoActive
fCurrentTimeScale = fCurrentTimeScale +@ 2.0
IF fCurrentTimeScale > 1.0
fCurrentTimeScale = 1.0
ENDIF
SET_TIME_SCALE(fCurrentTimeScale)
IF fCurrentTimeScale = 1.0
bSlomoActive = FALSE
ENDIF
ENDIF
ENDIF
//Warp chase cars onto the back of the truck
VECTOR vAttachOffset, vAttachRotation
VECTOR vWheelOffsetFromTruck[4]
VECTOR vWheelPos[4]
FLOAT fGoodDriverPlaybackTime, fCrewDriverPlaybackSpeed
REPEAT COUNT_OF(sGoldCars) i
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
//Blip the buddies and display god text if needed
IF i != PLAYERS_GOLD_CAR
IF NOT IS_ENTITY_ATTACHED(sGoldCars[i].veh)
IF fChasePlaybackTime < 90000.0
AND NOT DOES_BLIP_EXIST(sGoldCars[i].blip)
AND IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sGoldCars[PLAYERS_GOLD_CAR].veh)
sGoldCars[i].blip = CREATE_BLIP_FOR_ENTITY(sGoldCars[i].veh)
ENDIF
//Match playback speed to main chase
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[i].veh)
//908012 - The crew driver seems to be ahead of the chase during normal playback, this causes issues with the trucks so slow them down a bit.
IF i != 2
SET_PLAYBACK_SPEED(sGoldCars[i].veh, fChasePlaybackSpeed)
ELSE
fCrewDriverPlaybackSpeed = fChasePlaybackSpeed
IF bPickedGoodCarDriver
AND NOT bPickedGoodTruckDriver
IF fChasePlaybackTime > 95000.0
fGoodDriverPlaybackTime = GET_TIME_POSITION_IN_RECORDING(sGoldCars[i].veh)
IF fChasePlaybackTime - fGoodDriverPlaybackTime < 200.0
//fCrewDriverPlaybackSpeed -= 0.02
ENDIF
//PRINTLN(fChasePlaybackTime, " ", fGoodDriverPlaybackTime, " ", fChasePlaybackTime - fGoodDriverPlaybackTime)
ENDIF
ENDIF
SET_PLAYBACK_SPEED(sGoldCars[i].veh, fCrewDriverPlaybackSpeed)
ENDIF
ENDIF
BOOL bAttach = FALSE
FLOAT fRecordingDuration = 0.0
FLOAT fTimeLeftInRecording = 0.0
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
AND NOT IS_ENTITY_DEAD(vehTrailer[1])
IF i = 0
IF fChasePlaybackTime > 100000.0
bAttach = FALSE
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[i].veh)
fRecordingDuration = GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_1, strCarrec)
fTimeLeftInRecording = fRecordingDuration - GET_TIME_POSITION_IN_RECORDING(sGoldCars[i].veh)
IF fTimeLeftInRecording < 150.0
vAttachOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrailer[1], GET_ENTITY_COORDS(sGoldCars[i].veh))
vAttachRotation = GET_ENTITY_ROTATION(sGoldCars[i].veh) - GET_ENTITY_ROTATION(vehTrailer[1])
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldCars[i].veh)
ATTACH_VEHICLE_ON_TO_TRAILER(sGoldCars[i].veh, vehTrailer[1], <<0.0, 0.0, 0.0>>, vAttachOffset, vAttachRotation, -1)
ENDIF
ENDIF
ENDIF
ELIF i = 1
IF fChasePlaybackTime > 100000.0
bAttach = FALSE
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[i].veh)
fRecordingDuration = GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_2, strCarrec)
fTimeLeftInRecording = fRecordingDuration - GET_TIME_POSITION_IN_RECORDING(sGoldCars[i].veh)
IF fTimeLeftInRecording < 150.0
vAttachOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrailer[1], GET_ENTITY_COORDS(sGoldCars[i].veh))
vAttachRotation = GET_ENTITY_ROTATION(sGoldCars[i].veh) - GET_ENTITY_ROTATION(vehTrailer[1])
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldCars[i].veh)
ATTACH_VEHICLE_ON_TO_TRAILER(sGoldCars[i].veh, vehTrailer[1], <<0.0, 0.0, 0.0>>, vAttachOffset, vAttachRotation, -1)
ENDIF
ENDIF
ENDIF
ELIF i = 2
IF fChasePlaybackTime > 100000.0
bAttach = FALSE
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[i].veh)
fRecordingDuration = GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iCarrecChaseBuddy3, strCarrec)
fTimeLeftInRecording = fRecordingDuration - GET_TIME_POSITION_IN_RECORDING(sGoldCars[i].veh)
IF fTimeLeftInRecording < 500.0
bAttach = TRUE
ENDIF
IF fTimeLeftInRecording < 1500.0
IF bPickedGoodTruckDriver
fPlaybackOffset = 0.3 * (1.0 - (fTimeLeftInRecording / 1500.0))
ELSE
fPlaybackOffset = 0.05 * (1.0 - (fTimeLeftInRecording / 1500.0))
ENDIF
SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(sGoldCars[i].veh, <<0.0, 0.0, fPlaybackOffset>>)
ENDIF
ELSE
IF bPickedGoodCarDriver
AND VDIST2(GET_ENTITY_COORDS(vehTrailer[0]), GET_ENTITY_COORDS(sGoldCars[i].veh)) < 400.0
bAttach = TRUE
ENDIF
ENDIF
IF bAttach
vAttachOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrailer[0], GET_ENTITY_COORDS(sGoldCars[i].veh))
vAttachRotation = GET_ENTITY_ROTATION(sGoldCars[i].veh) - GET_ENTITY_ROTATION(vehTrailer[0])
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldCars[i].veh)
SET_ENTITY_INVINCIBLE(sGoldCars[i].veh, TRUE)
ATTACH_VEHICLE_ON_TO_TRAILER(sGoldCars[i].veh, vehTrailer[0], <<0.0, 0.0, 0.0>>, vAttachOffset, vAttachRotation, -1)
ENDIF
ELSE
fPlaybackOffset = 0.0
ENDIF
IF (bPickedGoodTruckDriver AND fChasePlaybackTime > 110272.0)
OR (NOT bPickedGoodTruckDriver AND fChasePlaybackTime > 110002.0)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
bPlayerIsDrivingUpRamp = FALSE
IF fChasePlaybackTime > 100000.0
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
VECTOR vTrailerFront = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehTrailer[0], <<-0.1580, 5.7477, 1.5380>>)
VECTOR vTrailerFarBack = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehTrailer[0], <<-0.0096, -20.5751, -4.0258>>)
//Stop the player from diving out the vehicle at the last moment.
IF IS_ENTITY_IN_ANGLED_AREA(sGoldCars[PLAYERS_GOLD_CAR].veh, vTrailerFront, vTrailerFarBack, 5.0)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
ENDIF
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sGoldCars[PLAYERS_GOLD_CAR].veh)
VECTOR vTrailerBackMoreLenient = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehTrailer[0], <<-0.0096, -6.5751, -2.0258>>)
VECTOR vTrailerBack = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehTrailer[0], <<-0.0096, -5.7751, -1.8258>>)
vWheelPos[0] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldCars[i].veh, <<0.7, 1.49, -0.4>>)
vWheelPos[1] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldCars[i].veh, <<-0.7, 1.49, -0.4>>)
vWheelPos[2] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldCars[i].veh, <<0.7, -1.47, -0.4>>)
vWheelPos[3] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldCars[i].veh, <<-0.7, -1.47, -0.4>>)
//Keep track of if the player is potentially driving up the ramp (for dialogue).
IF vWheelPos[0].z > 10.6
bPlayerIsDrivingUpRamp = TRUE
ENDIF
//Slow the player down when they get close to he trailer.
IF VDIST2(vWheelPos[0], vTrailerBackMoreLenient) < 1600.0
IF GET_ENTITY_SPEED(sGoldCars[PLAYERS_GOLD_CAR].veh) > 17.0
SET_ENTITY_VELOCITY(sGoldCars[PLAYERS_GOLD_CAR].veh, GET_ENTITY_VELOCITY(sGoldCars[PLAYERS_GOLD_CAR].veh) * 0.99)
ENDIF
ENDIF
IF IS_POINT_IN_ANGLED_AREA(vWheelPos[0], vTrailerBackMoreLenient, vTrailerFront, 3.0)
AND IS_POINT_IN_ANGLED_AREA(vWheelPos[1], vTrailerBackMoreLenient, vTrailerFront, 3.0)
AND IS_POINT_IN_ANGLED_AREA(vWheelPos[2], vTrailerBackMoreLenient, vTrailerFront, 3.0)
AND IS_POINT_IN_ANGLED_AREA(vWheelPos[3], vTrailerBackMoreLenient, vTrailerFront, 3.0)
bPlayTruckMusicEvent = TRUE
//Pass check: player needs to stay inside the truck for at least a second (doesn't need to be attached).
IF GET_GAME_TIMER() - iChaseEndTimer > 200
//Now is a good moment to record some footage of driving up the ramp.
REPLAY_RECORD_BACK_FOR_TIME(3.0)
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
//Attach check: keep the car in place if it's in a good position.
IF eSectionStage = SECTION_STAGE_CLEANUP
IF NOT IS_ENTITY_ATTACHED(sGoldCars[i].veh)
AND IS_POINT_IN_ANGLED_AREA(vWheelPos[0], vTrailerBack, vTrailerFront, 3.0)
AND IS_POINT_IN_ANGLED_AREA(vWheelPos[1], vTrailerBack, vTrailerFront, 3.0)
AND IS_POINT_IN_ANGLED_AREA(vWheelPos[2], vTrailerBack, vTrailerFront, 3.0)
AND IS_POINT_IN_ANGLED_AREA(vWheelPos[3], vTrailerBack, vTrailerFront, 3.0)
vWheelOffsetFromTruck[0] = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrailer[0], vWheelPos[0])
vWheelOffsetFromTruck[1] = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrailer[0], vWheelPos[1])
vWheelOffsetFromTruck[2] = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrailer[0], vWheelPos[2])
vWheelOffsetFromTruck[3] = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrailer[0], vWheelPos[3])
IF vWheelOffsetFromTruck[0].z < -1.2
AND vWheelOffsetFromTruck[1].z < -1.2
AND vWheelOffsetFromTruck[2].z < -1.2
AND vWheelOffsetFromTruck[3].z < -1.2
vAttachOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrailer[0], GET_ENTITY_COORDS(sGoldCars[i].veh))
vAttachRotation = GET_ENTITY_ROTATION(sGoldCars[i].veh) - GET_ENTITY_ROTATION(vehTrailer[0])
ATTACH_ENTITY_TO_ENTITY(sGoldCars[i].veh, vehTrailer[0], 0, vAttachOffset, vAttachRotation,
FALSE, FALSE, FALSE)
SET_ENTITY_INVINCIBLE(sGoldCars[i].veh, TRUE)
ENDIF
ENDIF
ENDIF
ELSE
iChaseEndTimer = GET_GAME_TIMER()
ENDIF
ENDIF
//Prestream the assets for the chase end cutscene.
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vTrailerFarBack) < 400.0
REQUEST_MODEL(modelEndTruck)
REQUEST_MODEL(modelEndTrailers)
REQUEST_MODEL(modelEndHeli)
REQUEST_MODEL(modelCop)
REQUEST_VEHICLE_RECORDING(CARREC_END_TRAILER_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_END_TRAILER_2, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_END_TRUCK_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_END_TRUCK_2, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_END_HELI, strCarrec)
REQUEST_ANIM_DICT(strTrailerRampAnims)
REQUEST_MODELS_FOR_HEIST_CREW(HEIST_FINALE)
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_RAMP")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF eSectionStage != SECTION_STAGE_CLEANUP
AND NOT IS_ENTITY_DEAD(SetPieceCarID[0]) //Trucks leave the tunnel at this point
IF IS_ENTITY_IN_ANGLED_AREA(SetPieceCarID[0], <<-1602.814453,-716.280029,9.910825>>, <<-1600.750488,-742.499084,16.425133>>, 7.000000)
MISSION_FAILED(FAILED_MISSED_TRUCKS)
ENDIF
ENDIF
ENDIF
//Cleanup all the shootout stuff once the player gets far enough away
IF DOES_ENTITY_EXIST(sGoldVans[0].veh)
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vChaseTriggerStart) > 10000.0
REMOVE_PED(sCrew[CREW_GUNMAN].ped)
REMOVE_COVER_POINT(sCrew[CREW_GUNMAN].cover)
sCrew[CREW_GUNMAN].cover = NULL
REMOVE_VEHICLE(sGoldVans[0].veh)
REMOVE_VEHICLE(sGoldVans[1].veh)
ENDIF
//Fail for the player's car getting stuck.
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
IF IS_VEHICLE_PERMANENTLY_STUCK(sGoldCars[PLAYERS_GOLD_CAR].veh)
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
AND NOT IS_ENTITY_ATTACHED(sGoldCars[PLAYERS_GOLD_CAR].veh)
MISSION_FAILED(FAILED_CAR_STUCK)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
IF fChasePlaybackTime > 75000.0
IF VDIST2(GET_ENTITY_COORDS(sGoldCars[1].veh), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 90000.0
MISSION_FAILED(FAILED_LOST_BUDDIES)
ENDIF
ELSE
IF VDIST2(GET_ENTITY_COORDS(sGoldCars[1].veh), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 60000.0
MISSION_FAILED(FAILED_LOST_BUDDIES)
ENDIF
ENDIF
ENDIF
//Fail if one of the truck drivers dies.
REPEAT 2 i
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[i])
AND SetPieceCarModel[i] = PACKER
PED_INDEX pedDriver = GET_PED_IN_VEHICLE_SEAT(SetPieceCarID[i])
IF DOES_ENTITY_EXIST(pedDriver)
IF IS_PED_INJURED(pedDriver)
MISSION_FAILED(FAILED_TRUCK_DRIVER_DIED)
ENDIF
ENDIF
ENDIF
ENDREPEAT
//Have the gunman take cover at the start if he wasn't told already (e.g. when skipping to this stage)
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
IF (NOT IS_PED_IN_COVER(sCrew[CREW_GUNMAN].ped) OR VDIST2(GET_ENTITY_COORDS(sCrew[CREW_GUNMAN].ped), <<128.2898, -1203.2582, 28.3282>>) > 2.0)
AND GET_SCRIPT_TASK_STATUS(sCrew[CREW_GUNMAN].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
SET_PED_COVER_POINT_AND_SPHERE(sCrew[CREW_GUNMAN].ped, sCrew[CREW_GUNMAN].cover, <<128.2898, -1203.2582, 28.3282>>, 189.4779, 2.0, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
STOP_SYNCHRONIZED_ENTITY_ANIM(sCrew[CREW_GUNMAN].ped, NORMAL_BLEND_OUT, TRUE)
SET_PED_CURRENT_WEAPON_VISIBLE(sCrew[CREW_GUNMAN].ped, TRUE)
SEQ_GO_TO_COVER(sCrew[CREW_GUNMAN].ped, <<128.2898, -1203.2582, 28.3282>>, PEDMOVE_RUN, -1, TRUE, TRUE, DEFAULT_TIME_BEFORE_WARP, 1.0, ENAV_NO_STOPPING)
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
CLEAR_PRINTS()
CLEAR_HELP()
REMOVE_ALL_BLIPS()
STOP_CAM_PLAYBACK(vehCamCar)
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
REMOVE_VEHICLE(vehCamCar, TRUE)
REPEAT COUNT_OF(pedChaseBlockade2) i
REMOVE_PED(pedChaseBlockade2[i])
ENDREPEAT
REPEAT COUNT_OF(pedChaseBlockadeMall) i
REMOVE_PED(pedChaseBlockadeMall[i])
ENDREPEAT
REPEAT COUNT_OF(pedChaseCops) i
REMOVE_PED(pedChaseCops[i])
ENDREPEAT
REPEAT COUNT_OF(sChaseCops) i
REMOVE_PED(sChaseCops[i].ped)
ENDREPEAT
REPEAT COUNT_OF(sChaseCopsBlockade) i
REMOVE_PED(sChaseCopsBlockade[i].ped)
ENDREPEAT
REPEAT COUNT_OF(vehChaseCops) i
REMOVE_VEHICLE(vehChaseCops[i])
ENDREPEAT
REMOVE_PED(pedHeliGunner)
REPEAT COUNT_OF(interiorChaseTunnel) i
IF interiorChaseTunnel[i] != NULL
UNPIN_INTERIOR(interiorChaseTunnel[i])
interiorChaseTunnel[i] = NULL
ENDIF
ENDREPEAT
SET_MODEL_AS_NO_LONGER_NEEDED(modelCopCar)
REMOVE_VEHICLE_RECORDING(CARREC_GAS_TANKER, strCarrec)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
eMissionStage = STAGE_CHASE_END_CUTSCENE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDPROC
PROC DO_CHASE_END_CUTSCENE_NEW_VERSION()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) //Temp fix for cars popping in.
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
REQUEST_PTFX_ASSET()
IF SETUP_REQ_PLAYER_IS_FRANKLIN()
IF SETUP_REQ_MICHAEL(<<-1484.3656, -749.0569, 10.1031>>)
AND SETUP_REQ_TREVOR(<<-1484.3656, -747.0569, 10.1031>>)
AND SETUP_REQ_MAIN_DRIVER(<<-1484.3656, -745.0569, 10.1031>>, 173.7492)
AND SETUP_REQ_MAIN_GUNMAN(<<-1485.3656, -745.0569, 10.1031>>, 173.7492)
AND SETUP_REQ_CHASE_CARS_START()
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
AND REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_RAMP")
AND HAS_PTFX_ASSET_LOADED()
IF SETUP_REQ_BUDDIES_START_FIGHT()
SETUP_FRANKLIN_OUTFIT()
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
SET_VEHICLE_DOOR_SHUT(sGoldCars[PLAYERS_GOLD_CAR].veh, SC_DOOR_BOOT)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldCars[PLAYERS_GOLD_CAR].veh)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldCars[1].veh)
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sGoldCars[1].veh)
ENDIF
SET_VEHICLE_DOOR_SHUT(sGoldCars[1].veh, SC_DOOR_BOOT)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sGoldCars[0].veh)
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sGoldCars[0].veh)
ENDIF
SET_VEHICLE_DOOR_SHUT(sGoldCars[0].veh, SC_DOOR_BOOT)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_PED_INTO_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldCars[2].veh)
ENDIF
SET_VEHICLE_DOOR_SHUT(sGoldCars[2].veh, SC_DOOR_BOOT)
ENDIF
iCurrentTake = iMaxTakeConsideringCrew
IF NOT bPickedGoodCarDriver
AND NOT g_bBigScore2ARescuedBadDriver
iTakePenaltyCrewDies = iMaxTakeConsideringCrew / 4
iCurrentTake -= iTakePenaltyCrewDies
ENDIF
iDisplayedTake = iCurrentTake
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
REQUEST_MODEL(modelEndTruck)
REQUEST_MODEL(modelEndTrailers)
REQUEST_MODEL(modelEndHeli)
REQUEST_MODEL(modelCop)
REQUEST_VEHICLE_RECORDING(CARREC_END_TRAILER_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_END_TRAILER_2, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_END_TRUCK_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_END_TRUCK_2, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_END_HELI, strCarrec)
REQUEST_ANIM_DICT(strTrailerRampAnims)
REQUEST_MODELS_FOR_HEIST_CREW(HEIST_FINALE)
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_RAMP")
AND HAS_MODEL_LOADED(modelEndTruck)
AND HAS_MODEL_LOADED(modelEndTrailers)
AND HAS_MODEL_LOADED(modelEndHeli)
AND HAS_MODEL_LOADED(modelCop)
AND HAS_ANIM_DICT_LOADED(strTrailerRampAnims)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_END_TRAILER_1, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_END_TRAILER_2, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_END_TRUCK_1, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_END_TRUCK_2, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_END_HELI, strCarrec)
AND HAVE_MODELS_LOADED_FOR_HEIST_CREW(HEIST_FINALE)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
REMOVE_PED(sCrew[CREW_DRIVER].ped, TRUE)
REMOVE_PED(sCrew[CREW_GUNMAN].ped, TRUE)
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
//Cleanup the uber chase if there are still cars left: delete the trucks and ramps used in the uber immediately.
REMOVE_VEHICLE(vehTrailer[0], TRUE)
REMOVE_VEHICLE(vehTrailer[1], TRUE)
REMOVE_VEHICLE(SetPieceCarID[0], TRUE)
REMOVE_VEHICLE(SetPieceCarID[1], TRUE)
REMOVE_VEHICLE(SetPieceCarID[CHOPPER_SETPIECE_ID], TRUE)
REMOVE_VEHICLE(vehEndTrucks[0], TRUE)
REMOVE_VEHICLE(vehEndTrucks[1], TRUE)
CLEANUP_UBER_PLAYBACK()
IF IS_SCREEN_FADED_OUT()
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
SET_ENTITY_COORDS(sGoldCars[PLAYERS_GOLD_CAR].veh, <<-1502.1, -755.1, 11.4031>>)
ENDIF
LOAD_SCENE(<<-1502.1, -755.1, 11.4031>>)
WAIT(500)
ENDIF
vehEndTrucks[0] = CREATE_VEHICLE(modelEndTruck, <<-1519.3656, -748.5569, 10.1031>>, 95.8660)
vehEndTrucks[1] = CREATE_VEHICLE(modelEndTruck, <<-1523.0845, -760.0131, 10.1498>>, 95.2415)
SET_VEHICLE_COLOURS(vehEndTrucks[0], 73, 70)
SET_VEHICLE_COLOURS(vehEndTrucks[1], 45, 40)
SET_VEHICLE_EXTRA_COLOURS(vehEndTrucks[0], 63, 156)
SET_VEHICLE_EXTRA_COLOURS(vehEndTrucks[1], 35, 156)
vehEndTrailers[0] = CREATE_VEHICLE(modelEndTrailers, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehEndTrucks[0], <<0.0, -10.0, 0.0>>), GET_ENTITY_HEADING(vehEndTrucks[0]))
vehEndTrailers[1] = CREATE_VEHICLE(modelEndTrailers, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehEndTrucks[1], <<0.0, -10.0, 0.0>>), GET_ENTITY_HEADING(vehEndTrucks[1]))
ATTACH_VEHICLE_TO_TRAILER(vehEndTrucks[0], vehEndTrailers[0])
ATTACH_VEHICLE_TO_TRAILER(vehEndTrucks[1], vehEndTrailers[1])
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
ATTACH_ENTITY_TO_ENTITY(PLAYER_PED_ID(), vehEndTrailers[0], 0, <<0.0, 0.0, -0.6>>, <<0.0, 0.0, 0.0>>)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
CLEAR_PED_TASKS_IMMEDIATELY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ATTACH_ENTITY_TO_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], vehEndTrailers[0], 0, <<0.0, 0.5, -0.6>>, <<0.0, 0.0, 0.0>>)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
CLEAR_PED_TASKS_IMMEDIATELY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
ATTACH_ENTITY_TO_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], vehEndTrailers[0], 0, <<0.0, 1.0, -0.6>>, <<0.0, 0.0, 0.0>>)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
CLEAR_PED_TASKS_IMMEDIATELY(sCrew[CREW_DRIVER].ped)
ATTACH_ENTITY_TO_ENTITY(sCrew[CREW_DRIVER].ped, vehEndTrailers[0], 0, <<0.0, 1.5, -0.6>>, <<0.0, 0.0, 0.0>>)
ENDIF
vehEndHeli = CREATE_VEHICLE(modelEndHeli, <<-1644.5035, -714.8908, 29.8235>>, 0.0)
SET_VEHICLE_ENGINE_ON(vehEndHeli, TRUE, TRUE)
SET_HELI_BLADES_FULL_SPEED(vehEndHeli)
SET_VEHICLE_LIVERY(vehEndHeli, 0)
sCrew[CREW_FORCED_GUNMAN].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, 0, <<-1484.3656, -749.0569, 13.1031>>, 0.0)
sCrew[CREW_FORCED_DRIVER].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, 1, <<-1486.0845, -760.0131, 13.1498>>, 0.0)
SET_PED_INTO_VEHICLE(sCrew[CREW_FORCED_GUNMAN].ped, vehEndTrucks[0], VS_DRIVER)
SET_PED_INTO_VEHICLE(sCrew[CREW_FORCED_DRIVER].ped, vehEndTrucks[1], VS_DRIVER)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_FORCED_GUNMAN].ped, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_FORCED_DRIVER].ped, TRUE)
pedEndCops[0] = CREATE_PED_INSIDE_VEHICLE(vehEndHeli, PEDTYPE_MISSION, modelCop, VS_DRIVER)
pedEndCops[1] = CREATE_PED_INSIDE_VEHICLE(vehEndHeli, PEDTYPE_MISSION, modelCop, VS_BACK_RIGHT)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 6, pedEndCops[0], "BS2ACopHeli")
ADD_PED_FOR_DIALOGUE(sConversationPeds, 7, pedEndCops[1], "BS2ACop2")
SET_MODELS_FOR_HEIST_CREW_AS_NO_LONGER_NEEDED(HEIST_FINALE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelEndTruck)
SET_MODEL_AS_NO_LONGER_NEEDED(modelEndTrailers)
SET_MODEL_AS_NO_LONGER_NEEDED(modelEndHeli)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCop)
IF NOT HAS_SOUND_FINISHED(iTrailerRampSounds[0])
STOP_SOUND(iTrailerRampSounds[0])
ENDIF
IF NOT HAS_SOUND_FINISHED(iTrailerRampSounds[1])
STOP_SOUND(iTrailerRampSounds[1])
ENDIF
INT i = 0
REPEAT COUNT_OF(ptfxRampSparks) i
IF ptfxRampSparks[i] != NULL
STOP_PARTICLE_FX_LOOPED(ptfxRampSparks[i])
ptfxRampSparks[i] = NULL
ENDIF
ENDREPEAT
ptfxRampSparks[0] = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_bigscore_ramp_sparks", vehEndTrailers[0], <<0.23, -9.6955, -3.0130>>, <<0.0, 0.0, 0.0>>)
ptfxRampSparks[1] = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_bigscore_ramp_sparks", vehEndTrailers[0], <<1.3358, -9.6955, -3.0130>>, <<0.0, 0.0, 0.0>>)
ptfxRampSparks[2] = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_bigscore_ramp_sparks", vehEndTrailers[1], <<0.23, -9.6355, -2.9630>>, <<0.0, 0.0, 0.0>>)
ptfxRampSparks[3] = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_bigscore_ramp_sparks", vehEndTrailers[1], <<1.3358, -9.6355, -2.9630>>, <<0.0, 0.0, 0.0>>)
REMOVE_ALL_AUDIO_SCENES()
REMOVE_VEHICLE(sGoldCars[0].veh, TRUE)
REMOVE_VEHICLE(sGoldCars[1].veh, TRUE)
REMOVE_VEHICLE(sGoldCars[2].veh, TRUE)
REMOVE_VEHICLE(sGoldCars[3].veh, TRUE)
//Reset the budget reductions from earlier.
SET_PED_POPULATION_BUDGET(3)
SET_VEHICLE_POPULATION_BUDGET(3)
//Turn the wanted level off.
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SET_WANTED_LEVEL_MULTIPLIER(0.0)
//First shot: car roofs go up
START_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[0], CARREC_END_TRUCK_1, strCarrec)
START_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[1], CARREC_END_TRUCK_2, strCarrec)
START_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[0], CARREC_END_TRAILER_1, strCarrec)
START_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[1], CARREC_END_TRAILER_2, strCarrec)
START_PLAYBACK_RECORDED_VEHICLE(vehEndHeli, CARREC_END_HELI, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndHeli, 1000)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehEndHeli, FALSE)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[0], 4350.0)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[1], 5000.0)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[0], 4350.0)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[1], 5000.0)
PLAY_ENTITY_ANIM(vehEndTrailers[0], "Trailer3_Door_Open", strTrailerRampAnims, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.715)
PLAY_ENTITY_ANIM(vehEndTrailers[1], "Trailer3_Door_Open", strTrailerRampAnims, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.715)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(vehEndTrailers[0])
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(vehEndTrailers[1])
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehEndTrucks[0], TRUE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehEndTrucks[1], TRUE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehEndTrailers[0], TRUE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehEndTrailers[1], TRUE)
SET_VEHICLE_INACTIVE_DURING_PLAYBACK(vehEndTrucks[0], FALSE)
SET_VEHICLE_INACTIVE_DURING_PLAYBACK(vehEndTrucks[1], FALSE)
SET_VEHICLE_INACTIVE_DURING_PLAYBACK(vehEndTrailers[0], FALSE)
SET_VEHICLE_INACTIVE_DURING_PLAYBACK(vehEndTrailers[1], FALSE)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehEndTrucks[0], FALSE)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehEndTrucks[1], FALSE)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehEndTrailers[0], FALSE)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehEndTrailers[1], FALSE)
SPECIAL_ABILITY_DEACTIVATE(PLAYER_ID())
fTrailerDoorRatios[0] = 1.0
fTrailerDoorRatios[1] = 1.0
//SET_VEHICLE_DOOR_OPEN(vehEndTrailers[0], SC_DOOR_BOOT, FALSE, TRUE)
//SET_VEHICLE_DOOR_OPEN(vehEndTrailers[1], SC_DOOR_BOOT, FALSE, TRUE)
camMain = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<-1505.737793,-770.717712,11.810378>>,<<4.722565,0.009218,-1.592357>>,39.866249, TRUE)
SET_CAM_PARAMS(camMain, <<-1531.579956,-769.483582,11.830682>>,<<5.169897,-0.220527,-3.891246>>,39.866249, 2550, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
SHAKE_CAM(camMain, "HAND_SHAKE", 1.0)
CLEAR_AREA(<<-1601.105103,-730.149841,10.743475>>, 10.0, TRUE)
//SET_VEHICLE_GENERATOR_AREA_OF_INTEREST(<<-1555.6846, -746.6412, 10.3336>>, 20.0)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
SETTIMERB(0)
IF NOT IS_SCREEN_FADED_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
REQUEST_MODEL(EMPEROR)
REQUEST_MODEL(HABANERO)
IF IS_VEHICLE_DRIVEABLE(vehEndTrucks[0])
AND IS_VEHICLE_DRIVEABLE(vehEndTrucks[1])
AND IS_VEHICLE_DRIVEABLE(vehEndTrailers[0])
AND IS_VEHICLE_DRIVEABLE(vehEndTrailers[1])
AND IS_VEHICLE_DRIVEABLE(vehEndHeli)
SET_FORCE_HD_VEHICLE(vehEndHeli, TRUE)
#IF IS_DEBUG_BUILD
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehEndTrucks[0])
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehEndHeli)
PRINTLN(GET_TIME_POSITION_IN_RECORDING(vehEndTrucks[0]), " ", GET_TIME_POSITION_IN_RECORDING(vehEndHeli))
ENDIF
PRINTLN(fTrailerDoorRatios[0])
#ENDIF
//Preload the cops conversation.
IF NOT bHasTextLabelTriggered[FH3A_ENDC_PRELOAD]
AND NOT bHasTextLabelTriggered[FH3A_ENDC]
IF PRELOAD_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_ENDC", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_ENDC_PRELOAD] = TRUE
ENDIF
ENDIF
SWITCH iCurrentEvent
CASE 0 //Close first truck ramp.
IF IS_ENTITY_PLAYING_ANIM(vehEndTrailers[0], strTrailerRampAnims, "Trailer3_Door_Open")
SET_ENTITY_ANIM_SPEED(vehEndTrailers[0], strTrailerRampAnims, "Trailer3_Door_Open", 0.0)
ENDIF
IF IS_ENTITY_PLAYING_ANIM(vehEndTrailers[1], strTrailerRampAnims, "Trailer3_Door_Open")
SET_ENTITY_ANIM_SPEED(vehEndTrailers[1], strTrailerRampAnims, "Trailer3_Door_Open", 0.0)
ENDIF
IF TIMERB() > 200
IF IS_ENTITY_PLAYING_ANIM(vehEndTrailers[1], strTrailerRampAnims, "Trailer3_Door_Open")
SET_ENTITY_ANIM_SPEED(vehEndTrailers[1], strTrailerRampAnims, "Trailer3_Door_Open", -0.75)
ENDIF
PLAY_SOUND_FROM_ENTITY(iTrailerRampRaiseSounds[1], "Truck_Ramp_Raise", vehEndTrailers[1], "BIG_SCORE_3A_SOUNDS")
iCurrentEvent++
ENDIF
BREAK
CASE 1
CONVERGE_VALUE(fTrailerDoorRatios[1], 0.0, 0.6, TRUE)
IF TIMERB() > 500
IF IS_ENTITY_PLAYING_ANIM(vehEndTrailers[0], strTrailerRampAnims, "Trailer3_Door_Open")
SET_ENTITY_ANIM_SPEED(vehEndTrailers[0], strTrailerRampAnims, "Trailer3_Door_Open", -0.74)
ENDIF
PLAY_SOUND_FROM_ENTITY(iTrailerRampRaiseSounds[0], "Truck_Ramp_Raise", vehEndTrailers[0], "BIG_SCORE_3A_SOUNDS")
STOP_PARTICLE_FX_LOOPED(ptfxRampSparks[2])
STOP_PARTICLE_FX_LOOPED(ptfxRampSparks[3])
ptfxRampSparks[2] = NULL
ptfxRampSparks[3] = NULL
iCarCreationEvent = 0
iCurrentEvent++
ENDIF
BREAK
CASE 2 //Second shot: trucks drive past cam towards exit.
CONVERGE_VALUE(fTrailerDoorRatios[0], 0.0, 0.6, TRUE)
CONVERGE_VALUE(fTrailerDoorRatios[1], 0.0, 0.6, TRUE)
//SET_VEHICLE_DOOR_CONTROL(vehEndTrailers[0], SC_DOOR_BOOT, DT_DOOR_INTACT, fTrailerDoorRatios[0])
//SET_VEHICLE_DOOR_CONTROL(vehEndTrailers[1], SC_DOOR_BOOT, DT_DOOR_INTACT, fTrailerDoorRatios[1])
IF TIMERB() > 800
IF ptfxRampSparks[0] != NULL
STOP_PARTICLE_FX_LOOPED(ptfxRampSparks[0])
STOP_PARTICLE_FX_LOOPED(ptfxRampSparks[1])
ptfxRampSparks[0] = NULL
ptfxRampSparks[1] = NULL
ENDIF
ENDIF
IF NOT HAS_SOUND_FINISHED(iTrailerRampRaiseSounds[0])
AND NOT IS_ENTITY_DEAD(vehEndTrailers[0])
IF IS_ENTITY_PLAYING_ANIM(vehEndTrailers[0], strTrailerRampAnims, "Trailer3_Door_Open")
IF GET_ENTITY_ANIM_CURRENT_TIME(vehEndTrailers[0], strTrailerRampAnims, "Trailer3_Door_Open") < 0.01
STOP_SOUND(iTrailerRampRaiseSounds[0])
ENDIF
ENDIF
ENDIF
IF NOT HAS_SOUND_FINISHED(iTrailerRampRaiseSounds[1])
AND NOT IS_ENTITY_DEAD(vehEndTrailers[1])
IF IS_ENTITY_PLAYING_ANIM(vehEndTrailers[1], strTrailerRampAnims, "Trailer3_Door_Open")
IF GET_ENTITY_ANIM_CURRENT_TIME(vehEndTrailers[1], strTrailerRampAnims, "Trailer3_Door_Open") < 0.01
STOP_SOUND(iTrailerRampRaiseSounds[1])
ENDIF
ENDIF
ENDIF
IF TIMERB() > 1500
AND HAS_MODEL_LOADED(EMPEROR)
AND HAS_MODEL_LOADED(HABANERO)
MODEL_NAMES modelVehicle
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
modelVehicle = EMPEROR
ELSE
modelVehicle = HABANERO
ENDIF
IF iCarCreationEvent = 0
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1612.2810, -733.1164, 9.8386>>, 54.6237)
iCarCreationEvent++
ELIF iCarCreationEvent = 1
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1627.4, -712.7, 10.4532>>, 53.8765)
iCarCreationEvent++
ELIF iCarCreationEvent = 2
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1668.6, -696.3, 10.6189>>, 49.8116)
iCarCreationEvent++
ELIF iCarCreationEvent = 3
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1798.2206, -604.9295, 10.4532>>, 50.8837)
iCarCreationEvent++
ELIF iCarCreationEvent = 4
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1982.8767, -465.3074, 10.3848>>, 227.3706)
iCarCreationEvent++
ELIF iCarCreationEvent = 5
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1930.5171, -523.3510, 10.7951>>, 228.8018)
iCarCreationEvent++
ELIF iCarCreationEvent = 6
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1858.2153, -575.5817, 10.7383>>, 230.2613)
iCarCreationEvent++
ELIF iCarCreationEvent = 7
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1796.8267, -617.9168, 10.4393>>, 233.3197)
iCarCreationEvent++
ELIF iCarCreationEvent = 8
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1779.1719, -653.7441, 10.1227>>, 227.9754)
iCarCreationEvent++
ELIF iCarCreationEvent = 9
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1704.9510, -698.3457, 9.8345>>, 234.2902)
iCarCreationEvent++
ENDIF
ENDIF
IF TIMERB() > 2500
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[0], 5000)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[1], 5000)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[0], 5000)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[1], 5000)
SET_PLAYBACK_SPEED(vehEndTrucks[0], 1.5)
SET_PLAYBACK_SPEED(vehEndTrucks[1], 1.5)
SET_PLAYBACK_SPEED(vehEndTrailers[0], 1.5)
SET_PLAYBACK_SPEED(vehEndTrailers[1], 1.5)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndHeli, 1000)
WAIT(0)
IF IS_VEHICLE_DRIVEABLE(vehEndTrailers[0])
SET_VEHICLE_DOOR_SHUT(vehEndTrailers[0], SC_DOOR_BOOT, TRUE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vehEndTrailers[1])
SET_VEHICLE_DOOR_SHUT(vehEndTrailers[1], SC_DOOR_BOOT, TRUE)
ENDIF
IF NOT HAS_SOUND_FINISHED(iTrailerRampRaiseSounds[0])
STOP_SOUND(iTrailerRampRaiseSounds[0])
ENDIF
IF NOT HAS_SOUND_FINISHED(iTrailerRampRaiseSounds[1])
STOP_SOUND(iTrailerRampRaiseSounds[1])
ENDIF
CLEAR_AREA_OF_VEHICLES(<<-1548.6, -750.5, 10.4>>, 80.0)
SHAKE_CAM(camMain, "HAND_SHAKE", 0.1)
SET_CAM_PARAMS(camMain, <<-1519.964844,-756.131470,10.994718>>,<<1.601808,0.020343,74.378578>>,37.068741, 0)
SET_CAM_PARAMS(camMain, <<-1524.864136,-754.761719,11.136974>>,<<1.601808,0.020343,74.378578>>,37.068741, 3600, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 3 //Third shot: heli enters.
IF TIMERB() > 2500
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[0], 8500)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[1], 8500)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[0], 8500)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[1], 8500)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndHeli, 1000)
SET_PLAYBACK_SPEED(vehEndTrucks[0], 1.0)
SET_PLAYBACK_SPEED(vehEndTrucks[1], 1.0)
SET_PLAYBACK_SPEED(vehEndTrailers[0], 1.0)
SET_PLAYBACK_SPEED(vehEndTrailers[1], 1.0)
WAIT(0)
SHAKE_CAM(camMain, "HAND_SHAKE", 1.0)
SET_CAM_PARAMS(camMain, <<-1638.905029,-721.330933,25.269371>>,<<12.838796,0.067302,44.328854>>,39.992065, 0)
SET_CAM_PARAMS(camMain, <<-1638.818726,-721.418518,25.839569>>,<<6.903760,0.067302,45.597054>>,39.992065, 1500, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
TRIGGER_MUSIC_EVENT("FH2A_MISSION_END")
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 4 //Fourth shot: shot looking down (from old cutscene).
IF NOT bHasTextLabelTriggered[FH3A_ENDC]
IF TIMERB() > 1000
IF bHasTextLabelTriggered[FH3A_ENDC_PRELOAD]
BEGIN_PRELOADED_CONVERSATION()
bHasTextLabelTriggered[FH3A_ENDC] = TRUE
ELSE
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_ENDC", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_ENDC] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF TIMERB() > 2500
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[0], 10500)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[1], 10500)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[0], 10500)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[1], 10500)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndHeli, 12000)
SET_PLAYBACK_SPEED(vehEndTrucks[0], 1.0)
SET_PLAYBACK_SPEED(vehEndTrucks[1], 1.0)
SET_PLAYBACK_SPEED(vehEndTrailers[0], 1.0)
SET_PLAYBACK_SPEED(vehEndTrailers[1], 1.0)
WAIT(0)
CLEAR_AREA_OF_VEHICLES(<<-1588.6, -737.5, 10.4>>, 40.0)
SHAKE_CAM(camMain, "HAND_SHAKE", 0.2)
SET_CAM_PARAMS(camMain, <<-1659.574463,-707.854370,29.237783>>,<<-7.422939,0.059666,-117.388649>>,43.055702, 0)
SET_CAM_PARAMS(camMain, <<-1660.918579,-710.748718,28.883806>>,<<-7.502350,0.059666,-111.732796>>,43.055702, 9100, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
TRIGGER_MUSIC_EVENT("FH2A_MISSION_END")
SETTIMERB(0)
iCarCreationEvent = 0
iCurrentEvent++
ENDIF
BREAK
CASE 5 //Final shot: heli flies off, trucks drive away.
//Create some random cars off-screen.
IF TIMERB() > 2800
AND HAS_MODEL_LOADED(EMPEROR)
AND HAS_MODEL_LOADED(HABANERO)
MODEL_NAMES modelVehicle
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
modelVehicle = EMPEROR
ELSE
modelVehicle = HABANERO
ENDIF
IF iCarCreationEvent = 0
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1735.7810, -648.1164, 9.8386>>, 54.6237)
iCarCreationEvent++
ELIF iCarCreationEvent = 1
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1798.2206, -604.9295, 10.4532>>, 53.8765)
iCarCreationEvent++
ELIF iCarCreationEvent = 2
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1839.1724, -557.7636, 10.6189>>, 49.8116)
iCarCreationEvent++
ELIF iCarCreationEvent = 3
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1887.6597, -518.9340, 10.8328>>, 50.8837)
iCarCreationEvent++
ELIF iCarCreationEvent = 4
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1982.8767, -465.3074, 10.3848>>, 227.3706)
iCarCreationEvent++
ELIF iCarCreationEvent = 5
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1930.5171, -523.3510, 10.7951>>, 228.8018)
iCarCreationEvent++
ELIF iCarCreationEvent = 6
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1858.2153, -575.5817, 10.7383>>, 230.2613)
iCarCreationEvent++
ELIF iCarCreationEvent = 7
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1796.8267, -617.9168, 10.4393>>, 233.3197)
iCarCreationEvent++
ELIF iCarCreationEvent = 8
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1779.1719, -653.7441, 10.1227>>, 227.9754)
iCarCreationEvent++
ELIF iCarCreationEvent = 9
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1714.2510, -683.6457, 10.2345>>, -127.3902)
iCarCreationEvent++
ENDIF
ENDIF
IF TIMERB() > 3800
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[0], 15000)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[1], 15000)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[0], 15000)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[1], 15000)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndHeli, 15500)
WAIT(0)
CLEAR_AREA_OF_VEHICLES(<<-1731.7, -650.6, 9.4>>, 40.0)
SHAKE_CAM(camMain, "HAND_SHAKE", 0.05)
SET_CAM_PARAMS(camMain, <<-1627.726318,-723.586487,29.519999>>,<<-20.488827,0.079089,64.552872>>,46.603870, 0)
SET_CAM_PARAMS(camMain, <<-1629.679810,-722.650574,31.872229>>,<<-0.304170,0.079089,64.135292>>,46.603870, 6600, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 6
IF TIMERB() > 4500
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
BREAK
ENDSWITCH
//Create the traffic manually so it's consistent across shots.
IF iCurrentEvent > 3
IF GET_GAME_TIMER() - iChaseCutsceneCarSpawnTimer > 0
AND HAS_MODEL_LOADED(EMPEROR)
AND HAS_MODEL_LOADED(HABANERO)
INT iRandom
VECTOR vCreationPos
FLOAT fCreationHeading
MODEL_NAMES modelVehicle
iRandom = GET_RANDOM_INT_IN_RANGE(0, 3)
IF iRandom = 0
vCreationPos = <<-1558.9962, -747.1423, 11.0064>>
fCreationHeading = 71.2521
ELIF iRandom = 1
vCreationPos = <<-1549.2703, -743.0364, 10.5949>>
fCreationHeading = 74.8274
ELSE
vCreationPos = <<-1552.5983, -755.3263, 10.5250>>
fCreationHeading = 74.8274
ENDIF
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
modelVehicle = EMPEROR
ELSE
modelVehicle = HABANERO
ENDIF
CREATE_RANDOM_CAR_AT_POS(modelVehicle,vCreationPos, fCreationHeading)
iChaseCutsceneCarSpawnTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 2000)
ENDIF
ENDIF
ENDIF
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
eSectionStage = SECTION_STAGE_SKIP
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REPLAY_STOP_EVENT()
IF NOT IS_SCREEN_FADED_OUT()
IF NOT IS_SCREEN_FADING_OUT()
DO_SCREEN_FADE_OUT(2000)
ENDIF
WHILE NOT IS_SCREEN_FADED_OUT()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF NOT IS_ENTITY_DEAD(vehEndHeli)
SET_FORCE_HD_VEHICLE(vehEndHeli, TRUE)
ENDIF
WAIT(0)
ENDWHILE
ENDIF
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(EMPEROR)
SET_MODEL_AS_NO_LONGER_NEEDED(HABANERO)
SET_MODEL_AS_NO_LONGER_NEEDED(SPEEDO)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
//Get all of the peds out of the vehicles, then force delete everything else.
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<195.7771, 2796.8718, 44.6551>>)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<201.0530, 2795.8323, 44.6551>>)
ENDIF
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
SET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped, <<203.0530, 2795.8323, 44.6551>>)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<201.0530, 2795.8323, 44.6551>>)
ENDIF
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<198.8228, 2795.1470, 44.6551>>)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
REMOVE_PED(pedEndCops[0], TRUE)
REMOVE_PED(pedEndCops[1], TRUE)
REMOVE_PED(sCrew[CREW_FORCED_GUNMAN].ped, TRUE)
REMOVE_PED(sCrew[CREW_FORCED_DRIVER].ped, TRUE)
REMOVE_PED(sCrew[CREW_DRIVER].ped, TRUE)
REMOVE_PED(sCrew[CREW_GUNMAN].ped, TRUE)
REMOVE_ALL_VEHICLES(TRUE)
REMOVE_VEHICLE_RECORDING(CARREC_END_TRUCK_1, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_END_TRAILER_1, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_END_TRUCK_2, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_END_TRAILER_2, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_END_HELI, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_CHASE_COPS_BLOCKADE, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_CHASE_COPS_BLOCKADE_2, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_CHASE_TRIGGER, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_TRAILER_RIGHT, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_TRUCK_RIGHT_BAD, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_TRAILER_LEFT, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_1, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_2, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_3_GOOD_TRUCK, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_3_BAD_DRIVER, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_3_BAD_TRUCK, strCarrec)
REMOVE_ANIM_DICT(strTrailerRampAnims)
REMOVE_PTFX_ASSET()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(1.0)
CLEAR_VEHICLE_GENERATOR_AREA_OF_INTEREST()
IF NOT HAS_SOUND_FINISHED(iTrailerRampRaiseSounds[0])
STOP_SOUND(iTrailerRampRaiseSounds[0])
ENDIF
IF NOT HAS_SOUND_FINISHED(iTrailerRampRaiseSounds[1])
STOP_SOUND(iTrailerRampRaiseSounds[1])
ENDIF
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_RAMP")
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_DROP_OFF_TRUCKS_CUTSCENE
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
IF NOT IS_SCREEN_FADED_OUT()
IF NOT IS_SCREEN_FADING_OUT()
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
ENDIF
ENDIF
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDPROC
PROC DO_DROP_OFF_TRUCKS_CUTSCENE()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF SETUP_REQ_PLAYER_IS_FRANKLIN()
AND SETUP_REQ_MICHAEL(<<201.0530, 2795.8323, 44.6551>>)
AND SETUP_REQ_TREVOR(<<195.7771, 2796.8718, 44.6551>>)
iCurrentTake = iMaxTakeConsideringCrew
IF NOT bPickedGoodCarDriver
AND NOT g_bBigScore2ARescuedBadDriver
iTakePenaltyCrewDies = iMaxTakeConsideringCrew / 4
iCurrentTake -= iTakePenaltyCrewDies
ENDIF
iDisplayedTake = iCurrentTake
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
IF iCurrentEvent != 99
IF bHasUsedCheckpoint
START_REPLAY_SETUP(<<198.8228, 2795.1470, 44.6551>>, 0.0, FALSE)
iCurrentEvent = 99
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<198.8228, 2795.1470, 44.6551>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ELSE
IF SETUP_REQ_MICHAELS_CAR(<<200.0565, 2802.0796, 44.6551>>, 136.8986)
AND SETUP_REQ_MICHAEL(<<201.0530, 2795.8323, 44.6551>>)
AND SETUP_REQ_TREVOR(<<195.7771, 2796.8718, 44.6551>>)
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
REMOVE_PED(sCrew[CREW_GUNMAN].ped, TRUE)
REMOVE_PED(sCrew[CREW_DRIVER].ped, TRUE)
BLOCK_PEDS_AT_DROP_OFF(TRUE)
//Warp everyone into position and reset their outfits.
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<198.8228, 2795.1470, 44.6551>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 351.1441)
RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
REMOVE_PED_COMP_ITEM_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN, bHasChangedClothesFranklin)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<195.7771, 2796.8718, 44.6551>>)
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 334.2309)
//RESTORE_PLAYER_PED_VARIATIONS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT)
REMOVE_PED_COMP_ITEM_SP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_PROPS, PROPS_P0_HEADSET)
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL)
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
SET_ENTITY_INVINCIBLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 200)
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 200)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<201.0530, 2795.8323, 44.6551>>)
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 17.1842)
//RESTORE_PLAYER_PED_VARIATIONS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT)
REMOVE_PED_COMP_ITEM_SP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], COMP_TYPE_PROPS, PROPS_P2_HEADSET)
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR)
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
SET_ENTITY_INVINCIBLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 200)
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 200)
ENDIF
REQUEST_CUTSCENE("bs_2a_mcs_11")
WHILE NOT HAS_CUTSCENE_LOADED()
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_11")
WAIT(0)
ENDWHILE
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_ENTITY_DEAD(vehMichaelsCar)
REGISTER_ENTITY_FOR_CUTSCENE(vehMichaelsCar, "rear_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, DUMMY_MODEL_FOR_SCRIPT, CEO_IS_CASCADE_SHADOW_FOCUS_ENTITY_DURING_EXIT)
ENDIF
SET_AGGRESSIVE_HORNS(FALSE)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_POLICE_RADAR_BLIPS(TRUE)
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), TRUE)
SET_CREATE_RANDOM_COPS(TRUE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, TRUE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
SET_RANDOM_TRAINS(TRUE)
CLEAR_TRIGGERED_LABELS()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
SETTIMERB(0)
bPlayersCarExitStateHasBeenHit = FALSE
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
IF WAS_CUTSCENE_SKIPPED()
bSkippedMocap = TRUE
eSectionStage = SECTION_STAGE_SKIP
ENDIF
IF NOT IS_CUTSCENE_ACTIVE()
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
SWITCH iCurrentEvent
CASE 0
IF IS_CUTSCENE_PLAYING()
CLEAR_AREA(<<195.7771, 2796.8718, 44.6551>>, 500.0, TRUE)
SET_VEHICLE_MODEL_PLAYER_WILL_EXIT_SCENE(modelChaseCars)
DO_FADE_IN_WITH_WAIT()
iCurrentEvent++
ENDIF
BREAK
CASE 1
IF IS_VEHICLE_DRIVEABLE(vehMichaelsCar)
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("rear_car")
SET_VEHICLE_DOORS_SHUT(vehMichaelsCar)
SET_VEHICLE_ENGINE_ON(vehMichaelsCar, TRUE, TRUE)
bPlayersCarExitStateHasBeenHit = TRUE
ELIF NOT bPlayersCarExitStateHasBeenHit
SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION(vehMichaelsCar)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], vehMichaelsCar, VS_FRONT_RIGHT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], vehMichaelsCar, VS_BACK_LEFT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehMichaelsCar, VS_DRIVER)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
IF NOT bSkippedMocap
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ENDIF
BREAK
ENDSWITCH
IF IS_VEHICLE_DRIVEABLE(vehMichaelsCar)
SET_VEHICLE_BRAKE_LIGHTS(vehMichaelsCar, FALSE)
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REPLAY_STOP_EVENT()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_GO_TO_MICHAELS_HOUSE
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_GO_TO_MICHAELS_HOUSE)
ENDIF
ENDPROC
PROC GO_TO_MICHAELS_HOUSE()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
IF bHasUsedCheckpoint
START_REPLAY_SETUP(<<198.8228, 2795.1470, 44.6551>>, 0.0, FALSE)
iCurrentEvent = 99
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<198.8228, 2795.1470, 44.6551>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
WAIT(0)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
WHILE NOT SETUP_REQ_PLAYER_IS_FRANKLIN()
OR NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
OR NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
OR NOT DOES_ENTITY_EXIST(vehMichaelsCar)
SETUP_REQ_MICHAEL(<<201.0530, 2795.8323, 44.6551>>)
SETUP_REQ_TREVOR(<<195.7771, 2796.8718, 44.6551>>)
SETUP_REQ_MICHAELS_CAR(<<200.0565, 2802.0796, 44.6551>>, 136.8986)
WAIT(0)
ENDWHILE
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
BLOCK_PEDS_AT_DROP_OFF(TRUE)
IF IS_VEHICLE_DRIVEABLE(vehMichaelsCar)
//Warp everyone into position and reset their outfits.
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehMichaelsCar)
RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
REMOVE_PED_COMP_ITEM_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], vehMichaelsCar, VS_FRONT_RIGHT)
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT)
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
SET_ENTITY_INVINCIBLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 200)
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 200)
REMOVE_PED_COMP_ITEM_SP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_PROPS, PROPS_P0_HEADSET)
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], vehMichaelsCar, VS_BACK_LEFT)
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT)
REMOVE_PED_COMP_ITEM_SP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], COMP_TYPE_PROPS, PROPS_P2_HEADSET)
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
SET_ENTITY_INVINCIBLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 200)
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 200)
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR)
ENDIF
ENDIF
SETTIMERA(0)
WHILE TIMERA() < 3000
IF (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
AND (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD
PRINTLN("Streaming completed/timed out: ", TIMERA())
#ENDIF
SETTIMERA(100000)
ENDIF
WAIT(0)
ENDWHILE
CLEAR_AREA(<<195.7771, 2796.8718, 44.6551>>, 500.0, TRUE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
iCurrentTake = iMaxTakeConsideringCrew
IF NOT bPickedGoodCarDriver
AND NOT g_bBigScore2ARescuedBadDriver
iTakePenaltyCrewDies = iMaxTakeConsideringCrew / 4
iCurrentTake -= iTakePenaltyCrewDies
ENDIF
iDisplayedTake = iCurrentTake
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
SET_MICHAELS_HOUSE_FOR_FINAL_CUTSCENE(TRUE)
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
SET_AGGRESSIVE_HORNS(FALSE)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_POLICE_RADAR_BLIPS(TRUE)
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), TRUE)
SET_CREATE_RANDOM_COPS(TRUE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, TRUE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
SET_RANDOM_TRAINS(TRUE)
CLEAR_TRIGGERED_LABELS()
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_GO_HOME, "GO_HOME", TRUE)
DO_FADE_IN_WITH_WAIT()
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_HEIST_CREW_END_SCREEN_STATUSES()
INCREMENT_ALL_CREW_MEMBER_STATS_DURING_HEIST(HEIST_FINALE, TRUE)
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_DOWN, FALSE)
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_UP, FALSE)
TRIGGER_MUSIC_EVENT("FH2A_FINAL_DRIVE_RADIO")
SETTIMERA(0)
SETTIMERB(0)
REPLAY_RECORD_BACK_FOR_TIME(0.0, 15.0, REPLAY_IMPORTANCE_HIGHEST)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
#IF IS_DEBUG_BUILD
DONT_DO_J_SKIP(sLocatesData)
#ENDIF
SWITCH iCurrentEvent
CASE 0
IS_PLAYER_AT_LOCATION_WITH_BUDDIES_ANY_MEANS(sLocatesData, vMichaelsHousePos, <<0.001, 0.001, LOCATE_SIZE_HEIGHT>>, TRUE, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL],
sSelectorPeds.pedID[SELECTOR_PED_TREVOR], NULL, "F3A_MIKEHOME", "CMN_MLEAVE", "CMN_TLEAVE", "", "F3A_LEFTCREW",
FALSE, TRUE)
//Dialogue for the journey.
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
AND IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND ARE_CHARS_IN_SAME_VEHICLE(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
AND ARE_CHARS_IN_SAME_VEHICLE(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
ENDIF
IF NOT bHasTextLabelTriggered[FH3A_TALK]
IF TIMERA() > 10000
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_TALK", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_TALK] = TRUE
ENDIF
ENDIF
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_TALK2]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_TALK2", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_TALK2] = TRUE
//ENDIF
ENDIF
ELIF NOT bHasTextLabelTriggered[FH3A_FNEAR]
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMichaelsHousePos) < 2500.0
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-812.726990,171.304443,82.298965>>, <<-845.853821,173.509262,60.365059>>, 35.500000)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_FNEAR", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_FNEAR] = TRUE
//ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
ELSE
IF bHasTextLabelTriggered[FH3A_TALK]
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
ENDIF
ENDIF
//Set the warp flag on the buddies if they're not moving but they're in the player's group
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF GET_ENTITY_SPEED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) < 0.25
AND IS_PED_GROUP_MEMBER(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PLAYER_GROUP_ID())
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_TeleportToLeaderVehicle, TRUE)
ELSE
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_TeleportToLeaderVehicle, FALSE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF GET_ENTITY_SPEED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) < 0.25
AND IS_PED_GROUP_MEMBER(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PLAYER_GROUP_ID())
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_TeleportToLeaderVehicle, TRUE)
ELSE
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_TeleportToLeaderVehicle, FALSE)
ENDIF
ENDIF
ENDIF
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-823.896912,175.752808,70.023056>>, <<-816.462646,178.295502,74.782898>>, 9.500000)
OR (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-815.577087,178.607849,67.653091>>, <<-829.362427,174.757614,75.670959>>, 17.750000))
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
ENDIF
KILL_FACE_TO_FACE_CONVERSATION()
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
SETTIMERB(0)
iCurrentEvent++
ENDIF
ENDIF
BREAK
CASE 1
IF NOT bHasTextLabelTriggered[FH3A_LESTER]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])) < 625.0
//IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LESTER", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[FH3A_LESTER] = TRUE
//ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE)
IF iLesterEndEvent >= 50
AND TIMERB() > 1000
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ELSE
VEHICLE_INDEX vehPlayerVehicle
vehPlayerVehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID(), TRUE)
IF NOT IS_ENTITY_DEAD(vehPlayerVehicle)
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vehPlayerVehicle, DEFAULT, 1)
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
//Pre-stream the final cutscene
FLOAT fDistFromHouse = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMichaelsHousePos)
IF fDistFromHouse < 22500.0
IF NOT DOES_ENTITY_EXIST(pedLester)
iLesterEndEvent = 0
ENDIF
SETUP_REQ_MICHAELS_HOUSE_INTERIOR_LOADED()
SETUP_REQ_LESTER(<<-812.9495, 179.6283, 71.1592>>, 109.5783)
REQUEST_ANIM_DICT(strAnimsLesterLeadIn)
//Lester was just created, give him a look task.
IF NOT IS_PED_INJURED(pedLester)
IF iLesterEndEvent = 0
IF HAS_ANIM_DICT_LOADED(strAnimsLesterLeadIn)
TASK_LOOK_AT_ENTITY(pedLester, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
TASK_PLAY_ANIM(pedLester, strAnimsLesterLeadIn, "Lester_Left_hand_override_bottle", DEFAULT, DEFAULT, DEFAULT, AF_LOOPING | AF_SECONDARY | AF_UPPERBODY)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedLester, TRUE)
iLesterEndEvent++
ENDIF
ELIF iLesterEndEvent = 1
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-815.577087,178.607849,67.653091>>, <<-829.362427,174.757614,75.670959>>, 17.750000)
TASK_GO_STRAIGHT_TO_COORD(pedLester, <<-817.2549, 178.0433, 71.2275>>, PEDMOVE_WALK)
iLesterEndEvent = 50
ENDIF
ELIF iLesterEndEvent = 50
SET_PED_MOVE_RATE_OVERRIDE(pedLester, 0.6)
ENDIF
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedLester, PLAYER_PED_ID())
APPLY_DAMAGE_TO_PED(pedLester, GET_ENTITY_HEALTH(pedLester) + 50, TRUE)
ENDIF
ENDIF
//Create and animate the doors.
IF NOT DOES_ENTITY_EXIST(objMichaelsHouseDoors[0])
REQUEST_MODEL(modelMichaelsDoorLeft)
REQUEST_MODEL(modelMichaelsDoorRight)
IF HAS_MODEL_LOADED(modelMichaelsDoorLeft)
AND HAS_MODEL_LOADED(modelMichaelsDoorRight)
AND HAS_ANIM_DICT_LOADED(strAnimsLesterLeadIn)
IF NOT DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[0])
objMichaelsHouseMapDoors[0] = GET_CLOSEST_OBJECT_OF_TYPE(<<-816.7168, 179.0980, 72.82>>, 4.0, modelMichaelsDoorLeft)
ENDIF
IF NOT DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[1])
objMichaelsHouseMapDoors[1] = GET_CLOSEST_OBJECT_OF_TYPE(<<-816.1068, 177.5109, 72.82>>, 4.0, modelMichaelsDoorRight)
ENDIF
IF DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[0])
SET_ENTITY_VISIBLE(objMichaelsHouseMapDoors[0], FALSE)
ENDIF
IF DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[1])
SET_ENTITY_VISIBLE(objMichaelsHouseMapDoors[1], FALSE)
ENDIF
objMichaelsHouseDoors[0] = CREATE_OBJECT(modelMichaelsDoorLeft, <<-818.6, 176.8, 72.4>>)
objMichaelsHouseDoors[1] = CREATE_OBJECT(modelMichaelsDoorRight, <<-819.6, 176.8, 72.4>>)
iSyncSceneMichaelsHouseDoors = CREATE_SYNCHRONIZED_SCENE(<<-817.305, 179.330, 71.241>>, <<0.000, 0.000, -113.000>>)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objMichaelsHouseDoors[0], iSyncSceneMichaelsHouseDoors, "_leadin_doorl","missbigscore2aleadinout@bs_2a_ext",
INSTANT_BLEND_IN, INSTANT_BLEND_OUT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
PLAY_SYNCHRONIZED_ENTITY_ANIM(objMichaelsHouseDoors[1], iSyncSceneMichaelsHouseDoors, "_leadin_doorr","missbigscore2aleadinout@bs_2a_ext",
INSTANT_BLEND_IN, INSTANT_BLEND_OUT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneMichaelsHouseDoors, 0.0)
SET_SYNCHRONIZED_SCENE_RATE(iSyncSceneMichaelsHouseDoors, 0.0)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMichaelsDoorLeft)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMichaelsDoorRight)
ENDIF
ELSE
//Once the player gets close open the doors.
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneMichaelsHouseDoors)
AND GET_SYNCHRONIZED_SCENE_RATE(iSyncSceneMichaelsHouseDoors) = 0.0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-815.577087,178.607849,67.653091>>, <<-829.362427,174.757614,75.670959>>, 17.750000)
SET_SYNCHRONIZED_SCENE_RATE(iSyncSceneMichaelsHouseDoors, 0.8)
SET_ENTITY_COLLISION(objMichaelsHouseDoors[0], FALSE)
SET_ENTITY_COLLISION(objMichaelsHouseDoors[1], FALSE)
ENDIF
ENDIF
ENDIF
ELIF fDistFromHouse > 40000.0
IF interiorMichaelsHouse != NULL
UNPIN_INTERIOR(interiorMichaelsHouse)
interiorMichaelsHouse = NULL
ENDIF
REMOVE_OBJECT(objwalkingStick, TRUE)
REMOVE_OBJECT(objMichaelsHouseDoors[0], TRUE)
REMOVE_OBJECT(objMichaelsHouseDoors[1], TRUE)
REMOVE_PED(pedLester, TRUE)
REMOVE_ANIM_DICT(strAnimsLesterLeadIn)
IF DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[0])
SET_ENTITY_VISIBLE(objMichaelsHouseMapDoors[0], TRUE)
SET_OBJECT_AS_NO_LONGER_NEEDED(objMichaelsHouseMapDoors[0])
ENDIF
IF DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[1])
SET_ENTITY_VISIBLE(objMichaelsHouseMapDoors[1], TRUE)
SET_OBJECT_AS_NO_LONGER_NEEDED(objMichaelsHouseMapDoors[1])
ENDIF
iSyncSceneMichaelsHouseDoors = -1
ENDIF
IF fDistFromHouse < (DEFAULT_CUTSCENE_LOAD_DIST * DEFAULT_CUTSCENE_LOAD_DIST)
IF DOES_ENTITY_EXIST(pedLester)
REQUEST_CUTSCENE("bs_2a_ext")
SET_SRL_FORCE_PRESTREAM(SRL_PRESTREAM_FORCE_OFF)
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_ext")
ENDIF
ELIF fDistFromHouse > (DEFAULT_CUTSCENE_UNLOAD_DIST * DEFAULT_CUTSCENE_UNLOAD_DIST)
IF IS_CUTSCENE_ACTIVE()
REMOVE_CUTSCENE()
ENDIF
ENDIF
//Fail for abandoning any of the buddies.
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
FLOAT fDistFromTrevor = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
FLOAT fDistFromMichael = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
IF fDistFromTrevor > 90000.0 OR fDistFromMichael > 90000.0
IF fDistFromTrevor > 90000.0
IF fDistFromMichael > 10000.0
MISSION_FAILED(FAILED_LEFT_CREW_BEHIND)
ELSE
MISSION_FAILED(FAILED_LEFT_TREVOR_BEHIND)
ENDIF
ELSE
MISSION_FAILED(FAILED_LEFT_MICHAEL_BEHIND)
ENDIF
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REPLAY_RECORD_BACK_FOR_TIME(10.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
SETTIMERA(0) //For timing the next cutscene start
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_FINAL_CUTSCENE
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_FINAL_CUTSCENE)
ENDIF
ENDPROC
PROC DO_FINAL_CUTSCENE()
DISABLE_VEH_CONTROLS_THIS_FRAME()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
IF bHasUsedCheckpoint
START_REPLAY_SETUP(<<-820.6664, 176.5967, 70.6085>>, 0.0, FALSE)
iCurrentEvent = 99
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-820.6664, 176.5967, 70.6085>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ELSE
IF SETUP_REQ_PLAYER_IS_FRANKLIN()
AND SETUP_REQ_MICHAEL(<<-820.6664, 174.5967, 70.6085>>)
AND SETUP_REQ_TREVOR(<<-820.6664, 178.5967, 70.6085>>)
AND SETUP_REQ_MICHAELS_HOUSE_INTERIOR_LOADED()
AND SETUP_REQ_LESTER(<<-815.1111, 178.8064, 71.1592>>, 111.8100)
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
SET_MICHAELS_HOUSE_FOR_FINAL_CUTSCENE(TRUE)
iCurrentTake = iMaxTakeConsideringCrew
IF NOT bPickedGoodCarDriver
AND NOT g_bBigScore2ARescuedBadDriver
iTakePenaltyCrewDies = iMaxTakeConsideringCrew / 4
iCurrentTake -= iTakePenaltyCrewDies
ENDIF
REMOVE_PED_COMP_ITEM_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_PROPS, PROPS_P0_HEADSET)
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_PROPS, PROPS_P2_HEADSET)
ENDIF
iDisplayedTake = iCurrentTake
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
ENDIF
REQUEST_CUTSCENE("bs_2a_ext")
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_ext")
IF TIMERA() > 1000
AND (NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF) OR TIMERA() > 10000)
AND HAS_CUTSCENE_LOADED()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
ENDIF
//REGISTER_ENTITY_FOR_CUTSCENE(NULL, "driver_selection", CU_DONT_ANIMATE_ENTITY, GET_CREW_MEMBER_MODEL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER)))
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "Michael", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(pedLester)
REGISTER_ENTITY_FOR_CUTSCENE(pedLester, "Lester", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
ENDIF
//IF IS_VEHICLE_DRIVEABLE(vehMichaelsCar)
// REGISTER_ENTITY_FOR_CUTSCENE(vehMichaelsCar, "Michaels_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
//ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
START_CUTSCENE()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, TRUE, FALSE)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
bMissionPassedScreenDisplayed = FALSE
//bPlayerExitStateHit = FALSE
//bCameraExitStateHit = FALSE
iCurrentEvent = 0
bSkippedMocap = FALSE
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
SWITCH iCurrentEvent
CASE 0
IF IS_CUTSCENE_PLAYING()
//Move the last vehicle somewhere if it's in the way.
VEHICLE_INDEX vehFinalCar
vehFinalCar = GET_PLAYERS_LAST_VEHICLE()
IF IS_VEHICLE_DRIVEABLE(vehFinalCar)
IF IS_ENTITY_AT_COORD(vehFinalCar, vMichaelsHousePos, <<25.0, 25.0, 10.0>>)
PED_INDEX pedDriver
IF NOT IS_VEHICLE_SEAT_FREE(vehFinalCar)
pedDriver = GET_PED_IN_VEHICLE_SEAT(vehFinalCar)
ENDIF
//Don't warp if we arrived as a passenger (e.g. in a taxi ride)
IF pedDriver = NULL OR pedDriver = PLAYER_PED_ID()
SET_ENTITY_AS_MISSION_ENTITY(vehFinalCar)
SET_ENTITY_COORDS(vehFinalCar, <<-831.2876, 169.8409, 68.9352>>)
SET_ENTITY_HEADING(vehFinalCar, 335.8960)
SET_VEHICLE_ON_GROUND_PROPERLY(vehFinalCar)
SET_VEHICLE_DOORS_SHUT(vehFinalCar)
SET_VEHICLE_ENGINE_ON(vehFinalCar, FALSE, FALSE)
SET_VEHICLE_LIGHTS(vehFinalCar, FORCE_VEHICLE_LIGHTS_OFF)
ENDIF
ENDIF
SET_VEH_RADIO_STATION(vehFinalCar, "OFF")
ENDIF
IF DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[0])
SET_ENTITY_VISIBLE(objMichaelsHouseMapDoors[0], TRUE)
SET_OBJECT_AS_NO_LONGER_NEEDED(objMichaelsHouseMapDoors[0])
ENDIF
IF DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[1])
SET_ENTITY_VISIBLE(objMichaelsHouseMapDoors[1], TRUE)
SET_OBJECT_AS_NO_LONGER_NEEDED(objMichaelsHouseMapDoors[1])
ENDIF
//Get rid of Lester's stick.
REMOVE_OBJECT(objwalkingStick, TRUE)
REMOVE_OBJECT(objBeer, TRUE)
REMOVE_OBJECT(objMichaelsHouseDoors[0], TRUE)
REMOVE_OBJECT(objMichaelsHouseDoors[1], TRUE)
CLEAR_AREA(vMichaelsHousePos, 200.0, TRUE)
REMOVE_ANIM_DICT(strAnimsLesterLeadIn)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
DO_FADE_IN_WITH_WAIT()
iCurrentEvent++
ENDIF
BREAK
CASE 1
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
IF NOT bSkippedMocap
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
bSkippedMocap = TRUE
eSectionStage = SECTION_STAGE_SKIP
ENDIF
ENDIF
IF IS_CUTSCENE_PLAYING()
IF GET_CUTSCENE_TIME() > 93000
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
OR bSkippedMocap
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
//bCameraExitStateHit = TRUE
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 7500, 0.0)
//bPlayerExitStateHit = TRUE
ENDIF
/*IF (bPlayerExitStateHit AND bCameraExitStateHit)
OR bSkippedMocap
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
IF NOT bSkippedMocap
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_EXT_LO", CONV_PRIORITY_MEDIUM)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SETTIMERB(0)
iCurrentEvent = 50
ENDIF
ELSE
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SETTIMERB(0)
iCurrentEvent = 50
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SETTIMERB(0)
iCurrentEvent = 50
ENDIF*/
IF NOT IS_CUTSCENE_ACTIVE()
OR bSkippedMocap
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
/*IF NOT bSkippedMocap
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_EXT_LO", CONV_PRIORITY_MEDIUM)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SETTIMERB(0)
iCurrentEvent = 50
ENDIF
ELSE
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SETTIMERB(0)
iCurrentEvent = 50
ENDIF*/
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SETTIMERB(0)
iCurrentEvent = 50
ENDIF
BREAK
CASE 50
IF IS_SCREEN_FADED_OUT()
OR TIMERB() > 0
//OR TIMERB() > 1250
IF NOT IS_SCREEN_FADED_OUT()
AND NOT IS_SCREEN_FADING_OUT()
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
ENDIF
SET_NO_LOADING_SCREEN(TRUE)
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 51 //Once the screen has faded out trigger the mission passed screen.
IF TIMERB() > 3000
OR IS_SCREEN_FADED_OUT()
IF NOT IS_CUTSCENE_ACTIVE()
REMOVE_PED(pedLester, TRUE)
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
REMOVE_VEHICLE(vehMichaelsCar, TRUE)
DESTROY_ALL_CAMS()
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
IF interiorMichaelsHouse != NULL
UNPIN_INTERIOR(interiorMichaelsHouse)
interiorMichaelsHouse = NULL
ENDIF
SET_END_SCREEN_TAKE()
TRIGGER_MISSION_STATS_UI(TRUE, TRUE)
IF NOT IS_REPEAT_PLAY_ACTIVE()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
CLEAR_AREA(vFranklinPostMissionPos, 100.0, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
WHILE NOT SETUP_REQ_FRANKLINS_BIKE(vFranklinPostMissionPos, fFranklinPostMissionHeading)
WAIT(0)
ENDWHILE
IF NOT IS_ENTITY_DEAD(vehFranklinsBike)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehFranklinsBike)
SET_ENTITY_HEADING(vehFranklinsBike, fFranklinPostMissionHeading)
SET_ENTITY_COORDS(vehFranklinsBike, vFranklinPostMissionPos)
FREEZE_ENTITY_POSITION(vehFranklinsBike, TRUE)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
NEW_LOAD_SCENE_START(<<-2431.2317, -231.8247, 17.1559>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-3.0038, 0.0000, 61.4522>>), 300.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
ENDIF
SETTIMERB(0)
iCurrentEvent++
ENDIF
ENDIF
BREAK
CASE 52 //Wait for the screen to display, then continue
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF g_bResultScreenDisplaying
OR GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_stat_watcher")) < 1
bMissionPassedScreenDisplayed = TRUE
iCurrentEvent++
ENDIF
BREAK
CASE 53 //Progress once the screen is gone.
IF NOT g_bResultScreenDisplaying
IF IS_REPEAT_PLAY_ACTIVE()
eSectionStage = SECTION_STAGE_CLEANUP
ELSE
IF (IS_NEW_LOAD_SCENE_ACTIVE() AND IS_NEW_LOAD_SCENE_LOADED())
OR TIMERB() > 15000
CLEAR_AREA(vFranklinPostMissionPos, 50.0, TRUE)
IF NOT IS_ENTITY_DEAD(vehFranklinsBike)
SET_VEHICLE_FIXED(vehFranklinsBike)
FREEZE_ENTITY_POSITION(vehFranklinsBike, FALSE)
SET_ENTITY_HEADING(vehFranklinsBike, fFranklinPostMissionHeading)
SET_ENTITY_COORDS(vehFranklinsBike, vFranklinPostMissionPos)
SET_VEHICLE_ENGINE_ON(vehFranklinsBike, TRUE, TRUE)
SET_VEHICLE_RADIO_ENABLED(vehFranklinsBike, TRUE)
SET_VEH_RADIO_STATION(vehFranklinsBike, "RADIO_03_HIPHOP_NEW")
ENDIF
SET_NO_LOADING_SCREEN(FALSE)
//New version.
DESTROY_ALL_CAMS()
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
IF NOT IS_SCREEN_FADED_IN()
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(3000)
ENDIF
WHILE NOT IS_SCREEN_FADED_IN()
DISABLE_VEH_CONTROLS_THIS_FRAME()
SET_AMBIENT_VEHICLE_RANGE_MULTIPLIER_THIS_FRAME(2.0)
IF NOT IS_ENTITY_DEAD(vehFranklinsBike)
SET_VEHICLE_FORWARD_SPEED(vehFranklinsBike, 15.0)
ENDIF
WAIT(0)
ENDWHILE
ENDIF
NEW_LOAD_SCENE_STOP()
eSectionStage = SECTION_STAGE_CLEANUP
//Old version
/*camMain = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<1324.220093,628.036438,87.027969>>,<<-2.527736,0.512502,133.285507>>,50.000000, TRUE)
SET_CAM_PARAMS(camMain, <<1324.267700,628.066162,85.775108>>,<<-2.527736,0.512502,133.285507>>,50.000000, 4000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
SHAKE_CAM(camMain, "HAND_SHAKE", 0.05)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SETTIMERB(0)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
IF NOT IS_SCREEN_FADED_IN()
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_IN()
DISABLE_VEH_CONTROLS_THIS_FRAME()
SET_AMBIENT_VEHICLE_RANGE_MULTIPLIER_THIS_FRAME(2.0)
IF NOT IS_ENTITY_DEAD(vehFranklinsBike)
SET_VEHICLE_FORWARD_SPEED(vehFranklinsBike, 15.0)
ENDIF
WAIT(0)
ENDWHILE
ENDIF
iCurrentEvent++*/
ENDIF
ENDIF
ENDIF
BREAK
/*CASE 54 //Finish final shot.
IF NOT IS_ENTITY_DEAD(vehFranklinsBike)
SET_VEHICLE_FORWARD_SPEED(vehFranklinsBike, 15.0)
ENDIF
SET_AMBIENT_VEHICLE_RANGE_MULTIPLIER_THIS_FRAME(2.0)
IF TIMERB() > 2000
//DESTROY_ALL_CAMS()
NEW_LOAD_SCENE_STOP()
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
RENDER_SCRIPT_CAMS(FALSE, TRUE, 2000, FALSE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 55 //Wait for interp to finish.
IF NOT IS_ENTITY_DEAD(vehFranklinsBike)
SET_VEHICLE_FORWARD_SPEED(vehFranklinsBike, 15.0)
ENDIF
SET_AMBIENT_VEHICLE_RANGE_MULTIPLIER_THIS_FRAME(2.0)
IF TIMERB() > 2000
DESTROY_ALL_CAMS()
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
BREAK*/
ENDSWITCH
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
NEW_LOAD_SCENE_STOP()
REPLAY_STOP_EVENT()
REMOVE_PED(pedLester, TRUE)
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
REMOVE_VEHICLE(vehMichaelsCar, TRUE)
REMOVE_VEHICLE(vehFranklinsBike, FALSE)
KILL_FACE_TO_FACE_CONVERSATION()
SET_SRL_FORCE_PRESTREAM(SRL_PRESTREAM_DEFAULT)
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
MISSION_PASSED(FALSE, TRUE)
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
DO_FADE_OUT_WITH_WAIT()
STOP_CUTSCENE()
bSkippedMocap = TRUE
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDPROC
///Fail checks that are relevant across the entire mission or over a number of stages.
PROC DO_GLOBAL_FAIL_CHECKS()
IF NOT bMissionPassedScreenDisplayed
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
AND IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
MISSION_FAILED(FAILED_FRANKLIN_DIED)
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
AND IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
MISSION_FAILED(FAILED_MICHAEL_DIED)
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
MISSION_FAILED(FAILED_TREVOR_DIED)
ENDIF
IF DOES_ENTITY_EXIST(pedGateSecurity)
AND IS_PED_INJURED(pedGateSecurity)
MISSION_FAILED(FAILED_ALERTED_BANK_BY_KILLING_SECURITY)
ENDIF
IF DOES_ENTITY_EXIST(pedLester)
AND IS_PED_INJURED(pedLester)
MISSION_FAILED(FAILED_LESTER_DIED)
ENDIF
//Crew member deaths: usually the mission will fail, but a crew member can die without failing during the chase section.
INT i = 0
INT iNumCrewAlive = 0
REPEAT COUNT_OF(sCrew) i
IF DOES_ENTITY_EXIST(sCrew[i].ped)
IF NOT IS_PED_INJURED(sCrew[i].ped)
OR (NOT bPickedGoodCarDriver AND i = CREW_DRIVER AND eMissionStage >= STAGE_CHASE)
iNumCrewAlive++
ENDIF
ELSE
iNumCrewAlive++
ENDIF
ENDREPEAT
IF iNumCrewAlive < COUNT_OF(sCrew)
IF iNumCrewAlive = 0
MISSION_FAILED(FAILED_CREW_MEMBERS_DIED)
ELSE
IF eMissionStage != STAGE_CHASE
MISSION_FAILED(FAILED_CREW_MEMBER_DIED)
ELIF bPickedGoodCarDriver
MISSION_FAILED(FAILED_CREW_MEMBER_DIED)
ENDIF
ENDIF
ENDIF
//Car deaths: the crew member's gold car can die during the chase, but not elsewhere.
INT iNumCarsAlive = 0
REPEAT COUNT_OF(sGoldCars) i
IF DOES_ENTITY_EXIST(sGoldCars[i].veh)
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
OR (i = 2 AND eMissionStage >= STAGE_CHASE)
iNumCarsAlive++
ENDIF
ELSE
iNumCarsAlive++
ENDIF
ENDREPEAT
IF iNumCarsAlive < COUNT_OF(sGoldCars)
IF iNumCarsAlive = 0
MISSION_FAILED(FAILED_GOLD_CARS_DESTROYED)
ELSE
IF iNumCarsAlive = COUNT_OF(sGoldCars) - 1
MISSION_FAILED(FAILED_GOLD_CAR_DESTROYED)
ELSE
MISSION_FAILED(FAILED_SOME_GOLD_CARS_DESTROYED)
ENDIF
ENDIF
ENDIF
//Gold van deaths: after the shootout they're not needed
IF eMissionStage <= STAGE_SHOOTOUT
INT iNumVansDead = 0
REPEAT COUNT_OF(sGoldVans) i
IF DOES_ENTITY_EXIST(sGoldVans[i].veh)
IF NOT IS_VEHICLE_DRIVEABLE(sGoldVans[i].veh)
iNumVansDead++
ENDIF
ENDIF
ENDREPEAT
IF iNumVansDead > 0
IF iNumVansDead > 1
MISSION_FAILED(FAILED_GOLD_TRUCKS_DESTROYED)
ELSE
MISSION_FAILED(FAILED_GOLD_TRUCK_DESTROYED)
ENDIF
ENDIF
INT iVanCrewAlive = 0
REPEAT COUNT_OF(sGoldVanPeds) i
IF NOT IS_PED_INJURED(sGoldVanPeds[i].ped)
OR NOT DOES_ENTITY_EXIST(sGoldVanPeds[i].ped)
iVanCrewAlive++
ENDIF
ENDREPEAT
IF iVanCrewAlive < COUNT_OF(sGoldVanPeds)
IF iVanCrewAlive = 0
MISSION_FAILED(FAILED_ALL_SECURITY_WORKERS_DEAD)
ELIF iVanCrewAlive < COUNT_OF(sGoldVanPeds) - 1
MISSION_FAILED(FAILED_SOME_SECURITY_WORKERS_DEAD)
ELSE
MISSION_FAILED(FAILED_SECURITY_WORKER_DEAD)
ENDIF
ENDIF
ENDIF
//Bank worker deaths
IF eMissionStage <= STAGE_TRAFFIC_CONTROL
IF (DOES_ENTITY_EXIST(sVaultWorker.ped) AND IS_PED_INJURED(sVaultWorker.ped))
OR (DOES_ENTITY_EXIST(sBankWorker.ped) AND IS_PED_INJURED(sBankWorker.ped))
MISSION_FAILED(FAILED_BANK_WORKER_DEAD)
ENDIF
ENDIF
ENDIF
ENDPROC
#IF IS_DEBUG_BUILD
PROC UPDATE_WIDGETS()
INT i = 0
IF bDebugRecordTraffic
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
MISSION_CLEANUP()
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_DEBUG_RECORD_TRAFFIC
bDebugRecordTraffic = FALSE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF bDebugRecordSetpieces
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
MISSION_CLEANUP()
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_DEBUG_RECORD_SETPIECES
bDebugRecordSetpieces = FALSE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF bDebugRecordVanCrash
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
MISSION_CLEANUP()
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_DEBUG_RECORD_VAN_CRASH
bDebugRecordVanCrash = FALSE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF bDebugRecordRampDrive
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
MISSION_CLEANUP()
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_DEBUG_RECORD_RAMP_DRIVE
bDebugRecordRampDrive = FALSE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF bDebugPlayRampDrive
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
MISSION_CLEANUP()
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_DEBUG_TEST_RAMP_DRIVE_PLAYBACK
bDebugPlayRampDrive = FALSE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF bDebugRecordTruckTrailer
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
MISSION_CLEANUP()
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_DEBUG_RECORD_TRUCK_AND_TRAILER
bDebugRecordTruckTrailer = FALSE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF bDebugRecordChaseCamera
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
MISSION_CLEANUP()
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_DEBUG_RECORD_CHASE_CAM
bDebugRecordChaseCamera = FALSE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF bDebugPlayChaseCamera
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
MISSION_CLEANUP()
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_DEBUG_PLAY_CHASE_CAM
bDebugPlayChaseCamera = FALSE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF bDebugStartJunctionPlacement
IF NOT DOES_CAM_EXIST(camMain)
camMain = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<53.0731, -922.8204, 259.4142>>, <<-89.4995, 0.0000, -38.8765>>, 112.1350, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
ENDIF
//Place a junction where the right mouse is clicked
IF IS_BUTTON_JUST_PRESSED(PAD1, DPADDOWN)
CAMERA_INDEX camDebug = GET_DEBUG_CAM()
vDebugTcJunctionPos = GET_CAM_COORD(camDebug)
fDebugTcCrossingHeading[TC_NORTH_JUNCTION] = 0.0
fDebugTcCrossingHeading[TC_EAST_JUNCTION] = -90.0
fDebugTcCrossingHeading[TC_SOUTH_JUNCTION] = 180.0
fDebugTcCrossingHeading[TC_WEST_JUNCTION] = 90.0
REPEAT COUNT_OF(fDebugTcCrossingWidth) i
fDebugTcCrossingWidth[i] = 20.0
VECTOR v_dir = CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<0.0, 0.0, fDebugTcCrossingHeading[i]>>)
vDebugTcCrossingPos[i] = vDebugTcJunctionPos + (v_dir * 10.0)
ENDREPEAT
ENDIF
//Draw debug
DRAW_DEBUG_SPHERE(vDebugTcJunctionPos, 0.5, 255, 0, 0)
REPEAT COUNT_OF(fDebugTcCrossingWidth) i
DRAW_DEBUG_SPHERE(vDebugTcCrossingPos[i], 0.25, 0, 0, 255)
VECTOR vPerpDir1 = CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<0.0, 0.0, fDebugTcCrossingHeading[i] + 90.0>>)
VECTOR vPerpDir2 = CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<0.0, 0.0, fDebugTcCrossingHeading[i] - 90.0>>)
DRAW_DEBUG_SPHERE(vDebugTcCrossingPos[i] + (vPerpDir1 * (fDebugTcCrossingWidth[i] / 2.0)), 0.15, 0, 0, 200)
DRAW_DEBUG_SPHERE(vDebugTcCrossingPos[i] + (vPerpDir2 * (fDebugTcCrossingWidth[i] / 2.0)), 0.15, 0, 0, 200)
ENDREPEAT
IF bDebugOutputData
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("sTrafficJunction[].vCentre = ")
SAVE_VECTOR_TO_DEBUG_FILE(vDebugTcJunctionPos)
SAVE_NEWLINE_TO_DEBUG_FILE()
REPEAT COUNT_OF(fDebugTcCrossingWidth) i
SAVE_STRING_TO_DEBUG_FILE("sTrafficJunction[].sCrossings[")
SAVE_INT_TO_DEBUG_FILE(i)
SAVE_STRING_TO_DEBUG_FILE("].vCentre = ")
SAVE_VECTOR_TO_DEBUG_FILE(vDebugTcCrossingPos[i])
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("sTrafficJunction[].sCrossings[")
SAVE_INT_TO_DEBUG_FILE(i)
SAVE_STRING_TO_DEBUG_FILE("].fHeading = ")
SAVE_FLOAT_TO_DEBUG_FILE(fDebugTcCrossingHeading[i])
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("sTrafficJunction[].sCrossings[")
SAVE_INT_TO_DEBUG_FILE(i)
SAVE_STRING_TO_DEBUG_FILE("].fWidth = ")
SAVE_FLOAT_TO_DEBUG_FILE(fDebugTcCrossingWidth[i])
SAVE_NEWLINE_TO_DEBUG_FILE()
ENDREPEAT
bDebugOutputData = FALSE
ENDIF
ENDIF
IF bDebugTrafficLightTest
IF IS_MOUSE_BUTTON_JUST_PRESSED(MB_LEFT_BTN)
vDebugMousePos = GET_SCRIPT_MOUSE_POINTER_IN_WORLD_COORDS()
ENDIF
//TEMP: to fix compile errors, need the proper traffic light model.
OBJECT_INDEX objLight //= GET_CLOSEST_OBJECT_OF_TYPE(vDebugMousePos, 20.0, PROP_TRAFFIC_02A002)
IF DOES_ENTITY_EXIST(objLight)
AND vDebugMousePos.x != 0.0
SET_ENTITY_TRAFFICLIGHT_OVERRIDE(objLight, INT_TO_ENUM(TRAFFICLIGHT_OVERRIDE_MODE, iDebugTrafficLightColour))
ENDIF
ENDIF
IF bDebugForceActivate
ENTITY_INDEX veh = GET_FOCUS_ENTITY_INDEX()
IF NOT IS_ENTITY_DEAD(veh)
IF IS_BUTTON_PRESSED(PAD1, LEFTSHOULDER1)
APPLY_FORCE_TYPE eForceType
IF iDebugForceType = 0
eForceType = APPLY_TYPE_FORCE
ELIF iDebugForceType = 1
eForceType = APPLY_TYPE_IMPULSE
ELIF iDebugForceType = 2
eForceType = APPLY_TYPE_EXTERNAL_FORCE
ELIF iDebugForceType = 3
eForceType = APPLY_TYPE_EXTERNAL_IMPULSE
ELIF iDebugForceType = 4
eForceType = APPLY_TYPE_TORQUE
ELIF iDebugForceType = 5
eForceType = APPLY_TYPE_ANGULAR_IMPULSE
ENDIF
APPLY_FORCE_TO_ENTITY(veh, eForceType, vDebugForceDir, vDebugForceOffset, iDebugForceComponent,
bDebugForceLocalForce, bDebugForceLocalOffset, bDebugForceScaleByMass)
ENDIF
ENDIF
ENDIF
IF bDebugReattachTrolleys
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
DETACH_ENTITY(objGoldTrolleys[0])
DETACH_ENTITY(objGoldTrolleys[1])
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[0], sGoldVanPeds[CASEY_ID].ped, -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[1], sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
bDebugReattachTrolleys = FALSE
ENDIF
ENDIF
UPDATE_CREW_CHASE_RECORDING_TO_MATCH_SELECTIONS()
iDebugTrevorShootoutState = ENUM_TO_INT(sTrevor.eBuddyShootoutState)
iDebugMichaelShootoutState = ENUM_TO_INT(sMichael.eBuddyShootoutState)
iDebugFranklinShootoutState = ENUM_TO_INT(sFranklin.eBuddyShootoutState)
ENDPROC
PROC DO_DEBUG()
UPDATE_WIDGETS()
//Reset any skipping from the previous frame
IF eSectionStage = SECTION_STAGE_SKIP
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
AND NOT bMissionPassedScreenDisplayed
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
MISSION_PASSED(TRUE)
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)
MISSION_FAILED(FAILED_GENERIC)
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
eSectionStage = SECTION_STAGE_SKIP
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
//Work out which stage we want to reach based on the current stage
INT iCurrentStage = ENUM_TO_INT(eMissionStage)
IF iCurrentStage > 0
MISSION_STAGE eStage = INT_TO_ENUM(MISSION_STAGE, iCurrentStage - 1)
//Special case: the swap stage is a lot shorter now and hard to P-skip, so just go to the stage before it.
IF eStage = STAGE_SWAP_TO_FRANKLIN_CUTSCENE
eStage = STAGE_LEAVE_BANK
ENDIF
JUMP_TO_STAGE(eStage, TRUE)
ELSE
JUMP_TO_STAGE(STAGE_START_CUTSCENE, TRUE)
ENDIF
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD1)
OUTPUT_DEBUG_CAM_RELATIVE_TO_ENTITY(GET_FOCUS_ENTITY_INDEX())
ENDIF
IF LAUNCH_MISSION_STAGE_MENU(sSkipMenu, iDebugJumpStage, 0, FALSE, "", TRUE, FALSE, KEY_Z, KEYBOARD_MODIFIER_NONE, TRUE, FALSE, 0.9)
MISSION_STAGE eStage = INT_TO_ENUM(MISSION_STAGE, iDebugJumpStage)
JUMP_TO_STAGE(eStage, TRUE)
ENDIF
ENDIF
ENDPROC
PROC RECORD_CHASE_TRIGGER_AND_TRAFFIC()
MODEL_NAMES modelTrigger = GAUNTLET
//Request models of cars we want to appear as traffic.
REQUEST_MODEL(HABANERO)
REQUEST_MODEL(EMPEROR)
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_MODEL(modelTrigger)
IF HAS_MODEL_LOADED(modelTrigger)
vehChaseTrigger = CREATE_VEHICLE(modelTrigger, <<133.7468, -1204.6522, 28.2951>>, 182.9051)
SET_MODEL_AS_NO_LONGER_NEEDED(modelTrigger)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehChaseTrigger)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehChaseTrigger)
ENDIF
INIT_UBER_RECORDING(strCarrec)
SET_VEHICLE_POPULATION_BUDGET(1)
SET_PED_POPULATION_BUDGET(1)
IF bDebugAutoPlayTriggerCar
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(3.0)
INSTANTLY_FILL_VEHICLE_POPULATION()
ENDIF
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
REQUEST_MODEL(HABANERO)
REQUEST_MODEL(EMPEROR)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(3.0)
UPDATE_UBER_RECORDING()
//If we just want more traffic, play back the current trigger recording instead of driving the car.
IF bDebugAutoPlayTriggerCar
IF IS_VEHICLE_DRIVEABLE(vehChaseTrigger)
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_TRIGGER, strCarrec)
IF IS_RECORDING_GOING_ON_FOR_VEHICLE(vehChaseTrigger)
AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChaseTrigger)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_TRIGGER, strCarrec)
START_PLAYBACK_RECORDED_VEHICLE(vehChaseTrigger, CARREC_CHASE_TRIGGER, strCarrec)
SET_ENTITY_COLLISION(vehChaseTrigger, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC RECORD_CHASE_SETPIECES()
MODEL_NAMES modelTrigger = PCJ
bPickedGoodCarDriver = TRUE
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_MODEL(modelTrigger)
IF HAS_MODEL_LOADED(modelTrigger)
//AND SETUP_REQ_CHASE_CARS_START()
vehChaseTrigger = CREATE_VEHICLE(modelTrigger, vChaseTriggerStart, fChaseTriggerHeading)
SET_ENTITY_COLLISION(vehChaseTrigger, FALSE)
SET_ENTITY_PROOFS(vehChaseTrigger, TRUE, TRUE, TRUE, TRUE, TRUE)
SET_ENTITY_INVINCIBLE(vehChaseTrigger, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelTrigger)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehChaseTrigger)
//SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldCars[1].veh)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_NEVER)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SET_WANTED_LEVEL_MULTIPLIER(0.0)
SET_STUNT_JUMPS_CAN_TRIGGER(FALSE)
SET_RANDOM_TRAINS(FALSE)
DELETE_ALL_TRAINS()
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
SET_GAMEPLAY_CAM_MAX_MOTION_BLUR_STRENGTH_THIS_UPDATE(0.0)
SET_GAMEPLAY_CAM_MOTION_BLUR_SCALING_THIS_UPDATE(0.0)
IF IS_VEHICLE_DRIVEABLE(vehChaseTrigger)
IF iCurrentEvent = 0
INITIALISE_UBER_PLAYBACK(strCarrec, CARREC_CHASE_TRIGGER)
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02)
LOAD_CHASE_UBER_DATA()
LOAD_ACTION_CAM_DATA()
iCurrentEvent++
ELIF iCurrentEvent = 1
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_TRIGGER, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_2, strCarrec)
REQUEST_VEHICLE_RECORDING(iCarrecChaseBuddy3, strCarrec)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_TRIGGER, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_1, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_2, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrecChaseBuddy3, strCarrec)
IF SET_CAR_AT_PLAYBACK_POSITION(vehChaseTrigger, CARREC_CHASE_TRIGGER, 0.0, TRUE, FALSE)
iCurrentEvent++
ENDIF
ENDIF
ELIF iCurrentEvent = 2
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChaseTrigger)
fChasePlaybackTime = GET_TIME_POSITION_IN_RECORDING(vehChaseTrigger)
fChasePlaybackSpeed = 1.0
fUberMinTimeBeforePlaybackStartToCreate = 1500.0
bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
CREATE_ALL_WAITING_UBER_CARS()
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
UPDATE_UBER_PLAYBACK(vehChaseTrigger, 1.0)
UPDATE_CHASE_SET_PIECES()
//TEMP - v280 has issues with blending from vehicle recordings, need to warp the player out of their car.
VEHICLE_INDEX vehPlayer
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
vehPlayer = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
ENDIF
/*IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
IF IS_VEHICLE_DRIVEABLE(vehPlayer)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehPlayer)
STOP_PLAYBACK_RECORDED_vehicle(vehPlayer)
ENDIF
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehPlayer)
ENDIF
ENDIF*/
IF bSetPieceCarIsRecording
IF IS_VEHICLE_DRIVEABLE(vehPlayer)
AND GET_VEHICLE_TRAILER_VEHICLE(vehPlayer, vehDebug)
AND NOT IS_ENTITY_DEAD(vehDebug)
AND NOT IS_RECORDING_GOING_ON_FOR_VEHICLE(vehDebug)
START_RECORDING_VEHICLE(vehDebug, 0, strCarrec, TRUE)
FLOAT f_quat_x, f_quat_y, f_quat_z, f_quat_w
GET_ENTITY_QUATERNION(vehDebug, f_quat_x, f_quat_y, f_quat_z, f_quat_w)
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_VECTOR_TO_DEBUG_FILE(GET_ENTITY_COORDS(vehDebug))
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_FLOAT_TO_DEBUG_FILE(f_quat_x)
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_FLOAT_TO_DEBUG_FILE(f_quat_y)
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_FLOAT_TO_DEBUG_FILE(f_quat_z)
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_FLOAT_TO_DEBUG_FILE(f_quat_w)
SAVE_NEWLINE_TO_DEBUG_FILE()
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "RECORDING TRAILER", 4000, 0)
ENDIF
ELSE
IF NOT IS_ENTITY_DEAD(vehDebug)
IF IS_RECORDING_GOING_ON_FOR_VEHICLE(vehDebug)
STOP_RECORDING_VEHICLE(vehDebug)
ENDIF
ENDIF
ENDIF
//Draw spheres in front of the trigger: this is useful for recording cars that need to be in front.
VECTOR v_pos_1 = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(CARREC_CHASE_TRIGGER, fChasePlaybackTime + 500.0, strCarrec)
VECTOR v_pos_2 = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(CARREC_CHASE_TRIGGER, fChasePlaybackTime + 1000.0, strCarrec)
VECTOR v_pos_3 = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(CARREC_CHASE_TRIGGER, fChasePlaybackTime + 3000.0, strCarrec)
DRAW_DEBUG_SPHERE(v_pos_1, 1.0, 0, 255, 0, 128)
DRAW_DEBUG_SPHERE(v_pos_2, 1.0, 0, 255, 0, 128)
DRAW_DEBUG_SPHERE(v_pos_3, 1.0, 0, 255, 0, 128)
//TEMP: Remove collision on the main cars.
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[2])
//SET_ENTITY_COLLISION(SetPieceCarID[2], FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[3])
//SET_ENTITY_COLLISION(SetPieceCarID[3], FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[4])
//SET_ENTITY_COLLISION(SetPieceCarID[4], FALSE)
ENDIF
ELSE
iCurrentEvent = 1
CLEANUP_UBER_PLAYBACK(TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC RECORD_VAN_CRASH()
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_MODEL(modelGoldVan)
IF HAS_MODEL_LOADED(modelGoldVan)
sGoldVans[0].veh = CREATE_VEHICLE(modelGoldVan, <<412.834, -675.788, 28.9051>>, 86.137695)
sGoldVans[1].veh = CREATE_VEHICLE(modelGoldVan, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[0].veh, <<0.0, -10.0, 0.0>>), 86.137695)
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldVan)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldVans[1].veh)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_NEVER)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF iCurrentEvent = 0
SET_ENTITY_COORDS(sGoldVans[0].veh, <<412.834, -675.788, 28.9051>>)
SET_ENTITY_HEADING(sGoldVans[0].veh, 86.137695)
SET_ENTITY_COORDS(sGoldVans[1].veh, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[0].veh, <<0.0, -10.0, 0.0>>))
SET_ENTITY_HEADING(sGoldVans[1].veh, 86.137695)
iCurrentEvent++
ELIF iCurrentEvent = 1
REQUEST_VEHICLE_RECORDING(CARREC_VAN_STINGER_1, strCarrec)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_VAN_STINGER_1, strCarrec)
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
START_RECORDING_VEHICLE(sGoldVans[1].veh, CARREC_VAN_STINGER_2, strCarrec, TRUE)
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, CARREC_VAN_STINGER_1, strCarrec)
iCurrentEvent++
ENDIF
ENDIF
ELIF iCurrentEvent = 2
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
STOP_RECORDING_VEHICLE(sGoldVans[1].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
iCurrentEvent = 0
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC RECORD_RAMP_DRIVE()
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_MODEL(PACKER)
REQUEST_MODEL(modelEndTrailers)
//REQUEST_MODEL(PROP_SECTION_GARAGE_01)
REQUEST_MODEL(modelChaseCars)
IF HAS_MODEL_LOADED(modelChaseCars)
AND HAS_MODEL_LOADED(PACKER)
AND HAS_MODEL_LOADED(modelEndTrailers)
//AND HAS_MODEL_LOADED(PROP_SECTION_GARAGE_01)
vehDebug = CREATE_VEHICLE(modelChaseCars, <<-1166.2612, -658.4529, 10.0745>>, 122.5773)
sGoldVans[0].veh = CREATE_VEHICLE(PACKER, <<-1224.3223, -691.0797, 10.0816>>, 115.2663)
sGoldVans[1].veh = CREATE_VEHICLE(modelEndTrailers, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[0].veh, <<0.0, -10.0, 0.0>>), GET_ENTITY_HEADING(sGoldVans[0].veh))
ATTACH_VEHICLE_TO_TRAILER(sGoldVans[0].veh, sGoldVans[1].veh)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_BOOT, DT_DOOR_INTACT, 1.0)
SET_MODEL_AS_NO_LONGER_NEEDED(modelChaseCars)
SET_MODEL_AS_NO_LONGER_NEEDED(PACKER)
SET_MODEL_AS_NO_LONGER_NEEDED(modelEndTrailers)
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_SECTION_GARAGE_01)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehDebug)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
IF NOT IS_ENTITY_DEAD(vehDebug)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
IF iCurrentEvent = 0
SET_ENTITY_COORDS(vehDebug, <<-1166.2612, -658.4529, 10.0745>>)
SET_ENTITY_HEADING(vehDebug, 122.5773)
iCurrentEvent++
ELIF iCurrentEvent = 1
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
START_RECORDING_VEHICLE(vehDebug, CARREC_RAMP_HACK_CAR, strCarrec, TRUE)
START_RECORDING_VEHICLE(sGoldVans[1].veh, CARREC_RAMP_HACK_TRAILER, strCarrec, TRUE)
iCurrentEvent++
ENDIF
ELIF iCurrentEvent = 2
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
STOP_RECORDING_VEHICLE(vehDebug)
STOP_RECORDING_VEHICLE(sGoldVans[1].veh)
iCurrentEvent = 0
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC PLAY_RAMP_DRIVE()
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_MODEL(PACKER)
REQUEST_MODEL(modelEndTrailers)
REQUEST_MODEL(modelChaseCars)
IF HAS_MODEL_LOADED(modelChaseCars)
AND HAS_MODEL_LOADED(PACKER)
AND HAS_MODEL_LOADED(modelEndTrailers)
sGoldCars[0].veh = CREATE_VEHICLE(modelChaseCars, <<-1166.2612, -658.4529, 10.0745>>, 122.5773)
sGoldVans[0].veh = CREATE_VEHICLE(modelEndTrailers, <<-1224.3223, -691.0797, 10.0816>>, 115.2663)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_LEFT, DT_DOOR_SWINGING_FREE, 1.0)
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT, DT_DOOR_SWINGING_FREE, 1.0)
vehDebug = CREATE_VEHICLE(PACKER, <<-1253.1776, -697.2492, 11.1198>>, 115.2663)
sGoldVans[1].veh = CREATE_VEHICLE(modelEndTrailers, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehDebug, <<0.0, -10.0, 0.0>>), GET_ENTITY_HEADING(vehDebug))
ATTACH_VEHICLE_TO_TRAILER(vehDebug, sGoldVans[1].veh)
sGoldCars[1].veh = CREATE_VEHICLE(modelChaseCars, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehDebug, <<0.0, -15.0, 0.0>>), GET_ENTITY_HEADING(vehDebug))
SET_MODEL_AS_NO_LONGER_NEEDED(modelChaseCars)
SET_MODEL_AS_NO_LONGER_NEEDED(PACKER)
SET_MODEL_AS_NO_LONGER_NEEDED(modelEndTrailers)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehDebug)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
AND NOT IS_ENTITY_DEAD(vehDebug)
IF iCurrentEvent = 0
REQUEST_VEHICLE_RECORDING(CARREC_RAMP_HACK_CAR, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_RAMP_HACK_TRAILER, strCarrec)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_RAMP_HACK_CAR, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_RAMP_HACK_TRAILER, strCarrec)
SET_VEHICLE_FIXED(sGoldCars[0].veh)
SET_VEHICLE_FIXED(sGoldCars[1].veh)
SET_VEHICLE_FIXED(sGoldVans[0].veh)
START_PLAYBACK_RECORDED_VEHICLE(sGoldCars[0].veh, CARREC_RAMP_HACK_CAR, strCarrec)
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, CARREC_RAMP_HACK_TRAILER, strCarrec)
SET_ENTITY_COLLISION(sGoldCars[1].veh, FALSE)
iCurrentEvent++
ENDIF
ELIF iCurrentEvent = 1
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[0].veh)
FLOAT fTruckHeading = GET_ENTITY_HEADING(sGoldVans[0].veh)
FLOAT fCarHeading = GET_ENTITY_HEADING(sGoldCars[0].veh)
FLOAT fHeadingDiff = fCarHeading - fTruckHeading
VECTOR vRotation = GET_ENTITY_ROTATION(sGoldCars[0].veh)
VECTOR vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(sGoldVans[0].veh, GET_ENTITY_COORDS(sGoldCars[0].veh))
SET_ENTITY_COORDS_NO_OFFSET(sGoldCars[1].veh, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[1].veh, vOffset))
SET_ENTITY_ROTATION(sGoldCars[1].veh, <<vRotation.x, vRotation.y, fHeadingDiff + GET_ENTITY_HEADING(sGoldVans[1].veh)>>)
ELSE
iCurrentEvent = 0
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC RECORD_TRUCK_AND_TRAILER(VECTOR vTruckStartPos, FLOAT fTruckStartHeading, INT iTruckCarrec, INT iTrailerCarrec, BOOL bPlayBackExistingRecording = FALSE, INT iExistingRecording = 0,
BOOL bOpenTrailerDoor = FALSE)
MODEL_NAMES modelTruck = PACKER
MODEL_NAMES modelTrailer = TRAILERS3
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SWITCH iCurrentEvent
CASE 0
CLEAR_AREA(vTruckStartPos, 500.0, TRUE)
IF NOT IS_VEHICLE_DRIVEABLE(vehDebug)
REQUEST_MODEL(modelTruck)
REQUEST_MODEL(modelTrailer)
IF HAS_MODEL_LOADED(modelTruck)
AND HAS_MODEL_LOADED(modelTrailer)
SET_ENTITY_COORDS(PLAYER_PED_ID(), vTruckStartPos)
LOAD_SCENE(vTruckStartPos)
vehDebug = CREATE_VEHICLE(modelTruck, vTruckStartPos, fTruckStartHeading)
vehTrailer[0] = CREATE_VEHICLE(modelTrailer, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehDebug, <<0.0, -10.0, 0.0>>), GET_ENTITY_HEADING(vehDebug))
IF bPlaybackExistingRecording
REQUEST_VEHICLE_RECORDING(iExistingRecording, strCarrec)
WHILE NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(iExistingRecording, strCarrec)
WAIT(0)
ENDWHILE
vehDebugCamCar = CREATE_VEHICLE(modelTruck, vTruckStartPos, fTruckStartHeading)
SET_ENTITY_COLLISION(vehDebugCamCar, FALSE)
START_PLAYBACK_RECORDED_VEHICLE(vehDebugCamCar, iExistingRecording, strCarrec)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehDebugCamCar)
SET_PLAYBACK_SPEED(vehDebugCamCar, 0.0)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(modelTruck)
SET_MODEL_AS_NO_LONGER_NEEDED(modelTrailer)
ENDIF
ELSE
SET_ENTITY_COORDS(vehDebug, vTruckStartPos)
SET_ENTITY_HEADING(vehDebug, fTruckStartHeading)
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
SET_ENTITY_COORDS(vehTrailer[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehDebug, <<0.0, -10.0, 0.0>>))
SET_ENTITY_HEADING(vehTrailer[0], GET_ENTITY_HEADING(vehDebug))
ATTACH_VEHICLE_TO_TRAILER(vehDebug, vehTrailer[0])
ENDIF
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehDebug)
iCurrentEvent++
ENDIF
BREAK
CASE 1
IF IS_VEHICLE_DRIVEABLE(vehDebug)
AND NOT IS_ENTITY_DEAD(vehTrailer[0])
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
START_RECORDING_VEHICLE(vehDebug, iTruckCarrec, strCarrec, TRUE)
START_RECORDING_VEHICLE(vehTrailer[0], iTrailerCarrec, strCarrec, TRUE)
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "RECORDING STARTED", DEFAULT_GOD_TEXT_TIME, 0)
IF bPlaybackExistingRecording
IF NOT IS_ENTITY_DEAD(vehDebugCamCar)
SET_PLAYBACK_SPEED(vehDebugCamCar, 1.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehDebugCamCar)
ENDIF
ENDIF
iCurrentEvent++
ENDIF
ENDIF
BREAK
CASE 2
IF IS_VEHICLE_DRIVEABLE(vehDebug)
AND NOT IS_ENTITY_DEAD(vehTrailer[0])
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
STOP_RECORDING_VEHICLE(vehDebug)
STOP_RECORDING_VEHICLE(vehTrailer[0])
IF bPlaybackExistingRecording
IF NOT IS_ENTITY_DEAD(vehDebugCamCar)
SET_PLAYBACK_SPEED(vehDebugCamCar, 0.0)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehDebugCamCar, 0.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehDebugCamCar)
ENDIF
ENDIF
iCurrentEvent = 0
ENDIF
ENDIF
BREAK
ENDSWITCH
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
AND bOpenTrailerDoor
SET_VEHICLE_DOOR_CONTROL(vehTrailer[0], SC_DOOR_BOOT, DT_DOOR_INTACT, 1.0)
ENDIF
ENDPROC
PROC RECORD_CHASE_CAM(FLOAT fUberStartTime, INT iCarrecToAttachTo, INT iRecordingCarrec, MODEL_NAMES modelAttachCar, VECTOR vAttachOffset)
bPickedGoodCarDriver = TRUE
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
MODEL_NAMES modelTrigger = PCJ
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_MODEL(modelTrigger)
REQUEST_MODEL(modelAttachCar)
IF HAS_MODEL_LOADED(modelTrigger)
AND HAS_MODEL_LOADED(modelAttachCar)
AND SETUP_REQ_CHASE_CARS_START()
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SET_WANTED_LEVEL_MULTIPLIER(0.0)
SET_STUNT_JUMPS_CAN_TRIGGER(FALSE)
vehChaseTrigger = CREATE_VEHICLE(modelTrigger, vChaseTriggerStart, fChaseTriggerHeading)
SET_ENTITY_COLLISION(vehChaseTrigger, FALSE)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehChaseTrigger)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_NEVER)
SET_MODEL_AS_NO_LONGER_NEEDED(modelTrigger)
vehDebug = CREATE_VEHICLE(modelAttachCar, vChaseTriggerStart + <<5.0, 0.0, 0.0>>, fChaseTriggerHeading)
vehDebugCamCar = CREATE_VEHICLE(modelAttachCar, vChaseTriggerStart + <<0.0, 0.0, 2.0>>, fChaseTriggerHeading)
SET_MODEL_AS_NO_LONGER_NEEDED(modelAttachCar)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
IF IS_VEHICLE_DRIVEABLE(vehChaseTrigger)
IF iCurrentEvent = 0
INITIALISE_UBER_PLAYBACK(strCarrec, CARREC_CHASE_TRIGGER)
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02)
LOAD_CHASE_UBER_DATA()
LOAD_ACTION_CAM_DATA()
iCurrentEvent++
ELIF iCurrentEvent = 1
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_TRIGGER, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_2, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_3_GOOD_TRUCK, strCarrec)
REQUEST_VEHICLE_RECORDING(iCarrecToAttachTo, strCarrec)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_TRIGGER, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_1, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_2, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_3_GOOD_TRUCK, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrecToAttachTo, strCarrec)
IF SET_CAR_AT_PLAYBACK_POSITION(vehChaseTrigger, CARREC_CHASE_TRIGGER, fUberStartTime, TRUE, FALSE)
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
SET_CAR_AT_PLAYBACK_POSITION(sGoldCars[0].veh, CARREC_CHASE_BUDDY_1, fUberStartTime, TRUE, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
SET_CAR_AT_PLAYBACK_POSITION(sGoldCars[1].veh, CARREC_CHASE_BUDDY_2, fUberStartTime, TRUE, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
SET_CAR_AT_PLAYBACK_POSITION(sGoldCars[2].veh, CARREC_CHASE_BUDDY_3_GOOD_TRUCK, fUberStartTime, TRUE, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vehDebug)
START_PLAYBACK_RECORDED_VEHICLE(vehDebug, iCarrecToAttachTo, strCarrec)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehDebug, 0.0)
SET_ENTITY_COLLISION(vehDebug, FALSE)
ENDIF
START_CAM_RECORDING_RELATIVE_TO_ENTITY(sCamData, vehDebug, vehDebugCamCar, vAttachOffset, <<0.0, -0.5, 0.1>>, 30.0, strCarrec, iRecordingCarrec,
TRUE, TRUE, FALSE, TRUE)
iCurrentEvent++
ENDIF
ENDIF
ELIF iCurrentEvent = 2
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChaseTrigger)
fChasePlaybackTime = GET_TIME_POSITION_IN_RECORDING(vehChaseTrigger)
fChasePlaybackSpeed = 1.0
bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE
PRELOAD_ALL_CHASE_RECORDINGS(fChasePlaybackTime)
CREATE_ALL_WAITING_UBER_CARS()
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
UPDATE_UBER_PLAYBACK(vehChaseTrigger, 1.0)
UPDATE_CHASE_SET_PIECES()
UPDATE_CAM_RECORDING(sCamData)
IF IS_VEHICLE_DRIVEABLE(vehDebug)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehDebug)
//SET_PLAYBACK_SPEED(vehDebugCamCar, 1.66666) //Set-piece was recorded at 0.6 for the uber
ENDIF
ENDIF
INT i = 0
REPEAT COUNT_OF(sGoldCars) i
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
//Match playback speed to main chase
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[i].veh)
SET_PLAYBACK_SPEED(sGoldCars[i].veh, fChasePlaybackSpeed)
ENDIF
SET_ENTITY_COLLISION(sGoldCars[i].veh, FALSE)
ENDIF
ENDREPEAT
ENDIF
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
STOP_CAM_RECORDING(sCamData)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC PLAY_CHASE_CAM()
MODEL_NAMES modelTrigger = PCJ
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_MODEL(modelTrigger)
IF HAS_MODEL_LOADED(modelTrigger)
AND SETUP_REQ_CHASE_CARS_START()
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SET_WANTED_LEVEL_MULTIPLIER(0.0)
SET_STUNT_JUMPS_CAN_TRIGGER(FALSE)
vehChaseTrigger = CREATE_VEHICLE(modelTrigger, vChaseTriggerStart, fChaseTriggerHeading)
SET_ENTITY_COLLISION(vehChaseTrigger, FALSE)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehChaseTrigger)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_NEVER)
vehDebugCamCar = CREATE_VEHICLE(modelTrigger, vChaseTriggerStart + <<3.0, 0.0, 0.0>>, fChaseTriggerHeading)
SET_MODEL_AS_NO_LONGER_NEEDED(modelTrigger)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
IF IS_VEHICLE_DRIVEABLE(vehChaseTrigger)
IF iCurrentEvent = 0
INITIALISE_UBER_PLAYBACK(strCarrec, CARREC_CHASE_TRIGGER)
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02)
LOAD_CHASE_UBER_DATA()
LOAD_ACTION_CAM_DATA()
iCurrentEvent++
ELIF iCurrentEvent = 1
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_TRIGGER, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_2, strCarrec)
REQUEST_VEHICLE_RECORDING(iCarrecChaseBuddy3, strCarrec)
REQUEST_CAM_RECORDING(sActionCams[0].iRecordingID, strCarrec)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_TRIGGER, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_1, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_2, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrecChaseBuddy3, strCarrec)
AND HAS_CAM_RECORDING_LOADED(sActionCams[0].iRecordingID, strCarrec)
IF SET_CAR_AT_PLAYBACK_POSITION(vehChaseTrigger, CARREC_CHASE_TRIGGER, 0.0, TRUE, FALSE)
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
SET_CAR_AT_PLAYBACK_POSITION(sGoldCars[0].veh, CARREC_CHASE_BUDDY_1, 0.0, TRUE, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
SET_CAR_AT_PLAYBACK_POSITION(sGoldCars[1].veh, CARREC_CHASE_BUDDY_2, 0.0, TRUE, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
SET_CAR_AT_PLAYBACK_POSITION(sGoldCars[2].veh, CARREC_CHASE_BUDDY_3_GOOD_TRUCK, 0.0, TRUE, FALSE)
ENDIF
camMain = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
SHAKE_CAM(camMain, "SKY_DIVING_SHAKE", 0.15)
SET_CAM_FOV(camMain, 30.0)
START_CAM_PLAYBACK(camMain, vehDebugCamCar, strCarrec, sActionCams[0].iRecordingID)
iDebugCurrentCam = 0
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_RADAR(FALSE)
iCurrentActionCam = 0
iCurrentEvent++
ENDIF
ENDIF
ELIF iCurrentEvent = 2
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChaseTrigger)
fChasePlaybackTime = GET_TIME_POSITION_IN_RECORDING(vehChaseTrigger)
fChasePlaybackSpeed = 1.0
bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE
PRELOAD_ALL_CHASE_RECORDINGS(fChasePlaybackTime)
CREATE_ALL_WAITING_UBER_CARS()
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
UPDATE_UBER_PLAYBACK(vehChaseTrigger, 1.0)
//UPDATE_CHASE_SET_PIECES()
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[2])
SET_ENTITY_COLLISION(SetPieceCarID[2], FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[3])
SET_ENTITY_COLLISION(SetPieceCarID[3], FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[4])
SET_ENTITY_COLLISION(SetPieceCarID[4], FALSE)
ENDIF
IF bDebugPlayFinalEdit
UPDATE_CHASE_CAM(vehDebugCamCar, camMain, fChasePlaybackTime, 1.0)
ELSE
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
iDebugCurrentCam++
IF sActionCams[iDebugCurrentCam].iRecordingID = 0
iDebugCurrentCam = 0
ENDIF
CHANGE_ACTION_CAM_ANGLE(vehDebugCamCar, sActionCams[iDebugCurrentCam].iRecordingID, fChasePlaybackTime, sActionCams[iDebugCurrentCam].fStartTime)
ENDIF
ENDIF
UPDATE_CAM_PLAYBACK(camMain, vehDebugCamCar, 1.0)
SET_TEXT_SCALE(0.5, 0.5)
TEXT_LABEL_63 strTime = "Time: "
strTime += GET_STRING_FROM_FLOAT(fChasePlaybackTime)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.1, "STRING", strTime)
SET_TEXT_SCALE(0.5, 0.5)
TEXT_LABEL_23 strCam = "Cam: "
strCam += iDebugCurrentCam
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.15, "STRING", strCam)
ELSE
iCurrentEvent = 1
CLEANUP_UBER_PLAYBACK(TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
#ENDIF
SCRIPT
SET_MISSION_FLAG(TRUE)
IF HAS_FORCE_CLEANUP_OCCURRED()
Mission_Flow_Mission_Force_Cleanup()
eSectionStage = SECTION_STAGE_RUNNING
MISSION_CLEANUP()
ENDIF
MISSION_SETUP()
/*#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID widWidgets = START_WIDGET_GROUP("MISSION DEBUG")
STOP_WIDGET_GROUP()
SETUP_SPLINE_CAM_NODE_ARRAY(scsSwitchCam, INT_TO_NATIVE(PED_INDEX, 0), INT_TO_NATIVE(PED_INDEX, 0))
CREATE_SPLINE_CAM_WIDGETS(scsSwitchCam, "Michael", "Franklin", widWidgets)
#ENDIF*/
IF Is_Replay_In_Progress()
INT iStage = Get_Replay_Mid_Mission_Stage()
IF g_bShitskipAccepted
iStage++
ENDIF
IF iStage = 0
JUMP_TO_STAGE(STAGE_SET_UP_STINGER)
ELIF iStage = CHECKPOINT_DRIVE_TO_BANK
JUMP_TO_STAGE(STAGE_DRIVE_TO_BANK)
ELIF iStage = CHECKPOINT_BANK_TOUR
IF g_bShitskipAccepted
JUMP_TO_STAGE(STAGE_BANK_PARK_CUTSCENE)
ELSE
JUMP_TO_STAGE(STAGE_WALK_TO_LIFT_1)
ENDIF
ELIF iStage = CHECKPOINT_LEAVE_BANK
JUMP_TO_STAGE(STAGE_LEAVE_BANK)
ELIF iStage = CHECKPOINT_TRAFFIC_CONTROL
JUMP_TO_STAGE(STAGE_TRAFFIC_CONTROL)
ELIF iStage = CHECKPOINT_SHOOTOUT
IF g_bShitskipAccepted
JUMP_TO_STAGE(STAGE_ARRIVAL_CUTSCENE)
ELSE
JUMP_TO_STAGE(STAGE_SHOOTOUT)
ENDIF
ELIF iStage = CHECKPOINT_CHASE
JUMP_TO_STAGE(STAGE_CHASE)
ELIF iStage = CHECKPOINT_GO_HOME
IF g_bShitskipAccepted
JUMP_TO_STAGE(STAGE_DROP_OFF_TRUCKS_CUTSCENE)
ELSE
JUMP_TO_STAGE(STAGE_GO_TO_MICHAELS_HOUSE)
ENDIF
ELIF iStage > CHECKPOINT_GO_HOME
JUMP_TO_STAGE(STAGE_FINAL_CUTSCENE)
ENDIF
IF iStage >= CHECKPOINT_TRAFFIC_CONTROL
bRetryingTrafficSection = TRUE
ENDIF
DISABLE_STRIP_CLUBS() //This is no longer disabled on mission setup due to lead-in issues
bHasUsedCheckpoint = TRUE
ELSE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "HIJACK_VANS")
ENDIF
//TRACE_NATIVE_COMMAND("TRIGGER_MUSIC_EVENT")
WHILE (TRUE)
WAIT(0)
/*#IF IS_DEBUG_BUILD
UPDATE_SPLINE_CAM_WIDGETS(scsSwitchCam)
#ENDIF*/
//Used for getting the times for music triggers during mocap cutscenes.
/*IF IS_CUTSCENE_ACTIVE()
IF IS_CUTSCENE_PLAYING()
PRINTLN(GET_CUTSCENE_TIME())
ENDIF
ENDIF*/
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_BigScoreSubtle")
DO_GLOBAL_FAIL_CHECKS()
//Stats
IF eSectionStage = SECTION_STAGE_RUNNING
AND NOT bMissionPassedScreenDisplayed
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
//Track the vehicle speed/damage stat.
VEHICLE_INDEX veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(veh)
IF NOT DOES_ENTITY_EXIST(g_MissionStatSingleDamageWatchEntity)
OR NOT IS_ENTITY_A_VEHICLE(g_MissionStatSingleDamageWatchEntity)
OR (IS_ENTITY_A_VEHICLE(g_MissionStatSingleDamageWatchEntity) AND GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(g_MissionStatSingleDamageWatchEntity) != veh)
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(veh, FH2A_CAR_DAMAGE)
ENDIF
IF NOT DOES_ENTITY_EXIST(g_MissionStatSingleSpeedWatchEntity)
OR NOT IS_ENTITY_A_VEHICLE(g_MissionStatSingleSpeedWatchEntity)
OR (IS_ENTITY_A_VEHICLE(g_MissionStatSingleSpeedWatchEntity) AND GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(g_MissionStatSingleSpeedWatchEntity) != veh)
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(veh)
ENDIF
ENDIF
ELSE
//Track the player damage stat.
IF NOT DOES_ENTITY_EXIST(g_MissionStatSingleDamageWatchEntity)
OR NOT IS_ENTITY_A_PED(g_MissionStatSingleDamageWatchEntity)
OR (IS_ENTITY_A_PED(g_MissionStatSingleDamageWatchEntity) AND GET_PED_INDEX_FROM_ENTITY_INDEX(g_MissionStatSingleDamageWatchEntity) != PLAYER_PED_ID())
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID(), FH2A_DAMAGE)
ENDIF
//Remove any vehicles from the speed tracking stat.
IF g_MissionStatSingleSpeedWatchEntity != NULL
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(NULL)
ENDIF
ENDIF
ENDIF
//Remove Michael's helmet if he gets into a non-mission car.
IF eMissionStage < STAGE_GO_TO_MICHAELS_HOUSE
IF GET_ENTITY_MODEL(PLAYER_PED_ID()) != GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
IF NOT bMichaelsHelmetRemoved
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(veh)
MODEL_NAMES modelVeh = GET_ENTITY_MODEL(veh)
IF modelVeh != modelGoldVan
AND modelVeh != modelChaseCars
AND modelVeh != modelStartCar
AND NOT IS_THIS_MODEL_A_BIKE(modelVeh)
AND NOT IS_THIS_MODEL_A_BICYCLE(modelVeh)
REMOVE_PED_COMP_ITEM_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P0_SECURITY_HELMET)
bMichaelsHelmetRemoved = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P0_SECURITY_HELMET, FALSE)
bMichaelsHelmetRemoved = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
IF bHasUsedCheckpoint
IF eSectionStage = SECTION_STAGE_RUNNING
bHasUsedCheckpoint = FALSE
ENDIF
ENDIF
//Main stages
SWITCH eMissionStage
CASE STAGE_START_CUTSCENE
DO_START_CUTSCENE()
BREAK
CASE STAGE_SET_UP_STINGER
SET_UP_STINGER()
BREAK
CASE STAGE_VAN_CRASH_CUTSCENE
VAN_CRASH_CUTSCENE()
BREAK
CASE STAGE_HIJACK_VANS
HIJACK_VANS_PART_2()
BREAK
CASE STAGE_HIJACK_CUTSCENE
HIJACK_CUTSCENE()
BREAK
CASE STAGE_DRIVE_TO_BANK
DRIVE_TO_BANK()
BREAK
CASE STAGE_BANK_PARK_CUTSCENE
BANK_PARK_CUTSCENE_2()
BREAK
CASE STAGE_WALK_TO_LIFT_1
WALK_TO_LIFT_1()
BREAK
CASE STAGE_LIFT_CUTSCENE_1
LIFT_CUTSCENE_1()
BREAK
CASE STAGE_WALK_TO_VAULT
WALK_TO_VAULT()
BREAK
CASE STAGE_VAULT_OPEN_CUTSCENE
VAULT_OPEN_CUTSCENE()
BREAK
CASE STAGE_WALK_TO_GOLD
WALK_TO_GOLD()
BREAK
CASE STAGE_COLLECT_GOLD_CUTSCENE
COLLECT_GOLD_CUTSCENE()
BREAK
CASE STAGE_WALK_TO_LIFT_2
WALK_TO_LIFT_2()
BREAK
CASE STAGE_LIFT_CUTSCENE_2
LIFT_CUTSCENE_2()
BREAK
CASE STAGE_WALK_TO_VANS
WALK_TO_VANS()
BREAK
CASE STAGE_LOAD_GOLD_IN_VANS_CUTSCENE
LOAD_GOLD_INTO_VANS_CUTSCENE()
BREAK
CASE STAGE_LEAVE_BANK
LEAVE_BANK()
BREAK
CASE STAGE_SWAP_TO_FRANKLIN_CUTSCENE
//SWAP_TO_FRANKLIN_CUTSCENE()
SWAP_TO_FRANKLIN_CUTSCENE_NEW()
BREAK
CASE STAGE_TRAFFIC_CONTROL
DO_TRAFFIC_CONTROL()
BREAK
CASE STAGE_ARRIVAL_CUTSCENE
ARRIVAL_CUTSCENE()
BREAK
CASE STAGE_SHOOTOUT
DO_SHOOTOUT()
BREAK
CASE STAGE_CHASE_START_CUTSCENE
CHASE_START_CUTSCENE()
BREAK
CASE STAGE_CHASE
DO_CHASE()
BREAK
CASE STAGE_CHASE_END_CUTSCENE
DO_CHASE_END_CUTSCENE_NEW_VERSION()
BREAK
CASE STAGE_DROP_OFF_TRUCKS_CUTSCENE
DO_DROP_OFF_TRUCKS_CUTSCENE()
BREAK
CASE STAGE_GO_TO_MICHAELS_HOUSE
GO_TO_MICHAELS_HOUSE()
BREAK
CASE STAGE_FINAL_CUTSCENE
DO_FINAL_CUTSCENE()
BREAK
CASE STAGE_DEBUG_RECORD_TRAFFIC
#IF IS_DEBUG_BUILD
RECORD_CHASE_TRIGGER_AND_TRAFFIC()
#ENDIF
BREAK
CASE STAGE_DEBUG_RECORD_SETPIECES
#IF IS_DEBUG_BUILD
RECORD_CHASE_SETPIECES()
#ENDIF
BREAK
CASE STAGE_DEBUG_RECORD_VAN_CRASH
#IF IS_DEBUG_BUILD
RECORD_VAN_CRASH()
#ENDIF
BREAK
CASE STAGE_DEBUG_RECORD_RAMP_DRIVE
#IF IS_DEBUG_BUILD
RECORD_RAMP_DRIVE()
#ENDIF
BREAK
CASE STAGE_DEBUG_TEST_RAMP_DRIVE_PLAYBACK
#IF IS_DEBUG_BUILD
PLAY_RAMP_DRIVE()
#ENDIF
BREAK
CASE STAGE_DEBUG_RECORD_TRUCK_AND_TRAILER
#IF IS_DEBUG_BUILD
RECORD_TRUCK_AND_TRAILER(<<-1242.3896, -704.7631, 11.1252>>, 94.9908, 2003, 2004, TRUE, 102, TRUE)
//RECORD_TRUCK_AND_TRAILER(<<-1484.3673, -749.0250, 10.1029>>, 95.4430, 2001, 2002, TRUE, 701)
//RECORD_TRUCK_AND_TRAILER(<<-1253.1776, -697.2492, 11.1198>>, 90.0, 98, 99, TRUE, 101) //Currently setup to re-record the trailer the player drives up on.
#ENDIF
BREAK
CASE STAGE_DEBUG_RECORD_CHASE_CAM
#IF IS_DEBUG_BUILD
RECORD_CHASE_CAM(79500.0000, 110, 951, POLMAV, <<0.0, 0.0, -3.0>>)
#ENDIF
BREAK
CASE STAGE_DEBUG_PLAY_CHASE_CAM
#IF IS_DEBUG_BUILD
PLAY_CHASE_CAM()
#ENDIF
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
DO_DEBUG()
#ENDIF
ENDWHILE
ENDSCRIPT