// ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** // // 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, <>) 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 + <> 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>>, <> ) < 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, <>) //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>> + <>) 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 = <> //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()) + <>) ELSE sTrafficGameCars[iCurrentTrafficCarToProcess].veh = CREATE_VEHICLE(modelDefaultTCCar2, GET_ENTITY_COORDS(PLAYER_PED_ID()) + <>) 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()) + <>) 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, <>) 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