32352 lines
1.2 MiB
Plaintext
Executable File
32352 lines
1.2 MiB
Plaintext
Executable File
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
//
|
|
// MISSION NAME : finale_heist3A.sc
|
|
// AUTHOR : Matthew Booton
|
|
// DESCRIPTION : Michael and Trevor hijack two security vans heading to the bank, pose as the security crew,
|
|
// enter the bank via the underground loading entrance and load the gold into the vans. Franklin
|
|
// helps the vans travel through the city by hacking the traffic systems. Once the vans reach
|
|
// Franklin, the gold is transferred to three smaller cars, while this is happening the cops
|
|
// show up. Franklin, Michael and Trevor hold off the cops and escape in the cars, eventually
|
|
// driving the cars into a truck.
|
|
//
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
|
|
//Compile out Title Update changes to header functions.
|
|
//Must be before includes.
|
|
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
|
|
|
|
USING "rage_builtins.sch"
|
|
USING "globals.sch"
|
|
|
|
USING "commands_audio.sch"
|
|
USING "commands_camera.sch"
|
|
USING "commands_clock.sch"
|
|
USING "commands_debug.sch"
|
|
USING "commands_fire.sch"
|
|
USING "commands_graphics.sch"
|
|
USING "commands_hud.sch"
|
|
USING "commands_misc.sch"
|
|
USING "commands_object.sch"
|
|
USING "commands_pad.sch"
|
|
USING "commands_ped.sch"
|
|
USING "commands_physics.sch"
|
|
USING "commands_player.sch"
|
|
USING "commands_recording.sch"
|
|
USING "commands_script.sch"
|
|
USING "commands_streaming.sch"
|
|
USING "commands_task.sch"
|
|
USING "commands_vehicle.sch"
|
|
USING "commands_interiors.sch"
|
|
USING "commands_itemsets.sch"
|
|
|
|
USING "building_control_public.sch"
|
|
USING "cam_recording_public.sch"
|
|
USING "chase_hint_cam.sch"
|
|
USING "dialogue_public.sch"
|
|
USING "emergency_call.sch"
|
|
USING "locates_public.sch"
|
|
USING "flow_public_core_override.sch"
|
|
USING "model_enums.sch"
|
|
USING "push_in_public.sch"
|
|
USING "script_ped.sch"
|
|
USING "script_player.sch"
|
|
USING "script_misc.sch"
|
|
USING "script_blips.sch"
|
|
USING "script_heist.sch"
|
|
USING "selector_public.sch"
|
|
USING "locates_public.sch"
|
|
USING "replay_public.sch"
|
|
USING "CompletionPercentage_public.sch"
|
|
USING "taxi_functions.sch"
|
|
USING "cutscene_public.sch"
|
|
USING "vehicle_gen_public.sch"
|
|
USING "stripclub_public.sch"
|
|
USING "shop_public.sch"
|
|
USING "shared_hud_displays.sch"
|
|
USING "heist_end_screen.sch"
|
|
USING "vehicle_public.sch"
|
|
USING "achievement_public.sch"
|
|
USING "clearmissionarea.sch"
|
|
USING "spline_cam_edit.sch"
|
|
USING "cheat_controller_public.sch"
|
|
|
|
// total should not exceed 225
|
|
CONST_INT TOTAL_NUMBER_OF_TRAFFIC_CARS 75
|
|
CONST_INT TOTAL_NUMBER_OF_PARKED_CARS 22
|
|
CONST_INT TOTAL_NUMBER_OF_SET_PIECE_CARS 28
|
|
|
|
// total should not exceed 12
|
|
CONST_INT MAX_NUMBER_OF_TRAFFIC_CARS_PLAYING_BACK 16
|
|
CONST_INT MAX_NUMBER_OF_SET_PIECE_CARS_PLAYING_BACK 12
|
|
|
|
// this should be fine
|
|
CONST_INT MAX_NUMBER_OF_PARKED_CARS_PLAYING_BACK 20
|
|
|
|
USING "traffic.sch"
|
|
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
USING "shared_debug.sch"
|
|
USING "script_debug.sch"
|
|
USING "select_mission_stage.sch"
|
|
#ENDIF
|
|
|
|
ENUM MISSION_STAGE
|
|
STAGE_START_CUTSCENE = 0,
|
|
STAGE_SET_UP_STINGER,
|
|
STAGE_VAN_CRASH_CUTSCENE,
|
|
STAGE_HIJACK_VANS,
|
|
STAGE_HIJACK_CUTSCENE,
|
|
STAGE_DRIVE_TO_BANK,
|
|
STAGE_BANK_PARK_CUTSCENE,
|
|
STAGE_WALK_TO_LIFT_1,
|
|
STAGE_LIFT_CUTSCENE_1,
|
|
STAGE_WALK_TO_VAULT,
|
|
STAGE_VAULT_OPEN_CUTSCENE,
|
|
STAGE_WALK_TO_GOLD,
|
|
STAGE_COLLECT_GOLD_CUTSCENE,
|
|
STAGE_WALK_TO_LIFT_2,
|
|
STAGE_LIFT_CUTSCENE_2,
|
|
STAGE_WALK_TO_VANS,
|
|
STAGE_LOAD_GOLD_IN_VANS_CUTSCENE,
|
|
STAGE_LEAVE_BANK,
|
|
STAGE_SWAP_TO_FRANKLIN_CUTSCENE,
|
|
STAGE_TRAFFIC_CONTROL,
|
|
STAGE_ARRIVAL_CUTSCENE,
|
|
STAGE_SHOOTOUT,
|
|
STAGE_CHASE_START_CUTSCENE,
|
|
STAGE_CHASE,
|
|
STAGE_CHASE_END_CUTSCENE,
|
|
STAGE_DROP_OFF_TRUCKS_CUTSCENE,
|
|
STAGE_GO_TO_MICHAELS_HOUSE,
|
|
STAGE_FINAL_CUTSCENE,
|
|
STAGE_DEBUG_RECORD_TRAFFIC,
|
|
STAGE_DEBUG_RECORD_SETPIECES,
|
|
STAGE_DEBUG_RECORD_VAN_CRASH,
|
|
STAGE_DEBUG_RECORD_RAMP_DRIVE,
|
|
STAGE_DEBUG_TEST_RAMP_DRIVE_PLAYBACK,
|
|
STAGE_DEBUG_RECORD_TRUCK_AND_TRAILER,
|
|
STAGE_DEBUG_RECORD_CHASE_CAM,
|
|
STAGE_DEBUG_PLAY_CHASE_CAM
|
|
ENDENUM
|
|
|
|
ENUM FAILED_REASON
|
|
FAILED_GENERIC = 0,
|
|
FAILED_FRANKLIN_DIED,
|
|
FAILED_MICHAEL_DIED,
|
|
FAILED_TREVOR_DIED,
|
|
FAILED_CREW_MEMBER_DIED,
|
|
FAILED_CREW_MEMBERS_DIED,
|
|
FAILED_START_CAR_DESTROYED,
|
|
FAILED_GOLD_TRUCK_DESTROYED,
|
|
FAILED_GOLD_TRUCKS_DESTROYED,
|
|
FAILED_GOLD_CAR_DESTROYED,
|
|
FAILED_SOME_GOLD_CARS_DESTROYED,
|
|
FAILED_GOLD_CARS_DESTROYED,
|
|
FAILED_LOST_BUDDIES,
|
|
FAILED_DESTROYED_FRANKLINS_BIKE,
|
|
FAILED_SPOOKED_VAN_PEDS,
|
|
FAILED_MISSED_STINGER,
|
|
FAILED_STINGER_NOT_IN_TIME,
|
|
FAILED_SECURITY_WORKER_DEAD,
|
|
FAILED_SOME_SECURITY_WORKERS_DEAD,
|
|
FAILED_ALL_SECURITY_WORKERS_DEAD,
|
|
FAILED_ALERTED_BANK_BY_KILLING_SECURITY,
|
|
FAILED_ALERTED_BANK_VIA_GPS,
|
|
FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS,
|
|
FAILED_ALERTED_COPS,
|
|
FAILED_CAUGHT_DURING_TRAFFIC_CONTROL,
|
|
FAILED_MISSED_TRUCKS,
|
|
FAILED_CAR_STUCK,
|
|
FAILED_VAN_STUCK,
|
|
FAILED_LEFT_TREVOR_BEHIND,
|
|
FAILED_LEFT_MICHAEL_BEHIND,
|
|
FAILED_LEFT_FRANKLIN_BEHIND,
|
|
FAILED_LEFT_CREW_BEHIND,
|
|
FAILED_MISSED_TUNNEL,
|
|
FAILED_BANK_WORKER_DEAD,
|
|
FAILED_SPOOKED_BANK_WORKERS,
|
|
FAILED_ABANDONED_SHOOTOUT_CREW,
|
|
FAILED_ABANDONED_CAR,
|
|
FAILED_MICHAEL_VAN_TOO_DAMAGED,
|
|
FAILED_TREVOR_VAN_TOO_DAMAGED,
|
|
FAILED_TRUCK_DRIVER_DIED,
|
|
FAILED_LESTER_DIED,
|
|
FAILED_COPS_SPOTTED_TRANSFER
|
|
ENDENUM
|
|
|
|
ENUM SECTION_STAGE
|
|
SECTION_STAGE_SETUP = 0,
|
|
SECTION_STAGE_RUNNING,
|
|
SECTION_STAGE_CLEANUP,
|
|
SECTION_STAGE_SKIP,
|
|
SECTION_STAGE_JUMPING_TO_STAGE
|
|
ENDENUM
|
|
|
|
ENUM LIFT_DOOR_ACTION
|
|
LIFT_DOOR_INSTANT_OPEN,
|
|
LIFT_DOOR_INSTANT_CLOSE,
|
|
LIFT_DOOR_WAIT_FOR_OPEN_THEN_LOCK,
|
|
LIFT_DOOR_OPEN,
|
|
LIFT_DOOR_CLOSE,
|
|
LIFT_DOOR_UNLOCK
|
|
ENDENUM
|
|
|
|
ENUM TRAFFIC_CAR_STATE
|
|
TC_STATE_MOVING,
|
|
TC_STATE_GOING_THROUGH_GREEN,
|
|
TC_STATE_STOPPED_AT_RED
|
|
ENDENUM
|
|
|
|
ENUM SHOOTOUT_STATE
|
|
SHOOTOUT_STATE_DEFEND_FRONT_1,
|
|
SHOOTOUT_STATE_DEFEND_FLANK_1,
|
|
SHOOTOUT_STATE_DEFEND_FRONT_2,
|
|
SHOOTOUT_STATE_KILL_REMAINDER
|
|
ENDENUM
|
|
|
|
ENUM BUDDY_SHOOTOUT_STATE
|
|
BUDDY_STATE_DEFENDING_FRONT,
|
|
BUDDY_STATE_DEFENDING_FLANK_CLOSE,
|
|
BUDDY_STATE_DEFENDING_FLANK_FAR,
|
|
BUDDY_STATE_SNIPING
|
|
ENDENUM
|
|
|
|
ENUM PLAYER_SHOOTOUT_STATE
|
|
PLAYER_STATE_DEFENDING_FRONT,
|
|
PLAYER_STATE_DEFENDING_FLANK,
|
|
PLAYER_STATE_SNIPING
|
|
ENDENUM
|
|
|
|
ENUM TRIGGERED_TEXT_LABEL
|
|
FH3A_SKID ,
|
|
FH3A_MVEGUN ,
|
|
FH3A_MVEDRV ,
|
|
FH3A_DRP ,
|
|
FH3A_TCOMM ,
|
|
FH3A_SPIN ,
|
|
FH3A_CRSH ,
|
|
FH3A_KILL ,
|
|
FH3A_SAVE ,
|
|
FH3A_HK10 ,
|
|
FH3A_CHAT1,
|
|
FH3A_CHAT2,
|
|
FH3A_CHAT3,
|
|
FH3A_WANTED ,
|
|
LOSE_WANTED ,
|
|
FH3A_GUNCAR ,
|
|
FH3A_LONG ,
|
|
FH3A_LONG2 ,
|
|
FH3A_WAIT ,
|
|
FH3A_HOLD_PRELOAD,
|
|
FH3A_DROP ,
|
|
F3A_STINGER ,
|
|
FH3A_PROMPT ,
|
|
F3A_STINGHELP ,
|
|
FH3A_STINGER ,
|
|
F3A_WAITVAN ,
|
|
FH3A_STOP ,
|
|
FH3A_MCS1_LI ,
|
|
F3A_GETINVAN,
|
|
F3A_JACKVANS ,
|
|
FH3A_THR ,
|
|
FH3A_GOING ,
|
|
FH3A_CHAT4 ,
|
|
FH3A_LATE ,
|
|
FH3A_BURST ,
|
|
FH3A_GATE ,
|
|
FH3A_GATE_PRELOAD ,
|
|
F3A_FOLLOW ,
|
|
FH3A_LIASON ,
|
|
FH3A_LAG1 ,
|
|
FH3A_LAG1B ,
|
|
FH3A_MCS3_LO ,
|
|
FH3A_MCS3_LO_7 ,
|
|
FH3A_MCS3_LO_PRELOAD,
|
|
FH3A_SWITCH_PRELOAD,
|
|
FH3A_SWITCH_1,
|
|
FH3A_WORKER ,
|
|
FH3A_VAULT ,
|
|
FH3A_LAG2 ,
|
|
FH3A_WALK ,
|
|
FH3A_LAG3 ,
|
|
FH3A_PSHTROL ,
|
|
FH3A_LAG4 ,
|
|
FH3A_SEEN_1 ,
|
|
FH3A_SEEN_2 ,
|
|
FH3A_TROLLEY ,
|
|
FH3A_LAG5 ,
|
|
FH3A_MCS7LO1 ,
|
|
FH3A_GOING2 ,
|
|
FH3A_RADIO ,
|
|
FH3A_EXPLAIN ,
|
|
FH3A_RESPOND ,
|
|
FH3A_AWAY ,
|
|
F3A_SWITCHFRAN ,
|
|
FH3A_NOGO ,
|
|
FH3A_MCS7LO2_1 ,
|
|
FH3A_MCS7LO2_2 ,
|
|
FH3A_MCS7LO2_1_SKIPPED ,
|
|
FH3A_MCS7LO2_3 ,
|
|
F3A_TRAFHELP1D ,
|
|
F3A_TRAFHELP1B ,
|
|
FH3A_HACK ,
|
|
F3A_TRAFFIC ,
|
|
F3A_TRAFHELP3 ,
|
|
FH3A_FSEES ,
|
|
FH3A_JUNCT2 ,
|
|
FH3A_NEARLY ,
|
|
FH3A_RED ,
|
|
FH3A_IMPAT ,
|
|
FH3A_GREEN ,
|
|
FH3A_FRONT ,
|
|
FH3A_LOOKL ,
|
|
FH3A_FRONT2 ,
|
|
FH3A_STAY ,
|
|
FH3A_SNIPE ,
|
|
FH3A_OUT,
|
|
FH3A_GONE,
|
|
FH3A_SHEND ,
|
|
FH3A_NOTIME,
|
|
F3A_KILLCOPS ,
|
|
FH3A_CAR ,
|
|
FH3A_LOOKUP ,
|
|
F3A_ABANCREW ,
|
|
F3A_CAMHELP ,
|
|
FH3A_DRIVEOF ,
|
|
F3A_CHASE ,
|
|
FH3A_HARDR ,
|
|
FH3A_MJUMP ,
|
|
FH3A_GOOFF ,
|
|
FH3A_JUMP ,
|
|
FH3A_EXP ,
|
|
FH3A_SEETUN,
|
|
FH3A_CHOP,
|
|
FH3A_COPS ,
|
|
FH3A_COPSCREW ,
|
|
FH3A_SITE ,
|
|
FH3A_LOST ,
|
|
FH3A_TRUCK ,
|
|
FH3A_RTRUCK ,
|
|
FH3A_TRK ,
|
|
FH3A_ENC ,
|
|
FH3A_MAKE ,
|
|
FH3A_WHF ,
|
|
FH3A_WHERE ,
|
|
FH3A_TANKER ,
|
|
FH3A_BADTRK ,
|
|
F3A_TRUCK ,
|
|
F3A_GETBACKCAR ,
|
|
FH3A_ENDC ,
|
|
FH3A_ENDC_PRELOAD ,
|
|
FH3A_TALK ,
|
|
FH3A_TALK2 ,
|
|
FH3A_FNEAR ,
|
|
FH3A_LESTER,
|
|
FH3A_HOLD,
|
|
FH3A_KOSHM,
|
|
FH3A_KOSHF,
|
|
FH3A_KOSHT
|
|
ENDENUM
|
|
|
|
|
|
STRUCT BIRD_DATA
|
|
PED_INDEX ped
|
|
INT iEvent
|
|
INT iTimer
|
|
VECTOR vDir
|
|
FLOAT fSpeed
|
|
ENDSTRUCT
|
|
|
|
STRUCT MISSION_VEHICLE
|
|
VEHICLE_INDEX veh
|
|
BLIP_INDEX blip
|
|
INT iEvent
|
|
ENDSTRUCT
|
|
|
|
STRUCT MISSION_PED
|
|
PED_INDEX ped
|
|
BLIP_INDEX blip
|
|
INT iEvent
|
|
INT iTimer
|
|
ENDSTRUCT
|
|
|
|
STRUCT BUDDY_DATA
|
|
PED_INDEX ped
|
|
//PED_INDEX ped_current_target
|
|
BLIP_INDEX blip
|
|
COVERPOINT_INDEX cover
|
|
INT iEvent
|
|
INT iTimer
|
|
INT iTimeOfShootoutRouteSwitch
|
|
BOOL bRefreshTasks
|
|
BOOL bIsUsingSecondaryCover
|
|
VECTOR vDest
|
|
BUDDY_SHOOTOUT_STATE eBuddyShootoutState
|
|
ENDSTRUCT
|
|
|
|
STRUCT ENEMY_DATA
|
|
PED_INDEX ped
|
|
//PED_INDEX ped_current_target
|
|
BLIP_INDEX blip
|
|
COVERPOINT_INDEX cover
|
|
BOOL bIsCreated
|
|
BOOL bHasCleanedUp
|
|
BOOL bHasStartedRopeJump
|
|
BOOL bSetToCharge
|
|
INT iEvent
|
|
INT iTimer
|
|
INT iRopeEvent
|
|
VECTOR vDest
|
|
AI_BLIP_STRUCT sBlipData
|
|
ENDSTRUCT
|
|
|
|
STRUCT JUNCTION_CROSSING
|
|
VECTOR vCentre
|
|
FLOAT fHeading
|
|
//FLOAT fWidth
|
|
BOOL bIsBlocked
|
|
INT iAdjacentJunction
|
|
ENDSTRUCT
|
|
|
|
STRUCT TRAFFIC_GAME_JUNCTION
|
|
VECTOR vCentre
|
|
VECTOR vCamPos
|
|
VECTOR vCamRot
|
|
FLOAT fCamFov
|
|
INT iChangeTimer
|
|
INT iBufferingTimer
|
|
BOOL bPlayedLightStatusDialogue
|
|
BOOL bLightsFrozen
|
|
BOOL bIsBuffering
|
|
|
|
JUNCTION_CROSSING sCrossings[4]
|
|
ENDSTRUCT
|
|
|
|
STRUCT TRAFFIC_GAME_DATA
|
|
FLOAT fAspectRatio
|
|
FLOAT fHudAlpha
|
|
FLOAT fCamRotOffsetX
|
|
FLOAT fCamRotOffsetZ
|
|
FLOAT fNoiseLevel
|
|
INT iSelection
|
|
INT iNoiseTimer
|
|
INT iTimeSinceLastSelection
|
|
INT iCopsSpriteColourModifier
|
|
INT iCopsSpriteColourDir
|
|
INT iBackgroundSound
|
|
INT iStaticSound
|
|
INT iSelectSound
|
|
INT iIndicatorFlashTimer
|
|
//INT iCarCreationTimer
|
|
//INT iLastCarProcessed
|
|
INT iLastJunctionCamViewed
|
|
BOOL bJunctionCamActive
|
|
BOOL bAllowMovement
|
|
BOOL bAllowCamSwitch
|
|
BOOL bAllowSwitch
|
|
BOOL bJunctionStreamingActive
|
|
VECTOR vCursorPos
|
|
VECTOR vCurrentIndicatorPos
|
|
VEHICLE_INDEX vehIndicatorTarget
|
|
ENDSTRUCT
|
|
|
|
STRUCT TRAFFIC_GAME_CAR
|
|
VEHICLE_INDEX veh
|
|
PED_INDEX ped
|
|
BOOL bIsCreated
|
|
BOOL bIsOffScreen
|
|
INT iTimer
|
|
INT iFlashTimer
|
|
FLOAT fPlaybackSpeed
|
|
TEXT_LABEL strCurrentWaypoint
|
|
VECTOR vCurrentDest
|
|
ENDSTRUCT
|
|
|
|
STRUCT ACTION_CAM_ANGLE
|
|
INT iRecordingID
|
|
FLOAT fStartTime
|
|
ENDSTRUCT
|
|
|
|
BOOL bPickedGoodCarDriver = FALSE
|
|
BOOL bPickedGoodTruckDriver = FALSE
|
|
BOOL bPickedGoodGunman = FALSE
|
|
BOOL bPickedGoodSecondGunman = FALSE
|
|
BOOL bCustomGpsActive = FALSE
|
|
BOOL bRequestedTrafficScaleform = FALSE
|
|
BOOL bTrafficGameAudioSceneActive = FALSE
|
|
BOOL bMissionFailed = FALSE
|
|
BOOL bTrevorLeftVault = FALSE
|
|
BOOL bPlayerLeftVault = FALSE
|
|
BOOL bHostageLeftVault = FALSE
|
|
BOOL bWorkerLeftVault = FALSE
|
|
BOOL bPlayedLiftSound = FALSE
|
|
BOOL bMichaelReachedTrafficFinish = FALSE
|
|
BOOL bTrevorReachedTrafficFinish = FALSE
|
|
BOOL bPlayerAlreadyGivenArmour = FALSE
|
|
BOOL bSlomoActive = FALSE
|
|
BOOL bSkippedMocap = FALSE
|
|
BOOL bClosedVaultDoor = FALSE
|
|
BOOl bRetryingTrafficSection = FALSE
|
|
BOOL bPlayerInShootoutSafeArea = FALSE
|
|
BOOL bFrozenVehiclesForShootout = FALSE
|
|
BOOL bChaseTrailerReadyToDriveUp = FALSE
|
|
BOOL bTunnelAudioSceneActive = FALSE
|
|
BOOL bMichaelInvincibleDuringChase = FALSE
|
|
BOOL bTCPrimedMichaelNearMissDialogue = FALSE
|
|
BOOL bTCPrimedTrevorNearMissDialogue = FALSE
|
|
BOOL bMichaelSaidInstructionInChase = FALSE
|
|
BOOL bPlayerReachedBuildingSiteBlockade = FALSE
|
|
BOOL bPlayerReachedRockfordBlockade = FALSE
|
|
BOOL bPlayerReachedFreewayBlockade = FALSE
|
|
BOOL bDoAlternateVanArrivalCutscene = FALSE
|
|
BOOL bTrevorSetToLookInVansArriveCut = FALSE
|
|
BOOL bCamIsInterpingToVans = FALSE
|
|
BOOL bUberPlaybackHasStartedFromMocap = FALSE
|
|
BOOL bPlayedCopCrashSound = FALSE
|
|
BOOL bDisabledSwitch = FALSE
|
|
BOOL bPlayTruckMusicEvent = FALSE
|
|
BOOl bTrafficAudioStreamActive = FALSE
|
|
BOOl bPlayerIsDrivingUpRamp = FALSE
|
|
BOOL bFranklinsBikeAudioSceneActive = FALSE
|
|
BOOL bPlayedFranklinsBikeRevSound = FALSE
|
|
BOOL bBarriersAddedToBankInterior = FALSE
|
|
BOOL bChaseTrailerFrozen[2]
|
|
BOOL bBuddiesPushedToFlank = FALSE
|
|
BOOL bTankerCrashStreamActive = FALSE
|
|
BOOL bTrafficEndStreamingActive = FALSE
|
|
BOOL bVanTyreBurst = FALSE
|
|
BOOL bDoNewVersionOfShootout = TRUE
|
|
BOOL bMichaelsHelmetRemoved = FALSE
|
|
BOOL bRemovedShotgunSilencer = FALSE
|
|
BOOL bPreloadedOutfitsForCutscene = FALSE
|
|
BOOL bHasUsedCheckpoint = FALSE
|
|
BOOL bPlayersCarExitStateHasBeenHit = FALSE
|
|
BOOl bHeliAudioSceneSet = FALSE
|
|
BOOL bTriggeredTrafficIntro = FALSE
|
|
BOOL bInSafeAreaForInfiniteFlankSpawn = FALSE
|
|
BOOL bNearInfiniteFlankSpawnArea = FALSE
|
|
BOOL bSafeToDriveOntoTrucks = TRUE
|
|
//BOOL bPlayerExitStateHit = FALSE
|
|
//BOOL bCameraExitStateHit = FALSE
|
|
BOOL bDriverGoldBarsCreated = FALSE
|
|
BOOL bGunmanGoldBarsCreated = FALSE
|
|
BOOl bMissionPassedScreenDisplayed = FALSE
|
|
BOOL bHasChangedClothesMichael = FALSE
|
|
BOOL bHasChangedClothesFranklin = FALSE
|
|
BOOL bHasChangedClothesTrevor = FALSE
|
|
BOOL bReplayEventStarted = FALSE
|
|
BOOL bHitCutsceneCamExitState = FALSE
|
|
BOOL bHasFirstPersonFlashTriggered = FALSE
|
|
BOOL bHasTextLabelTriggered[130]
|
|
|
|
BOOL bPCCursorAccept = FALSE
|
|
BOOL bPCCursorMoved = FALSE
|
|
|
|
CONST_INT TC_NORTH_JUNCTION 0
|
|
CONST_INT TC_EAST_JUNCTION 1
|
|
CONST_INT TC_SOUTH_JUNCTION 2
|
|
CONST_INT TC_WEST_JUNCTION 3
|
|
CONST_INT CHECKPOINT_DRIVE_TO_BANK 1
|
|
CONST_INT CHECKPOINT_BANK_TOUR 2
|
|
CONST_INT CHECKPOINT_LEAVE_BANK 3
|
|
CONST_INT CHECKPOINT_TRAFFIC_CONTROL 4
|
|
CONST_INT CHECKPOINT_SHOOTOUT 5
|
|
CONST_INT CHECKPOINT_CHASE 6
|
|
CONST_INT CHECKPOINT_GO_HOME 7
|
|
CONST_INT HOSTAGE_INDEX 0
|
|
CONST_INT CASEY_ID 0
|
|
CONST_INT VAN_DRIVER_2 2
|
|
CONST_INT CARREC_TC_COP_1 10
|
|
CONST_INT CARREC_TC_COP_2 11
|
|
CONST_INT CARREC_TC_COP_3 12
|
|
CONST_INT CARREC_TC_COP_4 13
|
|
CONST_INT CARREC_TC_COP_5 14
|
|
CONST_INT CARREC_TC_COP_6 15
|
|
CONST_INT CARREC_CHASE_TRIGGER 100
|
|
CONST_INT CARREC_TRAILER_RIGHT 103
|
|
CONST_INT CARREC_TRUCK_RIGHT_BAD 98
|
|
CONST_INT CARREC_TRAILER_RIGHT_BAD 99
|
|
CONST_INT CARREC_TRAILER_LEFT 104
|
|
CONST_INT CARREC_CHASE_BUDDY_1 105
|
|
CONST_INT CARREC_CHASE_BUDDY_2 109
|
|
CONST_INT CARREC_CHASE_BUDDY_3_GOOD_TRUCK 107
|
|
CONST_INT CARREC_CHASE_BUDDY_3_BAD_DRIVER 108
|
|
CONST_INT CARREC_CHASE_BUDDY_3_BAD_TRUCK 97
|
|
CONST_INT CARREC_GAS_TANKER 122
|
|
CONST_INT CARREC_CHASE_COPS_BLOCKADE 137
|
|
CONST_INT CARREC_CHASE_COPS_BLOCKADE_2 138
|
|
CONST_INT CARREC_VAN_STINGER_1 501
|
|
CONST_INT CARREC_VAN_STINGER_2 502
|
|
CONST_INT CARREC_VAN_STINGER_BUDDIES 503
|
|
CONST_INT CARREC_COPS_VAN_1 551
|
|
CONST_INT CARREC_COPS_VAN_2 552
|
|
CONST_INT CARREC_COPS_COP_1 555
|
|
CONST_INT CARREC_COPS_COP_2 556
|
|
CONST_INT CARREC_COPS_COP_3 557
|
|
CONST_INT CARREC_COPS_NOOSE_1 558
|
|
CONST_INT CARREC_COPS_NOOSE_2 559
|
|
CONST_INT CARREC_COPS_HELI_1 560
|
|
CONST_INT CARREC_SHOOTOUT_GOONS_2A 561
|
|
CONST_INT CARREC_SHOOTOUT_GOONS_2B 562
|
|
CONST_INT CARREC_SHOOTOUT_GOONS_3A 563
|
|
CONST_INT CARREC_SHOOTOUT_GOONS_3B 564
|
|
CONST_INT CARREC_BANK_PARK_1 600
|
|
CONST_INT CARREC_BANK_PARK_2 601
|
|
CONST_INT CARREC_BANK_LEAVE_GATE 602
|
|
CONST_INT CARREC_BANK_TREVOR 603
|
|
CONST_INT CARREC_BANK_LEAVE 605
|
|
CONST_INT CARREC_GOLD_VANS_APPEAR 650
|
|
CONST_INT CARREC_END_TRUCK_1 701
|
|
CONST_INT CARREC_END_TRAILER_1 702
|
|
CONST_INT CARREC_END_TRUCK_2 703
|
|
CONST_INT CARREC_END_TRAILER_2 704
|
|
CONST_INT CARREC_END_HELI 705
|
|
CONST_INT CARREC_RAMP_HACK_CAR 901
|
|
CONST_INT CARREC_RAMP_HACK_TRAILER 902
|
|
CONST_INT PLAYERS_GOLD_CAR 3
|
|
CONST_INT NUM_TC_COP_CARS 7
|
|
CONST_INT CREW_FORCED_GUNMAN 1
|
|
CONST_INT CREW_FORCED_DRIVER 3
|
|
CONST_INT CREW_GUNMAN 0
|
|
CONST_INT CREW_DRIVER 2
|
|
CONST_INT CREW_HACKER 4
|
|
CONST_INT CHOPPER_SETPIECE_ID 5
|
|
CONST_INT MERRY_SPEAKER_1 6
|
|
CONST_INT MERRY_SPEAKER_2 7
|
|
CONST_INT MERRY_SPEAKER_3 8
|
|
CONST_INT GOLD_TROLLEY_BONE_GRIP_LEFT 14991
|
|
CONST_INT GOLD_TROLLEY_BONE_GRIP_RIGHT 50415
|
|
CONST_INT HACKER_LEVEL_GOOD 0
|
|
CONST_INT HACKER_LEVEL_MEDIUM 1
|
|
CONST_INT HACKER_LEVEL_BAD 2
|
|
CONST_INT MAX_OVERALL_TAKE 201600000
|
|
CONST_INT MERRY_CAR_COLOUR 99
|
|
INT iCurrentEvent = 0
|
|
INT iTimelapseTimer = 0
|
|
INT iCineCamPhoneTimer = 0
|
|
INT iGameplayHintEvent = 0
|
|
INT iSwitchStage = 0
|
|
INT iHealthBeforeSwitch = 0
|
|
INT iCarrecChaseBuddy3 = CARREC_CHASE_BUDDY_3_GOOD_TRUCK
|
|
INT iPreloadRecordingsIndex = 0
|
|
INT iBankGateOpenSound = 0
|
|
INT iTrafficControlHelpEvent = 0
|
|
INT iLiftDoorIndex = 0
|
|
//INT iBridgeNooseDialogueTimer = 0
|
|
INT iJumpSlomoStage = 0
|
|
//INT iChopperBulletTimer = 0
|
|
INT iLiftSoundID = 0
|
|
INT iLiftMoveSoundID = 0
|
|
INT iLiftEvent = 0
|
|
INT iCurrentTrafficCarToReposition = 0
|
|
INT iCurrentTrafficCarToProcess = 0
|
|
INT iCurrentCopCarToProcess = 0
|
|
INT iVaultDoorOpenSoundID = 0
|
|
INT iVaultDoorCloseSoundID = 0
|
|
INT iClosestVehicleCheckTimer = 0
|
|
INT iAmbientDialogueTimer = 0
|
|
INT iChaseHornTimer = 0
|
|
INT iRedLightDialogueTimer = 0
|
|
INT iRedLightHornTimer = 0
|
|
INT iSyncSceneArriveAtBank = 0
|
|
INT iSyncSceneArriveAtBank2 = 0
|
|
//INT iSyncSceneSecurityWait = 0
|
|
INT iTrainTimer = 0
|
|
INT iDriverGoldSyncScene = 0
|
|
INT iGunmanGoldSyncScene = 0
|
|
INT iTCDialogueTimer = 0
|
|
INT iGasTankerExplosionTimer = 0
|
|
INT iGasTankerExplosionEvent = 0
|
|
INT iVaultWorkerSyncScene = 0
|
|
INT iBankWorkerIdleTimer = 0
|
|
INT iTrafficHighlightEvent = 0
|
|
INT iTrafficHighlightTimer = 0
|
|
INT iGasTankerDialogueTimer = 0
|
|
INT iVanCrashEvent = 0
|
|
INT iCurrentActionCam = 0
|
|
INT iHeliBurstTimer = 0
|
|
INT iCombatDialogueTimer = 0
|
|
INT iFranklinShootoutDialogueTimer = 0
|
|
INT iTrevorShootoutDialogueTimer = 0
|
|
INT iMichaelShootoutDialogueTimer = 0
|
|
INT iMusicTriggerEvent = 0
|
|
//INT iCutsceneCamEvent = 0
|
|
INT iChaseEndTimer = 0
|
|
//INT iMerryweatherDialogueTimer = 0
|
|
INT iTrafficBlipFlashTimer = 0
|
|
INT iMusicStartTimer = 0
|
|
INT iTCNearMissDialogueTimer = 0
|
|
INT iPrevNumVanCrashes = 0
|
|
INT iTimeSinceVanLastMovedQuickly = 0
|
|
INT iTimeSinceVanLastDamaged = 0
|
|
INT iTunnelJourneyDialogueTimer = 0
|
|
INT iChaseCrashTimer = 0
|
|
INT iTrevorLagDialogueTimer = 0
|
|
INT iTrafficLightOverrideEvent = 0
|
|
INT iChaseHeliDialogueTimer = 0
|
|
INT iShootoutEndTimer = 0
|
|
INT iBankExitBarrierHash = HASH("Finale_Bank_Exit_Barrier")
|
|
INT iBankDoorState = 0
|
|
INT iTimeSinceLastChaseCopKilled = 0
|
|
INT iStingerAudioSceneEvent = 0
|
|
INT iChaseAudioSceneEvent = 0
|
|
INT iCopsCollisionDialogueTimer = 0
|
|
INT iTimeVansStopped = 0
|
|
INT iHackerLevel = HACKER_LEVEL_GOOD
|
|
INT iTrafficFailTimer = 0
|
|
INT iTrafficInstructionEvent = 0
|
|
INT iTimeOfLastTrafficSwitch = 0
|
|
INT iCurrentTake = 0 //Used for tracking take changes during the heist, mainly so the displayed take can be kept up to date.
|
|
INT iDisplayedTake = 0
|
|
INT iMaxTakeConsideringCrew = 0 //Stores take considering crew choices: this is used to calculate losses due to previous crew deaths easily on skips.
|
|
INT iTakePenaltyDropGold = 0
|
|
INT iTakePenaltyCrewDies = 0
|
|
INT iTakePenaltyCaseysCut = 0
|
|
INT iMoneyCountSoundID = 0
|
|
INT iChaseCutsceneCarSpawnTimer = 0
|
|
INT iBridgeEnemiesDialogueTimer = 0
|
|
INT iEnemyNotVisibleDialogueTimer = 0
|
|
INT iIllCoverYouDialogueTimer = 0
|
|
INT iTimeOfLastSwitch = 0
|
|
INT iGoldTrolleySoundID[2]
|
|
INT iBankWorkerSyncScene = 0
|
|
INT iSyncSceneLiftLeadOut[3]
|
|
INT iNumAliveCopsStart = 0
|
|
INT iNumAliveCopsWave2 = 0
|
|
INT iNumAliveVanFlank = 0
|
|
INT iNumAliveVanCrash = 0
|
|
INT iNumAliveNooseRope1 = 0
|
|
INT iNumAliveNooseAbove = 0
|
|
INT iNumAliveGoonsWave3b = 0
|
|
INT iNumAliveGoonsSnipe = 0
|
|
INT iNumAliveFrontEnemies = 0
|
|
INT iNumAliveInfiniteEnemiesFront = 0
|
|
INT iNumAliveInfiniteEnemiesFlank = 0
|
|
INT iTotalEnemiesInShootout = 0
|
|
INT iWrongWayDialogueTimer = 0
|
|
INT iLostDialogueTimer = 0
|
|
INT iNumTimesPlayedTrevorLostDialogue = 0
|
|
INT iNumTimesPlayedMichaelLostDialogue = 0
|
|
INT iNumTimesPlayedCrewLostDialogue = 0
|
|
INT iNumTimesPlayedTrevorFoundDialogue = 0
|
|
INT iNumTimesPlayedMichaelFoundDialogue = 0
|
|
INT iSyncSceneHijackCars = 0
|
|
INT iSyncSceneHijackCasey = 0
|
|
INT iTimeLastFlankingEnemyDamaged = 0
|
|
INT iFlankEnemiesSpawnTimer = 0
|
|
INT iTimeLastFrontEnemyDamaged = 0
|
|
INT iTimeSnipersKilledByPlayer = 0
|
|
INT iTrafficSyncedScene = 0
|
|
INT iHijackSpeechTimer = 0
|
|
INT iCarCreationEvent = 0
|
|
INT iNumFrontInfiniteEnemiesSpawned = 0
|
|
INT iNumFlankInfiniteEnemiesSpawned = 0
|
|
INT iSirenBlipTimer = 0
|
|
INT iCopsTailingFranklinEvent = 0
|
|
INT iLocateCheckIndex = 0
|
|
INT iSyncSceneMichaelsHouseDoors = 0
|
|
INT iLesterEndEvent = 0
|
|
INT iTimeSniperDialogueTriggered = 0
|
|
INT iFranklinHitCopDialogueTimer = 0
|
|
INT iCountdownAudioEvent = 0
|
|
INT iNavmeshBlockShootout[5]
|
|
INT iNavmeshBlockBankEntrance = -1
|
|
INT iTrailerRampSounds[2]
|
|
INT iTrailerRampRaiseSounds[2]
|
|
INT iTrolleyEmptyingStage[2]
|
|
|
|
CONST_FLOAT TRAILER_SETPIECE_SPEED 0.8
|
|
FLOAT fChaseTriggerHeading = 182.9051
|
|
FLOAT fChasePlaybackTime = 0.0
|
|
FLOAT fChasePlaybackSpeed = 1.0
|
|
//FLOAT fChopperPlaybackSpeed = 1.0
|
|
FLOAT fTrafficGameMainCamFOV = 65.4608
|
|
FLOAT fLiftOpenRatio = 0.0
|
|
FLOAT fCurrentTimeScale = 0.0
|
|
FLOAT fPrevClosestMerryDistMike = 0.0
|
|
FLOAT fPrevClosestMerryDistTrev = 0.0
|
|
FLOAT fStartCarHeading = 122.7590
|
|
FLOAT fPlaybackOffset = 0.0
|
|
FLOAT fPrevDistanceFromBank = 0.0
|
|
FLOAT fPrevDistanceFromTunnel = 0.0
|
|
FLOAT fFranklinPostMissionHeading = 62.5//61.0103
|
|
FLOAT fTrailerDoorRatios[2]
|
|
FLOAT fTrafficLatitude[4]
|
|
FLOAT fPrevTrafficLatitude[4]
|
|
FLOAT fTrafficTime[3]
|
|
FLOAT fPrevTrafficTime[3]
|
|
|
|
VECTOR vOutsideSecurityGate = <<-80.0971, -683.0414, 33.5046>>
|
|
VECTOR vTunnelPos = <<293.7361, -640.5953, 28.1654>>
|
|
VECTOR vWaitForVansPos = <<294.7272, -640.9750, 28.1689>>
|
|
//VECTOR vBankWorkerDestination1 = <<10.0880, -667.5394, 32.4749>>
|
|
//VECTOR vBankWorkerDestination2 = <<-1.9512, -663.2974, 15.1556>>
|
|
VECTOR vBankExit = <<28.9340, -656.6191, 30.6251>>
|
|
VECTOR vChaseTriggerStart = <<133.7468, -1204.6522, 28.2951>>
|
|
VECTOR vGate1 = <<-72.785, -682.290, 32.77>>
|
|
VECTOR vGate2 = <<25.0, -664.5, 30.76>>
|
|
//VECTOR vVaultDoorPos = <<-5.6567, -687.8661, 15.1556>>
|
|
VECTOR vTrafficGameMainCamPos = <<0.8525, -961.6469, 502.7943>>//<<43.130051,-970.825195,394.223145>> //<<46.350388,-962.160095,259.162933>>
|
|
VECTOR vTrafficGameMainCamRot = <<-89.498756,-0.000003,-20.320625>>//<<-89.499535,-0.000001,-20.320627>> //<<-89.498756,3.158357,-17.216499>>
|
|
VECTOR vVaultDoorPos = <<-1.7, -686.5, 16.7>>
|
|
VECTOR vStingerDropPos = <<0.0, 0.0, 0.0>>
|
|
VECTOR vLiftBottom1 = <<2.1, -704.1, 15.1>>
|
|
VECTOR vLiftBottom2 = <<-0.6, -703.1, 15.1>>
|
|
VECTOR vLiftTop1 = <<11.7, -668.5, 32.4>>
|
|
VECTOR vLiftTop2 = <<8.8, -668.7, 32.4>>
|
|
VECTOR vBankWorkerExit = <<-3.1908, -661.0954, 32.4830>>
|
|
VECTOR vTrolleyLeftHandAttach = <<0.0, 0.0, -0.1>>//<<-0.762, 0.559, 0.822>>
|
|
VECTOR vTrolleyRightHandAttach = <<0.0, 0.0, -0.1>>//<<-0.782, -0.539, 0.822>>
|
|
VECTOR vTrolleyAttach = <<0.0, 1.3444, -0.61>> //<<0.0, 1.5444, -0.61>>
|
|
VECTOR vStartCarPos = <<136.8679, -1305.4700, 28.0474>>
|
|
VECTOR vMichaelsHousePos = <<-817.7731, 177.7026, 71.2278>>
|
|
VECTOR vFranklinPostMissionPos = <<-2434.8701, -229.8764, 15.3772>>
|
|
|
|
|
|
STRING strManagerLeadOut = "missbigscore2aleadinout@ig_7_p2@bankman@"
|
|
STRING strAnimLiftLeadOut = "missbigscore2aleadinout@bs_2a_mcs_3"
|
|
STRING strVanArriveCamAnim = "missbigscore2a"
|
|
STRING strTrailerRampAnims = "missbigscore2a"
|
|
STRING strAnimsHijack = "missbigscore2aleadinout@bs_2a_mcs_1"
|
|
STRING strAnimsTrafficSwitch = "missbigscore2aswitch"
|
|
STRING strAnimsCamShake = "shake_cam_all@"
|
|
STRING strAnimsLesterLeadIn = "missbigscore2aleadinout@bs_2a_ext"
|
|
TEXT_LABEL strTrafficTextures = "trafficCam"
|
|
TEXT_LABEL strStingerAnims = "P_ld_stinger_s"
|
|
TEXT_LABEL strCarrec = "finheista"
|
|
TEXT_LABEL strWaypointVehLeaveBank = "BigScoreA10"
|
|
TEXT_LABEL strWaypointVehEnterBank = "BigScoreA11"
|
|
TEXT_LABEL strWaypointVehGotoBank = "BigScoreA12"
|
|
TEXT_LABEL strWaypointLiftEnterTop = "BigScoreA01"
|
|
TEXT_LABEL strWaypointLiftEnterTopLeft = "BigScoreA25"
|
|
TEXT_LABEL strWaypointLiftEnterTopRight = "BigScoreA26"
|
|
TEXT_LABEL strWaypointLiftExitTop = "BigScoreA02"
|
|
TEXT_LABEL strWaypointLiftExitTopLeft = "BigScoreA21"
|
|
TEXT_LABEL strWaypointLiftExitTopRight = "BigScoreA22"
|
|
TEXT_LABEL strWaypointLiftExitBottom = "BigScoreA03"
|
|
TEXT_LABEL strWaypointLiftExitBottomLeft = "BigScoreA27"
|
|
TEXT_LABEL strWaypointLiftExitBottomRight = "BigScoreA28"
|
|
TEXT_LABEL strWaypointLiftEnterBottom = "BigScoreA04"
|
|
TEXT_LABEL strWaypointLiftEnterBottomLeft = "BigScoreA23"
|
|
TEXT_LABEL strWaypointLiftEnterBottomRight = "BigScoreA24"
|
|
TEXT_LABEL strWaypointVehTrafficMain = "BigScoreA50"
|
|
/*TEXT_LABEL strWaypointVehTrafficCops1 = "BigScoreA60"
|
|
TEXT_LABEL strWaypointVehTrafficCops2 = "BigScoreA61"
|
|
TEXT_LABEL strWaypointVehTrafficCops3 = "BigScoreA62"
|
|
TEXT_LABEL strWaypointVehTrafficCops4 = "BigScoreA63"
|
|
TEXT_LABEL strWaypointVehTrafficCops5 = "BigScoreA64"
|
|
TEXT_LABEL strWaypointVehTrafficCops6 = "BigScoreA65"
|
|
TEXT_LABEL strWaypointVehTrafficCops7 = "BigScoreA66"*/
|
|
TEXT_LABEL strWaypointVehTCGoon1 = "BigScoreA70"
|
|
TEXT_LABEL strWaypointVehTCGoon2 = "BigScoreA71"
|
|
TEXT_LABEL strWaypointVehTCGoon3 = "BigScoreA72"
|
|
TEXT_LABEL strWaypointVehTCGoon4 = "BigScoreA73"
|
|
TEXT_LABEL strWaypointVehTCGoon5 = "BigScoreA74"
|
|
TEXT_LABEL strWaypointVehTCGoon6 = "BigScoreA75"
|
|
TEXT_LABEL strWaypointVehVansToBank = "BigScoreA20"
|
|
TEXT_LABEL strWaypointLoadGold1A = "BigScoreA31"
|
|
TEXT_LABEL strWaypointLoadGold1B = "BigScoreA32"
|
|
TEXT_LABEL strWaypointLoadGold1C = "BigScoreA33"
|
|
TEXT_LABEL strWaypointLoadGold2A = "BigScoreA34"
|
|
TEXT_LABEL strWaypointLoadGold2B = "BigScoreA35"
|
|
TEXT_LABEL strWaypointLoadGold2C = "BigScoreA36"
|
|
TEXT_LABEL strWaypointHobo = "BigScoreA80"
|
|
TEXT_LABEL strFailLabel = ""
|
|
TEXT_LABEL_31 strAnimIG1 = "missbigscore2aig_1"
|
|
TEXT_LABEL_31 strAnimIG2 = "missbigscore2aig_2"
|
|
TEXT_LABEL_31 strAnimIG3 = "missbigscore2aig_3"
|
|
TEXT_LABEL_31 strAnimIG6 = "missbigscore2aig_6"
|
|
TEXT_LABEL_31 strAnimIG5 = "missbigscore2aig_5"
|
|
TEXT_LABEL_31 strAnimIG7Driver = "missbigscore2aig_7@driver"
|
|
TEXT_LABEL_31 strAnimIG7Gunman = "missbigscore2aig_7@gunman"
|
|
TEXT_LABEL_31 strRappelAnims = "misslamar1swat_rappel"
|
|
TEXT_LABEL_31 strVaultWorkerAnims = "missbigscore2aig_4"
|
|
|
|
|
|
BLIP_INDEX blipCurrentObjective
|
|
BLIP_INDEX blipChaseChopper
|
|
|
|
CAMERA_INDEX camMain
|
|
CAMERA_INDEX camInterp
|
|
CAMERA_INDEX camAttach
|
|
CAMERA_INDEX camChase
|
|
|
|
INTERIOR_INSTANCE_INDEX interiorTunnel
|
|
INTERIOR_INSTANCE_INDEX interiorTunnel2
|
|
INTERIOR_INSTANCE_INDEX interiorTunnel3
|
|
INTERIOR_INSTANCE_INDEX interiorBank
|
|
INTERIOR_INSTANCE_INDEX interiorBankCarPark
|
|
INTERIOR_INSTANCE_INDEX interiorMichaelsHouse
|
|
INTERIOR_INSTANCE_INDEX interiorBackgroundCarPark
|
|
INTERIOR_INSTANCE_INDEX interiorChaseTunnel[4]
|
|
|
|
OBJECT_INDEX objStinger
|
|
OBJECT_INDEX objGoldTrolleys[2]
|
|
OBJECT_INDEX objEmptyTrolleys[2]
|
|
OBJECT_INDEX objSecurityBarriers[2]
|
|
OBJECT_INDEX objSecurityGateCollision[2]
|
|
OBJECT_INDEX objMachineGun
|
|
OBJECT_INDEX objIDCard
|
|
OBJECT_INDEX objGoldBarsDriver[5]
|
|
OBJECT_INDEX objGoldBarsGunman[5]
|
|
OBJECT_INDEX objFakeVaultDoor
|
|
OBJECT_INDEX objWalkieTalkie
|
|
OBJECT_INDEX objBankWorkerWalkieTalkie
|
|
//OBJECT_INDEX objShootoutPallet
|
|
OBJECT_INDEX objShootoutCover
|
|
OBJECT_INDEX objwalkingStick
|
|
OBJECT_INDEX objBeer
|
|
OBJECT_INDEX objLaptops[2]
|
|
OBJECT_INDEX objMichaelsWeapon
|
|
OBJECT_INDEX objTrevorsWeapon
|
|
OBJECT_INDEX objGunmansWeapon
|
|
OBJECT_INDEX objDriversWeapon
|
|
OBJECT_INDEX objMichaelsHouseDoors[2]
|
|
OBJECT_INDEX objMichaelsHouseMapDoors[2]
|
|
|
|
PED_INDEX pedGateSecurity
|
|
PED_INDEX pedChaseCops[4]
|
|
PED_INDEX pedChaseBlockade2[4]
|
|
PED_INDEX pedChaseBlockadeMall[2]
|
|
PED_INDEX pedEndCops[2]
|
|
PED_INDEX pedHeliGunner
|
|
PED_INDEX pedLester
|
|
PED_INDEX pedHobos[2]
|
|
|
|
PTFX_ID ptfxRampSparks[4]
|
|
|
|
SCALEFORM_INDEX sfTrafficHud
|
|
|
|
SCENARIO_BLOCKING_INDEX sbiStripClub
|
|
SCENARIO_BLOCKING_INDEX sbiTrafficControl
|
|
SCENARIO_BLOCKING_INDEX sbiSecurityVans[2]
|
|
SCENARIO_BLOCKING_INDEX sbiUnderpass
|
|
SCENARIO_BLOCKING_INDEX sbiChase[2]
|
|
SCENARIO_BLOCKING_INDEX sbiDropOffPoint
|
|
|
|
STREAMVOL_ID svChaseStart
|
|
|
|
VEHICLE_INDEX vehCopsStart[2]
|
|
VEHICLE_INDEX vehCopsWave2
|
|
VEHICLE_INDEX vehNooseWave1
|
|
VEHICLE_INDEX vehGoons3a
|
|
VEHICLE_INDEX vehGoons3b
|
|
VEHICLE_INDEX vehChaseTrigger
|
|
VEHICLE_INDEX vehTrailer[2]
|
|
VEHICLE_INDEX vehFranklinsBike
|
|
VEHICLE_INDEX vehMichaelsCar
|
|
VEHICLE_INDEX vehBuddyVan
|
|
VEHICLE_INDEX vehNooseChopper1
|
|
VEHICLE_INDEX vehEndTrucks[2]
|
|
VEHICLE_INDEX vehEndTrailers[2]
|
|
VEHICLE_INDEX vehEndHeli
|
|
VEHICLE_INDEX vehRampHackTruck
|
|
VEHICLE_INDEX vehRampHackCars[4]
|
|
VEHICLE_INDEX vehPreMissionCar
|
|
VEHICLE_INDEX vehVanCrash
|
|
VEHICLE_INDEX vehTrain
|
|
VEHICLE_INDEX vehTanker
|
|
VEHICLE_INDEX vehCamCar
|
|
VEHICLE_INDEX vehChaseCopsBlockade[2]
|
|
VEHICLE_INDEX vehChaseCops[2]
|
|
|
|
MODEL_NAMES modelStartCar = DUBSTA
|
|
MODEL_NAMES modelGoldVan = STOCKADE
|
|
MODEL_NAMES modelGoldVanPeds = S_M_M_Armoured_01
|
|
MODEL_NAMES modelCasey = IG_CASEY
|
|
MODEL_NAMES modelBankWorker = IG_BANKMAN //U_M_M_BankMan
|
|
MODEL_NAMES modelVaultWorker = A_M_Y_BUSINESS_01
|
|
MODEL_NAMES modelChaseCars = GAUNTLET //DOMINATOR
|
|
MODEL_NAMES modelStinger = P_LD_STINGER_S
|
|
MODEL_NAMES modelGoldTrolley = PROP_LARGE_GOLD //PROP_GOLD_TROLLY_FULL
|
|
MODEL_NAMES modelGoldBar = PROP_GOLD_BAR
|
|
MODEL_NAMES modelCopCar = POLICE3
|
|
MODEL_NAMES modelCop = S_M_Y_COP_01
|
|
MODEL_NAMES modelMerryweather = S_M_Y_BLACKOPS_01
|
|
MODEL_NAMES modelMerryCar = MESA3
|
|
MODEL_NAMES modelSecurityGate = P_Sec_Gate_01_S
|
|
MODEL_NAMES modeGateCollision = P_SEC_GATE_01_S_COL
|
|
MODEL_NAMES modelBuddyVan = BURRITO3
|
|
//MODEL_NAMES modelChopper = POLMAV
|
|
MODEL_NAMES modelBarrier = PROP_BARRIER_WORK05
|
|
MODEL_NAMES modelEndTruck = PACKER
|
|
MODEL_NAMES modelEndTrailers = TRAILERS3
|
|
MODEL_NAMES modelEndHeli = POLMAV//FROGGER
|
|
MODEL_NAMES modelVaultDoor = V_ILEV_FIN_VAULTDOOR
|
|
MODEL_NAMES modelFakeVaultDoor = p_fin_vaultdoor_s
|
|
MODEL_NAMES modelVaultGates = V_ILEV_FINGATE
|
|
MODEL_NAMES modelLiftDoor = V_ILEV_FINELEVDOOR01
|
|
MODEL_NAMES modelDefaultTCPed = A_M_M_Business_01
|
|
MODEL_NAMES modelDefaultTCCar = SCHWARZER
|
|
MODEL_NAMES modelDefaultTCCar2 = SERRANO
|
|
MODEL_NAMES modelIDCard = P_LD_ID_CARD_01
|
|
MODEL_NAMES modelTrain = METROTRAIN
|
|
MODEL_NAMES modelWalkieTalkie = Prop_CS_Walkie_Talkie
|
|
MODEL_NAMES modelShootoutFence = prop_fnclink_04d
|
|
MODEL_NAMES modelWalkingStick = PROP_CS_WALKING_STICK
|
|
MODEL_NAMES modelBeer = PROP_CS_BEER_BOT_01
|
|
MODEL_NAMES modelEmptyTrolley = PROP_LARGE_GOLD_EMPTY
|
|
MODEL_NAMES modelHobo = A_M_O_TRAMP_01
|
|
MODEL_NAMES modelContainerAlt1 = PROP_LARGE_GOLD_ALT_A
|
|
MODEL_NAMES modelContainerAlt2 = PROP_LARGE_GOLD_ALT_B
|
|
MODEL_NAMES modelContainerAlt3 = PROP_LARGE_GOLD_ALT_C
|
|
MODEL_NAMES modelLaptop = P_laptop_02_S
|
|
MODEL_NAMES modelMichaelsDoorLeft = V_ILEV_MM_DOORM_L
|
|
MODEL_NAMES modelMichaelsDoorRight = V_ILEV_MM_DOORM_R
|
|
//MODEL_NAMES modelShootoutCover = prop_Sk
|
|
|
|
MISSION_STAGE eMissionStage = STAGE_START_CUTSCENE
|
|
SECTION_STAGE eSectionStage = SECTION_STAGE_SETUP
|
|
SHOOTOUT_STATE eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_1
|
|
SELECTOR_SLOTS_ENUM eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
|
|
SELECTOR_PED_STRUCT sSelectorPeds
|
|
LOCATES_HEADER_DATA sLocatesData
|
|
TRAFFIC_GAME_DATA sTrafficGame
|
|
TRAFFIC_GAME_JUNCTION sTrafficJunction[11]
|
|
|
|
BUDDY_DATA sCrew[5]
|
|
BUDDY_DATA sTrevor
|
|
BUDDY_DATA sMichael
|
|
BUDDY_DATA sFranklin
|
|
BUDDY_DATA sBankWorker
|
|
|
|
ENEMY_DATA sCopsStart[8]
|
|
ENEMY_DATA sCopsWave2[4]
|
|
ENEMY_DATA sVanFlank[4]
|
|
ENEMY_DATA sVanCrash[4]
|
|
ENEMY_DATA sNooseRope1[2]
|
|
ENEMY_DATA sNooseAbove[2]
|
|
ENEMY_DATA sGoonsWave3b[4]
|
|
ENEMY_DATA sGoonsSnipe[2]
|
|
|
|
ENEMY_DATA sInfiniteEnemiesFront[2]
|
|
ENEMY_DATA sInfiniteEnemiesFlank[2]
|
|
|
|
ENEMY_DATA sChaseCopsBlockade[4]
|
|
ENEMY_DATA sChaseCops[4]
|
|
|
|
MISSION_PED sGoldVanPeds[4]
|
|
MISSION_PED sVaultWorker
|
|
|
|
MISSION_VEHICLE sGoldVans[2]
|
|
MISSION_VEHICLE sGoldCars[4]
|
|
MISSION_VEHICLE sGoldTruck
|
|
MISSION_VEHICLE sStartCar
|
|
|
|
PUSH_IN_DATA sPushInData
|
|
|
|
TRAFFIC_GAME_CAR sTrafficGameCops[NUM_TC_COP_CARS]
|
|
TRAFFIC_GAME_CAR sTrafficGameCars[12]
|
|
|
|
ACTION_CAM_ANGLE sActionCams[5]
|
|
|
|
REL_GROUP_HASH relGroupCops
|
|
REL_GROUP_HASH relGroupNeutral
|
|
|
|
structPedsForConversation sConversationPeds
|
|
SELECTOR_CAM_STRUCT sSelectorCam
|
|
CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
|
|
structTimelapse sTimelapse
|
|
|
|
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
//- TRAFFIC CONTROL SWITCH: Merged from shelved CL 4495173
|
|
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
TEXT_LABEL_31 strAudioBankBigScoreLaptop = "BIG_SCORE_LAPTOP"
|
|
|
|
ENUM BIG_HEIST_SWITCH_CAM_STATE
|
|
SWITCH_CAM_IDLE,
|
|
SWITCH_CAM_START_CODED_SWITCH,
|
|
SWITCH_CAM_PLAYING_CODED_SWITCH,
|
|
SWITCH_CAM_START_SPLINE1,
|
|
SWITCH_CAM_PLAYING_SPLINE1,
|
|
SWITCH_CAM_RETURN_TO_GAMEPLAY
|
|
ENDENUM
|
|
|
|
BIG_HEIST_SWITCH_CAM_STATE eSwitchCamState = SWITCH_CAM_IDLE
|
|
SWITCH_CAM_STRUCT scsSwitchCam
|
|
|
|
//STRING strSRLName = "trafficControl"
|
|
FLOAT fSRLTime = 0.0
|
|
|
|
FLOAT fFranklinDialogue1Phase = 0.235
|
|
|
|
FLOAT fWooshStartPhase = 0.21
|
|
FLOAT fWooshStopPhase = 0.283
|
|
|
|
INT iWooshSoundId = -1
|
|
|
|
BOOL bFranklinDialogue1Started = FALSE
|
|
BOOL bSwitchedToFranklin = FALSE
|
|
BOOL bPlayedMichaelSwitchFX = FALSE
|
|
BOOL bPlayedFranklinSwitchFX = FALSE
|
|
BOOL bRenderingHDOnly = FALSE
|
|
BOOL bSyncSceneUnpaused = FALSE
|
|
BOOL bWooshStarted = FALSE
|
|
BOOL bWooshStopped = FALSE
|
|
|
|
// PC CONTROL FOR STINGER
|
|
BOOL bPCCOntrolsSetup = FALSE
|
|
|
|
PROC SETUP_PC_CONTROLS()
|
|
|
|
IF IS_PC_VERSION()
|
|
IF bPCCOntrolsSetup = FALSE
|
|
INIT_PC_SCRIPTED_CONTROLS("FINALE HEIST STINGER")
|
|
bPCCOntrolsSetup = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC CLEANUP_PC_CONTROLS()
|
|
|
|
IF IS_PC_VERSION()
|
|
IF bPCCOntrolsSetup = TRUE
|
|
SHUTDOWN_PC_SCRIPTED_CONTROLS()
|
|
bPCCOntrolsSetup = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC START_SYNC_SCENE()
|
|
iTrafficSyncedScene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
|
|
IF NOT IS_ENTITY_DEAD(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iTrafficSyncedScene, sGoldCars[PLAYERS_GOLD_CAR].veh, 0)
|
|
|
|
IF NOT IS_ENTITY_DEAD(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
FREEZE_ENTITY_POSITION(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
TASK_SYNCHRONIZED_SCENE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], iTrafficSyncedScene, strAnimsTrafficSwitch, "switch_mic_car_fra_laptop_fra", INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(pedLester)
|
|
FREEZE_ENTITY_POSITION(pedLester, FALSE)
|
|
TASK_SYNCHRONIZED_SCENE(pedLester, iTrafficSyncedScene, strAnimsTrafficSwitch, "switch_mic_car_fra_laptop_lester", INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedLester)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(sCrew[CREW_HACKER].ped)
|
|
FREEZE_ENTITY_POSITION(sCrew[CREW_HACKER].ped, FALSE)
|
|
TASK_SYNCHRONIZED_SCENE(sCrew[CREW_HACKER].ped, iTrafficSyncedScene, strAnimsTrafficSwitch, "switch_mic_car_fra_laptop_hacker", INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sCrew[CREW_HACKER].ped)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(objLaptops[0])
|
|
FREEZE_ENTITY_POSITION(objLaptops[0], FALSE)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objLaptops[0], iTrafficSyncedScene, "switch_mic_car_fra_laptop_laptop1", strAnimsTrafficSwitch, INSTANT_BLEND_IN, SLOW_BLEND_OUT)
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objLaptops[0])
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(objLaptops[1])
|
|
FREEZE_ENTITY_POSITION(objLaptops[1], FALSE)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objLaptops[1], iTrafficSyncedScene, "switch_mic_car_fra_laptop_laptop2", strAnimsTrafficSwitch, INSTANT_BLEND_IN, SLOW_BLEND_OUT)
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objLaptops[1])
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(objwalkingStick)
|
|
FREEZE_ENTITY_POSITION(objwalkingStick, FALSE)
|
|
DETACH_ENTITY(objwalkingStick, FALSE, TRUE)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objwalkingStick, iTrafficSyncedScene, "switch_mic_car_fra_laptop_stick", strAnimsTrafficSwitch, INSTANT_BLEND_IN, SLOW_BLEND_OUT)
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objwalkingStick)
|
|
ENDIF
|
|
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(iTrafficSyncedScene, FALSE)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iTrafficSyncedScene, 0.0)
|
|
SET_SYNCHRONIZED_SCENE_RATE(iTrafficSyncedScene, 0.0)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SETUP_SPLINE_CAM_NODE_ARRAY(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX pi1, PED_INDEX pi2)
|
|
|
|
IF NOT thisSwitchCam.bInitialized
|
|
|
|
|
|
//--- Start of Cam Data ---
|
|
|
|
|
|
thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[0].iNodeTime = 0
|
|
thisSwitchCam.nodes[0].vNodePos = <<0.8301, 1.4015, 0.6565>> //<<0.7365, 2.0598, 0.6598>>
|
|
thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[0].vNodeDir = <<-1.0001, -0.9636, 0.4179>> //<<-0.2140, 0.1069, 0.6680>>
|
|
thisSwitchCam.nodes[0].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[0].fNodeFOV = 40.0000
|
|
thisSwitchCam.nodes[0].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[0].iNodeToClone = 0
|
|
thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[0].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_MEDIUM
|
|
thisSwitchCam.nodes[0].fNodeCamShake = 0.2000
|
|
thisSwitchCam.nodes[0].iCamEaseType = 0
|
|
thisSwitchCam.nodes[0].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[0].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[0].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[0].bCamEaseForceLevel = TRUE
|
|
thisSwitchCam.nodes[0].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[0].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[0].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[0].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[0].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[0].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[0].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[0].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[0].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[0].iHoldDuration = 0
|
|
thisSwitchCam.nodes[0].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[0].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[0].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[1].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[1].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[1].iNodeTime = 3500
|
|
thisSwitchCam.nodes[1].vNodePos = <<0.7813, 1.3384, 0.6502>> //<<0.6958, 1.9692, 0.6596>>
|
|
thisSwitchCam.nodes[1].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[1].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[1].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[1].vNodeDir = <<-1.0489, -1.0266, 0.4116>> //<<-0.2093, 0.1110, 0.6842>>
|
|
thisSwitchCam.nodes[1].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[1].fNodeFOV = 40.0000
|
|
thisSwitchCam.nodes[1].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[1].iNodeToClone = 0
|
|
thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[1].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_MEDIUM
|
|
thisSwitchCam.nodes[1].fNodeCamShake = 0.2000
|
|
thisSwitchCam.nodes[1].iCamEaseType = 2
|
|
thisSwitchCam.nodes[1].fCamEaseScaler = 1.0000
|
|
thisSwitchCam.nodes[1].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[1].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[1].bCamEaseForceLevel = TRUE
|
|
thisSwitchCam.nodes[1].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[1].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[1].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[1].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[1].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[1].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[1].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[1].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[1].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[1].iHoldDuration = 0
|
|
thisSwitchCam.nodes[1].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[1].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[1].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[2].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[2].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[2].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[2].iNodeTime = 600
|
|
thisSwitchCam.nodes[2].vNodePos = <<0.7813, 1.3384, 2.0294>> //<<0.6420, 2.0132, 2.0049>>
|
|
thisSwitchCam.nodes[2].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[2].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[2].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[2].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[2].vNodeDir = <<-1.0489, -1.0266, 2.0294>> //<<-0.2630, 0.1549, 2.0294>>
|
|
thisSwitchCam.nodes[2].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[2].fNodeFOV = 40.0000
|
|
thisSwitchCam.nodes[2].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[2].iNodeToClone = 0
|
|
thisSwitchCam.nodes[2].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[2].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[2].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[2].fNodeMotionBlur = 1.0000
|
|
thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_MEDIUM
|
|
thisSwitchCam.nodes[2].fNodeCamShake = 0.5000
|
|
thisSwitchCam.nodes[2].iCamEaseType = 0
|
|
thisSwitchCam.nodes[2].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[2].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[2].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[2].bCamEaseForceLevel = TRUE
|
|
thisSwitchCam.nodes[2].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[2].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[2].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[2].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[2].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[2].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[2].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[2].iHoldDuration = 0
|
|
thisSwitchCam.nodes[2].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[2].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[2].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[3].bIsCamCutNode = TRUE
|
|
|
|
thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_WORLD_POS
|
|
thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[4].iNodeTime = 0
|
|
thisSwitchCam.nodes[4].vNodePos = <<125.1270, -1184.9181, 28.6665>>
|
|
thisSwitchCam.nodes[4].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[4].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[4].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[4].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[4].vNodeDir = <<-11.8747, 0.0000, -60.9711>>
|
|
thisSwitchCam.nodes[4].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[4].bAttachOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[4].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[4].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[4].iNodeToClone = 0
|
|
thisSwitchCam.nodes[4].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[4].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[4].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[4].fNodeMotionBlur = 1.0000
|
|
thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_MEDIUM
|
|
thisSwitchCam.nodes[4].fNodeCamShake = 0.3000
|
|
thisSwitchCam.nodes[4].iCamEaseType = 1
|
|
thisSwitchCam.nodes[4].fCamEaseScaler = 1.0000
|
|
thisSwitchCam.nodes[4].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[4].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[4].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[4].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[4].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[4].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[4].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[4].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[4].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[4].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[4].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[4].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[4].iHoldDuration = 0
|
|
thisSwitchCam.nodes[4].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[4].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[4].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_NearDOF = 1.0000
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_FarDOF = 5.0000
|
|
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_EffectStrength = 1.0000
|
|
|
|
thisSwitchCam.nodes[5].SwitchCamType = SWITCH_CAM_WORLD_POS
|
|
thisSwitchCam.nodes[5].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[5].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[5].iNodeTime = 600
|
|
thisSwitchCam.nodes[5].vNodePos = <<125.3823, -1184.7758, 30.0584>>
|
|
thisSwitchCam.nodes[5].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[5].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[5].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[5].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[5].vNodeDir = <<-11.8491, 0.0000, -60.9382>>
|
|
thisSwitchCam.nodes[5].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[5].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[5].bAttachOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[5].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[5].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[5].iNodeToClone = 0
|
|
thisSwitchCam.nodes[5].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[5].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[5].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[5].fNodeMotionBlur = 1.0000
|
|
thisSwitchCam.nodes[5].NodeCamShakeType = CAM_SHAKE_MEDIUM
|
|
thisSwitchCam.nodes[5].fNodeCamShake = 0.3000
|
|
thisSwitchCam.nodes[5].iCamEaseType = 0
|
|
thisSwitchCam.nodes[5].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[5].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[5].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[5].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[5].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[5].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[5].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[5].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[5].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[5].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[5].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[5].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[5].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[5].iHoldDuration = 0
|
|
thisSwitchCam.nodes[5].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[5].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[5].bUseCustomDOF = TRUE
|
|
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_NearDOF = 1.0000
|
|
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_FarDOF = 5.0000
|
|
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_EffectStrength = 1.0000
|
|
|
|
thisSwitchCam.nodes[6].SwitchCamType = SWITCH_CAM_WORLD_POS
|
|
thisSwitchCam.nodes[6].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[6].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[6].iNodeTime = 3500
|
|
thisSwitchCam.nodes[6].vNodePos = <<125.5458, -1184.6844, 30.0072>>
|
|
thisSwitchCam.nodes[6].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[6].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[6].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[6].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[6].vNodeDir = <<-8.7028, 0.0000, -60.9332>>
|
|
thisSwitchCam.nodes[6].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[6].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[6].bAttachOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[6].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[6].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[6].iNodeToClone = 0
|
|
thisSwitchCam.nodes[6].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[6].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[6].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[6].fNodeMotionBlur = 1.0000
|
|
thisSwitchCam.nodes[6].NodeCamShakeType = CAM_SHAKE_MEDIUM
|
|
thisSwitchCam.nodes[6].fNodeCamShake = 0.3000
|
|
thisSwitchCam.nodes[6].iCamEaseType = 0
|
|
thisSwitchCam.nodes[6].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[6].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[6].bCamEaseForceLinear = TRUE
|
|
thisSwitchCam.nodes[6].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[6].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[6].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[6].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[6].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[6].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[6].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[6].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[6].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[6].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[6].iHoldDuration = 0
|
|
thisSwitchCam.nodes[6].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[6].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[6].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[7].bIsCamCutNode = TRUE
|
|
|
|
thisSwitchCam.nodes[8].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[8].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[8].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[8].iNodeTime = 0
|
|
thisSwitchCam.nodes[8].vNodePos = <<-1.6749, 2.3071, 0.7210>>
|
|
thisSwitchCam.nodes[8].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[8].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[8].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[8].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[8].vNodeDir = <<-0.1197, -0.1124, 0.1506>>
|
|
thisSwitchCam.nodes[8].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[8].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[8].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[8].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[8].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[8].iNodeToClone = 0
|
|
thisSwitchCam.nodes[8].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[8].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[8].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[8].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[8].NodeCamShakeType = CAM_SHAKE_MEDIUM
|
|
thisSwitchCam.nodes[8].fNodeCamShake = 0.3000
|
|
thisSwitchCam.nodes[8].iCamEaseType = 0
|
|
thisSwitchCam.nodes[8].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[8].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[8].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[8].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[8].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[8].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[8].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[8].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[8].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[8].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[8].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[8].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[8].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[8].iHoldDuration = 0
|
|
thisSwitchCam.nodes[8].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[8].bIsLowDetailNode = TRUE
|
|
thisSwitchCam.nodes[8].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[8].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[8].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[8].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[9].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[9].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[9].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[9].iNodeTime = 5000
|
|
thisSwitchCam.nodes[9].vNodePos = <<-1.5402, 2.0971, 0.6716>>
|
|
thisSwitchCam.nodes[9].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[9].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[9].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[9].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[9].vNodeDir = <<-0.1199, -0.1126, 0.1506>>
|
|
thisSwitchCam.nodes[9].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[9].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[9].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[9].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[9].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[9].iNodeToClone = 0
|
|
thisSwitchCam.nodes[9].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[9].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[9].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[9].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[9].NodeCamShakeType = CAM_SHAKE_MEDIUM
|
|
thisSwitchCam.nodes[9].fNodeCamShake = 0.3000
|
|
thisSwitchCam.nodes[9].iCamEaseType = 0
|
|
thisSwitchCam.nodes[9].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[9].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[9].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[9].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[9].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[9].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[9].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[9].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[9].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[9].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[9].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[9].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[9].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[9].iHoldDuration = 0
|
|
thisSwitchCam.nodes[9].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[9].bIsLowDetailNode = TRUE
|
|
thisSwitchCam.nodes[9].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[9].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[9].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[9].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[10].bIsCamCutNode = TRUE
|
|
|
|
thisSwitchCam.nodes[11].SwitchCamType = SWITCH_CAM_WORLD_POS
|
|
thisSwitchCam.nodes[11].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[11].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[11].iNodeTime = 0
|
|
thisSwitchCam.nodes[11].vNodePos = <<125.9506, -1184.6221, 29.7275>>
|
|
thisSwitchCam.nodes[11].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[11].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[11].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[11].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[11].vNodeDir = <<0.2183, 0.0000, -52.6074>>
|
|
thisSwitchCam.nodes[11].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[11].bPointAtOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[11].bAttachOffsetIsRelative = FALSE
|
|
thisSwitchCam.nodes[11].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[11].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[11].iNodeToClone = 0
|
|
thisSwitchCam.nodes[11].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[11].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[11].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[11].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[11].NodeCamShakeType = CAM_SHAKE_MEDIUM
|
|
thisSwitchCam.nodes[11].fNodeCamShake = 0.3000
|
|
thisSwitchCam.nodes[11].iCamEaseType = 0
|
|
thisSwitchCam.nodes[11].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[11].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[11].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[11].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[11].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[11].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[11].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[11].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[11].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[11].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[11].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[11].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[11].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[11].iHoldDuration = 0
|
|
thisSwitchCam.nodes[11].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[11].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[11].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[11].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[11].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[11].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
thisSwitchCam.nodes[12].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
thisSwitchCam.nodes[12].iForceCamPointAtEntityIndex = -1
|
|
thisSwitchCam.nodes[12].bIsGameplayCamCopy = FALSE
|
|
thisSwitchCam.nodes[12].iNodeTime = 3400
|
|
thisSwitchCam.nodes[12].vNodePos = <<0.6801, 1.1884, 0.3570>>
|
|
thisSwitchCam.nodes[12].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[12].fNodeOffsetDist = 0.0000
|
|
thisSwitchCam.nodes[12].fNodeVerticleOffset = 0.0000
|
|
thisSwitchCam.nodes[12].bAttachToOriginPed = FALSE
|
|
thisSwitchCam.nodes[12].vNodeDir = <<-0.3077, 0.3765, 0.3619>>
|
|
thisSwitchCam.nodes[12].bPointAtEntity = TRUE
|
|
thisSwitchCam.nodes[12].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[12].bAttachOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[12].fNodeFOV = 50.0000
|
|
thisSwitchCam.nodes[12].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
|
|
thisSwitchCam.nodes[12].iNodeToClone = 0
|
|
thisSwitchCam.nodes[12].NodeTimePostFX_Type = NO_EFFECT
|
|
thisSwitchCam.nodes[12].fNodeTimePostFXBlendTime = 0.0000
|
|
thisSwitchCam.nodes[12].fNodeTimePostFXTimeOffset = 0.0000
|
|
thisSwitchCam.nodes[12].fNodeMotionBlur = 0.0000
|
|
thisSwitchCam.nodes[12].NodeCamShakeType = CAM_SHAKE_MEDIUM
|
|
thisSwitchCam.nodes[12].fNodeCamShake = 0.3000
|
|
thisSwitchCam.nodes[12].iCamEaseType = 0
|
|
thisSwitchCam.nodes[12].fCamEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[12].fCamNodeVelocityScale = 0.0000
|
|
thisSwitchCam.nodes[12].bCamEaseForceLinear = FALSE
|
|
thisSwitchCam.nodes[12].bCamEaseForceLevel = FALSE
|
|
thisSwitchCam.nodes[12].fTimeScale = 1.0000
|
|
thisSwitchCam.nodes[12].iTimeScaleEaseType = 0
|
|
thisSwitchCam.nodes[12].fTimeScaleEaseScaler = 0.0000
|
|
thisSwitchCam.nodes[12].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[12].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
|
|
thisSwitchCam.nodes[12].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[12].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[12].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[12].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[12].iHoldDuration = 0
|
|
thisSwitchCam.nodes[12].fFlashNodePhaseOffset = 0.0000
|
|
thisSwitchCam.nodes[12].bIsLowDetailNode = FALSE
|
|
thisSwitchCam.nodes[12].bUseCustomDOF = FALSE
|
|
thisSwitchCam.nodes[12].NodeDOF_Info.fDOF_NearDOF = 0.0000
|
|
thisSwitchCam.nodes[12].NodeDOF_Info.fDOF_FarDOF = 0.0000
|
|
thisSwitchCam.nodes[12].NodeDOF_Info.fDOF_EffectStrength = 0.0000
|
|
|
|
|
|
|
|
thisSwitchCam.iNumNodes = 13
|
|
thisSwitchCam.iCamSwitchFocusNode = 3
|
|
thisSwitchCam.bSplineNoSmoothing = TRUE
|
|
thisSwitchCam.bAddGameplayCamAsLastNode = FALSE
|
|
thisSwitchCam.iGameplayNodeBlendDuration = 0
|
|
|
|
|
|
//--- End of Cam Data ---
|
|
|
|
thisSwitchCam.strOutputStructName = "thisSwitchCam"
|
|
thisSwitchCam.strOutputFileName = "CameraInfo_finaleHeist2A_MichaelToFranklin.txt"
|
|
thisSwitchCam.strXMLFileName = "CameraInfo_finaleHeist2A_MichaelToFranklin.xml"
|
|
|
|
thisSwitchCam.bInitialized = TRUE
|
|
ENDIF
|
|
|
|
thisSwitchCam.piPeds[0] = pi1
|
|
thisSwitchCam.piPeds[1] = pi2
|
|
|
|
ENDPROC
|
|
|
|
PROC REQUEST_CUSTOM_SWITCH_ASSETS()
|
|
|
|
REQUEST_ANIM_DICT(strAnimsTrafficSwitch)
|
|
REQUEST_ANIM_DICT(strAnimsCamShake)
|
|
REQUEST_SCRIPT_AUDIO_BANK(strAudioBankBigScoreLaptop)
|
|
|
|
//PREFETCH_SRL(strSRLName)
|
|
ENDPROC
|
|
|
|
FUNC BOOL HAVE_CUSTOM_SWITCH_ASSETS_LOADED()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT HAS_ANIM_DICT_LOADED(strAnimsTrafficSwitch)
|
|
PRINTLN("Waiting on traffic switch anims")
|
|
ENDIF
|
|
IF NOT HAS_ANIM_DICT_LOADED(strAnimsCamShake)
|
|
PRINTLN("Waiting on cam shake anims")
|
|
ENDIF
|
|
|
|
IF NOT IS_SRL_LOADED()
|
|
PRINTLN("Waiting on SRL")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
IF REQUEST_SCRIPT_AUDIO_BANK(strAudioBankBigScoreLaptop)
|
|
AND HAS_ANIM_DICT_LOADED(strAnimsTrafficSwitch)
|
|
AND HAS_ANIM_DICT_LOADED(strAnimsCamShake)
|
|
//AND IS_SRL_LOADED()
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC VECTOR CONVERT_ROTATION_TO_DIRECTION_VECTOR(VECTOR vRot)
|
|
RETURN <<-SIN(vRot.z) * COS(vRot.x), COS(vRot.z) * COS(vRot.x), SIN(vRot.x)>>
|
|
ENDFUNC
|
|
|
|
FUNC BOOL HANDLE_SWITCH_CAM(SWITCH_CAM_STRUCT &thisSwitchCam)
|
|
|
|
INT i = 0
|
|
INT iCurrentNode
|
|
FLOAT fCamPhase
|
|
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
SWITCH eSwitchCamState
|
|
|
|
CASE SWITCH_CAM_IDLE
|
|
//CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE")
|
|
BREAK
|
|
|
|
CASE SWITCH_CAM_START_SPLINE1
|
|
START_SYNC_SCENE()
|
|
|
|
DESTROY_ALL_CAMS()
|
|
|
|
SETUP_SPLINE_CAM_NODE_ARRAY(thisSwitchCam, PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
CREATE_SPLINE_CAM(thisSwitchCam)
|
|
|
|
SET_CAM_ACTIVE(thisSwitchCam.ciSpline, TRUE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
SET_VEHICLE_POPULATION_BUDGET(0)
|
|
SET_PED_POPULATION_BUDGET(0)
|
|
|
|
CLEAR_AREA_OF_PEDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), 300.0)
|
|
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 300.0, TRUE)
|
|
|
|
SET_GAME_PAUSES_FOR_STREAMING(FALSE)
|
|
//SET_RENDER_HD_ONLY(TRUE)
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", TRUE)
|
|
|
|
SET_TIME_SCALE(1.0)
|
|
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, PLAYER_PED_ID(), "MICHAEL")
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, NULL, "FRANKLIN")
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, pedLester, "LESTER")
|
|
//PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SWITCH", "FH3A_SWITCH_1", CONV_PRIORITY_MEDIUM)
|
|
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), "FH3A_JAAA", "MICHAEL", SPEECH_PARAMS_FORCE_FRONTEND)
|
|
//PLAY_AMBIENT_SPEECH_FROM_POSITION("FH3A_JAAA", "MICHAEL", GET_ENTITY_COORDS(PLAYER_PED_ID()), SPEECH_PARAMS_FORCE_FRONTEND)
|
|
|
|
bHasTextLabelTriggered[FH3A_SWITCH_PRELOAD] = FALSE //Force a second preload of the switch convo in case it cancelled.
|
|
|
|
//SET_SRL_READAHEAD_TIMES(5, 5, 5, 5)
|
|
//BEGIN_SRL()
|
|
|
|
fSRLTime = -(GET_FRAME_TIME())
|
|
|
|
bSyncSceneUnpaused = FALSE
|
|
bFranklinDialogue1Started = FALSE
|
|
bSwitchedToFranklin = FALSE
|
|
bPlayedMichaelSwitchFX = FALSE
|
|
bPlayedFranklinSwitchFX = FALSE
|
|
bRenderingHDOnly = TRUE
|
|
bWooshStarted = FALSE
|
|
bWooshStopped = FALSE
|
|
|
|
eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1
|
|
FALLTHRU
|
|
|
|
CASE SWITCH_CAM_PLAYING_SPLINE1
|
|
//CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE1")
|
|
|
|
OVERRIDE_LODSCALE_THIS_FRAME(1.0)
|
|
|
|
fSRLTime += GET_FRAME_TIME()
|
|
IF fSRLTime < 0.0
|
|
fSRLTime = 0.0
|
|
ENDIF
|
|
//SET_SRL_TIME(fSRLTime)
|
|
|
|
IF NOT bHasTextLabelTriggered[FH3A_SWITCH_1]
|
|
IF IS_AMBIENT_SPEECH_PLAYING(PLAYER_PED_ID())
|
|
IF IS_SUBTITLE_PREFERENCE_SWITCHED_ON()
|
|
PRINT_NOW("FH3A_SWITCH_1", 3500, 0) //The ambient line won't have subtitles so print it directly.
|
|
ENDIF
|
|
|
|
bHasTextLabelTriggered[FH3A_SWITCH_1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Preload the second half of the conversation while the ambient line is playing.
|
|
IF NOT bHasTextLabelTriggered[FH3A_SWITCH_PRELOAD]
|
|
IF PRELOAD_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SWITCH", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_SWITCH_PRELOAD] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_CAM_ACTIVE(thisSwitchCam.ciSpline)
|
|
|
|
iCurrentNode = UPDATE_SPLINE_CAM(thisSwitchCam)
|
|
fCamPhase = GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] HANDLE_SWITCH_CAM: fCamPhase = ", fCamPhase, " iCurrentNode = ", iCurrentNode, "TIMERB = ", TIMERB())
|
|
#ENDIF
|
|
|
|
IF NOT bPlayedMichaelSwitchFX
|
|
IF fCamPhase > 0.21
|
|
ANIMPOSTFX_PLAY("SwitchShortMichaelIn", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
bPlayedMichaelSwitchFX = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bPlayedFranklinSwitchFX
|
|
IF fCamPhase > 0.238
|
|
ANIMPOSTFX_PLAY("SwitchShortFranklinMid", 0, FALSE)
|
|
//PLAY_SOUND_FRONTEND(-1, "Hit_1", "LONG_PLAYER_SWITCH_SOUNDS")
|
|
bPlayedFranklinSwitchFX = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bRenderingHDOnly
|
|
IF fCamPhase > 0.247
|
|
SET_RENDER_HD_ONLY(TRUE)
|
|
bRenderingHDOnly = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bWooshStarted
|
|
IF fCamPhase > 0.221
|
|
PLAY_SOUND_FRONTEND(-1, "Short_Transition_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
bWooshStarted = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Old version, remove once changes verified.
|
|
IF NOT bWooshStarted
|
|
IF fCamPhase > fWooshStartPhase
|
|
//PLAY_SOUND_FRONTEND(iWooshSoundID, "In", "SHORT_PLAYER_SWITCH_SOUND_SET")
|
|
//bWooshStarted = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bWooshStopped
|
|
IF fCamPhase > fWooshStopPhase
|
|
//STOP_SOUND(iWooshSoundID)
|
|
bWooshStopped = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bSwitchedToFranklin
|
|
IF iCurrentNode >= thisSwitchCam.iCamSwitchFocusNode
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
|
|
CDEBUG3LN(DEBUG_MISSION, "Switching to Franklin...")
|
|
|
|
CLEAR_FOCUS()
|
|
CLEAR_PRINTS()
|
|
|
|
sSelectorPeds.pedID[SELECTOR_PED_MICHAEL] = PLAYER_PED_ID()
|
|
SET_SELECTOR_PED_FAKE_STATE(sSelectorPeds, SELECTOR_PED_FRANKLIN, SELECTOR_STATE_AVAILABLE)
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
|
|
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), FALSE)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iTrafficSyncedScene, strAnimsTrafficSwitch, "switch_mic_car_fra_laptop_fra", INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_BLOCK_MOVER_UPDATE)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(sGoldCars) i
|
|
IF i != PLAYERS_GOLD_CAR
|
|
IF NOT IS_ENTITY_DEAD(sGoldCars[i].veh)
|
|
SET_VEHICLE_DOOR_SHUT(sGoldCars[i].veh, SC_DOOR_BOOT, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
bSwitchedToFranklin = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_NEW_LOAD_SCENE_ACTIVE()
|
|
IF fCamPhase > 0.65
|
|
NEW_LOAD_SCENE_STOP()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bSyncSceneUnpaused
|
|
IF iCurrentNode >= thisSwitchCam.iCamSwitchFocusNode
|
|
CDEBUG3LN(DEBUG_MISSION, "Unpausing Sync Scene...")
|
|
SET_SYNCHRONIZED_SCENE_RATE(iTrafficSyncedScene, 1.0)
|
|
bSyncSceneUnpaused = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play Franklin's conversation with Lester: Cancel preloaded conversation, update speakers so the facial works, then start the conversation from the second line.
|
|
IF NOT bFranklinDialogue1Started
|
|
AND bSwitchedToFranklin
|
|
IF fCamPhase >= fFranklinDialogue1Phase
|
|
//AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, NULL, "MICHAEL")
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, PLAYER_PED_ID(), "FRANKLIN")
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, pedLester, "LESTER")
|
|
|
|
//NOTE: we can't begin the preloaded conversation as we're starting from the second line, in this case kill the preload and start the conversation
|
|
//(this should still load the conversation).
|
|
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(sConversationPeds, "FH3AAUD", "FH3A_SWITCH", "FH3A_SWITCH_2", CONV_PRIORITY_HIGH)
|
|
bFranklinDialogue1Started = TRUE
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fCamPhase >= 1.0
|
|
|
|
SET_TIME_SCALE(1.0)
|
|
IF DOES_CAM_EXIST(thisSwitchCam.ciSpline)
|
|
DESTROY_CAM(thisSwitchCam.ciSpline)
|
|
DESTROY_ALL_CAMS()
|
|
ENDIF
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
|
|
SET_RENDER_HD_ONLY(FALSE)
|
|
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
|
|
STOP_SOUND(iWooshSoundID)
|
|
|
|
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", FALSE)
|
|
|
|
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
|
|
|
|
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
|
|
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
|
|
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//END_SRL()
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
//- END OF TRAFFIC CONTROL SWITCH
|
|
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
WIDGET_GROUP_ID widgetDebug
|
|
|
|
CONST_INT MAX_SKIP_MENU_LENGTH 28
|
|
INT iDebugJumpStage = 0
|
|
INT iDebugTrafficLightColour = 0
|
|
INT iDebugForceComponent = 0
|
|
INT iDebugForceType = 0
|
|
INT iDebugCurrentCam = 0
|
|
INT iDebugTrevorShootoutState = 0
|
|
INT iDebugMichaelShootoutState = 0
|
|
INT iDebugFranklinShootoutState = 0
|
|
INT iDebugRGB[3]
|
|
MissionStageMenuTextStruct sSkipMenu[MAX_SKIP_MENU_LENGTH]
|
|
|
|
BOOL bDebugRecordTraffic
|
|
BOOL bDebugRecordSetpieces
|
|
BOOL bDebugShowChaseStats
|
|
BOOL bDebugRecordVanCrash
|
|
BOOL bDebugPlaceholderMode = FALSE
|
|
BOOl bDebugAutoPlayTriggerCar = FALSE
|
|
BOOL bDebugRecordRampDrive = FALSE
|
|
BOOL bDebugPlayRampDrive = FALSE
|
|
BOOL bDebugRecordTruckTrailer = FALSE
|
|
BOOL bDebugShowDebug = FALSE
|
|
BOOL bDebugTrafficLightTest = FALSE
|
|
BOOL bDebugDrawGateCollision = FALSE
|
|
BOOL bDebugForceActivate = FALSE
|
|
BOOL bDebugForceLocalForce = FALSE
|
|
BOOL bDebugForceLocalOffset = FALSE
|
|
BOOL bDebugForceScaleByMass = FALSE
|
|
BOOL bDebugDrawTrafficCars = FALSE
|
|
BOOL bDebugRecordChaseCamera = FALSE
|
|
BOOL bDebugPlayChaseCamera = FALSE
|
|
BOOL bDebugPlayFinalEdit = FALSE
|
|
BOOl bDebugReattachTrolleys = FALSE
|
|
|
|
VECTOR vDebugMousePos = <<0.0, 0.0, 0.0>>
|
|
VECTOR vDebugForceDir = <<0.0, 0.0, 0.0>>
|
|
VECTOR vDebugForceOffset = <<0.0, 0.0, 0.0>>
|
|
|
|
BOOL bDebugStartJunctionPlacement = FALSE
|
|
BOOL bDebugOutputData = FALSE
|
|
FLOAT fDebugTcCrossingHeading[4]
|
|
FLOAT fDebugTcCrossingWidth[4]
|
|
FLOAT fDebugCamFirstPersonHeading = 90.0
|
|
VECTOR vDebugTcCrossingPos[4]
|
|
VECTOR vDebugTcJunctionPos
|
|
|
|
VEHICLE_INDEX vehDebug
|
|
VEHICLE_INDEX vehDebugCamCar
|
|
|
|
CAM_RECORDING_DATA sCamData
|
|
|
|
PROC CREATE_WIDGETS()
|
|
INT i = 0
|
|
TEXT_LABEL str
|
|
|
|
widgetDebug = START_WIDGET_GROUP("Finale Heist A")
|
|
ADD_WIDGET_INT_READ_ONLY("Truck pass timer", iChaseEndTimer)
|
|
ADD_WIDGET_FLOAT_SLIDER("Cam first-person heading", fDebugCamFirstPersonHeading, 0.0, 360.0, 1.0)
|
|
|
|
ADD_WIDGET_BOOL("Show debug", bDebugShowDebug)
|
|
ADD_WIDGET_BOOL("Do new version of shootout", bDoNewVersionOfShootout)
|
|
ADD_WIDGET_BOOL("Record trigger and traffic", bDebugRecordTraffic)
|
|
ADD_WIDGET_BOOL("Just record traffic", bDebugAutoPlayTriggerCar)
|
|
ADD_WIDGET_BOOL("Record set-pieces", bDebugRecordSetpieces)
|
|
ADD_WIDGET_BOOL("Show chase stats", bDebugShowChaseStats)
|
|
ADD_WIDGET_BOOL("Record van crash", bDebugRecordVanCrash)
|
|
ADD_WIDGET_BOOL("Placeholder mode", bDebugPlaceholderMode)
|
|
ADD_WIDGET_BOOL("Record ramp drive", bDebugRecordRampDrive)
|
|
ADD_WIDGET_BOOL("Test playback ramp drive", bDebugPlayRampDrive)
|
|
ADD_WIDGET_BOOL("Record truck and trailer", bDebugRecordTruckTrailer)
|
|
|
|
ADD_WIDGET_BOOL("Draw gate collision", bDebugDrawGateCollision)
|
|
ADD_WIDGET_BOOL("Draw traffic cars", bDebugDrawTrafficCars)
|
|
ADD_WIDGET_BOOL("Picked good chase driver", bPickedGoodCarDriver)
|
|
ADD_WIDGET_BOOL("Picked good truck driver", bPickedGoodTruckDriver)
|
|
ADD_WIDGET_BOOL("Picked good main gunman", bPickedGoodGunman)
|
|
ADD_WIDGET_BOOL("Picked good secondary gunman", bPickedGoodSecondGunman)
|
|
|
|
START_WIDGET_GROUP("Mission variables")
|
|
ADD_WIDGET_INT_READ_ONLY("iDebugTrevorShootoutState", iDebugTrevorShootoutState)
|
|
ADD_WIDGET_INT_READ_ONLY("iDebugFranklinShootoutState", iDebugFranklinShootoutState)
|
|
ADD_WIDGET_INT_READ_ONLY("iDebugMichaelShootoutState", iDebugMichaelShootoutState)
|
|
ADD_WIDGET_INT_READ_ONLY("iTimeLastFrontEnemyDamaged", iTimeLastFrontEnemyDamaged)
|
|
ADD_WIDGET_INT_READ_ONLY("iTimeLastFlankingEnemyDamaged", iTimeLastFlankingEnemyDamaged)
|
|
ADD_WIDGET_BOOL("bPlayerIsDrivingUpRamp", bPlayerIsDrivingUpRamp)
|
|
|
|
ADD_WIDGET_VECTOR_SLIDER("sMichael.vDest", sMichael.vDest, -10000.0, 10000.0, 0.01)
|
|
ADD_WIDGET_VECTOR_SLIDER("sTrevor.vDest", sTrevor.vDest, -10000.0, 10000.0, 0.01)
|
|
ADD_WIDGET_VECTOR_SLIDER("sFranklin.vDest", sFranklin.vDest, -10000.0, 10000.0, 0.01)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Take variables")
|
|
ADD_WIDGET_INT_READ_ONLY("iMaxTakeConsideringCrew", iMaxTakeConsideringCrew)
|
|
ADD_WIDGET_INT_READ_ONLY("iCurrentTake", iCurrentTake)
|
|
ADD_WIDGET_INT_READ_ONLY("iDisplayedTake", iDisplayedTake)
|
|
ADD_WIDGET_INT_READ_ONLY("iTakePenaltyCaseysCut", iTakePenaltyCaseysCut)
|
|
ADD_WIDGET_INT_READ_ONLY("iTakePenaltyCrewDies", iTakePenaltyCrewDies)
|
|
ADD_WIDGET_INT_READ_ONLY("iTakePenaltyDropGold", iTakePenaltyDropGold)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Traffic Control Debug")
|
|
ADD_WIDGET_INT_SLIDER("Hacker level", iHackerLevel, 0, 2, 1)
|
|
|
|
REPEAT COUNT_OF(sTrafficJunction) i
|
|
str = "frozen["
|
|
str += i
|
|
str += "]"
|
|
ADD_WIDGET_BOOL(str, sTrafficJunction[i].bLightsFrozen)
|
|
|
|
str = "timer["
|
|
str += i
|
|
str += "]"
|
|
ADD_WIDGET_INT_READ_ONLY(str, sTrafficJunction[i].iChangeTimer)
|
|
ENDREPEAT
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Chase variable debug")
|
|
ADD_WIDGET_BOOL("TrailerFrozen[0]", bChaseTrailerFrozen[0])
|
|
ADD_WIDGET_BOOL("TrailerFrozen[1]", bChaseTrailerFrozen[1])
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Camera recording")
|
|
ADD_WIDGET_BOOL("Record chase camera", bDebugRecordChaseCamera)
|
|
ADD_WIDGET_BOOL("Playback chase cameras", bDebugPlayChaseCamera)
|
|
ADD_WIDGET_BOOL("Use final edit for playback", bDebugPlayFinalEdit)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Trolley IK")
|
|
ADD_WIDGET_VECTOR_SLIDER("Left hand offset", vTrolleyLeftHandAttach, -3.0, 3.0, 0.01)
|
|
ADD_WIDGET_VECTOR_SLIDER("Right hand offset", vTrolleyRightHandAttach, -3.0, 3.0, 0.01)
|
|
ADD_WIDGET_VECTOR_SLIDER("Trolley offset", vTrolleyAttach, -3.0, 3.0, 0.01)
|
|
ADD_WIDGET_BOOL("Reattach trolleys", bDebugReattachTrolleys)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Traffic Junction Placement")
|
|
ADD_WIDGET_BOOL("Activate widget", bDebugStartJunctionPlacement)
|
|
ADD_WIDGET_BOOL("Output data", bDebugOutputData)
|
|
ADD_WIDGET_VECTOR_SLIDER("Junction centre", vDebugTcJunctionPos, -5000.0, 5000.0, 0.1)
|
|
|
|
START_WIDGET_GROUP("North crossing")
|
|
ADD_WIDGET_VECTOR_SLIDER("Centre pos", vDebugTcCrossingPos[TC_NORTH_JUNCTION], -5000.0, 5000.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Heading", fDebugTcCrossingHeading[TC_NORTH_JUNCTION], -180.0, 180.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Width", fDebugTcCrossingWidth[TC_NORTH_JUNCTION], 0.0, 50.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("East crossing")
|
|
ADD_WIDGET_VECTOR_SLIDER("Centre pos", vDebugTcCrossingPos[TC_EAST_JUNCTION], -5000.0, 5000.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Heading", fDebugTcCrossingHeading[TC_EAST_JUNCTION], -180.0, 180.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Width", fDebugTcCrossingWidth[TC_EAST_JUNCTION], 0.0, 50.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("South crossing")
|
|
ADD_WIDGET_VECTOR_SLIDER("Centre pos", vDebugTcCrossingPos[TC_SOUTH_JUNCTION], -5000.0, 5000.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Heading", fDebugTcCrossingHeading[TC_SOUTH_JUNCTION], -180.0, 180.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Width", fDebugTcCrossingWidth[TC_SOUTH_JUNCTION], 0.0, 50.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("West crossing")
|
|
ADD_WIDGET_VECTOR_SLIDER("Centre pos", vDebugTcCrossingPos[TC_WEST_JUNCTION], -5000.0, 5000.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Heading", fDebugTcCrossingHeading[TC_WEST_JUNCTION], -180.0, 180.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Width", fDebugTcCrossingWidth[TC_WEST_JUNCTION], 0.0, 50.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Traffic Light Control")
|
|
ADD_WIDGET_BOOL("Activate widget", bDebugTrafficLightTest)
|
|
ADD_WIDGET_STRING("Click on the map to control the nearest traffic light.")
|
|
ADD_WIDGET_INT_SLIDER("Traffic light colour", iDebugTrafficLightColour, 0, 2, 1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Vehicle forces")
|
|
ADD_WIDGET_BOOL("Activate", bDebugForceActivate)
|
|
ADD_WIDGET_INT_SLIDER("Force type", iDebugForceType, 0, 5, 1)
|
|
ADD_WIDGET_VECTOR_SLIDER("Force direction", vDebugForceDir, -20.0, 20.0, 0.01)
|
|
ADD_WIDGET_VECTOR_SLIDER("Force offset", vDebugForceOffset, -20.0, 20.0, 0.01)
|
|
ADD_WIDGET_INT_SLIDER("Component", iDebugForceComponent, 0, 50, 1)
|
|
ADD_WIDGET_BOOL("Local force", bDebugForceLocalForce)
|
|
ADD_WIDGET_BOOL("Local offset", bDebugForceLocalOffset)
|
|
ADD_WIDGET_BOOL("Scale by mass", bDebugForceScaleByMass)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Traffic control colours")
|
|
ADD_WIDGET_INT_SLIDER("R", iDebugRGB[0], 0, 255, 1)
|
|
ADD_WIDGET_INT_SLIDER("G", iDebugRGB[1], 0, 255, 1)
|
|
ADD_WIDGET_INT_SLIDER("B", iDebugRGB[2], 0, 255, 1)
|
|
STOP_WIDGET_GROUP()
|
|
STOP_WIDGET_GROUP()
|
|
|
|
SET_LOCATES_HEADER_WIDGET_GROUP(widgetDebug)
|
|
SET_UBER_PARENT_WIDGET_GROUP(widgetDebug)
|
|
SET_CAM_RECORDING_WIDGET_GROUP(sCamData, widgetDebug)
|
|
ENDPROC
|
|
|
|
PROC DESTROY_WIDGETS()
|
|
IF DOES_WIDGET_GROUP_EXIST(widgetDebug)
|
|
DELETE_WIDGET_GROUP(widgetDebug)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DRAW_INT_ABOVE_PED(PED_INDEX ped, INT i)
|
|
IF bDebugShowDebug
|
|
IF NOT IS_PED_INJURED(ped)
|
|
TEXT_LABEL str = ""
|
|
str += i
|
|
|
|
DRAW_DEBUG_TEXT(str, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(ped, <<0.0, 0.0, 1.0>>))
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
PROC LOAD_CHASE_UBER_DATA()
|
|
TrafficCarPos[0] = <<126.1199, -1378.6299, 29.0093>>
|
|
TrafficCarQuatX[0] = 0.0001
|
|
TrafficCarQuatY[0] = -0.0002
|
|
TrafficCarQuatZ[0] = 0.8791
|
|
TrafficCarQuatW[0] = -0.4766
|
|
TrafficCarRecording[0] = 151
|
|
TrafficCarStartime[0] = 6732.0000
|
|
TrafficCarModel[0] = habanero
|
|
|
|
TrafficCarPos[1] = <<204.7956, -1308.8750, 29.0337>>
|
|
TrafficCarQuatX[1] = -0.0005
|
|
TrafficCarQuatY[1] = -0.0019
|
|
TrafficCarQuatZ[1] = 0.9753
|
|
TrafficCarQuatW[1] = 0.2207
|
|
TrafficCarRecording[1] = 257
|
|
TrafficCarStartime[1] = 7000.0000
|
|
TrafficCarModel[1] = habanero
|
|
|
|
TrafficCarPos[2] = <<200.2874, -1343.9808, 28.7914>>
|
|
TrafficCarQuatX[2] = 0.0002
|
|
TrafficCarQuatY[2] = 0.0003
|
|
TrafficCarQuatZ[2] = -0.2659
|
|
TrafficCarQuatW[2] = 0.9640
|
|
TrafficCarRecording[2] = 258
|
|
TrafficCarStartime[2] = 7100.0000
|
|
TrafficCarModel[2] = emperor
|
|
|
|
TrafficCarPos[3] = <<170.4004, -1384.7385, 28.8709>>
|
|
TrafficCarQuatX[3] = 0.0054
|
|
TrafficCarQuatY[3] = 0.0069
|
|
TrafficCarQuatZ[3] = -0.3416
|
|
TrafficCarQuatW[3] = 0.9398
|
|
TrafficCarRecording[3] = 153
|
|
TrafficCarStartime[3] = 7162.0000
|
|
TrafficCarModel[3] = emperor
|
|
|
|
TrafficCarPos[4] = <<206.7476, -1152.2988, 28.8386>>
|
|
TrafficCarQuatX[4] = -0.0084
|
|
TrafficCarQuatY[4] = -0.0046
|
|
TrafficCarQuatZ[4] = 0.9999
|
|
TrafficCarQuatW[4] = -0.0139
|
|
TrafficCarRecording[4] = 260
|
|
TrafficCarStartime[4] = 9000.0000
|
|
TrafficCarModel[4] = emperor
|
|
|
|
TrafficCarPos[5] = <<269.9556, -1293.9294, 28.9782>>
|
|
TrafficCarQuatX[5] = -0.0135
|
|
TrafficCarQuatY[5] = 0.0000
|
|
TrafficCarQuatZ[5] = 0.7132
|
|
TrafficCarQuatW[5] = 0.7008
|
|
TrafficCarRecording[5] = 275
|
|
TrafficCarStartime[5] = 9100.0000
|
|
TrafficCarModel[5] = habanero
|
|
|
|
TrafficCarPos[6] = <<312.6693, -1303.3511, 31.1403>>
|
|
TrafficCarQuatX[6] = -0.0251
|
|
TrafficCarQuatY[6] = 0.0041
|
|
TrafficCarQuatZ[6] = 0.5936
|
|
TrafficCarQuatW[6] = 0.8043
|
|
TrafficCarRecording[6] = 276
|
|
TrafficCarStartime[6] = 9200.0000
|
|
TrafficCarModel[6] = habanero
|
|
|
|
TrafficCarPos[7] = <<224.6259, -1325.1558, 28.8638>>
|
|
TrafficCarQuatX[7] = 0.0076
|
|
TrafficCarQuatY[7] = -0.0116
|
|
TrafficCarQuatZ[7] = -0.4922
|
|
TrafficCarQuatW[7] = 0.8704
|
|
TrafficCarRecording[7] = 155
|
|
TrafficCarStartime[7] = 9242.0000
|
|
TrafficCarModel[7] = emperor
|
|
|
|
TrafficCarPos[8] = <<245.5630, -1294.8407, 28.9200>>
|
|
TrafficCarQuatX[8] = -0.0156
|
|
TrafficCarQuatY[8] = 0.0159
|
|
TrafficCarQuatZ[8] = 0.6623
|
|
TrafficCarQuatW[8] = 0.7489
|
|
TrafficCarRecording[8] = 277
|
|
TrafficCarStartime[8] = 9500.0000
|
|
TrafficCarModel[8] = habanero
|
|
|
|
TrafficCarPos[9] = <<210.7034, -1238.6334, 29.0745>>
|
|
TrafficCarQuatX[9] = -0.0262
|
|
TrafficCarQuatY[9] = 0.0018
|
|
TrafficCarQuatZ[9] = 0.9987
|
|
TrafficCarQuatW[9] = -0.0429
|
|
TrafficCarRecording[9] = 274
|
|
TrafficCarStartime[9] = 10000.0000
|
|
TrafficCarModel[9] = burrito3
|
|
|
|
TrafficCarPos[10] = <<216.0489, -1108.3988, 28.8714>>
|
|
TrafficCarQuatX[10] = -0.0007
|
|
TrafficCarQuatY[10] = -0.1208
|
|
TrafficCarQuatZ[10] = -0.0156
|
|
TrafficCarQuatW[10] = 0.9926
|
|
TrafficCarRecording[10] = 261
|
|
TrafficCarStartime[10] = 13000.0000
|
|
TrafficCarModel[10] = Vader
|
|
|
|
TrafficCarPos[11] = <<177.2016, -1035.9320, 28.7794>>
|
|
TrafficCarQuatX[11] = -0.0197
|
|
TrafficCarQuatY[11] = -0.0168
|
|
TrafficCarQuatZ[11] = 0.8222
|
|
TrafficCarQuatW[11] = -0.5686
|
|
TrafficCarRecording[11] = 265
|
|
TrafficCarStartime[11] = 14100.0000
|
|
TrafficCarModel[11] = emperor
|
|
|
|
TrafficCarPos[12] = <<195.4742, -1041.9108, 28.9829>>
|
|
TrafficCarQuatX[12] = -0.0239
|
|
TrafficCarQuatY[12] = -0.0175
|
|
TrafficCarQuatZ[12] = 0.8144
|
|
TrafficCarQuatW[12] = -0.5795
|
|
TrafficCarRecording[12] = 281
|
|
TrafficCarStartime[12] = 14500.0000
|
|
TrafficCarModel[12] = habanero
|
|
|
|
TrafficCarPos[13] = <<284.8204, -1049.3608, 28.7383>>
|
|
TrafficCarQuatX[13] = -0.0003
|
|
TrafficCarQuatY[13] = 0.0001
|
|
TrafficCarQuatZ[13] = 0.7117
|
|
TrafficCarQuatW[13] = 0.7025
|
|
TrafficCarRecording[13] = 283
|
|
TrafficCarStartime[13] = 16500.0000
|
|
TrafficCarModel[13] = emperor
|
|
|
|
TrafficCarPos[14] = <<266.7325, -900.9877, 28.5204>>
|
|
TrafficCarQuatX[14] = 0.0001
|
|
TrafficCarQuatY[14] = 0.0021
|
|
TrafficCarQuatZ[14] = 0.9812
|
|
TrafficCarQuatW[14] = 0.1929
|
|
TrafficCarRecording[14] = 284
|
|
TrafficCarStartime[14] = 17500.0000
|
|
TrafficCarModel[14] = emperor
|
|
|
|
TrafficCarPos[15] = <<253.6513, -921.3041, 28.7015>>
|
|
TrafficCarQuatX[15] = -0.0183
|
|
TrafficCarQuatY[15] = 0.0083
|
|
TrafficCarQuatZ[15] = 0.9795
|
|
TrafficCarQuatW[15] = 0.2002
|
|
TrafficCarRecording[15] = 285
|
|
TrafficCarStartime[15] = 17600.0000
|
|
TrafficCarModel[15] = emperor
|
|
|
|
TrafficCarPos[16] = <<233.5967, -1019.6245, 28.9231>>
|
|
TrafficCarQuatX[16] = 0.0060
|
|
TrafficCarQuatY[16] = -0.0017
|
|
TrafficCarQuatZ[16] = -0.1695
|
|
TrafficCarQuatW[16] = 0.9855
|
|
TrafficCarRecording[16] = 156
|
|
TrafficCarStartime[16] = 17754.0000
|
|
TrafficCarModel[16] = emperor
|
|
|
|
TrafficCarPos[17] = <<306.5299, -805.0709, 29.3483>>
|
|
TrafficCarQuatX[17] = 0.0006
|
|
TrafficCarQuatY[17] = -0.0001
|
|
TrafficCarQuatZ[17] = 0.9854
|
|
TrafficCarQuatW[17] = 0.1702
|
|
TrafficCarRecording[17] = 286
|
|
TrafficCarStartime[17] = 19900.0000
|
|
TrafficCarModel[17] = benson
|
|
|
|
TrafficCarPos[18] = <<285.1549, -895.8602, 28.4742>>
|
|
TrafficCarQuatX[18] = 0.0049
|
|
TrafficCarQuatY[18] = 0.0154
|
|
TrafficCarQuatZ[18] = -0.1881
|
|
TrafficCarQuatW[18] = 0.9820
|
|
TrafficCarRecording[18] = 269
|
|
TrafficCarStartime[18] = 20000.0000
|
|
TrafficCarModel[18] = emperor
|
|
|
|
TrafficCarPos[19] = <<333.1492, -849.5153, 29.0901>>
|
|
TrafficCarQuatX[19] = 0.0003
|
|
TrafficCarQuatY[19] = 0.0000
|
|
TrafficCarQuatZ[19] = 0.7037
|
|
TrafficCarQuatW[19] = 0.7105
|
|
TrafficCarRecording[19] = 270
|
|
TrafficCarStartime[19] = 20100.0000
|
|
TrafficCarModel[19] = habanero
|
|
|
|
TrafficCarPos[20] = <<291.1502, -816.9569, 28.7980>>
|
|
TrafficCarQuatX[20] = -0.0218
|
|
TrafficCarQuatY[20] = 0.0030
|
|
TrafficCarQuatZ[20] = 0.9868
|
|
TrafficCarQuatW[20] = 0.1606
|
|
TrafficCarRecording[20] = 271
|
|
TrafficCarStartime[20] = 20200.0000
|
|
TrafficCarModel[20] = emperor
|
|
|
|
TrafficCarPos[21] = <<196.0913, -832.3592, 30.7138>>
|
|
TrafficCarQuatX[21] = 0.0054
|
|
TrafficCarQuatY[21] = -0.0076
|
|
TrafficCarQuatZ[21] = 0.8238
|
|
TrafficCarQuatW[21] = -0.5669
|
|
TrafficCarRecording[21] = 287
|
|
TrafficCarStartime[21] = 20500.0000
|
|
TrafficCarModel[21] = habanero
|
|
|
|
TrafficCarPos[22] = <<92.8789, -800.8184, 30.9753>>
|
|
TrafficCarQuatX[22] = -0.0163
|
|
TrafficCarQuatY[22] = -0.0168
|
|
TrafficCarQuatZ[22] = 0.8141
|
|
TrafficCarQuatW[22] = -0.5802
|
|
TrafficCarRecording[22] = 290
|
|
TrafficCarStartime[22] = 26000.0000
|
|
TrafficCarModel[22] = emperor
|
|
|
|
TrafficCarPos[23] = <<192.4791, -730.7765, 33.5496>>
|
|
TrafficCarQuatX[23] = -0.0104
|
|
TrafficCarQuatY[23] = -0.0190
|
|
TrafficCarQuatZ[23] = 0.9892
|
|
TrafficCarQuatW[23] = 0.1451
|
|
TrafficCarRecording[23] = 292
|
|
TrafficCarStartime[23] = 26100.0000
|
|
TrafficCarModel[23] = emperor
|
|
|
|
TrafficCarPos[24] = <<221.0276, -652.8216, 38.2833>>
|
|
TrafficCarQuatX[24] = -0.0275
|
|
TrafficCarQuatY[24] = -0.0334
|
|
TrafficCarQuatZ[24] = 0.9870
|
|
TrafficCarQuatW[24] = 0.1551
|
|
TrafficCarRecording[24] = 293
|
|
TrafficCarStartime[24] = 27000.0000
|
|
TrafficCarModel[24] = habanero
|
|
|
|
TrafficCarPos[25] = <<235.0106, -631.0068, 39.9466>>
|
|
TrafficCarQuatX[25] = -0.0052
|
|
TrafficCarQuatY[25] = -0.0368
|
|
TrafficCarQuatZ[25] = 0.9772
|
|
TrafficCarQuatW[25] = 0.2091
|
|
TrafficCarRecording[25] = 294
|
|
TrafficCarStartime[25] = 27100.0000
|
|
TrafficCarModel[25] = emperor
|
|
|
|
TrafficCarPos[26] = <<257.8245, -576.9314, 43.1755>>
|
|
TrafficCarQuatX[26] = 0.0011
|
|
TrafficCarQuatY[26] = 0.0042
|
|
TrafficCarQuatZ[26] = 0.9824
|
|
TrafficCarQuatW[26] = 0.1869
|
|
TrafficCarRecording[26] = 295
|
|
TrafficCarStartime[26] = 31000.0000
|
|
TrafficCarModel[26] = burrito3
|
|
|
|
TrafficCarPos[27] = <<257.4754, -607.5755, 42.3823>>
|
|
TrafficCarQuatX[27] = 0.0241
|
|
TrafficCarQuatY[27] = -0.0046
|
|
TrafficCarQuatZ[27] = -0.1815
|
|
TrafficCarQuatW[27] = 0.9831
|
|
TrafficCarRecording[27] = 296
|
|
TrafficCarStartime[27] = 31100.0000
|
|
TrafficCarModel[27] = habanero
|
|
|
|
TrafficCarPos[28] = <<150.5976, -586.0983, 43.6946>>
|
|
TrafficCarQuatX[28] = 0.0047
|
|
TrafficCarQuatY[28] = 0.0042
|
|
TrafficCarQuatZ[28] = 0.5715
|
|
TrafficCarQuatW[28] = 0.8205
|
|
TrafficCarRecording[28] = 157
|
|
TrafficCarStartime[28] = 35114.0000
|
|
TrafficCarModel[28] = habanero
|
|
|
|
TrafficCarPos[29] = <<103.8211, -593.5438, 43.8325>>
|
|
TrafficCarQuatX[29] = -0.0059
|
|
TrafficCarQuatY[29] = 0.0013
|
|
TrafficCarQuatZ[29] = -0.1642
|
|
TrafficCarQuatW[29] = 0.9864
|
|
TrafficCarRecording[29] = 158
|
|
TrafficCarStartime[29] = 36434.0000
|
|
TrafficCarModel[29] = habanero
|
|
|
|
TrafficCarPos[30] = <<120.9813, -488.4099, 42.5893>>
|
|
TrafficCarQuatX[30] = -0.0213
|
|
TrafficCarQuatY[30] = 0.0040
|
|
TrafficCarQuatZ[30] = 0.9892
|
|
TrafficCarQuatW[30] = 0.1450
|
|
TrafficCarRecording[30] = 297
|
|
TrafficCarStartime[30] = 37500.0000
|
|
TrafficCarModel[30] = emperor
|
|
|
|
TrafficCarPos[31] = <<87.8423, -516.1512, 33.5669>>
|
|
TrafficCarQuatX[31] = -0.0023
|
|
TrafficCarQuatY[31] = 0.0024
|
|
TrafficCarQuatZ[31] = -0.7071
|
|
TrafficCarQuatW[31] = 0.7071
|
|
TrafficCarRecording[31] = 159
|
|
TrafficCarStartime[31] = 38678.0000
|
|
TrafficCarModel[31] = emperor
|
|
|
|
TrafficCarPos[32] = <<11.6671, -355.2730, 41.4288>>
|
|
TrafficCarQuatX[32] = 0.0588
|
|
TrafficCarQuatY[32] = 0.0154
|
|
TrafficCarQuatZ[32] = -0.2108
|
|
TrafficCarQuatW[32] = 0.9756
|
|
TrafficCarRecording[32] = 305
|
|
TrafficCarStartime[32] = 48000.0000
|
|
TrafficCarModel[32] = habanero
|
|
|
|
TrafficCarPos[33] = <<-26.6949, -452.7456, 40.1421>>
|
|
TrafficCarQuatX[33] = -0.0001
|
|
TrafficCarQuatY[33] = 0.0000
|
|
TrafficCarQuatZ[33] = -0.1595
|
|
TrafficCarQuatW[33] = 0.9872
|
|
TrafficCarRecording[33] = 162
|
|
TrafficCarStartime[33] = 49832.0000
|
|
TrafficCarModel[33] = habanero
|
|
|
|
TrafficCarPos[34] = <<-16.8086, -440.1597, 39.8461>>
|
|
TrafficCarQuatX[34] = -0.0192
|
|
TrafficCarQuatY[34] = 0.0029
|
|
TrafficCarQuatZ[34] = -0.1642
|
|
TrafficCarQuatW[34] = 0.9862
|
|
TrafficCarRecording[34] = 163
|
|
TrafficCarStartime[34] = 49832.0000
|
|
TrafficCarModel[34] = emperor
|
|
|
|
TrafficCarPos[35] = <<-17.3110, -335.6307, 42.8243>>
|
|
TrafficCarQuatX[35] = -0.0002
|
|
TrafficCarQuatY[35] = -0.0830
|
|
TrafficCarQuatZ[35] = 0.7806
|
|
TrafficCarQuatW[35] = -0.6195
|
|
TrafficCarRecording[35] = 298
|
|
TrafficCarStartime[35] = 52000.0000
|
|
TrafficCarModel[35] = emperor
|
|
|
|
TrafficCarPos[36] = <<-46.9629, -226.8312, 45.6652>>
|
|
TrafficCarQuatX[36] = -0.0161
|
|
TrafficCarQuatY[36] = 0.0002
|
|
TrafficCarQuatZ[36] = 0.9829
|
|
TrafficCarQuatW[36] = 0.1836
|
|
TrafficCarRecording[36] = 307
|
|
TrafficCarStartime[36] = 56000.0000
|
|
TrafficCarModel[36] = benson
|
|
|
|
TrafficCarPos[37] = <<-98.6689, -267.7760, 43.0703>>
|
|
TrafficCarQuatX[37] = 0.0322
|
|
TrafficCarQuatY[37] = 0.0106
|
|
TrafficCarQuatZ[37] = -0.5247
|
|
TrafficCarQuatW[37] = 0.8506
|
|
TrafficCarRecording[37] = 306
|
|
TrafficCarStartime[37] = 57800.0000
|
|
TrafficCarModel[37] = habanero
|
|
|
|
TrafficCarPos[38] = <<-80.8850, -230.5711, 44.5481>>
|
|
TrafficCarQuatX[38] = -0.0211
|
|
TrafficCarQuatY[38] = -0.0154
|
|
TrafficCarQuatZ[38] = 0.5934
|
|
TrafficCarQuatW[38] = 0.8045
|
|
TrafficCarRecording[38] = 165
|
|
TrafficCarStartime[38] = 57884.0000
|
|
TrafficCarModel[38] = emperor
|
|
|
|
TrafficCarPos[39] = <<-96.7447, -164.7146, 52.2507>>
|
|
TrafficCarQuatX[39] = -0.0158
|
|
TrafficCarQuatY[39] = -0.1056
|
|
TrafficCarQuatZ[39] = 0.9881
|
|
TrafficCarQuatW[39] = 0.1108
|
|
TrafficCarRecording[39] = 308
|
|
TrafficCarStartime[39] = 58000.0000
|
|
TrafficCarModel[39] = habanero
|
|
|
|
TrafficCarPos[40] = <<-101.7929, -232.2783, 44.4927>>
|
|
TrafficCarQuatX[40] = 0.0045
|
|
TrafficCarQuatY[40] = 0.0025
|
|
TrafficCarQuatZ[40] = 0.5293
|
|
TrafficCarQuatW[40] = 0.8484
|
|
TrafficCarRecording[40] = 166
|
|
TrafficCarStartime[40] = 58544.0000
|
|
TrafficCarModel[40] = habanero
|
|
|
|
TrafficCarPos[41] = <<-296.2088, -183.6414, 39.0774>>
|
|
TrafficCarQuatX[41] = -0.0023
|
|
TrafficCarQuatY[41] = -0.0187
|
|
TrafficCarQuatZ[41] = 0.9997
|
|
TrafficCarQuatW[41] = 0.0165
|
|
TrafficCarRecording[41] = 169
|
|
TrafficCarStartime[41] = 65408.0000
|
|
TrafficCarModel[41] = habanero
|
|
|
|
TrafficCarPos[42] = <<-332.6289, -197.7712, 37.8084>>
|
|
TrafficCarQuatX[42] = -0.0195
|
|
TrafficCarQuatY[42] = 0.0036
|
|
TrafficCarQuatZ[42] = 0.7673
|
|
TrafficCarQuatW[42] = -0.6410
|
|
TrafficCarRecording[42] = 171
|
|
TrafficCarStartime[42] = 67454.0000
|
|
TrafficCarModel[42] = emperor
|
|
|
|
TrafficCarPos[43] = <<-349.0214, -199.3470, 37.5625>>
|
|
TrafficCarQuatX[43] = 0.0064
|
|
TrafficCarQuatY[43] = -0.0325
|
|
TrafficCarQuatZ[43] = -0.4826
|
|
TrafficCarQuatW[43] = 0.8752
|
|
TrafficCarRecording[43] = 172
|
|
TrafficCarStartime[43] = 67454.0000
|
|
TrafficCarModel[43] = habanero
|
|
|
|
TrafficCarPos[44] = <<-426.7659, -209.2404, 35.9418>>
|
|
TrafficCarQuatX[44] = 0.0010
|
|
TrafficCarQuatY[44] = -0.0009
|
|
TrafficCarQuatZ[44] = 0.2650
|
|
TrafficCarQuatW[44] = 0.9643
|
|
TrafficCarRecording[44] = 175
|
|
TrafficCarStartime[44] = 70886.0000
|
|
TrafficCarModel[44] = habanero
|
|
|
|
TrafficCarPos[45] = <<-459.9709, -245.2829, 35.5389>>
|
|
TrafficCarQuatX[45] = 0.0166
|
|
TrafficCarQuatY[45] = -0.0054
|
|
TrafficCarQuatZ[45] = 0.9301
|
|
TrafficCarQuatW[45] = 0.3669
|
|
TrafficCarRecording[45] = 176
|
|
TrafficCarStartime[45] = 72404.0000
|
|
TrafficCarModel[45] = emperor
|
|
|
|
TrafficCarPos[46] = <<-487.6095, -275.0030, 35.3290>>
|
|
TrafficCarQuatX[46] = 0.0074
|
|
TrafficCarQuatY[46] = -0.0049
|
|
TrafficCarQuatZ[46] = -0.5561
|
|
TrafficCarQuatW[46] = 0.8311
|
|
TrafficCarRecording[46] = 177
|
|
TrafficCarStartime[46] = 73592.0000
|
|
TrafficCarModel[46] = emperor
|
|
|
|
TrafficCarPos[47] = <<-553.4454, -312.1426, 34.8028>>
|
|
TrafficCarQuatX[47] = 0.0016
|
|
TrafficCarQuatY[47] = -0.0076
|
|
TrafficCarQuatZ[47] = 0.9663
|
|
TrafficCarQuatW[47] = -0.2573
|
|
TrafficCarRecording[47] = 179
|
|
TrafficCarStartime[47] = 75572.0000
|
|
TrafficCarModel[47] = habanero
|
|
|
|
TrafficCarPos[48] = <<-634.9479, -330.0110, 34.2810>>
|
|
TrafficCarQuatX[48] = 0.0143
|
|
TrafficCarQuatY[48] = -0.0355
|
|
TrafficCarQuatZ[48] = 0.4117
|
|
TrafficCarQuatW[48] = 0.9105
|
|
TrafficCarRecording[48] = 180
|
|
TrafficCarStartime[48] = 77486.0000
|
|
TrafficCarModel[48] = emperor
|
|
|
|
TrafficCarPos[49] = <<-663.3157, -369.6766, 34.3548>>
|
|
TrafficCarQuatX[49] = -0.0078
|
|
TrafficCarQuatY[49] = 0.0102
|
|
TrafficCarQuatZ[49] = 0.7912
|
|
TrafficCarQuatW[49] = -0.6115
|
|
TrafficCarRecording[49] = 181
|
|
TrafficCarStartime[49] = 78542.0000
|
|
TrafficCarModel[49] = emperor
|
|
|
|
TrafficCarPos[50] = <<-637.4808, -487.1667, 24.8780>>
|
|
TrafficCarQuatX[50] = -0.0183
|
|
TrafficCarQuatY[50] = 0.0069
|
|
TrafficCarQuatZ[50] = 0.8166
|
|
TrafficCarQuatW[50] = 0.5769
|
|
TrafficCarRecording[50] = 184
|
|
TrafficCarStartime[50] = 81182.0000
|
|
TrafficCarModel[50] = habanero
|
|
|
|
TrafficCarPos[51] = <<-855.8752, -520.4864, 22.5379>>
|
|
TrafficCarQuatX[51] = -0.0003
|
|
TrafficCarQuatY[51] = -0.0380
|
|
TrafficCarQuatZ[51] = 0.7819
|
|
TrafficCarQuatW[51] = 0.6223
|
|
TrafficCarRecording[51] = 250
|
|
TrafficCarStartime[51] = 84000.0000
|
|
TrafficCarModel[51] = habanero
|
|
|
|
TrafficCarPos[52] = <<-779.1765, -497.9582, 24.9619>>
|
|
TrafficCarQuatX[52] = -0.0034
|
|
TrafficCarQuatY[52] = -0.0015
|
|
TrafficCarQuatZ[52] = 0.7341
|
|
TrafficCarQuatW[52] = 0.6790
|
|
TrafficCarRecording[52] = 251
|
|
TrafficCarStartime[52] = 84100.0000
|
|
TrafficCarModel[52] = habanero
|
|
|
|
TrafficCarPos[53] = <<-743.4897, -490.8126, 24.6116>>
|
|
TrafficCarQuatX[53] = -0.0202
|
|
TrafficCarQuatY[53] = 0.0062
|
|
TrafficCarQuatZ[53] = 0.7088
|
|
TrafficCarQuatW[53] = 0.7051
|
|
TrafficCarRecording[53] = 252
|
|
TrafficCarStartime[53] = 84200.0000
|
|
TrafficCarModel[53] = emperor
|
|
|
|
TrafficCarPos[54] = <<-1145.7391, -671.9159, 10.8002>>
|
|
TrafficCarQuatX[54] = 0.0008
|
|
TrafficCarQuatY[54] = -0.0002
|
|
TrafficCarQuatZ[54] = -0.5093
|
|
TrafficCarQuatW[54] = 0.8606
|
|
TrafficCarRecording[54] = 254
|
|
TrafficCarStartime[54] = 92000.0000
|
|
TrafficCarModel[54] = habanero
|
|
|
|
TrafficCarPos[55] = <<-1099.3217, -649.7197, 13.4586>>
|
|
TrafficCarQuatX[55] = 0.0450
|
|
TrafficCarQuatY[55] = -0.0023
|
|
TrafficCarQuatZ[55] = -0.5102
|
|
TrafficCarQuatW[55] = 0.8589
|
|
TrafficCarRecording[55] = 255
|
|
TrafficCarStartime[55] = 92050.0000
|
|
TrafficCarModel[55] = habanero
|
|
|
|
TrafficCarPos[56] = <<-1109.8805, -676.7749, 20.2021>>
|
|
TrafficCarQuatX[56] = -0.0166
|
|
TrafficCarQuatY[56] = -0.0026
|
|
TrafficCarQuatZ[56] = -0.4663
|
|
TrafficCarQuatW[56] = 0.8845
|
|
TrafficCarRecording[56] = 256
|
|
TrafficCarStartime[56] = 92100.0000
|
|
TrafficCarModel[56] = emperor
|
|
|
|
TrafficCarPos[57] = <<-1022.6064, -583.3073, 17.8000>>
|
|
TrafficCarQuatX[57] = 0.0140
|
|
TrafficCarQuatY[57] = -0.0102
|
|
TrafficCarQuatZ[57] = 0.8554
|
|
TrafficCarQuatW[57] = 0.5177
|
|
TrafficCarRecording[57] = 300
|
|
TrafficCarStartime[57] = 92150.0000
|
|
TrafficCarModel[57] = emperor
|
|
|
|
TrafficCarPos[58] = <<-1026.0228, -559.6900, 17.9219>>
|
|
TrafficCarQuatX[58] = -0.0157
|
|
TrafficCarQuatY[58] = 0.0057
|
|
TrafficCarQuatZ[58] = 0.8602
|
|
TrafficCarQuatW[58] = 0.5097
|
|
TrafficCarRecording[58] = 302
|
|
TrafficCarStartime[58] = 92200.0000
|
|
TrafficCarModel[58] = habanero
|
|
|
|
TrafficCarPos[59] = <<-927.6820, -521.0225, 19.0224>>
|
|
TrafficCarQuatX[59] = -0.0199
|
|
TrafficCarQuatY[59] = 0.0055
|
|
TrafficCarQuatZ[59] = 0.8601
|
|
TrafficCarQuatW[59] = 0.5097
|
|
TrafficCarRecording[59] = 186
|
|
TrafficCarStartime[59] = 92336.0000
|
|
TrafficCarModel[59] = emperor
|
|
|
|
TrafficCarPos[60] = <<-1012.2963, -595.6451, 18.0410>>
|
|
TrafficCarQuatX[60] = -0.0052
|
|
TrafficCarQuatY[60] = 0.0012
|
|
TrafficCarQuatZ[60] = -0.5286
|
|
TrafficCarQuatW[60] = 0.8489
|
|
TrafficCarRecording[60] = 190
|
|
TrafficCarStartime[60] = 95306.0000
|
|
TrafficCarModel[60] = habanero
|
|
|
|
TrafficCarPos[61] = <<-1182.6104, -674.0771, 10.7061>>
|
|
TrafficCarQuatX[61] = 0.0164
|
|
TrafficCarQuatY[61] = -0.0065
|
|
TrafficCarQuatZ[61] = 0.8521
|
|
TrafficCarQuatW[61] = 0.5230
|
|
TrafficCarRecording[61] = 303
|
|
TrafficCarStartime[61] = 97000.0000
|
|
TrafficCarModel[61] = habanero
|
|
|
|
TrafficCarPos[62] = <<-1130.8397, -635.9573, 11.9827>>
|
|
TrafficCarQuatX[62] = -0.0154
|
|
TrafficCarQuatY[62] = -0.0265
|
|
TrafficCarQuatZ[62] = 0.8716
|
|
TrafficCarQuatW[62] = 0.4892
|
|
TrafficCarRecording[62] = 191
|
|
TrafficCarStartime[62] = 98012.0000
|
|
TrafficCarModel[62] = emperor
|
|
|
|
TrafficCarPos[63] = <<-1346.7484, -752.6110, 11.1104>>
|
|
TrafficCarQuatX[63] = -0.0018
|
|
TrafficCarQuatY[63] = -0.0021
|
|
TrafficCarQuatZ[63] = -0.6166
|
|
TrafficCarQuatW[63] = 0.7872
|
|
TrafficCarRecording[63] = 193
|
|
TrafficCarStartime[63] = 103094.0000
|
|
TrafficCarModel[63] = BUS
|
|
|
|
TrafficCarPos[64] = <<-1393.6064, -762.5773, 10.5991>>
|
|
TrafficCarQuatX[64] = -0.0031
|
|
TrafficCarQuatY[64] = 0.0048
|
|
TrafficCarQuatZ[64] = -0.6391
|
|
TrafficCarQuatW[64] = 0.7691
|
|
TrafficCarRecording[64] = 194
|
|
TrafficCarStartime[64] = 104018.0000
|
|
TrafficCarModel[64] = emperor
|
|
|
|
TrafficCarPos[65] = <<-1489.5645, -772.1517, 10.6688>>
|
|
TrafficCarQuatX[65] = -0.0018
|
|
TrafficCarQuatY[65] = 0.0052
|
|
TrafficCarQuatZ[65] = -0.6960
|
|
TrafficCarQuatW[65] = 0.7180
|
|
TrafficCarRecording[65] = 196
|
|
TrafficCarStartime[65] = 105998.0000
|
|
TrafficCarModel[65] = emperor
|
|
|
|
TrafficCarPos[66] = <<-1745.0309, -639.5851, 9.8203>>
|
|
TrafficCarQuatX[66] = 0.0059
|
|
TrafficCarQuatY[66] = 0.0037
|
|
TrafficCarQuatZ[66] = 0.4360
|
|
TrafficCarQuatW[66] = 0.8999
|
|
TrafficCarRecording[66] = 201
|
|
TrafficCarStartime[66] = 111740.0000
|
|
TrafficCarModel[66] = emperor
|
|
|
|
TrafficCarPos[67] = <<-1851.9233, -553.9167, 11.0878>>
|
|
TrafficCarQuatX[67] = -0.0018
|
|
TrafficCarQuatY[67] = -0.0048
|
|
TrafficCarQuatZ[67] = 0.4298
|
|
TrafficCarQuatW[67] = 0.9029
|
|
TrafficCarRecording[67] = 203
|
|
TrafficCarStartime[67] = 114578.0000
|
|
TrafficCarModel[67] = emperor
|
|
|
|
TrafficCarPos[68] = <<-1878.9818, -557.9254, 11.3563>>
|
|
TrafficCarQuatX[68] = 0.0006
|
|
TrafficCarQuatY[68] = -0.0012
|
|
TrafficCarQuatZ[68] = 0.8999
|
|
TrafficCarQuatW[68] = -0.4362
|
|
TrafficCarRecording[68] = 204
|
|
TrafficCarStartime[68] = 114974.0000
|
|
TrafficCarModel[68] = habanero
|
|
|
|
TrafficCarPos[69] = <<-1899.4320, -514.9224, 11.2890>>
|
|
TrafficCarQuatX[69] = -0.0047
|
|
TrafficCarQuatY[69] = -0.0027
|
|
TrafficCarQuatZ[69] = 0.4238
|
|
TrafficCarQuatW[69] = 0.9058
|
|
TrafficCarRecording[69] = 205
|
|
TrafficCarStartime[69] = 115832.0000
|
|
TrafficCarModel[69] = emperor
|
|
|
|
TrafficCarPos[70] = <<-1915.1440, -508.8627, 11.3121>>
|
|
TrafficCarQuatX[70] = -0.0050
|
|
TrafficCarQuatY[70] = -0.0019
|
|
TrafficCarQuatZ[70] = 0.4256
|
|
TrafficCarQuatW[70] = 0.9049
|
|
TrafficCarRecording[70] = 206
|
|
TrafficCarStartime[70] = 116162.0000
|
|
TrafficCarModel[70] = emperor
|
|
|
|
TrafficCarPos[71] = <<-1945.2784, -503.7773, 11.3477>>
|
|
TrafficCarQuatX[71] = 0.0005
|
|
TrafficCarQuatY[71] = -0.0008
|
|
TrafficCarQuatZ[71] = 0.9002
|
|
TrafficCarQuatW[71] = -0.4354
|
|
TrafficCarRecording[71] = 207
|
|
TrafficCarStartime[71] = 116756.0000
|
|
TrafficCarModel[71] = emperor
|
|
|
|
TrafficCarPos[72] = <<-1935.8025, -478.0072, 11.5486>>
|
|
TrafficCarQuatX[72] = -0.0068
|
|
TrafficCarQuatY[72] = -0.0039
|
|
TrafficCarQuatZ[72] = 0.4292
|
|
TrafficCarQuatW[72] = 0.9032
|
|
TrafficCarRecording[72] = 208
|
|
TrafficCarStartime[72] = 116954.0000
|
|
TrafficCarModel[72] = habanero
|
|
|
|
TrafficCarPos[73] = <<-1951.1832, -492.1719, 11.5457>>
|
|
TrafficCarQuatX[73] = 0.0007
|
|
TrafficCarQuatY[73] = -0.0062
|
|
TrafficCarQuatZ[73] = 0.9020
|
|
TrafficCarQuatW[73] = -0.4317
|
|
TrafficCarRecording[73] = 209
|
|
TrafficCarStartime[73] = 117020.0000
|
|
TrafficCarModel[73] = habanero
|
|
|
|
|
|
|
|
|
|
//The buddy and truck recordings are played separately in the main mission, but as setpiece cars during debug.
|
|
SetPieceCarPos[0] = <<-1253.1776, -697.2492, 11.1198>>
|
|
SetPieceCarQuatX[0] = -0.0151
|
|
SetPieceCarQuatY[0] = 0.0104
|
|
SetPieceCarQuatZ[0] = 0.8292
|
|
SetPieceCarQuatW[0] = 0.5586
|
|
IF bPickedGoodTruckDriver
|
|
SetPieceCarRecording[0] = 101
|
|
ELSE
|
|
SetPieceCarRecording[0] = CARREC_TRUCK_RIGHT_BAD
|
|
ENDIF
|
|
SetPieceCarStartime[0] = 90000.0000
|
|
SetPieceCarRecordingSpeed[0] = TRAILER_SETPIECE_SPEED
|
|
SetPieceCarModel[0] = packer
|
|
|
|
iDontSwitchThisSetpieceRecordingToAI = SetPieceCarRecording[0]
|
|
|
|
SetPieceCarPos[1] = <<-1242.3896, -704.7631, 11.1252>>
|
|
SetPieceCarQuatX[1] = 0.0141
|
|
SetPieceCarQuatY[1] = -0.0079
|
|
SetPieceCarQuatZ[1] = 0.8385
|
|
SetPieceCarQuatW[1] = 0.5447
|
|
SetPieceCarRecording[1] = 102
|
|
SetPieceCarStartime[1] = 90000.0000
|
|
SetPieceCarRecordingSpeed[1] = TRAILER_SETPIECE_SPEED
|
|
SetPieceCarModel[1] = packer
|
|
|
|
iDontSwitchThisSetpieceRecordingToAI2 = SetPieceCarRecording[1]
|
|
|
|
IF eMissionStage = STAGE_DEBUG_RECORD_SETPIECES
|
|
SetPieceCarPos[2] = <<136.2907, -1186.8152, 29.0991>>
|
|
SetPieceCarQuatX[2] = 0.0007
|
|
SetPieceCarQuatY[2] = -0.0097
|
|
SetPieceCarQuatZ[2] = 0.9982
|
|
SetPieceCarQuatW[2] = -0.0597
|
|
SetPieceCarRecording[2] = 105
|
|
SetPieceCarStartime[2] = 0.0000
|
|
SetPieceCarRecordingSpeed[2] = 1.0000
|
|
SetPieceCarModel[2] = gauntlet
|
|
//SetPieceCarID[2] = sGoldCars[0].veh
|
|
|
|
SetPieceCarPos[3] = <<133.3132, -1186.8992, 29.1002>>
|
|
SetPieceCarQuatX[3] = 0.0005
|
|
SetPieceCarQuatY[3] = -0.0097
|
|
SetPieceCarQuatZ[3] = 0.9990
|
|
SetPieceCarQuatW[3] = -0.0431
|
|
SetPieceCarRecording[3] = 109
|
|
SetPieceCarStartime[3] = 0.0000
|
|
SetPieceCarRecordingSpeed[3] = 1.0000
|
|
SetPieceCarModel[3] = gauntlet
|
|
//SetPieceCarID[3] = sGoldCars[1].veh
|
|
|
|
SetPieceCarPos[4] = <<130.3132, -1186.7778, 29.0910>>
|
|
SetPieceCarQuatX[4] = 0.0001
|
|
SetPieceCarQuatY[4] = -0.0096
|
|
SetPieceCarQuatZ[4] = 0.9997
|
|
SetPieceCarQuatW[4] = -0.0239
|
|
IF NOT bPickedGoodCarDriver
|
|
SetPieceCarRecording[4] = CARREC_CHASE_BUDDY_3_BAD_DRIVER
|
|
ELSE
|
|
IF bPickedGoodTruckDriver
|
|
SetPieceCarRecording[4] = CARREC_CHASE_BUDDY_3_GOOD_TRUCK
|
|
ELSE
|
|
SetPieceCarRecording[4] = CARREC_CHASE_BUDDY_3_BAD_TRUCK
|
|
ENDIF
|
|
ENDIF
|
|
SetPieceCarStartime[4] = 0.0000
|
|
SetPieceCarRecordingSpeed[4] = 1.0000
|
|
SetPieceCarModel[4] = gauntlet
|
|
//SetPieceCarID[4] = sGoldCars[2].veh
|
|
ENDIF
|
|
|
|
SetPieceCarPos[5] = <<-569.5978, -646.8032, 43.9248>>
|
|
SetPieceCarQuatX[5] = -0.0000
|
|
SetPieceCarQuatY[5] = 0.0000
|
|
SetPieceCarQuatZ[5] = 0.6114
|
|
SetPieceCarQuatW[5] = 0.7913
|
|
SetPieceCarRecording[5] = 110
|
|
SetPieceCarStartime[5] = 77500.0000
|
|
SetPieceCarRecordingSpeed[5] = 1.0000
|
|
SetPieceCarModel[5] = POLMAV
|
|
|
|
SetPieceCarPos[6] = <<166.1673, -597.6662, 43.2851>>
|
|
SetPieceCarQuatX[6] = -0.0122
|
|
SetPieceCarQuatY[6] = -0.0356
|
|
SetPieceCarQuatZ[6] = 0.8113
|
|
SetPieceCarQuatW[6] = -0.5834
|
|
SetPieceCarRecording[6] = 111
|
|
SetPieceCarStartime[6] = 32000.0000
|
|
SetPieceCarRecordingSpeed[6] = 1.0000
|
|
SetPieceCarModel[6] = habanero
|
|
|
|
SetPieceCarPos[7] = <<-620.6948, -405.8100, 34.4012>>
|
|
SetPieceCarQuatX[7] = -0.0012
|
|
SetPieceCarQuatY[7] = 0.0267
|
|
SetPieceCarQuatZ[7] = 0.0122
|
|
SetPieceCarQuatW[7] = 0.9996
|
|
SetPieceCarRecording[7] = 112
|
|
SetPieceCarStartime[7] = 77000.0000
|
|
SetPieceCarRecordingSpeed[7] = 1.0000
|
|
SetPieceCarModel[7] = habanero
|
|
|
|
SetPieceCarPos[8] = <<-627.9930, -443.3298, 34.5073>>
|
|
SetPieceCarQuatX[8] = -0.0019
|
|
SetPieceCarQuatY[8] = -0.0005
|
|
SetPieceCarQuatZ[8] = -0.0065
|
|
SetPieceCarQuatW[8] = 1.0000
|
|
SetPieceCarRecording[8] = 113
|
|
SetPieceCarStartime[8] = 77100.0000
|
|
SetPieceCarRecordingSpeed[8] = 1.0000
|
|
SetPieceCarModel[8] = habanero
|
|
|
|
SetPieceCarPos[9] = <<19.9876, -217.7000, 51.5301>>
|
|
SetPieceCarQuatX[9] = 0.0190
|
|
SetPieceCarQuatY[9] = -0.0262
|
|
SetPieceCarQuatZ[9] = 0.8315
|
|
SetPieceCarQuatW[9] = -0.5546
|
|
SetPieceCarRecording[9] = 115
|
|
SetPieceCarStartime[9] = 54000.0000
|
|
SetPieceCarRecordingSpeed[9] = 1.1111
|
|
SetPieceCarModel[9] = POLICE3
|
|
|
|
SetPieceCarPos[10] = <<281.2316, -1044.3389, 28.7334>>
|
|
SetPieceCarQuatX[10] = -0.0026
|
|
SetPieceCarQuatY[10] = 0.0009
|
|
SetPieceCarQuatZ[10] = 0.6940
|
|
SetPieceCarQuatW[10] = 0.7200
|
|
SetPieceCarRecording[10] = 118
|
|
SetPieceCarStartime[10] = 16000.0000
|
|
SetPieceCarRecordingSpeed[10] = 1.0000
|
|
SetPieceCarModel[10] = emperor
|
|
|
|
SetPieceCarPos[11] = <<166.7606, -1026.9526, 29.0744>>
|
|
SetPieceCarQuatX[11] = 0.0027
|
|
SetPieceCarQuatY[11] = -0.0035
|
|
SetPieceCarQuatZ[11] = 0.8117
|
|
SetPieceCarQuatW[11] = -0.5840
|
|
SetPieceCarRecording[11] = 119
|
|
SetPieceCarStartime[11] = 15000.0000
|
|
SetPieceCarRecordingSpeed[11] = 1.0000
|
|
SetPieceCarModel[11] = habanero
|
|
|
|
SetPieceCarPos[12] = <<229.0311, -849.7205, 29.6122>>
|
|
SetPieceCarQuatX[12] = 0.0984
|
|
SetPieceCarQuatY[12] = 0.0568
|
|
SetPieceCarQuatZ[12] = 0.8058
|
|
SetPieceCarQuatW[12] = -0.5811
|
|
SetPieceCarRecording[12] = 120
|
|
SetPieceCarStartime[12] = 22000.0000
|
|
SetPieceCarRecordingSpeed[12] = 1.0000
|
|
SetPieceCarModel[12] = vader
|
|
|
|
SetPieceCarPos[13] = <<246.6916, -618.9172, 41.7370>>
|
|
SetPieceCarQuatX[13] = -0.0087
|
|
SetPieceCarQuatY[13] = -0.0396
|
|
SetPieceCarQuatZ[13] = 0.9798
|
|
SetPieceCarQuatW[13] = 0.1960
|
|
SetPieceCarRecording[13] = 272
|
|
SetPieceCarStartime[13] = 26000.0000
|
|
SetPieceCarRecordingSpeed[13] = 1.0000
|
|
SetPieceCarModel[13] = Biff
|
|
|
|
SetPieceCarPos[14] = <<208.4380, -748.9736, 33.4368>>
|
|
SetPieceCarQuatX[14] = 0.0266
|
|
SetPieceCarQuatY[14] = 0.0193
|
|
SetPieceCarQuatZ[14] = -0.1842
|
|
SetPieceCarQuatW[14] = 0.9823
|
|
SetPieceCarRecording[14] = 273
|
|
SetPieceCarStartime[14] = 27500.0000
|
|
SetPieceCarRecordingSpeed[14] = 1.0000
|
|
SetPieceCarModel[14] = bus
|
|
|
|
SetPieceCarPos[15] = <<-292.1852, -148.5122, 41.0333>>
|
|
SetPieceCarQuatX[15] = 0.0082
|
|
SetPieceCarQuatY[15] = 0.0118
|
|
SetPieceCarQuatZ[15] = 0.6025
|
|
SetPieceCarQuatW[15] = 0.7980
|
|
SetPieceCarRecording[15] = 121
|
|
SetPieceCarStartime[15] = 64800.0
|
|
SetPieceCarRecordingSpeed[15] = 1.0000
|
|
SetPieceCarModel[15] = packer
|
|
|
|
SetPieceCarPos[16] = <<107.7398, -600.9831, 43.6752>>
|
|
SetPieceCarQuatX[16] = 0.0013
|
|
SetPieceCarQuatY[16] = 0.0244
|
|
SetPieceCarQuatZ[16] = -0.1665
|
|
SetPieceCarQuatW[16] = 0.9857
|
|
SetPieceCarRecording[16] = 124
|
|
SetPieceCarStartime[16] = 37000.0000
|
|
SetPieceCarRecordingSpeed[16] = 1.0000
|
|
SetPieceCarModel[16] = emperor
|
|
|
|
SetPieceCarPos[17] = <<-685.8647, -475.7422, 34.2185>>
|
|
SetPieceCarQuatX[17] = 0.0010
|
|
SetPieceCarQuatY[17] = -0.0263
|
|
SetPieceCarQuatZ[17] = 0.6944
|
|
SetPieceCarQuatW[17] = 0.7191
|
|
SetPieceCarRecording[17] = 127
|
|
SetPieceCarStartime[17] = 81000.0000
|
|
SetPieceCarRecordingSpeed[17] = 1.0000
|
|
SetPieceCarModel[17] = flatbed
|
|
|
|
SetPieceCarPos[18] = <<269.2946, -562.0340, 42.9396>>
|
|
SetPieceCarQuatX[18] = -0.0003
|
|
SetPieceCarQuatY[18] = -0.0010
|
|
SetPieceCarQuatZ[18] = 0.9925
|
|
SetPieceCarQuatW[18] = 0.1223
|
|
SetPieceCarRecording[18] = 132
|
|
SetPieceCarStartime[18] = 30000.0000
|
|
SetPieceCarRecordingSpeed[18] = 1.1111
|
|
SetPieceCarModel[18] = police3
|
|
|
|
SetPieceCarPos[19] = <<-254.5352, -227.4811, 36.0209>>
|
|
SetPieceCarQuatX[19] = -0.0241
|
|
SetPieceCarQuatY[19] = -0.0305
|
|
SetPieceCarQuatZ[19] = 0.8423
|
|
SetPieceCarQuatW[19] = 0.5377
|
|
SetPieceCarRecording[19] = 131
|
|
SetPieceCarStartime[19] = 66000.0000
|
|
SetPieceCarRecordingSpeed[19] = 1.1111
|
|
SetPieceCarModel[19] = police3
|
|
|
|
SetPieceCarPos[21] = <<90.3679, -817.8712, 30.8911>>
|
|
SetPieceCarQuatX[21] = 0.0120
|
|
SetPieceCarQuatY[21] = -0.0168
|
|
SetPieceCarQuatZ[21] = -0.1665
|
|
SetPieceCarQuatW[21] = 0.9858
|
|
SetPieceCarRecording[21] = 133
|
|
SetPieceCarStartime[21] = 24500.0000
|
|
SetPieceCarRecordingSpeed[21] = 1.1000
|
|
SetPieceCarModel[21] = police3
|
|
|
|
SetPieceCarPos[22] = <<86.6921, -774.7521, 31.1603>>
|
|
SetPieceCarQuatX[22] = 0.0263
|
|
SetPieceCarQuatY[22] = 0.0127
|
|
SetPieceCarQuatZ[22] = 0.8206
|
|
SetPieceCarQuatW[22] = -0.5708
|
|
SetPieceCarRecording[22] = 134
|
|
SetPieceCarStartime[22] = 24600.0000
|
|
SetPieceCarRecordingSpeed[22] = 1.1000
|
|
SetPieceCarModel[22] = police3
|
|
|
|
SetPieceCarPos[23] = <<-12.9334, -274.2683, 46.6387>>
|
|
SetPieceCarQuatX[23] = -0.0231
|
|
SetPieceCarQuatY[23] = 0.0011
|
|
SetPieceCarQuatZ[23] = 0.8489
|
|
SetPieceCarQuatW[23] = -0.5281
|
|
SetPieceCarRecording[23] = 135
|
|
SetPieceCarStartime[23] = 49000.0000
|
|
SetPieceCarRecordingSpeed[23] = 1.0000
|
|
SetPieceCarModel[23] = habanero
|
|
|
|
SetPieceCarPos[24] = <<186.4278, -1399.0901, 28.8768>>
|
|
SetPieceCarQuatX[24] = -0.0096
|
|
SetPieceCarQuatY[24] = 0.0226
|
|
SetPieceCarQuatZ[24] = 0.3507
|
|
SetPieceCarQuatW[24] = 0.9362
|
|
SetPieceCarRecording[24] = 136
|
|
SetPieceCarStartime[24] = 7000.0000
|
|
SetPieceCarRecordingSpeed[24] = 1.1111
|
|
SetPieceCarModel[24] = police3
|
|
|
|
SetPieceCarPos[25] = <<232.7994, -1259.1505, 28.7174>>
|
|
SetPieceCarQuatX[25] = 0.0010
|
|
SetPieceCarQuatY[25] = 0.0093
|
|
SetPieceCarQuatZ[25] = -0.0596
|
|
SetPieceCarQuatW[25] = 0.9982
|
|
SetPieceCarRecording[25] = 278
|
|
SetPieceCarStartime[25] = 9600.0000
|
|
SetPieceCarRecordingSpeed[25] = 1.0
|
|
SetPieceCarModel[25] = emperor
|
|
|
|
SetPieceCarPos[26] = <<163.3614, -826.8202, 30.6954>>
|
|
SetPieceCarQuatX[26] = 0.0016
|
|
SetPieceCarQuatY[26] = 0.0005
|
|
SetPieceCarQuatZ[26] = 0.8207
|
|
SetPieceCarQuatW[26] = -0.5714
|
|
SetPieceCarRecording[26] = 288
|
|
SetPieceCarStartime[26] = 20600.0000
|
|
SetPieceCarRecordingSpeed[26] = 1.0
|
|
SetPieceCarModel[26] = emperor
|
|
|
|
|
|
//Parked cars
|
|
ParkedCarPos[0] = <<150.9794, -399.4397, 40.8743>>
|
|
ParkedCarQuatX[0] = 0.0075
|
|
ParkedCarQuatY[0] = 0.0249
|
|
ParkedCarQuatZ[0] = 0.4819
|
|
ParkedCarQuatW[0] = 0.8758
|
|
ParkedCarModel[0] = POLICE3
|
|
|
|
ParkedCarPos[1] = <<159.0037, -401.6718, 40.9692>>
|
|
ParkedCarQuatX[1] = -0.0162
|
|
ParkedCarQuatY[1] = -0.0122
|
|
ParkedCarQuatZ[1] = 0.9668
|
|
ParkedCarQuatW[1] = -0.2548
|
|
ParkedCarModel[1] = POLICE3
|
|
|
|
ParkedCarPos[2] = <<168.1424, -406.2586, 40.8993>>
|
|
ParkedCarQuatX[2] = -0.0075
|
|
ParkedCarQuatY[2] = -0.0210
|
|
ParkedCarQuatZ[2] = 0.7181
|
|
ParkedCarQuatW[2] = -0.6956
|
|
ParkedCarModel[2] = POLICE3
|
|
|
|
ParkedCarPos[3] = <<-627.4457, -483.3596, 33.8083>>
|
|
ParkedCarQuatX[3] = 0.0
|
|
ParkedCarQuatY[3] = 0.0
|
|
ParkedCarQuatZ[3] = 0.8862
|
|
ParkedCarQuatW[3] = 0.4633
|
|
ParkedCarModel[3] = POLICE3
|
|
|
|
/*ParkedCarPos[4] = <<-630.5210, -481.4349, 33.8083>>
|
|
ParkedCarQuatX[4] = 0.0001
|
|
ParkedCarQuatY[4] = -0.0000
|
|
ParkedCarQuatZ[4] = 0.7624
|
|
ParkedCarQuatW[4] = -0.6471
|
|
ParkedCarModel[4] = POLICE3*/
|
|
|
|
ParkedCarPos[5] = <<-635.9256, -484.7276, 33.8083>>
|
|
ParkedCarQuatX[5] = 0.0003
|
|
ParkedCarQuatY[5] = -0.0006
|
|
ParkedCarQuatZ[5] = 0.2910
|
|
ParkedCarQuatW[5] = 0.9567
|
|
ParkedCarModel[5] = POLICE3
|
|
|
|
ParkedCarPos[6] = <<-644.4130, -483.9380, 33.8083>>
|
|
ParkedCarQuatX[6] = 0.0142
|
|
ParkedCarQuatY[6] = -0.0109
|
|
ParkedCarQuatZ[6] = -0.5902
|
|
ParkedCarQuatW[6] = 0.8070
|
|
ParkedCarModel[6] = POLICE3
|
|
|
|
ParkedCarPos[7] = <<141.7556, -1282.3517, 28.8426>>
|
|
ParkedCarQuatX[7] = -0.0175
|
|
ParkedCarQuatY[7] = 0.0099
|
|
ParkedCarQuatZ[7] = -0.5080
|
|
ParkedCarQuatW[7] = -0.8611
|
|
ParkedCarModel[7] = Emperor
|
|
|
|
ParkedCarPos[8] = <<259.2000, -1254.4874, 28.6646>>
|
|
ParkedCarQuatX[8] = 0.0001
|
|
ParkedCarQuatY[8] = -0.0099
|
|
ParkedCarQuatZ[8] = 0.9999
|
|
ParkedCarQuatW[8] = -0.0031
|
|
ParkedCarModel[8] = Emperor
|
|
|
|
ParkedCarPos[9] = <<250.0250, -1150.0442, 28.7959>>
|
|
ParkedCarQuatX[9] = -0.0060
|
|
ParkedCarQuatY[9] = -0.0024
|
|
ParkedCarQuatZ[9] = -0.0184
|
|
ParkedCarQuatW[9] = 0.9998
|
|
ParkedCarModel[9] = Emperor
|
|
|
|
ParkedCarPos[10] = <<279.6884, -921.0851, 28.6364>>
|
|
ParkedCarQuatX[10] = -0.0179
|
|
ParkedCarQuatY[10] = -0.0670
|
|
ParkedCarQuatZ[10] = -0.1643
|
|
ParkedCarQuatW[10] = 0.9840
|
|
ParkedCarModel[10] = Habanero
|
|
|
|
ParkedCarPos[11] = <<224.5021, -799.3860, 30.3567>>
|
|
ParkedCarQuatX[11] = 0.0024
|
|
ParkedCarQuatY[11] = 0.0013
|
|
ParkedCarQuatZ[11] = 0.5406
|
|
ParkedCarQuatW[11] = 0.8413
|
|
ParkedCarModel[11] = Habanero
|
|
|
|
ParkedCarPos[12] = <<226.3161, -774.3887, 30.2995>>
|
|
ParkedCarQuatX[12] = 0.0071
|
|
ParkedCarQuatY[12] = -0.0123
|
|
ParkedCarQuatZ[12] = 0.8175
|
|
ParkedCarQuatW[12] = -0.5757
|
|
ParkedCarModel[12] = emperor
|
|
|
|
ParkedCarPos[13] = <<211.8195, -669.2407, 37.1736>>
|
|
ParkedCarQuatX[13] = 0.0409
|
|
ParkedCarQuatY[13] = -0.0391
|
|
ParkedCarQuatZ[13] = 0.9846
|
|
ParkedCarQuatW[13] = 0.1654
|
|
ParkedCarModel[13] = burrito3
|
|
|
|
ParkedCarPos[14] = <<114.0084, -380.0473, 41.5471>>
|
|
ParkedCarQuatX[14] = 0.0016
|
|
ParkedCarQuatY[14] = -0.0542
|
|
ParkedCarQuatZ[14] = 0.9983
|
|
ParkedCarQuatW[14] = -0.0202
|
|
ParkedCarModel[14] = bulldozer
|
|
|
|
ParkedCarPos[15] = <<-63.0514, -215.2341, 45.0139>>
|
|
ParkedCarQuatX[15] = -0.0146
|
|
ParkedCarQuatY[15] = -0.0313
|
|
ParkedCarQuatZ[15] = 0.9794
|
|
ParkedCarQuatW[15] = 0.1989
|
|
ParkedCarModel[15] = emperor
|
|
|
|
ParkedCarPos[16] = <<-476.7066, -216.8887, 35.9730>>
|
|
ParkedCarQuatX[16] = 0.0065
|
|
ParkedCarQuatY[16] = -0.0212
|
|
ParkedCarQuatZ[16] = 0.9641
|
|
ParkedCarQuatW[16] = -0.2645
|
|
ParkedCarModel[16] = emperor
|
|
|
|
ParkedCarPos[17] = <<-483.9053, -204.4272, 36.3443>>
|
|
ParkedCarQuatX[17] = 0.0066
|
|
ParkedCarQuatY[17] = -0.0226
|
|
ParkedCarQuatZ[17] = 0.9716
|
|
ParkedCarQuatW[17] = -0.2356
|
|
ParkedCarModel[17] = habanero
|
|
|
|
ParkedCarPos[18] = <<-520.6978, -265.9695, 35.3349>>
|
|
ParkedCarQuatX[18] = 0.0015
|
|
ParkedCarQuatY[18] = -0.0036
|
|
ParkedCarQuatZ[18] = 0.8274
|
|
ParkedCarQuatW[18] = 0.5616
|
|
ParkedCarModel[18] = bus
|
|
|
|
ParkedCarPos[19] = <<-128.3865, -215.6624, 44.4083>>
|
|
ParkedCarQuatX[19] = -0.0081
|
|
ParkedCarQuatY[19] = 0.0031
|
|
ParkedCarQuatZ[19] = -0.0220
|
|
ParkedCarQuatW[19] = 0.9997
|
|
ParkedCarModel[19] = police3
|
|
|
|
ParkedCarPos[20] = <<203.9267, -846.0989, 30.2330>>
|
|
ParkedCarQuatX[20] = 0.0081
|
|
ParkedCarQuatY[20] = -0.0084
|
|
ParkedCarQuatZ[20] = 0.8171
|
|
ParkedCarQuatW[20] = -0.5763
|
|
ParkedCarModel[20] = habanero
|
|
ENDPROC
|
|
|
|
FUNC INT GET_TRAFFIC_VEHICLE_SEARCH_FLAGS()
|
|
RETURN (VEHICLE_SEARCH_FLAG_ALLOW_VEHICLE_OCCUPANTS_TO_BE_PERFORMING_A_SCRIPTED_TASK |
|
|
VEHICLE_SEARCH_FLAG_RETURN_MISSION_VEHICLES |
|
|
VEHICLE_SEARCH_FLAG_RETURN_RANDOM_VEHICLES |
|
|
VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_A_DEAD_OR_DYING_PED)
|
|
ENDFUNC
|
|
|
|
FUNC INT GET_TRAFFIC_AND_PLAYER_VEHICLE_SEARCH_FLAGS()
|
|
RETURN (VEHICLE_SEARCH_FLAG_ALLOW_VEHICLE_OCCUPANTS_TO_BE_PERFORMING_A_SCRIPTED_TASK |
|
|
VEHICLE_SEARCH_FLAG_RETURN_MISSION_VEHICLES |
|
|
VEHICLE_SEARCH_FLAG_RETURN_RANDOM_VEHICLES |
|
|
VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_A_PLAYER |
|
|
VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_GROUP_MEMBERS |
|
|
VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_A_DEAD_OR_DYING_PED)
|
|
ENDFUNC
|
|
|
|
PROC CLEAR_TRIGGERED_LABELS()
|
|
INT iArraySize = COUNT_OF(bHasTextLabelTriggered)
|
|
INT i = 0
|
|
|
|
REPEAT iArraySize i
|
|
bHasTextLabelTriggered[i] = FALSE
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
///Gets the ped index for a given player ped character, if the character is the player it returns PLAYER_PED_ID(), otherwise it returns the relevant selector ped.
|
|
FUNC PED_INDEX GET_PED_INDEX(enumCharacterList eChar)
|
|
IF GET_PLAYER_PED_MODEL(eChar) = GET_ENTITY_MODEL(PLAYER_PED_ID())
|
|
RETURN PLAYER_PED_ID()
|
|
ELSE
|
|
RETURN sSelectorPeds.pedID[GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(eChar)]
|
|
ENDIF
|
|
ENDFUNC
|
|
|
|
|
|
PROC DISABLE_COMBAT_CONTROLS_THIS_FRAME(BOOL bAllowEnteringVehicles = FALSE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_COVER)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DUCK)
|
|
IF NOT bAllowEnteringVehicles
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
ENDIF
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK1)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_BLOCK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_WEAPON)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_PREV_WEAPON)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_AIM)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_RELOAD)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_PC)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_SECONDARY)
|
|
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
|
|
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: triggers multiple bullet hits around an entity at given intervals.
|
|
//AUTHOR: Ross Wallace
|
|
PROC DO_EXCITING_NEAR_BULLET_MISS_ON_ENTITY(ENTITY_INDEX entityToMiss, PED_INDEX sourceOfBullets, INT &iControlTimer, VECTOR sourceOffset,
|
|
INT timeBetweenBullets = 60, FLOAT minXrange = -3.9, FLOAT maxXrange = -1.0, FLOAT minYRange = -2.9, FLOAT maxYrange = 3.9)
|
|
INT currentBulletTime = GET_GAME_TIMER()
|
|
VECTOR bulletHit
|
|
VECTOR bulletOrigin
|
|
|
|
IF ((currentBulletTime - iControlTimer) > timeBetweenBullets)
|
|
IF NOT IS_ENTITY_DEAD(entityToMiss)
|
|
AND NOT IS_ENTITY_DEAD(sourceOfBullets)
|
|
bulletHit = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(entityToMiss, <<GET_RANDOM_FLOAT_IN_RANGE(minXrange, maxXrange), GET_RANDOM_FLOAT_IN_RANGE(minYRange, maxYrange), 0.0>>)
|
|
bulletOrigin = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sourceOfBullets, sourceOffset)
|
|
GET_GROUND_Z_FOR_3D_COORD(bulletHit, bulletHit.z)
|
|
SHOOT_SINGLE_BULLET_BETWEEN_COORDS(bulletOrigin, bulletHit, 1)
|
|
iControlTimer = currentBulletTime
|
|
|
|
//SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
//DRAW_DEBUG_SPHERE(bulletOrigin, 0.2)
|
|
//DRAW_DEBUG_SPHERE(bulletHit, 0.2)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
|
|
PROC FIX_ALL_VEHICLE_TYRES(VEHICLE_INDEX veh)
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
SET_VEHICLE_TYRE_FIXED(veh, SC_WHEEL_CAR_FRONT_LEFT)
|
|
SET_VEHICLE_TYRE_FIXED(veh, SC_WHEEL_CAR_FRONT_RIGHT)
|
|
SET_VEHICLE_TYRE_FIXED(veh, SC_WHEEL_CAR_REAR_LEFT)
|
|
SET_VEHICLE_TYRE_FIXED(veh, SC_WHEEL_CAR_REAR_RIGHT)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC PED_INDEX CREATE_ENEMY_PED(MODEL_NAMES model, VECTOR vPos, FLOAT fHeading, REL_GROUP_HASH group,
|
|
INT iHealth = 200, INT iArmour = 0, WEAPON_TYPE weapon = WEAPONTYPE_UNARMED, PED_TYPE ePedType = PEDTYPE_MISSION)
|
|
PED_INDEX ped = CREATE_PED(ePedType, model, vPos, fHeading)
|
|
GIVE_WEAPON_TO_PED(ped, weapon, INFINITE_AMMO, TRUE)
|
|
SET_PED_INFINITE_AMMO(ped, TRUE, weapon)
|
|
SET_PED_MAX_HEALTH(ped, iHealth)
|
|
SET_ENTITY_HEALTH(ped, iHealth)
|
|
ADD_ARMOUR_TO_PED(ped, -GET_PED_ARMOUR(ped))
|
|
ADD_ARMOUR_TO_PED(ped, iArmour)
|
|
SET_PED_DIES_WHEN_INJURED(ped, TRUE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(ped, group)
|
|
SET_PED_AS_ENEMY(ped, TRUE)
|
|
SET_PED_TARGET_LOSS_RESPONSE(ped, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_CONFIG_FLAG(ped, PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(ped, PCF_DisableHurt, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(ped, CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_MONEY(ped, 0)
|
|
|
|
RETURN ped
|
|
ENDFUNC
|
|
|
|
FUNC PED_INDEX CREATE_ENEMY_PED_IN_VEHICLE(MODEL_NAMES model, VEHICLE_INDEX veh, VEHICLE_SEAT eSeat, REL_GROUP_HASH group,
|
|
INT iHealth = 200, INT iArmour = 0, WEAPON_TYPE weapon = WEAPONTYPE_UNARMED, PED_TYPE ePedType = PEDTYPE_MISSION)
|
|
PED_INDEX ped
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
ped = CREATE_ENEMY_PED(model, GET_ENTITY_COORDS(veh) + <<0.0, 0.0, 3.0>>, 0.0, group, iHealth, iArmour, weapon, ePedType)
|
|
SET_PED_INTO_VEHICLE(ped, veh, eSeat)
|
|
ENDIF
|
|
|
|
RETURN ped
|
|
ENDFUNC
|
|
|
|
PROC SET_PED_COMBAT_AI(PED_INDEX &ped, INT accuracy, COMBAT_MOVEMENT movement, COMBAT_ABILITY_LEVEL ability, COMBAT_RANGE range, COMBAT_ATTRIBUTE activeAttributes,
|
|
VECTOR vDefensiveSpherePos, FLOAT fDefensiveSphereRadius = 0.0)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
SET_PED_COMBAT_MOVEMENT(ped, movement)
|
|
SET_PED_COMBAT_ABILITY(ped, ability)
|
|
SET_PED_COMBAT_RANGE(ped, range)
|
|
SET_PED_COMBAT_ATTRIBUTES(ped, CA_USE_COVER, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(ped, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(ped, CA_DO_DRIVEBYS, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(ped, CA_LEAVE_VEHICLES, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(ped, CA_CAN_INVESTIGATE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(ped, activeAttributes, TRUE)
|
|
SET_PED_ACCURACY(ped, accuracy)
|
|
|
|
IF fDefensiveSphereRadius != 0.0
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(ped, vDefensiveSpherePos, fDefensiveSphereRadius)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SET_PED_COMBAT_PARAMS(PED_INDEX &ped, INT iAccuracy, COMBAT_MOVEMENT eMovement, COMBAT_ABILITY_LEVEL eAbility, COMBAT_RANGE eRange,
|
|
COMBAT_TARGET_LOSS_RESPONSE eTLR)
|
|
SET_PED_COMBAT_MOVEMENT(ped, eMovement)
|
|
SET_PED_COMBAT_ABILITY(ped, eAbility)
|
|
SET_PED_COMBAT_RANGE(ped, eRange)
|
|
SET_PED_ACCURACY(ped, iAccuracy)
|
|
SET_PED_TARGET_LOSS_RESPONSE(ped, eTLR)
|
|
ENDPROC
|
|
|
|
PROC SET_PED_PREFERRED_COVER_POINT(PED_INDEX &ped, COVERPOINT_INDEX &cover)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
ITEMSET_INDEX itemCover = CREATE_ITEMSET(TRUE)
|
|
ADD_TO_ITEMSET(cover, itemCover)
|
|
|
|
SET_PED_PREFERRED_COVER_SET(ped, itemCover)
|
|
DESTROY_ITEMSET(itemCover)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC INITIALISE_ENEMY_PED(ENEMY_DATA &sEnemy, STRING strName, INT iIndex)
|
|
IF NOT IS_PED_INJURED(sEnemy.ped)
|
|
TASK_STAND_STILL(sEnemy.ped, -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemy.ped, TRUE)
|
|
INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(sEnemy.ped)
|
|
sEnemy.bIsCreated = TRUE
|
|
sEnemy.bHasCleanedUp = FALSE
|
|
sEnemy.bSetToCharge = FALSE
|
|
sEnemy.iEvent = 0
|
|
sEnemy.iTimer = 0
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
TEXT_LABEL_31 strDebugName = strName
|
|
strDebugName += iIndex
|
|
SET_PED_NAME_DEBUG(sEnemy.ped, strDebugName)
|
|
#ENDIF
|
|
|
|
#IF NOT IS_DEBUG_BUILD
|
|
strName = strName // to prevent an Unreferenced variable error
|
|
iIndex = iIndex
|
|
#ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC INITIALISE_ENEMY_GROUP(ENEMY_DATA &sEnemies[], STRING name)
|
|
INT i = 0
|
|
|
|
REPEAT COUNT_OF(sEnemies) i
|
|
INITIALISE_ENEMY_PED(sEnemies[i], name, i)
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
PROC CLEAN_UP_ENEMY_PED(ENEMY_DATA &sEnemy, BOOL bResetVariables = FALSE)
|
|
IF DOES_BLIP_EXIST(sEnemy.blip)
|
|
REMOVE_BLIP(sEnemy.blip)
|
|
ENDIF
|
|
|
|
CLEANUP_AI_PED_BLIP(sEnemy.sBlipData)
|
|
|
|
IF NOT IS_PED_INJURED(sEnemy.ped)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sEnemy.ped, NORMAL_BLEND_OUT, TRUE)
|
|
ELSE
|
|
//Increment the kill stat if this ped was killed by the player.
|
|
IF DOES_ENTITY_EXIST(sEnemy.ped)
|
|
ENTITY_INDEX entityDeathSource = GET_PED_SOURCE_OF_DEATH(sEnemy.ped)
|
|
|
|
IF DOES_ENTITY_EXIST(entityDeathSource)
|
|
AND IS_ENTITY_A_PED(entityDeathSource)
|
|
IF GET_PED_INDEX_FROM_ENTITY_INDEX(entityDeathSource) = PLAYER_PED_ID()
|
|
REL_GROUP_HASH eEnemyGroup = GET_PED_RELATIONSHIP_GROUP_HASH(sEnemy.ped)
|
|
|
|
IF eEnemyGroup = relGroupCops
|
|
OR eEnemyGroup = RELGROUPHASH_COP
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FH2A_KILLS)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REMOVE_COVER_POINT(sEnemy.cover)
|
|
SET_PED_AS_NO_LONGER_NEEDED(sEnemy.ped)
|
|
|
|
IF bResetVariables
|
|
sEnemy.bIsCreated = FALSE
|
|
sEnemy.bHasCleanedUp = FALSE
|
|
sEnemy.bHasStartedRopeJump = FALSE
|
|
sEnemy.iEvent = 0
|
|
sEnemy.iTimer = 0
|
|
sEnemy.iRopeEvent = 0
|
|
sEnemy.ped = NULL
|
|
sEnemy.cover = NULL
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC KILL_ENEMY_GROUP_INSTANTLY(ENEMY_DATA &sEnemies[])
|
|
INT i = 0
|
|
|
|
REPEAT COUNT_OF(sEnemies) i
|
|
sEnemies[i].bIsCreated = TRUE
|
|
|
|
IF NOT IS_PED_INJURED(sEnemies[i].ped)
|
|
SET_ENTITY_HEALTH(sEnemies[i].ped, 0)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
///Counts the number of enemies currently alive in the group. If the group hasn't been created yet than all the peds are considered as alive.
|
|
FUNC INT GET_NUM_ENEMIES_ALIVE_IN_GROUP(ENEMY_DATA &sEnemies[])
|
|
INT iNumAlive = 0
|
|
INT iNumEnemiesInGroup = COUNT_OF(sEnemies)
|
|
INT i = 0
|
|
|
|
IF sEnemies[0].bIsCreated
|
|
REPEAT iNumEnemiesInGroup i
|
|
IF NOT IS_PED_INJURED(sEnemies[i].ped)
|
|
iNumAlive++
|
|
ENDIF
|
|
ENDREPEAT
|
|
ELSE
|
|
iNumAlive = iNumEnemiesInGroup
|
|
ENDIF
|
|
|
|
RETURN iNumAlive
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_ENEMY_GROUP_DEAD(ENEMY_DATA &sEnemies[])
|
|
IF GET_NUM_ENEMIES_ALIVE_IN_GROUP(sEnemies) = 0
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Helper function to set up a ped's personal cover point and defensive sphere in one go.
|
|
PROC SET_PED_COVER_POINT_AND_SPHERE(PED_INDEX ped, COVERPOINT_INDEX &cover, VECTOR vPos, FLOAT fHeading, FLOAT fSphereRadius,
|
|
COVERPOINT_USAGE covUsage, COVERPOINT_HEIGHT covHeight, COVERPOINT_ARC covArc, BOOL bGoToCentreOfSphere = FALSE)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
IF cover != NULL
|
|
REMOVE_COVER_POINT(cover)
|
|
cover = NULL
|
|
ENDIF
|
|
cover = ADD_COVER_POINT(vPos, fHeading, covUsage, covHeight, covArc)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(ped, vPos, fSphereRadius, bGoToCentreOfSphere)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Tells a ped to go to cover while aiming at either a coord or a given entity, and then go into general combat.
|
|
PROC SEQ_GO_TO_COVER_WHILE_AIMING_THEN_COMBAT(PED_INDEX ped, VECTOR v_destination, FLOAT move_state, INT i_time_spent_in_cover, BOOL b_shoot, VECTOR v_aim_pos,
|
|
FLOAT f_target_distance = 0.5, FLOAT f_slow_distance = 4.0, BOOL b_use_navmesh = TRUE, ENTITY_INDEX entity_aim = NULL)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
SEQUENCE_INDEX seq
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
IF IS_ENTITY_DEAD(entity_aim)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, v_destination, v_aim_pos, move_state, b_shoot, f_target_distance, f_slow_distance, b_use_navmesh)
|
|
TASK_SEEK_COVER_TO_COORDS(NULL, v_destination, v_aim_pos, i_time_spent_in_cover)
|
|
ELSE
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, v_destination, entity_aim, move_state, b_shoot, f_target_distance, f_slow_distance, b_use_navmesh)
|
|
TASK_SEEK_COVER_TO_COORDS(NULL, v_destination, GET_ENTITY_COORDS(entity_aim), i_time_spent_in_cover)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 50.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
|
|
TASK_PERFORM_SEQUENCE(ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Tells a ped to go to cover while aiming at either a coord or a given entity.
|
|
PROC SEQ_GO_TO_COVER_WHILE_AIMING(PED_INDEX ped, VECTOR vDestination, FLOAT moveState, INT iTimeSpentInCover, BOOL bShoot, VECTOR vAimPos,
|
|
FLOAT fTargetDistance = 0.5, FLOAT fSlowDistance = 4.0, BOOL bUseNavmesh = TRUE, ENTITY_INDEX entityAim = NULL,
|
|
BOOL bBlockNonTempEvents = TRUE)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
SEQUENCE_INDEX seq
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF IS_ENTITY_DEAD(entityAim)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, vDestination, vAimPos, moveState, bShoot, fTargetDistance, fSlowDistance, bUseNavmesh)
|
|
ELSE
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, vDestination, entityAim, moveState, bShoot, fTargetDistance, fSlowDistance, bUseNavmesh)
|
|
ENDIF
|
|
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, vDestination, iTimeSpentInCover)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped, bBlockNonTempEvents)
|
|
TASK_PERFORM_SEQUENCE(ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Tells a ped to run to a location and then puts them into cover there
|
|
PROC SEQ_GO_TO_COVER(PED_INDEX ped, VECTOR vDestination, FLOAT moveState, INT iTimeSpentInCover, BOOL bBlockNonTempEvents = TRUE, BOOL bUseNavmesh = TRUE,
|
|
INT iTime = DEFAULT_TIME_BEFORE_WARP, FLOAT fRadius = DEFAULT_NAVMESH_RADIUS, ENAV_SCRIPT_FLAGS navFlags = ENAV_DEFAULT)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
SEQUENCE_INDEX seq
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF bUseNavmesh
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vDestination, moveState, iTime, fRadius, navFlags)
|
|
ELSE
|
|
TASK_GO_STRAIGHT_TO_COORD(NULL, vDestination, moveState, iTime)
|
|
ENDIF
|
|
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, vDestination, iTimeSpentInCover, FALSE, SLOW_BLEND_DURATION)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped, bBlockNonTempEvents)
|
|
TASK_PERFORM_SEQUENCE(ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Performs a generic sequence where a ped will go to a coord while aiming at something (either a coord or entity), then transition into combat
|
|
PROC SEQ_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(PED_INDEX ped, VECTOR v_destination, FLOAT move_speed, VECTOR v_aim_pos, ENTITY_INDEX entity_aim = NULL, BOOL b_shoot = TRUE,
|
|
FLOAT f_target_dist = 0.5, FLOAT f_slow_dist = 0.5, BOOL b_use_navmesh = TRUE, FLOAT f_combat_range = 100.0)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
SEQUENCE_INDEX seq
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
|
|
IF IS_ENTITY_DEAD(entity_aim)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, v_destination, v_aim_pos, move_speed, b_shoot, f_target_dist, f_slow_dist, b_use_navmesh)
|
|
ELSE
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, v_destination, entity_aim, move_speed, b_shoot, f_target_dist, f_slow_dist, b_use_navmesh)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, f_combat_range)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
|
|
TASK_PERFORM_SEQUENCE(ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Performs a generic sequence where a ped will go to a coord while aiming at something (either a coord or entity), then either continue aiming or shoot at the target.
|
|
PROC SEQ_GO_TO_COORD_WHILE_AIMING_THEN_AIM(PED_INDEX ped, VECTOR vDestination, FLOAT moveState, VECTOR vAimPos, ENTITY_INDEX entityAim = NULL, BOOL bShoot = TRUE,
|
|
FLOAT fTargetDist = 0.5, FLOAT fSlowDist = 0.5, BOOL bUseNavmesh = TRUE, BOOL bBlockNonTempEvents = TRUE,
|
|
BOOL bShootWhenStopped = TRUE, FIRING_TYPE fireType = FIRING_TYPE_RANDOM_BURSTS)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
SEQUENCE_INDEX seq
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF IS_ENTITY_DEAD(entityAim)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, vDestination, vAimPos, moveState, bShoot, fTargetDist, fSlowDist, bUseNavmesh)
|
|
|
|
IF bShootWhenStopped
|
|
TASK_SHOOT_AT_COORD(NULL, vAimPos, -1, fireType)
|
|
ELSE
|
|
TASK_AIM_GUN_AT_COORD(NULL, vAimPos, -1)
|
|
ENDIF
|
|
ELSE
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, vDestination, entityAim, moveState, bShoot, fTargetDist, fSlowDist, bUseNavmesh)
|
|
|
|
IF bShootWhenStopped
|
|
TASK_SHOOT_AT_ENTITY(NULL, entityAim, -1, fireType)
|
|
ELSE
|
|
TASK_AIM_GUN_AT_ENTITY(NULL, entityAim, -1)
|
|
ENDIF
|
|
ENDIF
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped, bBlockNonTempEvents)
|
|
TASK_PERFORM_SEQUENCE(ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BOOL HAS_VEHICLE_HAD_MULTIPLE_PARTS_DAMAGED(VEHICLE_INDEX veh, INT iNumPartsToDamage)
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
INT iNumPartsDamaged = GET_VEHICLE_NUM_OF_BROKEN_OFF_PARTS(veh) + GET_VEHICLE_NUM_OF_BROKEN_LOOSEN_PARTS(veh)
|
|
|
|
IF IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_LEFT)
|
|
OR IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_RIGHT)
|
|
OR IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_LEFT)
|
|
OR (IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_RIGHT) AND NOT bVanTyreBurst)
|
|
OR iNumPartsDamaged >= iNumPartsToDamage
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Based on Ross's proc in rural_bank_heist.sc: applies extra damage to vehicle components as it is shot.
|
|
PROC DO_VEHICLE_DAMAGE_WHEN_SHOT(VEHICLE_INDEX &veh)
|
|
IF NOT IS_ENTITY_DEAD(veh)
|
|
IF NOT IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_LEFT)
|
|
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<-0.8000, 1.4000, 0.1000>>), 0.738)
|
|
SET_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_LEFT)
|
|
SET_VEHICLE_DAMAGE(veh, <<-1.0000, 1.0000, 0.2000>>, 100.0, 100.0, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_RIGHT)
|
|
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<0.8000, 1.4000, 0.1000>>), 0.738)
|
|
SET_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_FRONT_RIGHT)
|
|
SET_VEHICLE_DAMAGE(veh, <<1.0000, 1.0000, 0.2000>>, 100.0, 100.0, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_LEFT)
|
|
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<-0.8000, -1.4000, 0.1000>>), 0.738)
|
|
SET_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_LEFT)
|
|
SET_VEHICLE_DAMAGE(veh, <<-1.0000, -1.0000, 0.2000>>, 100.0, 100.0, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_RIGHT)
|
|
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<0.8000, -1.5000, 0.1000>>), 0.738)
|
|
SET_VEHICLE_TYRE_BURST(veh, SC_WHEEL_CAR_REAR_RIGHT)
|
|
SET_VEHICLE_DAMAGE(veh, <<1.0000, -1.0000, 0.2000>>, 100.0, 100.0, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_DOOR_DAMAGED(veh, SC_DOOR_FRONT_LEFT)
|
|
AND NOT IS_VEHICLE_DOOR_DAMAGED(veh, SC_DOOR_REAR_LEFT)
|
|
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<-0.8000, 0.0000, 0.1000>>), 0.538)
|
|
INT iDoorToBreak = GET_RANDOM_INT_IN_RANGE(0, 2)
|
|
|
|
IF iDoorToBreak = 0
|
|
SMASH_VEHICLE_WINDOW(veh, SC_WINDOW_FRONT_LEFT)
|
|
SET_VEHICLE_DOOR_BROKEN(veh, SC_DOOR_FRONT_LEFT, FALSE)
|
|
ELSE
|
|
SMASH_VEHICLE_WINDOW(veh, SC_WINDOW_REAR_LEFT)
|
|
SET_VEHICLE_DOOR_BROKEN(veh, SC_DOOR_REAR_LEFT, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_DOOR_DAMAGED(veh, SC_DOOR_FRONT_RIGHT)
|
|
AND NOT IS_VEHICLE_DOOR_DAMAGED(veh, SC_DOOR_REAR_RIGHT)
|
|
IF HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<0.8000, 0.0000, 0.1000>>), 0.538)
|
|
INT iDoorToBreak = GET_RANDOM_INT_IN_RANGE(0, 2)
|
|
|
|
IF iDoorToBreak = 0
|
|
SMASH_VEHICLE_WINDOW(veh, SC_WINDOW_FRONT_RIGHT)
|
|
SET_VEHICLE_DOOR_BROKEN(veh, SC_DOOR_FRONT_RIGHT, FALSE)
|
|
ELSE
|
|
SMASH_VEHICLE_WINDOW(veh, SC_WINDOW_REAR_RIGHT)
|
|
SET_VEHICLE_DOOR_BROKEN(veh, SC_DOOR_REAR_RIGHT, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC INT GET_NUM_FLANKING_ENEMIES_IN_PUSH_AREA()
|
|
INT i = 0
|
|
INT iNumEnemies = 0
|
|
|
|
REPEAT COUNT_OF(sNooseRope1) i
|
|
IF sNooseRope1[i].bIsCreated
|
|
IF NOT IS_PED_INJURED(sNooseRope1[i].ped)
|
|
iNumEnemies++
|
|
ENDIF
|
|
ELSE
|
|
iNumEnemies++
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
/*REPEAT COUNT_OF(sNooseAbove) i
|
|
IF sNooseAbove[i].bIsCreated
|
|
IF NOT IS_PED_INJURED(sNooseAbove[i].ped)
|
|
iNumEnemies++
|
|
ENDIF
|
|
ELSE
|
|
iNumEnemies++
|
|
ENDIF
|
|
ENDREPEAT*/
|
|
|
|
REPEAT COUNT_OF(sVanFlank) i
|
|
IF sVanFlank[i].bIsCreated
|
|
IF NOT IS_PED_INJURED(sVanFlank[i].ped)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(sVanFlank[i].ped, <<157.079086,-1204.959106,28.295168>>, <<128.503387,-1206.576416,40.295166>>, 32.000000)
|
|
iNumEnemies++
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iNumEnemies++
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
RETURN iNumEnemies
|
|
ENDFUNC
|
|
|
|
PROC REMOVE_OBJECT(OBJECT_INDEX &obj, BOOL bForceDelete = FALSE)
|
|
IF DOES_ENTITY_EXIST(obj)
|
|
IF IS_ENTITY_ATTACHED(obj)
|
|
DETACH_ENTITY(obj)
|
|
ENDIF
|
|
|
|
IF bForceDelete
|
|
DELETE_OBJECT(obj)
|
|
ELSE
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(obj)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REMOVE_VEHICLE(VEHICLE_INDEX &veh, BOOL bForceDelete = FALSE)
|
|
IF DOES_ENTITY_EXIST(veh)
|
|
IF NOT IS_ENTITY_DEAD(veh)
|
|
IF IS_ENTITY_ATTACHED(veh)
|
|
DETACH_ENTITY(veh)
|
|
ENDIF
|
|
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(veh, NORMAL_BLEND_OUT, TRUE)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_BELONG_TO_THIS_SCRIPT(veh, FALSE)
|
|
IF bForceDelete
|
|
DELETE_VEHICLE(veh)
|
|
ELSE
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(veh)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REMOVE_PED(PED_INDEX &ped, BOOL bForceDelete = FALSE)
|
|
IF DOES_ENTITY_EXIST(ped)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(ped, NORMAL_BLEND_OUT, TRUE)
|
|
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(ped, TRUE)
|
|
AND NOT IS_PED_GETTING_INTO_A_VEHICLE(ped)
|
|
IF IS_ENTITY_ATTACHED_TO_ANY_OBJECT(ped)
|
|
OR IS_ENTITY_ATTACHED_TO_ANY_PED(ped)
|
|
OR IS_ENTITY_ATTACHED_TO_ANY_VEHICLE(ped)
|
|
DETACH_ENTITY(ped)
|
|
ENDIF
|
|
|
|
FREEZE_ENTITY_POSITION(ped, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(ped)
|
|
SET_ENTITY_COLLISION(ped, TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_KEEP_TASK(ped, TRUE)
|
|
ENDIF
|
|
|
|
IF bForceDelete
|
|
DELETE_PED(ped)
|
|
ELSE
|
|
SET_PED_AS_NO_LONGER_NEEDED(ped)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ENEMY_GROUP(ENEMY_DATA &peds[], BOOL bForceDelete = FALSE)
|
|
INT i = 0
|
|
REPEAT COUNT_OF(peds) i
|
|
IF DOES_BLIP_EXIST(peds[i].blip)
|
|
REMOVE_BLIP(peds[i].blip)
|
|
ENDIF
|
|
|
|
CLEANUP_AI_PED_BLIP(peds[i].sBlipData)
|
|
|
|
REMOVE_COVER_POINT(peds[i].cover)
|
|
|
|
//Give them combat in most cases
|
|
IF NOT IS_PED_INJURED(peds[i].ped)
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(peds[i].ped)
|
|
AND GET_PED_RELATIONSHIP_GROUP_HASH(peds[i].ped) = relGroupCops
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
TASK_COMBAT_PED(peds[i].ped, PLAYER_PED_ID())
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
TASK_COMBAT_PED(peds[i].ped, sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
TASK_COMBAT_PED(peds[i].ped, sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
TASK_COMBAT_PED(peds[i].ped, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
ENDIF
|
|
|
|
//SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[i].ped, TRUE)
|
|
SET_PED_KEEP_TASK(peds[i].ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REMOVE_PED(peds[i].ped, bForceDelete)
|
|
|
|
peds[i].bIsCreated = FALSE
|
|
peds[i].iEvent = 0
|
|
peds[i].iRopeEvent = 0
|
|
peds[i].iTimer = 0
|
|
peds[i].cover = NULL
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
PROC SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(VEHICLE_INDEX &veh, FLOAT fTime)
|
|
IF NOT IS_ENTITY_DEAD(veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh)
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(veh, fTime - GET_TIME_POSITION_IN_RECORDING(veh))
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Converges a value towards a given destination, by adding/removing a given amount.
|
|
PROC CONVERGE_VALUE(FLOAT &val, FLOAT fDesiredVal, FLOAT fAmountToConverge, BOOL bAdjustForFramerate = FALSE)
|
|
IF val != fDesiredVal
|
|
FLOAT fConvergeAmountThisFrame = fAmountToConverge
|
|
IF bAdjustForFramerate
|
|
fConvergeAmountThisFrame = 0.0 +@ fAmountToConverge
|
|
ENDIF
|
|
|
|
IF val - fDesiredVal > fConvergeAmountThisFrame
|
|
val -= fConvergeAmountThisFrame
|
|
ELIF val - fDesiredVal < -fConvergeAmountThisFrame
|
|
val += fConvergeAmountThisFrame
|
|
ELSE
|
|
val = fDesiredVal
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DO_FADE_OUT_WITH_WAIT(BOOL bHideHud = FALSE)
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
IF NOT IS_SCREEN_FADING_OUT()
|
|
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
IF bHideHud
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DO_FADE_IN_WITH_WAIT()
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_BLIPS()
|
|
IF DOES_BLIP_EXIST(blipCurrentObjective)
|
|
REMOVE_BLIP(blipCurrentObjective)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(blipChaseChopper)
|
|
REMOVE_BLIP(blipChaseChopper)
|
|
ENDIF
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(sGoldCars) i
|
|
IF DOES_BLIP_EXIST(sGoldCars[i].blip)
|
|
REMOVE_BLIP(sGoldCars[i].blip)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(sGoldVans) i
|
|
IF DOES_BLIP_EXIST(sGoldVans[i].blip)
|
|
REMOVE_BLIP(sGoldVans[i].blip)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(sGoldVanPeds) i
|
|
IF DOES_BLIP_EXIST(sGoldVanPeds[i].blip)
|
|
REMOVE_BLIP(sGoldVanPeds[i].blip)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(sCrew) i
|
|
IF DOES_BLIP_EXIST(sCrew[i].blip)
|
|
REMOVE_BLIP(sCrew[i].blip)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF DOES_BLIP_EXIST(sBankWorker.blip)
|
|
REMOVE_BLIP(sBankWorker.blip)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sTrevor.blip)
|
|
REMOVE_BLIP(sTrevor.blip)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sFranklin.blip)
|
|
REMOVE_BLIP(sFranklin.blip)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sMichael.blip)
|
|
REMOVE_BLIP(sMichael.blip)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_OBJECTS(BOOL bForceDelete = FALSE)
|
|
INT i = 0
|
|
REPEAT COUNT_OF(objGoldTrolleys) i
|
|
REMOVE_OBJECT(objGoldTrolleys[i], bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(objEmptyTrolleys) i
|
|
REMOVE_OBJECT(objEmptyTrolleys[i], bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(objSecurityBarriers) i
|
|
REMOVE_OBJECT(objSecurityBarriers[i], bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(objSecurityGateCollision) i
|
|
REMOVE_OBJECT(objSecurityGateCollision[i], bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(objGoldBarsDriver) i
|
|
REMOVE_OBJECT(objGoldBarsDriver[i], bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(objGoldBarsGunman) i
|
|
REMOVE_OBJECT(objGoldBarsGunman[i], bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(objLaptops) i
|
|
REMOVE_OBJECT(objLaptops[i], bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(objMichaelsHouseDoors) i
|
|
REMOVE_OBJECT(objMichaelsHouseDoors[i], bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REMOVE_OBJECT(objStinger, bForceDelete)
|
|
REMOVE_OBJECT(objMachineGun, bForceDelete)
|
|
REMOVE_OBJECT(objIDCard, bForceDelete)
|
|
REMOVE_OBJECT(objFakeVaultDoor, TRUE)
|
|
REMOVE_OBJECT(objWalkieTalkie, bForceDelete)
|
|
REMOVE_OBJECT(objBankWorkerWalkieTalkie, bForceDelete)
|
|
//REMOVE_OBJECT(objShootoutPallet, FALSE)
|
|
REMOVE_OBJECT(objShootoutCover, bForceDelete)
|
|
REMOVE_OBJECT(objBeer, bForceDelete)
|
|
REMOVE_OBJECT(objwalkingStick, bForceDelete)
|
|
REMOVE_OBJECT(objMichaelsWeapon, bForceDelete)
|
|
REMOVE_OBJECT(objTrevorsWeapon, bForceDelete)
|
|
REMOVE_OBJECT(objGunmansWeapon, bForceDelete)
|
|
REMOVE_OBJECT(objDriversWeapon, bForceDelete)
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_PEDS(BOOL bForceDelete = FALSE)
|
|
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], bForceDelete)
|
|
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], bForceDelete)
|
|
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], bForceDelete)
|
|
REMOVE_PED(sTrevor.ped, bForceDelete)
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(sGoldVanPeds) i
|
|
REMOVE_PED(sGoldVanPeds[i].ped, bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(sCrew) i
|
|
REMOVE_PED(sCrew[i].ped, bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REMOVE_PED(sBankWorker.ped, bForceDelete)
|
|
REMOVE_PED(sVaultWorker.ped, bForceDelete)
|
|
REMOVE_PED(pedGateSecurity, bForceDelete)
|
|
|
|
REMOVE_ENEMY_GROUP(sCopsStart, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sCopsWave2, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sVanFlank, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sVanCrash, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sNooseRope1, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sNooseAbove, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sGoonsWave3b, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sGoonsSnipe, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sInfiniteEnemiesFront, bForceDelete)
|
|
REMOVE_ENEMY_GROUP(sInfiniteEnemiesFlank, bForceDelete)
|
|
|
|
REMOVE_ENEMY_GROUP(sChaseCopsBlockade, bForceDelete)
|
|
|
|
REMOVE_PED(pedGateSecurity, bForceDelete)
|
|
REMOVE_PED(pedHeliGunner, bForceDelete)
|
|
REMOVE_PED(pedLester, bForceDelete)
|
|
|
|
REPEAT COUNT_OF(pedChaseCops) i
|
|
REMOVE_PED(pedChaseCops[i], bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(sTrafficGameCops) i
|
|
REMOVE_PED(sTrafficGameCops[i].ped, bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(sTrafficGameCars) i
|
|
REMOVE_PED(sTrafficGameCars[i].ped, bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(pedEndCops) i
|
|
REMOVE_PED(pedEndCops[i], bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(pedChaseBlockade2) i
|
|
REMOVE_PED(pedChaseBlockade2[i], bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(pedChaseBlockadeMall) i
|
|
REMOVE_PED(pedChaseBlockadeMall[i], bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(pedHobos) i
|
|
REMOVE_PED(pedHobos[i], bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(sChaseCops) i
|
|
REMOVE_PED(sChaseCops[i].ped, bForceDelete)
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_VEHICLES(BOOL bForceDelete = FALSE)
|
|
INT i = 0
|
|
|
|
REPEAT COUNT_OF(sGoldCars) i
|
|
REMOVE_VEHICLE(sGoldCars[i].veh, bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(sGoldVans) i
|
|
REMOVE_VEHICLE(sGoldVans[i].veh, bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(sTrafficGameCops) i
|
|
REMOVE_VEHICLE(sTrafficGameCops[i].veh, bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(sTrafficGameCops) i
|
|
REMOVE_VEHICLE(sTrafficGameCars[i].veh, bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(vehRampHackCars) i
|
|
REMOVE_VEHICLE(vehRampHackCars[i], TRUE)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(vehChaseCopsBlockade) i
|
|
REMOVE_VEHICLE(vehChaseCopsBlockade[i], bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(vehChaseCops) i
|
|
REMOVE_VEHICLE(vehChaseCops[i], bForceDelete)
|
|
ENDREPEAT
|
|
|
|
REMOVE_VEHICLE(sGoldTruck.veh, bForceDelete)
|
|
REMOVE_VEHICLE(vehCopsStart[0], bForceDelete)
|
|
REMOVE_VEHICLE(vehCopsStart[1], bForceDelete)
|
|
REMOVE_VEHICLE(vehChaseTrigger, bForceDelete)
|
|
REMOVE_VEHICLE(vehTrailer[0], bForceDelete)
|
|
REMOVE_VEHICLE(vehTrailer[1], bForceDelete)
|
|
REMOVE_VEHICLE(vehFranklinsBike, bForceDelete)
|
|
REMOVE_VEHICLE(vehBuddyVan, bForceDelete)
|
|
REMOVE_VEHICLE(vehCopsWave2, bForceDelete)
|
|
REMOVE_VEHICLE(vehNooseWave1, bForceDelete)
|
|
REMOVE_VEHICLE(vehGoons3a, bForceDelete)
|
|
REMOVE_VEHICLE(vehGoons3b, bForceDelete)
|
|
REMOVE_VEHICLE(vehVanCrash, bForceDelete)
|
|
REMOVE_VEHICLE(vehNooseChopper1, bForceDelete)
|
|
REMOVE_VEHICLE(sStartCar.veh, bForceDelete)
|
|
REMOVE_VEHICLE(vehEndTrucks[0], bForceDelete)
|
|
REMOVE_VEHICLE(vehEndTrucks[1], bForceDelete)
|
|
REMOVE_VEHICLE(vehEndTrailers[0], bForceDelete)
|
|
REMOVE_VEHICLE(vehEndTrailers[1], bForceDelete)
|
|
REMOVE_VEHICLE(vehEndHeli, bForceDelete)
|
|
REMOVE_VEHICLE(vehTanker, bForceDelete)
|
|
REMOVE_VEHICLE(vehRampHackTruck, TRUE)
|
|
REMOVE_VEHICLE(vehPreMissionCar, FALSE)
|
|
REMOVE_VEHICLE(vehCamCar, FALSE)
|
|
REMOVE_VEHICLE(vehMichaelsCar, bForceDelete)
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehTrain)
|
|
DELETE_MISSION_TRAIN(vehTrain)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_CAMERAS()
|
|
IF DOES_CAM_EXIST(camMain)
|
|
DESTROY_CAM(camMain)
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(camAttach)
|
|
DESTROY_CAM(camAttach)
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(camInterp)
|
|
DESTROY_CAM(camInterp)
|
|
ENDIF
|
|
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
SET_WIDESCREEN_BORDERS(FALSE, 0)
|
|
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_ANIMS()
|
|
REMOVE_ANIM_DICT(strRappelAnims)
|
|
REMOVE_ANIM_DICT(strStingerAnims)
|
|
REMOVE_ANIM_DICT(strAnimIG1)
|
|
REMOVE_ANIM_DICT(strAnimIG2)
|
|
REMOVE_ANIM_DICT(strAnimIG3)
|
|
REMOVE_ANIM_DICT(strAnimIG5)
|
|
REMOVE_ANIM_DICT(strAnimIG6)
|
|
REMOVE_ANIM_DICT(strAnimIG7Driver)
|
|
REMOVE_ANIM_DICT(strAnimIG7Gunman)
|
|
REMOVE_ANIM_DICT(strVaultWorkerAnims)
|
|
REMOVE_ANIM_DICT(strManagerLeadOut)
|
|
REMOVE_ANIM_DICT(strAnimLiftLeadOut)
|
|
REMOVE_ANIM_DICT(strVanArriveCamAnim)
|
|
REMOVE_ANIM_DICT(strTrailerRampAnims)
|
|
REMOVE_ANIM_DICT(strAnimsHijack)
|
|
REMOVE_ANIM_DICT(strAnimsTrafficSwitch)
|
|
REMOVE_ANIM_DICT(strAnimsCamShake)
|
|
REMOVE_ANIM_DICT(strAnimsLesterLeadIn)
|
|
REMOVE_ANIM_DICT("map_objects")
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_AUDIO()
|
|
IF bTrafficGameAudioSceneActive
|
|
STOP_AUDIO_SCENE("BIG_SCORE_TRAFFIC_CONTROL_SCENE")
|
|
bTrafficGameAudioSceneActive = FALSE
|
|
ENDIF
|
|
|
|
IF bFranklinsBikeAudioSceneActive
|
|
STOP_AUDIO_SCENE("BIG_SCORE_2A_Boost_Franklins_Bike")
|
|
bFranklinsBikeAudioSceneActive = FALSE
|
|
ENDIF
|
|
|
|
STOP_STREAM()
|
|
|
|
IF NOT HAS_SOUND_FINISHED(sTrafficGame.iBackgroundSound)
|
|
STOP_SOUND(sTrafficGame.iBackgroundSound)
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(sTrafficGame.iStaticSound)
|
|
STOP_SOUND(sTrafficGame.iStaticSound)
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(sTrafficGame.iSelectSound)
|
|
STOP_SOUND(sTrafficGame.iSelectSound)
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iLiftSoundID)
|
|
STOP_SOUND(iLiftSoundID)
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iLiftMoveSoundID)
|
|
STOP_SOUND(iLiftMoveSoundID)
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iBankGateOpenSound)
|
|
STOP_SOUND(iBankGateOpenSound)
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iVaultDoorCloseSoundID)
|
|
STOP_SOUND(iVaultDoorCloseSoundID)
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iVaultDoorOpenSoundID)
|
|
STOP_SOUND(iVaultDoorOpenSoundID)
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iGoldTrolleySoundID[0])
|
|
STOP_SOUND(iGoldTrolleySoundID[0])
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iGoldTrolleySoundID[1])
|
|
STOP_SOUND(iGoldTrolleySoundID[1])
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iTrailerRampSounds[0])
|
|
STOP_SOUND(iTrailerRampSounds[0])
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iTrailerRampSounds[1])
|
|
STOP_SOUND(iTrailerRampSounds[1])
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iTrailerRampRaiseSounds[0])
|
|
STOP_SOUND(iTrailerRampRaiseSounds[0])
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iTrailerRampRaiseSounds[1])
|
|
STOP_SOUND(iTrailerRampRaiseSounds[1])
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iWooshSoundID)
|
|
STOP_SOUND(iWooshSoundID)
|
|
ENDIF
|
|
|
|
SET_AUDIO_FLAG("AllowScoreAndRadio", FALSE)
|
|
SET_USER_RADIO_CONTROL_ENABLED(TRUE)
|
|
|
|
IF NOT bMissionFailed //This will have already triggered in that case.
|
|
TRIGGER_MUSIC_EVENT("FH2A_MISSION_FAIL")
|
|
ENDIF
|
|
|
|
RELEASE_SCRIPT_AUDIO_BANK()
|
|
ENDPROC
|
|
|
|
PROC REMOVE_ALL_AUDIO_SCENES()
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_TUNNEL")
|
|
STOP_AUDIO_SCENE("BS_2A_GET_TO_TUNNEL")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_TRUCKS_ARRIVE")
|
|
STOP_AUDIO_SCENE("BS_2A_TRUCKS_ARRIVE")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_DROP_STINGER")
|
|
STOP_AUDIO_SCENE("BS_2A_DROP_STINGER")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_DRIVE_TO_BANK")
|
|
STOP_AUDIO_SCENE("BS_2A_DRIVE_TO_BANK")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_PARK_UP_CUTSCENE")
|
|
STOP_AUDIO_SCENE("BS_2A_PARK_UP_CUTSCENE")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_FOLLOW_MANAGER")
|
|
STOP_AUDIO_SCENE("BS_2A_FOLLOW_MANAGER")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_LEAVE_BANK")
|
|
STOP_AUDIO_SCENE("BS_2A_LEAVE_BANK")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_TRAFFIC_CONTROL_STAGE")
|
|
STOP_AUDIO_SCENE("BS_2A_TRAFFIC_CONTROL_STAGE")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_INTERSECTION_CAM")
|
|
STOP_AUDIO_SCENE("BS_2A_INTERSECTION_CAM")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_SHOOTOUT")
|
|
STOP_AUDIO_SCENE("BS_2A_SHOOTOUT")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_01")
|
|
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_01")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_02")
|
|
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_02")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_03")
|
|
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_03")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_04")
|
|
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_04")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CHASE_MAIN")
|
|
STOP_AUDIO_SCENE("BS_2A_CHASE_MAIN")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_STUNT_JUMP")
|
|
STOP_AUDIO_SCENE("BS_2A_STUNT_JUMP")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_DRIVE_INTO_TRUCK")
|
|
STOP_AUDIO_SCENE("BS_2A_DRIVE_INTO_TRUCK")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_VAULT")
|
|
STOP_AUDIO_SCENE("BS_2A_GET_TO_VAULT")
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// Cancels any music events from this mission that may
|
|
PROC CANCEL_ALL_PREPARED_MUSIC_EVENTS()
|
|
CANCEL_MUSIC_EVENT("FH2A_MISSION_START_ST")
|
|
CANCEL_MUSIC_EVENT("FH2A_MISSION_START_OS")
|
|
CANCEL_MUSIC_EVENT("FH2A_ENTER_BANK_MA")
|
|
CANCEL_MUSIC_EVENT("FH2A_BANK_MID")
|
|
CANCEL_MUSIC_EVENT("FH2A_LEAVE_BANK_MA")
|
|
CANCEL_MUSIC_EVENT("FH2A_TRAFFIC_START")
|
|
CANCEL_MUSIC_EVENT("FH2A_FIGHT_MID")
|
|
CANCEL_MUSIC_EVENT("FH2A_FIGHT_DROP")
|
|
CANCEL_MUSIC_EVENT("FH2A_GETAWAY_DRIVE_MA")
|
|
CANCEL_MUSIC_EVENT("FH2A_JUMP_START")
|
|
CANCEL_MUSIC_EVENT("FH2A_ENTER_TRUCK")
|
|
ENDPROC
|
|
|
|
PROC DISPLAY_TAKE()
|
|
IF iDisplayedTake != iCurrentTake
|
|
//IF HAS_SOUND_FINISHED(iMoneyCountSoundID)
|
|
// PLAY_SOUND_FRONTEND(iMoneyCountSoundID, "ROBBERY_MONEY_TOTAL", "HUD_FRONTEND_CUSTOM_SOUNDSET")
|
|
//ENDIF
|
|
|
|
IF iDisplayedTake > iCurrentTake
|
|
iDisplayedTake = iDisplayedTake - ROUND(0 +@ 3750000)
|
|
|
|
IF iDisplayedTake < iCurrentTake
|
|
iDisplayedTake = iCurrentTake
|
|
ENDIF
|
|
ELSE
|
|
iDisplayedTake = iDisplayedTake + ROUND(0 +@ 3750000)
|
|
|
|
IF iDisplayedTake > iCurrentTake
|
|
iDisplayedTake = iCurrentTake
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//IF NOT HAS_SOUND_FINISHED(iMoneyCountSoundID)
|
|
// STOP_SOUND(iMoneyCountSoundID)
|
|
//ENDIF
|
|
ENDIF
|
|
|
|
//SET_FAR_RIGHT_TITLE_POSITION_HUD_THIS_FRAME()
|
|
MPGlobalsScoreHud.bTitleExtraLeftJustified = TRUE
|
|
|
|
IF iDisplayedTake > iCurrentTake
|
|
DRAW_GENERIC_SCORE(iDisplayedTake, "CMN_TAKE", HEIST_TAKE_DISPLAY_FLASH_TIME, HUD_COLOUR_RED, HUDORDER_DONTCARE, FALSE, "HUD_CASH", FALSE, 0.0, HUDFLASHING_FLASHWHITE, 250)
|
|
ELSE
|
|
DRAW_GENERIC_SCORE(iDisplayedTake, "CMN_TAKE", HEIST_TAKE_DISPLAY_FLASH_TIME, HUD_COLOUR_GREEN, HUDORDER_DONTCARE, FALSE, "HUD_CASH", FALSE, 0.0, HUDFLASHING_FLASHWHITE, 250)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
///NOTE: this is bad as it relies on global values, it's not obvious that these are calculated beforehand.
|
|
FUNC INT CONVERT_SHOOTOUT_PROGRESS_INTO_TAKE(INT iMaxTake)
|
|
INT iAliveEnemies = iNumAliveCopsStart
|
|
iAliveEnemies += iNumAliveCopsWave2
|
|
iAliveEnemies += iNumAliveVanFlank
|
|
iAliveEnemies += iNumAliveVanCrash
|
|
iAliveEnemies += iNumAliveNooseRope1
|
|
//iAliveEnemies += iNumAliveNooseAbove
|
|
iAliveEnemies += iNumAliveGoonsWave3b
|
|
|
|
RETURN ROUND((TO_FLOAT(iMaxTake) / TO_FLOAT(iTotalEnemiesInShootout)) * TO_FLOAT(iTotalEnemiesInShootout - iAliveEnemies))
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(PED_INDEX ped)
|
|
IF NOT IS_PED_RAGDOLL(ped)
|
|
AND NOT IS_PED_GETTING_UP(ped)
|
|
AND NOT IS_PED_IN_COMBAT(ped)
|
|
AND NOT IS_PED_RELOADING(ped)
|
|
AND IS_PED_WEAPON_READY_TO_SHOOT(ped)
|
|
WEAPON_TYPE eCurrentWeapon
|
|
WEAPON_GROUP eCurrentGroup
|
|
|
|
GET_CURRENT_PED_WEAPON(ped, eCurrentWeapon)
|
|
eCurrentGroup = GET_WEAPONTYPE_GROUP(eCurrentWeapon)
|
|
|
|
IF eCurrentGroup != WEAPONGROUP_MELEE
|
|
AND eCurrentGroup != WEAPONGROUP_INVALID
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
///Used during the chase end cutscene: creates a random car.
|
|
PROC CREATE_RANDOM_CAR_AT_POS(MODEL_NAMES model, VECTOR vPos, FLOAT fHeading)
|
|
IF CAN_CREATE_RANDOM_DRIVER()
|
|
VEHICLE_INDEX vehRandom
|
|
PED_INDEX pedRandom
|
|
|
|
CLEAR_AREA(vPos, 2.0, TRUE)
|
|
|
|
vehRandom = CREATE_VEHICLE(model, vPos, fHeading)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vehRandom)
|
|
|
|
pedRandom = CREATE_RANDOM_PED_AS_DRIVER(vehRandom)
|
|
TASK_VEHICLE_MISSION(pedRandom, vehRandom, NULL, MISSION_CRUISE, 15.0, DRIVINGMODE_STOPFORCARS, 5.0, 5.0)
|
|
SET_PED_KEEP_TASK(pedRandom, TRUE)
|
|
|
|
SET_VEHICLE_FORWARD_SPEED(vehRandom, 15.0)
|
|
|
|
SET_PED_AS_NO_LONGER_NEEDED(pedRandom)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehRandom)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//Manage Franklin: he drives off and is deleted once out of view.
|
|
PROC UPDATE_FRANKLIN_ON_BIKE()
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF DOES_ENTITY_EXIST(vehFranklinsBike)
|
|
AND IS_VEHICLE_DRIVEABLE(vehFranklinsBike)
|
|
//SEQUENCE_INDEX seq
|
|
IF NOT bPlayedFranklinsBikeRevSound
|
|
SET_VEHICLE_STARTUP_REV_SOUND(vehFranklinsBike, "Franklin_Bike_Rev", "BIG_SCORE_3A_SOUNDS")
|
|
|
|
bPlayedFranklinsBikeRevSound = TRUE
|
|
ENDIF
|
|
|
|
IF NOT bFranklinsBikeAudioSceneActive
|
|
START_AUDIO_SCENE("BIG_SCORE_2A_Boost_Franklins_Bike")
|
|
bFranklinsBikeAudioSceneActive = TRUE
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], vehFranklinsBike)
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
|
|
TASK_ENTER_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], vehFranklinsBike, -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF IS_PED_SITTING_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], vehFranklinsBike)
|
|
IF VDIST2(<<661.1089, -231.6551, 42.6443>>, GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])) < 25.0
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_VEHICLE_DRIVE_WANDER) != PERFORMING_TASK
|
|
TASK_VEHICLE_DRIVE_WANDER(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], vehFranklinsBike, 30.0, DRIVINGMODE_AVOIDCARS)
|
|
ENDIF
|
|
ELSE
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_VEHICLE_DRIVE_TO_COORD) != PERFORMING_TASK
|
|
AND GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
SEQUENCE_INDEX seq
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_PAUSE(NULL, 1700)
|
|
TASK_VEHICLE_DRIVE_TO_COORD(NULL, vehFranklinsBike, <<661.1089, -231.6551, 42.6443>>, 30.0, DRIVINGSTYLE_NORMAL,
|
|
GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_BIKE), DRIVINGMODE_AVOIDCARS, 3.0, 3.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])) > 2500.0
|
|
IF NOT IS_ENTITY_ON_SCREEN(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
DELETE_VEHICLE(vehFranklinsBike)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//The bike was destroyed: the mission will eventually fail so just have Franklin flee.
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_SMART_FLEE_POINT) != PERFORMING_TASK
|
|
TASK_SMART_FLEE_COORD(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], GET_ENTITY_COORDS(PLAYER_PED_ID()), 200.0, -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
///Handles the idle synchronised scenes for the bank security: randomly plays from a number of possible anims.
|
|
PROC UPDATE_SECURITY_GUARD_IDLES()
|
|
IF NOT IS_PED_INJURED(pedGateSecurity)
|
|
REQUEST_ANIM_DICT(strAnimIG1)
|
|
|
|
IF HAS_ANIM_DICT_LOADED(strAnimIG1)
|
|
//VECTOR vScenePos = <<-72.327, -677.107, 32.747>>
|
|
//VECTOR vSceneRot = <<-0.000, -0.000, -113.414>>
|
|
|
|
IF NOT IS_PED_RAGDOLL(pedGateSecurity)
|
|
TEXT_LABEL strCurrentAnim = ""
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(pedGateSecurity, strAnimIG1, "Wait_Gate_A")
|
|
strCurrentAnim = "Wait_Gate_A"
|
|
ELIF IS_ENTITY_PLAYING_ANIM(pedGateSecurity, strAnimIG1, "Wait_Gate_B")
|
|
strCurrentAnim = "Wait_Gate_B"
|
|
ELIF IS_ENTITY_PLAYING_ANIM(pedGateSecurity, strAnimIG1, "Wait_Gate_C")
|
|
strCurrentAnim = "Wait_Gate_C"
|
|
ELIF IS_ENTITY_PLAYING_ANIM(pedGateSecurity, strAnimIG1, "Wait_Gate_D")
|
|
strCurrentAnim = "Wait_Gate_D"
|
|
ENDIF
|
|
|
|
IF IS_STRING_NULL_OR_EMPTY(strCurrentAnim)
|
|
OR (IS_ENTITY_PLAYING_ANIM(pedGateSecurity, strAnimIG1, strCurrentAnim) AND GET_ENTITY_ANIM_CURRENT_TIME(pedGateSecurity, strAnimIG1, strCurrentAnim) > 0.99)
|
|
INT iRandom = GET_RANDOM_INT_IN_RANGE(0, 4)
|
|
|
|
IF iRandom = 0
|
|
TASK_PLAY_ANIM(pedGateSecurity, strAnimIG1, "Wait_Gate_A", DEFAULT, DEFAULT, DEFAULT, AF_USE_KINEMATIC_PHYSICS)
|
|
ELIF iRandom = 1
|
|
TASK_PLAY_ANIM(pedGateSecurity, strAnimIG1, "Wait_Gate_B", DEFAULT, DEFAULT, DEFAULT, AF_USE_KINEMATIC_PHYSICS)
|
|
ELIF iRandom = 2
|
|
TASK_PLAY_ANIM(pedGateSecurity, strAnimIG1, "Wait_Gate_C", DEFAULT, DEFAULT, DEFAULT, AF_USE_KINEMATIC_PHYSICS)
|
|
ELSE
|
|
TASK_PLAY_ANIM(pedGateSecurity, strAnimIG1, "Wait_Gate_D", DEFAULT, DEFAULT, DEFAULT, AF_USE_KINEMATIC_PHYSICS)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
/*IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneSecurityWait)
|
|
OR (IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneSecurityWait) AND GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneSecurityWait) > 0.99)
|
|
INT iRandom = GET_RANDOM_INT_IN_RANGE(0, 4)
|
|
iSyncSceneSecurityWait = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
|
|
|
|
IF iRandom = 0
|
|
TASK_SYNCHRONIZED_SCENE(pedGateSecurity, iSyncSceneSecurityWait, strAnimIG1, "Wait_Gate_A", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
|
|
ELIF iRandom = 1
|
|
TASK_SYNCHRONIZED_SCENE(pedGateSecurity, iSyncSceneSecurityWait, strAnimIG1, "Wait_Gate_B", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
|
|
ELIF iRandom = 2
|
|
TASK_SYNCHRONIZED_SCENE(pedGateSecurity, iSyncSceneSecurityWait, strAnimIG1, "Wait_Gate_C", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
|
|
ELSE
|
|
TASK_SYNCHRONIZED_SCENE(pedGateSecurity, iSyncSceneSecurityWait, strAnimIG1, "Wait_Gate_D", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
|
|
ENDIF
|
|
ENDIF*/
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC UPDATE_BANK_EMPLOYEE_IDLES()
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
AND NOT IS_PED_RAGDOLL(sBankWorker.ped)
|
|
REQUEST_ANIM_DICT(strAnimIG3)
|
|
|
|
IF HAS_ANIM_DICT_LOADED(strAnimIG3)
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(sBankWorker.ped, strAnimIG3, "Wait_For_Van_Base")
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(sBankWorker.ped, strAnimIG3, "Wait_For_Van_A")
|
|
AND NOT IS_ENTITY_PLAYING_ANIM(sBankWorker.ped, strAnimIG3, "Wait_For_Van_B")
|
|
AND NOT IS_ENTITY_PLAYING_ANIM(sBankWorker.ped, strAnimIG3, "Wait_For_Van_C")
|
|
//Worker isn't playing any anim, so play the idle.
|
|
TASK_PLAY_ANIM(sBankWorker.ped, strAnimIG3, "Wait_For_Van_Base", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
|
|
iBankWorkerIdleTimer = 0
|
|
ENDIF
|
|
ELSE
|
|
IF eMissionStage = STAGE_DRIVE_TO_BANK //Only play the variations when the player hasn't arrived yet.
|
|
IF iBankWorkerIdleTimer = 0
|
|
iBankWorkerIdleTimer = GET_GAME_TIMER() + (GET_RANDOM_INT_IN_RANGE(12000, 15000))
|
|
ELIF GET_GAME_TIMER() - iBankWorkerIdleTimer > 0
|
|
SEQUENCE_INDEX seq
|
|
INT iRandom = GET_RANDOM_INT_IN_RANGE(0, 3)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF iRandom = 0
|
|
TASK_PLAY_ANIM(NULL, strAnimIG3, "Wait_For_Van_A", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1)
|
|
ELIF iRandom = 1
|
|
TASK_PLAY_ANIM(NULL, strAnimIG3, "Wait_For_Van_B", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1)
|
|
ELSE
|
|
TASK_PLAY_ANIM(NULL, strAnimIG3, "Wait_For_Van_C", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1)
|
|
ENDIF
|
|
|
|
TASK_PLAY_ANIM(NULL, strAnimIG3, "Wait_For_Van_Base", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
iBankWorkerIdleTimer = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC UPDATE_VAULT_WORKER_IDLES(BOOL bPlayInstantly = FALSE)
|
|
IF NOT IS_PED_INJURED(sVaultWorker.ped)
|
|
AND NOT IS_PED_RAGDOLL(sVaultWorker.ped)
|
|
REQUEST_ANIM_DICT(strVaultWorkerAnims)
|
|
|
|
IF HAS_ANIM_DICT_LOADED(strVaultWorkerAnims)
|
|
BOOL bPlayAnim = FALSE
|
|
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(sVaultWorker.ped, strVaultWorkerAnims, "wait_idle_a")
|
|
AND NOT IS_ENTITY_PLAYING_ANIM(sVaultWorker.ped, strVaultWorkerAnims, "wait_idle_b")
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iVaultWorkerSyncScene)
|
|
bPlayAnim = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF IS_ENTITY_PLAYING_ANIM(sVaultWorker.ped, strVaultWorkerAnims, "wait_idle_a")
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(sVaultWorker.ped, strVaultWorkerAnims, "wait_idle_a") > 0.99
|
|
bPlayAnim = TRUE
|
|
ENDIF
|
|
ELSE IS_ENTITY_PLAYING_ANIM(sVaultWorker.ped, strVaultWorkerAnims, "wait_idle_b")
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(sVaultWorker.ped, strVaultWorkerAnims, "wait_idle_b") > 0.99
|
|
bPlayAnim = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bPlayAnim
|
|
INT iRandom = GET_RANDOM_INT_IN_RANGE(0, 2)
|
|
FLOAT fBlendInTime = NORMAL_BLEND_IN
|
|
|
|
IF bPlayInstantly
|
|
fBlendInTime = INSTANT_BLEND_IN
|
|
ENDIF
|
|
|
|
IF iRandom = 0
|
|
TASK_PLAY_ANIM(sVaultWorker.ped, strVaultWorkerAnims, "wait_idle_a", fBlendInTime, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
|
|
ELIF iRandom = 1
|
|
TASK_PLAY_ANIM(sVaultWorker.ped, strVaultWorkerAnims, "wait_idle_b", fBlendInTime, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
|
|
ENDIF
|
|
|
|
IF bPlayInstantly
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sVaultWorker.ped)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Performs a given action on a pair of lift doors.
|
|
FUNC BOOL PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_ACTION eAction, VECTOR vLeftDoor, VECTOR vRightDoor, MODEL_NAMES modelDoor, BOOL bPlaySound = TRUE)
|
|
BOOL bLockState
|
|
|
|
SWITCH eAction
|
|
CASE LIFT_DOOR_INSTANT_CLOSE
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelDoor, vLeftDoor, TRUE, 0.0, 0.0, 0.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelDoor, vRightDoor, TRUE, 0.0, 0.0, 0.0)
|
|
|
|
RETURN TRUE
|
|
BREAK
|
|
|
|
CASE LIFT_DOOR_INSTANT_OPEN
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelDoor, vLeftDoor, TRUE, 0.0, 0.0, -1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelDoor, vRightDoor, TRUE, 0.0, 0.0, -1.0)
|
|
|
|
RETURN TRUE
|
|
BREAK
|
|
|
|
CASE LIFT_DOOR_UNLOCK
|
|
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vLeftDoor, 2.0, modelDoor)
|
|
GET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vLeftDoor, bLockState, fLiftOpenRatio)
|
|
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vLeftDoor, FALSE, fLiftOpenRatio)
|
|
ENDIF
|
|
|
|
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vRightDoor, 2.0, modelDoor)
|
|
GET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vRightDoor, bLockState, fLiftOpenRatio)
|
|
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vRightDoor, FALSE, fLiftOpenRatio)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
BREAK
|
|
|
|
CASE LIFT_DOOR_WAIT_FOR_OPEN_THEN_LOCK
|
|
IF iLiftDoorIndex = 0
|
|
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vLeftDoor, 2.0, modelDoor)
|
|
GET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vLeftDoor, bLockState, fLiftOpenRatio)
|
|
IF fLiftOpenRatio < -0.99
|
|
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vLeftDoor, TRUE, -1.0)
|
|
fLiftOpenRatio = -1.0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iLiftDoorIndex = 1
|
|
ELSE
|
|
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vRightDoor, 2.0, modelDoor)
|
|
GET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vRightDoor, bLockState, fLiftOpenRatio)
|
|
IF fLiftOpenRatio < -0.99
|
|
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vRightDoor, TRUE, -1.0)
|
|
fLiftOpenRatio = -1.0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iLiftDoorIndex = 0
|
|
ENDIF
|
|
|
|
IF bPlaySound
|
|
IF NOT bPlayedLiftSound
|
|
IF fLiftOpenRatio < 0.0
|
|
PLAY_SOUND_FROM_COORD(iLiftSoundID, "FREIGHT_ELEVATOR_01_DOOR_OPEN", vLeftDoor)
|
|
bPlayedLiftSound = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fLiftOpenRatio = -1.0
|
|
IF NOT HAS_SOUND_FINISHED(iLiftSoundID)
|
|
STOP_SOUND(iLiftSoundID)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE LIFT_DOOR_CLOSE
|
|
fLiftOpenRatio = fLiftOpenRatio -@ 0.6
|
|
IF fLiftOpenRatio < 0.0
|
|
fLiftOpenRatio = 0.0
|
|
ENDIF
|
|
|
|
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vLeftDoor, 2.0, modelDoor)
|
|
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vLeftDoor, TRUE, -fLiftOpenRatio)
|
|
ENDIF
|
|
|
|
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vRightDoor, 2.0, modelDoor)
|
|
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vRightDoor, TRUE, -fLiftOpenRatio)
|
|
ENDIF
|
|
|
|
IF bPlaySound
|
|
IF NOT bPlayedLiftSound
|
|
PLAY_SOUND_FROM_COORD(iLiftSoundID, "FREIGHT_ELEVATOR_01_DOOR_CLOSE", vLeftDoor)
|
|
bPlayedLiftSound = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fLiftOpenRatio = 0.0
|
|
IF NOT HAS_SOUND_FINISHED(iLiftSoundID)
|
|
STOP_SOUND(iLiftSoundID)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE LIFT_DOOR_OPEN
|
|
fLiftOpenRatio = fLiftOpenRatio -@ 0.6
|
|
IF fLiftOpenRatio < -1.0
|
|
fLiftOpenRatio = -1.0
|
|
ENDIF
|
|
|
|
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vLeftDoor, 2.0, modelDoor)
|
|
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vLeftDoor, TRUE, fLiftOpenRatio)
|
|
ENDIF
|
|
|
|
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vRightDoor, 2.0, modelDoor)
|
|
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelDoor, vRightDoor, TRUE, fLiftOpenRatio)
|
|
ENDIF
|
|
|
|
IF bPlaySound
|
|
IF NOT bPlayedLiftSound
|
|
PLAY_SOUND_FROM_COORD(iLiftSoundID, "FREIGHT_ELEVATOR_01_DOOR_OPEN", vLeftDoor)
|
|
bPlayedLiftSound = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fLiftOpenRatio = -1.0
|
|
IF NOT HAS_SOUND_FINISHED(iLiftSoundID)
|
|
STOP_SOUND(iLiftSoundID)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC CLOSE_TUNNEL_PAVEMENTS(BOOL bClose)
|
|
IF bClose
|
|
SET_PED_PATHS_IN_AREA(<<282.5752, -675.0562, 20.0>>, <<347.5317, -630.0744, 35.0>>, FALSE)
|
|
SET_PED_NON_CREATION_AREA(<<282.5752, -675.0562, 20.0>>, <<347.5317, -630.0744, 35.0>>)
|
|
ELSE
|
|
SET_PED_PATHS_BACK_TO_ORIGINAL(<<282.5752, -675.0562, 20.0>>, <<347.5317, -630.0744, 35.0>>)
|
|
CLEAR_PED_NON_CREATION_AREA()
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC BLOCK_PAVEMENTS_AT_BANK_EXIT(BOOL bBlock)
|
|
IF bBlock
|
|
SET_PED_PATHS_IN_AREA(<<60.833741,-645.605237,20.206173>>, <<78.287971,-607.055603,38.206173>>, FALSE)
|
|
SET_PED_NON_CREATION_AREA(<<62.4439, -640.2803, 20.3515>>, <<78.287971,-607.055603,38.206173>>)
|
|
ELSE
|
|
SET_PED_PATHS_BACK_TO_ORIGINAL(<<60.833741,-645.605237,20.206173>>, <<78.287971,-607.055603,38.206173>>)
|
|
CLEAR_PED_NON_CREATION_AREA()
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC BLOCK_PEDS_SPAWNING_AT_UNDERPASS(BOOL bBlock)
|
|
IF bBlock
|
|
SET_PED_NON_CREATION_AREA(<<117.149620,-1249.347412,0.829775>>, <<207.030228,-1164.563599,36.811390>>)
|
|
|
|
IF sbiUnderpass = NULL
|
|
sbiUnderpass = ADD_SCENARIO_BLOCKING_AREA(<<117.149620,-1249.347412,0.829775>>, <<207.030228,-1164.563599,36.811390>>)
|
|
ENDIF
|
|
ELSE
|
|
CLEAR_PED_NON_CREATION_AREA()
|
|
|
|
IF sbiUnderpass != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sbiUnderpass)
|
|
sbiUnderpass = NULL
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//Blocks some key areas of peds, to help with streaming/framerate.
|
|
PROC BLOCK_PEDS_DURING_CHASE(BOOL bBlock)
|
|
IF bBlock
|
|
IF sbiChase[0] = NULL
|
|
sbiChase[0] = ADD_SCENARIO_BLOCKING_AREA(<<-3.9866, -1371.4302, 0.0134>>, <<591.0969, -405.0642, 500.5134>>)
|
|
ENDIF
|
|
|
|
IF sbiChase[1] = NULL
|
|
sbiChase[1] = ADD_SCENARIO_BLOCKING_AREA(<<-2241.8862, -882.5413, 0.2256>>, <<-94.8870, 652.3632, 500.2256>>)
|
|
ENDIF
|
|
ELSE
|
|
IF sbiChase[0] != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sbiChase[0])
|
|
sbiChase[0] = NULL
|
|
ENDIF
|
|
|
|
IF sbiChase[1] != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sbiChase[1])
|
|
sbiChase[1] = NULL
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC BLOCK_PEDS_AT_DROP_OFF(BOOL bBlock)
|
|
IF bBlock
|
|
SET_PED_NON_CREATION_AREA(<<172.7488, 2772.6792, 30.3079>>, <<224.8802, 2816.3293, 62.3079>>)
|
|
|
|
IF sbiDropOffPoint = NULL
|
|
sbiDropOffPoint = ADD_SCENARIO_BLOCKING_AREA(<<172.7488, 2772.6792, 30.3079>>, <<224.8802, 2816.3293, 62.3079>>)
|
|
ENDIF
|
|
ELSE
|
|
CLEAR_PED_NON_CREATION_AREA()
|
|
|
|
IF sbiDropOffPoint != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sbiDropOffPoint)
|
|
sbiDropOffPoint = NULL
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SET_ALL_CLOTHES_SHOPS_DISABLED(BOOL bDisable)
|
|
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_H_01_BH, bDisable)
|
|
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_H_02_B, bDisable)
|
|
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_H_03_MW, bDisable)
|
|
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_01_SC, bDisable)
|
|
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_02_GS, bDisable)
|
|
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_03_DT, bDisable)
|
|
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_04_CS, bDisable)
|
|
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_05_GSD, bDisable)
|
|
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_06_VC, bDisable)
|
|
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_L_07_PB, bDisable)
|
|
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_M_01_SM, bDisable)
|
|
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_M_03_H, bDisable)
|
|
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_M_04_HW, bDisable)
|
|
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CLOTHES_SHOP_M_05_GOH, bDisable)
|
|
ENDPROC
|
|
|
|
PROC RUBBER_BAND_WALKING_PED(PED_INDEX &ped, FLOAT fDefaultValue = 1.0, FLOAT fIdealDist = 2.0, FLOAT fMaxDist = 6.0)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
VECTOR vPedPos = GET_ENTITY_COORDS(ped)
|
|
FLOAT fDist = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), vPedPos)
|
|
FLOAT fNewSpeed = 1.0
|
|
|
|
IF fDist > fIdealDist
|
|
IF fDist > fMaxDist
|
|
fDist = fMaxDist
|
|
ENDIF
|
|
|
|
//NOTE: currently it assumes that the player can never get in fron of the walking ped, this should be the case for this mission.
|
|
fNewSpeed = fDefaultValue * (1.0 - (((fDist - fIdealDist) / (fMaxDist - fIdealDist)) * 0.2))
|
|
|
|
IF fNewSpeed > 1.15
|
|
fNewSpeed = 1.15
|
|
ENDIF
|
|
|
|
SET_PED_MOVE_RATE_OVERRIDE(ped, fNewSpeed)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
///Checks the three player chars and makes sure they're assigned the correct speakers in dialogue. This is useful for when switches occur, as these
|
|
///make current speaker peds invalid.
|
|
PROC REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF sConversationPeds.PedInfo[0].Index != sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "MICHAEL")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF sConversationPeds.PedInfo[1].Index != sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "FRANKLIN")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF sConversationPeds.PedInfo[2].Index != sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 2, sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "TREVOR")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
IF sConversationPeds.PedInfo[0].Index != PLAYER_PED_ID()
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, PLAYER_PED_ID(), "MICHAEL")
|
|
ENDIF
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
|
|
IF sConversationPeds.PedInfo[1].Index != PLAYER_PED_ID()
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, PLAYER_PED_ID(), "FRANKLIN")
|
|
ENDIF
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
IF sConversationPeds.PedInfo[2].Index != PLAYER_PED_ID()
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 2, PLAYER_PED_ID(), "TREVOR")
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
///Creates a gunman conversation: each conversation in D* contains a postfix referring to which specific gunman speaks the line.
|
|
FUNC BOOL CREATE_GUNMAN_CONVERSATION(INT iGunmanID, PED_INDEX pedGunman, structPedsForConversation &sConvData, STRING strTextBlock, STRING strConvRootWithoutPostfix,
|
|
enumConversationPriority ePriority = CONV_PRIORITY_MEDIUM, enumSubtitlesState eSubtitles = DISPLAY_SUBTITLES)
|
|
TEXT_LABEL strConvRoot = strConvRootWithoutPostfix
|
|
TEXT_LABEL strCrewVoiceName = ""
|
|
|
|
CrewMember eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, iGunmanID)
|
|
|
|
SWITCH eCrewID
|
|
CASE CM_GUNMAN_G_GUSTAV
|
|
strConvRoot += "_GM"
|
|
strCrewVoiceName = "GUSTAVO"
|
|
BREAK
|
|
|
|
CASE CM_GUNMAN_G_KARL
|
|
strConvRoot += "_KA"
|
|
strCrewVoiceName = "KARL"
|
|
BREAK
|
|
|
|
CASE CM_GUNMAN_G_PACKIE_UNLOCK
|
|
strConvRoot += "_PM"
|
|
strCrewVoiceName = "PACKIE"
|
|
BREAK
|
|
|
|
CASE CM_GUNMAN_G_CHEF_UNLOCK
|
|
strConvRoot += "_CH"
|
|
strCrewVoiceName = "CHEF"
|
|
BREAK
|
|
|
|
CASE CM_GUNMAN_M_HUGH
|
|
strConvRoot += "_HW"
|
|
strCrewVoiceName = "HUGH"
|
|
BREAK
|
|
|
|
CASE CM_GUNMAN_B_NORM
|
|
strConvRoot += "_NR"
|
|
strCrewVoiceName = "NORM"
|
|
BREAK
|
|
|
|
CASE CM_GUNMAN_B_DARYL
|
|
strConvRoot += "_DJ"
|
|
strCrewVoiceName = "DARYL"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strCrewVoiceName)
|
|
TEXT_LABEL strRandomRoot = strConvRoot
|
|
strRandomRoot += "_01"
|
|
TEXT_LABEL strNonRandomRoot = strConvRoot
|
|
strNonRandomRoot += "_1"
|
|
|
|
IF DOES_TEXT_LABEL_EXIST(strRandomRoot)
|
|
OR DOES_TEXT_LABEL_EXIST(strNonRandomRoot)
|
|
IF NOT IS_PED_INJURED(pedGunman)
|
|
IF VDIST2(GET_ENTITY_COORDS(pedGunman), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 3600.0
|
|
ADD_PED_FOR_DIALOGUE(sConvData, 4, pedGunman, strCrewVoiceName)
|
|
ELSE
|
|
ADD_PED_FOR_DIALOGUE(sConvData, 4, NULL, strCrewVoiceName)
|
|
ENDIF
|
|
ELSE
|
|
ADD_PED_FOR_DIALOGUE(sConvData, 4, NULL, strCrewVoiceName)
|
|
ENDIF
|
|
|
|
IF CREATE_CONVERSATION(sConvData, strTextBlock, strConvRoot, ePriority, eSubtitles)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL CREATE_DRIVER_CONVERSATION(INT iDriverID, PED_INDEX pedDriver, structPedsForConversation &sConvData, STRING strTextBlock, STRING strConvRootWithoutPostfix,
|
|
enumConversationPriority ePriority = CONV_PRIORITY_MEDIUM, enumSubtitlesState eSubtitles = DISPLAY_SUBTITLES)
|
|
TEXT_LABEL strConvRoot = strConvRootWithoutPostfix
|
|
TEXT_LABEL strCrewVoiceName = ""
|
|
|
|
CrewMember eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, iDriverID)
|
|
|
|
SWITCH eCrewID
|
|
CASE CM_DRIVER_G_EDDIE
|
|
strConvRoot += "_ET"
|
|
strCrewVoiceName = "EDDIE"
|
|
BREAK
|
|
|
|
CASE CM_DRIVER_G_TALINA_UNLOCK
|
|
strConvRoot += "_TM"
|
|
strCrewVoiceName = "TALINA"
|
|
BREAK
|
|
|
|
CASE CM_DRIVER_B_KARIM
|
|
strConvRoot += "_KD"
|
|
strCrewVoiceName = "KARIM"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strCrewVoiceName)
|
|
TEXT_LABEL strRandomRoot = strConvRoot
|
|
strRandomRoot += "_01"
|
|
TEXT_LABEL strNonRandomRoot = strConvRoot
|
|
strNonRandomRoot += "_1"
|
|
|
|
IF DOES_TEXT_LABEL_EXIST(strRandomRoot)
|
|
OR DOES_TEXT_LABEL_EXIST(strNonRandomRoot)
|
|
IF NOT IS_PED_INJURED(pedDriver)
|
|
IF VDIST2(GET_ENTITY_COORDS(pedDriver), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 3600.0
|
|
ADD_PED_FOR_DIALOGUE(sConvData, 4, pedDriver, strCrewVoiceName)
|
|
ELSE
|
|
ADD_PED_FOR_DIALOGUE(sConvData, 4, NULL, strCrewVoiceName)
|
|
ENDIF
|
|
ELSE
|
|
ADD_PED_FOR_DIALOGUE(sConvData, 4, NULL, strCrewVoiceName)
|
|
ENDIF
|
|
|
|
IF CREATE_CONVERSATION(sConvData, strTextBlock, strConvRoot, ePriority, eSubtitles)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Wrapper for a number of checks during the missions stages inside the bank. If the player does anything suspicious during these stages
|
|
/// the bank workers are spooked and the mission fails.
|
|
/// RETURNS:
|
|
/// BOOL indicating if the player triggered one of the checks.
|
|
FUNC BOOL IS_PLAYER_ACTING_SUSPICIOUS_IN_BANK()
|
|
BOOL bHasSpooked = FALSE
|
|
|
|
IF NOT IS_PED_INJURED(sVaultWorker.ped)
|
|
IF (IS_PED_RAGDOLL(sVaultWorker.ped) OR HAS_PED_RECEIVED_EVENT(sVaultWorker.ped, EVENT_PED_COLLISION_WITH_PLAYER) OR IS_PED_RESPONDING_TO_EVENT(sVaultWorker.ped, EVENT_PED_COLLISION_WITH_PLAYER))
|
|
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sVaultWorker.ped)) < 9.0
|
|
bHasSpooked = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail for any explosions or bullets fired.
|
|
BOOL bPlayerCausedExplosion = FALSE
|
|
ENTITY_INDEX entityExplosion = GET_OWNER_OF_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, <<-106.440224,-635.586426,25.639248>>, <<49.404850,-692.630066,66.712708>>, 120.750000)
|
|
|
|
IF NOT IS_ENTITY_DEAD(entityExplosion)
|
|
IF IS_ENTITY_A_PED(entityExplosion)
|
|
IF GET_PED_INDEX_FROM_ENTITY_INDEX(entityExplosion) = PLAYER_PED_ID()
|
|
bPlayerCausedExplosion = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bPlayerCausedExplosion
|
|
OR (IS_PED_SHOOTING(PLAYER_PED_ID()) AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-106.440224,-635.586426,25.639248>>, <<49.404850,-692.630066,66.712708>>, 120.750000))
|
|
bHasSpooked = TRUE
|
|
ENDIF
|
|
|
|
IF bHasSpooked
|
|
IF NOT IS_PED_INJURED(sVaultWorker.ped)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sVaultWorker.ped, NORMAL_BLEND_OUT, TRUE)
|
|
TASK_SMART_FLEE_PED(sVaultWorker.ped, PLAYER_PED_ID(), 100.0, -1)
|
|
|
|
IF DOES_ENTITY_EXIST(objFakeVaultDoor)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(objFakeVaultDoor, NORMAL_BLEND_OUT, TRUE)
|
|
FREEZE_ENTITY_POSITION(objFakeVaultDoor, TRUE)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(objWalkieTalkie)
|
|
AND IS_ENTITY_ATTACHED_TO_ENTITY(objWalkieTalkie, sVaultWorker.ped)
|
|
DETACH_ENTITY(objWalkieTalkie, TRUE, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
TASK_SMART_FLEE_PED(sBankWorker.ped, PLAYER_PED_ID(), 100.0, -1)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN bHasSpooked
|
|
ENDFUNC
|
|
|
|
FUNC FLOAT GET_ASPECT_RATIO_FOR_TRAFFIC_CONTROL()
|
|
//INT iScreenX
|
|
//INT iScreenY
|
|
//GET_SCREEN_RESOLUTION(iScreenX, iScreenY)
|
|
|
|
//RETURN TO_FLOAT(iScreenY) / TO_FLOAT(iScreenX)
|
|
|
|
FLOAT fAspectR = GET_ASPECT_RATIO(TRUE)
|
|
//
|
|
// #IF IS_DEBUG_BUILD
|
|
// CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), "] Aspect ratio is: ", fAspectR)
|
|
// #ENDIF
|
|
//
|
|
IF fAspectR > 3.0 //B* 2183999: Return normal aspect ratio of the central screen
|
|
CDEBUG1LN(DEBUG_MISSION,"This is a multihead tripple-screen set-up, dividing aspect ratio by 3 (in script)")
|
|
fAspectR = 1.77
|
|
SET_USE_ADJUSTED_MOUSE_COORDS(TRUE)
|
|
ENDIF
|
|
|
|
//1829785: The replacement native command gives the inverse result of the original script command (this is the correct way, but it's too risky at this stage to change all the script references to the old value).
|
|
RETURN 1.0 / fAspectR
|
|
ENDFUNC
|
|
|
|
|
|
PROC INITIALISE_TRAFFIC_GAME()
|
|
//Code commands
|
|
//CREATE_TEMPLATED_JUNCTION - maybe use this to create my own junctions
|
|
|
|
//JUNCTION LAYOUT:
|
|
// - 0 ----- 1 ----- 2 ----- 3 -----
|
|
// - 4 ----- 5 ----- 6 ----- 7 -----
|
|
// - 8 ----- 9 ----- 10 ----
|
|
|
|
sTrafficGame.fAspectRatio = GET_ASPECT_RATIO_FOR_TRAFFIC_CONTROL()
|
|
sTrafficGame.fHudAlpha = 175.0
|
|
sTrafficGame.fNoiseLevel = 0.1
|
|
sTrafficGame.iSelection = 0
|
|
sTrafficGame.iTimeSinceLastSelection = 0
|
|
sTrafficGame.iLastJunctionCamViewed = -1
|
|
sTrafficGame.bAllowMovement = TRUE
|
|
sTrafficGame.bAllowCamSwitch = TRUE
|
|
sTrafficGame.bAllowSwitch = TRUE
|
|
sTrafficGame.bJunctionStreamingActive = FALSE
|
|
|
|
sTrafficJunction[0].vCentre = <<-120.9111, -711.7057, 36.2946>>
|
|
sTrafficJunction[0].vCamPos = <<-115.097702,-736.650024,39.247398>>
|
|
sTrafficJunction[0].vCamRot = <<-32.520157,0.000000,-0.361360>>
|
|
sTrafficJunction[0].fCamFov = 80.0
|
|
sTrafficJunction[0].sCrossings[0].vCentre = <<-115.0111, -695.4057, 36.2946>>
|
|
sTrafficJunction[0].sCrossings[0].fHeading = -19.5000
|
|
//sTrafficJunction[0].sCrossings[0].fWidth = 24.8000
|
|
sTrafficJunction[0].sCrossings[0].bIsBlocked = TRUE
|
|
sTrafficJunction[0].sCrossings[0].iAdjacentJunction = -1
|
|
sTrafficJunction[0].sCrossings[1].vCentre = <<-103.5111, -717.2057, 36.2946>>
|
|
sTrafficJunction[0].sCrossings[1].fHeading = -109.0000
|
|
//sTrafficJunction[0].sCrossings[1].fWidth = 25.0000
|
|
sTrafficJunction[0].sCrossings[1].bIsBlocked = FALSE
|
|
sTrafficJunction[0].sCrossings[1].iAdjacentJunction = 1
|
|
sTrafficJunction[0].sCrossings[2].vCentre = <<-127.0111, -728.8057, 36.2946>>
|
|
sTrafficJunction[0].sCrossings[2].fHeading = 163.7000
|
|
//sTrafficJunction[0].sCrossings[2].fWidth = 24.7000
|
|
sTrafficJunction[0].sCrossings[2].bIsBlocked = TRUE
|
|
sTrafficJunction[0].sCrossings[2].iAdjacentJunction = 4
|
|
sTrafficJunction[0].sCrossings[3].vCentre = <<-136.8111, -706.3057, 36.2950>>
|
|
sTrafficJunction[0].sCrossings[3].fHeading = 70.0000
|
|
//sTrafficJunction[0].sCrossings[3].fWidth = 25.0000
|
|
sTrafficJunction[0].sCrossings[3].bIsBlocked = FALSE
|
|
sTrafficJunction[0].sCrossings[3].iAdjacentJunction = -1
|
|
|
|
sTrafficJunction[1].vCentre = <<36.264, -771.340, 31.212>>
|
|
sTrafficJunction[1].vCamPos = <<39.584274,-792.793335,36.945503>>
|
|
sTrafficJunction[1].vCamRot = <<-41.737045,0.000000,9.282529>>
|
|
sTrafficJunction[1].fCamFov = 80.0
|
|
sTrafficJunction[1].sCrossings[0].vCentre = <<38.264, -758.840, 31.2122>>
|
|
sTrafficJunction[1].sCrossings[0].fHeading = -22.200
|
|
//sTrafficJunction[1].sCrossings[0].fWidth = 23.000
|
|
sTrafficJunction[1].sCrossings[0].bIsBlocked = FALSE
|
|
sTrafficJunction[1].sCrossings[0].iAdjacentJunction = -1
|
|
sTrafficJunction[1].sCrossings[1].vCentre = <<48.164, -776.040, 31.212>>
|
|
sTrafficJunction[1].sCrossings[1].fHeading = -108.500
|
|
//sTrafficJunction[1].sCrossings[1].fWidth = 20.000
|
|
sTrafficJunction[1].sCrossings[1].bIsBlocked = TRUE
|
|
sTrafficJunction[1].sCrossings[1].iAdjacentJunction = 2
|
|
sTrafficJunction[1].sCrossings[2].vCentre = <<31.264, -783.240, 31.212>>
|
|
sTrafficJunction[1].sCrossings[2].fHeading = 161.000
|
|
//sTrafficJunction[1].sCrossings[2].fWidth = 23.000
|
|
sTrafficJunction[1].sCrossings[2].bIsBlocked = FALSE
|
|
sTrafficJunction[1].sCrossings[2].iAdjacentJunction = 5
|
|
sTrafficJunction[1].sCrossings[3].vCentre = <<20.264, -765.740, 31.212>>
|
|
sTrafficJunction[1].sCrossings[3].fHeading = 80.100
|
|
//sTrafficJunction[1].sCrossings[3].fWidth = 20.000
|
|
sTrafficJunction[1].sCrossings[3].bIsBlocked = TRUE
|
|
sTrafficJunction[1].sCrossings[3].iAdjacentJunction = 0
|
|
|
|
sTrafficJunction[2].vCentre = <<172.8905, -817.8768, 31.9256>>
|
|
sTrafficJunction[2].vCamPos = <<182.942795,-845.808716,36.523899>>
|
|
sTrafficJunction[2].vCamRot = <<-39.106430,0.000000,7.103434>>
|
|
sTrafficJunction[2].fCamFov = 80.0
|
|
sTrafficJunction[2].sCrossings[0].vCentre = <<179.1905, -799.3768, 31.9256>>
|
|
sTrafficJunction[2].sCrossings[0].fHeading = -20.0000
|
|
//sTrafficJunction[2].sCrossings[0].fWidth = 25.0000
|
|
sTrafficJunction[2].sCrossings[0].bIsBlocked = FALSE
|
|
sTrafficJunction[2].sCrossings[0].iAdjacentJunction = -1
|
|
sTrafficJunction[2].sCrossings[1].vCentre = <<192.6905, -825.9768, 31.9256>>
|
|
sTrafficJunction[2].sCrossings[1].fHeading = -106.0000
|
|
//sTrafficJunction[2].sCrossings[1].fWidth = 25.0000
|
|
sTrafficJunction[2].sCrossings[1].bIsBlocked = TRUE
|
|
sTrafficJunction[2].sCrossings[1].iAdjacentJunction = 3
|
|
sTrafficJunction[2].sCrossings[2].vCentre = <<168.8905, -835.0768, 31.9256>>
|
|
sTrafficJunction[2].sCrossings[2].fHeading = 161.0000
|
|
//sTrafficJunction[2].sCrossings[2].fWidth = 30.0000
|
|
sTrafficJunction[2].sCrossings[2].bIsBlocked = FALSE
|
|
sTrafficJunction[2].sCrossings[2].iAdjacentJunction = 6
|
|
sTrafficJunction[2].sCrossings[3].vCentre = <<155.7905, -812.3768, 31.9256>>
|
|
sTrafficJunction[2].sCrossings[3].fHeading = 71.0000
|
|
//sTrafficJunction[2].sCrossings[3].fWidth = 25.0000
|
|
sTrafficJunction[2].sCrossings[3].bIsBlocked = TRUE
|
|
sTrafficJunction[2].sCrossings[3].iAdjacentJunction = 1
|
|
|
|
sTrafficJunction[3].vCentre = <<291.0192, -853.4460, 28.9082>>
|
|
sTrafficJunction[3].vCamPos = <<294.976349,-876.544434,35.861366>>
|
|
sTrafficJunction[3].vCamRot = <<-42.146454,-0.000000,13.208912>>
|
|
sTrafficJunction[3].fCamFov = 80.0
|
|
sTrafficJunction[3].sCrossings[0].vCentre = <<295.7192, -836.5460, 28.9082>>
|
|
sTrafficJunction[3].sCrossings[0].fHeading = 0.0000
|
|
//sTrafficJunction[3].sCrossings[0].fWidth = 28.0000
|
|
sTrafficJunction[3].sCrossings[0].bIsBlocked = TRUE
|
|
sTrafficJunction[3].sCrossings[0].iAdjacentJunction = -1
|
|
sTrafficJunction[3].sCrossings[1].vCentre = <<306.1192, -854.5460, 28.9082>>
|
|
sTrafficJunction[3].sCrossings[1].fHeading = -110.0000
|
|
//sTrafficJunction[3].sCrossings[1].fWidth = 28.0000
|
|
sTrafficJunction[3].sCrossings[1].bIsBlocked = FALSE
|
|
sTrafficJunction[3].sCrossings[1].iAdjacentJunction = -1
|
|
sTrafficJunction[3].sCrossings[2].vCentre = <<282.8192, -871.5460, 28.9082>>
|
|
sTrafficJunction[3].sCrossings[2].fHeading = 180.0000
|
|
//sTrafficJunction[3].sCrossings[2].fWidth = 28.0000
|
|
sTrafficJunction[3].sCrossings[2].bIsBlocked = TRUE
|
|
sTrafficJunction[3].sCrossings[2].iAdjacentJunction = 7
|
|
sTrafficJunction[3].sCrossings[3].vCentre = <<272.0192, -854.6460, 28.9082>>
|
|
sTrafficJunction[3].sCrossings[3].fHeading = 70.0000
|
|
//sTrafficJunction[3].sCrossings[3].fWidth = 28.0000
|
|
sTrafficJunction[3].sCrossings[3].bIsBlocked = FALSE
|
|
sTrafficJunction[3].sCrossings[3].iAdjacentJunction = 2
|
|
|
|
sTrafficJunction[4].vCentre = <<-186.1589, -892.4801, 29.5082>>
|
|
sTrafficJunction[4].vCamPos = <<-181.393311,-918.074951,35.585155>>
|
|
sTrafficJunction[4].vCamRot = <<-40.950901,0.000000,-0.616000>>
|
|
sTrafficJunction[4].fCamFov = 80.0
|
|
sTrafficJunction[4].sCrossings[0].vCentre = <<-179.2589, -875.7801, 29.5082>>
|
|
sTrafficJunction[4].sCrossings[0].fHeading = -16.0000
|
|
//sTrafficJunction[4].sCrossings[0].fWidth = 28.5000
|
|
sTrafficJunction[4].sCrossings[0].bIsBlocked = TRUE
|
|
sTrafficJunction[4].sCrossings[0].iAdjacentJunction = 0
|
|
sTrafficJunction[4].sCrossings[1].vCentre = <<-168.3589, -898.7801, 29.5082>>
|
|
sTrafficJunction[4].sCrossings[1].fHeading = -108.5000
|
|
//sTrafficJunction[4].sCrossings[1].fWidth = 26.5000
|
|
sTrafficJunction[4].sCrossings[1].bIsBlocked = FALSE
|
|
sTrafficJunction[4].sCrossings[1].iAdjacentJunction = 5
|
|
sTrafficJunction[4].sCrossings[2].vCentre = <<-194.0589, -910.4801, 29.5082>>
|
|
sTrafficJunction[4].sCrossings[2].fHeading = 161.7000
|
|
//sTrafficJunction[4].sCrossings[2].fWidth = 26.9000
|
|
sTrafficJunction[4].sCrossings[2].bIsBlocked = TRUE
|
|
sTrafficJunction[4].sCrossings[2].iAdjacentJunction = -1
|
|
sTrafficJunction[4].sCrossings[3].vCentre = <<-203.9589, -886.4801, 29.5082>>
|
|
sTrafficJunction[4].sCrossings[3].fHeading = 67.6000
|
|
//sTrafficJunction[4].sCrossings[3].fWidth = 26.0000
|
|
sTrafficJunction[4].sCrossings[3].bIsBlocked = FALSE
|
|
sTrafficJunction[4].sCrossings[3].iAdjacentJunction =-1
|
|
|
|
sTrafficJunction[5].vCentre = <<-33.8007, -947.3564, 29.3034>>
|
|
sTrafficJunction[5].vCamPos = <<-25.997375,-969.534851,35.526428>>
|
|
sTrafficJunction[5].vCamRot = <<-41.858204,-0.000000,13.621637>>
|
|
sTrafficJunction[5].fCamFov = 80.0
|
|
sTrafficJunction[5].sCrossings[0].vCentre = <<-30.3007, -932.9564, 29.3034>>
|
|
sTrafficJunction[5].sCrossings[0].fHeading = -20.5000
|
|
//sTrafficJunction[5].sCrossings[0].fWidth = 37.2000
|
|
sTrafficJunction[5].sCrossings[0].bIsBlocked = FALSE
|
|
sTrafficJunction[5].sCrossings[0].iAdjacentJunction = 1
|
|
sTrafficJunction[5].sCrossings[1].vCentre = <<-13.9007, -953.2564, 29.3034>>
|
|
sTrafficJunction[5].sCrossings[1].fHeading = -103.7000
|
|
//sTrafficJunction[5].sCrossings[1].fWidth = 20.7000
|
|
sTrafficJunction[5].sCrossings[1].bIsBlocked = TRUE
|
|
sTrafficJunction[5].sCrossings[1].iAdjacentJunction = 6
|
|
sTrafficJunction[5].sCrossings[2].vCentre = <<-37.1007, -962.6564, 29.3034>>
|
|
sTrafficJunction[5].sCrossings[2].fHeading = 171.8000
|
|
//sTrafficJunction[5].sCrossings[2].fWidth = 26.0000
|
|
sTrafficJunction[5].sCrossings[2].bIsBlocked = FALSE
|
|
sTrafficJunction[5].sCrossings[2].iAdjacentJunction = 8
|
|
sTrafficJunction[5].sCrossings[3].vCentre = <<-52.6007, -941.6564, 29.3034>>
|
|
sTrafficJunction[5].sCrossings[3].fHeading = 90.0000
|
|
//sTrafficJunction[5].sCrossings[3].fWidth = 27.5000
|
|
sTrafficJunction[5].sCrossings[3].bIsBlocked = TRUE
|
|
sTrafficJunction[5].sCrossings[3].iAdjacentJunction = 4
|
|
|
|
sTrafficJunction[6].vCentre = <<105.5346, -999.3572, 29.8471>>
|
|
sTrafficJunction[6].vCamPos = <<111.713623,-1026.126465,34.592899>>
|
|
sTrafficJunction[6].vCamRot = <<-42.496307,0.000000,10.443845>>
|
|
sTrafficJunction[6].fCamFov = 80.0
|
|
sTrafficJunction[6].sCrossings[0].vCentre = <<113.3346, -979.6572, 29.8471>>
|
|
sTrafficJunction[6].sCrossings[0].fHeading = -20.0000
|
|
//sTrafficJunction[6].sCrossings[0].fWidth = 26.0000
|
|
sTrafficJunction[6].sCrossings[0].bIsBlocked = FALSE
|
|
sTrafficJunction[6].sCrossings[0].iAdjacentJunction = 2
|
|
sTrafficJunction[6].sCrossings[1].vCentre = <<126.6346, -1007.3570, 29.8471>>
|
|
sTrafficJunction[6].sCrossings[1].fHeading = -110.0000
|
|
//sTrafficJunction[6].sCrossings[1].fWidth = 26.0000
|
|
sTrafficJunction[6].sCrossings[1].bIsBlocked = TRUE
|
|
sTrafficJunction[6].sCrossings[1].iAdjacentJunction = 7
|
|
sTrafficJunction[6].sCrossings[2].vCentre = <<98.5346, -1020.3570, 29.8471>>
|
|
sTrafficJunction[6].sCrossings[2].fHeading = 160.0000
|
|
//sTrafficJunction[6].sCrossings[2].fWidth = 26.0000
|
|
sTrafficJunction[6].sCrossings[2].bIsBlocked = FALSE
|
|
sTrafficJunction[6].sCrossings[2].iAdjacentJunction = 9
|
|
sTrafficJunction[6].sCrossings[3].vCentre = <<83.6346, -991.3572, 29.8471>>
|
|
sTrafficJunction[6].sCrossings[3].fHeading = 70.0000
|
|
//sTrafficJunction[6].sCrossings[3].fWidth = 26.0000
|
|
sTrafficJunction[6].sCrossings[3].bIsBlocked = TRUE
|
|
sTrafficJunction[6].sCrossings[3].iAdjacentJunction = 5
|
|
|
|
sTrafficJunction[7].vCentre = <<222.3941, -1041.5291, 29.5764>>
|
|
sTrafficJunction[7].vCamPos = <<229.162262,-1070.942261,35.763374>>
|
|
sTrafficJunction[7].vCamRot = <<-42.638462,-0.000000,6.193697>>
|
|
sTrafficJunction[7].fCamFov = 80.0
|
|
sTrafficJunction[7].sCrossings[0].vCentre = <<229.1941, -1021.0290, 29.5764>>
|
|
sTrafficJunction[7].sCrossings[0].fHeading = -20.0000
|
|
//sTrafficJunction[7].sCrossings[0].fWidth = 27.5000
|
|
sTrafficJunction[7].sCrossings[0].bIsBlocked = FALSE
|
|
sTrafficJunction[7].sCrossings[0].iAdjacentJunction = 3
|
|
sTrafficJunction[7].sCrossings[1].vCentre = <<246.1941, -1048.4290, 29.5764>>
|
|
sTrafficJunction[7].sCrossings[1].fHeading = -100.0000
|
|
//sTrafficJunction[7].sCrossings[1].fWidth = 28.5000
|
|
sTrafficJunction[7].sCrossings[1].bIsBlocked = TRUE
|
|
sTrafficJunction[7].sCrossings[1].iAdjacentJunction = -1
|
|
sTrafficJunction[7].sCrossings[2].vCentre = <<215.1941, -1061.7290, 29.5764>>
|
|
sTrafficJunction[7].sCrossings[2].fHeading = 155.0000
|
|
//sTrafficJunction[7].sCrossings[2].fWidth = 29.0000
|
|
sTrafficJunction[7].sCrossings[2].bIsBlocked = FALSE
|
|
sTrafficJunction[7].sCrossings[2].iAdjacentJunction = 10
|
|
sTrafficJunction[7].sCrossings[3].vCentre = <<202.0941, -1035.6290, 29.5764>>
|
|
sTrafficJunction[7].sCrossings[3].fHeading = 70.0000
|
|
//sTrafficJunction[7].sCrossings[3].fWidth = 20.0000
|
|
sTrafficJunction[7].sCrossings[3].bIsBlocked = TRUE
|
|
sTrafficJunction[7].sCrossings[3].iAdjacentJunction = 6
|
|
|
|
sTrafficJunction[8].vCentre = <<-97.918, -1140.141, 26.946>>
|
|
sTrafficJunction[8].vCamPos = <<-91.280067,-1158.127441,31.868998>>
|
|
sTrafficJunction[8].vCamRot = <<-41.123184,-0.000000,23.792860>>
|
|
sTrafficJunction[8].fCamFov = 80.0
|
|
sTrafficJunction[8].sCrossings[0].vCentre = <<-92.418, -1123.341, 26.946>>
|
|
sTrafficJunction[8].sCrossings[0].fHeading = 0.000
|
|
//sTrafficJunction[8].sCrossings[0].fWidth = 23.000
|
|
sTrafficJunction[8].sCrossings[0].bIsBlocked = FALSE
|
|
sTrafficJunction[8].sCrossings[0].iAdjacentJunction = 5
|
|
sTrafficJunction[8].sCrossings[1].vCentre = <<-77.918, -1139.741, 26.946>>
|
|
sTrafficJunction[8].sCrossings[1].fHeading = -110.000
|
|
//sTrafficJunction[8].sCrossings[1].fWidth = 22.000
|
|
sTrafficJunction[8].sCrossings[1].bIsBlocked = TRUE
|
|
sTrafficJunction[8].sCrossings[1].iAdjacentJunction = 9
|
|
sTrafficJunction[8].sCrossings[2].vCentre = <<-104.218, -1157.741, 26.946>>
|
|
sTrafficJunction[8].sCrossings[2].fHeading = 177.000
|
|
//sTrafficJunction[8].sCrossings[2].fWidth = 25.000
|
|
sTrafficJunction[8].sCrossings[2].bIsBlocked = FALSE
|
|
sTrafficJunction[8].sCrossings[2].iAdjacentJunction = -1
|
|
sTrafficJunction[8].sCrossings[3].vCentre = <<-117.918, -1140.041, 26.946>>
|
|
sTrafficJunction[8].sCrossings[3].fHeading = 70.000
|
|
//sTrafficJunction[8].sCrossings[3].fWidth = 22.0000
|
|
sTrafficJunction[8].sCrossings[3].bIsBlocked = TRUE
|
|
sTrafficJunction[8].sCrossings[3].iAdjacentJunction = -1
|
|
|
|
sTrafficJunction[9].vCentre = <<57.1919, -1133.3660, 29.5424>>
|
|
sTrafficJunction[9].vCamPos = <<72.951180,-1149.167480,34.798061>>
|
|
sTrafficJunction[9].vCamRot = <<-41.737637,0.000001,31.932966>>
|
|
sTrafficJunction[9].fCamFov = 80.0
|
|
sTrafficJunction[9].sCrossings[0].vCentre = <<55.5919, -1117.9659, 29.5424>>
|
|
sTrafficJunction[9].sCrossings[0].fHeading = 2.5000
|
|
//sTrafficJunction[9].sCrossings[0].fWidth = 38.0000
|
|
sTrafficJunction[9].sCrossings[0].bIsBlocked = TRUE
|
|
sTrafficJunction[9].sCrossings[0].iAdjacentJunction = 6
|
|
sTrafficJunction[9].sCrossings[1].vCentre = <<80.9919, -1131.2660, 29.5424>>
|
|
sTrafficJunction[9].sCrossings[1].fHeading = -93.5000
|
|
//sTrafficJunction[9].sCrossings[1].fWidth = 15.4000
|
|
sTrafficJunction[9].sCrossings[1].bIsBlocked = FALSE
|
|
sTrafficJunction[9].sCrossings[1].iAdjacentJunction = 10
|
|
sTrafficJunction[9].sCrossings[2].vCentre = <<59.6919, -1150.8660, 29.5424>>
|
|
sTrafficJunction[9].sCrossings[2].fHeading = -174.0000
|
|
//sTrafficJunction[9].sCrossings[2].fWidth = 26.5000
|
|
sTrafficJunction[9].sCrossings[2].bIsBlocked = TRUE
|
|
sTrafficJunction[9].sCrossings[2].iAdjacentJunction = -1
|
|
sTrafficJunction[9].sCrossings[3].vCentre = <<29.7919, -1135.6660, 29.5424>>
|
|
sTrafficJunction[9].sCrossings[3].fHeading = 92.0000
|
|
//sTrafficJunction[9].sCrossings[3].fWidth = 21.0000
|
|
sTrafficJunction[9].sCrossings[3].bIsBlocked = FALSE
|
|
sTrafficJunction[9].sCrossings[3].iAdjacentJunction = 8
|
|
|
|
sTrafficJunction[10].vCentre = <<209.1869, -1130.0310, 30.7262>>
|
|
sTrafficJunction[10].vCamPos = <<226.615387,-1143.339966,35.144077>>
|
|
sTrafficJunction[10].vCamRot = <<-42.472389,0.000001,34.189583>>
|
|
sTrafficJunction[10].fCamFov = 80.0
|
|
sTrafficJunction[10].sCrossings[0].vCentre = <<208.1869, -1119.3311, 30.7262>>
|
|
sTrafficJunction[10].sCrossings[0].fHeading = 0.5000
|
|
//sTrafficJunction[10].sCrossings[0].fWidth = 30.0000
|
|
sTrafficJunction[10].sCrossings[0].bIsBlocked = FALSE
|
|
sTrafficJunction[10].sCrossings[0].iAdjacentJunction = 7
|
|
sTrafficJunction[10].sCrossings[1].vCentre = <<232.3869, -1130.9310, 30.7262>>
|
|
sTrafficJunction[10].sCrossings[1].fHeading = -79.0000
|
|
//sTrafficJunction[10].sCrossings[1].fWidth = 10.0000
|
|
sTrafficJunction[10].sCrossings[1].bIsBlocked = TRUE
|
|
sTrafficJunction[10].sCrossings[1].iAdjacentJunction = -1
|
|
sTrafficJunction[10].sCrossings[2].vCentre = <<211.2869, -1143.2310, 30.7262>>
|
|
sTrafficJunction[10].sCrossings[2].fHeading = 180.0000
|
|
//sTrafficJunction[10].sCrossings[2].fWidth = 25.0000
|
|
sTrafficJunction[10].sCrossings[2].bIsBlocked = FALSE
|
|
sTrafficJunction[10].sCrossings[2].iAdjacentJunction = -1
|
|
sTrafficJunction[10].sCrossings[3].vCentre = <<185.6869, -1129.1310, 30.7262>>
|
|
sTrafficJunction[10].sCrossings[3].fHeading = 100.0000
|
|
//sTrafficJunction[10].sCrossings[3].fWidth = 11.3000
|
|
sTrafficJunction[10].sCrossings[3].bIsBlocked = TRUE
|
|
sTrafficJunction[10].sCrossings[3].iAdjacentJunction = 9
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(sTrafficJunction) i
|
|
sTrafficJunction[i].bPlayedLightStatusDialogue = FALSE
|
|
sTrafficJunction[i].bLightsFrozen = FALSE
|
|
|
|
//Initialise the light changing timers to random values
|
|
IF i = 0
|
|
sTrafficJunction[i].iChangeTimer = 0
|
|
ELSE
|
|
sTrafficJunction[i].iChangeTimer = GET_GAME_TIMER() - GET_RANDOM_INT_IN_RANGE(0, 20000)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Initialise the car variables
|
|
REPEAT COUNT_OF(sTrafficGameCops) i
|
|
sTrafficGameCops[i].bIsCreated = FALSE
|
|
ENDREPEAT
|
|
|
|
bTrafficAudioStreamActive = FALSE
|
|
bTrafficGameAudioSceneActive = FALSE
|
|
|
|
fPrevTrafficLatitude[0] = 0.0
|
|
fPrevTrafficLatitude[1] = 0.0
|
|
fPrevTrafficLatitude[2] = 0.0
|
|
fPrevTrafficLatitude[3] = 0.0
|
|
|
|
fPrevTrafficTime[0] = 0.0
|
|
fPrevTrafficTime[1] = 0.0
|
|
fPrevTrafficTime[2] = 0.0
|
|
ENDPROC
|
|
|
|
PROC TC_DRAW_JUNCTION_MARKERS(INT iJunction)
|
|
VECTOR vScreenPos
|
|
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(sTrafficJunction[iJunction].vCentre, vScreenPos.x, vScreenPos.y)
|
|
DRAW_SPRITE(strTrafficTextures, "Traffic_junction_box", vScreenPos.x, vScreenPos.y,
|
|
0.08 * sTrafficGame.fAspectRatio, 0.08, 0.0,
|
|
255, 255, 255, CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
|
|
//North-south lights
|
|
IF sTrafficJunction[iJunction].sCrossings[0].bIsBlocked
|
|
DRAW_SPRITE(strTrafficTextures, "Traffic_Lights_Horz", vScreenPos.x, vScreenPos.y,
|
|
0.08 * sTrafficGame.fAspectRatio, 0.08, 0.0,
|
|
200, 0, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ELSE
|
|
DRAW_SPRITE(strTrafficTextures, "Traffic_Lights_Horz", vScreenPos.x, vScreenPos.y,
|
|
0.08 * sTrafficGame.fAspectRatio, 0.08, 0.0,
|
|
0, 200, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ENDIF
|
|
|
|
//East-west lights
|
|
IF sTrafficJunction[iJunction].sCrossings[1].bIsBlocked
|
|
DRAW_SPRITE(strTrafficTextures, "Traffic_Lights_Vert", vScreenPos.x, vScreenPos.y,
|
|
0.08 * sTrafficGame.fAspectRatio, 0.08, 0.0,
|
|
200, 0, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ELSE
|
|
DRAW_SPRITE(strTrafficTextures, "Traffic_Lights_Vert", vScreenPos.x, vScreenPos.y,
|
|
0.08 * sTrafficGame.fAspectRatio, 0.08, 0.0,
|
|
0, 200, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//Draws a series of dots on the junction to indicate it's buffering.
|
|
PROC DRAW_BUFFERING_INDICATOR(INT iJunction)
|
|
CONST_FLOAT DOT_SIZE 0.007
|
|
VECTOR vScreenPos, vAdjustedPos
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(sTrafficJunction[iJunction].vCentre, vScreenPos.x, vScreenPos.y)
|
|
|
|
INT iDotToDraw = ((GET_GAME_TIMER() - sTrafficJunction[iJunction].iBufferingTimer) % 900) / 150
|
|
INT iHorizontalRGB[3]
|
|
INT iVerticalRGB[3]
|
|
|
|
//The dots are the reverse colours of the lights
|
|
IF sTrafficJunction[iJunction].sCrossings[0].bIsBlocked
|
|
iHorizontalRGB[0] = 200
|
|
iHorizontalRGB[1] = 0
|
|
iHorizontalRGB[2] = 0
|
|
|
|
iVerticalRGB[0] = 0
|
|
iVerticalRGB[1] = 200
|
|
iVerticalRGB[2] = 0
|
|
ELSE
|
|
iHorizontalRGB[0] = 0
|
|
iHorizontalRGB[1] = 200
|
|
iHorizontalRGB[2] = 0
|
|
|
|
iVerticalRGB[0] = 200
|
|
iVerticalRGB[1] = 0
|
|
iVerticalRGB[2] = 0
|
|
ENDIF
|
|
|
|
IF iDotToDraw = 0
|
|
vAdjustedPos = vScreenPos
|
|
vAdjustedPos.x = vAdjustedPos.x - ((DOT_SIZE * 1.2) * sTrafficGame.fAspectRatio)
|
|
DRAW_RECT(vAdjustedPos.x, vAdjustedPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iHorizontalRGB[0], iHorizontalRGB[1], iHorizontalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ELIF iDotToDraw = 1
|
|
DRAW_RECT(vScreenPos.x, vScreenPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iHorizontalRGB[0], iHorizontalRGB[1], iHorizontalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ELIF iDotToDraw = 2
|
|
vAdjustedPos = vScreenPos
|
|
vAdjustedPos.x = vAdjustedPos.x + ((DOT_SIZE * 1.2) * sTrafficGame.fAspectRatio)
|
|
DRAW_RECT(vAdjustedPos.x, vAdjustedPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iHorizontalRGB[0], iHorizontalRGB[1], iHorizontalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ELIF iDotToDraw = 3
|
|
vAdjustedPos = vScreenPos
|
|
vAdjustedPos.y = vAdjustedPos.y - (DOT_SIZE * 1.2)
|
|
DRAW_RECT(vAdjustedPos.x, vAdjustedPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iVerticalRGB[0], iVerticalRGB[1], iVerticalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ELIF iDotToDraw = 4
|
|
DRAW_RECT(vScreenPos.x, vScreenPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iVerticalRGB[0], iVerticalRGB[1], iVerticalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ELIF iDotToDraw = 5
|
|
vAdjustedPos = vScreenPos
|
|
vAdjustedPos.y = vAdjustedPos.y + (DOT_SIZE * 1.2)
|
|
DRAW_RECT(vAdjustedPos.x, vAdjustedPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iVerticalRGB[0], iVerticalRGB[1], iVerticalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ENDIF
|
|
|
|
/*IF iDotToDraw = 0
|
|
//Draw the top and left dots.
|
|
vAdjustedPos = vScreenPos
|
|
vAdjustedPos.y = vAdjustedPos.y - (DOT_SIZE * 1.2)
|
|
DRAW_RECT(vAdjustedPos.x, vAdjustedPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iVerticalRGB[0], iVerticalRGB[1], iVerticalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
|
|
vAdjustedPos = vScreenPos
|
|
vAdjustedPos.x = vAdjustedPos.x - ((DOT_SIZE * 1.2) * sTrafficGame.fAspectRatio)
|
|
DRAW_RECT(vAdjustedPos.x, vAdjustedPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iHorizontalRGB[0], iHorizontalRGB[1], iHorizontalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ELIF iDotToDraw = 1
|
|
//Draw the middle dot.
|
|
DRAW_RECT(vScreenPos.x, vScreenPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iHorizontalRGB[0], iHorizontalRGB[1], iHorizontalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ELSE
|
|
//Draw the bottom and right dots.
|
|
vAdjustedPos = vScreenPos
|
|
vAdjustedPos.y = vAdjustedPos.y + (DOT_SIZE * 1.2)
|
|
DRAW_RECT(vAdjustedPos.x, vAdjustedPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iVerticalRGB[0], iVerticalRGB[1], iVerticalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
|
|
vAdjustedPos = vScreenPos
|
|
vAdjustedPos.x = vAdjustedPos.x + ((DOT_SIZE * 1.2) * sTrafficGame.fAspectRatio)
|
|
DRAW_RECT(vAdjustedPos.x, vAdjustedPos.y, DOT_SIZE * sTrafficGame.fAspectRatio, DOT_SIZE, iHorizontalRGB[0], iHorizontalRGB[1], iHorizontalRGB[2], CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ENDIF*/
|
|
ENDPROC
|
|
|
|
PROC TC_DRAW_SPECIFIC_JUNCTION_MARKER(INT iJunction)
|
|
CONST_FLOAT BOX_SIZE 0.14
|
|
VECTOR vScreenPos = <<0.5, 0.2, 0.0>>
|
|
|
|
|
|
DRAW_SPRITE(strTrafficTextures, "Traffic_junction_box", vScreenPos.x, vScreenPos.y,
|
|
BOX_SIZE * sTrafficGame.fAspectRatio, BOX_SIZE, 0.0,
|
|
255, 255, 255, CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
|
|
//North-south lights
|
|
IF sTrafficJunction[iJunction].sCrossings[0].bIsBlocked
|
|
DRAW_SPRITE(strTrafficTextures, "Traffic_lights_horz_large", vScreenPos.x, vScreenPos.y,
|
|
BOX_SIZE * sTrafficGame.fAspectRatio, BOX_SIZE, 0.0,
|
|
200, 0, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ELSE
|
|
DRAW_SPRITE(strTrafficTextures, "Traffic_lights_horz_large", vScreenPos.x, vScreenPos.y,
|
|
BOX_SIZE * sTrafficGame.fAspectRatio, BOX_SIZE, 0.0,
|
|
0, 200, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ENDIF
|
|
|
|
//East-west lights
|
|
IF sTrafficJunction[iJunction].sCrossings[1].bIsBlocked
|
|
DRAW_SPRITE(strTrafficTextures, "Traffic_lights_vert_large", vScreenPos.x, vScreenPos.y,
|
|
BOX_SIZE * sTrafficGame.fAspectRatio, BOX_SIZE, 0.0,
|
|
200, 0, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ELSE
|
|
DRAW_SPRITE(strTrafficTextures, "Traffic_lights_vert_large", vScreenPos.x, vScreenPos.y,
|
|
BOX_SIZE * sTrafficGame.fAspectRatio, BOX_SIZE, 0.0,
|
|
0, 200, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC TC_DRAW_VEHICLE_MARKER(VEHICLE_INDEX veh, BOOL bIsACop, INT iFlashTimer = 0)
|
|
IF NOT IS_ENTITY_DEAD(veh)
|
|
IF DOES_CAM_EXIST(camMain)
|
|
VECTOR vScreenPos
|
|
FLOAT fVehHeading = GET_ENTITY_HEADING(veh)
|
|
VECTOR vCamRot = GET_CAM_ROT(camMain)
|
|
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(GET_ENTITY_COORDS(veh), vScreenPos.x, vScreenPos.y)
|
|
|
|
IF vScreenPos.x > 0.04
|
|
AND vScreenPos.x < 0.96
|
|
AND vScreenPos.y > 0.04
|
|
AND vScreenPos.y < 0.96
|
|
IF bIsACop
|
|
BOOL bSafeToDraw = FALSE
|
|
|
|
IF GET_GAME_TIMER() - iFlashTimer < 3000
|
|
IF (GET_GAME_TIMER() - iFlashTimer) % 200 < 100
|
|
bSafeToDraw = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bSafeToDraw = TRUE
|
|
ENDIF
|
|
|
|
IF bSafeToDraw
|
|
DRAW_SPRITE(strTrafficTextures, "radar_centre", vScreenPos.x, vScreenPos.y,
|
|
0.035 * sTrafficGame.fAspectRatio, 0.035, vCamRot.z - fVehHeading,
|
|
//sTrafficGame.iCopsSpriteColourModifier, 128 - sTrafficGame.iCopsSpriteColourModifier / 2, 255 - sTrafficGame.iCopsSpriteColourModifier,
|
|
255, 0, 0,
|
|
CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ENDIF
|
|
ELSE
|
|
DRAW_SPRITE(strTrafficTextures, "radar_centre", vScreenPos.x, vScreenPos.y,
|
|
0.03 * sTrafficGame.fAspectRatio, 0.03, vCamRot.z - fVehHeading,
|
|
0, 152, 255, CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC TC_DRAW_CURSOR()
|
|
CONST_FLOAT CURSOR_SIZE 0.08
|
|
|
|
VECTOR vScreenPos, vLineMiddlePos
|
|
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(sTrafficGame.vCursorPos, vScreenPos.x, vScreenPos.y)
|
|
DRAW_SPRITE(strTrafficTextures, "Cursor", vScreenPos.x, vScreenPos.y,
|
|
CURSOR_SIZE * sTrafficGame.fAspectRatio, CURSOR_SIZE, 0.0,
|
|
255, 255, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
|
|
//Top line
|
|
FLOAT fTopLineLength = vScreenPos.y - (CURSOR_SIZE / 2.0)
|
|
|
|
vLineMiddlePos.x = vScreenPos.x
|
|
vLineMiddlePos.y = fTopLineLength / 2.0
|
|
DRAW_SPRITE(strTrafficTextures, "Cursor_Lines", vLineMiddlePos.x, vLineMiddlePos.y,
|
|
0.01 * sTrafficGame.fAspectRatio, fTopLineLength + 0.01, 90.0,
|
|
255, 255, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
|
|
//Bottom line
|
|
FLOAT fBottomCursorEdge = vScreenPos.y + (CURSOR_SIZE / 2.0)
|
|
FLOAT fBottomLineLength = 1.0 - fBottomCursorEdge
|
|
|
|
vLineMiddlePos.x = vScreenPos.x
|
|
vLineMiddlePos.y = fBottomCursorEdge + (fBottomLineLength / 2.0)
|
|
DRAW_SPRITE(strTrafficTextures, "Cursor_Lines", vLineMiddlePos.x, vLineMiddlePos.y,
|
|
0.01 * sTrafficGame.fAspectRatio, fBottomLineLength + 0.01, 90.0,
|
|
255, 255, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
|
|
//Left line
|
|
FLOAT fLeftCursorEdge = vScreenPos.x - (CURSOR_SIZE / 2.0)
|
|
FLOAT fLeftLineLength = fLeftCursorEdge
|
|
|
|
vLineMiddlePos.x = fLeftLineLength / 2.0
|
|
vLineMiddlePos.y = vScreenPos.y
|
|
DRAW_SPRITE(strTrafficTextures, "Cursor_Lines", vLineMiddlePos.x, vLineMiddlePos.y,
|
|
fLeftLineLength +(CURSOR_SIZE / 2.0), 0.01, 0.0,
|
|
255, 255, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
|
|
//Right line
|
|
FLOAT fRightCursorEdge = vScreenPos.x + (CURSOR_SIZE / 2.0)
|
|
FLOAT fRightLineLength = 1.0 - fRightCursorEdge
|
|
|
|
vLineMiddlePos.x = fRightCursorEdge + (fRightLineLength / 2.0)
|
|
vLineMiddlePos.y = vScreenPos.y
|
|
DRAW_SPRITE(strTrafficTextures, "Cursor_Lines", vLineMiddlePos.x, vLineMiddlePos.y,
|
|
fRightLineLength +(CURSOR_SIZE / 2.0), 0.01, 0.0,
|
|
255, 255, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ENDPROC
|
|
|
|
PROC TC_DRAW_INDICATOR()
|
|
CONST_FLOAT CURSOR_SIZE 0.06
|
|
|
|
VECTOR vScreenPos
|
|
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(sTrafficGame.vCurrentIndicatorPos, vScreenPos.x, vScreenPos.y)
|
|
DRAW_SPRITE(strTrafficTextures, "Cursor", vScreenPos.x, vScreenPos.y,
|
|
CURSOR_SIZE * sTrafficGame.fAspectRatio, CURSOR_SIZE, 0.0,
|
|
255, 0, 0, CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
ENDPROC
|
|
|
|
PROC SET_TC_INDICATOR_HIGHLIGHT_COORD(VEHICLE_INDEX vehNewTarget)
|
|
sTrafficGame.vehIndicatorTarget = vehNewTarget
|
|
sTrafficGame.iIndicatorFlashTimer = GET_GAME_TIMER()
|
|
sTrafficGame.vCurrentIndicatorPos = sTrafficGame.vCursorPos
|
|
ENDPROC
|
|
|
|
PROC GET_CLOSEST_JUNCTION_TO_COORDS(VECTOR vPos, INT &iClosestJunction, FLOAT &fClosestDist)
|
|
INT i = 0
|
|
fClosestDist = -1.0
|
|
|
|
REPEAT COUNT_OF(sTrafficJunction) i
|
|
FLOAT fDist = VDIST2(vPos, sTrafficJunction[i].vCentre)
|
|
|
|
IF fClosestDist = -1.0 OR fDist < fClosestDist
|
|
fClosestDist = fDist
|
|
iClosestJunction = i
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
PROC GET_CLOSEST_CROSSING_ON_JUNCTION(VECTOR vPos, INT iJunction, INT &iClosestCrossing, FLOAT &fClosestDist)
|
|
INT i = 0
|
|
fClosestDist = -1.0
|
|
|
|
REPEAT 4 i
|
|
FLOAT fDist = VDIST2(vPos, sTrafficJunction[iJunction].sCrossings[i].vCentre)
|
|
|
|
IF fClosestDist = -1.0 OR fDist < fClosestDist
|
|
fClosestDist = fDist
|
|
iClosestCrossing = i
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
FUNC TEXT_LABEL GET_RANDOM_TRAFFIC_WAYPOINT_RECORDING(INT min, INT max)
|
|
TEXT_LABEL strWaypoint = "BigScoreA"
|
|
|
|
INT iRandom = GET_RANDOM_INT_IN_RANGE(min, max)
|
|
strWaypoint += iRandom
|
|
|
|
RETURN strWaypoint
|
|
ENDFUNC
|
|
|
|
FUNC BOOL CREATE_TRAFFIC_CAR_USING_WAYPOINT(TRAFFIC_GAME_CAR &sTrafficCar, MODEL_NAMES modelCar, MODEL_NAMES modelPed, TEXT_LABEL strWaypoint, BOOL bLoadCollision = FALSE)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypoint)
|
|
REQUEST_MODEL(modelCar)
|
|
REQUEST_MODEL(modelPed)
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypoint)
|
|
AND HAS_MODEL_LOADED(modelCar)
|
|
AND HAS_MODEL_LOADED(modelPed)
|
|
FLOAT fStartHeading
|
|
VECTOR vStartPos, vNextNodePos
|
|
WAYPOINT_RECORDING_GET_COORD(strWaypoint, 5, vStartPos)
|
|
WAYPOINT_RECORDING_GET_COORD(strWaypoint, 6, vNextNodePos)
|
|
|
|
fStartHeading = GET_HEADING_FROM_VECTOR_2D(vNextNodePos.x - vStartPos.x, vNextNodePos.y - vStartPos.y)
|
|
|
|
IF NOT DOES_ENTITY_EXIST(sTrafficCar.veh)
|
|
sTrafficCar.veh = CREATE_VEHICLE(modelCar, vStartPos, fStartHeading)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sTrafficCar.veh)
|
|
IF NOT DOES_ENTITY_EXIST(sTrafficCar.ped)
|
|
sTrafficCar.ped = CREATE_PED_INSIDE_VEHICLE(sTrafficCar.veh, PEDTYPE_MISSION, modelPed)
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(sTrafficCar.veh, vStartPos)
|
|
SET_ENTITY_HEADING(sTrafficCar.veh, fStartHeading)
|
|
|
|
sTrafficCar.iTimer = GET_GAME_TIMER()
|
|
sTrafficCar.iFlashTimer = 0
|
|
sTrafficCar.bIsCreated = TRUE
|
|
sTrafficCar.bIsOffScreen = FALSE
|
|
sTrafficCar.strCurrentWaypoint = strWaypoint
|
|
|
|
IF NOT IS_PED_INJURED(sTrafficCar.ped)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sTrafficCar.ped, bLoadCollision)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sTrafficCar.ped, NOT bLoadCollision)
|
|
ENDIF
|
|
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sTrafficCar.veh, bLoadCollision)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sTrafficCar.ped, bLoadCollision)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
///Gets the current state of a traffic car.
|
|
FUNC TRAFFIC_CAR_STATE GET_TRAFFIC_CAR_STATE(VEHICLE_INDEX veh)
|
|
TRAFFIC_CAR_STATE eCurrentState = TC_STATE_MOVING
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
INT iClosestJunction = 0
|
|
INT iClosestCrossing = 0
|
|
FLOAT fClosestDist = -1.0
|
|
VECTOR vVehPos = GET_ENTITY_COORDS(veh)
|
|
|
|
GET_CLOSEST_JUNCTION_TO_COORDS(vVehPos, iClosestJunction, fClosestDist)
|
|
GET_CLOSEST_CROSSING_ON_JUNCTION(vVehPos, iClosestJunction, iClosestCrossing, fClosestDist)
|
|
|
|
IF fClosestDist < 900.0
|
|
//If the crossing is red (or the whole junction is set to malfunction), and the vehicle is approaching it, stop the vehicle.
|
|
IF (sTrafficJunction[iClosestJunction].sCrossings[iClosestCrossing].bIsBlocked)
|
|
IF VDIST2(vVehPos, sTrafficJunction[iClosestJunction].vCentre) > fClosestDist //If the car is in the middle of the junction ignore the lights.
|
|
FLOAT fHeading = GET_ENTITY_HEADING(veh)
|
|
FLOAT fHeadingDiff = ABSF(fHeading - sTrafficJunction[iClosestJunction].sCrossings[iClosestCrossing].fHeading)
|
|
IF fHeadingDiff > 180.0
|
|
fHeadingDiff = ABSF(fHeadingDiff - 360.0)
|
|
ENDIF
|
|
|
|
IF fHeadingDiff > 110.0
|
|
VECTOR vVehDir = CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<0.0, 0.0, fHeading>>) //GET_ENTITY_FORWARD_VECTOR(veh)
|
|
VECTOR vDirToCrossing = sTrafficJunction[iClosestJunction].sCrossings[iClosestCrossing].vCentre - vVehPos
|
|
vDirToCrossing = vDirToCrossing / VMAG(vDirToCrossing)
|
|
|
|
vVehDir.z = 0
|
|
vDirToCrossing.z = 0
|
|
|
|
IF DOT_PRODUCT(vVehDir, vDirToCrossing) > 0.0
|
|
/*#IF IS_DEBUG_BUILD
|
|
IF veh = sGoldVans[0].veh OR veh = sGoldVans[1].veh
|
|
FLOAT fX1, fY1, fX2, fY2
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(sTrafficJunction[iClosestJunction].sCrossings[iClosestCrossing].vCentre, fX1, fY1)
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(vVehPos, fX2, fY2)
|
|
DRAW_LINE_2D(fX1, fY1, fX2, fY2, 0.001, 0, 0, 255, 255)
|
|
ENDIF
|
|
#ENDIF*/
|
|
|
|
eCurrentState = TC_STATE_STOPPED_AT_RED
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
eCurrentState = TC_STATE_GOING_THROUGH_GREEN
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN eCurrentState
|
|
ENDFUNC
|
|
|
|
/// Checks if a car is geting close to a car driving in front of it.
|
|
FUNC BOOL IS_CAR_APPROACHING_CAR_IN_FRONT(VEHICLE_INDEX vehMain, VEHICLE_INDEX vehFront)
|
|
IF NOT IS_ENTITY_DEAD(vehMain)
|
|
AND NOT IS_ENTITY_DEAD(vehFront)
|
|
IF GET_ENTITY_SPEED(vehFront) < GET_ENTITY_SPEED(vehMain)
|
|
VECTOR vOffsetFromFrontCar = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehFront, GET_ENTITY_COORDS(vehMain))
|
|
|
|
IF vOffsetFromFrontCar.y > -25.0
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// Updates a traffic game car's movement using a given waypoint recording to determine where to go.
|
|
/// NOTE: The returned BOOL indicates if the car is currently being instructed to stop.
|
|
FUNC TRAFFIC_CAR_STATE UPDATE_TRAFFIC_CAR_WAYPOINT_MOVEMENT(VEHICLE_INDEX veh, PED_INDEX pedDriver, STRING strWaypoint, DRIVINGMODE eDrivingMode = DRIVINGMODE_AVOIDCARS, VEHICLE_INDEX vehCarToStayBehind = NULL)
|
|
TRAFFIC_CAR_STATE eCurrentState = TC_STATE_MOVING
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
AND NOT IS_PED_INJURED(pedDriver)
|
|
eCurrentState = GET_TRAFFIC_CAR_STATE(veh)
|
|
BOOL bStopForCarInFront = FALSE
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehCarToStayBehind)
|
|
AND eCurrentState != TC_STATE_STOPPED_AT_RED
|
|
bStopForCarInFront = IS_CAR_APPROACHING_CAR_IN_FRONT(veh, vehCarToStayBehind)
|
|
ENDIF
|
|
|
|
IF bStopForCarInFront
|
|
OR eCurrentState = TC_STATE_STOPPED_AT_RED
|
|
IF GET_SCRIPT_TASK_STATUS(pedDriver, SCRIPT_TASK_VEHICLE_MISSION) != PERFORMING_TASK
|
|
AND ABSF(GET_ENTITY_SPEED(veh)) > 1.0
|
|
TASK_VEHICLE_MISSION(pedDriver, veh, NULL, MISSION_STOP, 0.0, DRIVINGMODE_STOPFORCARS, 5.0, 5.0, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedDriver, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strWaypoint)
|
|
IF GET_SCRIPT_TASK_STATUS(pedDriver, SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) != PERFORMING_TASK
|
|
REQUEST_WAYPOINT_RECORDING(strWaypoint)
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypoint)
|
|
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(pedDriver, veh, strWaypoint, eDrivingMode, 0,
|
|
EWAYPOINT_START_FROM_CLOSEST_POINT, -1, 30.0)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN eCurrentState
|
|
ENDFUNC
|
|
|
|
/// Updates a traffic game car's movement using a given destination coordinate to determine where to go.
|
|
/// NOTE: The returned BOOL indicates if the car is currently being instructed to stop.
|
|
FUNC TRAFFIC_CAR_STATE UPDATE_TRAFFIC_CAR_TASK_MOVEMENT(VEHICLE_INDEX veh, PED_INDEX pedDriver, VECTOR vDest, DRIVINGMODE eDrivingMode = DRIVINGMODE_AVOIDCARS)
|
|
TRAFFIC_CAR_STATE eCurrentState = TC_STATE_MOVING
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
AND NOT IS_PED_INJURED(pedDriver)
|
|
eCurrentState = GET_TRAFFIC_CAR_STATE(veh)
|
|
|
|
IF eCurrentState = TC_STATE_STOPPED_AT_RED
|
|
IF GET_SCRIPT_TASK_STATUS(pedDriver, SCRIPT_TASK_VEHICLE_MISSION) != PERFORMING_TASK
|
|
AND ABSF(GET_ENTITY_SPEED(veh)) > 1.0
|
|
TASK_VEHICLE_MISSION(pedDriver, veh, NULL, MISSION_STOP, 0.0, DRIVINGMODE_STOPFORCARS, 5.0, 5.0, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedDriver, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF GET_SCRIPT_TASK_STATUS(pedDriver, SCRIPT_TASK_VEHICLE_DRIVE_WANDER) != PERFORMING_TASK
|
|
AND vDest.z != 0
|
|
FREEZE_ENTITY_POSITION(veh, FALSE)
|
|
//TASK_VEHICLE_DRIVE_TO_COORD(pedDriver, veh, vDest, 20.0, DRIVINGSTYLE_NORMAL, GET_ENTITY_MODEL(veh), eDrivingMode, 10.0, 10.0)
|
|
TASK_VEHICLE_DRIVE_WANDER(pedDriver, veh, 15.0, eDrivingMode)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedDriver, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN eCurrentState
|
|
ENDFUNC
|
|
|
|
PROC UPDATE_TRAFFIC_GAME_CAR(TRAFFIC_GAME_CAR &sTrafficCar, STRING strWaypoint, VECTOR vDestination, DRIVINGMODE eDrivingMode = DRIVINGMODE_AVOIDCARS)
|
|
IF IS_VEHICLE_DRIVEABLE(sTrafficCar.veh)
|
|
IF NOT IS_PED_INJURED(sTrafficCar.ped)
|
|
AND NOT sTrafficCar.bIsOffScreen
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strWaypoint)
|
|
UPDATE_TRAFFIC_CAR_WAYPOINT_MOVEMENT(sTrafficCar.veh, sTrafficCar.ped, strWaypoint, eDrivingMode)
|
|
ELIF vDestination.z != 0.0
|
|
UPDATE_TRAFFIC_CAR_TASK_MOVEMENT(sTrafficCar.veh, sTrafficCar.ped, vDestination, eDrivingMode)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - sTrafficCar.iTimer > 20000
|
|
AND NOT sTrafficGame.bJunctionCamActive
|
|
IF NOT IS_ENTITY_ON_SCREEN(sTrafficCar.veh)
|
|
sTrafficCar.bIsOffScreen = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF bDebugDrawTrafficCars
|
|
FLOAT fX1, fY1
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(GET_ENTITY_COORDS(sTrafficCar.veh), fX1, fY1)
|
|
DRAW_RECT(fX1, fY1, 0.01, 0.01, 255, 0, 0, 255,TRUE)
|
|
ENDIF
|
|
#ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//Currently not used
|
|
/*PROC UPDATE_TRAFFIC_CAR_USING_RECORDING(TRAFFIC_GAME_CAR &sTrafficCar)
|
|
IF IS_VEHICLE_DRIVEABLE(sTrafficCar.veh)
|
|
AND NOT sTrafficCar.bIsOffScreen
|
|
BOOL bStopCarForLights = FALSE
|
|
INT iClosestJunction = 0
|
|
INT iClosestCrossing = 0
|
|
FLOAT fClosestDist = -1.0
|
|
FLOAT fDesiredPlaybackSpeed = 1.0
|
|
VECTOR vVehPos = GET_ENTITY_COORDS(sTrafficCar.veh)
|
|
|
|
GET_CLOSEST_JUNCTION_TO_COORDS(vVehPos, iClosestJunction, fClosestDist)
|
|
GET_CLOSEST_CROSSING_ON_JUNCTION(vVehPos, iClosestJunction, iClosestCrossing, fClosestDist)
|
|
|
|
//If the crossing is red (or the whole junction is set to malfunction), and the vehicle is approaching it, stop the vehicle.
|
|
IF (sTrafficJunction[iClosestJunction].sCrossings[iClosestCrossing].bIsBlocked)
|
|
IF fClosestDist < 900.0
|
|
FLOAT fHeading = GET_ENTITY_HEADING(sTrafficCar.veh)
|
|
FLOAT fHeadingDiff = ABSF(fHeading - sTrafficJunction[iClosestJunction].sCrossings[iClosestCrossing].fHeading)
|
|
IF fHeadingDiff > 180.0
|
|
fHeadingDiff = ABSF(fHeadingDiff - 360.0)
|
|
ENDIF
|
|
|
|
IF fHeadingDiff > 90.0 //This should indicate that the car is heading towards the crossing rather than away from it.
|
|
VECTOR vVehDir = CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<0.0, 0.0, fHeading>>)
|
|
VECTOR vDirToCrossing = sTrafficJunction[iClosestJunction].sCrossings[iClosestCrossing].vCentre - vVehPos
|
|
vDirToCrossing = vDirToCrossing / VMAG(vDirToCrossing)
|
|
|
|
vVehDir.z = 0
|
|
vDirToCrossing.z = 0
|
|
|
|
IF DOT_PRODUCT(vVehDir, vDirToCrossing) > 0.0
|
|
bStopCarForLights = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bStopCarForLights
|
|
fDesiredPlaybackSpeed = 0.0
|
|
ENDIF
|
|
|
|
CONVERGE_VALUE(sTrafficCar.fPlaybackSpeed, fDesiredPlaybackSpeed, 0.3, TRUE)
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTrafficCar.veh)
|
|
SET_PLAYBACK_SPEED(sTrafficCar.veh, sTrafficCar.fPlaybackSpeed)
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - sTrafficCar.iTimer > 20000
|
|
AND NOT sTrafficGame.bJunctionCamActive
|
|
IF NOT IS_ENTITY_ON_SCREEN(sTrafficCar.veh)
|
|
sTrafficCar.bIsOffScreen = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC*/
|
|
|
|
FUNC BOOL CREATE_TRAFFIC_CAR_USING_RECORDING(TRAFFIC_GAME_CAR &sTrafficCar, MODEL_NAMES model, INT iCarrec)
|
|
REQUEST_VEHICLE_RECORDING(iCarrec, strCarrec)
|
|
REQUEST_MODEL(model)
|
|
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrec, strCarrec)
|
|
VECTOR vStartPos = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(iCarrec, 0.0, strCarrec)
|
|
|
|
IF NOT DOES_ENTITY_EXIST(sTrafficCar.veh)
|
|
IF HAS_MODEL_LOADED(model)
|
|
sTrafficCar.veh = CREATE_VEHICLE(model, vStartPos)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sTrafficCar.veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sTrafficCar.veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sTrafficCar.veh)
|
|
ENDIF
|
|
|
|
sTrafficCar.iTimer = GET_GAME_TIMER()
|
|
sTrafficCar.fPlaybackSpeed = 1.0
|
|
sTrafficCar.bIsCreated = TRUE
|
|
sTrafficCar.bIsOffScreen = FALSE
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(sTrafficCar.veh, iCarrec, strCarrec)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sTrafficCar.veh)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
///Finds a random position around a given central point and places a car there.
|
|
/// If bOnlyHeadTowardsJunction is TRUE cars will only be position so that they're heading towards the junction rather than away from it.
|
|
FUNC BOOL SET_TRAFFIC_CAR_RANDOM_POSITION_AROUND_JUNCTION(TRAFFIC_GAME_CAR &sTrafficCar, INT iJunction, BOOL bOnlyHeadTowardsJunction = FALSE,
|
|
FLOAT fMinDistFromCentre = 35.0, FLOAT fMaxDistFromCentre = 60.0)
|
|
//Fetch a random road node around the junction
|
|
FLOAT fRandomAngle = GET_RANDOM_FLOAT_IN_RANGE(0.0, 359.9)
|
|
FLOAT fRandomDist = GET_RANDOM_FLOAT_IN_RANGE(fMinDistFromCentre, fMaxDistFromCentre)
|
|
FLOAT fRandomX = -SIN(fRandomAngle) * fRandomDist
|
|
FLOAT fRandomY = COS(fRandomAngle) * fRandomDist
|
|
VECTOR vCurrentJunctionPos = sTrafficJunction[iJunction].vCentre
|
|
VECTOR vRandomPos = vCurrentJunctionPos + <<fRandomX, fRandomY, 0.0>>
|
|
VECTOR vNodePos
|
|
FLOAT fNodeHeading
|
|
|
|
IF bOnlyHeadTowardsJunction
|
|
GET_NTH_CLOSEST_VEHICLE_NODE_FAVOUR_DIRECTION(vRandomPos, vCurrentJunctionPos, 0, vNodePos, fNodeHeading)
|
|
ELSE
|
|
GET_CLOSEST_VEHICLE_NODE_WITH_HEADING(vRandomPos, vNodePos, fNodeHeading)
|
|
ENDIF
|
|
|
|
//Check the node is safe: there can't be any cars there and it must not obstruct the gold vans.
|
|
IF NOT IS_AREA_OCCUPIED(vNodePos - <<5.0, 5.0, 5.0>>, vNodePos + <<5.0, 5.0, 5.0>>, FALSE, TRUE, FALSE, FALSE, FALSE)
|
|
INT iClosestCrossing = -1
|
|
FLOAT fClosestDist = 0.0
|
|
|
|
GET_CLOSEST_CROSSING_ON_JUNCTION(vNodePos, iJunction, iClosestCrossing, fClosestDist)
|
|
|
|
//If currently viewing the junction cam we can't respawn the car if the position is from the north, as this will be visible on the junction cam.
|
|
IF iClosestCrossing != TC_NORTH_JUNCTION
|
|
OR NOT bOnlyHeadTowardsJunction
|
|
IF IS_VEHICLE_DRIVEABLE(sTrafficCar.veh)
|
|
SET_ENTITY_COORDS(sTrafficCar.veh, vNodePos)
|
|
SET_ENTITY_HEADING(sTrafficCar.veh, fNodeHeading)
|
|
FREEZE_ENTITY_POSITION(sTrafficCar.veh, FALSE)
|
|
|
|
//Give the cars a destination: have them drive forwards from the position they spawned.
|
|
sTrafficCar.vCurrentDest = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sTrafficCar.veh, <<0.0, 500.0, 0.0>>)
|
|
|
|
//Clear any previous driving tasks the driver may have.
|
|
PED_INDEX pedDriver = GET_PED_IN_VEHICLE_SEAT(sTrafficCar.veh, VS_DRIVER)
|
|
|
|
IF NOT IS_PED_INJURED(pedDriver)
|
|
CLEAR_PED_TASKS(pedDriver)
|
|
ENDIF
|
|
|
|
//Give the car a start speed if the light is green or the start distance is far enough.
|
|
IF NOT sTrafficJunction[iJunction].sCrossings[iClosestCrossing].bIsBlocked
|
|
OR fClosestDist > 900.0
|
|
SET_VEHICLE_FORWARD_SPEED(sTrafficCar.veh, 10.0)
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("finale_heist2a.sc - Car successfully repositioned. Junction = ", iJunction, " Crossing = ", iClosestCrossing, " Distance = ", fClosestDist)
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC SWAP_LIGHTS_AT_JUNCTION(INT iJunction)
|
|
INT i = 0
|
|
REPEAT 4 i
|
|
sTrafficJunction[iJunction].sCrossings[i].bIsBlocked = NOT sTrafficJunction[iJunction].sCrossings[i].bIsBlocked
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
PROC UPDATE_TRAFFIC_GAME(BOOL bDrawScaleform = TRUE)
|
|
CONST_INT SELECTION_INTERVAL 300
|
|
CONST_INT NOISE_TIME 1000
|
|
|
|
BOOL bPlayLightsChangeSound = FALSE
|
|
BOOL bPlayRandomLightsChangeSound = FALSE
|
|
BOOL bIsStatic = FALSE
|
|
|
|
INT iBufferWaitTime = 0
|
|
INT i = 0
|
|
INT iLeftX = GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_MOVE_LR) - 128
|
|
INT iLeftY = GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_MOVE_UD) - 128
|
|
|
|
// Mouse/Trackpad support
|
|
FLOAT fCursorX = GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_CURSOR_X)
|
|
FLOAT fCursorY = GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_CURSOR_Y)
|
|
INT iPCCursorSelection = -1 // The junction selected by the cursor
|
|
VECTOR v2DPos // 2D UI position of junction
|
|
|
|
//B* 2183999: - Multihead fix for cursor position
|
|
//REMOVE IF CODE FIXES THIS!!!! - Dan H
|
|
// IF GET_ASPECT_RATIO(TRUE) > 3.0
|
|
// CPRINTLN(debug_dan,"REMOVE THIS IFFY FIX if code fixes this")
|
|
// fCursorX *= 3
|
|
// fCursorX -=1
|
|
// ENDIF
|
|
|
|
bPCCursorAccept = FALSE // For changing traffic lights using mouse button.
|
|
|
|
IF iHackerLevel = HACKER_LEVEL_MEDIUM
|
|
iBufferWaitTime = 500
|
|
ELIF iHackerLevel = HACKER_LEVEL_BAD
|
|
iBufferWaitTime = 2000
|
|
ENDIF
|
|
|
|
//Disable Switch HUD.
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CHARACTER_WHEEL)
|
|
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_CHARACTER_WHEEL)
|
|
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME)
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_DISTRICT_NAME)
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_STREET_NAME)
|
|
|
|
IF NOT bDisabledSwitch
|
|
DISABLE_SELECTOR()
|
|
|
|
bDisabledSwitch = TRUE
|
|
ENDIF
|
|
|
|
//Cap really small values to prevent jittering
|
|
IF ABSI(iLeftX) < 10
|
|
iLeftX = 0
|
|
ENDIF
|
|
|
|
IF ABSI(iLeftY) < 10
|
|
iLeftY = 0
|
|
ENDIF
|
|
|
|
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_BEFORE_HUD)
|
|
|
|
IF NOT IS_RADAR_HIDDEN()
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
ENDIF
|
|
|
|
//If the mission has failed during the traffic game continue drawing the HUD but fade it out.
|
|
IF bMissionFailed
|
|
sTrafficGame.fHudAlpha = sTrafficGame.fHudAlpha -@ 125.0
|
|
IF sTrafficGame.fHudAlpha < 0.0
|
|
sTrafficGame.fHudAlpha = 0.0
|
|
ENDIF
|
|
|
|
sTrafficGame.fNoiseLevel = sTrafficGame.fNoiseLevel +@ 1.0
|
|
IF sTrafficGame.fNoiseLevel > 255.0
|
|
sTrafficGame.fNoiseLevel = 255.0
|
|
ENDIF
|
|
|
|
SET_NOISINESSOVERIDE(sTrafficGame.fNoiseLevel)
|
|
ENDIF
|
|
|
|
//The traffic HUD starts with a loading anim, don't allow control while this is active.
|
|
IF (eMissionStage = STAGE_TRAFFIC_CONTROL AND (eSectionStage = SECTION_STAGE_RUNNING OR eSectionStage = SECTION_STAGE_CLEANUP))
|
|
OR eMissionStage = STAGE_ARRIVAL_CUTSCENE //Need to continue to draw HUD while this stage loads.
|
|
//Camera selection
|
|
IF NOT bMissionFailed
|
|
IF (IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_VEH_CIN_CAM) OR IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL)) // PC right mouse button to change view
|
|
AND sTrafficGame.bAllowCamSwitch
|
|
AND iHackerLevel = HACKER_LEVEL_GOOD
|
|
IF NOT sTrafficGame.bJunctionCamActive
|
|
SET_CAM_COORD(camMain, sTrafficJunction[sTrafficGame.iSelection].vCamPos)
|
|
SET_CAM_ROT(camMain, sTrafficJunction[sTrafficGame.iSelection].vCamRot)
|
|
SET_CAM_FOV(camMain, sTrafficJunction[sTrafficGame.iSelection].fCamFov)
|
|
|
|
SET_NOISINESSOVERIDE(255.0)
|
|
sTrafficGame.iNoiseTimer = GET_GAME_TIMER()
|
|
|
|
PLAY_SOUND_FRONTEND(sTrafficGame.iStaticSound, "TRAFFIC_CONTROL_CHANGE_CAM", "BIG_SCORE_3A_SOUNDS")
|
|
|
|
//If we've switched junctions then we need to reposition the pool of traffic cars around the new junction.
|
|
IF sTrafficGame.iSelection != sTrafficGame.iLastJunctionCamViewed
|
|
iCurrentTrafficCarToReposition = 0
|
|
ENDIF
|
|
|
|
IF NOT sTrafficGame.bJunctionStreamingActive
|
|
AND NOT bTrafficEndStreamingActive
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
VECTOR vFrustrumPos, vFrustrumDir
|
|
|
|
vFrustrumDir = CONVERT_ROTATION_TO_DIRECTION_VECTOR(sTrafficJunction[sTrafficGame.iSelection].vCamRot)
|
|
vFrustrumPos = sTrafficJunction[sTrafficGame.iSelection].vCamPos //- (vFrustrumDir * 10.0)
|
|
|
|
NEW_LOAD_SCENE_START(vFrustrumPos, vFrustrumDir, 50.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
|
|
|
|
//NEW_LOAD_SCENE_START_SPHERE(sTrafficJunction[sTrafficGame.iSelection].vCentre, 60.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
|
|
sTrafficGame.bJunctionStreamingActive = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
sTrafficGame.iLastJunctionCamViewed = sTrafficGame.iSelection
|
|
sTrafficGame.bJunctionCamActive = TRUE
|
|
ENDIF
|
|
ELIF sTrafficGame.bJunctionCamActive
|
|
SET_CAM_COORD(camMain, vTrafficGameMainCamPos)
|
|
SET_CAM_ROT(camMain, vTrafficGameMainCamRot)
|
|
SET_CAM_FOV(camMain, fTrafficGameMainCamFOV)
|
|
|
|
SET_NOISINESSOVERIDE(255.0)
|
|
sTrafficGame.iNoiseTimer = GET_GAME_TIMER() - (NOISE_TIME / 2) //Leave the noise up for less when coming out of the cam.
|
|
|
|
PLAY_SOUND_FRONTEND(sTrafficGame.iStaticSound, "TRAFFIC_CONTROL_CHANGE_CAM", "BIG_SCORE_3A_SOUNDS")
|
|
|
|
sTrafficGame.bJunctionCamActive = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT sTrafficGame.bJunctionCamActive
|
|
//If we're in the overhead view don't reposition any traffic cars (this will also reset the value for z-skipping etc).
|
|
iCurrentTrafficCarToReposition = 1000
|
|
|
|
//Remove any load scenes (don't remove if the final load scene has been started).
|
|
IF sTrafficGame.bJunctionStreamingActive
|
|
AND NOT bTrafficEndStreamingActive
|
|
NEW_LOAD_SCENE_STOP()
|
|
sTrafficGame.bJunctionStreamingActive = FALSE
|
|
ENDIF
|
|
|
|
// Work out which junction is being highlighted if using mouse or trackpad
|
|
IF IS_USING_CURSOR(FRONTEND_CONTROL)
|
|
|
|
SET_MOUSE_CURSOR_THIS_FRAME()
|
|
|
|
iPCCursorSelection = -1
|
|
|
|
REPEAT COUNT_OF(sTrafficJunction) i
|
|
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(sTrafficJunction[i].vCentre, v2DPos.x, v2DPos.y)
|
|
IF VDIST( << v2DPos.x, v2DPos.Y, 0.0>>, <<fCursorX, fCursorY, 0.0 >> ) < 0.04
|
|
DRAW_RECT(v2DPos.x, v2DPos.Y, 0.040, 0.065, 255,255,255,64,TRUE)
|
|
iPCCursorSelection = i
|
|
ENDIF
|
|
|
|
ENDREPEAT
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//Reposition the traffic cars after a switch to junction cam: this should take place during the static.
|
|
IF iCurrentTrafficCarToReposition < COUNT_OF(sTrafficGameCars)
|
|
INT iRepostionAttemptsThisFrame = 0
|
|
|
|
WHILE iRepostionAttemptsThisFrame < 5 AND iCurrentTrafficCarToReposition < COUNT_OF(sTrafficGameCars)
|
|
IF SET_TRAFFIC_CAR_RANDOM_POSITION_AROUND_JUNCTION(sTrafficGameCars[iCurrentTrafficCarToReposition], sTrafficGame.iSelection)
|
|
iCurrentTrafficCarToReposition++
|
|
ENDIF
|
|
PRINTLN("@@@@@@@@@ iRepostionAttemptsThisFrame: ", iRepostionAttemptsThisFrame, " @@@@@@@@@")
|
|
iRepostionAttemptsThisFrame++
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
//Turn off the static after a set amount of time: also keep the static up if there are things streaming in.
|
|
IF GET_GAME_TIMER() - sTrafficGame.iNoiseTimer > NOISE_TIME
|
|
AND iCurrentTrafficCarToReposition >= COUNT_OF(sTrafficGameCars)
|
|
IF (sTrafficGame.bJunctionStreamingActive AND IS_NEW_LOAD_SCENE_ACTIVE() AND IS_NEW_LOAD_SCENE_LOADED())
|
|
OR NOT sTrafficGame.bJunctionStreamingActive
|
|
SET_NOISINESSOVERIDE(sTrafficGame.fNoiseLevel)
|
|
|
|
IF NOT HAS_SOUND_FINISHED(sTrafficGame.iStaticSound)
|
|
STOP_SOUND(sTrafficGame.iStaticSound)
|
|
ENDIF
|
|
ELSE
|
|
bIsStatic = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bIsStatic = TRUE
|
|
ENDIF
|
|
|
|
//Update the cursor position to interp to the currently selected junction.
|
|
IF sTrafficGame.vCursorPos.x = 0.0
|
|
sTrafficGame.vCursorPos = sTrafficJunction[sTrafficGame.iSelection].vCentre
|
|
ELSE
|
|
VECTOR vDesiredPos = sTrafficJunction[sTrafficGame.iSelection].vCentre
|
|
|
|
sTrafficGame.vCursorPos.x = sTrafficGame.vCursorPos.x + ((vDesiredPos.x - sTrafficGame.vCursorPos.x) * 0.3)
|
|
sTrafficGame.vCursorPos.y = sTrafficGame.vCursorPos.y + ((vDesiredPos.y - sTrafficGame.vCursorPos.y) * 0.3)
|
|
sTrafficGame.vCursorPos.z = sTrafficGame.vCursorPos.z + ((vDesiredPos.z - sTrafficGame.vCursorPos.z) * 0.3)
|
|
ENDIF
|
|
|
|
/* Mouse debug
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(sTrafficGame.vCursorPos, v2DPos.x, v2DPos.y)
|
|
|
|
DISPLAY_TEXT_WITH_FLOAT( 0.1, 0.1, "NUMBER", v2DPos.x, 2 )
|
|
DISPLAY_TEXT_WITH_FLOAT( 0.1, 0.2, "NUMBER", v2DPos.y, 2 )
|
|
DISPLAY_TEXT_WITH_FLOAT( 0.2, 0.1, "NUMBER", fCursorX, 2 )
|
|
DISPLAY_TEXT_WITH_FLOAT( 0.2, 0.2, "NUMBER", fCursorY, 2 )
|
|
*/
|
|
|
|
//Update the cops sprite colour values: this gives the impression of the cops sprites flashing red/blue
|
|
IF sTrafficGame.iCopsSpriteColourDir = 0
|
|
sTrafficGame.iCopsSpriteColourDir = 1
|
|
ELSE
|
|
sTrafficGame.iCopsSpriteColourModifier += sTrafficGame.iCopsSpriteColourDir * 48
|
|
|
|
IF sTrafficGame.iCopsSpriteColourModifier < 0
|
|
sTrafficGame.iCopsSpriteColourModifier = 0
|
|
sTrafficGame.iCopsSpriteColourDir = 1
|
|
ELIF sTrafficGame.iCopsSpriteColourModifier > 255
|
|
sTrafficGame.iCopsSpriteColourModifier = 255
|
|
sTrafficGame.iCopsSpriteColourDir = -1
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
// Change traffic lights using mouse/Trackpad
|
|
IF IS_USING_CURSOR(FRONTEND_CONTROL)
|
|
|
|
// Work out which traffic junction is highlighted by the cursor
|
|
IF NOT sTrafficGame.bJunctionCamActive
|
|
|
|
// If mouse is over the current selection, and clicked, then switch.
|
|
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)
|
|
IF sTrafficGame.iSelection = iPCCursorSelection
|
|
bPCCursorAccept = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
// Traffic cam active, just switch.
|
|
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)
|
|
bPCCursorAccept = TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//Reverse the traffic lights on the current junction if (A) is pressed. Depending on the hacker the lights may not change immediately, instead
|
|
//they're set to a buffering state, then after a certain amount of time they change. Lights can't be changed while they're buffering.
|
|
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SPRINT) OR bPCCursorAccept
|
|
AND sTrafficGame.bAllowSwitch
|
|
AND NOT bMissionFailed
|
|
IF NOT sTrafficJunction[sTrafficGame.iSelection].bIsBuffering
|
|
sTrafficJunction[sTrafficGame.iSelection].bIsBuffering = TRUE
|
|
sTrafficJunction[sTrafficGame.iSelection].iBufferingTimer = GET_GAME_TIMER()
|
|
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FH2A_TRAFFIC_LIGHT_CHANGES)
|
|
|
|
bPlayLightsChangeSound = TRUE
|
|
iTimeOfLastTrafficSwitch = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Handle the lights changing: the lights can change under two conditions:
|
|
// - At random intervals of approx 20 seconds (if they're not currently frozen.
|
|
// - If the light has been selected by the player: once the buffer time is done it will change.
|
|
REPEAT COUNT_OF(sTrafficJunction) i
|
|
IF sTrafficJunction[i].bIsBuffering
|
|
IF (iHackerLevel = HACKER_LEVEL_GOOD)
|
|
OR (GET_GAME_TIMER() - sTrafficJunction[i].iBufferingTimer > iBufferWaitTime)
|
|
SWAP_LIGHTS_AT_JUNCTION(i)
|
|
|
|
sTrafficJunction[i].iChangeTimer = 0
|
|
sTrafficJunction[i].bIsBuffering = FALSE
|
|
ENDIF
|
|
ELSE
|
|
IF sTrafficJunction[i].iChangeTimer = 0
|
|
sTrafficJunction[i].iChangeTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(-3000, 3000)
|
|
ELIF GET_GAME_TIMER() - sTrafficJunction[i].iChangeTimer > 20000
|
|
IF NOT sTrafficJunction[i].bLightsFrozen
|
|
IF NOT (i = 0 AND NOT sTrafficGame.bAllowMovement) //Don't switch the first set of lights if the player hasn't done the tutorial yet.
|
|
AND i != sTrafficGame.iSelection
|
|
SWAP_LIGHTS_AT_JUNCTION(i)
|
|
|
|
bPlayRandomLightsChangeSound = TRUE
|
|
sTrafficJunction[i].iChangeTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(-3000, 3000)
|
|
ELSE
|
|
//If the player hasn't done the tutorial yet or the junction is higlighted just keep updating the timer so it doesn't switch the lights.
|
|
sTrafficJunction[i].iChangeTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELSE
|
|
//If the light has been deliberately frozen then increment the timer.
|
|
sTrafficJunction[i].iChangeTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDREPEAT
|
|
|
|
IF NOT sTrafficGame.bJunctionCamActive
|
|
//Select the adjacent junction based on stick direction (if the selection didn't already update).
|
|
IF GET_GAME_TIMER() - sTrafficGame.iTimeSinceLastSelection > SELECTION_INTERVAL
|
|
AND sTrafficGame.bAllowMovement
|
|
AND NOT bMissionFailed
|
|
INT iMaxValue = 0
|
|
INT iDirection = 0
|
|
BOOL bDpadPressed = FALSE
|
|
|
|
// Use mouse to select new junction
|
|
IF IS_USING_CURSOR(FRONTEND_CONTROL)
|
|
|
|
IF iPCCursorSelection != -1
|
|
|
|
IF IS_CONTROL_JUST_PRESSED( FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT )
|
|
|
|
// Selecting different junction = change junction
|
|
IF sTrafficGame.iSelection != iPCCursorSelection
|
|
sTrafficGame.iSelection = iPCCursorSelection
|
|
PLAY_SOUND_FRONTEND(-1, "TRAFFIC_CONTROL_MOVE_CROSSHAIR", "BIG_SCORE_3A_SOUNDS")
|
|
sTrafficGame.iTimeSinceLastSelection = GET_GAME_TIMER()
|
|
bPCCursorMoved = TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE // Use gamepad to select junction
|
|
|
|
|
|
IF ABSI(iLeftX) > ABSI(iLeftY)
|
|
iMaxValue = iLeftX
|
|
|
|
IF iLeftX < 0
|
|
iDirection = TC_WEST_JUNCTION
|
|
ELSE
|
|
iDirection = TC_EAST_JUNCTION
|
|
ENDIF
|
|
ELSE
|
|
iMaxValue = iLeftY
|
|
|
|
IF iLeftY < 0
|
|
iDirection = TC_NORTH_JUNCTION
|
|
ELSE
|
|
iDirection = TC_SOUTH_JUNCTION
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Allow D-pad control too
|
|
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_UP)
|
|
iDirection = TC_NORTH_JUNCTION
|
|
bDpadPressed = TRUE
|
|
ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_DOWN)
|
|
iDirection = TC_SOUTH_JUNCTION
|
|
bDpadPressed = TRUE
|
|
ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_LEFT)
|
|
iDirection = TC_WEST_JUNCTION
|
|
bDpadPressed = TRUE
|
|
ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT)
|
|
iDirection = TC_EAST_JUNCTION
|
|
bDpadPressed = TRUE
|
|
ENDIF
|
|
|
|
IF (ABSI(iMaxValue) > 60 OR bDpadPressed)
|
|
AND sTrafficJunction[sTrafficGame.iSelection].sCrossings[iDirection].iAdjacentJunction >= 0
|
|
PLAY_SOUND_FRONTEND(-1, "TRAFFIC_CONTROL_MOVE_CROSSHAIR", "BIG_SCORE_3A_SOUNDS")
|
|
|
|
sTrafficGame.iSelection = sTrafficJunction[sTrafficGame.iSelection].sCrossings[iDirection].iAdjacentJunction
|
|
sTrafficGame.iTimeSinceLastSelection = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF bPlayLightsChangeSound
|
|
PLAY_SOUND_FRONTEND(sTrafficGame.iSelectSound, "TRAFFIC_CONTROL_TOGGLE_LIGHT", "BIG_SCORE_3A_SOUNDS")
|
|
SET_VARIABLE_ON_SOUND(sTrafficGame.iSelectSound, "delay", TO_FLOAT(iBufferWaitTime) / 1000.0)
|
|
ENDIF
|
|
|
|
IF bPlayRandomLightsChangeSound
|
|
PLAY_SOUND_FRONTEND(-1, "Traffic_Control_Light_Switch_Back", "BIG_SCORE_3A_SOUNDS")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_INTERSECTION_CAM")
|
|
STOP_AUDIO_SCENE("BS_2A_INTERSECTION_CAM")
|
|
ENDIF
|
|
|
|
//Sprite drawing
|
|
IF NOT bIsStatic
|
|
AND bDrawScaleform
|
|
//AND NOT bMissionFailed
|
|
SET_SCRIPT_GFX_DRAW_BEHIND_PAUSEMENU(TRUE)
|
|
|
|
REPEAT COUNT_OF(sTrafficJunction) i
|
|
IF sTrafficJunction[i].bIsBuffering
|
|
DRAW_BUFFERING_INDICATOR(i)
|
|
ENDIF
|
|
|
|
TC_DRAW_JUNCTION_MARKERS(i)
|
|
ENDREPEAT
|
|
|
|
//Draw the van blips: they don't appear at first, then flash after a few seconds
|
|
IF iTrafficBlipFlashTimer = 0
|
|
TC_DRAW_VEHICLE_MARKER(sGoldVans[0].veh, FALSE)
|
|
TC_DRAW_VEHICLE_MARKER(sGoldVans[1].veh, FALSE)
|
|
ELSE
|
|
IF GET_GAME_TIMER() - iTrafficBlipFlashTimer < 1500
|
|
IF (GET_GAME_TIMER() - iTrafficBlipFlashTimer) % 200 < 100
|
|
TC_DRAW_VEHICLE_MARKER(sGoldVans[0].veh, FALSE)
|
|
TC_DRAW_VEHICLE_MARKER(sGoldVans[1].veh, FALSE)
|
|
ENDIF
|
|
ELSE
|
|
//Just draw the blips normally.
|
|
TC_DRAW_VEHICLE_MARKER(sGoldVans[0].veh, FALSE)
|
|
TC_DRAW_VEHICLE_MARKER(sGoldVans[1].veh, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(sTrafficGameCops) i
|
|
TC_DRAW_VEHICLE_MARKER(sTrafficGameCops[i].veh, TRUE, sTrafficGameCops[i].iFlashTimer)
|
|
ENDREPEAT
|
|
|
|
TC_DRAW_CURSOR()
|
|
|
|
//Destination text: this seems to draw over the loading screen even when using GFX_ORDER_AFTER_HUD, so just delay it until the loading screen is done
|
|
IF sTrafficGame.bAllowSwitch = TRUE
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
|
|
VECTOR vFranklinPos
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(<<59.4589, -1168.9636, 28.4826>>, vFranklinPos.x, vFranklinPos.y)
|
|
|
|
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_AFTER_HUD)
|
|
DRAW_RECT(vFranklinPos.x, vFranklinPos.y, 0.01 * sTrafficGame.fAspectRatio, 0.01, 255, 255, 96, CEIL(sTrafficGame.fHudAlpha),TRUE)
|
|
|
|
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_AFTER_HUD)
|
|
SET_TEXT_JUSTIFICATION(FONT_CENTRE)
|
|
SET_TEXT_SCALE(0.4, 0.4)
|
|
SET_TEXT_COLOUR(255, 255, 96, CEIL(sTrafficGame.fHudAlpha))
|
|
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("F3A_TRAFDEST")
|
|
END_TEXT_COMMAND_DISPLAY_TEXT(vFranklinPos.x, vFranklinPos.y + 0.01, 1)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
sTrafficGame.fCamRotOffsetX = 0.0
|
|
sTrafficGame.fCamRotOffsetZ = 0.0
|
|
|
|
fTrafficLatitude[0] = TO_FLOAT(ROUND(ABSF(vTrafficGameMainCamPos.y)))
|
|
fTrafficLatitude[1] = 78.0
|
|
fTrafficLatitude[2] = TO_FLOAT(ROUND(ABSF(vTrafficGameMainCamPos.x)))
|
|
fTrafficLatitude[3] = 55.0
|
|
ELSE
|
|
//Allow the player to move the cam around a bit when viewing the junction cam.
|
|
CONST_FLOAT MAX_ROT_X 20.0
|
|
CONST_FLOAT MAX_ROT_Z 20.0
|
|
CONST_FLOAT ROT_SPEED 60.0
|
|
|
|
//Take into account invert look
|
|
IF IS_LOOK_INVERTED()
|
|
iLeftY = -iLeftY
|
|
ENDIF
|
|
|
|
FLOAT fDesiredOffsetX = sTrafficGame.fCamRotOffsetX +@ ((TO_FLOAT(-iLeftY) / 128.0) * ROT_SPEED)
|
|
FLOAT fDesiredOffsetZ = sTrafficGame.fCamRotOffsetZ +@ ((TO_FLOAT(-iLeftX) / 128.0) * ROT_SPEED)
|
|
|
|
// Mouse look on PC
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
fDesiredOffsetX = sTrafficGame.fCamRotOffsetX + GET_CONTROL_UNBOUND_NORMAL(FRONTEND_CONTROL, INPUT_LOOK_UD) * -30
|
|
fDesiredOffsetZ = sTrafficGame.fCamRotOffsetZ + GET_CONTROL_UNBOUND_NORMAL(FRONTEND_CONTROL, INPUT_LOOK_LR) * -30
|
|
ENDIF
|
|
|
|
IF fDesiredOffsetX > MAX_ROT_X
|
|
fDesiredOffsetX = MAX_ROT_X
|
|
ELIF fDesiredOffsetX < -MAX_ROT_X
|
|
fDesiredOffsetX = -MAX_ROT_X
|
|
ENDIF
|
|
|
|
IF fDesiredOffsetZ > MAX_ROT_Z
|
|
fDesiredOffsetZ = MAX_ROT_Z
|
|
ELIF fDesiredOffsetZ < -MAX_ROT_Z
|
|
fDesiredOffsetZ = -MAX_ROT_Z
|
|
ENDIF
|
|
|
|
// Only auto-centre on gamepad.
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
sTrafficGame.fCamRotOffsetX = fDesiredOffsetX
|
|
sTrafficGame.fCamRotOffsetZ = fDesiredOffsetZ
|
|
ELSE
|
|
sTrafficGame.fCamRotOffsetX = sTrafficGame.fCamRotOffsetX + ((fDesiredOffsetX - sTrafficGame.fCamRotOffsetX) * 0.2)
|
|
sTrafficGame.fCamRotOffsetZ = sTrafficGame.fCamRotOffsetZ + ((fDesiredOffsetZ - sTrafficGame.fCamRotOffsetZ) * 0.2)
|
|
ENDIF
|
|
|
|
VECTOR vRotOrigin = sTrafficJunction[sTrafficGame.iSelection].vCamRot //For shorthand purposes
|
|
SET_CAM_ROT(camMain, <<vRotOrigin.x + sTrafficGame.fCamRotOffsetX, vRotOrigin.y, vRotOrigin.z + sTrafficGame.fCamRotOffsetZ>>)
|
|
|
|
//Draw junction-specific traffic marker
|
|
IF NOT bIsStatic
|
|
SET_SCRIPT_GFX_DRAW_BEHIND_PAUSEMENU(TRUE)
|
|
TC_DRAW_SPECIFIC_JUNCTION_MARKER(sTrafficGame.iSelection)
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_INTERSECTION_CAM")
|
|
START_AUDIO_SCENE("BS_2A_INTERSECTION_CAM")
|
|
ENDIF
|
|
|
|
fTrafficLatitude[0] = TO_FLOAT(ROUND(ABSF(sTrafficJunction[sTrafficGame.iSelection].vCamPos.y)))
|
|
fTrafficLatitude[1] = TO_FLOAT(((sTrafficGame.iSelection + 2) * (sTrafficGame.iSelection + 2) * 3) % 100)
|
|
fTrafficLatitude[2] = TO_FLOAT(ROUND(ABSF(sTrafficJunction[sTrafficGame.iSelection].vCamPos.x)))
|
|
fTrafficLatitude[3] = TO_FLOAT(((sTrafficGame.iSelection + 2) * (sTrafficGame.iSelection + 1) * 7) % 100)
|
|
ENDIF
|
|
|
|
//If the latitude changes then update the scaleform movie.
|
|
IF fTrafficLatitude[0] != fPrevTrafficLatitude[0]
|
|
OR fTrafficLatitude[1] != fPrevTrafficLatitude[1]
|
|
OR fTrafficLatitude[2] != fPrevTrafficLatitude[2]
|
|
OR fTrafficLatitude[3] != fPrevTrafficLatitude[3]
|
|
OR fPrevTrafficLatitude[0] = 0.0
|
|
BEGIN_SCALEFORM_MOVIE_METHOD(sfTrafficHud, "SET_LAT_LONG")
|
|
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fTrafficLatitude[0])
|
|
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fTrafficLatitude[1])
|
|
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fTrafficLatitude[2])
|
|
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fTrafficLatitude[3])
|
|
END_SCALEFORM_MOVIE_METHOD()
|
|
ENDIF
|
|
|
|
fPrevTrafficLatitude[0] = fTrafficLatitude[0]
|
|
fPrevTrafficLatitude[1] = fTrafficLatitude[1]
|
|
fPrevTrafficLatitude[2] = fTrafficLatitude[2]
|
|
fPrevTrafficLatitude[3] = fTrafficLatitude[3]
|
|
ENDIF
|
|
|
|
fTrafficTime[0] = TO_FLOAT(ENUM_TO_INT(GET_CLOCK_DAY_OF_WEEK()))
|
|
fTrafficTime[1] = TO_FLOAT(GET_CLOCK_HOURS())
|
|
fTrafficTime[2] = TO_FLOAT(GET_CLOCK_MINUTES())
|
|
|
|
IF fTrafficTime[0] != fPrevTrafficTime[0]
|
|
OR fTrafficTime[1] != fPrevTrafficTime[1]
|
|
OR fTrafficTime[2] != fPrevTrafficTime[2]
|
|
OR fPrevTrafficTime[0] = 0.0
|
|
//Draw scaleform
|
|
//CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfTrafficHud, "SET_CAM_DATE", fTrafficTime[0],
|
|
// fTrafficTime[1], fTrafficTime[2])
|
|
|
|
BEGIN_SCALEFORM_MOVIE_METHOD(sfTrafficHud, "SET_CAM_DATE")
|
|
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fTrafficTime[0])
|
|
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fTrafficTime[1])
|
|
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fTrafficTime[2])
|
|
END_SCALEFORM_MOVIE_METHOD()
|
|
ENDIF
|
|
|
|
fPrevTrafficTime[0] = fTrafficTime[0]
|
|
fPrevTrafficTime[1] = fTrafficTime[1]
|
|
fPrevTrafficTime[2] = fTrafficTime[2]
|
|
|
|
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_BEFORE_HUD)
|
|
SET_SCRIPT_GFX_DRAW_BEHIND_PAUSEMENU(FALSE)
|
|
|
|
IF NOT bTriggeredTrafficIntro
|
|
CALL_SCALEFORM_MOVIE_METHOD(sfTrafficHud, "PLAY_CAM_MOVIE")
|
|
bTriggeredTrafficIntro = TRUE
|
|
ENDIF
|
|
|
|
//Start the looping sound
|
|
IF NOT bTrafficGameAudioSceneActive
|
|
START_AUDIO_SCENE("BIG_SCORE_TRAFFIC_CONTROL_SCENE")
|
|
bTrafficGameAudioSceneActive = TRUE
|
|
|
|
PLAY_SOUND_FRONTEND(sTrafficGame.iBackgroundSound, "TRAFFIC_CONTROL_BG_NOISE", "BIG_SCORE_3A_SOUNDS")
|
|
ENDIF
|
|
|
|
IF NOT bMissionFailed
|
|
AND bDrawScaleform
|
|
DRAW_SCALEFORM_MOVIE_FULLSCREEN(sfTrafficHud, 255, 255, 255, ROUND(sTrafficGame.fHudAlpha))
|
|
ENDIF
|
|
|
|
IF NOT bTrafficAudioStreamActive
|
|
IF LOAD_STREAM("Traffic_Control_BG_Stream", "BIG_SCORE_3A_SOUNDS")
|
|
PLAY_STREAM_FRONTEND()
|
|
|
|
bTrafficAudioStreamActive = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Handle the fail audio
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_TRAFFIC_CONTROL_FAIL")
|
|
IF bMissionFailed
|
|
IF iTrafficFailTimer = 0
|
|
PLAY_SOUND_FRONTEND(-1, "Traffic_Control_Fail", "BIG_SCORE_3A_SOUNDS")
|
|
iTrafficFailTimer = GET_GAME_TIMER()
|
|
ELIF iTrafficFailTimer != -1
|
|
IF GET_GAME_TIMER() - iTrafficFailTimer > 3500
|
|
PLAY_SOUND_FRONTEND(-1, "Traffic_Control_Fail_Blank", "BIG_SCORE_3A_SOUNDS")
|
|
iTrafficFailTimer = -1
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iTrafficFailTimer = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC PRELOAD_ALL_CHASE_RECORDINGS(FLOAT fPlaybackTime)
|
|
INT i = 0
|
|
INT iSetpieceSize = COUNT_OF(SetPieceCarID)
|
|
INT iTrafficSize = COUNT_OF(TrafficCarID)
|
|
|
|
//Only do 10 cars per frame max to save execution time.
|
|
WHILE iPreloadRecordingsIndex < iTrafficSize AND i < 10
|
|
//Do traffic cars
|
|
IF TrafficCarRecording[i] > 0
|
|
IF TrafficCarStartime[i] > fPlaybackTime
|
|
REQUEST_VEHICLE_RECORDING(TrafficCarRecording[i], strCarrec)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Do set-pieces in the same loop
|
|
IF iPreloadRecordingsIndex < iSetpieceSize
|
|
IF SetPieceCarRecording[iPreloadRecordingsIndex] > 0
|
|
IF SetPieceCarStartime[iPreloadRecordingsIndex] > fPlaybackTime
|
|
REQUEST_VEHICLE_RECORDING(SetPieceCarRecording[iPreloadRecordingsIndex], strCarrec)
|
|
ELIF fPlaybackTime > SetPieceCarStartime[iPreloadRecordingsIndex] + 30000
|
|
//Some setpieces aren't being removed, force them to be cleaned up.
|
|
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[iPreloadRecordingsIndex])
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[iPreloadRecordingsIndex])
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(SetPieceCarID[iPreloadRecordingsIndex])
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iPreloadRecordingsIndex++
|
|
i++
|
|
ENDWHILE
|
|
|
|
IF iPreloadRecordingsIndex >= iTrafficSize
|
|
iPreloadRecordingsIndex = 0
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC VEHICLE_INDEX TC_GET_CLOSEST_ENEMY_CAR_TO_PED(PED_INDEX ped, FLOAT &fClosestDistance)
|
|
VEHICLE_INDEX vehClosest
|
|
fClosestDistance = 0.0
|
|
|
|
IF NOT IS_PED_INJURED(ped)
|
|
INT i = 0
|
|
REPEAT COUNT_OF(sTrafficGameCops) i
|
|
IF NOT IS_ENTITY_DEAD(sTrafficGameCops[i].veh)
|
|
FLOAT fDist = VDIST2(GET_ENTITY_COORDS(ped), GET_ENTITY_COORDS(sTrafficGameCops[i].veh))
|
|
|
|
IF fClosestDistance = 0.0
|
|
OR fDist < fClosestDistance
|
|
fClosestDistance = fDist
|
|
vehClosest = sTrafficGameCops[i].veh
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
RETURN vehClosest
|
|
ENDFUNC
|
|
|
|
FUNC TEXT_LABEL GET_NEAR_MISS_TEXT_LABEL(VEHICLE_INDEX vehBuddyCar, VECTOR vEnemyPos)
|
|
TEXT_LABEL strNearMissLabel = ""
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehBuddyCar)
|
|
VECTOR vEnemyOffsetFromBuddy = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehBuddyCar, vEnemyPos)
|
|
|
|
IF ABSF(vEnemyOffsetFromBuddy.x) > ABSF(vEnemyOffsetFromBuddy.y)
|
|
IF vEnemyOffsetFromBuddy.x > 0.0
|
|
strNearMissLabel = "FH3A_MERRYR"
|
|
ELSE
|
|
strNearMissLabel = "FH3A_MERRYL"
|
|
ENDIF
|
|
ELSE
|
|
IF vEnemyOffsetFromBuddy.y > 0.0
|
|
strNearMissLabel = "FH3A_MERRYF"
|
|
ELSE
|
|
strNearMissLabel = "FH3A_MERRYB"
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN strNearMissLabel
|
|
ENDFUNC
|
|
|
|
PROC UPDATE_CREW_CHASE_RECORDING_TO_MATCH_SELECTIONS()
|
|
IF bPickedGoodCarDriver
|
|
IF bPickedGoodTruckDriver
|
|
iCarrecChaseBuddy3 = CARREC_CHASE_BUDDY_3_GOOD_TRUCK
|
|
ELSE
|
|
iCarrecChaseBuddy3 = CARREC_CHASE_BUDDY_3_BAD_TRUCK
|
|
ENDIF
|
|
ELSE
|
|
iCarrecChaseBuddy3 = CARREC_CHASE_BUDDY_3_BAD_DRIVER
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC RUBBER_BAND_CHASE(FLOAT &fCurrentSpeed, VEHICLE_INDEX vehPlayer, VEHICLE_INDEX vehTrigger)
|
|
IF IS_VEHICLE_DRIVEABLE(vehTrigger)
|
|
AND IS_VEHICLE_DRIVEABLE(vehPlayer)
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(vehPlayer)
|
|
VECTOR vTriggerPos = GET_ENTITY_COORDS(vehTrigger)
|
|
|
|
//Rubber banding
|
|
FLOAT fDist = VDIST(vPlayerPos, vTriggerPos)
|
|
FLOAT fTouchingDist = 4.5
|
|
FLOAT fDesiredDist = 8.0
|
|
FLOAT fMaxDist = 70.0
|
|
FLOAT fSuperMaxDist = 100.0
|
|
FLOAT fDesiredPlaybackSpeed = 1.0
|
|
FLOAT fAccel = 0.0
|
|
FLOAT fPlayersSpeedModifier = 0.0
|
|
FLOAT fMaxDistInFront = 30.0
|
|
FLOAT fPlayerSpeed = GET_ENTITY_SPEED(vehPlayer)
|
|
FLOAT fSpeedDiff = GET_ENTITY_SPEED(vehTrigger) - fPlayerSpeed
|
|
|
|
//Default values for any adjustments to the player's speed and the playback accel.
|
|
IF IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
|
|
fAccel = 0.025
|
|
fPlayersSpeedModifier = -25.0
|
|
ELSE
|
|
fAccel = 0.01
|
|
fPlayersSpeedModifier = 0.0
|
|
ENDIF
|
|
|
|
//Special cases:
|
|
IF fChasePlaybackTime < 10000.0 //Start of chase: don't let cars shoot ahead
|
|
fDesiredDist = 10.0
|
|
fTouchingDist = 0.0
|
|
fMaxDist = 20.0
|
|
fSuperMaxDist = 50.0
|
|
ENDIF
|
|
|
|
IF fChasePlaybackTime > 58000.0 AND fChasePlaybackTime < 71000.0 //Get cars further in front for the jump.
|
|
fDesiredDist = 15.0
|
|
fTouchingDist = 7.5
|
|
fMaxDist = 90.0
|
|
fAccel *= 0.5
|
|
|
|
//During the actual jump speed up even more.
|
|
IF fCurrentTimeScale < 0.5 AND fChasePlaybackTime > 69000.0
|
|
fDesiredDist = 30.0
|
|
fTouchingDist = 15.0
|
|
fAccel *= 3.0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fChasePlaybackTime > 71000.0 AND fChasePlaybackTime < 81000.0 //Straight after the jump bring them back closer.
|
|
fMaxDist = 30.0
|
|
fSuperMaxDist = 50.0
|
|
fAccel *= 1.5
|
|
ENDIF
|
|
|
|
IF fChasePlaybackTime > 90000.0 //Approaching trucks: keep cars further forward.
|
|
fDesiredDist = 20.0
|
|
fMaxDist = 80.0
|
|
ENDIF
|
|
|
|
FLOAT fDistRatio = 0.0
|
|
VECTOR vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrigger, vPlayerPos)
|
|
IF vOffset.y < 1.0
|
|
//Player is behind
|
|
IF fDist > fMaxDist
|
|
//Player is a long way behind, slow the trigger car down by a lot (if not on screen).
|
|
BOOl bInsanelyFarBehind = FALSE
|
|
IF fDist > fSuperMaxDist
|
|
IF fDist > 200.0
|
|
bInsanelyFarBehind = TRUE
|
|
ENDIF
|
|
fDist = fSuperMaxDist
|
|
ENDIF
|
|
|
|
fDistRatio = ((fDist - fMaxDist) / (fSuperMaxDist - fMaxDist))
|
|
|
|
IF IS_ENTITY_ON_SCREEN(vehTrigger) AND NOT bInsanelyFarBehind
|
|
IF fSpeedDiff > 10.0
|
|
fDesiredPlaybackSpeed = 0.7 - (0.2 * fDistRatio)
|
|
ELSE
|
|
fDesiredPlaybackSpeed = 0.7 - (0.1 * fDistRatio)
|
|
ENDIF
|
|
ELSE
|
|
fDesiredPlaybackSpeed = 0.7 - (0.4 * fDistRatio) //0.5 - (0.3 * fDistRatio)
|
|
ENDIF
|
|
ELIF fDist > fDesiredDist
|
|
//Player is somewhat behind, slow the trigger car down relative to how far behind the player is.
|
|
fDistRatio = ((fDist - fDesiredDist) / (fMaxDist - fDesiredDist))
|
|
fDesiredPlaybackSpeed = 1.0 - (0.3 * fDistRatio)
|
|
ELSE
|
|
//Player is getting too close, speed up the trigger car relative to how close the player is.
|
|
IF fDist < fTouchingDist
|
|
fDist = fTouchingDist
|
|
ENDIF
|
|
|
|
fDistRatio = (fDesiredDist - fDist) / (fDesiredDist - fTouchingDist)
|
|
|
|
IF IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
|
|
fDesiredPlaybackSpeed = 1.0 + (fDistRatio * 2.0)
|
|
ELSE
|
|
fDesiredPlaybackSpeed = 1.0 + (fDistRatio)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Player is in front, speed up trigger car based on the player's own speed.
|
|
IF fDist > fMaxDistInFront
|
|
fDist = fMaxDistInFront
|
|
ENDIF
|
|
fDistRatio = fDist / fMaxDistInFront
|
|
|
|
//If the player is already going slower then don't speed up the buddy as much.
|
|
IF fSpeedDiff > 0.0
|
|
fDistRatio = fDistRatio * 0.5
|
|
ENDIF
|
|
|
|
IF IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
|
|
fDesiredPlaybackSpeed = 2.0 + fDistRatio
|
|
ELSE
|
|
IF GET_ENTITY_SPEED(vehPlayer) < 5.0 //If the player has slowed down slow the buddy down so it's not as harsh if they plough through.
|
|
AND fSpeedDiff > 0.0
|
|
fDesiredPlaybackSpeed = 0.6 + fDistRatio
|
|
ELSE
|
|
fDesiredPlaybackSpeed = 1.0 + fDistRatio
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Cap the max speed at the start.
|
|
IF fChasePlaybackTime < 10000.0
|
|
AND fDesiredPlaybackSpeed > 1.0
|
|
fDesiredPlaybackSpeed = 1.0
|
|
ENDIF
|
|
|
|
//Push the cars ahead by a lot when doing the stunt jump.
|
|
IF fCurrentTimeScale < 0.5
|
|
fAccel *= 4.0
|
|
|
|
IF fDesiredPlaybackSpeed >= 1.0
|
|
fDesiredPlaybackSpeed *= 1.5
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Slow the chase down at the end
|
|
IF fChasePlaybackTime > 114000.0
|
|
AND fDesiredPlaybackSpeed > 0.9
|
|
fDesiredPlaybackSpeed = 0.9
|
|
ENDIF
|
|
|
|
//If the player doesn't go into the tunnel don't rubber band.
|
|
IF fChasePlaybackTime > 102000.0 AND vPlayerPos.z > 15.0 AND fDesiredPlaybackSpeed < 1.0
|
|
fDesiredPlaybackSpeed = 1.0
|
|
ENDIF
|
|
|
|
//Once all of the cars are on the trucks don't speed up the chase.
|
|
IF (bPickedGoodCarDriver AND NOT IS_ENTITY_DEAD(sGoldCars[2].veh) AND IS_ENTITY_ATTACHED(sGoldCars[2].veh))
|
|
OR (NOT bPickedGoodCarDriver AND fChasePlaybackTime > 109000.0)
|
|
IF fDesiredPlaybackSpeed > 0.8
|
|
fDesiredPlaybackSpeed = 0.8
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
|
|
AND NOT IS_ENTITY_DEAD(sGoldCars[0].veh)
|
|
IF (VDIST2(vPlayerPos, GET_ENTITY_COORDS(vehTrailer[0])) < 900.0 AND NOT IS_ENTITY_ON_SCREEN(sGoldCars[1].veh))
|
|
OR IS_ENTITY_ATTACHED(sGoldCars[1].veh)
|
|
fDesiredPlaybackSpeed = 0.5
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fAccel = 0.02
|
|
ENDIF
|
|
|
|
//If the trigger speed is trying to catch up from really slow then increase the acceleration.
|
|
IF fCurrentSpeed < 1.0
|
|
AND fDesiredPlaybackSpeed > fCurrentSpeed
|
|
fAccel *= 2.0
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vehPlayer)
|
|
fDesiredPlaybackSpeed = 1.0
|
|
ENDIF
|
|
|
|
//Modify the player's speed further based on the desired speed.
|
|
IF fDesiredPlaybackSpeed > 1.0
|
|
fPlayersSpeedModifier = fPlayersSpeedModifier - ((fDesiredPlaybackSpeed - 1.0) * 10.0)
|
|
ENDIF
|
|
|
|
//If the player is approaching the trucks then lower the top speed even more.
|
|
IF fChasePlaybackTime > 106000.0
|
|
AND NOT IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
|
|
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
|
|
IF VDIST2(vPlayerPos, GET_ENTITY_COORDS(vehTrailer[0])) < 10000.0
|
|
fPlayersSpeedModifier -= 20.0
|
|
|
|
IF fPlayerSpeed > 35.0
|
|
FLOAT fNewSpeed = fPlayerSpeed -@ (fPlayerSpeed * 0.2)
|
|
SET_VEHICLE_FORWARD_SPEED(vehPlayer, fNewSpeed)
|
|
ENDIF
|
|
/*AND IS_VEHICLE_ON_ALL_WHEELS(vehPlayer)
|
|
VECTOR vVel = GET_ENTITY_VELOCITY(vehPlayer)
|
|
vVel = vVel -@ (vVel * 5.0)
|
|
|
|
PRINTLN(vVel)
|
|
|
|
SET_ENTITY_VELOCITY(vehPlayer, vVel)
|
|
ENDIF*/
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Make the speed changes.
|
|
MODIFY_VEHICLE_TOP_SPEED(sGoldCars[PLAYERS_GOLD_CAR].veh, fPlayersSpeedModifier)
|
|
fCurrentSpeed = fCurrentSpeed +@ (((fDesiredPlaybackSpeed - fCurrentSpeed) * fAccel) * 30.0)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF bDebugShowChaseStats
|
|
SET_TEXT_SCALE(0.5, 0.5)
|
|
TEXT_LABEL_63 strDist = "Distance: "
|
|
strDist += GET_STRING_FROM_FLOAT(fDist)
|
|
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.1, "STRING", strDist)
|
|
|
|
SET_TEXT_SCALE(0.5, 0.5)
|
|
TEXT_LABEL_63 strSpeed = "Playback speed: "
|
|
strSpeed += GET_STRING_FROM_FLOAT(fChasePlaybackSpeed)
|
|
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.15, "STRING", strSpeed)
|
|
|
|
SET_TEXT_SCALE(0.5, 0.5)
|
|
TEXT_LABEL_63 strTime = "Time: "
|
|
strTime += GET_STRING_FROM_FLOAT(fChasePlaybackTime)
|
|
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.2, "STRING", strTime)
|
|
|
|
SET_TEXT_SCALE(0.5, 0.5)
|
|
TEXT_LABEL_63 strDiff = "Speed Diff: "
|
|
strDiff += GET_STRING_FROM_FLOAT(GET_ENTITY_SPEED(vehTrigger) - GET_ENTITY_SPEED(vehPlayer))
|
|
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.25, "STRING", strDiff)
|
|
|
|
SET_TEXT_SCALE(0.5, 0.5)
|
|
TEXT_LABEL_63 strState = "Trigger car state: "
|
|
IF vOffset.y < 0.0
|
|
strState += "in front and "
|
|
ELSE
|
|
strState += "behind and "
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_ON_SCREEN(vehTrigger)
|
|
strState += "on screen."
|
|
ELSE
|
|
strState += "off screen."
|
|
ENDIF
|
|
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.3, "STRING", strState)
|
|
ENDIF
|
|
#ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DO_TREVOR_STOCKADE_CAM()
|
|
IF IS_PHONE_ONSCREEN()
|
|
iCineCamPhoneTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD SCRIPT_ASSERT("PRIVATE_IsChaseHintCamButtonPressedInVehicle") #ENDIF
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND PRIVATE_IsChaseHintCamButtonPressedInVehicle()
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh)
|
|
IF NOT IS_PHONE_ONSCREEN()
|
|
IF GET_GAME_TIMER() - iCineCamPhoneTimer > 1000
|
|
IF NOT DOES_CAM_EXIST(camChase)
|
|
camChase = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
|
|
|
|
SHAKE_CAM(camChase, "SKY_DIVING_SHAKE", 0.05)
|
|
ATTACH_CAM_TO_ENTITY(camChase, sGoldVans[1].veh, <<-0.3060, 0.1135, 1.6573>>)
|
|
POINT_CAM_AT_ENTITY(camChase, sGoldVans[1].veh, <<-0.5548, 3.0824, 1.3055>>)
|
|
SET_CAM_FOV(camChase, 55.5556)
|
|
ENDIF
|
|
|
|
IF NOT IS_CAM_RENDERING(camChase)
|
|
SET_CAM_ACTIVE(camChase, TRUE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Clean up cinematic cam
|
|
IF DOES_CAM_EXIST(camChase)
|
|
IF IS_CAM_RENDERING(camChase)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC EMPTY_TROLLEY_DURING_SHOOTOUT(INT iTrolleyIndex)
|
|
REQUEST_MODEL(modelContainerAlt1)
|
|
REQUEST_MODEL(modelContainerAlt2)
|
|
REQUEST_MODEL(modelContainerAlt3)
|
|
|
|
IF NOT IS_ENTITY_DEAD(sGoldVans[iTrolleyIndex].veh)
|
|
AND DOES_ENTITY_EXIST(objGoldTrolleys[iTrolleyIndex])
|
|
BOOL bReadyToEmptyTrolley = FALSE
|
|
|
|
IF (iTrolleyEmptyingStage[iTrolleyIndex] = 0 AND iCurrentTake > iMaxTakeConsideringCrew / 4)
|
|
OR (iTrolleyEmptyingStage[iTrolleyIndex] = 1 AND iCurrentTake > iMaxTakeConsideringCrew / 2)
|
|
OR (iTrolleyEmptyingStage[iTrolleyIndex] = 2 AND iCurrentTake > (iMaxTakeConsideringCrew / 4) * 3)
|
|
IF NOT IS_SPHERE_VISIBLE(GET_ENTITY_COORDS(objGoldTrolleys[iTrolleyIndex]), 2.0)
|
|
bReadyToEmptyTrolley = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bReadyToEmptyTrolley
|
|
SWITCH iTrolleyEmptyingStage[iTrolleyIndex]
|
|
CASE 0
|
|
REMOVE_OBJECT(objGoldTrolleys[iTrolleyIndex], TRUE)
|
|
|
|
objGoldTrolleys[iTrolleyIndex] = CREATE_OBJECT_NO_OFFSET(modelContainerAlt1,
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[0].veh, <<0.0, -2.2, 0.8>>))
|
|
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[iTrolleyIndex], sGoldVans[iTrolleyIndex].veh, 0, <<0.0, -2.2, 0.8>>, <<0.0, 0.0, 89.0>>)
|
|
BREAK
|
|
|
|
CASE 1
|
|
REMOVE_OBJECT(objGoldTrolleys[iTrolleyIndex], TRUE)
|
|
|
|
objGoldTrolleys[iTrolleyIndex] = CREATE_OBJECT_NO_OFFSET(modelContainerAlt2,
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[0].veh, <<0.0, -2.2, 0.8>>))
|
|
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[iTrolleyIndex], sGoldVans[iTrolleyIndex].veh, 0, <<0.0, -2.2, 0.8>>, <<0.0, 0.0, 89.0>>)
|
|
BREAK
|
|
|
|
CASE 2
|
|
REMOVE_OBJECT(objGoldTrolleys[iTrolleyIndex], TRUE)
|
|
|
|
objGoldTrolleys[iTrolleyIndex] = CREATE_OBJECT_NO_OFFSET(modelContainerAlt3,
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[0].veh, <<0.0, -2.2, 0.8>>))
|
|
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[iTrolleyIndex], sGoldVans[iTrolleyIndex].veh, 0, <<0.0, -2.2, 0.8>>, <<0.0, 0.0, 89.0>>)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
iTrolleyEmptyingStage[iTrolleyIndex]++
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SET_TROLLEY_SOUNDS_ACTIVE(BOOL bActive)
|
|
IF bActive
|
|
IF DOES_ENTITY_EXIST(objGoldTrolleys[0])
|
|
AND DOES_ENTITY_EXIST(objGoldTrolleys[1])
|
|
IF HAS_SOUND_FINISHED(iGoldTrolleySoundID[0])
|
|
PLAY_SOUND_FROM_ENTITY(iGoldTrolleySoundID[0], "Gold_Trolley_Roll_Player", objGoldTrolleys[0], "BIG_SCORE_3A_SOUNDS")
|
|
ENDIF
|
|
|
|
IF HAS_SOUND_FINISHED(iGoldTrolleySoundID[1])
|
|
PLAY_SOUND_FROM_ENTITY(iGoldTrolleySoundID[1], "Gold_Trolley_Roll_NPC", objGoldTrolleys[1], "BIG_SCORE_3A_SOUNDS")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT HAS_SOUND_FINISHED(iGoldTrolleySoundID[0])
|
|
STOP_SOUND(iGoldTrolleySoundID[0])
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iGoldTrolleySoundID[1])
|
|
STOP_SOUND(iGoldTrolleySoundID[1])
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
///May need to add more roads for this
|
|
PROC SET_ROADS_BLOCKED_FOR_BANK_DRIVE(BOOL bBlocked)
|
|
IF bBlocked
|
|
SET_ROADS_IN_ANGLED_AREA(<<110.448364,-585.028870,30.621614>>, <<45.294167,-760.642517,37.113495>>, 11.500000, FALSE, FALSE)
|
|
SET_ROADS_IN_ANGLED_AREA(<<125.681503,-573.059998,24.874260>>, <<328.602509,-658.280212,34.331116>>, 24.000000, FALSE, FALSE)
|
|
//SET_ROADS_IN_AREA(<<102.0942, -574.5608, 20.2721>>, <<110.4552, -562.3591, 37.2721>>, FALSE)
|
|
ELSE
|
|
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<110.448364,-585.028870,30.621614>>, <<45.294167,-760.642517,37.113495>>, 11.500000)
|
|
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<125.681503,-573.059998,33.874260>>, <<328.602509,-658.280212,27.331116>>, 21.000000)
|
|
//SET_ROADS_BACK_TO_ORIGINAL(<<102.0942, -574.5608, 20.2721>>, <<110.4552, -562.3591, 37.2721>>)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SET_FORCED_OBJECTS_FOR_CHASE(BOOL bSetActive)
|
|
IF bSetActive
|
|
//Building site
|
|
CREATE_FORCED_OBJECT(<<7.92, -391.17, 38.42>>, 2.0, PROP_BARRIER_WORK06A, TRUE)
|
|
CREATE_FORCED_OBJECT(<<7.33, -393.29, 38.42>>, 2.0, PROP_BARRIER_WORK06A, TRUE)
|
|
CREATE_FORCED_OBJECT(<<6.63, -395.65, 38.42>>, 2.0, PROP_BARRIER_WORK06A, TRUE)
|
|
CREATE_FORCED_OBJECT(<<6.00, -398.00, 38.43>>, 2.0, PROP_BARRIER_WORK06A, TRUE)
|
|
|
|
//Stunt jump
|
|
CREATE_FORCED_OBJECT(<<-241.33, -210.51, 48.00>>, 2.0, PROP_BARRIER_WORK06A, TRUE)
|
|
CREATE_FORCED_OBJECT(<<-245.66, -213.24, 48.00>>, 2.0, PROP_BARRIER_WORK06A, TRUE)
|
|
ELSE
|
|
//Building site
|
|
REMOVE_FORCED_OBJECT(<<7.92, -391.17, 38.42>>, 2.0, PROP_BARRIER_WORK06A)
|
|
REMOVE_FORCED_OBJECT(<<7.33, -393.29, 38.42>>, 2.0, PROP_BARRIER_WORK06A)
|
|
REMOVE_FORCED_OBJECT(<<6.63, -395.65, 38.42>>, 2.0, PROP_BARRIER_WORK06A)
|
|
REMOVE_FORCED_OBJECT(<<6.00, -398.00, 38.43>>, 2.0, PROP_BARRIER_WORK06A)
|
|
|
|
//Stunt jump
|
|
REMOVE_FORCED_OBJECT(<<-241.33, -210.51, 48.00>>, 2.0, PROP_BARRIER_WORK06A)
|
|
REMOVE_FORCED_OBJECT(<<-245.66, -213.24, 48.00>>, 2.0, PROP_BARRIER_WORK06A)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//There are some traffic cones in the way at certain points of the mission, this turns them on/off.
|
|
PROC SET_TRAFFIC_CONES_ACTIVE(BOOL bSetActive)
|
|
IF NOT bSetActive
|
|
//In front of strip club (spawns inside the car location).
|
|
CREATE_MODEL_HIDE(<<134.80, -1305.21, 28.34>>, 3.0, PROP_ROADCONE02A, TRUE)
|
|
|
|
//At stunt jump: these make it very difficult for the player to complete the jump.
|
|
CREATE_MODEL_HIDE(<<-235.97, -210.19, 47.95>>, 2.0, PROP_ROADCONE02A, TRUE)
|
|
CREATE_MODEL_HIDE(<<-238.71, -211.73, 47.95>>, 2.0, PROP_ROADCONE02A, TRUE)
|
|
CREATE_MODEL_HIDE(<<-241.60, -212.92, 47.95>>, 2.0, PROP_ROADCONE02A, TRUE)
|
|
ELSE
|
|
REMOVE_MODEL_HIDE(<<134.80, -1305.21, 28.34>>, 2.0, PROP_ROADCONE02A, TRUE)
|
|
|
|
REMOVE_MODEL_HIDE(<<-235.97, -210.19, 47.95>>, 2.0, PROP_ROADCONE02A, TRUE)
|
|
REMOVE_MODEL_HIDE(<<-238.71, -211.73, 47.95>>, 2.0, PROP_ROADCONE02A, TRUE)
|
|
REMOVE_MODEL_HIDE(<<-241.60, -212.92, 47.95>>, 2.0, PROP_ROADCONE02A, TRUE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//Temporarily remove/move some objects in the shootout, as they're in the way.
|
|
PROC SETUP_REQ_REMOVE_JUNK_FOR_SHOOTOUT(BOOL bRemove)
|
|
/*IF NOT DOES_ENTITY_EXIST(objShootoutPallet)
|
|
objShootoutPallet = GET_CLOSEST_OBJECT_OF_TYPE(<<127.6, -1217.0, 28.9>>, 3.0, prop_pallet_03a)
|
|
|
|
IF DOES_ENTITY_EXIST(objShootoutPallet)
|
|
SET_ENTITY_COORDS(objShootoutPallet, GET_ENTITY_COORDS(objShootoutPallet) + <<0.0, 0.0, -20.0>>)
|
|
FREEZE_ENTITY_POSITION(objShootoutPallet, TRUE)
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
IF bRemove
|
|
CREATE_MODEL_HIDE(<<127.6, -1217.0, 28.9>>, 3.0, prop_pallet_03a, TRUE)
|
|
CREATE_MODEL_HIDE(<<158.7, -1206.6, 29.1>>, 3.0, PROP_HOMELES_SHELTER_02, TRUE)
|
|
CREATE_MODEL_HIDE(<<171.78, -1219.39, 28.4>>, 3.0, PROP_SKID_BOX_04, TRUE)
|
|
CREATE_MODEL_HIDE(<<179.988, -1206.92, 28.3>>, 3.0, PROP_SKID_BOX_05, TRUE)
|
|
|
|
OBJECT_INDEX objContainer = GET_CLOSEST_OBJECT_OF_TYPE(<<185.6665, -1238.3120, 28.2079>>, 5.0, prop_rub_cont_01b, FALSE)
|
|
|
|
IF DOES_ENTITY_EXIST(objContainer)
|
|
SET_ENTITY_COORDS_NO_OFFSET(objContainer, <<185.6665, -1238.3120, 28.2079>>)
|
|
ENDIF
|
|
ELSE
|
|
REMOVE_MODEL_HIDE(<<127.6, -1217.0, 28.9>>, 3.0, prop_pallet_03a, TRUE)
|
|
REMOVE_MODEL_HIDE(<<158.7, -1206.6, 29.1>>, 3.0, PROP_HOMELES_SHELTER_02, TRUE)
|
|
REMOVE_MODEL_HIDE(<<171.78, -1219.39, 28.4>>, 3.0, PROP_SKID_BOX_04, TRUE)
|
|
REMOVE_MODEL_HIDE(<<179.988, -1206.92, 28.3>>, 3.0, PROP_SKID_BOX_05, TRUE)
|
|
ENDIF
|
|
|
|
//New trolley location (need prop)
|
|
//SET_ENTITY_COORDS_NO_OFFSET(entity, <<159.4629, -1211.0630, 28.8027>>)
|
|
//SET_ENTITY_ROTATION(entity, <<1.0766, 0.0000, -112.3111>>)
|
|
|
|
/*IF NOT DOES_ENTITY_EXIST(objShootoutShelter)
|
|
objShootoutShelter = GET_CLOSEST_OBJECT_OF_TYPE(<<143.0, -1217.31, 28.32>>, 3.0, prop_homeless_shelter_01)
|
|
|
|
IF DOES_ENTITY_EXIST(objShootoutShelter)
|
|
SET_ENTITY_COORDS(objShootoutShelter, GET_ENTITY_COORDS(objShootoutShelter) + <<0.0, 0.0, -20.0>>)
|
|
FREEZE_ENTITY_POSITION(objShootoutShelter, TRUE)
|
|
ENDIF
|
|
ENDIF*/
|
|
ENDPROC
|
|
|
|
///1790649 - A box always streams in later for the switch cutscene, just hide it until the cutscene is over.
|
|
PROC HIDE_JUNK_FOR_SWITCH_CUTSCENE(BOOL bHide)
|
|
IF bHide
|
|
CREATE_MODEL_HIDE(<<121.5, -1183.0, 29.8>>, 3.0, PROP_SKID_BOX_05, TRUE)
|
|
ELSE
|
|
REMOVE_MODEL_HIDE(<<121.5, -1183.0, 29.8>>, 3.0, PROP_SKID_BOX_05, TRUE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SET_MICHAELS_HOUSE_FOR_FINAL_CUTSCENE(BOOL bLockDoors)
|
|
IF bLockDoors
|
|
//SET_DOOR_STATE(DOORNAME_M_MANSION_B_L, DOORSTATE_LOCKED)
|
|
//SET_DOOR_STATE(DOORNAME_M_MANSION_B_R, DOORSTATE_LOCKED)
|
|
SET_DOOR_STATE(DOORNAME_M_MANSION_G1, DOORSTATE_LOCKED)
|
|
SET_DOOR_STATE(DOORNAME_M_MANSION_GA_SM, DOORSTATE_LOCKED)
|
|
SET_DOOR_STATE(DOORNAME_M_MANSION_R_L1, DOORSTATE_LOCKED)
|
|
SET_DOOR_STATE(DOORNAME_M_MANSION_R_L2, DOORSTATE_LOCKED)
|
|
SET_DOOR_STATE(DOORNAME_M_MANSION_R_R1, DOORSTATE_LOCKED)
|
|
SET_DOOR_STATE(DOORNAME_M_MANSION_R_R2, DOORSTATE_LOCKED)
|
|
//SET_DOOR_STATE(DOORNAME_M_MANSION_F_L, DOORSTATE_FORCE_OPEN_THIS_FRAME)
|
|
//SET_DOOR_STATE(DOORNAME_M_MANSION_F_R, DOORSTATE_FORCE_OPEN_THIS_FRAME)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_MM_DOORM_L, <<-816.72, 179.10, 72.03>>, TRUE, 0.0, 0.0, 1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_MM_DOORM_R, <<-816.11, 177.51, 72.03>>, TRUE, 0.0, 0.0, -1.0)
|
|
ELSE
|
|
//SET_DOOR_STATE(DOORNAME_M_MANSION_B_L, DOORSTATE_UNLOCKED)
|
|
//SET_DOOR_STATE(DOORNAME_M_MANSION_B_R, DOORSTATE_UNLOCKED)
|
|
SET_DOOR_STATE(DOORNAME_M_MANSION_G1, DOORSTATE_UNLOCKED)
|
|
SET_DOOR_STATE(DOORNAME_M_MANSION_GA_SM, DOORSTATE_UNLOCKED)
|
|
SET_DOOR_STATE(DOORNAME_M_MANSION_R_L1, DOORSTATE_UNLOCKED)
|
|
SET_DOOR_STATE(DOORNAME_M_MANSION_R_L2, DOORSTATE_UNLOCKED)
|
|
SET_DOOR_STATE(DOORNAME_M_MANSION_R_R1, DOORSTATE_UNLOCKED)
|
|
SET_DOOR_STATE(DOORNAME_M_MANSION_R_R2, DOORSTATE_UNLOCKED)
|
|
//SET_DOOR_STATE(DOORNAME_M_MANSION_F_L, DOORSTATE_FORCE_CLOSED_THIS_FRAME)
|
|
//SET_DOOR_STATE(DOORNAME_M_MANSION_F_R, DOORSTATE_FORCE_CLOSED_THIS_FRAME)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_MM_DOORM_L, <<-816.72, 179.10, 72.03>>, FALSE, 0.0, 0.0, 0.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_MM_DOORM_R, <<-816.11, 177.51, 72.03>>, FALSE, 0.0, 0.0, 0.0)
|
|
SET_DOOR_STATE(DOORNAME_M_MANSION_F_L, DOORSTATE_FORCE_LOCKED_THIS_FRAME) //This should make sure the door is in the correct building controller state after the mission.
|
|
SET_DOOR_STATE(DOORNAME_M_MANSION_F_R, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC REMOVE_MICHAEL_SHOTGUN_SILENCER()
|
|
IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
|
|
BOOL bPlayerHadASilencer = FALSE
|
|
|
|
IF HAS_PED_GOT_WEAPON_COMPONENT(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, WEAPONCOMPONENT_AT_SR_SUPP)
|
|
REMOVE_WEAPON_COMPONENT_FROM_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, WEAPONCOMPONENT_AT_SR_SUPP)
|
|
bPlayerHadASilencer = TRUE
|
|
ENDIF
|
|
|
|
bRemovedShotgunSilencer = bPlayerHadASilencer
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SET_CUTSCENE_PED_COMPONENT_VARIATIONS(STRING strCutsceneName)
|
|
INT iNameHash = GET_HASH_KEY(strCutsceneName)
|
|
CrewMember eForcedDriverID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_DRIVER)
|
|
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
IF iNameHash = HASH("bs_2a_mcs_10") //new intro
|
|
SET_HEIST_CREW_MEMBER_OUTFIT_EXTRA_PARAMS(NULL, "gunman_selection_1", GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_GUNMAN), CREW_OUTFIT_SECURITY)
|
|
//SET_HEIST_CREW_MEMBER_OUTFIT_EXTRA_PARAMS(NULL, "hacker_selection", GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER), CREW_OUTFIT_DEFAULT)
|
|
SET_HEIST_CREW_MEMBER_OUTFIT_FOR_CUTSCENE("hacker_selection", GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER), CREW_OUTFIT_DEFAULT)
|
|
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Lester", ANCHOR_EYES, 0)
|
|
ELIF iNameHash = HASH("bs_2a_mcs_1")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("gunman_selection_1", sCrew[CREW_GUNMAN].ped)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("driver_selection_1", sCrew[CREW_DRIVER].ped)
|
|
ENDIF
|
|
|
|
SET_HEIST_CREW_MEMBER_OUTFIT_EXTRA_PARAMS(NULL, "gunman_selection_2", GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_GUNMAN), CREW_OUTFIT_DEFAULT)
|
|
SET_HEIST_CREW_MEMBER_OUTFIT_EXTRA_PARAMS(NULL, "driver_selection_2", GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_DRIVER), CREW_OUTFIT_DEFAULT)
|
|
|
|
IF eForcedDriverID = CM_DRIVER_G_TALINA_UNLOCK
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("driver_selection_2", PED_COMP_HAIR, 2, 0)
|
|
ELSE
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("driver_selection_2", PED_COMP_HAIR, 0, 0)
|
|
ENDIF
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("gunman_selection_2", PED_COMP_HAIR, 1, 0)
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Casey", sGoldVanPeds[CASEY_ID].ped)
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Casey", ANCHOR_HEAD, 0, 0)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[1].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Left_Security", sGoldVanPeds[1].ped)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[2].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Middle_Security", sGoldVanPeds[2].ped)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[3].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Right_Security", sGoldVanPeds[3].ped)
|
|
ENDIF
|
|
ELIF iNameHash = HASH("bs_2a_mcs_2")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("gunman_selection_1", sCrew[CREW_GUNMAN].ped)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Driver_selection", sCrew[CREW_DRIVER].ped)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Casey", sGoldVanPeds[CASEY_ID].ped)
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Casey", ANCHOR_HEAD, 0, 0)
|
|
ENDIF
|
|
ELIF iNameHash = HASH("BS_2A_MCS_3_alt")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Casey", sGoldVanPeds[CASEY_ID].ped)
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Casey", ANCHOR_HEAD, 0, 0)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Bank_Employee", sBankWorker.ped)
|
|
ENDIF
|
|
ELIF iNameHash = HASH("bs_2a_mcs_4")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Casey", sGoldVanPeds[CASEY_ID].ped)
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Casey", ANCHOR_HEAD, 0, 0)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Bank_Employee", sBankWorker.ped)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sVaultWorker.ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Vault_Guy", sVaultWorker.ped)
|
|
ENDIF
|
|
ELIF iNameHash = HASH("bs_2a_mcs_5")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Casey", sGoldVanPeds[CASEY_ID].ped)
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Casey", ANCHOR_HEAD, 0, 0)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Bank_Employee", sBankWorker.ped)
|
|
ENDIF
|
|
ELIF iNameHash = HASH("bs_2a_mcs_6")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Casey", sGoldVanPeds[CASEY_ID].ped)
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Casey", ANCHOR_HEAD, 0, 0)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Bank_Employee", sBankWorker.ped)
|
|
ENDIF
|
|
ELIF iNameHash = HASH("BS_2A_MCS_7_P1")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Casey", sGoldVanPeds[CASEY_ID].ped)
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Casey", ANCHOR_HEAD, 0, 0)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Bank_Employee", sBankWorker.ped)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("gunman_selection_1", sCrew[CREW_GUNMAN].ped)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Driver_selection", sCrew[CREW_DRIVER].ped)
|
|
ENDIF
|
|
ELIF iNameHash = HASH("bs_2a_mcs_8")
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
|
|
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", GET_PED_INDEX(CHAR_FRANKLIN))
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", GET_PED_INDEX(CHAR_MICHAEL))
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Casey", sGoldVanPeds[CASEY_ID].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("gunman_selection_1", sCrew[CREW_GUNMAN].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("driver_selection", sCrew[CREW_DRIVER].ped)
|
|
ENDIF
|
|
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Casey", ANCHOR_HEAD, 0, 0)
|
|
ELIF iNameHash = HASH("bs_2a_mcs_8_p3")
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
|
|
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", GET_PED_INDEX(CHAR_MICHAEL))
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", GET_PED_INDEX(CHAR_FRANKLIN))
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("gunman_selection_1", sCrew[CREW_GUNMAN].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("driver_selection", sCrew[CREW_DRIVER].ped)
|
|
ENDIF
|
|
ELIF iNameHash = HASH("bs_2a_mcs_11")
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", GET_PED_INDEX(CHAR_MICHAEL))
|
|
ENDIF
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
|
|
ENDIF
|
|
|
|
SET_HEIST_CREW_MEMBER_OUTFIT_EXTRA_PARAMS(NULL, "gunman_selection_1", GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_GUNMAN), CREW_OUTFIT_DEFAULT)
|
|
SET_HEIST_CREW_MEMBER_OUTFIT_EXTRA_PARAMS(NULL, "driver_selection", GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_DRIVER), CREW_OUTFIT_DEFAULT)
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("driver_selection", PED_COMP_HAIR, 0, 0)
|
|
ELIF iNameHash = HASH("bs_2a_ext")
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", GET_PED_INDEX(CHAR_MICHAEL))
|
|
ENDIF
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", GET_PED_INDEX(CHAR_TREVOR))
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("driver_selection", sCrew[CREW_DRIVER].ped)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(pedLester)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Lester", pedLester)
|
|
ENDIF
|
|
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Lester", ANCHOR_EYES, 0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC MISSION_SETUP()
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
|
|
CLEAR_HELP()
|
|
CLEAR_PRINTS()
|
|
|
|
REGISTER_SCRIPT_WITH_AUDIO(TRUE)
|
|
|
|
REQUEST_ADDITIONAL_TEXT("FINAL3A", MISSION_TEXT_SLOT)
|
|
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, PLAYER_PED_ID(), "MICHAEL")
|
|
|
|
ADD_RELATIONSHIP_GROUP("COPS", relGroupCops)
|
|
ADD_RELATIONSHIP_GROUP("NEUTRAL", relGroupNeutral)
|
|
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, RELGROUPHASH_PLAYER)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, relGroupCops)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, relGroupNeutral)
|
|
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupCops, relGroupCops)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relGroupCops, RELGROUPHASH_PLAYER)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupCops, relGroupNeutral)
|
|
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupNeutral, relGroupNeutral)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupNeutral, RELGROUPHASH_PLAYER)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupNeutral, relGroupCops)
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
SUPPRESS_EMERGENCY_CALLS()
|
|
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelChaseCars, TRUE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelGoldVan, TRUE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelStartCar, TRUE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(CAVALCADE2, TRUE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(CAVALCADE, TRUE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_BIKE), TRUE)
|
|
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P0_HEADSET)
|
|
|
|
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_01_AP, TRUE)
|
|
SET_ALL_CLOTHES_SHOPS_DISABLED(TRUE)
|
|
//DISABLE_STRIP_CLUBS()
|
|
|
|
//Lock all of the vault doors for the entire mission (the last one is open as it needs to be open during the bank tour).
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-7.4, -678.7, 16.4>>, TRUE, 1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<4.4, -682.9, 16.4>>, TRUE, 1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-3.0, -676.6, 16.4>>, TRUE, 1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<2.3, -678.6, 16.4>>, TRUE, 1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-1.0, -671.1, 16.4>>, TRUE, 1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<4.3, -673.0, 16.4>>, TRUE, 1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<8.2, -672.4, 16.4>>, TRUE, 1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-3.6, -668.2, 16.4>>, TRUE, 1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<10.6, -666.6, 16.4>>, TRUE, 1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-1.6562, -662.1329, 16.3586>>, TRUE, 0.0, 0.0, -2.1250)
|
|
|
|
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<144.3611, -1330.6985, 10.2414>>, <<187.7694, -1299.4413, 52.2414>>, FALSE)
|
|
|
|
iLiftSoundID = GET_SOUND_ID()
|
|
iLiftMoveSoundID = GET_SOUND_ID()
|
|
iBankGateOpenSound = GET_SOUND_ID()
|
|
iVaultDoorOpenSoundID = GET_SOUND_ID()
|
|
iVaultDoorCloseSoundID = GET_SOUND_ID()
|
|
iMoneyCountSoundID = GET_SOUND_ID()
|
|
iGoldTrolleySoundID[0] = GET_SOUND_ID()
|
|
iGoldTrolleySoundID[1] = GET_SOUND_ID()
|
|
iTrailerRampSounds[0] = GET_SOUND_ID()
|
|
iTrailerRampSounds[1] = GET_SOUND_ID()
|
|
iTrailerRampRaiseSounds[0] = GET_SOUND_ID()
|
|
iTrailerRampRaiseSounds[1] = GET_SOUND_ID()
|
|
sTrafficGame.iBackgroundSound = GET_SOUND_ID()
|
|
sTrafficGame.iStaticSound = GET_SOUND_ID()
|
|
sTrafficGame.iSelectSound = GET_SOUND_ID()
|
|
iWooshSoundID = GET_SOUND_ID()
|
|
|
|
ADD_DOOR_TO_SYSTEM(iBankExitBarrierHash, prop_sec_barrier_ld_01a, <<63.0577, -625.9503, 31.7126>>)
|
|
|
|
sbiSecurityVans[0] = ADD_SCENARIO_BLOCKING_AREA(<<-51.264175,-763.883057,0.850182>>, <<-31.748135,-745.944641,39.850182>>)
|
|
sbiSecurityVans[1] = ADD_SCENARIO_BLOCKING_AREA(<<152.7736, -1040.3269, 0.4272>>, <<167.3881, -1024.5648, 35.4272>>)
|
|
|
|
SET_TRAFFIC_CONES_ACTIVE(FALSE)
|
|
RESET_GENERIC_SCORE_FLASHING(0)
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(iNavmeshBlockShootout) i
|
|
iNavmeshBlockShootout[i] = -1
|
|
ENDREPEAT
|
|
|
|
SET_INTERIOR_CAPPED(INTERIOR_DT1_03_CARPARK, FALSE)
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_HOLE_COVER, BUILDINGSTATE_DESTROYED)
|
|
SET_BUILDING_STATE( BUILDINGNAME_IPL_JEWEL_HEIST_BIKE_TUNNELS, BUILDINGSTATE_DESTROYED)
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_BANK, BUILDINGSTATE_DESTROYED)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CREATE_WIDGETS()
|
|
|
|
sSkipMenu[0].sTxtLabel = "START_CUTSCENE (BS_2A_MCS_10)"
|
|
sSkipMenu[1].sTxtLabel = "SET_UP_STINGER"
|
|
sSkipMenu[2].sTxtLabel = "VAN_CRASH_CUTSCENE"
|
|
sSkipMenu[3].sTxtLabel = "HIJACK_VANS"
|
|
sSkipMenu[4].sTxtLabel = "HIJACK_CUTSCENE (BS_2A_MCS_1)"
|
|
sSkipMenu[5].sTxtLabel = "DRIVE_TO_BANK"
|
|
sSkipMenu[6].sTxtLabel = "BANK_PARK_CUTSCENE (BS_2A_MCS_2)"
|
|
sSkipMenu[7].sTxtLabel = "WALK_TO_LIFT_1"
|
|
sSkipMenu[8].sTxtLabel = "LIFT_CUTSCENE_1 (BS_2A_MCS_3_alt)"
|
|
sSkipMenu[9].sTxtLabel = "WALK_TO_VAULT"
|
|
sSkipMenu[10].sTxtLabel = "VAULT_OPEN_CUTSCENE (BS_2A_MCS_4)"
|
|
sSkipMenu[11].sTxtLabel = "WALK_TO_GOLD"
|
|
sSkipMenu[12].sTxtLabel = "COLLECT_GOLD_CUTSCENE (BS_2A_MCS_5)"
|
|
sSkipMenu[13].sTxtLabel = "WALK_TO_LIFT_2"
|
|
sSkipMenu[14].sTxtLabel = "LIFT_CUTSCENE_2 (BS_2A_MCS_6)"
|
|
sSkipMenu[15].sTxtLabel = "WALK_TO_VANS"
|
|
sSkipMenu[16].sTxtLabel = "LOAD_GOLD_IN_VANS_CUTSCENE (BS_2A_MCS_7_P1)"
|
|
sSkipMenu[17].sTxtLabel = "LEAVE_BANK"
|
|
sSkipMenu[18].sTxtLabel = "SWAP_TO_FRANKLIN_CUTSCENE"
|
|
sSkipMenu[19].sTxtLabel = "TRAFFIC_CONTROL"
|
|
sSkipMenu[20].sTxtLabel = "ARRIVAL_CUTSCENE (BS_2A_MCS_8)"
|
|
sSkipMenu[21].sTxtLabel = "SHOOTOUT"
|
|
sSkipMenu[22].sTxtLabel = "CHASE_START_CUTSCENE (BS_2A_MCS_8_P3)"
|
|
sSkipMenu[23].sTxtLabel = "CHASE"
|
|
sSkipMenu[24].sTxtLabel = "CHASE_END_CUTSCENE"
|
|
sSkipMenu[25].sTxtLabel = "DROP_OFF_CUTSCENE (BS_2A_MCS_11)"
|
|
sSkipMenu[26].sTxtLabel = "GO_TO_MICHAELS_HOUSE"
|
|
sSkipMenu[27].sTxtLabel = "FINAL_CUTSCENE (BS_2A_MCS_9)"
|
|
#ENDIF
|
|
|
|
bHasChangedClothesMichael = GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL)
|
|
bHasChangedClothesFranklin = GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN)
|
|
bHasChangedClothesTrevor = GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR)
|
|
|
|
|
|
//iTotalEnemiesInShootout = COUNT_OF(sCopsStart) + COUNT_OF(sCopsWave2) + COUNT_OF(sVanFlank) + COUNT_OF(sVanCrash) + COUNT_OF(sNooseRope1) + COUNT_OF(sNooseAbove) + COUNT_OF(sGoonsWave3b)
|
|
iTotalEnemiesInShootout = COUNT_OF(sCopsStart) + COUNT_OF(sCopsWave2) + COUNT_OF(sVanFlank) + COUNT_OF(sVanCrash) + COUNT_OF(sNooseRope1) + COUNT_OF(sGoonsWave3b)
|
|
|
|
iMaxTakeConsideringCrew = MAX_OVERALL_TAKE
|
|
iTakePenaltyCaseysCut = 300000
|
|
iTakePenaltyDropGold = 0
|
|
iTakePenaltyCrewDies = 0
|
|
|
|
//Remove Casey's cut first, as all other calculations are based off percentages of this value.
|
|
INT iMaxTakeMinusCaseysCut = MAX_OVERALL_TAKE - iTakePenaltyCaseysCut
|
|
iMaxTakeConsideringCrew = iMaxTakeMinusCaseysCut
|
|
|
|
//Store the skill levels of the crew members for use later
|
|
IF GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER)) = CMSK_GOOD
|
|
bPickedGoodCarDriver = TRUE
|
|
ELSE
|
|
bPickedGoodCarDriver = FALSE
|
|
|
|
iTakePenaltyDropGold += ROUND(TO_FLOAT(iMaxTakeMinusCaseysCut) * 0.09)
|
|
ENDIF
|
|
|
|
IF GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_DRIVER)) = CMSK_GOOD
|
|
OR GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_DRIVER)) = CMSK_MEDIUM
|
|
bPickedGoodTruckDriver = TRUE
|
|
ELSE
|
|
bPickedGoodTruckDriver = FALSE
|
|
ENDIF
|
|
|
|
IF GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_GUNMAN)) = CMSK_GOOD
|
|
bPickedGoodGunman = TRUE
|
|
ELSE
|
|
bPickedGoodGunman = FALSE
|
|
|
|
iTakePenaltyDropGold += ROUND(TO_FLOAT(iMaxTakeMinusCaseysCut) * 0.09)
|
|
ENDIF
|
|
|
|
iMaxTakeConsideringCrew -= iTakePenaltyDropGold
|
|
|
|
IF GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_GUNMAN)) = CMSK_GOOD
|
|
bPickedGoodSecondGunman = TRUE
|
|
ELSE
|
|
bPickedGoodSecondGunman = FALSE
|
|
ENDIF
|
|
|
|
IF GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER)) = CMSK_BAD
|
|
iHackerLevel = HACKER_LEVEL_BAD
|
|
ELIF GET_CREW_MEMBER_SKILL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER)) = CMSK_MEDIUM
|
|
iHackerLevel = HACKER_LEVEL_MEDIUM
|
|
ELSE
|
|
iHackerLevel = HACKER_LEVEL_GOOD
|
|
ENDIF
|
|
|
|
UPDATE_CREW_CHASE_RECORDING_TO_MATCH_SELECTIONS()
|
|
|
|
|
|
bPCCOntrolsSetup = FALSE
|
|
|
|
ENDPROC
|
|
|
|
PROC MISSION_CLEANUP()
|
|
IF NOT HAS_CUTSCENE_FINISHED()
|
|
STOP_CUTSCENE()
|
|
ENDIF
|
|
|
|
REMOVE_CUTSCENE()
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
WHILE IS_CUTSCENE_ACTIVE()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
//If we started a replay recording then make sure it's cancelled if we're performing cleanup.
|
|
IF bReplayEventStarted
|
|
REPLAY_STOP_EVENT()
|
|
bReplayEventStarted = FALSE
|
|
ENDIF
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
SET_VEHICLE_POPULATION_BUDGET(3)
|
|
SET_PED_POPULATION_BUDGET(3)
|
|
SET_CREATE_RANDOM_COPS(TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
|
|
DISABLE_CELLPHONE(FALSE)
|
|
HIDE_ACTIVE_PHONE(FALSE)
|
|
DISABLE_VEHICLE_GEN_ON_MISSION(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
SET_STUNT_JUMPS_CAN_TRIGGER(TRUE)
|
|
SET_FRONTEND_RADIO_ACTIVE(TRUE)
|
|
SET_AGGRESSIVE_HORNS(FALSE)
|
|
SET_RANDOM_TRAINS(TRUE)
|
|
SET_GPS_DISABLED_ZONE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
STOP_GAMEPLAY_CAM_SHAKING(FALSE)
|
|
STOP_GAMEPLAY_HINT()
|
|
CLEAR_FOCUS()
|
|
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
|
|
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_DOWN, FALSE)
|
|
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_UP, FALSE)
|
|
SET_SRL_FORCE_PRESTREAM(SRL_PRESTREAM_DEFAULT)
|
|
SET_NO_LOADING_SCREEN(FALSE)
|
|
|
|
IF bSlomoActive
|
|
SET_TIME_SCALE(1.0)
|
|
bSlomoActive = FALSE
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
|
|
IF IS_ENTITY_ATTACHED_TO_ANY_VEHICLE(PLAYER_PED_ID())
|
|
DETACH_ENTITY(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), FALSE)
|
|
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
|
|
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE)
|
|
SET_ENTITY_PROOFS(PLAYER_PED_ID(), FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
|
|
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, TRUE)
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
|
|
SET_POLICE_RADAR_BLIPS(TRUE)
|
|
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), TRUE)
|
|
SET_MAX_WANTED_LEVEL(5)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
|
|
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
SET_PED_CURRENT_WEAPON_VISIBLE(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_NEW_LOAD_SCENE_ACTIVE()
|
|
NEW_LOAD_SCENE_STOP()
|
|
ENDIF
|
|
|
|
IF STREAMVOL_IS_VALID(svChaseStart)
|
|
STREAMVOL_DELETE(svChaseStart)
|
|
svChaseStart = NULL
|
|
ENDIF
|
|
|
|
SET_RENDER_HD_ONLY(FALSE)
|
|
|
|
IF NOT IS_ENTITY_DEAD(sGoldVans[0].veh)
|
|
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_UNLOCKED)
|
|
ENDIF
|
|
|
|
IF sbiStripClub != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sbiStripClub)
|
|
ENDIF
|
|
|
|
INT i = 0
|
|
|
|
REPEAT COUNT_OF(ptfxRampSparks) i
|
|
IF ptfxRampSparks[i] != NULL
|
|
STOP_PARTICLE_FX_LOOPED(ptfxRampSparks[i])
|
|
ptfxRampSparks[i] = NULL
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF interiorTunnel != NULL
|
|
UNPIN_INTERIOR(interiorTunnel)
|
|
interiorTunnel = NULL
|
|
ENDIF
|
|
|
|
IF interiorTunnel2 != NULL
|
|
UNPIN_INTERIOR(interiorTunnel2)
|
|
interiorTunnel2 = NULL
|
|
ENDIF
|
|
|
|
IF interiorTunnel3 != NULL
|
|
UNPIN_INTERIOR(interiorTunnel3)
|
|
interiorTunnel3 = NULL
|
|
ENDIF
|
|
|
|
IF interiorBank != NULL
|
|
UNPIN_INTERIOR(interiorBank)
|
|
interiorBank = NULL
|
|
ENDIF
|
|
|
|
IF interiorBankCarPark != NULL
|
|
UNPIN_INTERIOR(interiorBankCarPark)
|
|
interiorBankCarPark = NULL
|
|
ENDIF
|
|
|
|
IF interiorMichaelsHouse != NULL
|
|
UNPIN_INTERIOR(interiorMichaelsHouse)
|
|
interiorMichaelsHouse = NULL
|
|
ENDIF
|
|
|
|
IF interiorBackgroundCarPark != NULL
|
|
UNPIN_INTERIOR(interiorBackgroundCarPark)
|
|
interiorBackgroundCarPark = NULL
|
|
ENDIF
|
|
|
|
|
|
REPEAT COUNT_OF(interiorChaseTunnel) i
|
|
IF interiorChaseTunnel[i] != NULL
|
|
UNPIN_INTERIOR(interiorChaseTunnel[i])
|
|
interiorChaseTunnel[i] = NULL
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF sbiTrafficControl != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sbiTrafficControl)
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(iNavmeshBlockShootout) i
|
|
IF iNavmeshBlockShootout[i] != -1
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(iNavmeshBlockShootout[i])
|
|
iNavmeshBlockShootout[i] = -1
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF iNavmeshBlockBankEntrance != -1
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(iNavmeshBlockBankEntrance)
|
|
iNavmeshBlockBankEntrance = -1
|
|
ENDIF
|
|
|
|
IF bDisabledSwitch
|
|
ENABLE_SELECTOR()
|
|
bDisabledSwitch = FALSE
|
|
ENDIF
|
|
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
SET_NOISEOVERIDE(FALSE)
|
|
REMOVE_PTFX_ASSET()
|
|
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED(strTrafficTextures)
|
|
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(sfTrafficHud)
|
|
bRequestedTrafficScaleform = FALSE
|
|
|
|
REMOVE_ALL_COVER_BLOCKING_AREAS()
|
|
|
|
CLOSE_TUNNEL_PAVEMENTS(FALSE)
|
|
BLOCK_PAVEMENTS_AT_BANK_EXIT(FALSE)
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 2)
|
|
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 4)
|
|
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 5)
|
|
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 6)
|
|
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 7)
|
|
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 8)
|
|
|
|
IF DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[0])
|
|
SET_ENTITY_VISIBLE(objMichaelsHouseMapDoors[0], TRUE)
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(objMichaelsHouseMapDoors[0])
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[1])
|
|
SET_ENTITY_VISIBLE(objMichaelsHouseMapDoors[1], TRUE)
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(objMichaelsHouseMapDoors[1])
|
|
ENDIF
|
|
|
|
//REQUEST_IPL("DT1_03_Shutter")
|
|
//REMOVE_MODEL_HIDE(<<24.98, -664.58, 30.57>>, 2.0, P_SEC_GATE_01_S, FALSE)
|
|
//REMOVE_MODEL_HIDE(<<-72.75, -682.17, 32.52>>, 2.0, P_SEC_GATE_01_S, FALSE)
|
|
//REMOVE_MODEL_HIDE(<<24.98, -664.58, 30.57>>, 5.0, P_SEC_GATE_01_S_COL, FALSE)
|
|
//REMOVE_MODEL_HIDE(<<-72.75, -682.17, 32.52>>, 5.0, P_SEC_GATE_01_S_COL, FALSE)
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_BANK_CAR_PARK_SHUTTERS, BUILDINGSTATE_NORMAL)
|
|
SET_MICHAELS_HOUSE_FOR_FINAL_CUTSCENE(FALSE)
|
|
SET_FORCED_OBJECTS_FOR_CHASE(FALSE)
|
|
SET_ROADS_BLOCKED_FOR_BANK_DRIVE(FALSE)
|
|
SETUP_REQ_REMOVE_JUNK_FOR_SHOOTOUT(FALSE)
|
|
BLOCK_PEDS_SPAWNING_AT_UNDERPASS(FALSE)
|
|
BLOCK_PEDS_DURING_CHASE(FALSE)
|
|
BLOCK_PEDS_AT_DROP_OFF(FALSE)
|
|
HIDE_JUNK_FOR_SWITCH_CUTSCENE(FALSE)
|
|
|
|
SET_ROADS_BACK_TO_ORIGINAL(<<-220.0, -1400.0, 0.0>>, <<500.0, -900.0, 100.0>>)
|
|
CLEAR_PED_NON_CREATION_AREA()
|
|
REMOVE_MODEL_HIDE(<<-5.017, -685.369, 15.909>>, 3.0, modelVaultDoor)
|
|
REMOVE_MODEL_HIDE(<<179.4, -1233.9, 29.2>>, 5.0, modelShootoutFence)
|
|
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", FALSE)
|
|
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
|
|
|
|
SET_TROLLEY_SOUNDS_ACTIVE(FALSE)
|
|
|
|
REMOVE_ALL_AUDIO()
|
|
REMOVE_ALL_AUDIO_SCENES()
|
|
REMOVE_ALL_BLIPS()
|
|
REMOVE_ALL_CAMERAS()
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
REMOVE_ALL_OBJECTS(TRUE)
|
|
REMOVE_ALL_PEDS(TRUE)
|
|
REMOVE_ALL_VEHICLES(TRUE)
|
|
ELSE
|
|
REMOVE_ALL_OBJECTS()
|
|
REMOVE_ALL_PEDS()
|
|
REMOVE_ALL_VEHICLES()
|
|
ENDIF
|
|
|
|
REMOVE_ALL_ANIMS()
|
|
|
|
CLEAR_SELECTOR_PED_PRIORITY(sSelectorPeds)
|
|
|
|
IF eSectionStage != SECTION_STAGE_JUMPING_TO_STAGE
|
|
//Clean up anything that was created in the initial setup (this stuff must not be cleaned up if p-skipping)
|
|
#IF IS_DEBUG_BUILD
|
|
DESTROY_WIDGETS()
|
|
#ENDIF
|
|
|
|
DISABLE_TAXI_HAILING(FALSE)
|
|
RELEASE_SUPPRESSED_EMERGENCY_CALLS()
|
|
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelChaseCars, FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelGoldVan, FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelStartCar, FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(CAVALCADE2, FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(CAVALCADE, FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_BIKE), FALSE)
|
|
|
|
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE)
|
|
ENABLE_STRIP_CLUBS()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
//Reset the vault gates
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-7.4, -678.7, 16.4>>, FALSE, 1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<4.4, -682.9, 16.4>>, FALSE, 1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-3.0, -676.6, 16.4>>, FALSE, 1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<2.3, -678.6, 16.4>>, FALSE, 1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-1.0, -671.1, 16.4>>, FALSE, 1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<4.3, -673.0, 16.4>>, FALSE, 1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<8.2, -672.4, 16.4>>, FALSE, 1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-3.6, -668.2, 16.4>>, FALSE, 1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<10.6, -666.6, 16.4>>, FALSE, 1.0)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(modelVaultGates, <<-1.6562, -662.1329, 16.3586>>, FALSE, 0.0, 0.0, -2.1250)
|
|
|
|
RELEASE_SOUND_ID(iLiftSoundID)
|
|
RELEASE_SOUND_ID(iLiftMoveSoundID)
|
|
RELEASE_SOUND_ID(iBankGateOpenSound)
|
|
RELEASE_SOUND_ID(iVaultDoorOpenSoundID)
|
|
RELEASE_SOUND_ID(iVaultDoorCloseSoundID)
|
|
RELEASE_SOUND_ID(iMoneyCountSoundID)
|
|
RELEASE_SOUND_ID(iTrailerRampSounds[0])
|
|
RELEASE_SOUND_ID(iTrailerRampSounds[1])
|
|
RELEASE_SOUND_ID(iTrailerRampRaiseSounds[0])
|
|
RELEASE_SOUND_ID(iTrailerRampRaiseSounds[1])
|
|
RELEASE_SOUND_ID(sTrafficGame.iStaticSound)
|
|
RELEASE_SOUND_ID(sTrafficGame.iBackgroundSound)
|
|
|
|
SET_ROADS_BACK_TO_ORIGINAL(<<320.0534, -700.1548, 28.2937>>, <<393.6534, -633.9548, 48.2937>>) //Outside tunnel (after arrival cutscene)
|
|
SET_ROADS_BACK_TO_ORIGINAL(<<-142.7897, -705.0483, 30.9823>>, <<-37.9477, -555.9297, 41.7746>>)
|
|
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<96.116104,-572.902649,25.195431>>, <<26.738914,-761.622437,39.121941>>, 16.750000)
|
|
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<332.834991,-659.348389,27.838188>>, <<120.851776,-573.066589,35.662926>>, 18.750000) //Outside tunnel (before arrival cutscene)
|
|
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<395.946472,-569.395081,27.532516>>, <<351.844971,-652.105469,29.339520>>, 15.500000) //Outside tunnel (before arrival cutscene)
|
|
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<328.408264,-737.851563,27.344345>>, <<387.132874,-603.286560,38.589233>>, 43.500000) //Larger area outside tunnel (after arrival cutscene).
|
|
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<144.3611, -1330.6985, 10.2414>>, <<187.7694, -1299.4413, 52.2414>>, TRUE)
|
|
|
|
REMOVE_DOOR_FROM_SYSTEM(iBankExitBarrierHash)
|
|
SET_TRAFFIC_CONES_ACTIVE(TRUE)
|
|
|
|
IF sbiSecurityVans[0] != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sbiSecurityVans[0])
|
|
ENDIF
|
|
|
|
IF sbiSecurityVans[1] != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sbiSecurityVans[1])
|
|
ENDIF
|
|
|
|
IF bRemovedShotgunSilencer
|
|
IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, WEAPONCOMPONENT_AT_SR_SUPP)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_HOLE_COVER, BUILDINGSTATE_NORMAL, TRUE)
|
|
SET_BUILDING_STATE( BUILDINGNAME_IPL_JEWEL_HEIST_BIKE_TUNNELS, BUILDINGSTATE_NORMAL, TRUE)
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_BANK, BUILDINGSTATE_NORMAL, TRUE)
|
|
SET_INTERIOR_CAPPED_ON_EXIT(INTERIOR_DT1_03_CARPARK, TRUE)
|
|
|
|
REGISTER_SCRIPT_WITH_AUDIO(FALSE)
|
|
TERMINATE_THIS_THREAD()
|
|
ELSE
|
|
CLEAR_TRIGGERED_LABELS()
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
CLEAR_AREA(<<0.0, 0.0, 0.0>>, 10000.0, TRUE)
|
|
STOP_FIRE_IN_RANGE(<<0.0, 0.0, 0.0>>, 10000.0)
|
|
REMOVE_DECALS_IN_RANGE(<<0.0, 0.0, 0.0>>, 10000.0)
|
|
|
|
SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
|
|
CLEANUP_UBER_PLAYBACK()
|
|
CANCEL_ALL_PREPARED_MUSIC_EVENTS()
|
|
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLiftExitTop)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLiftEnterTop)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLiftExitBottom)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLiftExitBottomLeft)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLiftExitBottomRight)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLiftEnterBottom)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointVehLeaveBank)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold1A)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold1B)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold1C)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold2A)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold2B)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold2C)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLiftEnterTopLeft)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLiftEnterTopRight)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointHobo)
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_GOLD_VANS_APPEAR, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_1, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_2, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_BUDDIES, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_BANK_PARK_1, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_BANK_PARK_2, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_BANK_LEAVE_GATE, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_BANK_TREVOR, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_1, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_2, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_BUDDIES, strCarrec)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelMerryCar)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelMerryweather)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelCasey)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelBuddyVan)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelBankWorker)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldVanPeds)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldVan)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelBarrier)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelChaseCars)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelDefaultTCCar)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelDefaultTCCar2)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelDefaultTCPed)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelWalkieTalkie)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelIDCard)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelWalkingStick)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelBeer)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelEmptyTrolley)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelContainerAlt1)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelContainerAlt2)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelContainerAlt3)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelHobo)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelLaptop)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelMichaelsDoorLeft)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelMichaelsDoorRight)
|
|
|
|
REMOVE_WEAPON_ASSET(WEAPONTYPE_CARBINERIFLE)
|
|
REMOVE_WEAPON_ASSET(WEAPONTYPE_ADVANCEDRIFLE)
|
|
|
|
REMOVE_VEHICLE_ASSET(modelStartCar)
|
|
REMOVE_VEHICLE_ASSET(CAVALCADE2)
|
|
REMOVE_VEHICLE_ASSET(modelMerryCar)
|
|
REMOVE_VEHICLE_ASSET(modelGoldVan)
|
|
|
|
IF eMissionStage < STAGE_TRAFFIC_CONTROL
|
|
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE)
|
|
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_01_AP, TRUE)
|
|
SET_ALL_CLOTHES_SHOPS_DISABLED(TRUE)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
|
|
|
|
CLEANUP_PC_CONTROLS()
|
|
|
|
//bBarriersAddedToBankInterior = FALSE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC JUMP_TO_STAGE(MISSION_STAGE stage, BOOL bIsDebugJump = FALSE)
|
|
DO_FADE_OUT_WITH_WAIT()
|
|
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
iCurrentEvent = 0
|
|
eMissionStage = stage
|
|
MISSION_CLEANUP()
|
|
|
|
//Update mission checkpoint in case they skipped the stages where it gets set.
|
|
IF bIsDebugJump
|
|
IF eMissionStage >= STAGE_GO_TO_MICHAELS_HOUSE
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_GO_HOME, "GO_HOME", TRUE)
|
|
ELIF eMissionStage >= STAGE_CHASE
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_CHASE, "CAR_CHASE")
|
|
ELIF eMissionStage >= STAGE_SHOOTOUT
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_SHOOTOUT, "SHOOTOUT")
|
|
ELIF eMissionStage >= STAGE_TRAFFIC_CONTROL
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_TRAFFIC_CONTROL, "TRAFFIC_CONTROL")
|
|
ELIF eMissionStage >= STAGE_LEAVE_BANK
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_LEAVE_BANK, "LEAVE_BANK")
|
|
ELIF eMissionStage >= STAGE_WALK_TO_LIFT_1
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_BANK_TOUR, "GET_GOLD_FROM_BANK")
|
|
ELIF eMissionStage >= STAGE_DRIVE_TO_BANK
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_DRIVE_TO_BANK, "DRIVE_TO_BANK")
|
|
ELIF eMissionStage >= STAGE_SET_UP_STINGER
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "HIJACK_VANS")
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
///Creates a new load scene sphere and waits until it has finished loading or it times out.
|
|
PROC NEW_LOAD_SCENE_SPHERE_WITH_WAIT(VECTOR vPos, FLOAT fRadius, NEWLOADSCENE_FLAGS controlFlags = 0, INT iMaxWaitTime = 10000)
|
|
INT iTimeOut = GET_GAME_TIMER()
|
|
|
|
WHILE GET_GAME_TIMER() - iTimeOut < iMaxWaitTime
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
NEW_LOAD_SCENE_START_SPHERE(vPos, fRadius, controlFlags)
|
|
ELIF IS_NEW_LOAD_SCENE_LOADED()
|
|
iTimeOut = 0
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
ENDPROC
|
|
|
|
PROC DISABLE_VEH_CONTROLS_THIS_FRAME()
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_AIM)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CINEMATIC_DOWN_ONLY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CINEMATIC_LR)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CINEMATIC_UD)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CINEMATIC_UP_ONLY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HANDBRAKE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_DUCK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HORN)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_LOOK_BEHIND)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_LOOK_LEFT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_LOOK_RIGHT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_DOWN)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_DOWN_ONLY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LEFT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LEFT_ONLY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LR)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_RIGHT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_RIGHT_ONLY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UD)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UP)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UP_ONLY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_RADIO_WHEEL)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_NEXT_WEAPON)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_PREV_WEAPON)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SPECIAL)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SPECIAL_ABILITY_FRANKLIN)
|
|
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CELLPHONE_UP)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK1)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
|
|
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_DOWN)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_DOWN_ONLY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LEFT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LEFT_ONLY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LR)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_RIGHT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_RIGHT_ONLY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UD)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UP)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UP_ONLY)
|
|
ENDPROC
|
|
|
|
FUNC BOOL SETUP_REQ_FRANKLIN(VECTOR vPos, FLOAT fHeading = 0.0, BOOl bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
REQUEST_PLAYER_PED_MODEL(CHAR_FRANKLIN)
|
|
|
|
IF HAS_PLAYER_PED_MODEL_LOADED(CHAR_FRANKLIN)
|
|
IF bJustRequestAssets
|
|
RETURN TRUE
|
|
ELIF CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CHAR_FRANKLIN, vPos, fHeading)
|
|
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 1800)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
|
|
sFranklin.iEvent = 0
|
|
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE, 500, TRUE)
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "FRANKLIN")
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], RELGROUPHASH_PLAYER)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], COMP_TYPE_PROPS, PROPS_P1_HEADSET, FALSE)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bJustRequestAssets
|
|
IF sConversationPeds.PedInfo[1].Index != sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "FRANKLIN")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_TREVOR(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REQUEST_PLAYER_PED_MODEL(CHAR_TREVOR)
|
|
|
|
IF HAS_PLAYER_PED_MODEL_LOADED(CHAR_TREVOR)
|
|
IF bJustRequestAssets
|
|
RETURN TRUE
|
|
ELIF CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CHAR_TREVOR, vPos, fHeading)
|
|
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
|
|
sTrevor.iEvent = 0
|
|
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE, 500, TRUE)
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 2, sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "TREVOR")
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], RELGROUPHASH_PLAYER)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], COMP_TYPE_PROPS, PROPS_P2_HEADSET, FALSE)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bJustRequestAssets
|
|
IF sConversationPeds.PedInfo[2].Index != sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 2, sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "TREVOR")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_MICHAEL(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
REQUEST_PLAYER_PED_MODEL(CHAR_MICHAEL)
|
|
|
|
IF HAS_PLAYER_PED_MODEL_LOADED(CHAR_MICHAEL)
|
|
IF bJustRequestAssets
|
|
RETURN TRUE
|
|
ELIF CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CHAR_MICHAEL, vPos, fHeading)
|
|
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1800)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_PROPS, PROPS_P0_HEADSET, FALSE)
|
|
sMichael.iEvent = 0
|
|
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_CARBINERIFLE, 500, TRUE)
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "MICHAEL")
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], RELGROUPHASH_PLAYER)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bJustRequestAssets
|
|
IF sConversationPeds.PedInfo[0].Index != sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "MICHAEL")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_PLAYER_IS_FRANKLIN()
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
|
|
SET_CURRENT_SELECTOR_PED(SELECTOR_PED_FRANKLIN)
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
ELSE
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, 300)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
|
|
SET_CURRENT_SELECTOR_PED(SELECTOR_PED_MICHAEL)
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
ELSE
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_PLAYER_IS_TREVOR()
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
|
|
SET_CURRENT_SELECTOR_PED(SELECTOR_PED_TREVOR)
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
ELSE
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_START_CAR(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(sStartCar.veh)
|
|
REQUEST_MODEL(modelStartCar)
|
|
REQUEST_VEHICLE_ASSET(modelStartCar, ENUM_TO_INT(VRF_REQUEST_ENTRY_ANIMS | VRF_REQUEST_ALTERNATE_ENTRY_ANIMS))
|
|
|
|
IF HAS_MODEL_LOADED(modelStartCar)
|
|
AND HAS_VEHICLE_ASSET_LOADED(modelStartCar)
|
|
IF NOT bJustRequestAssets
|
|
sStartCar.veh = CREATE_VEHICLE(modelStartCar, vPos, fHeading)
|
|
|
|
SET_VEHICLE_COLOURS(sStartCar.veh, 0, 0)
|
|
SET_VEHICLE_EXTRA_COLOURS(sStartCar.veh, 0, 0)
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(sStartCar.veh, FALSE)
|
|
SET_VEHICLE_RADIO_ENABLED(sStartCar.veh, TRUE)
|
|
SET_VEHICLE_STRONG(sStartCar.veh, TRUE)
|
|
SET_VEHICLE_HAS_STRONG_AXLES(sStartCar.veh, TRUE)
|
|
SET_VEH_RADIO_STATION(sStartCar.veh, "RADIO_01_CLASS_ROCK")
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sStartCar.veh, SC_DOOR_FRONT_LEFT, FALSE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sStartCar.veh, SC_DOOR_FRONT_RIGHT, FALSE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sStartCar.veh, SC_DOOR_REAR_LEFT, FALSE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sStartCar.veh, SC_DOOR_REAR_RIGHT, FALSE)
|
|
SET_VEHICLE_TYRES_CAN_BURST(sStartCar.veh, FALSE)
|
|
SET_VEHICLE_NUMBER_PLATE_TEXT(sStartCar.veh, "37JDW593")
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelStartCar)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_FRANKLINS_BIKE(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(vehFranklinsBike)
|
|
REQUEST_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_BIKE)
|
|
REQUEST_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_BIKE))
|
|
|
|
IF HAS_PLAYER_VEH_MODEL_LOADED(CHAR_FRANKLIN, VEHICLE_TYPE_BIKE)
|
|
AND HAS_VEHICLE_ASSET_LOADED(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_BIKE))
|
|
IF NOT bJustRequestAssets
|
|
CREATE_PLAYER_VEHICLE(vehFranklinsBike, CHAR_FRANKLIN, vPos, fHeading, TRUE, VEHICLE_TYPE_BIKE)
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vehFranklinsBike, FALSE)
|
|
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_MICHAELS_CAR(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(vehMichaelsCar)
|
|
REQUEST_MODEL(CAVALCADE2)
|
|
REQUEST_VEHICLE_ASSET(CAVALCADE2, ENUM_TO_INT(VRF_REQUEST_ENTRY_ANIMS))
|
|
|
|
IF HAS_MODEL_LOADED(CAVALCADE2)
|
|
AND HAS_VEHICLE_ASSET_LOADED(CAVALCADE2)
|
|
IF NOT bJustRequestAssets
|
|
vehMichaelsCar = CREATE_VEHICLE(CAVALCADE2, vPos, fHeading)
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vehMichaelsCar, FALSE)
|
|
SET_VEHICLE_COLOURS(vehMichaelsCar, 0, 0)
|
|
SET_VEHICLE_EXTRA_COLOURS(vehMichaelsCar, 5, 0)
|
|
SET_VEHICLE_NUMBER_PLATE_TEXT(vehMichaelsCar, "54AJM610")
|
|
SET_VEHICLE_DIRT_LEVEL(vehMichaelsCar, 3.0)
|
|
SET_VEH_RADIO_STATION(vehMichaelsCar, "RADIO_15_MOTOWN")
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(CAVALCADE2)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_LESTER(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(pedLester)
|
|
REQUEST_NPC_PED_MODEL(CHAR_LESTER)
|
|
REQUEST_MODEL(modelWalkingStick)
|
|
REQUEST_MODEL(modelBeer)
|
|
|
|
IF HAS_NPC_PED_MODEL_LOADED(CHAR_LESTER)
|
|
AND HAS_MODEL_LOADED(modelWalkingStick)
|
|
AND HAS_MODEL_LOADED(modelBeer)
|
|
IF bJustRequestAssets
|
|
RETURN TRUE
|
|
ELIF CREATE_NPC_PED_ON_FOOT(pedLester, CHAR_LESTER, vPos, fHeading)
|
|
SET_PED_CAN_BE_TARGETTED(pedLester, FALSE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(pedLester, RELGROUPHASH_PLAYER)
|
|
SET_PED_CONFIG_FLAG(pedLester, PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(pedLester, PCF_DisableExplosionReactions, TRUE)
|
|
SET_PED_CONFIG_FLAG(pedLester, PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(pedLester, TRUE)
|
|
SET_PED_PROP_INDEX(pedLester, ANCHOR_EYES, 0)
|
|
|
|
objwalkingStick = CREATE_OBJECT(modelWalkingStick, vPos)
|
|
ATTACH_ENTITY_TO_ENTITY(objwalkingStick, pedLester, GET_PED_BONE_INDEX(pedLester, BONETAG_PH_R_HAND), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelWalkingStick)
|
|
|
|
IF eMissionStage > STAGE_CHASE
|
|
objBeer = CREATE_OBJECT(modelBeer, vPos)
|
|
ATTACH_ENTITY_TO_ENTITY(objBeer, pedLester, GET_PED_BONE_INDEX(pedLester, BONETAG_PH_L_HAND), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ENDIF
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelBeer)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_TRAFFIC_LAPTOPS(VECTOR vLaptopPos1, VECTOR vLaptopPos2, FLOAT fLaptopHeading1 = 0.0, FLOAT fLaptopHeading2 = 0.0, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(objLaptops[0])
|
|
REQUEST_MODEL(modelLaptop)
|
|
|
|
IF HAS_MODEL_LOADED(modelLaptop)
|
|
IF bJustRequestAssets
|
|
RETURN TRUE
|
|
ELSE
|
|
objLaptops[0] = CREATE_OBJECT(modelLaptop, vLaptopPos1)
|
|
SET_ENTITY_HEADING(objLaptops[0], fLaptopHeading1)
|
|
|
|
objLaptops[1] = CREATE_OBJECT(modelLaptop, vLaptopPos2)
|
|
SET_ENTITY_HEADING(objLaptops[1], fLaptopHeading2)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelLaptop)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_MAIN_GUNMAN(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(sCrew[CREW_GUNMAN].ped)
|
|
REQUEST_MODEL_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_GUNMAN))
|
|
|
|
IF HAS_MODEL_LOADED_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_GUNMAN))
|
|
IF NOT bJustRequestAssets
|
|
sCrew[CREW_GUNMAN].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_GUNMAN, vPos, fHeading)
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sCrew[CREW_GUNMAN].ped, RELGROUPHASH_PLAYER)
|
|
SET_PED_CAN_BE_TARGETTED(sCrew[CREW_GUNMAN].ped, FALSE)
|
|
SET_PED_CONFIG_FLAG(sCrew[CREW_GUNMAN].ped, PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sCrew[CREW_GUNMAN].ped, PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
|
|
|
|
GIVE_WEAPON_TO_PED(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_PISTOL, INFINITE_AMMO, FALSE, FALSE)
|
|
GIVE_WEAPON_TO_PED(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, FALSE, FALSE)
|
|
|
|
SET_MODEL_FOR_CREW_MEMBER_AS_NO_LONGER_NEEDED(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_GUNMAN))
|
|
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 3, sCrew[CREW_GUNMAN].ped, "FH3CREW1")
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_HACKER(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(sCrew[CREW_HACKER].ped)
|
|
REQUEST_MODEL_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER))
|
|
|
|
IF HAS_MODEL_LOADED_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER))
|
|
IF NOT bJustRequestAssets
|
|
sCrew[CREW_HACKER].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER, vPos, fHeading)
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sCrew[CREW_HACKER].ped, RELGROUPHASH_PLAYER)
|
|
SET_PED_CAN_BE_TARGETTED(sCrew[CREW_HACKER].ped, FALSE)
|
|
SET_PED_CONFIG_FLAG(sCrew[CREW_HACKER].ped, PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sCrew[CREW_HACKER].ped, PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
|
|
|
|
SET_MODEL_FOR_CREW_MEMBER_AS_NO_LONGER_NEEDED(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER))
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_MAIN_DRIVER(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(sCrew[CREW_DRIVER].ped)
|
|
REQUEST_MODEL_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER))
|
|
|
|
IF HAS_MODEL_LOADED_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER))
|
|
IF NOT bJustRequestAssets
|
|
sCrew[CREW_DRIVER].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER, vPos, fHeading)
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sCrew[CREW_DRIVER].ped, RELGROUPHASH_PLAYER)
|
|
SET_PED_CAN_BE_TARGETTED(sCrew[CREW_DRIVER].ped, FALSE)
|
|
SET_PED_CONFIG_FLAG(sCrew[CREW_DRIVER].ped, PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sCrew[CREW_DRIVER].ped, PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
|
|
|
|
GIVE_WEAPON_TO_PED(sCrew[CREW_DRIVER].ped, WEAPONTYPE_PISTOL, INFINITE_AMMO, FALSE, FALSE)
|
|
GIVE_WEAPON_TO_PED(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, FALSE, FALSE)
|
|
|
|
SET_MODEL_FOR_CREW_MEMBER_AS_NO_LONGER_NEEDED(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER))
|
|
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, sCrew[CREW_DRIVER].ped, "FH3CREW2")
|
|
|
|
//TEMP: remove balaclava from crew driver
|
|
SET_PED_COMPONENT_VARIATION(sCrew[CREW_DRIVER].ped, PED_COMP_HAIR, 0, 0)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_FORCED_CREW(BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(sCrew[CREW_FORCED_GUNMAN].ped)
|
|
REQUEST_MODEL_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_GUNMAN))
|
|
REQUEST_MODEL_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_DRIVER))
|
|
|
|
IF HAS_MODEL_LOADED_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_GUNMAN))
|
|
AND HAS_MODEL_LOADED_FOR_CREW_MEMBER(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_DRIVER))
|
|
IF NOT bJustRequestAssets
|
|
sCrew[CREW_FORCED_GUNMAN].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_GUNMAN, <<358.6120, -637.1446, 38.9746>>, 0.0)
|
|
sCrew[CREW_FORCED_DRIVER].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_DRIVER, <<358.6120, -637.1446, 38.9746>>, 0.0)
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sCrew[CREW_FORCED_GUNMAN].ped, RELGROUPHASH_PLAYER)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sCrew[CREW_FORCED_DRIVER].ped, RELGROUPHASH_PLAYER)
|
|
SET_PED_CAN_BE_TARGETTED(sCrew[CREW_FORCED_GUNMAN].ped, FALSE)
|
|
SET_PED_CAN_BE_TARGETTED(sCrew[CREW_FORCED_DRIVER].ped, FALSE)
|
|
|
|
SET_MODEL_FOR_CREW_MEMBER_AS_NO_LONGER_NEEDED(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_GUNMAN))
|
|
SET_MODEL_FOR_CREW_MEMBER_AS_NO_LONGER_NEEDED(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_FORCED_DRIVER))
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_CREW_VAN(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(vehBuddyVan)
|
|
REQUEST_MODEL(modelBuddyVan)
|
|
|
|
IF HAS_MODEL_LOADED(modelBuddyVan)
|
|
IF bJustRequestAssets
|
|
RETURN TRUE
|
|
ELSE
|
|
vehBuddyVan = CREATE_VEHICLE(modelBuddyVan, vPos, fHeading)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vehBuddyVan)
|
|
SET_VEHICLE_RADIO_ENABLED(vehBuddyVan, FALSE)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelBuddyVan)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_TUNNEL_INTERIOR_LOADED()
|
|
IF interiorTunnel = NULL
|
|
interiorTunnel = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<249.3368, -622.8621, 29.6647>>, "dt1_rd1_tun")
|
|
//interiorTunnel = GET_INTERIOR_AT_COORDS(<<249.3368, -622.8621, 29.6647>>)
|
|
ELSE
|
|
PIN_INTERIOR_IN_MEMORY(interiorTunnel)
|
|
ENDIF
|
|
|
|
IF interiorTunnel2 = NULL
|
|
interiorTunnel2 = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<132.835007,-577.426636,33.010033>>, "dt1_rd1_tun2")
|
|
//interiorTunnel2 = GET_INTERIOR_AT_COORDS(<<132.835007,-577.426636,33.010033>>)
|
|
ELSE
|
|
PIN_INTERIOR_IN_MEMORY(interiorTunnel2)
|
|
ENDIF
|
|
|
|
IF interiorTunnel3 = NULL
|
|
interiorTunnel3 = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<287.4,-641.1,30.510033>>, "dt1_rd1_tun3")
|
|
//interiorTunnel2 = GET_INTERIOR_AT_COORDS(<<132.835007,-577.426636,33.010033>>)
|
|
ELSE
|
|
PIN_INTERIOR_IN_MEMORY(interiorTunnel3)
|
|
ENDIF
|
|
|
|
IF IS_INTERIOR_READY(interiorTunnel)
|
|
AND IS_INTERIOR_READY(interiorTunnel2)
|
|
AND IS_INTERIOR_READY(interiorTunnel3)
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_CHASE_TUNNEL_INTERIOR_LOADED()
|
|
IF interiorChaseTunnel[0] = NULL
|
|
interiorChaseTunnel[0] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-1562.1206, -740.3986, 12.5837>>, "sm20_tun1")
|
|
ELIF NOT IS_INTERIOR_READY(interiorChaseTunnel[0])
|
|
PIN_INTERIOR_IN_MEMORY(interiorChaseTunnel[0])
|
|
ENDIF
|
|
|
|
IF interiorChaseTunnel[1] = NULL
|
|
interiorChaseTunnel[1] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-1411.0428, -748.9814, 12.4501>>, "sm20_tun2")
|
|
ELIF NOT IS_INTERIOR_READY(interiorChaseTunnel[1])
|
|
PIN_INTERIOR_IN_MEMORY(interiorChaseTunnel[1])
|
|
ENDIF
|
|
|
|
IF interiorChaseTunnel[2] = NULL
|
|
interiorChaseTunnel[2] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-1294.2448, -720.2783, 13.0111>>, "sm20_tun3")
|
|
ELIF NOT IS_INTERIOR_READY(interiorChaseTunnel[2])
|
|
PIN_INTERIOR_IN_MEMORY(interiorChaseTunnel[2])
|
|
ENDIF
|
|
|
|
IF interiorChaseTunnel[3] = NULL
|
|
interiorChaseTunnel[3] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-1191.2521, -673.7817, 12.6938>>, "sm20_tun4")
|
|
ELIF NOT IS_INTERIOR_READY(interiorChaseTunnel[3])
|
|
PIN_INTERIOR_IN_MEMORY(interiorChaseTunnel[3])
|
|
ENDIF
|
|
|
|
IF IS_INTERIOR_READY(interiorChaseTunnel[0])
|
|
AND IS_INTERIOR_READY(interiorChaseTunnel[1])
|
|
AND IS_INTERIOR_READY(interiorChaseTunnel[2])
|
|
AND IS_INTERIOR_READY(interiorChaseTunnel[3])
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_BANK_INTERIOR_LOADED()
|
|
IF interiorBank = NULL
|
|
interiorBank = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<1.4766, -671.6155, 16.6482>>, "V_finalebank")
|
|
ENDIF
|
|
|
|
IF interiorBankCarPark = NULL
|
|
interiorBankCarPark = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-1.2993, -678.8333, 33.7190>>, "dt1_03_carpark")
|
|
ENDIF
|
|
|
|
PIN_INTERIOR_IN_MEMORY(interiorBank)
|
|
PIN_INTERIOR_IN_MEMORY(interiorBankCarPark)
|
|
|
|
IF IS_INTERIOR_READY(interiorBank)
|
|
AND IS_INTERIOR_READY(interiorBankCarPark)
|
|
RETURN TRUE
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT IS_INTERIOR_READY(interiorBank)
|
|
PRINTLN("Big Score 2A - waiting for V_finalebank interior to be ready.")
|
|
ENDIF
|
|
|
|
IF NOT IS_INTERIOR_READY(interiorBankCarPark)
|
|
PRINTLN("Big Score 2A - waiting for dt1_03_carpark interior to be ready.")
|
|
ENDIF
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_MICHAELS_HOUSE_INTERIOR_LOADED()
|
|
IF interiorMichaelsHouse = NULL
|
|
interiorMichaelsHouse = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-813.6312, 179.8698, 73.0647>>, "v_michael")
|
|
ENDIF
|
|
|
|
PIN_INTERIOR_IN_MEMORY(interiorMichaelsHouse)
|
|
|
|
IF IS_INTERIOR_READY(interiorMichaelsHouse)
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
|
|
|
|
FUNC BOOL SETUP_REQ_BACKGROUND_CAR_PARK_INTERIOR_LOADED()
|
|
IF interiorBackgroundCarPark = NULL
|
|
interiorBackgroundCarPark = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-141.6, -653.7, 34.3>>, "dt1_02_carpark")
|
|
ENDIF
|
|
|
|
PIN_INTERIOR_IN_MEMORY(interiorBackgroundCarPark)
|
|
|
|
IF IS_INTERIOR_READY(interiorBackgroundCarPark)
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_GOLD_VANS_PRE_HIJACK(VECTOR vVanPos1, FLOAT fVanHeading1, VECTOR vVanPos2, FLOAT fVanHeading2, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(sGoldVans[0].veh)
|
|
REQUEST_MODEL(modelGoldVan)
|
|
REQUEST_MODEL(modelGoldVanPeds)
|
|
REQUEST_MODEL(modelCasey)
|
|
|
|
IF HAS_MODEL_LOADED(modelGoldVan)
|
|
AND HAS_MODEL_LOADED(modelGoldVanPeds)
|
|
AND HAS_MODEL_LOADED(modelCasey)
|
|
IF NOT bJustRequestAssets
|
|
CLEAR_AREA(<<423.7884, -674.1555, 28.2342>>, 6.0, TRUE)
|
|
CLEAR_AREA(<<434.7316, -673.8383, 27.9883>>, 6.0, TRUE)
|
|
|
|
IF vVanPos1.x = 0.0
|
|
//Default position.
|
|
sGoldVans[0].veh = CREATE_VEHICLE(modelGoldVan, <<423.7884, -674.1555, 28.2342>>, 91.4872)
|
|
sGoldVans[1].veh = CREATE_VEHICLE(modelGoldVan, <<434.7316, -673.8383, 27.9883>>, 91.3587)
|
|
ELSE
|
|
sGoldVans[0].veh = CREATE_VEHICLE(modelGoldVan, vVanPos1, fVanHeading1)
|
|
sGoldVans[1].veh = CREATE_VEHICLE(modelGoldVan, vVanPos2, fVanHeading2)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[0].veh)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[1].veh)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldVan)
|
|
|
|
sGoldVanPeds[0].ped = CREATE_PED_INSIDE_VEHICLE(sGoldVans[0].veh, PEDTYPE_MISSION, modelCasey)
|
|
sGoldVanPeds[1].ped = CREATE_PED_INSIDE_VEHICLE(sGoldVans[0].veh, PEDTYPE_MISSION, modelGoldVanPeds, VS_FRONT_RIGHT)
|
|
|
|
sGoldVanPeds[2].ped = CREATE_PED_INSIDE_VEHICLE(sGoldVans[1].veh, PEDTYPE_MISSION, modelGoldVanPeds)
|
|
sGoldVanPeds[3].ped = CREATE_PED_INSIDE_VEHICLE(sGoldVans[1].veh, PEDTYPE_MISSION, modelGoldVanPeds, VS_FRONT_RIGHT)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldVanPeds)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelCasey)
|
|
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 5, sGoldVanPeds[CASEY_ID].ped, "Casey")
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(sGoldVans) i
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(sGoldVans[i].veh, FALSE)
|
|
SET_VEHICLE_RADIO_ENABLED(sGoldVans[i].veh, FALSE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldVans[i].veh, SC_DOOR_FRONT_LEFT, FALSE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldVans[i].veh, SC_DOOR_FRONT_RIGHT, FALSE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldVans[i].veh, SC_DOOR_REAR_LEFT, FALSE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldVans[i].veh, SC_DOOR_REAR_RIGHT, FALSE)
|
|
|
|
IF i = 0
|
|
SET_VEHICLE_AS_RESTRICTED(sGoldVans[i].veh, 0)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(sGoldVanPeds) i
|
|
IF i != CASEY_ID
|
|
SET_PED_PROP_INDEX(sGoldVanPeds[i].ped, ANCHOR_HEAD, 1)
|
|
|
|
IF i = 1
|
|
SET_PED_COMPONENT_VARIATION(sGoldVanPeds[i].ped, PED_COMP_HEAD, 0, 1)
|
|
ELIF i = 2
|
|
SET_PED_COMPONENT_VARIATION(sGoldVanPeds[i].ped, PED_COMP_HEAD, 1, 0)
|
|
ELIF i = 3
|
|
SET_PED_COMPONENT_VARIATION(sGoldVanPeds[i].ped, PED_COMP_HEAD, 1, 1)
|
|
ENDIF
|
|
ELSE
|
|
SET_PED_PROP_INDEX(sGoldVanPeds[i].ped, ANCHOR_HEAD, 0)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
IF sConversationPeds.PedInfo[5].Index != sGoldVanPeds[CASEY_ID].ped
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 5, sGoldVanPeds[CASEY_ID].ped, "Casey")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_GOLD_VAN_HOSTAGE(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(sGoldVanPeds[CASEY_ID].ped)
|
|
REQUEST_MODEL(modelCasey)
|
|
|
|
IF HAS_MODEL_LOADED(modelCasey)
|
|
IF NOT bJustRequestAssets
|
|
sGoldVanPeds[CASEY_ID].ped = CREATE_PED(PEDTYPE_MISSION, modelCasey, vPos, fHeading)
|
|
|
|
SET_PED_PROP_INDEX(sGoldVanPeds[CASEY_ID].ped, ANCHOR_HEAD, 0, 0)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelCasey)
|
|
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 5, sGoldVanPeds[CASEY_ID].ped, "Casey")
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
IF sConversationPeds.PedInfo[5].Index != sGoldVanPeds[CASEY_ID].ped
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 5, sGoldVanPeds[CASEY_ID].ped, "Casey")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_GOLD_VANS_POST_HIJACK(VECTOR vVanPos1, FLOAT fVanHeading1, VECTOR vVanPos2, FLOAT fVanHeading2, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(sGoldVans[0].veh)
|
|
REQUEST_MODEL(modelGoldVan)
|
|
|
|
IF HAS_MODEL_LOADED(modelGoldVan)
|
|
IF NOT bJustRequestAssets
|
|
IF vVanPos1.x != 0.0
|
|
sGoldVans[0].veh = CREATE_VEHICLE(modelGoldVan, vVanPos1, fVanHeading1)
|
|
sGoldVans[1].veh = CREATE_VEHICLE(modelGoldVan, vVanPos2, fVanHeading2)
|
|
ELSE
|
|
//Default position
|
|
sGoldVans[0].veh = CREATE_VEHICLE(modelGoldVan, <<412.8341, -675.7876, 28.9040>>, 67.1693)
|
|
sGoldVans[1].veh = CREATE_VEHICLE(modelGoldVan, <<419.8341, -678.7876, 28.9040>>, 69.4937)
|
|
ENDIF
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(sGoldVans) i
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(sGoldVans[i].veh, FALSE)
|
|
SET_VEHICLE_RADIO_ENABLED(sGoldVans[i].veh, FALSE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldVans[i].veh, SC_DOOR_FRONT_LEFT, FALSE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldVans[i].veh, SC_DOOR_FRONT_RIGHT, FALSE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldVans[i].veh, SC_DOOR_REAR_LEFT, FALSE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldVans[i].veh, SC_DOOR_REAR_RIGHT, FALSE)
|
|
|
|
IF i = 0
|
|
SET_VEHICLE_AS_RESTRICTED(sGoldVans[i].veh, 0)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldVan)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_GOLD_VANS_AT_BANK()
|
|
RETURN SETUP_REQ_GOLD_VANS_POST_HIJACK(<<-6.911, -667.815, 31.3154>>, -176.386, <<-2.283, -667.746, 31.3231>>, -174.161)
|
|
ENDFUNC
|
|
|
|
PROC SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
|
|
IF NOT bPickedGoodSecondGunman
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_RIGHT)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_RIGHT, FALSE, 1.0)
|
|
SET_VEHICLE_TYRES_CAN_BURST(sGoldVans[0].veh, FALSE)
|
|
bVanTyreBurst = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BOOL SETUP_REQ_BANK_WORKER(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(sBankWorker.ped)
|
|
REQUEST_MODEL(modelBankWorker)
|
|
|
|
IF HAS_MODEL_LOADED(modelBankWorker)
|
|
IF NOT bJustRequestAssets
|
|
sBankWorker.ped = CREATE_PED(PEDTYPE_MISSION, modelBankWorker, vPos, fHeading)
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, sBankWorker.ped, "BankLiaison")
|
|
SET_PED_CAN_RAGDOLL(sBankWorker.ped, FALSE)
|
|
SET_PED_LOD_MULTIPLIER(sBankWorker.ped, 1.5)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelBankWorker)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
AND sConversationPeds.PedInfo[8].Index != sBankWorker.ped
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, sBankWorker.ped, "BankLiaison")
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_BANK_WORKER_WALKIE_TALKIE(BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(objBankWorkerWalkieTalkie)
|
|
REQUEST_MODEL(modelWalkieTalkie)
|
|
|
|
IF HAS_MODEL_LOADED(modelWalkieTalkie)
|
|
IF NOT bJustRequestAssets
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
objBankWorkerWalkieTalkie = CREATE_OBJECT(modelWalkieTalkie, GET_ENTITY_COORDS(sBankWorker.ped) + <<0.0, 0.0, 1.0>>)
|
|
ATTACH_ENTITY_TO_ENTITY(objBankWorkerWalkieTalkie, sBankWorker.ped, GET_PED_BONE_INDEX(sBankWorker.ped, BONETAG_PH_R_HAND),
|
|
<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelWalkieTalkie)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_VAULT_WORKER(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(sVaultWorker.ped)
|
|
REQUEST_MODEL(modelVaultWorker)
|
|
|
|
IF HAS_MODEL_LOADED(modelVaultWorker)
|
|
IF NOT bJustRequestAssets
|
|
sVaultWorker.ped = CREATE_PED(PEDTYPE_MISSION, modelVaultWorker, vPos, fHeading)
|
|
//SET_PED_CAN_RAGDOLL(sVaultWorker.ped, FALSE)
|
|
//FREEZE_ENTITY_POSITION(sVaultWorker.ped, TRUE)
|
|
TASK_LOOK_AT_ENTITY(sVaultWorker.ped, PLAYER_PED_ID(), -1)
|
|
|
|
SET_PED_COMPONENT_VARIATION(sVaultWorker.ped, PED_COMP_HEAD, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(sVaultWorker.ped, PED_COMP_HAIR, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(sVaultWorker.ped, PED_COMP_TORSO, 0, 1)
|
|
SET_PED_COMPONENT_VARIATION(sVaultWorker.ped, PED_COMP_LEG, 0, 1)
|
|
STOP_PED_SPEAKING(sVaultWorker.ped, TRUE)
|
|
SET_PED_LOD_MULTIPLIER(sVaultWorker.ped, 2.0)
|
|
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 6, sVaultWorker.ped, "FH3VAULT")
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelVaultWorker)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_CHASE_CARS_START(BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(sGoldCars[0].veh)
|
|
REQUEST_MODEL(modelChaseCars)
|
|
|
|
IF HAS_MODEL_LOADED(modelChaseCars)
|
|
IF NOT bJustRequestAssets
|
|
sGoldCars[0].veh = CREATE_VEHICLE(modelChaseCars, <<136.2890, -1186.8018, 28.5015>>, 186.8401)
|
|
sGoldCars[1].veh = CREATE_VEHICLE(modelChaseCars, <<133.3123, -1186.8987, 28.5025>>, 184.9469)
|
|
sGoldCars[2].veh = CREATE_VEHICLE(modelChaseCars, <<130.3133, -1186.7798, 28.5033>>, 182.7759)
|
|
sGoldCars[3].veh = CREATE_VEHICLE(modelChaseCars, <<126.9503, -1186.3328, 28.5033>>, 179.8296)
|
|
|
|
SET_VEHICLE_COLOURS(sGoldCars[0].veh, 73, 0)
|
|
SET_VEHICLE_EXTRA_COLOURS(sGoldCars[0].veh, 73, 0)
|
|
|
|
SET_VEHICLE_COLOURS(sGoldCars[1].veh, 88, 0)
|
|
SET_VEHICLE_EXTRA_COLOURS(sGoldCars[1].veh, 88, 0)
|
|
|
|
SET_VEHICLE_COLOURS(sGoldCars[2].veh, 4, 0)
|
|
SET_VEHICLE_EXTRA_COLOURS(sGoldCars[2].veh, 5, 0)
|
|
|
|
SET_VEHICLE_COLOURS(sGoldCars[3].veh, 29, 0)
|
|
SET_VEHICLE_EXTRA_COLOURS(sGoldCars[3].veh, 29, 0)
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(sGoldCars) i
|
|
SET_VEHICLE_DOOR_OPEN(sGoldCars[i].veh, SC_DOOR_BOOT, FALSE, TRUE)
|
|
SET_VEHICLE_STRONG(sGoldCars[i].veh, TRUE)
|
|
SET_VEHICLE_HAS_STRONG_AXLES(sGoldCars[i].veh, TRUE)
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(sGoldCars[i].veh, FALSE)
|
|
SET_VEHICLE_TYRES_CAN_BURST(sGoldCars[i].veh, FALSE)
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(sGoldCars[i].veh, TRUE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldCars[i].veh, SC_DOOR_FRONT_LEFT, FALSE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldCars[i].veh, SC_DOOR_FRONT_RIGHT, FALSE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldCars[i].veh, SC_DOOR_BONNET, FALSE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldCars[i].veh, SC_DOOR_BOOT, FALSE)
|
|
|
|
sGoldCars[i].iEvent = 0
|
|
|
|
TEXT_LABEL_63 debugCarName = "Gold "
|
|
debugCarName += i
|
|
SET_VEHICLE_NAME_DEBUG(sGoldCars[i].veh, debugCarName)
|
|
|
|
IF i = PLAYERS_GOLD_CAR
|
|
SET_VEHICLE_AS_RESTRICTED(sGoldCars[i].veh, 1)
|
|
SET_GOLD_PREP_VEHICLE_SETUP(sGoldCars[i].veh, 2)
|
|
ELIF i = 0
|
|
SET_GOLD_PREP_VEHICLE_SETUP(sGoldCars[i].veh, 0)
|
|
ELIF i = 1
|
|
SET_GOLD_PREP_VEHICLE_SETUP(sGoldCars[i].veh, 1)
|
|
ELSE
|
|
SET_GOLD_PREP_VEHICLE_SETUP(sGoldCars[i].veh, -1)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_MOD_KIT(sGoldCars[i].veh, 0)
|
|
SET_VEHICLE_MOD(sGoldCars[i].veh, MOD_SUSPENSION, GET_NUM_VEHICLE_MODS(sGoldCars[i].veh, MOD_SUSPENSION) - 1)
|
|
ENDREPEAT
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelChaseCars)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_FRANKLIN_INSIDE_CHASE_CAR()
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
|
|
IF SETUP_REQ_FRANKLIN(GET_ENTITY_COORDS(sGoldCars[0].veh))
|
|
IF NOT IS_PED_SITTING_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sGoldCars[0].veh)
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sGoldCars[0].veh)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_GOLD_TROLLEYS_IN_VAULT(BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(objGoldTrolleys[0])
|
|
REQUEST_MODEL(modelGoldTrolley)
|
|
|
|
IF HAS_MODEL_LOADED(modelGoldTrolley)
|
|
IF NOT bJustRequestAssets
|
|
objGoldTrolleys[0] = CREATE_OBJECT(modelGoldTrolley, <<-0.880, -659.39, 15.1556>>)
|
|
objGoldTrolleys[1] = CREATE_OBJECT(modelGoldTrolley, <<1.158, -660.34, 15.1556>>)
|
|
|
|
SET_ENTITY_HEADING(objGoldTrolleys[0], -31.94)
|
|
SET_ENTITY_HEADING(objGoldTrolleys[1], -130.40)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldTrolley)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_CREW_HAVE_SHOTGUNS()
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN)
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_PUMPSHOTGUN)
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_PUMPSHOTGUN)
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 50, TRUE)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
SET_ENTITY_COORDS(sCrew[CREW_GUNMAN].ped, <<-6.5872, -671.7311, 31.3406>>)
|
|
SET_ENTITY_HEADING(sCrew[CREW_GUNMAN].ped, 190.0721)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped, <<-2.1510, -671.4575, 31.3406>>)
|
|
SET_ENTITY_HEADING(sCrew[CREW_DRIVER].ped, 184.4707)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
///Sets up all of the crew members, the bank worker and Security_Guard for the sections inside the bank,
|
|
///including giving them the correct weapons and resetting any previous tasks.
|
|
FUNC BOOL SETUP_REQ_BANK_PEDS_READY_FOR_WALK(BOOL bForceWeapons = FALSE)
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
IF IS_PED_IN_GROUP(sCrew[CREW_DRIVER].ped)
|
|
REMOVE_PED_FROM_GROUP(sCrew[CREW_DRIVER].ped)
|
|
ENDIF
|
|
TASK_STAND_STILL(sCrew[CREW_DRIVER].ped, -1)
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO)
|
|
ENDIF
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_DRIVER].ped, TRUE)
|
|
SET_CURRENT_PED_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE, bForceWeapons)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
IF IS_PED_IN_GROUP(sCrew[CREW_GUNMAN].ped)
|
|
REMOVE_PED_FROM_GROUP(sCrew[CREW_GUNMAN].ped)
|
|
ENDIF
|
|
TASK_STAND_STILL(sCrew[CREW_GUNMAN].ped, -1)
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO)
|
|
ENDIF
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_GUNMAN].ped, TRUE)
|
|
SET_CURRENT_PED_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, bForceWeapons)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF IS_PED_IN_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REMOVE_PED_FROM_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN)
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN, 50)
|
|
ENDIF
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN, bForceWeapons)
|
|
SET_PED_CAN_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
IF IS_PED_IN_GROUP(sGoldVanPeds[CASEY_ID].ped)
|
|
REMOVE_PED_FROM_GROUP(sGoldVanPeds[CASEY_ID].ped)
|
|
ENDIF
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[CASEY_ID].ped, TRUE)
|
|
SET_PED_CAN_RAGDOLL(sGoldVanPeds[CASEY_ID].ped, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBankWorker.ped, TRUE)
|
|
SET_PED_CAN_RAGDOLL(sBankWorker.ped, FALSE)
|
|
TASK_CLEAR_LOOK_AT(sBankWorker.ped)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_CREW_HAVE_CORRECT_WEAPONS_FOR_SHOOTOUT()
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_CARBINERIFLE, 500, FALSE, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE, 500, FALSE, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE, 500, FALSE, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
OR GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
|
|
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, 600, FALSE, FALSE)
|
|
ENDIF
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, 600, FALSE, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL REQUEST_DRIVER_SECURITY_OUTFIT()
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_DRIVER].ped, PED_COMP_SPECIAL, 0, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_DRIVER].ped, PED_COMP_DECL, 1, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_DRIVER].ped, PED_COMP_HAIR, 0, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_DRIVER].ped, PED_COMP_LEG, 1, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_DRIVER].ped, PED_COMP_TORSO, 1, 0)
|
|
SET_PED_PRELOAD_PROP_DATA(sCrew[CREW_DRIVER].ped, ANCHOR_HEAD, 0)
|
|
|
|
IF HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(sCrew[CREW_DRIVER].ped)
|
|
AND HAS_PED_PRELOAD_PROP_DATA_FINISHED(sCrew[CREW_DRIVER].ped)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL REQUEST_GUNMAN_SECURITY_OUTFIT()
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_GUNMAN].ped, PED_COMP_SPECIAL, 6, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_GUNMAN].ped, PED_COMP_FEET, 1, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_GUNMAN].ped, PED_COMP_HAIR, 2, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_GUNMAN].ped, PED_COMP_LEG, 7, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_GUNMAN].ped, PED_COMP_SPECIAL2, 0, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_GUNMAN].ped, PED_COMP_TORSO, 7, 0)
|
|
SET_PED_PRELOAD_PROP_DATA(sCrew[CREW_GUNMAN].ped, ANCHOR_EYES, 3)
|
|
|
|
IF HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(sCrew[CREW_GUNMAN].ped)
|
|
AND HAS_PED_PRELOAD_PROP_DATA_FINISHED(sCrew[CREW_GUNMAN].ped)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_TREVOR_SECURITY_OUTFIT()
|
|
IF (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) OR GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR)
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_SECURITY, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P2_HEADSET, FALSE)
|
|
ELSE
|
|
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], COMP_TYPE_OUTFIT, OUTFIT_P2_SECURITY, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], COMP_TYPE_PROPS, PROPS_P2_HEADSET, FALSE)
|
|
ADD_ARMOUR_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -GET_PED_ARMOUR(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
ADD_ARMOUR_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 100)
|
|
ENDIF
|
|
|
|
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_MICHAEL_SECURITY_OUTFIT()
|
|
IF (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) OR GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL)
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_SECURITY, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P0_HEADSET, FALSE)
|
|
ELSE
|
|
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_OUTFIT, OUTFIT_P0_SECURITY, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_PROPS, PROPS_P0_HEADSET, FALSE)
|
|
|
|
ADD_ARMOUR_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], -GET_PED_ARMOUR(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
|
|
ADD_ARMOUR_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 100)
|
|
ENDIF
|
|
|
|
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_FRANKLIN_OUTFIT()
|
|
IF (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) OR GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN)
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_STEALTH_NO_MASK, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET, FALSE)
|
|
ELSE
|
|
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], COMP_TYPE_OUTFIT, OUTFIT_P1_STEALTH_NO_MASK, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], COMP_TYPE_PROPS, PROPS_P1_HEADSET, FALSE)
|
|
ENDIF
|
|
|
|
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_DRIVER_SECURITY_OUTFIT()
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
//Accs_000, decl_001, hair_000, lowr_001, uppr_001 and p_head_000.
|
|
SET_PED_COMPONENT_VARIATION(sCrew[CREW_DRIVER].ped, PED_COMP_SPECIAL, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(sCrew[CREW_DRIVER].ped, PED_COMP_DECL, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(sCrew[CREW_DRIVER].ped, PED_COMP_HAIR, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(sCrew[CREW_DRIVER].ped, PED_COMP_LEG, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(sCrew[CREW_DRIVER].ped, PED_COMP_TORSO, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(sCrew[CREW_DRIVER].ped, PED_COMP_DECL, 1, 0)
|
|
|
|
SET_PED_PROP_INDEX(sCrew[CREW_DRIVER].ped, ANCHOR_HEAD, 0)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_GUNMAN_SECURITY_OUTFIT()
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
//Accs_006, feet_001, hair_002, lowr_007, task_000, uppr_007 and p_head_003.
|
|
SET_PED_COMPONENT_VARIATION(sCrew[CREW_GUNMAN].ped, PED_COMP_SPECIAL, 6, 0)
|
|
SET_PED_COMPONENT_VARIATION(sCrew[CREW_GUNMAN].ped, PED_COMP_FEET, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(sCrew[CREW_GUNMAN].ped, PED_COMP_HAIR, 2, 0)
|
|
SET_PED_COMPONENT_VARIATION(sCrew[CREW_GUNMAN].ped, PED_COMP_LEG, 7, 0)
|
|
SET_PED_COMPONENT_VARIATION(sCrew[CREW_GUNMAN].ped, PED_COMP_SPECIAL2, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(sCrew[CREW_GUNMAN].ped, PED_COMP_TORSO, 7, 0)
|
|
SET_PED_COMPONENT_VARIATION(sCrew[CREW_GUNMAN].ped, PED_COMP_BERD, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(sCrew[CREW_GUNMAN].ped, PED_COMP_DECL, 1, 0)
|
|
|
|
SET_PED_PROP_INDEX(sCrew[CREW_GUNMAN].ped, ANCHOR_EYES, 3)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR(BOOL bCheckStreamingRequestsCompleted = FALSE)
|
|
SETUP_MICHAEL_SECURITY_OUTFIT()
|
|
SETUP_TREVOR_SECURITY_OUTFIT()
|
|
SETUP_GUNMAN_SECURITY_OUTFIT()
|
|
SETUP_DRIVER_SECURITY_OUTFIT()
|
|
|
|
//Give the player actual armour as the outfit has a bulletproof vest.
|
|
IF eMissionStage >= STAGE_DRIVE_TO_BANK
|
|
AND GET_ENTITY_MODEL(PLAYER_PED_ID()) != GET_PLAYER_PED_MODEL(CHAR_FRANKLIN) //Franklin doesn't wear the security outfit.
|
|
IF eMissionStage = STAGE_DRIVE_TO_BANK
|
|
OR NOT bPlayerAlreadyGivenArmour
|
|
ADD_ARMOUR_TO_PED(PLAYER_PED_ID(), -GET_PED_ARMOUR(PLAYER_PED_ID()))
|
|
ADD_ARMOUR_TO_PED(PLAYER_PED_ID(), 100)
|
|
|
|
bPlayerAlreadyGivenArmour = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bCheckStreamingRequestsCompleted
|
|
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_VAN_TYRES_ARE_BURST()
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_FRONT_LEFT, FALSE, 1)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_FRONT_RIGHT, FALSE, 1)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_LEFT, FALSE, 1)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_RIGHT, FALSE, 1)
|
|
SET_VEHICLE_TYRES_CAN_BURST(sGoldVans[0].veh, FALSE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_FRONT_LEFT, FALSE, 1)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_FRONT_RIGHT, FALSE, 1)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_REAR_LEFT, FALSE, 1)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_REAR_RIGHT, FALSE, 1)
|
|
SET_VEHICLE_TYRES_CAN_BURST(sGoldVans[1].veh, FALSE)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_BANK_SECURITY(BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(pedGateSecurity)
|
|
REQUEST_MODEL(modelGoldVanPeds)
|
|
|
|
IF HAS_MODEL_LOADED(modelGoldVanPeds)
|
|
IF NOT bJustRequestAssets
|
|
pedGateSecurity = CREATE_PED(PEDTYPE_MISSION, modelGoldVanPeds, <<-73.0784, -678.9486, 32.7587>>, 92.0015)
|
|
GIVE_WEAPON_TO_PED(pedGateSecurity, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, TRUE)
|
|
TASK_STAND_STILL(pedGateSecurity, -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedGateSecurity, TRUE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(pedGateSecurity, RELGROUPHASH_PLAYER)
|
|
SET_PED_PROP_INDEX(pedGateSecurity, ANCHOR_HEAD, 1)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(pedGateSecurity, TRUE)
|
|
|
|
IF eMissionStage < STAGE_WALK_TO_LIFT_1 //The vault worker shares the same speaker index.
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, pedGateSecurity, "BS2BankSecurity")
|
|
ENDIF
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldVanPeds)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF eMissionStage < STAGE_WALK_TO_LIFT_1
|
|
IF NOT IS_PED_INJURED(pedGateSecurity)
|
|
AND sConversationPeds.PedInfo[8].Index != pedGateSecurity
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, pedGateSecurity, "BS2BankSecurity")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_SECURITY_BARRIERS(BOOL bJustRequestAssets = FALSE)
|
|
IF NOT DOES_ENTITY_EXIST(objSecurityBarriers[0])
|
|
REQUEST_MODEL(modelSecurityGate)
|
|
REQUEST_MODEL(modeGateCollision)
|
|
|
|
IF HAS_MODEL_LOADED(modelSecurityGate)
|
|
AND HAS_MODEL_LOADED(modeGateCollision)
|
|
IF NOT bJustRequestAssets
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_BANK_CAR_PARK_SHUTTERS, BUILDINGSTATE_DESTROYED)
|
|
|
|
objSecurityBarriers[0] = CREATE_OBJECT(modelSecurityGate, vGate1)
|
|
objSecurityBarriers[1] = CREATE_OBJECT(modelSecurityGate, vGate2)
|
|
|
|
SET_ENTITY_HEADING(objSecurityBarriers[0], 69.743)
|
|
SET_ENTITY_HEADING(objSecurityBarriers[1], 339.996)
|
|
|
|
SET_ENTITY_LOD_DIST(objSecurityBarriers[0], 250)
|
|
SET_ENTITY_LOD_DIST(objSecurityBarriers[1], 250)
|
|
|
|
objSecurityGateCollision[0] = CREATE_OBJECT(modeGateCollision, vGate1 + <<0.0, 0.0, 0.1>>)
|
|
objSecurityGateCollision[1] = CREATE_OBJECT(modeGateCollision, vGate2 + <<0.0, 0.0, 0.1>>)
|
|
|
|
SET_ENTITY_HEADING(objSecurityGateCollision[0], -110.257)
|
|
SET_ENTITY_HEADING(objSecurityGateCollision[1], 339.996)
|
|
|
|
FREEZE_ENTITY_POSITION(objSecurityGateCollision[0], TRUE)
|
|
FREEZE_ENTITY_POSITION(objSecurityGateCollision[1], TRUE)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelSecurityGate)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modeGateCollision)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_GOLD_VANS_AT_TRANSFER_POINT(BOOL bOpenDoors = TRUE, BOOL bFreezePosition = TRUE, BOOL bSetCoordinates = TRUE)
|
|
IF SETUP_REQ_GOLD_VANS_POST_HIJACK(<<126.4855, -1195.3433, 28.4754>>, 85.6665, <<124.6472, -1199.2728, 28.4650>>, 89.8633)
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF bSetCoordinates
|
|
SET_ENTITY_COORDS(sGoldVans[0].veh, <<126.4855, -1195.3433, 28.4754>>) //<<125.4591, -1195.7665, 28.4754>>
|
|
SET_ENTITY_HEADING(sGoldVans[0].veh, 85.6665)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[0].veh)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
|
|
IF bOpenDoors
|
|
SET_VEHICLE_DOOR_OPEN(sGoldVans[0].veh, SC_DOOR_REAR_LEFT)
|
|
SET_VEHICLE_DOOR_OPEN(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT)
|
|
ENDIF
|
|
|
|
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, bFreezePosition)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF bSetCoordinates
|
|
SET_ENTITY_COORDS(sGoldVans[1].veh, <<124.6472, -1199.2728, 28.4650>>) //<<124.8484, -1199.6436, 28.4650>>)
|
|
SET_ENTITY_HEADING(sGoldVans[1].veh, 89.8633)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[1].veh)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_DOORS_LOCKED(sGoldVans[1].veh, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
|
|
IF bOpenDoors
|
|
SET_VEHICLE_DOOR_OPEN(sGoldVans[1].veh, SC_DOOR_REAR_LEFT)
|
|
SET_VEHICLE_DOOR_OPEN(sGoldVans[1].veh, SC_DOOR_REAR_RIGHT)
|
|
ENDIF
|
|
|
|
FREEZE_ENTITY_POSITION(sGoldVans[1].veh, bFreezePosition)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_GOLD_TROLLEYS_IN_VANS(BOOL bOffsetTrevorsTrolleyForPassenger = FALSE)
|
|
IF SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
DETACH_ENTITY(objGoldTrolleys[0])
|
|
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[0], sGoldVans[0].veh, 0, <<0.0, -2.2, 0.8>>, <<0.0, 0.0, 89.0>>)
|
|
|
|
DETACH_ENTITY(objGoldTrolleys[1])
|
|
|
|
IF bOffsetTrevorsTrolleyForPassenger
|
|
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[1], sGoldVans[1].veh, 0, <<-0.2, -1.8, 0.8>>, <<0.0, 0.0, 90.0>>)
|
|
ELSE
|
|
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[1], sGoldVans[1].veh, 0, <<0.0, -2.2, 0.8>>, <<0.0, 0.0, 90.0>>)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SETUP_REQ_BUDDIES_START_FIGHT()
|
|
sMichael.iEvent = 0
|
|
sFranklin.iEvent = 0
|
|
sTrevor.iEvent = 0
|
|
sCrew[CREW_GUNMAN].iEvent = 0
|
|
sCrew[CREW_DRIVER].iEvent = 0
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<130.5416, -1202.8286, 28.3419>>)
|
|
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 186.3565)
|
|
ENDIF
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_CARBINERIFLE, 500, TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], RELGROUPHASH_PLAYER)
|
|
SET_PED_COMBAT_PARAMS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CA_BLIND_FIRE_IN_COVER, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_DisableHurt, TRUE)
|
|
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1800)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_PLAYER_IMPACT | RBF_MELEE | RBF_FALLING | RBF_IMPACT_OBJECT)
|
|
|
|
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE, -1)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], <<127.7625, -1208.8765, 28.2951>>)
|
|
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 178.8779)
|
|
ENDIF
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE, 500, TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], RELGROUPHASH_PLAYER)
|
|
SET_PED_COMBAT_PARAMS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CA_BLIND_FIRE_IN_COVER, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PCF_DisableHurt, TRUE)
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 1800)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_PLAYER_IMPACT | RBF_MELEE | RBF_FALLING | RBF_IMPACT_OBJECT)
|
|
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE, -1)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<137.9836, -1201.9281, 28.4865>>)
|
|
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 187.6068)
|
|
ENDIF
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE, 500, TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], RELGROUPHASH_PLAYER)
|
|
SET_PED_COMBAT_PARAMS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CA_BLIND_FIRE_IN_COVER, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_DisableHurt, TRUE)
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_PLAYER_IMPACT | RBF_MELEE | RBF_FALLING | RBF_IMPACT_OBJECT)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE, -1)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped, <<134.4529, -1181.8196, 28.5015>>)
|
|
SET_ENTITY_HEADING(sCrew[CREW_DRIVER].ped, 182.2204)
|
|
|
|
SET_PED_MAX_HEALTH(sCrew[CREW_DRIVER].ped, 1800)
|
|
SET_ENTITY_HEALTH(sCrew[CREW_DRIVER].ped, 1800)
|
|
SET_PED_CAN_BE_TARGETTED(sCrew[CREW_DRIVER].ped, FALSE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sCrew[CREW_DRIVER].ped, RELGROUPHASH_PLAYER)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sCrew[CREW_DRIVER].ped, FALSE)
|
|
SET_PED_CAN_RAGDOLL(sCrew[CREW_DRIVER].ped, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
SET_ENTITY_COORDS(sCrew[CREW_GUNMAN].ped, <<128.1546, -1182.0406, 28.5027>>)
|
|
SET_ENTITY_HEADING(sCrew[CREW_GUNMAN].ped, 175.5790)
|
|
|
|
SET_PED_MAX_HEALTH(sCrew[CREW_GUNMAN].ped, 1800)
|
|
SET_ENTITY_HEALTH(sCrew[CREW_GUNMAN].ped, 1800)
|
|
SET_PED_CAN_BE_TARGETTED(sCrew[CREW_GUNMAN].ped, FALSE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sCrew[CREW_GUNMAN].ped, RELGROUPHASH_PLAYER)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sCrew[CREW_GUNMAN].ped, FALSE)
|
|
SET_PED_CAN_RAGDOLL(sCrew[CREW_GUNMAN].ped, FALSE)
|
|
ENDIF
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
/*FUNC BOOL SETUP_REQ_EXTRA_SHOOTOUT_COVER()
|
|
IF NOT DOES_ENTITY_EXIST(objShootoutCover)
|
|
REQUEST_MODEL(modelShootoutCover)
|
|
|
|
IF HAS_MODEL_LOADED(modelShootoutCover)
|
|
objShootoutCover = CREATE_OBJECT_NO_OFFSET(modelShootoutCover, <<160.8731, -1202.5350, 28.3122>>)
|
|
SET_ENTITY_ROTATION(objShootoutCover, <<-1.4658, -0.4678, -0.9420>>)
|
|
FREEZE_ENTITY_POSITION(objShootoutCover, TRUE)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelShootoutCover)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC*/
|
|
|
|
FUNC BOOL SETUP_REQ_CREW_IN_GOLD_VANS(BOOL bIncludePlayer = TRUE)
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) OR GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF bIncludePlayer
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh)
|
|
ELSE
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sGoldVans[0].veh)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_PED_INTO_VEHICLE(sGoldVanPeds[CASEY_ID].ped, sGoldVans[0].veh, VS_FRONT_RIGHT)
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldVans[1].veh, VS_FRONT_RIGHT)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_GUNMAN].ped, sGoldVans[1].veh, VS_BACK_RIGHT)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
|
|
|
|
PROC UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(PED_INDEX ped, OBJECT_INDEX objTrolley, BOOL bInstantBlend = FALSE, BOOL bForceAIUpdate = FALSE, BOOL bForceWalkingAnim = FALSE)
|
|
FLOAT fBlendTime = NORMAL_BLEND_IN
|
|
INT iIKBlendTime = -1
|
|
|
|
IF bInstantBlend
|
|
fBlendTime = INSTANT_BLEND_IN
|
|
iIKBlendTime = 0
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(ped)
|
|
IF IS_PED_WALKING(ped)
|
|
OR bForceWalkingAnim
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(ped, strAnimIG5, "push_trolly_walk")
|
|
TASK_PLAY_ANIM(ped, strAnimIG5, "push_trolly_walk", fBlendTime, -2, -1,
|
|
AF_UPPERBODY | AF_SECONDARY | AF_LOOPING | AF_TAG_SYNC_CONTINUOUS)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(ped, strAnimIG5, "push_trolly_stand")
|
|
TASK_PLAY_ANIM(ped, strAnimIG5, "push_trolly_stand", fBlendTime, -2, -1,
|
|
AF_UPPERBODY | AF_SECONDARY | AF_LOOPING | AF_TAG_SYNC_CONTINUOUS)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_IK_TARGET(ped, IK_PART_ARM_LEFT, objTrolley, GOLD_TROLLEY_BONE_GRIP_LEFT, vTrolleyLeftHandAttach, ITF_ARM_TARGET_WRT_IKHELPER, iIKBlendTime)
|
|
SET_IK_TARGET(ped, IK_PART_ARM_RIGHT, objTrolley, GOLD_TROLLEY_BONE_GRIP_RIGHT, vTrolleyRightHandAttach, ITF_ARM_TARGET_WRT_IKHELPER, iIKBlendTime)
|
|
ENDIF
|
|
|
|
IF bForceAIUpdate
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(ped)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC UPDATE_TROLLEY_WALK_ANIMS(BOOL bInstantBlend = FALSE, BOOL bForceAIUpdate = FALSE, BOOL bForceWalkingAnim = FALSE)
|
|
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], objGoldTrolleys[1], bInstantBlend, bForceAIUpdate, bForceWalkingAnim)
|
|
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sGoldVanPeds[CASEY_ID].ped, objGoldTrolleys[0], bInstantBlend, bForceAIUpdate, bForceWalkingAnim)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// There are three slots being used for random enemy ped speakers. This adds a ped into a currently free slot. Once a ped dies the slot is cleared.
|
|
/// If i_speaker is set to something other than -1 it'll try to place the ped in the given slot.
|
|
PROC ADD_ENEMY_PED_TO_FREE_DIALOGUE_SLOT(PED_INDEX ped, INT iSpeaker = -1, BOOL bForceAdd = FALSE)
|
|
IF NOT IS_PED_INJURED(ped)
|
|
IF sConversationPeds.PedInfo[MERRY_SPEAKER_1].Index != ped
|
|
AND sConversationPeds.PedInfo[MERRY_SPEAKER_2].Index != ped
|
|
AND sConversationPeds.PedInfo[MERRY_SPEAKER_3].Index != ped
|
|
IF iSpeaker = -1
|
|
IF NOT sConversationPeds.PedInfo[MERRY_SPEAKER_1].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, MERRY_SPEAKER_1, ped, "BS2AMerry1")
|
|
ELIF NOT sConversationPeds.PedInfo[MERRY_SPEAKER_2].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, MERRY_SPEAKER_2, ped, "BS2AMerry2")
|
|
ELIF NOT sConversationPeds.PedInfo[MERRY_SPEAKER_3].ActiveInConversation
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, MERRY_SPEAKER_3, ped, "BS2AMerry3")
|
|
ENDIF
|
|
ELSE
|
|
IF NOT sConversationPeds.PedInfo[iSpeaker].ActiveInConversation
|
|
OR bForceAdd
|
|
IF iSpeaker = MERRY_SPEAKER_1
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, iSpeaker, ped, "BS2AMerry1")
|
|
ELIF iSpeaker = MERRY_SPEAKER_2
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, iSpeaker, ped, "BS2AMerry2")
|
|
ELIF iSpeaker = MERRY_SPEAKER_3
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, iSpeaker, ped, "BS2AMerry3")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC PLAYER_SHOOTOUT_STATE GET_PLAYER_SHOOTOUT_STATE()
|
|
PLAYER_SHOOTOUT_STATE ePlayerState = PLAYER_STATE_DEFENDING_FRONT
|
|
|
|
RETURN ePlayerState
|
|
ENDFUNC
|
|
|
|
///Returns the ped index of the ped that killed the given ped (if their source of death was a ped).
|
|
FUNC PED_INDEX GET_PED_THAT_KILLED_PED(PED_INDEX ped)
|
|
ENTITY_INDEX entityDeathSource = GET_PED_SOURCE_OF_DEATH(ped)
|
|
|
|
IF DOES_ENTITY_EXIST(entityDeathSource)
|
|
IF IS_ENTITY_A_PED(entityDeathSource)
|
|
RETURN GET_PED_INDEX_FROM_ENTITY_INDEX(entityDeathSource)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN NULL
|
|
ENDFUNC
|
|
|
|
//Splits locate checks for the shootout over multiple frames to save execution time.
|
|
PROC CHECK_LOCATES_FOR_SHOOTOUT(INT iMaxNumLocatesPerFrame = 1)
|
|
INT iNumLocatesCheckedThisFrame = 0
|
|
|
|
WHILE iNumLocatesCheckedThisFrame < iMaxNumLocatesPerFrame
|
|
SWITCH iLocateCheckIndex
|
|
CASE 0
|
|
bInSafeAreaForInfiniteFlankSpawn = IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<126.471077,-1212.260864,30.298681>>,<<48.250000,39.250000,2.250000>>)
|
|
BREAK
|
|
|
|
CASE 1
|
|
bNearInfiniteFlankSpawnArea = IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<195.842010,-1236.673340,35.467030>>,<<2.750000,26.750000,7.750000>>)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
iLocateCheckIndex++
|
|
|
|
IF iLocateCheckIndex > 1
|
|
iLocateCheckIndex = 0
|
|
ENDIF
|
|
|
|
iNumLocatesCheckedThisFrame++
|
|
ENDWHILE
|
|
ENDPROC
|
|
|
|
PROC MANAGE_SHOOTOUT_ENEMIES(BOOL bJustRequestAssets = FALSE, BOOL bForceCombatDuringCutscene = FALSE)
|
|
INT i = 0
|
|
SEQUENCE_INDEX seq
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
REQUEST_MODEL(modelMerryweather)
|
|
REQUEST_MODEL(modelMerryCar)
|
|
REQUEST_VEHICLE_ASSET(modelMerryCar, ENUM_TO_INT(VRF_REQUEST_EXIT_TO_AIM_ANIMS))
|
|
REQUEST_WEAPON_ASSET(WEAPONTYPE_CARBINERIFLE)
|
|
REQUEST_WEAPON_ASSET(WEAPONTYPE_ADVANCEDRIFLE)
|
|
|
|
//Store the number of enemies alive in each group, this comes in handy later and saves execution.
|
|
iNumAliveCopsStart = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sCopsStart)
|
|
iNumAliveCopsWave2 = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sCopsWave2)
|
|
iNumAliveVanFlank = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sVanFlank)
|
|
iNumAliveVanCrash = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sVanCrash)
|
|
iNumAliveNooseRope1 = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sNooseRope1)
|
|
//iNumAliveNooseAbove = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sNooseAbove)
|
|
iNumAliveGoonsWave3b = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sGoonsWave3b)
|
|
iNumAliveGoonsSnipe = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sGoonsSnipe)
|
|
iNumAliveInfiniteEnemiesFront = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sInfiniteEnemiesFront)
|
|
iNumAliveInfiniteEnemiesFlank = GET_NUM_ENEMIES_ALIVE_IN_GROUP(sInfiniteEnemiesFlank)
|
|
|
|
iNumAliveFrontEnemies = iNumAliveCopsStart + iNumAliveCopsWave2 + iNumAliveVanCrash + iNumAliveGoonsSnipe + iNumAliveInfiniteEnemiesFront
|
|
|
|
//First cops: these appear in the cutscene, two cars drive in and cops get out.
|
|
IF NOT sCopsStart[0].bIsCreated
|
|
IF HAS_MODEL_LOADED(modelMerryweather)
|
|
AND HAS_MODEL_LOADED(modelMerryCar)
|
|
AND HAS_VEHICLE_ASSET_LOADED(modelMerryCar)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_CARBINERIFLE)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_ADVANCEDRIFLE)
|
|
AND NOT bJustRequestAssets
|
|
vehCopsStart[0] = CREATE_VEHICLE(modelMerryCar, <<139.4125, -1229.0784, 28.4037>>, 283.0258)
|
|
vehCopsStart[1] = CREATE_VEHICLE(modelMerryCar, <<125.9182, -1234.2787, 28.4433>>, 67.2091)
|
|
|
|
SET_VEHICLE_ENGINE_ON(vehCopsStart[0], TRUE, TRUE)
|
|
SET_VEHICLE_LIGHTS(vehCopsStart[0], FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_FULLBEAM(vehCopsStart[0], TRUE)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vehCopsStart[0])
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehCopsStart[0], FALSE)
|
|
SET_VEHICLE_COLOURS(vehCopsStart[0], MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
|
|
SET_VEHICLE_EXTRA_COLOURS(vehCopsStart[0], MERRY_CAR_COLOUR, 0)
|
|
SET_VEHICLE_EXTRA(vehCopsStart[0], 1, TRUE)
|
|
|
|
SET_VEHICLE_ENGINE_ON(vehCopsStart[1], TRUE, TRUE)
|
|
SET_VEHICLE_LIGHTS(vehCopsStart[1], FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_FULLBEAM(vehCopsStart[1], TRUE)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vehCopsStart[1])
|
|
FREEZE_ENTITY_POSITION(vehCopsStart[1], TRUE)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehCopsStart[1], FALSE)
|
|
SET_VEHICLE_COLOURS(vehCopsStart[1], MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
|
|
SET_VEHICLE_EXTRA_COLOURS(vehCopsStart[1], MERRY_CAR_COLOUR, 0)
|
|
SET_VEHICLE_EXTRA(vehCopsStart[1], 1, TRUE)
|
|
|
|
sCopsStart[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsStart[0], VS_DRIVER, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
|
|
sCopsStart[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsStart[0], VS_FRONT_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_ADVANCEDRIFLE)
|
|
sCopsStart[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsStart[0], VS_BACK_LEFT, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
|
|
sCopsStart[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsStart[0], VS_BACK_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_ADVANCEDRIFLE)
|
|
sCopsStart[4].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsStart[1], VS_DRIVER, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
|
|
sCopsStart[5].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsStart[1], VS_FRONT_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_ADVANCEDRIFLE)
|
|
sCopsStart[6].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsStart[1], VS_BACK_LEFT, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
|
|
sCopsStart[7].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsStart[1], VS_BACK_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_ADVANCEDRIFLE)
|
|
|
|
ADD_COVER_BLOCKING_AREA(<<126.0, -1218.7, 28.0>>, <<130.5, -1214.1, 31.0>>, TRUE, FALSE, TRUE)
|
|
|
|
INITIALISE_ENEMY_GROUP(sCopsStart, "Start ")
|
|
|
|
REPEAT COUNT_OF(sCopsStart) i
|
|
IF HAS_PED_GOT_WEAPON(sCopsStart[i].ped, WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(sCopsStart[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
ELIF HAS_PED_GOT_WEAPON(sCopsStart[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(sCopsStart[i].ped, WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ELSE
|
|
IF NOT sCopsStart[0].bHasCleanedUp
|
|
INT iNumPedsCleanedUp = 0
|
|
INT iNumPedsInGroup = COUNT_OF(sCopsStart)
|
|
|
|
REPEAT iNumPedsInGroup i
|
|
IF DOES_ENTITY_EXIST(sCopsStart[i].ped)
|
|
IF NOT IS_PED_INJURED(sCopsStart[i].ped)
|
|
//If the enemy was just damaged by the player then update the timer tracking the last time the player damaged a ped.
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sCopsStart[i].ped, PLAYER_PED_ID())
|
|
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sCopsStart[i].ped)
|
|
ENDIF
|
|
|
|
SWITCH sCopsStart[i].iEvent
|
|
CASE 0
|
|
INT iVehicle
|
|
iVehicle = i / 4
|
|
|
|
IF eMissionStage = STAGE_SHOOTOUT //Don't have them get out in the cutscene
|
|
OR bForceCombatDuringCutscene
|
|
IF (IS_VEHICLE_DRIVEABLE(vehCopsStart[iVehicle])
|
|
AND ABSF(GET_ENTITY_SPEED(vehCopsStart[iVehicle])) < 0.5
|
|
AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehCopsStart[iVehicle]))
|
|
OR NOT IS_VEHICLE_DRIVEABLE(vehCopsStart[iVehicle])
|
|
IF i = 0
|
|
sCopsStart[i].vDest = <<138.4230, -1220.4518, 28.3784>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(sCopsStart[i].ped, sCopsStart[i].cover, sCopsStart[i].vDest, 333.3116, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ELIF i = 1
|
|
sCopsStart[i].vDest = <<141.2, -1230.4, 28.2952>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsStart[i].ped, sCopsStart[i].vDest, 2.0, TRUE)
|
|
ELIF i = 2
|
|
sCopsStart[i].vDest = <<136.7580, -1219.8176, 28.4035>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(sCopsStart[i].ped, sCopsStart[i].cover, sCopsStart[i].vDest, 337.2540, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ELIF i = 3
|
|
sCopsStart[i].vDest = <<138.1, -1230.8, 28.2951>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsStart[i].ped, sCopsStart[i].vDest, 2.0, TRUE)
|
|
ELIF i = 4
|
|
sCopsStart[i].vDest = <<124.3, -1234.9, 28.2951>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsStart[i].ped, sCopsStart[i].vDest, 2.0, TRUE)
|
|
ELIF i = 5
|
|
sCopsStart[i].vDest = <<130.2462, -1224.1238, 28.5143>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(sCopsStart[i].ped, sCopsStart[i].cover, sCopsStart[i].vDest, 9.5513, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ELIF i = 6
|
|
sCopsStart[i].vDest = <<127.0, -1236.4, 28.2951>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsStart[i].ped, sCopsStart[i].vDest, 2.0, TRUE)
|
|
ELIF i = 7
|
|
sCopsStart[i].vDest = <<127.5857, -1215.9505, 28.4570>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(sCopsStart[i].ped, sCopsStart[i].cover, sCopsStart[i].vDest, 5.0, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
//If this is the cutscene transition then get them out the cars immediately.
|
|
IF bForceCombatDuringCutscene
|
|
IF i = 0
|
|
SET_ENTITY_COORDS(sCopsStart[i].ped, <<138.93, -1226.68, 28.38>>)
|
|
ELIF i = 1
|
|
SET_ENTITY_COORDS(sCopsStart[i].ped, <<142.48, -1231.99, 28.38>>)
|
|
ELIF i = 2
|
|
SET_ENTITY_COORDS(sCopsStart[i].ped, <<137.44, -1226.8, 28.38>>)
|
|
ELIF i = 3
|
|
SET_ENTITY_COORDS(sCopsStart[i].ped, <<137.16, -1232.79, 28.38>>)
|
|
ELIF i = 4
|
|
SET_ENTITY_COORDS(sCopsStart[i].ped, <<122.43, -1236.17, 28.38>>)
|
|
ELIF i = 5
|
|
SET_ENTITY_COORDS(sCopsStart[i].ped, <<126.92, -1229.19, 28.38>>)
|
|
ELIF i = 6
|
|
SET_ENTITY_COORDS(sCopsStart[i].ped, <<127.80, -1237.70, 28.38>>)
|
|
ELIF i = 7
|
|
SET_ENTITY_COORDS(sCopsStart[i].ped, <<128.18, -1232.65, 28.38>>)
|
|
ENDIF
|
|
|
|
SET_ENTITY_HEADING(sCopsStart[i].ped, -4.3)
|
|
ENDIF
|
|
|
|
//SET_COMBAT_FLOAT(sCopsStart[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 0.5)
|
|
|
|
IF i % 2 = 0
|
|
SET_PED_COMBAT_PARAMS(sCopsStart[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
ELSE
|
|
SET_PED_COMBAT_PARAMS(sCopsStart[i].ped, 12, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
ENDIF
|
|
|
|
|
|
IF HAS_PED_GOT_WEAPON(sCopsStart[i].ped, WEAPONTYPE_CARBINERIFLE)
|
|
SET_CURRENT_PED_WEAPON(sCopsStart[i].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
ELIF HAS_PED_GOT_WEAPON(sCopsStart[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
|
|
SET_CURRENT_PED_WEAPON(sCopsStart[i].ped, WEAPONTYPE_ADVANCEDRIFLE, TRUE)
|
|
ENDIF
|
|
SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_REQUIRES_LOS_TO_SHOOT, FALSE)
|
|
SET_COMBAT_FLOAT(sCopsStart[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
|
|
//SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_OPEN_COMBAT_WHEN_DEFENSIVE_AREA_IS_REACHED, TRUE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sCopsStart[i].ped, 150.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCopsStart[i].ped, FALSE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sCopsStart[i].ped, TRUE)
|
|
//SET_COMBAT_FLOAT(sCopsStart[i].ped, CCF_TIME_BETWEEN_BURSTS_IN_COVER, 0.05)
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(sCopsStart[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
//sCopsStart[i].blip = CREATE_BLIP_FOR_PED(sCopsStart[i].ped, TRUE)
|
|
sCopsStart[i].iTimer = GET_GAME_TIMER()
|
|
sCopsStart[i].iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Break out of defensive areas after a few seconds.
|
|
IF GET_GAME_TIMER() - sCopsStart[i].iTimer > 7000
|
|
SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sCopsStart[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sCopsStart[i].iEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Make them killable by buddies.
|
|
IF GET_GAME_TIMER() - sCopsStart[i].iTimer > 10000
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sCopsStart[i].ped, FALSE)
|
|
sCopsStart[i].iEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3 //If there are any enemies still alive after the van crash, have them push forward.
|
|
IF i = 3
|
|
//Enemy #3 pushes forward to the sofa once enemy #0 is dead
|
|
IF IS_PED_INJURED(sCopsStart[0].ped)
|
|
sCopsStart[i].vDest = <<136.7580, -1219.8176, 28.4035>>
|
|
SET_PED_COMBAT_MOVEMENT(sCopsStart[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsStart[i].ped, sCopsStart[i].vDest, 2.0)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sCopsStart[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sCopsStart[i].iEvent = 50
|
|
ENDIF
|
|
ELIF i = 2
|
|
//Enemy #2 pushes forward to the pillars after a bit of time.
|
|
IF GET_GAME_TIMER() - sCopsStart[i].iTimer > 20000
|
|
OR sCopsWave2[0].bIsCreated
|
|
sCopsStart[i].vDest = <<138.9045, -1209.6268, 28.2952>>
|
|
REMOVE_COVER_POINT(sCopsStart[i].cover)
|
|
SET_PED_COMBAT_MOVEMENT(sCopsStart[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsStart[i].ped, sCopsStart[i].vDest, 2.0, TRUE)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sCopsStart[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sCopsStart[i].iEvent = 50
|
|
ENDIF
|
|
ELSE
|
|
sCopsStart[i].iEvent = 50
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sCopsStart[i].iEvent != 0
|
|
UPDATE_AI_PED_BLIP(sCopsStart[i].ped, sCopsStart[i].sBlipData)
|
|
//SET_PED_RESET_FLAG(sCopsStart[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
|
|
|
|
//Handle the enemy behaviour when the main attack front changes: if the enemy isn't part of the main front then set them to defensive.
|
|
IF sCopsStart[i].iEvent <= 50
|
|
//General combat with charge on, once the front changes set them to defensive.
|
|
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FLANK_1
|
|
SET_PED_COMBAT_MOVEMENT(sCopsStart[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsStart[i].ped, sCopsStart[i].vDest, 2.0)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_CAN_CHARGE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sCopsStart[i].ped, 150.0)
|
|
|
|
sCopsStart[i].iEvent = 100
|
|
ENDIF
|
|
|
|
//Do a forced charge when there are only a few enemies left.
|
|
IF NOT sCopsStart[i].bSetToCharge
|
|
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
|
|
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
|
|
IF iNumAliveFrontEnemies < 4
|
|
SET_PED_CONFIG_FLAG(sCopsStart[i].ped, PCF_ShouldChargeNow, TRUE)
|
|
sCopsStart[i].bSetToCharge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF sCopsStart[i].iEvent = 100
|
|
//General combat with charge off, once the front changes set them to charge.
|
|
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_1
|
|
OR eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
|
|
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
|
|
SET_PED_COMBAT_MOVEMENT(sCopsStart[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsStart[i].ped, sCopsStart[i].vDest, 2.0)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sCopsStart[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sCopsStart[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sCopsStart[i].iEvent = 50
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//For any cops surrounding the second car: if it blows up kill the peds off instantly.
|
|
IF i > 3
|
|
VECTOR vCarPos = GET_ENTITY_COORDS(vehCopsStart[1], FALSE)
|
|
|
|
IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_CAR, vCarPos, 3.0)
|
|
IF VDIST2(GET_ENTITY_COORDS(sCopsStart[i].ped), vCarPos) < 25.0
|
|
SET_ENTITY_HEALTH(sCopsStart[i].ped, 0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sCopsStart[i].ped, sCopsStart[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
//If the enemy just died check if the player killed them, if so then update the timer tracking the last time a ped was killed by the player.
|
|
IF GET_PED_THAT_KILLED_PED(sCopsStart[i].ped) = PLAYER_PED_ID()
|
|
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
CLEAN_UP_ENEMY_PED(sCopsStart[i])
|
|
ENDIF
|
|
ELSE
|
|
iNumPedsCleanedUp++
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Flag this group as cleaned up once each individual ped has been cleaned up (this saves execution time running exist checks every frame).
|
|
IF iNumPedsCleanedUp >= iNumPedsInGroup
|
|
sCopsStart[0].bHasCleanedUp = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Blow up one of the cars if the player shoots it
|
|
IF IS_VEHICLE_DRIVEABLE(vehCopsStart[1])
|
|
IF GET_VEHICLE_PETROL_TANK_HEALTH(vehCopsStart[1]) > -100
|
|
AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vehCopsStart[1], PLAYER_PED_ID(), FALSE)
|
|
IF GET_ENTITY_HEALTH(vehCopsStart[1]) < 500
|
|
OR GET_VEHICLE_PETROL_TANK_HEALTH(vehCopsStart[1]) < 700
|
|
OR GET_VEHICLE_ENGINE_HEALTH(vehCopsStart[1]) < 700
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(vehCopsStart[1], -100)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Another car turns up shortly after the first 2
|
|
IF NOT sCopsWave2[0].bIsCreated
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_COP_3, strCarrec)
|
|
|
|
IF HAS_MODEL_LOADED(modelMerryweather)
|
|
AND HAS_MODEL_LOADED(modelMerryCar)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_COP_3, strCarrec)
|
|
IF NOT DOES_ENTITY_EXIST(vehCopsWave2)
|
|
IF (iNumAliveCopsStart < 5 OR NOT bPlayerInShootoutSafeArea) //Trigger when enough enemies have died or if the player goes walkabout.
|
|
vehCopsWave2 = CREATE_VEHICLE(modelMerryCar, <<118.5229, -1275.9232, 28.7070>>)
|
|
SET_ENTITY_QUATERNION(vehCopsWave2, -0.0419, -0.0341, -0.6314, 0.7736)
|
|
SET_VEHICLE_ENGINE_ON(vehCopsWave2, TRUE, TRUE)
|
|
SET_SIREN_WITH_NO_DRIVER(vehCopsWave2, TRUE)
|
|
SET_VEHICLE_LIGHTS(vehCopsWave2, FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_FULLBEAM(vehCopsWave2, TRUE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehCopsWave2, CARREC_COPS_COP_3, strCarrec)
|
|
IF bPlayerInShootoutSafeArea
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehCopsWave2, 1000.0)
|
|
ELSE
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehCopsWave2, 1000.0)
|
|
ENDIF
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehCopsWave2)
|
|
SET_PLAYBACK_SPEED(vehCopsWave2, 1.1)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehCopsWave2, FALSE)
|
|
SET_VEHICLE_COLOURS(vehCopsWave2, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
|
|
SET_VEHICLE_EXTRA_COLOURS(vehCopsWave2, MERRY_CAR_COLOUR, 0)
|
|
SET_VEHICLE_EXTRA(vehCopsWave2, 1, TRUE)
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_01")
|
|
START_AUDIO_SCENE("BS_2A_CAR_ARRIVE_01")
|
|
ENDIF
|
|
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vehCopsWave2, "BS_2A_MERRYWEATHER_CARS")
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(sCopsWave2[0].ped)
|
|
sCopsWave2[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsWave2, VS_DRIVER, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sCopsWave2[1].ped)
|
|
sCopsWave2[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsWave2, VS_FRONT_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_ADVANCEDRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sCopsWave2[2].ped)
|
|
sCopsWave2[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsWave2, VS_BACK_LEFT, relGroupCops, 200, 100, WEAPONTYPE_ADVANCEDRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sCopsWave2[3].ped)
|
|
sCopsWave2[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehCopsWave2, VS_BACK_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
|
|
|
|
INITIALISE_ENEMY_GROUP(sCopsWave2, "Wave 2 ")
|
|
|
|
REPEAT COUNT_OF(sCopsWave2) i
|
|
IF HAS_PED_GOT_WEAPON(sCopsWave2[i].ped, WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(sCopsWave2[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
ELIF HAS_PED_GOT_WEAPON(sCopsWave2[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(sCopsWave2[i].ped, WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT sCopsWave2[0].bHasCleanedUp
|
|
INT iNumPedsCleanedUp = 0
|
|
INT iNumPedsInGroup = COUNT_OF(sCopsWave2)
|
|
|
|
REPEAT iNumPedsInGroup i
|
|
IF DOES_ENTITY_EXIST(sCopsWave2[i].ped)
|
|
IF NOT IS_PED_INJURED(sCopsWave2[i].ped)
|
|
//If the enemy was just damaged by the player then update the timer tracking the last time the player damaged a ped.
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sCopsWave2[i].ped, PLAYER_PED_ID())
|
|
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sCopsWave2[i].ped)
|
|
ENDIF
|
|
|
|
SWITCH sCopsWave2[i].iEvent
|
|
CASE 0
|
|
BOOL bGetPedsOut
|
|
INT iGetOutTimer
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehCopsWave2)
|
|
IF ABSF(GET_ENTITY_SPEED(vehCopsWave2)) < 0.5 AND IS_ENTITY_AT_COORD(vehCopsWave2, <<137.3, -1235.7, 28.5143>>, <<5.0, 5.0, 5.0>>)
|
|
bGetPedsOut = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bGetPedsOut = TRUE
|
|
ENDIF
|
|
|
|
IF bGetPedsOut
|
|
IF i = 0
|
|
iGetOutTimer = 0
|
|
ELIF i = 1
|
|
iGetOutTimer = 1200
|
|
ELIF i = 2
|
|
iGetOutTimer = 650
|
|
ELSE
|
|
iGetOutTimer = 1700
|
|
ENDIF
|
|
|
|
IF sCopsWave2[i].iTimer = 0
|
|
sCopsWave2[i].iTimer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - sCopsWave2[i].iTimer > iGetOutTimer
|
|
IF i = 0
|
|
sCopsWave2[i].vDest = <<130.6482, -1210.0120, 28.2952>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsWave2[i].ped, sCopsWave2[i].vDest, 3.0, TRUE)
|
|
ELIF i = 1
|
|
sCopsWave2[i].vDest = <<137.3, -1235.7, 28.5143>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsWave2[i].ped, sCopsWave2[i].vDest, 3.0, TRUE)
|
|
ELIF i = 2
|
|
sCopsWave2[i].vDest = <<128.5857, -1215.5505, 28.4570>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(sCopsWave2[i].ped, sCopsWave2[i].cover, sCopsWave2[i].vDest, 2.0, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ELSE
|
|
sCopsWave2[i].vDest = <<128.1760, -1226.6620, 28.5025>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(sCopsWave2[i].ped, sCopsWave2[i].cover, sCopsWave2[i].vDest, 15.7777, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
IF i % 2 = 0
|
|
SET_PED_COMBAT_PARAMS(sCopsWave2[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
ELSE
|
|
SET_PED_COMBAT_PARAMS(sCopsWave2[i].ped, 12, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
ENDIF
|
|
//SET_COMBAT_FLOAT(sCopsWave2[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 0.5)
|
|
IF HAS_PED_GOT_WEAPON(sCopsWave2[i].ped, WEAPONTYPE_CARBINERIFLE)
|
|
SET_CURRENT_PED_WEAPON(sCopsWave2[i].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
ELIF HAS_PED_GOT_WEAPON(sCopsWave2[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
|
|
SET_CURRENT_PED_WEAPON(sCopsWave2[i].ped, WEAPONTYPE_ADVANCEDRIFLE, TRUE)
|
|
ENDIF
|
|
SET_PED_COMBAT_ATTRIBUTES(sCopsWave2[i].ped, CA_USE_VEHICLE, FALSE)
|
|
SET_COMBAT_FLOAT(sCopsWave2[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sCopsWave2[i].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCopsWave2[i].ped, FALSE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sCopsWave2[i].ped, TRUE)
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_01")
|
|
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_01")
|
|
ENDIF
|
|
|
|
IF i = 0 OR i = 3
|
|
PLAY_PED_AMBIENT_SPEECH(sCopsWave2[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vehCopsWave2)
|
|
|
|
sCopsWave2[i].iTimer = GET_GAME_TIMER()
|
|
sCopsWave2[i].iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF GET_GAME_TIMER() - sCopsWave2[i].iTimer > 7000
|
|
SET_PED_COMBAT_ATTRIBUTES(sCopsWave2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sCopsWave2[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sCopsWave2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
sCopsWave2[i].iEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF GET_GAME_TIMER() - sCopsWave2[i].iTimer > 10000
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sCopsWave2[i].ped, FALSE)
|
|
sCopsWave2[i].iEvent++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sCopsWave2[i].iEvent > 0
|
|
UPDATE_AI_PED_BLIP(sCopsWave2[i].ped, sCopsWave2[i].sBlipData)
|
|
//SET_PED_RESET_FLAG(sCopsWave2[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
|
|
|
|
//Handle the enemy behaviour when the main attack front changes: if the enemy isn't part of the main front then set them to defensive.
|
|
IF sCopsWave2[i].iEvent <= 50
|
|
//General combat with charge on, once the front changes set them to defensive.
|
|
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FLANK_1
|
|
SET_PED_COMBAT_MOVEMENT(sCopsWave2[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsWave2[i].ped, sCopsWave2[i].vDest, 3.0)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(sCopsWave2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sCopsWave2[i].ped, CA_CAN_CHARGE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sCopsWave2[i].ped, 150.0)
|
|
|
|
sCopsWave2[i].iEvent = 100
|
|
ENDIF
|
|
|
|
//Do a forced charge when there are only a few enemies left.
|
|
IF NOT sCopsWave2[i].bSetToCharge
|
|
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
|
|
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
|
|
IF iNumAliveFrontEnemies < 4
|
|
SET_PED_CONFIG_FLAG(sCopsWave2[i].ped, PCF_ShouldChargeNow, TRUE)
|
|
sCopsWave2[i].bSetToCharge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF sCopsWave2[i].iEvent = 100
|
|
//General combat with charge off, once the front changes set them to charge.
|
|
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_1
|
|
OR eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
|
|
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
|
|
SET_PED_COMBAT_MOVEMENT(sCopsWave2[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sCopsWave2[i].ped, sCopsWave2[i].vDest, 3.0)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(sCopsWave2[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sCopsWave2[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sCopsWave2[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sCopsWave2[i].iEvent = 50
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sCopsWave2[i].ped, sCopsWave2[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_01")
|
|
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_01")
|
|
ENDIF
|
|
|
|
//If the enemy just died check if the player killed them, if so then update the timer tracking the last time a ped was killed by the player.
|
|
IF GET_PED_THAT_KILLED_PED(sCopsWave2[i].ped) = PLAYER_PED_ID()
|
|
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
CLEAN_UP_ENEMY_PED(sCopsWave2[i])
|
|
ENDIF
|
|
ELSE
|
|
iNumPedsCleanedUp++
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Flag this group as cleaned up once each individual ped has been cleaned up (this saves execution time running exist checks every frame).
|
|
IF iNumPedsCleanedUp >= iNumPedsInGroup
|
|
sCopsWave2[0].bHasCleanedUp = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehCopsWave2) AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehCopsWave2)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_COP_3, strCarrec)
|
|
ENDIF
|
|
|
|
//DO_VEHICLE_DAMAGE_WHEN_SHOT(vehCopsWave2)
|
|
ENDIF
|
|
|
|
//Van attempts to get in close, skids out.
|
|
IF NOT sVanCrash[0].bIsCreated
|
|
IF (bDoNewVersionOfShootout AND iNumAliveVanFlank + iNumAliveNooseRope1 /*+ iNumAliveNooseAbove*/ + iNumAliveGoonsWave3b < 3)
|
|
OR (NOT bDoNewVersionOfShootout AND iNumAliveCopsStart + iNumAliveCopsWave2 < 5)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_SHOOTOUT_GOONS_2B, strCarrec)
|
|
|
|
IF HAS_MODEL_LOADED(modelMerryweather)
|
|
AND HAS_MODEL_LOADED(modelMerryCar)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_SHOOTOUT_GOONS_2B, strCarrec)
|
|
IF NOT DOES_ENTITY_EXIST(vehVanCrash)
|
|
vehVanCrash = CREATE_VEHICLE(modelMerryCar, <<118.5229, -1275.9232, 28.7070>>)
|
|
SET_VEHICLE_ENGINE_ON(vehVanCrash, TRUE, TRUE)
|
|
SET_SIREN_WITH_NO_DRIVER(vehVanCrash, TRUE)
|
|
SET_VEHICLE_LIGHTS(vehVanCrash, FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_FULLBEAM(vehVanCrash, TRUE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehVanCrash, CARREC_SHOOTOUT_GOONS_2B, strCarrec)
|
|
IF bPlayerInShootoutSafeArea
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehVanCrash, 1000.0)
|
|
ELSE
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehVanCrash, 0.0)
|
|
ENDIF
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehVanCrash)
|
|
SET_PLAYBACK_SPEED(vehVanCrash, 1.0)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehVanCrash, FALSE)
|
|
SET_VEHICLE_COLOURS(vehVanCrash, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
|
|
SET_VEHICLE_EXTRA_COLOURS(vehVanCrash, MERRY_CAR_COLOUR, 0)
|
|
SET_VEHICLE_EXTRA(vehVanCrash, 1, TRUE)
|
|
|
|
iVanCrashEvent = 0
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_02")
|
|
START_AUDIO_SCENE("BS_2A_CAR_ARRIVE_02")
|
|
ENDIF
|
|
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vehVanCrash, "BS_2A_MERRYWEATHER_CARS")
|
|
ELIF NOT DOES_ENTITY_EXIST(sVanCrash[0].ped)
|
|
sVanCrash[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehVanCrash, VS_DRIVER, relGroupCops, 150, 100, WEAPONTYPE_ADVANCEDRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sVanCrash[1].ped)
|
|
sVanCrash[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehVanCrash, VS_FRONT_RIGHT, relGroupCops, 150, 100, WEAPONTYPE_CARBINERIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sVanCrash[2].ped)
|
|
sVanCrash[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehVanCrash, VS_BACK_LEFT, relGroupCops, 150, 100, WEAPONTYPE_CARBINERIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sVanCrash[3].ped)
|
|
sVanCrash[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehVanCrash, VS_BACK_RIGHT, relGroupCops, 150, 100, WEAPONTYPE_ADVANCEDRIFLE)
|
|
|
|
INITIALISE_ENEMY_GROUP(sVanCrash, "Crash ")
|
|
|
|
REPEAT COUNT_OF(sVanCrash) i
|
|
IF HAS_PED_GOT_WEAPON(sVanCrash[i].ped, WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(sVanCrash[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
ELIF HAS_PED_GOT_WEAPON(sVanCrash[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(sVanCrash[i].ped, WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT sVanCrash[0].bHasCleanedUp
|
|
BOOL bTimeToGetOut = FALSE
|
|
BOOL bCheckedGetOutTrigger = FALSE
|
|
INT iNumPedsCleanedUp = 0
|
|
INT iNumPedsInGroup = COUNT_OF(sVanCrash)
|
|
|
|
REPEAT iNumPedsInGroup i
|
|
IF DOES_ENTITY_EXIST(sVanCrash[i].ped)
|
|
IF NOT IS_PED_INJURED(sVanCrash[i].ped)
|
|
UPDATE_AI_PED_BLIP(sVanCrash[i].ped, sVanCrash[i].sBlipData)
|
|
//SET_PED_RESET_FLAG(sVanCrash[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
|
|
|
|
//If the enemy was just damaged by the player then update the timer tracking the last time the player damaged a ped.
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sVanCrash[i].ped, PLAYER_PED_ID())
|
|
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sVanCrash[i].ped)
|
|
ENDIF
|
|
|
|
SWITCH sVanCrash[i].iEvent
|
|
CASE 0
|
|
IF NOT bCheckedGetOutTrigger
|
|
IF NOT IS_ENTITY_DEAD(vehVanCrash)
|
|
IF ABSF(GET_ENTITY_SPEED(vehVanCrash)) < 3.0
|
|
IF (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehVanCrash) AND GET_TIME_POSITION_IN_RECORDING(vehVanCrash) > 2000.0)
|
|
OR NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehVanCrash)
|
|
bTimeToGetOut = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bTimeToGetOut = TRUE
|
|
ENDIF
|
|
|
|
bCheckedGetOutTrigger = TRUE
|
|
ENDIF
|
|
|
|
IF bTimeToGetOut
|
|
INT iGetOutTimer
|
|
|
|
IF i = 0
|
|
iGetOutTimer = 0
|
|
ELIF i = 1
|
|
iGetOutTimer = 300
|
|
ELIF i = 2
|
|
iGetOutTimer = 650
|
|
ELSE
|
|
iGetOutTimer = 400
|
|
ENDIF
|
|
|
|
IF sVanCrash[i].iTimer = 0
|
|
sVanCrash[i].iTimer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - sVanCrash[i].iTimer > iGetOutTimer
|
|
IF i = 0
|
|
sVanCrash[i].vDest = GET_ENTITY_COORDS(sVanCrash[i].ped)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sVanCrash[i].ped, GET_ENTITY_COORDS(sVanCrash[i].ped), 5.0)
|
|
ELIF i = 1
|
|
sVanCrash[i].vDest = <<128.9, -1224.4, 28.6>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sVanCrash[i].ped, <<128.9, -1224.4, 28.6>>, 3.0, TRUE)
|
|
ELIF i = 2
|
|
sVanCrash[i].vDest = <<138.9, -1209.4, 28.6>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sVanCrash[i].ped, <<138.9, -1209.4, 28.6>>, 4.0, TRUE)
|
|
ELIF i = 3
|
|
sVanCrash[i].vDest = <<127.4, -1215.7, 28.6>>
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sVanCrash[i].ped, <<127.4, -1215.7, 28.6>>, 3.0, TRUE)
|
|
ENDIF
|
|
|
|
IF i % 2 = 0
|
|
SET_PED_COMBAT_PARAMS(sVanCrash[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
ELSE
|
|
SET_PED_COMBAT_PARAMS(sVanCrash[i].ped, 12, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
ENDIF
|
|
|
|
IF HAS_PED_GOT_WEAPON(sVanCrash[i].ped, WEAPONTYPE_CARBINERIFLE)
|
|
SET_CURRENT_PED_WEAPON(sVanCrash[i].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
ELIF HAS_PED_GOT_WEAPON(sVanCrash[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
|
|
SET_CURRENT_PED_WEAPON(sVanCrash[i].ped, WEAPONTYPE_ADVANCEDRIFLE, TRUE)
|
|
ENDIF
|
|
SET_PED_COMBAT_ATTRIBUTES(sVanCrash[i].ped, CA_USE_VEHICLE, FALSE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sVanCrash[i].ped, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sVanCrash[i].ped, 200.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(sVanCrash[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sVanCrash[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sVanCrash[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sVanCrash[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_02")
|
|
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_02")
|
|
ENDIF
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(sVanCrash[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vehVanCrash)
|
|
|
|
sVanCrash[i].iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Handle the enemy behaviour when the main attack front changes: if the enemy isn't part of the main front then set them to defensive.
|
|
IF sVanCrash[i].iEvent <= 50
|
|
//General combat with charge on, once the front changes set them to defensive.
|
|
//NOTE: currently these peds should never be set to not charge.
|
|
/*IF eShootoutState = SHOOTOUT_STATE_DEFEND_FLANK_1
|
|
SET_PED_COMBAT_MOVEMENT(sVanCrash[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sVanCrash[i].ped, sVanCrash[i].vDest, 5.0)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(sVanCrash[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sVanCrash[i].ped, CA_CAN_CHARGE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sVanCrash[i].ped, 150.0)
|
|
|
|
sVanCrash[i].iEvent = 100
|
|
ENDIF*/
|
|
|
|
//Do a forced charge when there are only a few enemies left.
|
|
IF NOT sVanCrash[i].bSetToCharge
|
|
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
|
|
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
|
|
IF iNumAliveFrontEnemies < 4
|
|
SET_PED_CONFIG_FLAG(sVanCrash[i].ped, PCF_ShouldChargeNow, TRUE)
|
|
sVanCrash[i].bSetToCharge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF sVanCrash[i].iEvent = 100
|
|
//General combat with charge off, once the front changes set them to charge.
|
|
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_1
|
|
OR eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
|
|
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
|
|
SET_PED_COMBAT_MOVEMENT(sVanCrash[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sVanCrash[i].ped, sVanCrash[i].vDest, 5.0, TRUE)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(sVanCrash[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sVanCrash[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sVanCrash[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sVanCrash[i].iEvent = 50
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sVanCrash[i].ped, sVanCrash[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
IF i > 0
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_02")
|
|
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_02")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If the enemy just died check if the player killed them, if so then update the timer tracking the last time a ped was killed by the player.
|
|
IF GET_PED_THAT_KILLED_PED(sVanCrash[i].ped) = PLAYER_PED_ID()
|
|
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
CLEAN_UP_ENEMY_PED(sVanCrash[i])
|
|
ENDIF
|
|
ELSE
|
|
iNumPedsCleanedUp++
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Flag this group as cleaned up once each individual ped has been cleaned up (this saves execution time running exist checks every frame).
|
|
IF iNumPedsCleanedUp >= iNumPedsInGroup
|
|
sVanCrash[0].bHasCleanedUp = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Update the van: tyres burst.
|
|
IF NOT IS_ENTITY_DEAD(vehVanCrash)
|
|
SWITCH iVanCrashEvent
|
|
CASE 0
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehVanCrash)
|
|
IF GET_TIME_POSITION_IN_RECORDING(vehVanCrash) > 6800
|
|
iVanCrashEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehVanCrash)
|
|
AND GET_TIME_POSITION_IN_RECORDING(vehVanCrash) > 7100
|
|
SET_VEHICLE_ENGINE_HEALTH(vehVanCrash, 200.0)
|
|
iVanCrashEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehVanCrash)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_SHOOTOUT_GOONS_2B, strCarrec)
|
|
|
|
iVanCrashEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3
|
|
//DO_VEHICLE_DAMAGE_WHEN_SHOT(vehVanCrash)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Noose van: attempts to flank, triggers at different times depending on which shootout version we're doing.
|
|
IF NOT sVanFlank[0].bIsCreated
|
|
IF (bDoNewVersionOfShootout AND iNumAliveCopsStart + iNumAliveCopsWave2 < 3)
|
|
OR (NOT bDoNewVersionOfShootout AND iNumAliveCopsStart + iNumAliveCopsWave2 + iNumAliveVanCrash < 3)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_SHOOTOUT_GOONS_2A, strCarrec)
|
|
|
|
IF HAS_MODEL_LOADED(modelMerryweather)
|
|
AND HAS_MODEL_LOADED(modelMerryCar)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_SHOOTOUT_GOONS_2A, strCarrec)
|
|
IF NOT DOES_ENTITY_EXIST(vehNooseWave1)
|
|
vehNooseWave1 = CREATE_VEHICLE(modelMerryCar, <<118.5229, -1275.9232, 28.7070>>)
|
|
SET_ENTITY_QUATERNION(vehNooseWave1, -0.0419, -0.0341, -0.6314, 0.7736)
|
|
SET_VEHICLE_ENGINE_ON(vehNooseWave1, TRUE, TRUE)
|
|
SET_SIREN_WITH_NO_DRIVER(vehNooseWave1, TRUE)
|
|
SET_VEHICLE_LIGHTS(vehNooseWave1, FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_FULLBEAM(vehNooseWave1, TRUE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehNooseWave1, CARREC_SHOOTOUT_GOONS_2A, strCarrec)
|
|
IF bPlayerInShootoutSafeArea
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehNooseWave1, 1000.0)
|
|
ELSE
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehNooseWave1, 0.0)
|
|
ENDIF
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehNooseWave1)
|
|
SET_PLAYBACK_SPEED(vehNooseWave1, 1.0)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehNooseWave1, FALSE)
|
|
SET_VEHICLE_COLOURS(vehNooseWave1, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
|
|
SET_VEHICLE_EXTRA_COLOURS(vehNooseWave1, MERRY_CAR_COLOUR, 0)
|
|
SET_VEHICLE_EXTRA(vehNooseWave1, 1, TRUE)
|
|
SET_VEHICLE_STRONG(vehNooseWave1, TRUE)
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_03")
|
|
START_AUDIO_SCENE("BS_2A_CAR_ARRIVE_03")
|
|
ENDIF
|
|
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vehNooseWave1, "BS_2A_MERRYWEATHER_CARS")
|
|
ELIF NOT DOES_ENTITY_EXIST(sVanFlank[0].ped)
|
|
sVanFlank[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehNooseWave1, VS_DRIVER, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sVanFlank[1].ped)
|
|
sVanFlank[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehNooseWave1, VS_FRONT_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_ADVANCEDRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sVanFlank[2].ped)
|
|
sVanFlank[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehNooseWave1, VS_BACK_LEFT, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sVanFlank[3].ped)
|
|
sVanFlank[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehNooseWave1, VS_BACK_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_PUMPSHOTGUN)
|
|
|
|
INITIALISE_ENEMY_GROUP(sVanFlank, "Van1 ")
|
|
|
|
REPEAT COUNT_OF(sVanFlank) i
|
|
IF i < 3
|
|
IF HAS_PED_GOT_WEAPON(sVanFlank[i].ped, WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(sVanFlank[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
ELIF HAS_PED_GOT_WEAPON(sVanFlank[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(sVanFlank[i].ped, WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT sVanFlank[0].bHasCleanedUp
|
|
INT iNumPedsCleanedUp = 0
|
|
INT iNumPedsInGroup = COUNT_OF(sVanFlank)
|
|
|
|
REPEAT iNumPedsInGroup i
|
|
IF DOES_ENTITY_EXIST(sVanFlank[i].ped)
|
|
IF NOT IS_PED_INJURED(sVanFlank[i].ped)
|
|
UPDATE_AI_PED_BLIP(sVanFlank[i].ped, sVanFlank[i].sBlipData)
|
|
//SET_PED_RESET_FLAG(sVanFlank[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
|
|
|
|
//If the enemy was just damaged by the player then update the timer tracking the last time the player damaged a ped.
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sVanFlank[i].ped, PLAYER_PED_ID())
|
|
iTimeLastFlankingEnemyDamaged = GET_GAME_TIMER()
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sVanFlank[i].ped)
|
|
ENDIF
|
|
|
|
SWITCH sVanFlank[i].iEvent
|
|
CASE 0
|
|
IF (NOT IS_ENTITY_DEAD(vehNooseWave1)
|
|
AND ABSF(GET_ENTITY_SPEED(vehNooseWave1)) < 0.5
|
|
AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehNooseWave1))
|
|
OR IS_ENTITY_DEAD(vehNooseWave1) //In case it's blown up during playback
|
|
IF i = 0
|
|
sVanFlank[i].vDest = <<165.7681, -1194.2896, 28.3612>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(sVanFlank[i].ped, sVanFlank[i].cover, sVanFlank[i].vDest, 97.5015, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ELIF i = 1
|
|
sVanFlank[i].vDest = <<164.1503, -1207.8420, 28.7991>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(sVanFlank[i].ped, sVanFlank[i].cover, sVanFlank[i].vDest, 86.1376, 2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120)
|
|
ELIF i = 2
|
|
sVanFlank[i].vDest = <<165.6146, -1198.6959, 28.3113>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(sVanFlank[i].ped, sVanFlank[i].cover, sVanFlank[i].vDest, 83.9552, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ELSE
|
|
sVanFlank[i].vDest = <<165.0666, -1212.6161, 28.2951>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(sVanFlank[i].ped, sVanFlank[i].cover, sVanFlank[i].vDest, 72.3967, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ENDIF
|
|
|
|
IF i % 2 = 0
|
|
SET_PED_COMBAT_PARAMS(sVanFlank[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
ELSE
|
|
SET_PED_COMBAT_PARAMS(sVanFlank[i].ped, 12, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
ENDIF
|
|
|
|
IF i = 3
|
|
SET_CURRENT_PED_WEAPON(sVanFlank[i].ped, WEAPONTYPE_PUMPSHOTGUN, TRUE)
|
|
ELSE
|
|
IF HAS_PED_GOT_WEAPON(sVanFlank[i].ped, WEAPONTYPE_CARBINERIFLE)
|
|
SET_CURRENT_PED_WEAPON(sVanFlank[i].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
ELIF HAS_PED_GOT_WEAPON(sVanFlank[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
|
|
SET_CURRENT_PED_WEAPON(sVanFlank[i].ped, WEAPONTYPE_ADVANCEDRIFLE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
SET_PED_COMBAT_ATTRIBUTES(sVanFlank[i].ped, CA_USE_VEHICLE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sVanFlank[i].ped, 150.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sVanFlank[i].ped, FALSE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sVanFlank[i].ped, TRUE)
|
|
SET_COMBAT_FLOAT(sVanFlank[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sVanFlank[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_03")
|
|
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_03")
|
|
ENDIF
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(sVanFlank[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vehNooseWave1)
|
|
|
|
sVanFlank[i].iTimer = GET_GAME_TIMER()
|
|
sVanFlank[i].iEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF GET_GAME_TIMER() - sVanFlank[i].iTimer > 15000
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sVanFlank[i].ped, FALSE)
|
|
ENDIF
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(sVanFlank[i].ped), vPlayerPos) < 100.0
|
|
OR GET_GAME_TIMER() - sVanFlank[i].iTimer > 18000
|
|
OR iNumAliveVanFlank <= 3
|
|
SET_PED_COMBAT_ATTRIBUTES(sVanFlank[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sVanFlank[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sVanFlank[i].ped, FALSE)
|
|
|
|
sVanFlank[i].iEvent++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sVanFlank[i].iEvent > 0
|
|
//Handle the enemy behaviour when the main attack front changes: if the enemy isn't part of the main front then set them to defensive.
|
|
IF sVanFlank[i].iEvent <= 50
|
|
//General combat with charge on, once the front changes set them to defensive.
|
|
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_1
|
|
OR eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
|
|
SET_PED_COMBAT_MOVEMENT(sVanFlank[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sVanFlank[i].ped, sVanFlank[i].vDest, 2.0)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(sVanFlank[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sVanFlank[i].ped, CA_CAN_CHARGE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sVanFlank[i].ped, 150.0)
|
|
|
|
sVanFlank[i].iEvent = 100
|
|
ENDIF
|
|
ELIF sVanFlank[i].iEvent = 100
|
|
//General combat with charge off, once the front changes set them to charge.
|
|
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FLANK_1
|
|
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
|
|
SET_PED_COMBAT_MOVEMENT(sVanFlank[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sVanFlank[i].ped, sVanFlank[i].vDest, 2.0)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(sVanFlank[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sVanFlank[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sVanFlank[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sVanFlank[i].iEvent = 50
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sVanFlank[i].ped, sVanFlank[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_03")
|
|
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_03")
|
|
ENDIF
|
|
|
|
//If the enemy just died check if the player killed them, if so then update the timer tracking the last time a ped was killed by the player.
|
|
IF GET_PED_THAT_KILLED_PED(sVanFlank[i].ped) = PLAYER_PED_ID()
|
|
iTimeLastFlankingEnemyDamaged = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
CLEAN_UP_ENEMY_PED(sVanFlank[i])
|
|
ENDIF
|
|
ELSE
|
|
iNumPedsCleanedUp++
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Flag this group as cleaned up once each individual ped has been cleaned up (this saves execution time running exist checks every frame).
|
|
IF iNumPedsCleanedUp >= iNumPedsInGroup
|
|
sVanFlank[0].bHasCleanedUp = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehNooseWave1)
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehNooseWave1)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_SHOOTOUT_GOONS_2A, strCarrec)
|
|
|
|
//DO_VEHICLE_DAMAGE_WHEN_SHOT(vehNooseWave1)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//These used to be rappelling peds, now they just spawn off-camera
|
|
IF NOT sNooseRope1[0].bIsCreated
|
|
IF sVanFlank[0].bIsCreated
|
|
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<162.177841,-1205.590576,30.600058>>,<<19.000000,22.250000,2.250000>>)
|
|
IF HAS_MODEL_LOADED(modelMerryweather)
|
|
IF NOT DOES_ENTITY_EXIST(sNooseRope1[0].ped)
|
|
sNooseRope1[0].ped = CREATE_ENEMY_PED(modelMerryweather, <<181.2369, -1208.8674, 28.2951>>, 88.381, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sNooseRope1[1].ped)
|
|
sNooseRope1[1].ped = CREATE_ENEMY_PED(modelMerryweather, <<181.1033, -1199.6613, 28.2952>>, 92.5013, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
|
|
|
|
INITIALISE_ENEMY_GROUP(sNooseRope1, "Rope 1 ")
|
|
|
|
REPEAT COUNT_OF(sNooseRope1) i
|
|
GIVE_WEAPON_COMPONENT_TO_PED(sNooseRope1[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
sNooseRope1[i].iTimer = 0
|
|
sNooseRope1[i].iEvent = 0
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT sNooseRope1[0].bHasCleanedUp
|
|
INT iNumPedsCleanedUp = 0
|
|
INT iNumPedsInGroup = COUNT_OF(sNooseRope1)
|
|
|
|
REPEAT iNumPedsInGroup i
|
|
IF DOES_ENTITY_EXIST(sNooseRope1[i].ped)
|
|
IF NOT IS_PED_INJURED(sNooseRope1[i].ped)
|
|
//If the enemy was just damaged by the player then update the timer tracking the last time the player damaged a ped.
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sNooseRope1[i].ped, PLAYER_PED_ID())
|
|
iTimeLastFlankingEnemyDamaged = GET_GAME_TIMER()
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sNooseRope1[i].ped)
|
|
ENDIF
|
|
|
|
SWITCH sNooseRope1[i].iEvent
|
|
CASE 0
|
|
IF sNooseRope1[i].iTimer = 0
|
|
sNooseRope1[i].iTimer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - sNooseRope1[i].iTimer > 3000
|
|
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<162.177841,-1205.590576,30.600058>>,<<19.000000,22.250000,2.250000>>)
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(sNooseRope1[i].ped, "SURROUNDED", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
|
|
sNooseRope1[i].vDest = <<162.3094, -1205.9188, 28.2997>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(sNooseRope1[i].ped, sNooseRope1[i].cover, sNooseRope1[i].vDest, 93.1005, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
//ADD_EXPLOSION(<<159.9, -1204.3, 28.4>>, EXP_TAG_SMOKE_GRENADE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<177.1, -1204.7302, 28.2952>>, PLAYER_PED_ID(), PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE, ENAV_NO_STOPPING)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 150.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sNooseRope1[i].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ELSE
|
|
sNooseRope1[i].vDest = <<163.7782, -1201.0775, 28.2951>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(sNooseRope1[i].ped, sNooseRope1[i].cover, sNooseRope1[i].vDest, 91.1853, 2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_PAUSE(NULL, 500)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<177.1, -1204.7302, 28.2952>>, PLAYER_PED_ID(), PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE, ENAV_NO_STOPPING)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 150.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sNooseRope1[i].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_AI(sNooseRope1[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, CA_USE_COVER, sNooseRope1[i].vDest, 2.0)
|
|
|
|
SET_COMBAT_FLOAT(sNooseRope1[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_COMBAT_FLOAT(sNooseRope1[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
|
|
sNooseRope1[i].iTimer = 0
|
|
sNooseRope1[i].iEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF VDIST2(GET_ENTITY_COORDS(sNooseRope1[i].ped), vPlayerPos) < 100.0
|
|
OR GET_GAME_TIMER() - sNooseRope1[i].iTimer > 18000
|
|
OR iNumAliveNooseRope1 <= 2
|
|
SET_PED_COMBAT_ATTRIBUTES(sNooseRope1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sNooseRope1[i].ped, CA_CAN_CHARGE, TRUE)
|
|
|
|
sNooseRope1[i].iEvent++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sNooseRope1[i].iEvent > 0
|
|
UPDATE_AI_PED_BLIP(sNooseRope1[i].ped, sNooseRope1[i].sBlipData)
|
|
//SET_PED_RESET_FLAG(sNooseRope1[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
|
|
|
|
//Handle the enemy behaviour when the main attack front changes: if the enemy isn't part of the main front then set them to defensive.
|
|
IF sNooseRope1[i].iEvent <= 50
|
|
//General combat with charge on, once the front changes set them to defensive.
|
|
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2 //Don't check Front 1 as this will override their current behaviour.
|
|
SET_PED_COMBAT_MOVEMENT(sNooseRope1[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sNooseRope1[i].ped, sNooseRope1[i].vDest, 2.0)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(sNooseRope1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sNooseRope1[i].ped, CA_CAN_CHARGE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sNooseRope1[i].ped, 150.0)
|
|
|
|
sNooseRope1[i].iEvent = 100
|
|
ENDIF
|
|
ELIF sNooseRope1[i].iEvent = 100
|
|
//General combat with charge off, once the front changes set them to charge.
|
|
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FLANK_1
|
|
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
|
|
SET_PED_COMBAT_MOVEMENT(sNooseRope1[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sNooseRope1[i].ped, sNooseRope1[i].vDest, 2.0)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(sNooseRope1[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sNooseRope1[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sNooseRope1[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sNooseRope1[i].iEvent = 50
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sNooseRope1[i].ped, sNooseRope1[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
//If the enemy just died check if the player killed them, if so then update the timer tracking the last time a ped was killed by the player.
|
|
IF GET_PED_THAT_KILLED_PED(sNooseRope1[i].ped) = PLAYER_PED_ID()
|
|
iTimeLastFlankingEnemyDamaged = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
CLEAN_UP_ENEMY_PED(sNooseRope1[i])
|
|
ENDIF
|
|
ELSE
|
|
iNumPedsCleanedUp++
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Flag this group as cleaned up once each individual ped has been cleaned up (this saves execution time running exist checks every frame).
|
|
IF iNumPedsCleanedUp >= iNumPedsInGroup
|
|
sNooseRope1[0].bHasCleanedUp = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Peds up above: appear once the player starts targetting van/rope peds
|
|
IF NOT sNooseAbove[0].bIsCreated
|
|
/*REQUEST_CLIP_SET("move_ped_strafing")
|
|
|
|
IF HAS_MODEL_LOADED(modelMerryweather)
|
|
AND HAS_CLIP_SET_LOADED("move_ped_strafing")
|
|
AND iNumAliveNooseRope1 < 2
|
|
sNooseAbove[0].ped = CREATE_ENEMY_PED(modelMerryweather, <<161.8438, -1205.5321, 36.7988>>, 90.7871, relGroupCops, 150, 0, WEAPONTYPE_CARBINERIFLE)
|
|
sNooseAbove[1].ped = CREATE_ENEMY_PED(modelMerryweather, <<160.2572, -1203.2941, 36.7949>>, 95.0947, relGroupCops, 150, 0, WEAPONTYPE_CARBINERIFLE)
|
|
|
|
INITIALISE_ENEMY_GROUP(sNooseAbove, "Above ")
|
|
iTrainTimer = 0
|
|
|
|
REPEAT COUNT_OF(sNooseRope1) i
|
|
SET_CURRENT_PED_WEAPON(sNooseAbove[i].ped, WEAPONTYPE_CARBINERIFLE, TRUE) //Fix suggested by code for 445077.
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sNooseAbove[i].ped, FALSE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sNooseAbove[i].ped, TRUE)
|
|
SET_PED_STRAFE_CLIPSET(sNooseAbove[i].ped, "move_ped_strafing")
|
|
//GIVE_WEAPON_COMPONENT_TO_PED(sNooseAbove[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSHLASR)
|
|
//sNooseAbove[i].blip = CREATE_BLIP_FOR_PED(sNooseAbove[i].ped, TRUE)
|
|
ENDREPEAT
|
|
ENDIF*/
|
|
ELSE
|
|
REPEAT COUNT_OF(sNooseAbove) i
|
|
IF DOES_ENTITY_EXIST(sNooseAbove[i].ped)
|
|
IF NOT IS_PED_INJURED(sNooseAbove[i].ped)
|
|
UPDATE_AI_PED_BLIP(sNooseAbove[i].ped, sNooseAbove[i].sBlipData)
|
|
//SET_PED_RESET_FLAG(sNooseAbove[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
|
|
|
|
IF i = 0
|
|
sNooseAbove[i].vDest = <<150.4053, -1206.1014, 36.9088>>
|
|
ELIF i = 1
|
|
sNooseAbove[i].vDest = <<150.2348, -1203.9055, 36.9092>>
|
|
ENDIF
|
|
|
|
SWITCH sNooseAbove[i].iEvent
|
|
CASE 0
|
|
IF i = 0
|
|
OR (i = 1 AND (IS_SPHERE_VISIBLE(<<149.4, -1204.1, 39.7>>, 1.0) OR IS_PED_INJURED(sNooseAbove[0].ped) OR iNumAliveVanFlank < 3))
|
|
SET_PED_COMBAT_PARAMS(sNooseAbove[i].ped, 20, CM_STATIONARY, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sNooseAbove[i].ped, sNooseAbove[i].vDest, 1.0, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(sNooseAbove[i].ped, sNooseAbove[i].vDest, PLAYER_PED_ID(), PEDMOVE_RUN, FALSE, 0.25, 1.0, FALSE, ENAV_STOP_EXACTLY)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sNooseAbove[i].ped, TRUE)
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(sNooseRope1[i].ped, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
sNooseAbove[i].iTimer = 0
|
|
sNooseAbove[i].iEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF GET_SCRIPT_TASK_STATUS(sNooseAbove[i].ped, SCRIPT_TASK_GO_STRAIGHT_TO_COORD) != PERFORMING_TASK
|
|
IF VDIST2(GET_ENTITY_COORDS(sNooseAbove[i].ped), sNooseAbove[i].vDest) < 2.0
|
|
IF GET_SCRIPT_TASK_STATUS(sNooseAbove[i].ped, SCRIPT_TASK_SHOOT_AT_ENTITY) != PERFORMING_TASK
|
|
TASK_SHOOT_AT_ENTITY(sNooseAbove[i].ped, PLAYER_PED_ID(), -1, FIRING_TYPE_RANDOM_BURSTS)
|
|
ENDIF
|
|
ELSE
|
|
sNooseAbove[i].iEvent = 0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Make one of them fall off the top if they're shot.
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sNooseAbove[i].ped, GET_PED_INDEX(CHAR_MICHAEL))
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sNooseAbove[i].ped, GET_PED_INDEX(CHAR_TREVOR))
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sNooseAbove[i].ped, GET_PED_INDEX(CHAR_FRANKLIN))
|
|
IF i = 0
|
|
SET_ENTITY_INVINCIBLE(sNooseAbove[i].ped, TRUE)
|
|
SET_PED_TO_RAGDOLL_WITH_FALL(sNooseAbove[i].ped, 2000, 10000, TYPE_FROM_HIGH, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<0.0, 0.0, 90.0>>),
|
|
29.0, <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
|
|
APPLY_FORCE_TO_ENTITY(sNooseAbove[i].ped, APPLY_TYPE_IMPULSE, <<-2.0, 0.0, 0.1>>, <<0.0, 0.0, 0.5>>,
|
|
GET_PED_RAGDOLL_BONE_INDEX(sNooseAbove[i].ped, RAGDOLL_PELVIS), FALSE, TRUE, TRUE)
|
|
sNooseAbove[i].iEvent = 2
|
|
sNooseAbove[i].iTimer = GET_GAME_TIMER()
|
|
ELSE
|
|
APPLY_DAMAGE_TO_PED(sNooseAbove[i].ped, 200, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF i = 0
|
|
IF GET_GAME_TIMER() - sNooseAbove[i].iTimer > 2000
|
|
SET_ENTITY_INVINCIBLE(sNooseAbove[i].ped, FALSE)
|
|
APPLY_DAMAGE_TO_PED(sNooseAbove[i].ped, 200, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF bBuddiesPushedToFlank
|
|
IF sNooseAbove[i].iTimer = 0
|
|
sNooseAbove[i].iTimer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - sNooseAbove[i].iTimer > 1000
|
|
SET_ENTITY_INVINCIBLE(sNooseAbove[i].ped, FALSE)
|
|
APPLY_DAMAGE_TO_PED(sNooseAbove[i].ped, 200, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sNooseAbove[i].ped, sNooseAbove[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(sNooseAbove[i])
|
|
|
|
IF i = 1
|
|
AND IS_PED_INJURED(sNooseAbove[0].ped)
|
|
REMOVE_CLIP_SET("move_ped_strafing")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Set up a train to go past when the player looks up at the enemies for the first time.
|
|
IF iTrainTimer = 0
|
|
REQUEST_MODEL(modelTrain)
|
|
|
|
IF HAS_MODEL_LOADED(modelTrain)
|
|
IF NOT IS_PED_INJURED(sNooseAbove[0].ped) OR NOT IS_PED_INJURED(sNooseAbove[1].ped)
|
|
IF IS_SPHERE_VISIBLE(<<149.4, -1204.1, 37.7>>, 1.0)
|
|
IF (NOT IS_PED_INJURED(sNooseAbove[0].ped) AND IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sNooseAbove[0].ped))
|
|
OR (NOT IS_PED_INJURED(sNooseAbove[1].ped) AND IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sNooseAbove[1].ped))
|
|
vehTrain = CREATE_MISSION_TRAIN(24, <<181.100, -1198.800, 37.600>>, TRUE)
|
|
|
|
iTrainTimer = GET_GAME_TIMER()
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelTrain)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Train didn't load in time.
|
|
iTrainTimer = GET_GAME_TIMER()
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelTrain)
|
|
ENDIF
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - iTrainTimer > 10000
|
|
IF NOT IS_ENTITY_DEAD(vehTrain)
|
|
DELETE_MISSION_TRAIN(vehTrain)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Final car: shows up once a few of the flank enemies have been killed.
|
|
IF NOT sGoonsWave3b[0].bIsCreated
|
|
REQUEST_VEHICLE_RECORDING(CARREC_SHOOTOUT_GOONS_3B, strCarrec)
|
|
|
|
//Create each entity one at a time to avoid execution time spikes.
|
|
IF HAS_MODEL_LOADED(modelMerryweather)
|
|
AND HAS_MODEL_LOADED(modelMerryCar)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_SHOOTOUT_GOONS_3B, strCarrec)
|
|
IF NOT DOES_ENTITY_EXIST(vehGoons3b)
|
|
//IF iNumAliveNooseRope1 + iNumAliveVanFlank + iNumAliveNooseAbove < 5
|
|
IF iNumAliveNooseRope1 + iNumAliveVanFlank < 4
|
|
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<162.704208,-1207.238647,30.547756>>,<<4.000000,43.750000,2.500000>>)
|
|
vehGoons3b = CREATE_VEHICLE(modelMerryCar, <<184.3946, -1267.1230, 28.7186>>)
|
|
SET_ENTITY_QUATERNION(vehGoons3b, 0.0000, 0.0003, -0.1558, 0.9878)
|
|
SET_VEHICLE_ENGINE_ON(vehGoons3b, TRUE, TRUE)
|
|
SET_VEHICLE_LIGHTS(vehGoons3b, FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_FULLBEAM(vehGoons3b, TRUE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehGoons3b, CARREC_SHOOTOUT_GOONS_3B, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehGoons3b, 0.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehGoons3b)
|
|
SET_PLAYBACK_SPEED(vehGoons3b, 1.0)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehGoons3b, FALSE)
|
|
SET_VEHICLE_COLOURS(vehGoons3b, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
|
|
SET_VEHICLE_EXTRA_COLOURS(vehGoons3b, MERRY_CAR_COLOUR, 0)
|
|
SET_VEHICLE_EXTRA(vehGoons3b, 1, TRUE)
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(sGoonsWave3b[0].ped)
|
|
sGoonsWave3b[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehGoons3b, VS_DRIVER, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sGoonsWave3b[1].ped)
|
|
sGoonsWave3b[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehGoons3b, VS_FRONT_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_ADVANCEDRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sGoonsWave3b[2].ped)
|
|
sGoonsWave3b[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehGoons3b, VS_BACK_LEFT, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sGoonsWave3b[3].ped)
|
|
sGoonsWave3b[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelMerryweather, vehGoons3b, VS_BACK_RIGHT, relGroupCops, 200, 100, WEAPONTYPE_ADVANCEDRIFLE)
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_04")
|
|
START_AUDIO_SCENE("BS_2A_CAR_ARRIVE_04")
|
|
ENDIF
|
|
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vehGoons3b, "BS_2A_MERRYWEATHER_CARS")
|
|
|
|
REPEAT COUNT_OF(sGoonsWave3b) i
|
|
INITIALISE_ENEMY_PED(sGoonsWave3b[i], "3b", i)
|
|
|
|
IF NOT IS_PED_INJURED(sGoonsWave3b[i].ped)
|
|
IF HAS_PED_GOT_WEAPON(sGoonsWave3b[i].ped, WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(sGoonsWave3b[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
ELIF HAS_PED_GOT_WEAPON(sGoonsWave3b[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(sGoonsWave3b[i].ped, WEAPONTYPE_ADVANCEDRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT sGoonsWave3b[0].bHasCleanedUp
|
|
INT iNumPedsCleanedUp = 0
|
|
INT iNumPedsInGroup = COUNT_OF(sGoonsWave3b)
|
|
BOOL bTimeToGetOut = FALSE
|
|
BOOL bCheckedGetOutTrigger = FALSE
|
|
|
|
REPEAT iNumPedsInGroup i
|
|
IF DOES_ENTITY_EXIST(sGoonsWave3b[i].ped)
|
|
IF NOT IS_PED_INJURED(sGoonsWave3b[i].ped)
|
|
UPDATE_AI_PED_BLIP(sGoonsWave3b[i].ped, sGoonsWave3b[i].sBlipData)
|
|
//SET_PED_RESET_FLAG(sGoonsWave3b[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
|
|
|
|
//If the enemy was just damaged by the player then update the timer tracking the last time the player damaged a ped.
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sGoonsWave3b[i].ped, PLAYER_PED_ID())
|
|
iTimeLastFlankingEnemyDamaged = GET_GAME_TIMER()
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sGoonsWave3b[i].ped)
|
|
ENDIF
|
|
|
|
SWITCH sGoonsWave3b[i].iEvent
|
|
CASE 0
|
|
IF NOT bCheckedGetOutTrigger
|
|
IF NOT IS_ENTITY_DEAD(vehGoons3b)
|
|
IF ABSF(GET_ENTITY_SPEED(vehGoons3b)) < 1.0
|
|
IF (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehGoons3b) AND GET_TIME_POSITION_IN_RECORDING(vehGoons3b) > 1000.0)
|
|
OR NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehGoons3b)
|
|
bTimeToGetOut = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bTimeToGetOut = TRUE
|
|
ENDIF
|
|
|
|
bCheckedGetOutTrigger = TRUE
|
|
ENDIF
|
|
|
|
IF bTimeToGetOut
|
|
IF i = 0
|
|
sGoonsWave3b[i].vDest = <<180.9489, -1208.6591, 28.2951>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(sGoonsWave3b[i].ped, sGoonsWave3b[i].cover, sGoonsWave3b[i].vDest, 75.4236, 3.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120)
|
|
ELIF i = 1
|
|
sGoonsWave3b[i].vDest = <<175.4908, -1197.6615, 28.3430>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(sGoonsWave3b[i].ped, sGoonsWave3b[i].cover, sGoonsWave3b[i].vDest, 91.26514, 3.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ELIF i = 2
|
|
sGoonsWave3b[i].vDest = <<167.7789, -1214.0789, 28.2951>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(sGoonsWave3b[i].ped, sGoonsWave3b[i].cover, sGoonsWave3b[i].vDest, 91.3935, 3.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ELIF i = 3
|
|
sGoonsWave3b[i].vDest = <<180.6675, -1199.8951, 28.2951>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(sGoonsWave3b[i].ped, sGoonsWave3b[i].cover, sGoonsWave3b[i].vDest, 96.3577, 3.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120)
|
|
ENDIF
|
|
|
|
IF i % 2 = 0
|
|
SET_PED_COMBAT_PARAMS(sGoonsWave3b[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
ELSE
|
|
SET_PED_COMBAT_PARAMS(sGoonsWave3b[i].ped, 12, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
ENDIF
|
|
|
|
IF HAS_PED_GOT_WEAPON(sGoonsWave3b[i].ped, WEAPONTYPE_CARBINERIFLE)
|
|
SET_CURRENT_PED_WEAPON(sGoonsWave3b[i].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
ELIF HAS_PED_GOT_WEAPON(sGoonsWave3b[i].ped, WEAPONTYPE_ADVANCEDRIFLE)
|
|
SET_CURRENT_PED_WEAPON(sGoonsWave3b[i].ped, WEAPONTYPE_ADVANCEDRIFLE, TRUE)
|
|
ENDIF
|
|
SET_PED_COMBAT_ATTRIBUTES(sGoonsWave3b[i].ped, CA_USE_VEHICLE, FALSE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoonsWave3b[i].ped, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sGoonsWave3b[i].ped, 200.0)
|
|
SET_COMBAT_FLOAT(sGoonsWave3b[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sGoonsWave3b[i].ped, TRUE)
|
|
SET_COMBAT_FLOAT(sGoonsWave3b[i].ped, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_04")
|
|
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_04")
|
|
ENDIF
|
|
|
|
IF i = 0
|
|
PLAY_PED_AMBIENT_SPEECH(sGoonsWave3b[i].ped, "SURROUNDED", SPEECH_PARAMS_FORCE_SHOUTED)
|
|
ENDIF
|
|
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vehGoons3b)
|
|
|
|
sGoonsWave3b[i].iTimer = GET_GAME_TIMER()
|
|
sGoonsWave3b[i].iEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF GET_GAME_TIMER() - sGoonsWave3b[i].iTimer > 10000
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sGoonsWave3b[i].ped, FALSE)
|
|
ENDIF
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(sGoonsWave3b[i].ped), vPlayerPos) < 100.0
|
|
OR GET_GAME_TIMER() - sGoonsWave3b[i].iTimer > 18000
|
|
OR iNumAliveGoonsWave3b <= 3
|
|
SET_PED_COMBAT_ATTRIBUTES(sGoonsWave3b[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sGoonsWave3b[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sGoonsWave3b[i].ped, FALSE)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sGoonsWave3b[i].iEvent > 0
|
|
//Handle the enemy behaviour when the main attack front changes: if the enemy isn't part of the main front then set them to defensive.
|
|
IF sGoonsWave3b[i].iEvent <= 50
|
|
//General combat with charge on, once the front changes set them to defensive.
|
|
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_1
|
|
OR eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
|
|
SET_PED_COMBAT_MOVEMENT(sGoonsWave3b[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sGoonsWave3b[i].ped, sGoonsWave3b[i].vDest, 2.0)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(sGoonsWave3b[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sGoonsWave3b[i].ped, CA_CAN_CHARGE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sGoonsWave3b[i].ped, 150.0)
|
|
|
|
sGoonsWave3b[i].iEvent = 100
|
|
ENDIF
|
|
ELIF sGoonsWave3b[i].iEvent = 100
|
|
//General combat with charge off, once the front changes set them to charge.
|
|
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FLANK_1
|
|
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
|
|
SET_PED_COMBAT_MOVEMENT(sGoonsWave3b[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sGoonsWave3b[i].ped, sGoonsWave3b[i].vDest, 2.0)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(sGoonsWave3b[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sGoonsWave3b[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sGoonsWave3b[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sGoonsWave3b[i].iEvent = 50
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sGoonsWave3b[i].ped, sGoonsWave3b[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CAR_ARRIVE_04")
|
|
STOP_AUDIO_SCENE("BS_2A_CAR_ARRIVE_04")
|
|
ENDIF
|
|
|
|
//If the enemy just died check if the player killed them, if so then update the timer tracking the last time a ped was killed by the player.
|
|
IF GET_PED_THAT_KILLED_PED(sGoonsWave3b[i].ped) = PLAYER_PED_ID()
|
|
iTimeLastFlankingEnemyDamaged = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
CLEAN_UP_ENEMY_PED(sGoonsWave3b[i])
|
|
ENDIF
|
|
ELSE
|
|
iNumPedsCleanedUp++
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Flag this group as cleaned up once each individual ped has been cleaned up (this saves execution time running exist checks every frame).
|
|
IF iNumPedsCleanedUp >= iNumPedsInGroup
|
|
sGoonsWave3b[0].bHasCleanedUp = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehGoons3b) AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehGoons3b)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_SHOOTOUT_GOONS_3B, strCarrec)
|
|
|
|
//DO_VEHICLE_DAMAGE_WHEN_SHOT(vehGoons3b)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
|
|
//Snipers: turn up on the overpass (only in the new shootout version).
|
|
IF bDoNewVersionOfShootout
|
|
IF NOT sGoonsSnipe[0].bIsCreated
|
|
IF sVanCrash[0].bIsCreated
|
|
IF HAS_MODEL_LOADED(modelMerryweather)
|
|
//Create them in a more convenient position if it's off-screen
|
|
IF NOT DOES_ENTITY_EXIST(sGoonsSnipe[0].ped)
|
|
sGoonsSnipe[0].ped = CREATE_ENEMY_PED(modelMerryweather, <<122.3364, -1260.8892, 32.6925>>, 350.0277, relGroupCops, 150, 0, WEAPONTYPE_SNIPERRIFLE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sGoonsSnipe[1].ped)
|
|
sGoonsSnipe[1].ped = CREATE_ENEMY_PED(modelMerryweather, <<128.1841, -1258.7861, 33.4637>>, 20.6211, relGroupCops, 150, 0, WEAPONTYPE_SNIPERRIFLE)
|
|
|
|
INITIALISE_ENEMY_GROUP(sGoonsSnipe, "Snipe ")
|
|
|
|
REPEAT COUNT_OF(sGoonsSnipe) i
|
|
sGoonsSnipe[i].iTimer = 0
|
|
sGoonsSnipe[i].iEvent = 0
|
|
ENDREPEAT
|
|
|
|
iTimeSnipersKilledByPlayer = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT sGoonsSnipe[0].bHasCleanedUp
|
|
INT iNumPedsCleanedUp = 0
|
|
INT iNumPedsInGroup = COUNT_OF(sGoonsSnipe)
|
|
|
|
REPEAT iNumPedsInGroup i
|
|
IF DOES_ENTITY_EXIST(sGoonsSnipe[i].ped)
|
|
IF NOT IS_PED_INJURED(sGoonsSnipe[i].ped)
|
|
//If the enemy was just damaged by the player then update the timer tracking the last time the player damaged a ped.
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sGoonsSnipe[i].ped, PLAYER_PED_ID())
|
|
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sGoonsSnipe[i].ped)
|
|
ENDIF
|
|
|
|
SWITCH sGoonsSnipe[i].iEvent
|
|
CASE 0
|
|
IF sGoonsSnipe[i].iTimer = 0
|
|
IF sVanCrash[0].iEvent > 0
|
|
OR IS_PED_INJURED(sVanCrash[0].ped)
|
|
sGoonsSnipe[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - sGoonsSnipe[i].iTimer > 3000
|
|
IF i = 0
|
|
sGoonsSnipe[i].vDest = <<125.2335, -1252.3010, 33.3162>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(sGoonsSnipe[i].ped, sGoonsSnipe[i].cover, sGoonsSnipe[i].vDest, 2.9585, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ELSE
|
|
sGoonsSnipe[i].vDest = <<123.6991, -1253.2300, 33.1086>>
|
|
SET_PED_COVER_POINT_AND_SPHERE(sGoonsSnipe[i].ped, sGoonsSnipe[i].cover, sGoonsSnipe[i].vDest, 358.9323, 2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_COMBAT_PARAMS(sGoonsSnipe[i].ped, 20, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sGoonsSnipe[i].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoonsSnipe[i].ped, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sGoonsSnipe[i].ped, CA_USE_COVER, FALSE)
|
|
|
|
sGoonsSnipe[i].iTimer = 0
|
|
sGoonsSnipe[i].iEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
UPDATE_AI_PED_BLIP(sGoonsSnipe[i].ped, sGoonsSnipe[i].sBlipData)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sGoonsSnipe[i].ped, sGoonsSnipe[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
//If the enemy just died check if the player killed them, if so then update the timer tracking the last time a ped was killed by the player.
|
|
IF GET_PED_THAT_KILLED_PED(sGoonsSnipe[i].ped) = PLAYER_PED_ID()
|
|
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
|
|
iTimeSnipersKilledByPlayer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
CLEAN_UP_ENEMY_PED(sGoonsSnipe[i])
|
|
ENDIF
|
|
ELSE
|
|
iNumPedsCleanedUp++
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Flag this group as cleaned up once each individual ped has been cleaned up (this saves execution time running exist checks every frame).
|
|
IF iNumPedsCleanedUp >= iNumPedsInGroup
|
|
sGoonsSnipe[0].bHasCleanedUp = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//Updates behaviour of infinite Merryweather enemies at the front of the shootout.
|
|
PROC UPDATE_INFINITE_ENEMIES_FRONT(VECTOR vPlayerPos, BOOL bKeepSpawningAferDeath = TRUE)
|
|
INT i = 0
|
|
|
|
REQUEST_MODEL(modelMerryweather)
|
|
REQUEST_WEAPON_ASSET(WEAPONTYPE_CARBINERIFLE)
|
|
|
|
BOOL bPedCreatedThisFrame = FALSE
|
|
|
|
//Stop creating infinite enemies if the player stays at the front. Once they move to the correct side then begin creating enemies again.
|
|
IF iNumFrontInfiniteEnemiesSpawned > 6
|
|
IF GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged < 1000
|
|
iNumFrontInfiniteEnemiesSpawned = 4
|
|
|
|
REPEAT COUNT_OF(sInfiniteEnemiesFront) i
|
|
IF NOT DOES_ENTITY_EXIST(sInfiniteEnemiesFront[i].ped)
|
|
sInfiniteEnemiesFront[i].bIsCreated = FALSE
|
|
ENDIF
|
|
ENDREPEAT
|
|
ELSE
|
|
bKeepSpawningAferDeath = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(sInfiniteEnemiesFront) i
|
|
IF NOT sInfiniteEnemiesFront[i].bIsCreated
|
|
IF HAS_MODEL_LOADED(modelMerryweather)
|
|
AND NOT bPedCreatedThisFrame
|
|
IF i = 0
|
|
sInfiniteEnemiesFront[i].ped = CREATE_ENEMY_PED(modelMerryweather, <<114.8663, -1274.0483, 28.1787>>, 288.0569, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
|
|
sInfiniteEnemiesFront[i].vDest = <<137.2739, -1237.1921, 28.3756>>
|
|
ELIF i = 1
|
|
sInfiniteEnemiesFront[i].ped = CREATE_ENEMY_PED(modelMerryweather, <<109.0800, -1275.3662, 28.1587>>, 288.0605, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
|
|
sInfiniteEnemiesFront[i].vDest = <<138.9004, -1230.4973, 28.4172>>
|
|
ENDIF
|
|
|
|
INITIALISE_ENEMY_PED(sInfiniteEnemiesFront[i], "Infinite ", i)
|
|
|
|
GIVE_WEAPON_COMPONENT_TO_PED(sInfiniteEnemiesFront[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
IF i % 2 = 0
|
|
SET_PED_COMBAT_PARAMS(sInfiniteEnemiesFront[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
ELSE
|
|
SET_PED_COMBAT_PARAMS(sInfiniteEnemiesFront[i].ped, 12, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
ENDIF
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sInfiniteEnemiesFront[i].ped, sInfiniteEnemiesFront[i].vDest, 4.0, FALSE)
|
|
SET_CURRENT_PED_WEAPON(sInfiniteEnemiesFront[i].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFront[i].ped, CA_USE_VEHICLE, FALSE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sInfiniteEnemiesFront[i].ped, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sInfiniteEnemiesFront[i].ped, 200.0)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sInfiniteEnemiesFront[i].ped, FALSE)
|
|
|
|
sInfiniteEnemiesFront[i].iEvent = 100 //Peds are already set up to stay in their defensive areas, so go straight to waiting for the right time to charge.
|
|
sInfiniteEnemiesFront[i].iTimer = 0
|
|
iNumFrontInfiniteEnemiesSpawned++
|
|
|
|
bPedCreatedThisFrame = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(sInfiniteEnemiesFront[i].ped)
|
|
IF NOT IS_PED_INJURED(sInfiniteEnemiesFront[i].ped)
|
|
//If the enemy was just damaged by the player then update the timer tracking the last time the player damaged a ped.
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sInfiniteEnemiesFront[i].ped, PLAYER_PED_ID())
|
|
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sInfiniteEnemiesFront[i].ped)
|
|
ENDIF
|
|
|
|
//Handle the enemy behaviour when the main attack front changes: if the enemy isn't part of the main front then set them to defensive.
|
|
IF sInfiniteEnemiesFront[i].iEvent <= 50
|
|
//General combat with charge on, once the front changes set them to defensive.
|
|
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FLANK_1
|
|
SET_PED_COMBAT_MOVEMENT(sInfiniteEnemiesFront[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sInfiniteEnemiesFront[i].ped, sInfiniteEnemiesFront[i].vDest, 4.0)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFront[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFront[i].ped, CA_CAN_CHARGE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sInfiniteEnemiesFront[i].ped, 150.0)
|
|
|
|
sInfiniteEnemiesFront[i].iEvent = 100
|
|
ENDIF
|
|
|
|
//Do a forced charge when there are only a few enemies left.
|
|
IF NOT sInfiniteEnemiesFront[i].bSetToCharge
|
|
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
|
|
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
|
|
IF iNumAliveFrontEnemies < 4
|
|
SET_PED_CONFIG_FLAG(sInfiniteEnemiesFront[i].ped, PCF_ShouldChargeNow, TRUE)
|
|
sInfiniteEnemiesFront[i].bSetToCharge = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF sInfiniteEnemiesFront[i].iEvent = 100
|
|
//General combat with charge off, once the front changes set them to charge.
|
|
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_1
|
|
OR eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
|
|
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
|
|
SET_PED_COMBAT_MOVEMENT(sInfiniteEnemiesFront[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sInfiniteEnemiesFront[i].ped, sInfiniteEnemiesFront[i].vDest, 4.0)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFront[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFront[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sInfiniteEnemiesFront[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sInfiniteEnemiesFront[i].iEvent = 50
|
|
ENDIF
|
|
ENDIF
|
|
|
|
UPDATE_AI_PED_BLIP(sInfiniteEnemiesFront[i].ped, sInfiniteEnemiesFront[i].sBlipData)
|
|
//SET_PED_RESET_FLAG(sInfiniteEnemiesFront[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sInfiniteEnemiesFront[i].ped, sInfiniteEnemiesFront[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
IF iNumAliveInfiniteEnemiesFront < 3
|
|
//If the enemy just died check if the player killed them, if so then update the timer tracking the last time a ped was killed by the player.
|
|
IF GET_PED_THAT_KILLED_PED(sInfiniteEnemiesFront[i].ped) = PLAYER_PED_ID()
|
|
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
CLEAN_UP_ENEMY_PED(sInfiniteEnemiesFront[i], bKeepSpawningAferDeath)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF vPlayerPos.z > 0.0
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//Updates behaviour of infinite Merryweather enemies from the side of the shootout area.
|
|
PROC UPDATE_INFINITE_ENEMIES_FLANK(VECTOR vPlayerPos, BOOL bKeepSpawningAferDeath = TRUE)
|
|
INT i = 0
|
|
|
|
REQUEST_MODEL(modelMerryweather)
|
|
REQUEST_WEAPON_ASSET(WEAPONTYPE_CARBINERIFLE)
|
|
|
|
BOOL bPedCreatedThisFrame = FALSE
|
|
|
|
//Stop creating infinite enemies if the player stays at the front. Once they move to the correct side then begin creating enemies again.
|
|
IF iNumFlankInfiniteEnemiesSpawned > 6
|
|
IF GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged < 1000
|
|
iNumFlankInfiniteEnemiesSpawned = 4
|
|
|
|
REPEAT COUNT_OF(sInfiniteEnemiesFlank) i
|
|
IF NOT DOES_ENTITY_EXIST(sInfiniteEnemiesFlank[i].ped)
|
|
sInfiniteEnemiesFlank[i].bIsCreated = FALSE
|
|
ENDIF
|
|
ENDREPEAT
|
|
ELSE
|
|
bKeepSpawningAferDeath = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(sInfiniteEnemiesFlank) i
|
|
IF NOT sInfiniteEnemiesFlank[i].bIsCreated
|
|
IF HAS_MODEL_LOADED(modelMerryweather)
|
|
AND NOT bPedCreatedThisFrame
|
|
AND GET_GAME_TIMER() - iFlankEnemiesSpawnTimer > 0
|
|
IF i = 0
|
|
IF bInSafeAreaForInfiniteFlankSpawn
|
|
sInfiniteEnemiesFlank[i].ped = CREATE_ENEMY_PED(modelMerryweather, <<185.0784, -1253.7997, 28.1985>>, 351.6618, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
|
|
ELSE
|
|
sInfiniteEnemiesFlank[i].ped = CREATE_ENEMY_PED(modelMerryweather, <<203.8568, -1253.8951, 28.3246>>, 152.6642, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
|
|
ENDIF
|
|
|
|
sInfiniteEnemiesFlank[i].vDest = <<180.5752, -1199.7738, 28.2951>>
|
|
ELIF i = 1
|
|
IF bInSafeAreaForInfiniteFlankSpawn
|
|
sInfiniteEnemiesFlank[i].ped = CREATE_ENEMY_PED(modelMerryweather, <<184.7398, -1255.9893, 28.1985>>, 351.6668, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
|
|
ELSE
|
|
sInfiniteEnemiesFlank[i].ped = CREATE_ENEMY_PED(modelMerryweather, <<204.3409, -1249.8408, 28.3146>>, 168.3013, relGroupCops, 200, 100, WEAPONTYPE_CARBINERIFLE)
|
|
ENDIF
|
|
|
|
sInfiniteEnemiesFlank[i].vDest = <<180.8943, -1208.6416, 28.2951>>
|
|
ENDIF
|
|
|
|
INITIALISE_ENEMY_PED(sInfiniteEnemiesFlank[i], "InfiniteB ", i)
|
|
|
|
GIVE_WEAPON_COMPONENT_TO_PED(sInfiniteEnemiesFlank[i].ped, WEAPONTYPE_CARBINERIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
|
|
IF i % 2 = 0
|
|
SET_PED_COMBAT_PARAMS(sInfiniteEnemiesFlank[i].ped, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
ELSE
|
|
SET_PED_COMBAT_PARAMS(sInfiniteEnemiesFlank[i].ped, 12, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
ENDIF
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sInfiniteEnemiesFlank[i].ped, sInfiniteEnemiesFlank[i].vDest, 4.0, FALSE)
|
|
SET_CURRENT_PED_WEAPON(sInfiniteEnemiesFlank[i].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFlank[i].ped, CA_USE_VEHICLE, FALSE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sInfiniteEnemiesFlank[i].ped, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sInfiniteEnemiesFlank[i].ped, 200.0)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sInfiniteEnemiesFlank[i].ped, FALSE)
|
|
|
|
bPedCreatedThisFrame = TRUE
|
|
iFlankEnemiesSpawnTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(700, 1300)
|
|
sInfiniteEnemiesFlank[i].iEvent++
|
|
sInfiniteEnemiesFlank[i].iTimer = 100 //Already set up as defensive, so go straight to waiting for the front to change.
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(sInfiniteEnemiesFlank[i].ped)
|
|
IF NOT IS_PED_INJURED(sInfiniteEnemiesFlank[i].ped)
|
|
UPDATE_AI_PED_BLIP(sInfiniteEnemiesFlank[i].ped, sInfiniteEnemiesFlank[i].sBlipData)
|
|
//SET_PED_RESET_FLAG(sInfiniteEnemiesFlank[i].ped, PRF_ForceEnableFlashLightForAI, TRUE)
|
|
|
|
//If the enemy was just damaged by the player then update the timer tracking the last time the player damaged a ped.
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sInfiniteEnemiesFlank[i].ped, PLAYER_PED_ID())
|
|
iTimeLastFlankingEnemyDamaged = GET_GAME_TIMER()
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sInfiniteEnemiesFlank[i].ped)
|
|
ENDIF
|
|
|
|
//Handle the enemy behaviour when the main attack front changes: if the enemy isn't part of the main front then set them to defensive.
|
|
IF sInfiniteEnemiesFlank[i].iEvent <= 50
|
|
//General combat with charge on, once the front changes set them to defensive.
|
|
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_1
|
|
OR eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
|
|
SET_PED_COMBAT_MOVEMENT(sInfiniteEnemiesFlank[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sInfiniteEnemiesFlank[i].ped, sInfiniteEnemiesFlank[i].vDest, 4.0)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFlank[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, FALSE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFlank[i].ped, CA_CAN_CHARGE, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sInfiniteEnemiesFlank[i].ped, 150.0)
|
|
|
|
sInfiniteEnemiesFlank[i].iTimer = 0
|
|
sInfiniteEnemiesFlank[i].iEvent = 100
|
|
ENDIF
|
|
ELIF sInfiniteEnemiesFlank[i].iEvent = 100
|
|
//General combat with charge off, once the front changes set them to charge.
|
|
IF eShootoutState = SHOOTOUT_STATE_DEFEND_FLANK_1
|
|
OR eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
|
|
IF sInfiniteEnemiesFlank[i].iTimer = 0
|
|
sInfiniteEnemiesFlank[i].iTimer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - sInfiniteEnemiesFlank[i].iTimer > 20000
|
|
OR VDIST2(GET_ENTITY_COORDS(sInfiniteEnemiesFlank[i].ped), vPlayerPos) < 100.0
|
|
OR (iNumAliveGoonsWave3b + iNumAliveInfiniteEnemiesFlank + iNumAliveVanFlank + iNumAliveNooseRope1) <= 3
|
|
SET_PED_COMBAT_MOVEMENT(sInfiniteEnemiesFlank[i].ped, CM_DEFENSIVE)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(sInfiniteEnemiesFlank[i].ped, sInfiniteEnemiesFlank[i].vDest, 4.0)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFlank[i].ped, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
//SET_PED_COMBAT_ATTRIBUTES(sInfiniteEnemiesFlank[i].ped, CA_CAN_CHARGE, TRUE)
|
|
SET_COMBAT_FLOAT(sInfiniteEnemiesFlank[i].ped, CCF_MIN_DISTANCE_TO_TARGET, 3.0)
|
|
|
|
sInfiniteEnemiesFlank[i].iTimer = 0
|
|
sInfiniteEnemiesFlank[i].iEvent = 50
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_INT_ABOVE_PED(sInfiniteEnemiesFlank[i].ped, sInfiniteEnemiesFlank[i].iEvent)
|
|
#ENDIF
|
|
ELSE
|
|
IF iNumAliveInfiniteEnemiesFlank < 3
|
|
//If the enemy just died check if the player killed them, if so then update the timer tracking the last time a ped was killed by the player.
|
|
IF GET_PED_THAT_KILLED_PED(sInfiniteEnemiesFlank[i].ped) = PLAYER_PED_ID()
|
|
iTimeLastFlankingEnemyDamaged = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
iFlankEnemiesSpawnTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
|
|
CLEAN_UP_ENEMY_PED(sInfiniteEnemiesFlank[i], bKeepSpawningAferDeath)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF vPlayerPos.z > 0.0
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if a given ped is currently hanging around where another given ped is trying to task to.
|
|
/// PARAMS:
|
|
/// pedToCheckForSteal - The ped that we want to check is stealing cover from our AI ped.
|
|
/// pedToMove - The AI ped that we want to move to the given destination.
|
|
/// vDestination - The destination
|
|
/// fMaxDistBeforeCheck - The moving ped must be within this distance of the destination before we start checking what the other ped is doing.
|
|
/// fMaxDistConsideredAsStealing - pedToCheckForSteal must be within this distance of the destination to be considered stealing it.
|
|
/// bPlayerMustBeInCover - If TRUE then the ped must be in cover for them to be considered in the way.
|
|
FUNC BOOL IS_PED_STEALING_PEDS_DESTINATION(PED_INDEX pedToCheckForSteal, PED_INDEX pedToMove, VECTOR vDestination, FLOAT fMaxDistBeforeCheck, FLOAT fMaxDistConsideredAsStealing = 2.0, BOOL bMustBeInCover = FALSE)
|
|
IF NOT IS_PED_INJURED(pedToMove)
|
|
AND NOT IS_PED_INJURED(pedToCheckForSteal)
|
|
VECTOR vPed1Pos = GET_ENTITY_COORDS(pedToCheckForSteal)
|
|
VECTOR vPed2Pos = GET_ENTITY_COORDS(pedToMove)
|
|
|
|
FLOAT fDistFromPed2ToDest = VDIST2(vPed2Pos, vDestination)
|
|
FLOAT fDistFromPed1ToDest = VDIST2(vPed1Pos, vDestination)
|
|
|
|
//NOTE: the values passed in are in real metres, they need to be converted to squared values for comparisons.
|
|
IF fDistFromPed2ToDest < (fMaxDistBeforeCheck * fMaxDistBeforeCheck)
|
|
IF fDistFromPed1ToDest < fDistFromPed2ToDest
|
|
AND fDistFromPed1ToDest < (fMaxDistConsideredAsStealing * fMaxDistConsideredAsStealing)
|
|
IF bMustBeInCover
|
|
IF IS_PED_IN_COVER(pedToCheckForSteal)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
///Finds a free destination for the ped given three different points. This is useful for selector ped shootouts: given three peds and three destinations it will find a spot
|
|
///that isn't blocked by one of the other peds (or the player).
|
|
/// pedToMove - The ped we want to move to a new destination.
|
|
/// pedInTheWay1 - The first ped that we want to check for blocking any of the given destinations.
|
|
/// pedInTheWay2 - The second ped that we want to check for blocking any of the given destinations.
|
|
/// vBuddyDest1 - The current destination of the first buddy ped.
|
|
/// vBuddyDest2 - The current destination of the second buddy ped.
|
|
/// vCurrentDest - The current destination for this ped: this will be checked first, if it's not being stolen then there's no need to look for a new point.
|
|
/// vDest1 - The first potential destination to check.
|
|
/// vDest2 - The second potential destination to check.
|
|
/// vDest3 - The third potential destination to check.
|
|
FUNC VECTOR GET_FREE_DESTINATION_POINT_FOR_PED(PED_INDEX pedToMove, PED_INDEX pedBuddy1, PED_INDEX pedBuddy2, VECTOR vBuddyDest1, VECTOR vBuddyDest2, VECTOR vCurrentDest, VECTOR vDest1, VECTOR vDest2, VECTOR vDest3)
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vCurrentDest, <<0.0, 0.0, 0.0>>)
|
|
IF NOT IS_PED_STEALING_PEDS_DESTINATION(pedBuddy1, pedToMove, vCurrentDest, 5.0, 3.0)
|
|
AND NOT IS_PED_STEALING_PEDS_DESTINATION(pedBuddy2, pedToMove, vCurrentDest, 5.0, 3.0)
|
|
RETURN vCurrentDest
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vCurrentDest, vDest1)
|
|
//First check that another buddy isn't already using this destination.
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vDest1, vBuddyDest1)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vDest1, vBuddyDest2)
|
|
//Now check that one of the other buddies isn't closer to this destination.
|
|
IF NOT IS_PED_STEALING_PEDS_DESTINATION(pedBuddy1, pedToMove, vDest1, 5.0, 3.0)
|
|
AND NOT IS_PED_STEALING_PEDS_DESTINATION(pedBuddy2, pedToMove, vDest1, 5.0, 3.0)
|
|
RETURN vDest1
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vCurrentDest, vDest2)
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vDest2, vBuddyDest1)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vDest2, vBuddyDest2)
|
|
IF NOT IS_PED_STEALING_PEDS_DESTINATION(pedBuddy1, pedToMove, vDest2, 5.0, 3.0)
|
|
AND NOT IS_PED_STEALING_PEDS_DESTINATION(pedBuddy2, pedToMove, vDest2, 5.0, 3.0)
|
|
RETURN vDest2
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vCurrentDest, vDest3)
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vDest3, vBuddyDest1)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vDest3, vBuddyDest2)
|
|
IF NOT IS_PED_STEALING_PEDS_DESTINATION(pedBuddy1, pedToMove, vDest3, 5.0, 3.0)
|
|
AND NOT IS_PED_STEALING_PEDS_DESTINATION(pedBuddy2, pedToMove, vDest3, 5.0, 3.0)
|
|
RETURN vDest3
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//As a failsafe return the first choice.
|
|
RETURN vDest1
|
|
ENDFUNC
|
|
|
|
PROC SET_SELECTOR_PED_SHOOTOUT_STATE(BUDDY_DATA &sBuddy, BUDDY_SHOOTOUT_STATE eNewState)
|
|
sBuddy.vDest = <<0.0, 0.0, 0.0>>
|
|
sBuddy.iTimer = 0
|
|
sBuddy.iEvent = 0
|
|
sBuddy.eBuddyShootoutState = eNewState
|
|
ENDPROC
|
|
|
|
///New procedure for Michael: based around defending different fronts.
|
|
PROC UPDATE_MICHAEL_DURING_SHOOTOUT()
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
VECTOR vMichaelPos = GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
VECTOR vAimPos
|
|
VECTOR vNewDest
|
|
FLOAT fDistToDestination
|
|
BOOL bPlayerStoleCover = FALSE
|
|
BOOL bIsInCombat = (IS_PED_IN_COMBAT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) OR GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) = PERFORMING_TASK)
|
|
SEQUENCE_INDEX seq
|
|
|
|
SET_PED_RESET_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PRF_DisableFriendlyGunReactAudio, TRUE)
|
|
|
|
IF HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_CARBINERIFLE)
|
|
IF GET_AMMO_IN_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_CARBINERIFLE) < 50
|
|
ADD_AMMO_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], WEAPONTYPE_CARBINERIFLE, 50)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH sMichael.eBuddyShootoutState
|
|
CASE BUDDY_STATE_DEFENDING_FRONT //Stays close to the gold, defending from enemies at the front entrance.
|
|
vNewDest = GET_FREE_DESTINATION_POINT_FOR_PED(GET_PED_INDEX(CHAR_MICHAEL), GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_FRANKLIN), sTrevor.vDest, sFranklin.vDest, sMichael.vDest,
|
|
<<130.5688, -1202.8179, 28.3423>>, <<127.7625, -1208.8765, 28.2951>>, <<138.0075, -1201.9452, 28.3113>>)
|
|
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sMichael.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sFranklin.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sTrevor.vDest)
|
|
sMichael.vDest = vNewDest
|
|
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sMichael.vDest, <<138.0075, -1201.9452, 28.3113>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael.cover, sMichael.vDest, 182.3275,
|
|
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60, FALSE)
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(sMichael.vDest, <<127.7625, -1208.8765, 28.2951>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael.cover, sMichael.vDest, 189.6171,
|
|
2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, FALSE)
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(sMichael.vDest, <<130.5688, -1202.8179, 28.3423>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael.cover, sMichael.vDest, 181.5105,
|
|
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120, FALSE)
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sMichael.bRefreshTasks = TRUE
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vMichaelPos, sMichael.vDest)
|
|
|
|
IF sMichael.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
vAimPos = <<133.27, -1229.06, 30.0>>
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sMichael.vDest, vAimPos, PEDMOVE_RUN, FALSE, 0.25, 0.5)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, sMichael.vDest, 1000, FALSE, 0.5, FALSE, FALSE, sMichael.cover, TRUE)
|
|
ENDIF
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sMichael.bRefreshTasks = FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE BUDDY_STATE_DEFENDING_FLANK_CLOSE //Stays close to the gold, defending from enemies on the flank.
|
|
vNewDest = GET_FREE_DESTINATION_POINT_FOR_PED(GET_PED_INDEX(CHAR_MICHAEL), GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_FRANKLIN), sTrevor.vDest, sFranklin.vDest, sMichael.vDest,
|
|
<<142.2252, -1214.2750, 28.2952>>, <<137.8998, -1208.3472, 28.2952>>, <<137.3811, -1202.9869, 28.2952>>)
|
|
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sMichael.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sFranklin.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sTrevor.vDest)
|
|
sMichael.vDest = vNewDest
|
|
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sMichael.vDest, <<137.3811, -1202.9869, 28.2952>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael.cover, sMichael.vDest, 280.5384,
|
|
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60, FALSE)
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(sMichael.vDest, <<137.8998, -1208.3472, 28.2952>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael.cover, sMichael.vDest, 271.1857,
|
|
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0, FALSE)
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(sMichael.vDest, <<142.2252, -1214.2750, 28.2952>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael.cover, sMichael.vDest, 224.9126,
|
|
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_180, FALSE)
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sMichael.bRefreshTasks = TRUE
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vMichaelPos, sMichael.vDest)
|
|
|
|
IF sMichael.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
vAimPos = <<165.33, -1204.0, 30.0>>
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, sMichael.vDest, vAimPos, PEDMOVE_RUN, FALSE, 0.25, 0.5)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, sMichael.vDest, 1000, FALSE, 0.5, FALSE, FALSE, sMichael.cover, TRUE)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<168.350510,-1204.140137,28.295084>>, 23.000000)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sMichael.bRefreshTasks = FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE BUDDY_STATE_DEFENDING_FLANK_FAR //Defends the flank, but pushes further up.
|
|
vNewDest = GET_FREE_DESTINATION_POINT_FOR_PED(GET_PED_INDEX(CHAR_MICHAEL), GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_FRANKLIN), sTrevor.vDest, sFranklin.vDest, sMichael.vDest,
|
|
<<153.9629, -1208.1871, 28.7898>>, <<153.7258, -1201.8673, 28.4310>>, <<152.8369, -1215.7323, 28.3121>>)
|
|
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sMichael.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sFranklin.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sTrevor.vDest)
|
|
sMichael.vDest = vNewDest
|
|
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sMichael.vDest, <<153.7258, -1201.8673, 28.4310>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael.cover, sMichael.vDest, 270.4854,
|
|
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60, FALSE)
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(sMichael.vDest, <<153.9629, -1208.1871, 28.7898>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael.cover, sMichael.vDest, 270.4854,
|
|
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_180, FALSE)
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(sMichael.vDest, <<152.8369, -1215.7323, 28.3121>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sMichael.cover, sMichael.vDest, 275.5096,
|
|
3.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0, FALSE)
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sMichael.bRefreshTasks = TRUE
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vMichaelPos, sMichael.vDest)
|
|
|
|
IF sMichael.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<168.350510,-1204.140137,28.295084>>, 23.000000)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sMichael.bRefreshTasks = FALSE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF bDebugShowDebug
|
|
TEXT_LABEL strIndex = ""
|
|
strIndex += ENUM_TO_INT(sMichael.eBuddyShootoutState)
|
|
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
DRAW_DEBUG_TEXT(strIndex, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<0.0, 0.0, 2.0>>))
|
|
ENDIF
|
|
#ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC UPDATE_FRANKLIN_DURING_SHOOTOUT()
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
BOOL bPlayerStoleCover = FALSE
|
|
VECTOR vNewDest
|
|
VECTOR vFranklinPos = GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
BOOL bIsInCombat = (IS_PED_IN_COMBAT(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) OR GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) = PERFORMING_TASK)
|
|
FLOAT fDistToDestination
|
|
VECTOR vAimPos
|
|
SEQUENCE_INDEX seq
|
|
|
|
SET_PED_RESET_FLAG(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PRF_DisableFriendlyGunReactAudio, TRUE)
|
|
|
|
IF HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE)
|
|
IF GET_AMMO_IN_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE) < 50
|
|
ADD_AMMO_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], WEAPONTYPE_CARBINERIFLE, 50)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH sFranklin.eBuddyShootoutState
|
|
CASE BUDDY_STATE_DEFENDING_FRONT //Stays close to the gold, defending from enemies at the front entrance.
|
|
vNewDest = GET_FREE_DESTINATION_POINT_FOR_PED(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_MICHAEL), sTrevor.vDest, sMichael.vDest, sFranklin.vDest,
|
|
<<127.7625, -1208.8765, 28.2951>>, <<130.5416, -1202.8286, 28.3419>>, <<138.0075, -1201.9452, 28.3113>>)
|
|
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sMichael.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sFranklin.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sTrevor.vDest)
|
|
sFranklin.vDest = vNewDest
|
|
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sFranklin.vDest, <<138.0075, -1201.9452, 28.3113>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.cover, sFranklin.vDest, 182.3275,
|
|
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(sFranklin.vDest, <<127.7625, -1208.8765, 28.2951>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.cover, sFranklin.vDest, 189.6171,
|
|
2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120)
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(sFranklin.vDest, <<130.5416, -1202.8286, 28.3419>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.cover, sFranklin.vDest, 180.6171,
|
|
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_180)
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sFranklin.bRefreshTasks = TRUE
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vFranklinPos, sFranklin.vDest)
|
|
|
|
IF sFranklin.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
vAimPos = <<133.27, -1229.06, 30.0>>
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sFranklin.vDest, vAimPos, PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE, ENAV_NO_STOPPING)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, sFranklin.vDest, 1000, FALSE, 0.5, FALSE, FALSE, sFranklin.cover, TRUE)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sFranklin.bRefreshTasks = FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE BUDDY_STATE_DEFENDING_FLANK_CLOSE //Stays close to the gold, defending from enemies on the flank.
|
|
vNewDest = GET_FREE_DESTINATION_POINT_FOR_PED(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_MICHAEL), sTrevor.vDest, sMichael.vDest, sFranklin.vDest,
|
|
<<137.8998, -1208.3472, 28.2952>>, <<142.2252, -1214.2750, 28.2952>>, <<137.3811, -1202.9869, 28.2952>>)
|
|
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sMichael.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sFranklin.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sTrevor.vDest)
|
|
sFranklin.vDest = vNewDest
|
|
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sFranklin.vDest, <<137.3811, -1202.9869, 28.2952>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.cover, sFranklin.vDest, 280.5384,
|
|
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(sFranklin.vDest, <<137.8998, -1208.3472, 28.2952>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.cover, sFranklin.vDest, 271.1857,
|
|
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0)
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(sFranklin.vDest, <<142.2252, -1214.2750, 28.2952>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.cover, sFranklin.vDest, 224.9126,
|
|
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0, FALSE)
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sFranklin.bRefreshTasks = TRUE
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vFranklinPos, sFranklin.vDest)
|
|
|
|
IF sFranklin.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
vAimPos = <<165.33, -1204.0, 30.0>>
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bPlayerStoleCover
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
IF NOT IS_ENTITY_DEAD(vehNooseWave1)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, sFranklin.vDest, vehNooseWave1, PEDMOVE_RUN, TRUE, 0.5, 0.5, TRUE, ENAV_NO_STOPPING)
|
|
ELSE
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, sFranklin.vDest, vAimPos, PEDMOVE_RUN, FALSE, 0.5, 0.5, TRUE, ENAV_NO_STOPPING)
|
|
ENDIF
|
|
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, sFranklin.vDest, 1000, FALSE, 0.5, FALSE, FALSE, sFranklin.cover, TRUE)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<168.350510,-1204.140137,28.295084>>, 23.000000)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sFranklin.bRefreshTasks = FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE BUDDY_STATE_DEFENDING_FLANK_FAR //Defends the flank, but pushes further up.
|
|
vNewDest = GET_FREE_DESTINATION_POINT_FOR_PED(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_MICHAEL), sTrevor.vDest, sMichael.vDest, sFranklin.vDest,
|
|
<<153.7258, -1201.8673, 28.4310>>, <<153.9629, -1208.1871, 28.7898>>, <<152.8369, -1215.7323, 28.3121>>)
|
|
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sMichael.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sFranklin.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sTrevor.vDest)
|
|
sFranklin.vDest = vNewDest
|
|
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sFranklin.vDest, <<153.7258, -1201.8673, 28.4310>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.cover, sFranklin.vDest, 270.4854,
|
|
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(sFranklin.vDest, <<153.9629, -1208.1871, 28.7898>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.cover, sFranklin.vDest, 270.4854,
|
|
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_180)
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(sFranklin.vDest, <<152.8369, -1215.7323, 28.3121>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sFranklin.cover, sFranklin.vDest, 275.5096,
|
|
3.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0, FALSE)
|
|
ENDIF
|
|
|
|
bPlayerStoleCover = TRUE
|
|
sFranklin.bRefreshTasks = TRUE
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vFranklinPos, sFranklin.vDest)
|
|
|
|
IF sFranklin.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<168.350510,-1204.140137,28.295084>>, 23.000000)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sFranklin.bRefreshTasks = FALSE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF bDebugShowDebug
|
|
TEXT_LABEL strIndex = ""
|
|
strIndex += ENUM_TO_INT(sFranklin.eBuddyShootoutState)
|
|
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
DRAW_DEBUG_TEXT(strIndex, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], <<0.0, 0.0, 2.0>>))
|
|
ENDIF
|
|
#ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC UPDATE_TREVOR_DURING_SHOOTOUT()
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
VECTOR vTrevorPos = GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
VECTOR vAimPos
|
|
VECTOR vNewDest
|
|
FLOAT fDistToDestination
|
|
BOOL bCoverWasStolen = FALSE
|
|
BOOL bIsInCombat = (IS_PED_IN_COMBAT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) OR GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) = PERFORMING_TASK)
|
|
SEQUENCE_INDEX seq
|
|
|
|
SET_PED_RESET_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PRF_DisableFriendlyGunReactAudio, TRUE)
|
|
|
|
IF HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE)
|
|
IF GET_AMMO_IN_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE) < 50
|
|
ADD_AMMO_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE, 50)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH sTrevor.eBuddyShootoutState
|
|
CASE BUDDY_STATE_DEFENDING_FRONT //Stays close to the gold, defending from enemies at the front entrance.
|
|
vNewDest = GET_FREE_DESTINATION_POINT_FOR_PED(GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_MICHAEL), GET_PED_INDEX(CHAR_FRANKLIN), sMichael.vDest, sFranklin.vDest, sTrevor.vDest,
|
|
<<138.0075, -1201.9452, 28.3113>>, <<127.7625, -1208.8765, 28.2951>>, <<130.5416, -1202.8286, 28.3419>>)
|
|
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sMichael.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sFranklin.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sTrevor.vDest)
|
|
sTrevor.vDest = vNewDest
|
|
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sTrevor.vDest, <<138.0075, -1201.9452, 28.3113>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.cover, sTrevor.vDest, 182.3275,
|
|
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60, FALSE)
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(sTrevor.vDest, <<127.7625, -1208.8765, 28.2951>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.cover, sTrevor.vDest, 189.6171,
|
|
2.0, COVUSE_WALLTOBOTH, COVHEIGHT_LOW, COVARC_120, FALSE)
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(sTrevor.vDest, <<130.5416, -1202.8286, 28.3419>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.cover, sTrevor.vDest, 180.6171,
|
|
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_180, FALSE)
|
|
ENDIF
|
|
|
|
bCoverWasStolen = TRUE
|
|
sTrevor.bRefreshTasks = TRUE
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vTrevorPos, sTrevor.vDest)
|
|
|
|
IF sTrevor.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
vAimPos = <<133.27, -1229.06, 30.0>>
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bCoverWasStolen
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, sTrevor.vDest, vAimPos, PEDMOVE_RUN, FALSE, 0.25, 0.5)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, sTrevor.vDest, 1000, FALSE, 0.5, FALSE, FALSE, sTrevor.cover, TRUE)
|
|
ENDIF
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 200.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sTrevor.bRefreshTasks = FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE BUDDY_STATE_DEFENDING_FLANK_CLOSE //Stays close to the gold, defending from enemies on the flank.
|
|
vNewDest = GET_FREE_DESTINATION_POINT_FOR_PED(GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_MICHAEL), GET_PED_INDEX(CHAR_FRANKLIN), sMichael.vDest, sFranklin.vDest, sTrevor.vDest,
|
|
<<137.3811, -1202.9869, 28.2952>>, <<137.8998, -1208.3472, 28.2952>>, <<142.2252, -1214.2750, 28.2952>>)
|
|
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sMichael.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sFranklin.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sTrevor.vDest)
|
|
sTrevor.vDest = vNewDest
|
|
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sTrevor.vDest, <<137.3811, -1202.9869, 28.2952>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.cover, sTrevor.vDest, 280.5384,
|
|
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60, FALSE)
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(sTrevor.vDest, <<137.8998, -1208.3472, 28.2952>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.cover, sTrevor.vDest, 271.1857,
|
|
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0, FALSE)
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(sTrevor.vDest, <<142.2252, -1214.2750, 28.2952>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.cover, sTrevor.vDest, 224.9126,
|
|
2.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0, FALSE)
|
|
ENDIF
|
|
|
|
bCoverWasStolen = TRUE
|
|
sTrevor.bRefreshTasks = TRUE
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vTrevorPos, sTrevor.vDest)
|
|
|
|
IF sTrevor.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
vAimPos = <<165.33, -1204.0, 30.0>>
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF fDistToDestination > 4.0
|
|
AND NOT bCoverWasStolen
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, sTrevor.vDest, vAimPos, PEDMOVE_RUN, FALSE, 0.25, 0.5)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, sTrevor.vDest, 1000, FALSE, 0.5, FALSE, FALSE, sTrevor.cover, TRUE)
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<168.350510,-1204.140137,28.295084>>, 23.000000)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sTrevor.bRefreshTasks = FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE BUDDY_STATE_DEFENDING_FLANK_FAR //Defends the flank, but pushes further up.
|
|
vNewDest = GET_FREE_DESTINATION_POINT_FOR_PED(GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_MICHAEL), GET_PED_INDEX(CHAR_FRANKLIN), sMichael.vDest, sFranklin.vDest, sTrevor.vDest,
|
|
<<152.8369, -1215.7323, 28.3121>>, <<153.7258, -1201.8673, 28.4310>>, <<153.9629, -1208.1871, 28.7898>>)
|
|
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sMichael.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sFranklin.vDest)
|
|
AND NOT ARE_VECTORS_ALMOST_EQUAL(vNewDest, sTrevor.vDest)
|
|
sTrevor.vDest = vNewDest
|
|
|
|
IF ARE_VECTORS_ALMOST_EQUAL(sTrevor.vDest, <<153.7258, -1201.8673, 28.4310>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.cover, sTrevor.vDest, 270.4854,
|
|
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60, FALSE)
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(sTrevor.vDest, <<153.9629, -1208.1871, 28.7898>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.cover, sTrevor.vDest, 270.4854,
|
|
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_180, FALSE)
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(sTrevor.vDest, <<152.8369, -1215.7323, 28.3121>>)
|
|
SET_PED_COVER_POINT_AND_SPHERE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sTrevor.cover, sTrevor.vDest, 275.5096,
|
|
3.0, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_300TO0, FALSE)
|
|
ENDIF
|
|
|
|
sTrevor.bRefreshTasks = TRUE
|
|
ENDIF
|
|
|
|
fDistToDestination = VDIST2(vTrevorPos, sTrevor.vDest)
|
|
|
|
IF sTrevor.bRefreshTasks
|
|
OR (GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND (fDistToDestination > 4.0 OR NOT bIsInCombat))
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_IN_AREA(NULL, <<168.350510,-1204.140137,28.295084>>, 23.000000)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
sTrevor.bRefreshTasks = FALSE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF bDebugShowDebug
|
|
TEXT_LABEL strIndex = ""
|
|
strIndex += ENUM_TO_INT(sTrevor.eBuddyShootoutState)
|
|
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
DRAW_DEBUG_TEXT(strIndex, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<0.0, 0.0, 2.0>>))
|
|
ENDIF
|
|
#ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC MANAGE_FREE_HOTSWAP()
|
|
SWITCH iSwitchStage
|
|
CASE 0
|
|
IF UPDATE_SELECTOR_HUD(sSelectorPeds)
|
|
CLEAR_HELP()
|
|
DESTROY_ALL_CAMS()
|
|
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FH2A_SWITCHES)
|
|
|
|
sSelectorCam.pedTo = sSelectorPeds.pedID[sSelectorPeds.eNewSelectorPed]
|
|
iHealthBeforeSwitch = GET_ENTITY_HEALTH(PLAYER_PED_ID())
|
|
|
|
iSwitchStage++
|
|
ENDIF
|
|
|
|
VECTOR vPlayerPos
|
|
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
//Guarantee that the current player's cover info is removed from when they were AI controlled.
|
|
IF GET_GAME_TIMER() - iTimeOfLastSwitch > 1000
|
|
//OR iSwitchStage != 0
|
|
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
IF sFranklin.cover != NULL
|
|
IF VDIST2(sFranklin.vDest, vPlayerPos) > 9.0
|
|
REMOVE_COVER_POINT(sFranklin.cover)
|
|
sFranklin.cover = NULL
|
|
sFranklin.vDest = <<0.0, 0.0, 0.0>>
|
|
ENDIF
|
|
ENDIF
|
|
ELIF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
IF sMichael.cover != NULL
|
|
IF VDIST2(sMichael.vDest, vPlayerPos) > 9.0
|
|
REMOVE_COVER_POINT(sMichael.cover)
|
|
sMichael.cover = NULL
|
|
sMichael.vDest = <<0.0, 0.0, 0.0>>
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF sTrevor.cover != NULL
|
|
IF VDIST2(sTrevor.vDest, vPlayerPos) > 9.0
|
|
REMOVE_COVER_POINT(sTrevor.cover)
|
|
sTrevor.cover = NULL
|
|
sTrevor.vDest = <<0.0, 0.0, 0.0>>
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF NOT RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(sSelectorCam)
|
|
iTimeOfLastSwitch = GET_GAME_TIMER()
|
|
iSwitchStage = 0
|
|
ELSE
|
|
IF sSelectorCam.bOKToSwitchPed
|
|
IF NOT sSelectorCam.bPedSwitched
|
|
IF TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE)
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed])
|
|
IF iHealthBeforeSwitch < 110
|
|
iHealthBeforeSwitch = 110
|
|
ENDIF
|
|
|
|
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], FALSE)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], FALSE)
|
|
SET_PED_DIES_WHEN_INJURED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], TRUE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], RELGROUPHASH_PLAYER)
|
|
|
|
//1082129 - Half accuracy once the buddies push forwards.
|
|
IF sVanFlank[0].iEvent > 0
|
|
OR sVanFlank[0].bIsCreated AND IS_PED_INJURED(sVanFlank[0].ped)
|
|
SET_PED_COMBAT_PARAMS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], 5, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
ELSE
|
|
SET_PED_COMBAT_PARAMS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
ENDIF
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_BLIND_FIRE_IN_COVER, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], CA_DISABLE_PINNED_DOWN, TRUE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], PCF_DisableHurt, TRUE)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], iHealthBeforeSwitch)
|
|
SET_PED_MAX_HEALTH_WITH_SCALE(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], 1800)
|
|
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], TRUE, -1)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], RBF_BULLET_IMPACT | RBF_ELECTROCUTION | RBF_PLAYER_IMPACT | RBF_MELEE | RBF_FALLING | RBF_IMPACT_OBJECT)
|
|
|
|
IF eMissionStage = STAGE_SHOOTOUT
|
|
SET_PED_CAN_RAGDOLL(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], FALSE)
|
|
|
|
//1106601 - If the player managed to switch while stuck behind the surrounding fence then just warp the ped back.
|
|
VECTOR vPedPos
|
|
vPedPos = GET_ENTITY_COORDS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed])
|
|
|
|
IF vPedPos.x < 122.5
|
|
IF NOT IS_AREA_OCCUPIED(<<125.1323, -1206.9291, 28.2952>>, <<127.1323, -1204.9291, 28.2952>>, FALSE, TRUE, TRUE, FALSE, FALSE)
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], <<126.1323, -1205.9291, 28.2952>>)
|
|
ENDIF
|
|
ELIF NOT IS_ENTITY_IN_ANGLED_AREA(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], <<120.063802,-1203.822021,27.795198>>, <<184.646594,-1199.640503,33.555710>>, 51.000000)
|
|
IF VDIST2(<<174.7520, -1222.2562, 28.4890>>, vPedPos) < VDIST2(<<139.6026, -1222.5187, 28.3368>>, vPedPos)
|
|
IF NOT IS_AREA_OCCUPIED(<<174.7520, -1222.2562, 28.4890>> - <<1.0, 1.0, 0.0>>, <<174.7520, -1222.2562, 28.4890>> + <<1.0, 1.0, 0.0>>, FALSE, TRUE, TRUE, FALSE, FALSE)
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], <<174.7520, -1222.2562, 28.4890>>)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_AREA_OCCUPIED(<<174.7520, -1222.2562, 28.4890>> - <<1.0, 1.0, 0.0>>, <<174.7520, -1222.2562, 28.4890>> + <<1.0, 1.0, 0.0>>, FALSE, TRUE, TRUE, FALSE, FALSE)
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], <<174.7520, -1222.2562, 28.4890>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Reset the defensive area for each ped, this ensures they update their destination to match the latest state of the buddies.
|
|
IF sSelectorPeds.ePreviousSelectorPed = SELECTOR_PED_MICHAEL
|
|
sMichael.vDest = <<0.0, 0.0, 0.0>>
|
|
sMichael.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER() - 5000
|
|
ELIF sSelectorPeds.ePreviousSelectorPed = SELECTOR_PED_FRANKLIN
|
|
sFranklin.vDest = <<0.0, 0.0, 0.0>>
|
|
sFranklin.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER() - 5000
|
|
ELIF sSelectorPeds.ePreviousSelectorPed = SELECTOR_PED_TREVOR
|
|
sTrevor.vDest = <<0.0, 0.0, 0.0>>
|
|
sTrevor.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER() - 5000
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], WEAPONTYPE_CARBINERIFLE)
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], WEAPONTYPE_CARBINERIFLE)
|
|
|
|
IF GET_AMMO_IN_PED_WEAPON(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], WEAPONTYPE_CARBINERIFLE) < 50
|
|
ADD_AMMO_TO_PED(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed], WEAPONTYPE_CARBINERIFLE, 50)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
|
|
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
|
|
FLOAT fBuddyDistFromCover, fPlayerDistFromCover
|
|
VECTOR vAICoverPos
|
|
COVERPOINT_INDEX coverPlayer
|
|
|
|
//Update the hint and store details about the player character when they were AI controlled.
|
|
IF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
|
|
coverPlayer = sFranklin.cover
|
|
eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
ELIF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_MICHAEL)
|
|
coverPlayer = sMichael.cover
|
|
eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
ELSE
|
|
coverPlayer = sTrevor.cover
|
|
eCurrentPlayer = SELECTOR_PED_TREVOR
|
|
ENDIF
|
|
|
|
//If the player is near the cover point that the AI was heading to then put them into cover.
|
|
|
|
IF coverPlayer != NULL
|
|
vAICoverPos = GET_SCRIPTED_COVER_POINT_COORDS(coverPlayer)
|
|
fBuddyDistFromCover = VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[sSelectorPeds.ePreviousSelectorPed]), vAICoverPos)
|
|
fPlayerDistFromCover = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vAICoverPos)
|
|
|
|
IF fPlayerDistFromCover < fBuddyDistFromCover
|
|
AND fPlayerDistFromCover < 2.0
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), GET_SCRIPTED_COVER_POINT_COORDS(coverPlayer), 1500, FALSE, 0.0, FALSE, FALSE, coverPlayer, TRUE)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
|
|
sSelectorCam.bPedSwitched = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
|
|
PROC UPDATE_BUDDY_SHOOTOUT_DIALOGUE(VECTOR vPlayerPos)
|
|
IF GET_GAME_TIMER() - iCombatDialogueTimer > 0
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
//Trevor AI dialogue
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF GET_GAME_TIMER() - iTrevorShootoutDialogueTimer > 0
|
|
IF (IS_PED_SHOOTING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) OR IS_PED_IN_COMBAT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
AND NOT IS_PED_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]), vPlayerPos) < 400.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_ATTACK", CONV_PRIORITY_MEDIUM)
|
|
iTrevorShootoutDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
|
|
iCombatDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Franklin AI dialogue
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF GET_GAME_TIMER() - iFranklinShootoutDialogueTimer > 0
|
|
IF (IS_PED_SHOOTING(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) OR IS_PED_IN_COMBAT(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]))
|
|
AND NOT IS_PED_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
AND VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]), vPlayerPos) < 400.0
|
|
IF NOT bHasTextLabelTriggered[FH3A_SKID]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SKID", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_SKID] = TRUE
|
|
iFranklinShootoutDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
|
|
iCombatDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_ATTACKF", CONV_PRIORITY_MEDIUM)
|
|
iFranklinShootoutDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
|
|
iCombatDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Michael AI dialogue
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF GET_GAME_TIMER() - iMichaelShootoutDialogueTimer > 0
|
|
IF (IS_PED_SHOOTING(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) OR IS_PED_IN_COMBAT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
|
|
AND NOT IS_PED_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]), vPlayerPos) < 400.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_ATTACKM", CONV_PRIORITY_MEDIUM)
|
|
iMichaelShootoutDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
|
|
iCombatDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Player dialogue
|
|
IF IS_PED_SHOOTING(PLAYER_PED_ID())
|
|
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
IF GET_GAME_TIMER() - iFranklinShootoutDialogueTimer > 0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_ATTACKF", CONV_PRIORITY_MEDIUM)
|
|
iFranklinShootoutDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
|
|
iCombatDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
|
|
ENDIF
|
|
ENDIF
|
|
ELIF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
IF GET_GAME_TIMER() - iMichaelShootoutDialogueTimer > 0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_ATTACKM", CONV_PRIORITY_MEDIUM)
|
|
iMichaelShootoutDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
|
|
iCombatDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
|
|
ENDIF
|
|
ENDIF
|
|
ELIF eCurrentPlayer = SELECTOR_PED_TREVOR
|
|
IF GET_GAME_TIMER() - iTrevorShootoutDialogueTimer > 0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_ATTACK", CONV_PRIORITY_MEDIUM)
|
|
iTrevorShootoutDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 13000)
|
|
iCombatDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC UPDATE_CREW_MEMBER_CARRYING_GOLD(BUDDY_DATA &sCrewMember, STRING strAnimDict, INT &iSyncSceneID, OBJECT_INDEX &objGoldBars[], BOOL &bUpdateTakeTotal, BOOL &bGoldBarsCreated)
|
|
//NOTES:
|
|
//Need some behaviour in case they get knocked off their anims. Use the waypoint recordings to get them back on then continue.
|
|
INT i = 0
|
|
|
|
//Create gold bars.
|
|
BOOL bGoldBarCreatedThisFrame = FALSE
|
|
|
|
IF NOT bGoldBarsCreated
|
|
INT iNumBarsCreated = 0
|
|
|
|
REPEAT COUNT_OF(objGoldBars) i
|
|
IF NOT DOES_ENTITY_EXIST(objGoldBars[i])
|
|
IF NOT bGoldBarCreatedThisFrame
|
|
REQUEST_MODEL(modelGoldBar)
|
|
|
|
IF HAS_MODEL_LOADED(modelGoldBar)
|
|
objGoldBars[i] = CREATE_OBJECT_NO_OFFSET(modelGoldBar, <<131.8, -1191.4, 26.2>> + <<TO_FLOAT(i), GET_RANDOM_FLOAT_IN_RANGE(0.0, 3.0), 0.0>>)
|
|
FREEZE_ENTITY_POSITION(objGoldBars[i], TRUE)
|
|
|
|
bGoldBarCreatedThisFrame = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iNumBarsCreated++
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF iNumBarsCreated >= COUNT_OF(objGoldBars)
|
|
bGoldBarsCreated = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrewMember.ped)
|
|
SET_PED_RESET_FLAG(sCrewMember.ped, PRF_DisableFriendlyGunReactAudio, TRUE)
|
|
|
|
REQUEST_ANIM_DICT(strAnimDict)
|
|
|
|
IF HAS_ANIM_DICT_LOADED(strAnimDict)
|
|
VECTOR vScenePos = <<130.821, -1203.087, 28.545>>
|
|
VECTOR vSceneRot = <<0.000, 0.000, -176.400>>
|
|
|
|
SWITCH sCrewMember.iEvent
|
|
CASE 0
|
|
SET_CURRENT_PED_WEAPON(sCrewMember.ped, WEAPONTYPE_UNARMED, TRUE)
|
|
SET_PED_CURRENT_WEAPON_VISIBLE(sCrewMember.ped, FALSE)
|
|
|
|
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
|
|
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "back_to_van_l", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
|
|
sCrewMember.iEvent++
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
|
|
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
|
|
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "van_loop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
|
|
sCrewMember.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
|
|
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
|
|
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "carry_from_van", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
|
|
|
|
REPEAT COUNT_OF(objGoldBars) i
|
|
FREEZE_ENTITY_POSITION(objGoldBars[i], FALSE)
|
|
ENDREPEAT
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[0], iSyncSceneID, "Carry_From_Van_Gold_A", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[1], iSyncSceneID, "Carry_From_Van_Gold_B", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[2], iSyncSceneID, "Carry_From_Van_Gold_C", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[3], iSyncSceneID, "Carry_From_Van_Gold_D", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[4], iSyncSceneID, "Carry_From_Van_Gold_E", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
|
|
sCrewMember.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
|
|
IF NOT bHasTextLabelTriggered[FH3A_MVEGUN]
|
|
//Play a general line for the gunman moving gold.
|
|
IF sCrewMember.ped = sCrew[CREW_GUNMAN].ped
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sCrewMember.ped)) < 900.0
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_GUNMAN, sCrewMember.ped, sConversationPeds, "FH3AAUD", "FH3A_MVE")
|
|
bHasTextLabelTriggered[FH3A_MVEGUN] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bHasTextLabelTriggered[FH3A_MVEDRV]
|
|
//Play a general line for the driver moving gold.
|
|
IF sCrewMember.ped = sCrew[CREW_DRIVER].ped
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sCrewMember.ped)) < 900.0
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrewMember.ped, sConversationPeds, "FH3AAUD", "FH3A_MVE")
|
|
bHasTextLabelTriggered[FH3A_MVEDRV] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bHasTextLabelTriggered[FH3A_DRP]
|
|
//Play a line for the bad gunman dropping gold.
|
|
IF (NOT bPickedGoodGunman AND sCrewMember.ped = sCrew[CREW_GUNMAN].ped)
|
|
IF bHasTextLabelTriggered[FH3A_MVEGUN]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sCrewMember.ped)) < 900.0
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_GUNMAN, sCrewMember.ped, sConversationPeds, "FH3AAUD", "FH3A_DRP")
|
|
bHasTextLabelTriggered[FH3A_DRP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF (NOT bPickedGoodCarDriver AND sCrewMember.ped = sCrew[CREW_DRIVER].ped)
|
|
IF bHasTextLabelTriggered[FH3A_MVEDRV]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sCrewMember.ped)) < 900.0
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, sCrewMember.ped, "KARIM")
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_CARRY2B", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_DRP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_TCOMM]
|
|
IF NOT bPickedGoodGunman
|
|
OR NOT bPickedGoodCarDriver
|
|
//Trevor complains about the bad crew.
|
|
TEXT_LABEL strLabel
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF NOT bPickedGoodGunman
|
|
strLabel = "FH3A_TCOMM"
|
|
ELIF NOT bPickedGoodCarDriver
|
|
strLabel = "FH3A_TCOMM2"
|
|
ENDIF
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])) < 900.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_TCOMM] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF NOT bPickedGoodGunman
|
|
strLabel = "FH3A_DROPF2"
|
|
ELIF NOT bPickedGoodCarDriver
|
|
strLabel = "FH3A_DROPF"
|
|
ENDIF
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])) < 900.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_TCOMM] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
|
|
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
|
|
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "carry_to_boot_r", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[0], iSyncSceneID, "Carry_To_Boot_R_Gold_A", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[1], iSyncSceneID, "Carry_To_Boot_R_Gold_B", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[2], iSyncSceneID, "Carry_To_Boot_R_Gold_C", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[3], iSyncSceneID, "Carry_To_Boot_R_Gold_D", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[4], iSyncSceneID, "Carry_To_Boot_R_Gold_E", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
|
|
sCrewMember.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
|
|
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
|
|
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "boot_r_loop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
|
|
sCrewMember.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 5
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
|
|
bUpdateTakeTotal = TRUE
|
|
|
|
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
|
|
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "back_to_van_r", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
|
|
sCrewMember.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 6
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
|
|
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
|
|
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "van_loop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
|
|
sCrewMember.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 7
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
|
|
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
|
|
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "carry_from_van", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[0], iSyncSceneID, "Carry_From_Van_Gold_A", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[1], iSyncSceneID, "Carry_From_Van_Gold_B", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[2], iSyncSceneID, "Carry_From_Van_Gold_C", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[3], iSyncSceneID, "Carry_From_Van_Gold_D", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[4], iSyncSceneID, "Carry_From_Van_Gold_E", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
|
|
sCrewMember.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 8
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
|
|
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
|
|
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "carry_to_boot_l", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[0], iSyncSceneID, "Carry_To_Boot_L_Gold_A", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[1], iSyncSceneID, "Carry_To_Boot_L_Gold_B", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[2], iSyncSceneID, "Carry_To_Boot_L_Gold_C", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[3], iSyncSceneID, "Carry_To_Boot_L_Gold_D", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGoldBars[4], iSyncSceneID, "Carry_To_Boot_L_Gold_E", strAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
|
|
sCrewMember.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 9
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
|
|
iSyncSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneRot)
|
|
TASK_SYNCHRONIZED_SCENE(sCrewMember.ped, iSyncSceneID, strAnimDict, "boot_l_loop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID, 0.0)
|
|
sCrewMember.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 10
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneID) > 0.99
|
|
sCrewMember.iEvent = 0
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_ON_FIRE(sCrewMember.ped)
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sCrewMember.ped, WALK_BLEND_OUT, TRUE)
|
|
SET_PED_CAN_RAGDOLL(sCrewMember.ped, TRUE)
|
|
SET_PED_TO_RAGDOLL_WITH_FALL(sCrewMember.ped, 1000, 20000, TYPE_FROM_HIGH, <<1.0, 0.0, 0.0>>, 28.4, <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
|
|
iSyncSceneID = -1
|
|
ENDIF
|
|
|
|
APPLY_DAMAGE_TO_PED(sCrewMember.ped, 40, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC PED_INDEX GET_CLOSEST_PED_TO_SCREEN_CENTRE(FLOAT &fScreenX, FLOAT &fScreenY)
|
|
PED_INDEX pedClosestEnemy = NULL
|
|
PED_INDEX peds[6]
|
|
GET_PED_NEARBY_PEDS(PLAYER_PED_ID(), peds)
|
|
|
|
FLOAT fClosestDistFromCentre = -1.0
|
|
FLOAT fDist = 0.0
|
|
FLOAT fX, fY
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(peds) i
|
|
IF NOT IS_PED_INJURED(peds[i])
|
|
IF GET_ENTITY_MODEL(peds[i]) = modelMerryweather
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(GET_ENTITY_COORDS(peds[i]), fX, fY)
|
|
fDist = ABSF(fX - 0.5) + ABSF(fY - 0.5)
|
|
|
|
IF fClosestDistFromCentre = -1.0 OR fDist < fClosestDistFromCentre
|
|
fClosestDistFromCentre = fDist
|
|
fScreenX = fX
|
|
fScreenY = fY
|
|
pedClosestEnemy = peds[i]
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
RETURN pedClosestEnemy
|
|
ENDFUNC
|
|
|
|
PROC UPDATE_SHOOTOUT_DIALOGUE()
|
|
TEXT_LABEL strLabel
|
|
INT iRandom
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
|
|
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
//Play reminders for the bridge guys at regular intervals.
|
|
IF sNooseAbove[0].iEvent > 0
|
|
IF iNumAliveNooseAbove > 0
|
|
IF GET_GAME_TIMER() - iBridgeEnemiesDialogueTimer > 10000
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
iRandom = GET_RANDOM_INT_IN_RANGE(0, 2)
|
|
|
|
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
IF iRandom = 0
|
|
strLabel = "FH3A_TBRID"
|
|
ELSE
|
|
strLabel = "FH3A_MBRID"
|
|
ENDIF
|
|
ELIF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
IF iRandom = 0
|
|
strLabel = "FH3A_FBRID"
|
|
ELSE
|
|
strLabel = "FH3A_TBRID"
|
|
ENDIF
|
|
ELIF eCurrentPlayer = SELECTOR_PED_TREVOR
|
|
IF iRandom = 0
|
|
strLabel = "FH3A_FBRID"
|
|
ELSE
|
|
strLabel = "FH3A_MBRID"
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
|
|
iBridgeEnemiesDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(-1000, 2000)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iBridgeEnemiesDialogueTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
//If an enemy needs to be killed but is blocked by the player then play some "I can't see" dialogue.
|
|
BOOL bLostLineOfSight = FALSE
|
|
|
|
IF IS_PLAYER_FREE_AIMING(PLAYER_ID())
|
|
OR IS_PLAYER_TARGETTING_ANYTHING(PLAYER_ID())
|
|
FLOAT fScreenX, fScreenY
|
|
PED_INDEX pedClosestEnemy = GET_CLOSEST_PED_TO_SCREEN_CENTRE(fScreenX, fScreenY)
|
|
|
|
IF NOT IS_PED_INJURED(pedClosestEnemy)
|
|
IF fScreenX > 0.4
|
|
AND fScreenX < 0.6
|
|
AND fScreenY > 0.35
|
|
AND fScreenY < 0.65
|
|
IF NOT HAS_ENTITY_CLEAR_LOS_TO_ENTITY_IN_FRONT(PLAYER_PED_ID(), pedClosestEnemy)
|
|
IF GET_GAME_TIMER() - iEnemyNotVisibleDialogueTimer > 1000
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
strLabel = "FH3A_FHID"
|
|
ELIF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
strLabel = "FH3A_MHID"
|
|
ELIF eCurrentPlayer = SELECTOR_PED_TREVOR
|
|
strLabel = "FH3A_THID"
|
|
ENDIF
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
|
|
iEnemyNotVisibleDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7000, 9000)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
bLostLineOfSight = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bLostLineOfSight
|
|
IF GET_GAME_TIMER() - iEnemyNotVisibleDialogueTimer > 0
|
|
iEnemyNotVisibleDialogueTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
//If an enemy needs to be killed and the player is in the best position then play some "I'll cover you" dialogue.
|
|
IF NOT bDoNewVersionOfShootout
|
|
INT iNumEnemiesWaitingOnForSecondPush = GET_NUM_FLANKING_ENEMIES_IN_PUSH_AREA()
|
|
INT iNumEnemiesWaitingOnForThirdPush = iNumAliveVanFlank + iNumAliveGoonsWave3b
|
|
|
|
IF iNumEnemiesWaitingOnForSecondPush = 2
|
|
OR iNumEnemiesWaitingOnForThirdPush = 2
|
|
IF GET_GAME_TIMER() - iIllCoverYouDialogueTimer > 1000
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
PED_INDEX pedClosestEnemy = NULL
|
|
PED_INDEX peds[12]
|
|
GET_PED_NEARBY_PEDS(PLAYER_PED_ID(), peds)
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(peds) i
|
|
IF pedClosestEnemy = NULL
|
|
IF NOT IS_PED_INJURED(peds[i])
|
|
pedClosestEnemy = peds[i]
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF NOT IS_PED_INJURED(pedClosestEnemy)
|
|
FLOAT fMichaelDist = VDIST2(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_MICHAEL)), GET_ENTITY_COORDS(pedClosestEnemy))
|
|
FLOAT fTrevorDist = VDIST2(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_TREVOR)), GET_ENTITY_COORDS(pedClosestEnemy))
|
|
FLOAT fFranklinDist = VDIST2(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN)), GET_ENTITY_COORDS(pedClosestEnemy))
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(fMichaelDist, " ", fTrevorDist, " ", fFranklinDist)
|
|
#ENDIF
|
|
|
|
strLabel = ""
|
|
|
|
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
IF fMichaelDist < fTrevorDist
|
|
IF fFranklinDist - fMichaelDist < 100.0
|
|
strLabel = "FH3A_MCOVERU"
|
|
ENDIF
|
|
ELSE
|
|
IF fFranklinDist - fTrevorDist < 100.0
|
|
strLabel = "FH3A_TCOVERU"
|
|
ENDIF
|
|
ENDIF
|
|
ELIF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
IF fFranklinDist < fTrevorDist
|
|
IF fMichaelDist - fFranklinDist < 100.0
|
|
strLabel = "FH3A_FCOVERU"
|
|
ENDIF
|
|
ELSE
|
|
IF fMichaelDist - fTrevorDist < 100.0
|
|
strLabel = "FH3A_TCOVERU"
|
|
ENDIF
|
|
ENDIF
|
|
ELIF eCurrentPlayer = SELECTOR_PED_TREVOR
|
|
IF fMichaelDist < fFranklinDist
|
|
IF fTrevorDist - fMichaelDist < 100.0
|
|
strLabel = "FH3A_MCOVERU"
|
|
ENDIF
|
|
ELSE
|
|
IF fTrevorDist - fFranklinDist < 100.0
|
|
strLabel = "FH3A_FCOVERU"
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strLabel)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
|
|
iIllCoverYouDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 11000)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iIllCoverYouDialogueTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// Sets the nearest ped to shout if you drive near them: the ped's car must be moving, close by, and not going in the same direction as the player.
|
|
/// Can also trigger if the player crashes into the car.
|
|
/// PARAMS:
|
|
/// iDialogueTimer - Keeps track of the time since the last ambient dialogue was played.
|
|
/// vehPlayer - The player's car
|
|
/// vehClosest - The car that contains the driver to shout.
|
|
/// bForceDialogue - If TRUE the dialogue will be forced through (position and speed checks are ignored).
|
|
PROC UPDATE_CHASE_AMBIENT_SHOUTS(INT &iDialogueTimer, VEHICLE_INDEX vehPlayer, VEHICLE_INDEX vehClosest, BOOL bForceDialogue = FALSE)
|
|
IF NOT IS_ENTITY_DEAD(vehPlayer)
|
|
IF GET_GAME_TIMER() - iDialogueTimer > 3000
|
|
OR (bForceDialogue AND GET_GAME_TIMER() - iDialogueTimer > 1000)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ENTITY_DEAD(vehClosest) AND vehClosest != vehPlayer
|
|
BOOL bCrashed = FALSE
|
|
BOOL bNearMiss = FALSE
|
|
|
|
IF bForceDialogue
|
|
bNearMiss = TRUE
|
|
ELIF IS_ENTITY_TOUCHING_ENTITY(vehClosest, vehPlayer)
|
|
bCrashed = TRUE
|
|
ELIF ABSF(GET_ENTITY_SPEED(vehClosest)) > 2.0
|
|
IF ABSF(GET_ENTITY_HEADING(vehClosest) - GET_ENTITY_HEADING(vehPlayer)) > 60.0
|
|
bNearMiss = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bCrashed OR bNearMiss
|
|
PED_INDEX pedCurrentAngryDriver = GET_PED_IN_VEHICLE_SEAT(vehClosest)
|
|
|
|
IF NOT IS_PED_INJURED(pedCurrentAngryDriver)
|
|
IF bCrashed
|
|
PLAY_PED_AMBIENT_SPEECH(pedCurrentAngryDriver, "GENERIC_CURSE_HIGH", SPEECH_PARAMS_FORCE_NORMAL)
|
|
ELSE
|
|
PLAY_PED_AMBIENT_SPEECH(pedCurrentAngryDriver, "GENERIC_INSULT_HIGH", SPEECH_PARAMS_FORCE_NORMAL)
|
|
ENDIF
|
|
|
|
iDialogueTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// Plays car horns on the nearest vehicle
|
|
PROC UPDATE_CHASE_HORNS(INT &iHornTimer, VEHICLE_INDEX vehClosest)
|
|
//General horns for all vehicles: get the nearest vehicle and play horn
|
|
IF GET_GAME_TIMER() - iHornTimer > 2000
|
|
IF IS_VEHICLE_DRIVEABLE(vehClosest)
|
|
PED_INDEX pedClosest = GET_PED_IN_VEHICLE_SEAT(vehClosest)
|
|
|
|
IF NOT IS_PED_INJURED(pedClosest)
|
|
START_VEHICLE_HORN(vehClosest, 2000)
|
|
|
|
iHornTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
FUNC BOOL GET_COP_SPAWN_POS_FROM_PLAYER(VECTOR &vSpawnPos, FLOAT &fSpawnHeading, INT iCopIndex, FLOAT fSpawnDistance = 40.0)
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
VECTOR vChasePos = GET_ENTITY_COORDS(sGoldCars[0].veh)
|
|
VECTOR vClosestNodeToPlayer, vClosestNodePos, vPlayerOffset
|
|
FLOAT fClosestNodeHeading, fHeadingFromNodeToPlayer, fHeadingDiff, fHeadingFromPlayerToChase
|
|
INT iNumLanes
|
|
|
|
IF GET_CLOSEST_VEHICLE_NODE(vPlayerPos, vClosestNodeToPlayer, NF_INCLUDE_SWITCHED_OFF_NODES)
|
|
IF VDIST2(vPlayerPos, vClosestNodeToPlayer) < 25.0
|
|
fHeadingFromPlayerToChase = GET_HEADING_FROM_VECTOR_2D(vChasePos.x - vPlayerPos.x, vChasePos.y - vPlayerPos.y)
|
|
vPlayerOffset = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vPlayerPos, fHeadingFromPlayerToChase, <<0.0, -fSpawnDistance, 0.0>>)
|
|
|
|
IF GET_NTH_CLOSEST_VEHICLE_NODE_WITH_HEADING(vPlayerOffset, 1, vClosestNodePos, fClosestNodeHeading, iNumLanes, NF_INCLUDE_SWITCHED_OFF_NODES)
|
|
vSpawnPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vClosestNodePos, fClosestNodeHeading, <<0.0, -10.0 * iCopIndex, 0.0>>)
|
|
|
|
IF NOT IS_SPHERE_VISIBLE(vSpawnPos, 3.0)
|
|
AND NOT IS_AREA_OCCUPIED(vSpawnPos - <<1.5, 1.5, 1.5>>, vSpawnPos + <<1.5, 1.5, 1.5>>, FALSE, TRUE, FALSE, FALSE, FALSE)
|
|
fHeadingFromNodeToPlayer = GET_HEADING_FROM_VECTOR_2D(vPlayerPos.x - vSpawnPos.x, vPlayerPos.y - vSpawnPos.y)
|
|
fHeadingDiff = ABSF(fHeadingFromNodeToPlayer - fClosestNodeHeading)
|
|
|
|
IF fHeadingDiff > 180.0
|
|
fHeadingDiff = ABSF(fHeadingDiff - 360.0)
|
|
ENDIF
|
|
|
|
IF fHeadingDiff < 90.0
|
|
fSpawnHeading = fClosestNodeHeading
|
|
ELSE
|
|
fSpawnHeading = fClosestNodeHeading + 180.0
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("Cop spawn: ", vSpawnPos, " ", fSpawnHeading)
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
/*VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
VECTOR vClosestNodeToPlayer, vClosestNodePos
|
|
FLOAT fClosestNodeHeading, fHeadingFromNodeToPlayer, fHeadingDiff
|
|
INT iNumLanes
|
|
|
|
IF GET_CLOSEST_VEHICLE_NODE(vPlayerPos, vClosestNodeToPlayer, NF_NONE)
|
|
IF VDIST2(vPlayerPos, vClosestNodeToPlayer) < 25.0
|
|
IF GET_NTH_CLOSEST_VEHICLE_NODE_WITH_HEADING(vPlayerPos, 16, vClosestNodePos, fClosestNodeHeading, iNumLanes, NF_NONE)
|
|
vSpawnPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vClosestNodePos, fClosestNodeHeading, <<0.0, -5.0 * iCopIndex, 0.0>>)
|
|
|
|
IF NOT IS_SPHERE_VISIBLE(vSpawnPos, 3.0)
|
|
AND NOT IS_AREA_OCCUPIED(vSpawnPos - <<1.5, 1.5, 1.5>>, vSpawnPos + <<1.5, 1.5, 1.5>>, FALSE, TRUE, FALSE, FALSE, FALSE)
|
|
fHeadingFromNodeToPlayer = GET_HEADING_FROM_VECTOR_2D(vPlayerPos.x - vSpawnPos.x, vPlayerPos.y - vSpawnPos.y)
|
|
fHeadingDiff = ABSF(fHeadingFromNodeToPlayer - fClosestNodeHeading)
|
|
|
|
IF fHeadingDiff > 180.0
|
|
fHeadingDiff = ABSF(fHeadingDiff - 360.0)
|
|
ENDIF
|
|
|
|
IF fHeadingDiff < 90.0
|
|
fSpawnHeading = fClosestNodeHeading
|
|
ELSE
|
|
fSpawnHeading = fClosestNodeHeading + 180.0
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("Cop spawn: ", vSpawnPos, " ", fSpawnHeading)
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
//VECTOR vInitialSpawnPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), <<0.0, fDistanceFromPlayer, 0.0>>)
|
|
//GET_NTH_CLOSEST_VEHICLE_NODE_FAVOUR_DIRECTION(vInitialSpawnPos, GET_ENTITY_COORDS(PLAYER_PED_ID()), 1, vSpawnPos, fSpawnHeading)
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Looks after any chase events that aren't part of the uber recording.
|
|
PROC UPDATE_CHASE_SET_PIECES()
|
|
CONST_INT TRAILER_SETPIECE_RIGHT 0
|
|
CONST_INT TRAILER_SETPIECE_LEFT 1
|
|
CONST_INT FINAL_CHOPPER_INDEX 5
|
|
CONST_INT COP_CRASH_SETPIECE_ID 9
|
|
CONST_INT GAS_TRUCK_SETPIECE_ID 15
|
|
CONST_INT COP_CRASH_SETPIECE_ID_2 18
|
|
|
|
SEQUENCE_INDEX seq
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
BOOL bCreatedAnEntityThisFrame = FALSE
|
|
|
|
REQUEST_MODEL(modelCop)
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(SetPieceCarID) i
|
|
//One of the set-piece cars is an articulated truck, the trailer is not part of the uber chase
|
|
IF i = 0 OR i = 1
|
|
AND SetPieceCarModel[i] = PACKER
|
|
INT iTrailerIndex = 0
|
|
INT iCarrec = CARREC_TRAILER_RIGHT
|
|
IF i = TRAILER_SETPIECE_LEFT
|
|
iTrailerIndex = 1
|
|
iCarrec = CARREC_TRAILER_LEFT
|
|
ELIF i = TRAILER_SETPIECE_RIGHT
|
|
//Use different recordings depending on if the player picked a bad truck driver.
|
|
IF bPickedGoodTruckDriver
|
|
iCarrec = CARREC_TRAILER_RIGHT
|
|
ELSE
|
|
iCarrec = CARREC_TRAILER_RIGHT_BAD
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF SetPieceCarStartime[i] - fChasePlaybackTime < 30000.0
|
|
REQUEST_VEHICLE_RECORDING(iCarrec, strCarrec)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[i])
|
|
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_RAMP")
|
|
REQUEST_ANIM_DICT(strTrailerRampAnims)
|
|
REQUEST_PTFX_ASSET()
|
|
|
|
IF i = TRAILER_SETPIECE_RIGHT
|
|
SETUP_REQ_CHASE_TUNNEL_INTERIOR_LOADED()
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(vehTrailer[iTrailerIndex])
|
|
IF SetPieceCarStartime[i] + 10000.0 > fChasePlaybackTime
|
|
REQUEST_MODEL(modelEndTrailers)
|
|
//REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_RAMP")
|
|
|
|
IF HAS_MODEL_LOADED(modelEndTrailers)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrec, strCarrec)
|
|
AND NOT bCreatedAnEntityThisFrame
|
|
vehTrailer[iTrailerIndex] = CREATE_VEHICLE(modelEndTrailers, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(SetPieceCarID[i], <<0.0, -10.0, 0.0>>),
|
|
GET_ENTITY_HEADING(SetPieceCarID[i]))
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehTrailer[iTrailerIndex], TRUE)
|
|
SET_VEHICLE_LOD_MULTIPLIER(vehTrailer[iTrailerIndex], 5.0)
|
|
SET_ENTITY_LOD_DIST(vehTrailer[iTrailerIndex], 1000)
|
|
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(SetPieceCarID[i], TRUE)
|
|
SET_VEHICLE_LOD_MULTIPLIER(SetPieceCarID[i], 5.0)
|
|
SET_ENTITY_LOD_DIST(SetPieceCarID[i], 1000)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelEndTrailers)
|
|
bChaseTrailerReadyToDriveUp = FALSE
|
|
bChaseTrailerFrozen[iTrailerIndex] = FALSE
|
|
|
|
IF iTrailerIndex = 1
|
|
IF NOT IS_ENTITY_DEAD(sGoldCars[0].veh)
|
|
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[0].veh, vehTrailer[iTrailerIndex], FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(sGoldCars[1].veh)
|
|
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[1].veh, vehTrailer[iTrailerIndex], FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF iTrailerIndex = 0
|
|
AND eMissionStage = STAGE_CHASE
|
|
IF NOT IS_ENTITY_DEAD(sGoldCars[2].veh)
|
|
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[2].veh, vehTrailer[iTrailerIndex], FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fix for 368573 - Lock the trucks at this point so the player can't jack them.
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(SetPieceCarID[i], FALSE)
|
|
|
|
IF iTrailerIndex = 0
|
|
SET_VEHICLE_COLOURS(SetPieceCarID[i], 73, 70)
|
|
SET_VEHICLE_EXTRA_COLOURS(SetPieceCarID[i], 63, 156)
|
|
ELSE
|
|
SET_VEHICLE_COLOURS(SetPieceCarID[i], 45, 40)
|
|
SET_VEHICLE_EXTRA_COLOURS(SetPieceCarID[i], 35, 156)
|
|
ENDIF
|
|
|
|
bCreatedAnEntityThisFrame = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_DEAD(vehTrailer[iTrailerIndex])
|
|
IF fChasePlaybackTime > 95000.0
|
|
//SET_VEHICLE_DOOR_OPEN(vehTrailer[iTrailerIndex], SC_DOOR_BOOT, TRUE, TRUE)
|
|
|
|
IF HAS_SOUND_FINISHED(iTrailerRampSounds[iTrailerIndex])
|
|
AND REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_RAMP")
|
|
PLAY_SOUND_FROM_ENTITY(iTrailerRampSounds[iTrailerIndex], "Truck_Ramp_Scrape", vehTrailer[iTrailerIndex], "BIG_SCORE_3A_SOUNDS")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF iTrailerIndex = 1
|
|
OR NOT bChaseTrailerReadyToDriveUp
|
|
//Start playback on the trailer once playback starts on the front
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehTrailer[iTrailerIndex])
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[i])
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrec, strCarrec)
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehTrailer[iTrailerIndex], iCarrec, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehTrailer[iTrailerIndex], GET_TIME_POSITION_IN_RECORDING(SetPieceCarID[i]))
|
|
//FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehTrailer[iTrailerIndex])
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SET_PLAYBACK_SPEED(vehTrailer[iTrailerIndex], TRAILER_SETPIECE_SPEED * fChasePlaybackSpeed)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//New version: uses a custom anim.
|
|
IF HAS_ANIM_DICT_LOADED(strTrailerRampAnims)
|
|
AND HAS_PTFX_ASSET_LOADED()
|
|
IF NOT bChaseTrailerFrozen[iTrailerIndex]
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(vehTrailer[iTrailerIndex], strTrailerRampAnims, "Trailer3_Door_Open")
|
|
PLAY_ENTITY_ANIM(vehTrailer[iTrailerIndex], "Trailer3_Door_Open", strTrailerRampAnims, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.9, ENUM_TO_INT(AF_USE_KINEMATIC_PHYSICS))
|
|
//PLAY_ENTITY_ANIM(vehTrailer[iTrailerIndex], "Trailer3_Door_Open", strTrailerRampAnims, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.9)
|
|
SET_VEHICLE_INACTIVE_DURING_PLAYBACK(vehTrailer[iTrailerIndex], TRUE)
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehTrailer[iTrailerIndex], FALSE)
|
|
bChaseTrailerFrozen[iTrailerIndex] = TRUE
|
|
|
|
IF iTrailerIndex = 0
|
|
ptfxRampSparks[0] = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_bigscore_ramp_sparks", vehTrailer[iTrailerIndex], <<0.23, -9.6955, -3.0130>>, <<0.0, 0.0, 0.0>>)
|
|
ptfxRampSparks[1] = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_bigscore_ramp_sparks", vehTrailer[iTrailerIndex], <<1.3358, -9.6955, -3.0130>>, <<0.0, 0.0, 0.0>>)
|
|
ELSE
|
|
ptfxRampSparks[2] = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_bigscore_ramp_sparks", vehTrailer[iTrailerIndex], <<0.23, -9.6355, -2.9630>>, <<0.0, 0.0, 0.0>>)
|
|
ptfxRampSparks[3] = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_bigscore_ramp_sparks", vehTrailer[iTrailerIndex], <<1.3358, -9.6355, -2.9630>>, <<0.0, 0.0, 0.0>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Old version: uses the open door commands.
|
|
/*IF iTrailerIndex = 0
|
|
OR eMissionStage != STAGE_CHASE
|
|
IF NOT bChaseTrailerFrozen[iTrailerIndex]
|
|
IF GET_VEHICLE_DOOR_ANGLE_RATIO(vehTrailer[iTrailerIndex], SC_DOOR_BOOT) > 0.9 AND GET_VEHICLE_DOOR_ANGLE_RATIO(vehTrailer[iTrailerIndex], SC_DOOR_BOOT) < 1.1
|
|
SET_VEHICLE_INACTIVE_DURING_PLAYBACK(vehTrailer[iTrailerIndex], TRUE)
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehTrailer[iTrailerIndex], FALSE)
|
|
bChaseTrailerFrozen[iTrailerIndex] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF GET_VEHICLE_DOOR_ANGLE_RATIO(vehTrailer[iTrailerIndex], SC_DOOR_BOOT) < 0.85 OR GET_VEHICLE_DOOR_ANGLE_RATIO(vehTrailer[iTrailerIndex], SC_DOOR_BOOT) > 1.1
|
|
SET_VEHICLE_INACTIVE_DURING_PLAYBACK(vehTrailer[iTrailerIndex], FALSE)
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehTrailer[iTrailerIndex], TRUE)
|
|
bChaseTrailerFrozen[iTrailerIndex] = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REMOVE_VEHICLE(vehTrailer[iTrailerIndex])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
|
|
IF eMissionStage = STAGE_CHASE
|
|
IF SetPieceCarModel[i] = POLICE3
|
|
OR SetPieceCarModel[i] = POLICE
|
|
IF NOT IS_ENTITY_DEAD(SetPieceCarID[i])
|
|
//If the cars stop have the peds get out and fight.
|
|
IF SetPieceCarProgress[i] > 2
|
|
AND fChasePlaybackTime - SetPieceCarStartime[i] > 2000.0
|
|
PED_INDEX pedDriver = GET_PED_IN_VEHICLE_SEAT(SetPieceCarID[i], VS_DRIVER)
|
|
|
|
IF NOT IS_PED_INJURED(pedDriver)
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[i])
|
|
OR (IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[i])
|
|
AND (GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(SetPieceCarRecording[i], strCarrec) - ((fChasePlaybackTime - SetPieceCarStartime[i]) * SetPieceCarRecordingSpeed[i]) < 2000.0)
|
|
AND GET_ENTITY_SPEED(SetPieceCarID[i]) < 0.5)
|
|
IF GET_SCRIPT_TASK_STATUS(pedDriver, SCRIPT_TASK_COMBAT) != PERFORMING_TASK
|
|
AND NOT IS_PED_IN_COMBAT(pedDriver)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(pedDriver, relGroupCops)
|
|
SET_PED_COMBAT_ATTRIBUTES(pedDriver, CA_USE_VEHICLE, FALSE)
|
|
IF NOT HAS_PED_GOT_WEAPON(pedDriver, WEAPONTYPE_PISTOL)
|
|
GIVE_WEAPON_TO_PED(pedDriver, WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
|
|
ENDIF
|
|
SET_CURRENT_PED_WEAPON(pedDriver, WEAPONTYPE_PISTOL, TRUE)
|
|
SET_PED_COMBAT_PARAMS(pedDriver, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(pedDriver, 200.0)
|
|
//TASK_COMBAT_PED(pedDriver, PLAYER_PED_ID())
|
|
SET_PED_KEEP_TASK(pedDriver, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedDriver, FALSE)
|
|
SET_PED_AS_NO_LONGER_NEEDED(pedDriver)
|
|
ENDIF
|
|
ELSE
|
|
//Tell them to driveby the player
|
|
IF GET_SCRIPT_TASK_STATUS(pedDriver, SCRIPT_TASK_DRIVE_BY) != PERFORMING_TASK
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(pedDriver, relGroupCops)
|
|
IF NOT HAS_PED_GOT_WEAPON(pedDriver, WEAPONTYPE_PISTOL)
|
|
GIVE_WEAPON_TO_PED(pedDriver, WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
|
|
ENDIF
|
|
SET_CURRENT_PED_WEAPON(pedDriver, WEAPONTYPE_PISTOL, TRUE)
|
|
SET_PED_COMBAT_PARAMS(pedDriver, 10, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, TLR_NEVER_LOSE_TARGET)
|
|
|
|
TASK_DRIVE_BY(pedDriver, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 100, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedDriver, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF eMissionStage = STAGE_CHASE //Don't do this stuff if debugging the chase.
|
|
//have the chopper do near miss bullets
|
|
IF SetPieceCarModel[FINAL_CHOPPER_INDEX] = POLMAV
|
|
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[FINAL_CHOPPER_INDEX])
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
|
|
//Add a gunner on the back.
|
|
IF NOT DOES_ENTITY_EXIST(pedHeliGunner)
|
|
IF HAS_MODEL_LOADED(modelCop)
|
|
AND NOT bCreatedAnEntityThisFrame
|
|
AND NOT bCreatedUberPlaybackEntityThisFrame
|
|
pedHeliGunner = CREATE_PED_INSIDE_VEHICLE(SetPieceCarID[FINAL_CHOPPER_INDEX], PEDTYPE_COP, modelCop, VS_BACK_RIGHT)
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(pedHeliGunner, "BS_2A_CHASE_TUNNEL_CHOPPER_GUNMAN_GROUP")
|
|
GIVE_WEAPON_TO_PED(pedHeliGunner, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, TRUE)
|
|
TASK_AIM_GUN_AT_ENTITY(pedHeliGunner, sGoldCars[1].veh, -1)
|
|
SET_PED_ACCURACY(pedHeliGunner, 1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedHeliGunner, TRUE)
|
|
bCreatedAnEntityThisFrame = TRUE
|
|
ENDIF
|
|
ELIF NOT IS_PED_INJURED(pedHeliGunner)
|
|
VECTOR vRandom = <<GET_RANDOM_FLOAT_IN_RANGE(-1.5, 1.5), GET_RANDOM_FLOAT_IN_RANGE(-0.5, 0.5), 0.0>>
|
|
|
|
//The burst timer picks a random amount of time to shoot, followed by 500ms wait.
|
|
IF iHeliBurstTimer = 0 OR iHeliBurstTimer > 2400
|
|
iHeliBurstTimer = GET_RANDOM_INT_IN_RANGE(1000, 1250)
|
|
ENDIF
|
|
|
|
IF HAS_PED_GOT_WEAPON(pedHeliGunner, WEAPONTYPE_CARBINERIFLE)
|
|
WEAPON_TYPE eCurrentWeapon
|
|
|
|
GET_CURRENT_PED_WEAPON(pedHeliGunner, eCurrentWeapon)
|
|
|
|
IF eCurrentWeapon != WEAPONTYPE_CARBINERIFLE
|
|
SET_CURRENT_PED_WEAPON(pedHeliGunner, WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(pedHeliGunner, SCRIPT_TASK_AIM_GUN_AT_ENTITY) != PERFORMING_TASK
|
|
TASK_AIM_GUN_AT_ENTITY(pedHeliGunner, sGoldCars[1].veh, -1)
|
|
ENDIF
|
|
|
|
IF iHeliBurstTimer < 2000
|
|
IF IS_IT_SAFE_TO_FIRE_BULLETS_FROM_PED(pedHeliGunner)
|
|
IF fChasePlaybackTime > 91000.0 AND fChasePlaybackTime < 101000.0
|
|
SET_PED_SHOOTS_AT_COORD(pedHeliGunner, GET_ENTITY_COORDS(sGoldCars[1].veh) + vRandom)
|
|
ELIF fChasePlaybackTime > 101000.0
|
|
SET_PED_SHOOTS_AT_COORD(pedHeliGunner, GET_ENTITY_COORDS(sGoldCars[PLAYERS_GOLD_CAR].veh) + vRandom)
|
|
ENDIF
|
|
|
|
SET_AMMO_IN_CLIP(pedHeliGunner, WEAPONTYPE_CARBINERIFLE, 30)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Dialogue for the gunner shouting
|
|
IF fChasePlaybackTime > 91000.0 AND fChasePlaybackTime < 105000.0
|
|
IF GET_GAME_TIMER() - iChaseHeliDialogueTimer > 0
|
|
IF sConversationPeds.PedInfo[6].Index != pedHeliGunner
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 6, pedHeliGunner, "BS2ACopHeli")
|
|
ELSE
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedHeliGunner)) < 10000.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_TANN", CONV_PRIORITY_MEDIUM)
|
|
iChaseHeliDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 15000)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
//Police barricade by building site
|
|
IF DOES_ENTITY_EXIST(ParkedCarID[0])
|
|
REPEAT COUNT_OF(pedChaseCops) i
|
|
IF NOT DOES_ENTITY_EXIST(pedChaseCops[i])
|
|
bPlayerReachedBuildingSiteBlockade = FALSE
|
|
|
|
IF NOT bCreatedAnEntityThisFrame
|
|
AND NOT bCreatedUberPlaybackEntityThisFrame
|
|
AND HAS_MODEL_LOADED(modelCop)
|
|
IF i = 0
|
|
pedChaseCops[0] = CREATE_PED(PEDTYPE_COP, modelCop, <<160.7507, -401.0259, 40.3883>>, 169.4078)
|
|
ELIF i = 1
|
|
pedChaseCops[1] = CREATE_PED(PEDTYPE_COP, modelCop, <<155.0481, -398.6294, 40.4022>>, 154.8844)
|
|
ELIF i = 2
|
|
pedChaseCops[2] = CREATE_PED(PEDTYPE_COP, modelCop, <<149.0505, -395.9275, 40.2201>>, 167.5788)
|
|
ELIF i = 3
|
|
pedChaseCops[3] = CREATE_PED(PEDTYPE_COP, modelCop, <<170.8870, -404.8884, 40.3226>>, 158.9191)
|
|
ENDIF
|
|
|
|
GIVE_WEAPON_TO_PED(pedChaseCops[i], WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
|
|
SET_PED_COMBAT_AI(pedChaseCops[i], 0, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER, GET_ENTITY_COORDS(pedChaseCops[i]) - <<0.0, 0.0, 1.0>>, 2.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedChaseCops[i], TRUE)
|
|
bCreatedAnEntityThisFrame = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(pedChaseCops[i])
|
|
IF GET_SCRIPT_TASK_STATUS(pedChaseCops[i], SCRIPT_TASK_COMBAT) != PERFORMING_TASK
|
|
TASK_COMBAT_PED(pedChaseCops[i], PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF DOES_ENTITY_EXIST(pedChaseCops[0])
|
|
IF NOT bPlayerReachedBuildingSiteBlockade
|
|
IF VDIST2(GET_ENTITY_COORDS(pedChaseCops[0], FALSE), vPlayerPos) < 1600.0
|
|
bPlayerReachedBuildingSiteBlockade = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(pedChaseCops[0])
|
|
IF bPlayerReachedBuildingSiteBlockade
|
|
OR (fChasePlaybackTime > 70000.0 AND fChasePlaybackSpeed > 0.7)
|
|
REPEAT COUNT_OF(pedChaseCops) i
|
|
REMOVE_PED(pedChaseCops[i])
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Barricade by the shopping mall.
|
|
IF DOES_ENTITY_EXIST(ParkedCarID[19]) //This is bad: if the parked array changes this number won't work and needs to be maintained.
|
|
IF DOES_ENTITY_EXIST(pedChaseBlockadeMall[0])
|
|
IF NOT bPlayerReachedRockfordBlockade
|
|
IF VDIST2(GET_ENTITY_COORDS(pedChaseBlockadeMall[0], FALSE), vPlayerPos) < 1600.0
|
|
bPlayerReachedRockfordBlockade = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bPlayerReachedRockfordBlockade = FALSE
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(pedChaseBlockadeMall) i
|
|
IF NOT DOES_ENTITY_EXIST(pedChaseBlockadeMall[i])
|
|
IF NOT bCreatedAnEntityThisFrame
|
|
AND NOT bCreatedUberPlaybackEntityThisFrame
|
|
AND HAS_MODEL_LOADED(modelCop)
|
|
IF i = 0
|
|
pedChaseBlockadeMall[0] = CREATE_PED(PEDTYPE_COP, modelCop, <<-129.8845, -213.4072, 43.7800 >>, 248.4384)
|
|
ELIF i = 1
|
|
pedChaseBlockadeMall[1] = CREATE_PED(PEDTYPE_COP, modelCop, <<-130.4947, -216.9322, 43.8199 >>, 246.0174)
|
|
ENDIF
|
|
|
|
bCreatedAnEntityThisFrame = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(pedChaseBlockadeMall[i])
|
|
IF GET_SCRIPT_TASK_STATUS(pedChaseBlockadeMall[i], SCRIPT_TASK_COMBAT) != PERFORMING_TASK
|
|
GIVE_WEAPON_TO_PED(pedChaseBlockadeMall[i], WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
|
|
SET_PED_COMBAT_PARAMS(pedChaseBlockadeMall[i], 0, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedChaseBlockadeMall[i], GET_ENTITY_COORDS(pedChaseBlockadeMall[i]) - <<0.0, 0.0, 1.0>>, 2.0)
|
|
TASK_COMBAT_PED(pedChaseBlockadeMall[i], PLAYER_PED_ID())
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedChaseBlockadeMall[i], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(pedChaseBlockadeMall[0])
|
|
IF bPlayerReachedRockfordBlockade
|
|
OR (fChasePlaybackTime > 80000.0 AND fChasePlaybackSpeed > 0.7)
|
|
REPEAT COUNT_OF(pedChaseBlockadeMall) i
|
|
REMOVE_PED(pedChaseBlockadeMall[i])
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Barricade by the freeway
|
|
IF DOES_ENTITY_EXIST(ParkedCarID[3])
|
|
IF NOT DOES_ENTITY_EXIST(pedChaseBlockade2[0])
|
|
bPlayerReachedFreewayBlockade = FALSE
|
|
ELSE
|
|
IF NOT bPlayerReachedFreewayBlockade
|
|
IF VDIST2(GET_ENTITY_COORDS(pedChaseBlockade2[0], FALSE), vPlayerPos) < 1600.0
|
|
bPlayerReachedFreewayBlockade = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(pedChaseBlockade2) i
|
|
IF NOT DOES_ENTITY_EXIST(pedChaseBlockade2[i])
|
|
IF NOT bCreatedAnEntityThisFrame
|
|
AND NOT bCreatedUberPlaybackEntityThisFrame
|
|
AND HAS_MODEL_LOADED(modelCop)
|
|
IF i = 0
|
|
pedChaseBlockade2[0] = CREATE_PED(PEDTYPE_COP, modelCop, <<-625.3889, -484.0737, 33.6511>>, 22.7602)
|
|
ELIF i = 1
|
|
pedChaseBlockade2[1] = CREATE_PED(PEDTYPE_COP, modelCop, <<-637.7578, -484.6165, 33.8128>>, 342.2310)
|
|
ELIF i = 2
|
|
pedChaseBlockade2[2] = CREATE_PED(PEDTYPE_COP, modelCop, <<-642.2914, -485.0347, 33.8047>>, 6.3428)
|
|
ELIF i = 3
|
|
pedChaseBlockade2[3] = CREATE_PED(PEDTYPE_COP, modelCop, <<-645.7305, -485.9541, 33.6879>>, 9.5655)
|
|
ENDIF
|
|
|
|
bCreatedAnEntityThisFrame = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(pedChaseBlockade2[i])
|
|
IF GET_SCRIPT_TASK_STATUS(pedChaseBlockade2[i], SCRIPT_TASK_COMBAT) != PERFORMING_TASK
|
|
GIVE_WEAPON_TO_PED(pedChaseBlockade2[i], WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
|
|
SET_PED_COMBAT_PARAMS(pedChaseBlockade2[i], 0, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(pedChaseBlockade2[i], GET_ENTITY_COORDS(pedChaseBlockade2[i]), 4.0)
|
|
TASK_COMBAT_PED(pedChaseBlockade2[i], PLAYER_PED_ID())
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedChaseBlockade2[i], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(pedChaseBlockade2[0])
|
|
IF bPlayerReachedFreewayBlockade
|
|
OR (IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh) AND IS_ENTITY_ATTACHED(sGoldCars[0].veh))
|
|
REPEAT COUNT_OF(pedChaseBlockade2) i
|
|
REMOVE_PED(pedChaseBlockade2[i])
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Two cops create a barricade just before the freeway, if the player picked the bad driver they'll get caught here.
|
|
//NOTE: this is not done as part of the uber as we need control of the ped actions, and to guarantee that the cops appear.
|
|
FLOAT fBlockadePlaybackStartTime = 75000.0
|
|
|
|
IF NOT sChaseCopsBlockade[0].bIsCreated
|
|
IF NOT bCreatedUberPlaybackEntityThisFrame
|
|
AND NOT bCreatedAnEntityThisFrame
|
|
IF NOT DOES_ENTITY_EXIST(vehChaseCopsBlockade[0])
|
|
IF fChasePlaybackTime > fBlockadePlaybackStartTime - 10000.0
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_COPS_BLOCKADE, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_COPS_BLOCKADE_2, strCarrec)
|
|
REQUEST_MODEL(modelCopCar)
|
|
|
|
IF HAS_MODEL_LOADED(modelCop)
|
|
AND HAS_MODEL_LOADED(modelCopCar)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_COPS_BLOCKADE, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_COPS_BLOCKADE_2, strCarrec)
|
|
IF fChasePlaybackTime > fBlockadePlaybackStartTime - 4000.0
|
|
vehChaseCopsBlockade[0] = CREATE_VEHICLE(modelCopCar, <<-680.7803, -351.3055, 34.2074>>)
|
|
SET_ENTITY_QUATERNION(vehChaseCopsBlockade[0], 0.0073, 0.0177, 0.8271, -0.5618)
|
|
FREEZE_ENTITY_POSITION(vehChaseCopsBlockade[0], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT DOES_ENTITY_EXIST(vehChaseCopsBlockade[1])
|
|
vehChaseCopsBlockade[1] = CREATE_VEHICLE(modelCopCar, <<-687.9218, -348.7174, 34.2604>>)
|
|
FREEZE_ENTITY_POSITION(vehChaseCopsBlockade[1], TRUE)
|
|
SET_ENTITY_QUATERNION(vehChaseCopsBlockade[1], 0.0132, 0.0051, 0.8425, -0.5385)
|
|
ELIF NOT DOES_ENTITY_EXIST(sChaseCopsBlockade[0].ped)
|
|
sChaseCopsBlockade[0].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelCop, vehChaseCopsBlockade[0], VS_DRIVER, relGroupCops, 200, 0, WEAPONTYPE_PISTOL)
|
|
SET_ENTITY_INVINCIBLE(sChaseCopsBlockade[0].ped, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sChaseCopsBlockade[1].ped)
|
|
sChaseCopsBlockade[1].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelCop, vehChaseCopsBlockade[0], VS_FRONT_RIGHT, relGroupCops, 200, 0, WEAPONTYPE_PISTOL)
|
|
SET_ENTITY_INVINCIBLE(sChaseCopsBlockade[1].ped, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sChaseCopsBlockade[2].ped)
|
|
sChaseCopsBlockade[2].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelCop, vehChaseCopsBlockade[1], VS_DRIVER, relGroupCops, 200, 0, WEAPONTYPE_PISTOL)
|
|
SET_ENTITY_INVINCIBLE(sChaseCopsBlockade[2].ped, TRUE)
|
|
ELIF NOT DOES_ENTITY_EXIST(sChaseCopsBlockade[3].ped)
|
|
sChaseCopsBlockade[3].ped = CREATE_ENEMY_PED_IN_VEHICLE(modelCop, vehChaseCopsBlockade[1], VS_FRONT_RIGHT, relGroupCops, 200, 0, WEAPONTYPE_PISTOL)
|
|
SET_ENTITY_INVINCIBLE(sChaseCopsBlockade[3].ped, TRUE)
|
|
|
|
REPEAT COUNT_OF(vehChaseCopsBlockade) i
|
|
IF NOT IS_ENTITY_DEAD(vehChaseCopsBlockade[i])
|
|
SET_VEHICLE_ENGINE_ON(vehChaseCopsBlockade[i], TRUE, TRUE)
|
|
SET_VEHICLE_STRONG(vehChaseCopsBlockade[i], TRUE)
|
|
SET_VEHICLE_LIGHTS(vehChaseCopsBlockade[i], FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_SIREN(vehChaseCopsBlockade[i], TRUE)
|
|
SET_SIREN_WITH_NO_DRIVER(vehChaseCopsBlockade[i], TRUE)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehChaseCopsBlockade[i], FALSE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(sChaseCopsBlockade) i
|
|
IF NOT IS_PED_INJURED(sChaseCopsBlockade[i].ped)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCopsBlockade[i].ped, TRUE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sChaseCopsBlockade[i].ped, TRUE)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sChaseCopsBlockade[i].ped, FALSE)
|
|
SET_PED_CONFIG_FLAG(sChaseCopsBlockade[i].ped, PCF_WillFlyThroughWindscreen, FALSE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCopsBlockade[i].ped, TRUE)
|
|
|
|
sChaseCopsBlockade[i].iEvent = 0
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelCopCar)
|
|
|
|
INITIALISE_ENEMY_GROUP(sChaseCopsBlockade, "Block ")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
INT iCarThisPedIsIn
|
|
|
|
//Handle the peds: if the player picked a good driver they just get out and fight, otherwise they try to arrest the bad driver who stops in front of them.
|
|
REPEAT COUNT_OF(sChaseCopsBlockade) i
|
|
IF DOES_ENTITY_EXIST(sChaseCopsBlockade[i].ped)
|
|
IF NOT IS_PED_INJURED(sChaseCopsBlockade[i].ped)
|
|
iCarThisPedIsIn = i / 2
|
|
|
|
SWITCH sChaseCopsBlockade[i].iEvent
|
|
CASE 0
|
|
IF i = 0
|
|
IF fChasePlaybackTime >= fBlockadePlaybackStartTime
|
|
IF NOT IS_ENTITY_DEAD(vehChaseCopsBlockade[0])
|
|
FREEZE_ENTITY_POSITION(vehChaseCopsBlockade[0], FALSE)
|
|
START_PLAYBACK_RECORDED_VEHICLE_WITH_FLAGS(vehChaseCopsBlockade[0], CARREC_CHASE_COPS_BLOCKADE, strCarrec,
|
|
ENUM_TO_INT(SWITCH_ON_PLAYER_VEHICLE_IMPACT) | ENUM_TO_INT(TURN_ON_ENGINE_INSTANTLY))
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehChaseCopsBlockade[0], fChasePlaybackTime - fBlockadePlaybackStartTime)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehChaseCopsBlockade[0])
|
|
SET_PLAYBACK_SPEED(vehChaseCopsBlockade[0], fChasePlaybackSpeed)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehChaseCopsBlockade[1])
|
|
FREEZE_ENTITY_POSITION(vehChaseCopsBlockade[1], FALSE)
|
|
START_PLAYBACK_RECORDED_VEHICLE_WITH_FLAGS(vehChaseCopsBlockade[1], CARREC_CHASE_COPS_BLOCKADE_2, strCarrec,
|
|
ENUM_TO_INT(SWITCH_ON_PLAYER_VEHICLE_IMPACT) | ENUM_TO_INT(TURN_ON_ENGINE_INSTANTLY))
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehChaseCopsBlockade[1], fChasePlaybackTime - fBlockadePlaybackStartTime)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehChaseCopsBlockade[1])
|
|
SET_PLAYBACK_SPEED(vehChaseCopsBlockade[1], fChasePlaybackSpeed)
|
|
ENDIF
|
|
|
|
SET_ENTITY_INVINCIBLE(sChaseCopsBlockade[i].ped, FALSE)
|
|
sChaseCopsBlockade[i].iEvent++
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_DEAD(vehChaseCopsBlockade[iCarThisPedIsIn])
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChaseCopsBlockade[iCarThisPedIsIn])
|
|
SET_ENTITY_INVINCIBLE(sChaseCopsBlockade[i].ped, FALSE)
|
|
|
|
sChaseCopsBlockade[i].iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Once their car stops get them out and fighting
|
|
IF NOT IS_ENTITY_DEAD(vehChaseCopsBlockade[iCarThisPedIsIn])
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChaseCopsBlockade[iCarThisPedIsIn])
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sChaseCopsBlockade[i].ped, relGroupCops)
|
|
SET_PED_COMBAT_ATTRIBUTES(sChaseCopsBlockade[i].ped, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sChaseCopsBlockade[i].ped, CA_DO_DRIVEBYS, FALSE)
|
|
IF NOT HAS_PED_GOT_WEAPON(sChaseCopsBlockade[i].ped, WEAPONTYPE_PISTOL)
|
|
GIVE_WEAPON_TO_PED(sChaseCopsBlockade[i].ped, WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
|
|
ENDIF
|
|
SET_CURRENT_PED_WEAPON(sChaseCopsBlockade[i].ped, WEAPONTYPE_PISTOL, TRUE)
|
|
|
|
IF NOT bPickedGoodCarDriver
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_LEAVE_VEHICLE(NULL, vehChaseCopsBlockade[iCarThisPedIsIn], ECF_DONT_CLOSE_DOOR)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, GET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped), sCrew[CREW_DRIVER].ped, PEDMOVE_WALK, FALSE, 4.0, 5.0)
|
|
TASK_AIM_GUN_AT_ENTITY(NULL, sCrew[CREW_DRIVER].ped, -1)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sChaseCopsBlockade[i].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
//TASK_ARREST_PED(sChaseCopsBlockade[i].ped, sCrew[CREW_DRIVER].ped)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCopsBlockade[i].ped, TRUE)
|
|
ELSE
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sChaseCopsBlockade[i].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCopsBlockade[i].ped, FALSE)
|
|
ENDIF
|
|
|
|
//This is a good moment to record some footage of the blockade driving in and the player swerving around.
|
|
IF i = 0
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0)
|
|
ENDIF
|
|
|
|
sChaseCopsBlockade[i].iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //If the player hurts one of the cops while they're trying to arrest the driver put them into combat.
|
|
IF NOT IS_PED_IN_COMBAT(sChaseCopsBlockade[i].ped)
|
|
IF VDIST2(vPlayerPos, GET_ENTITY_COORDS(sChaseCopsBlockade[i].ped)) < 16.0
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sChaseCopsBlockade[i].ped, 100.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCopsBlockade[i].ped, FALSE)
|
|
|
|
sChaseCopsBlockade[i].iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
CLEAN_UP_ENEMY_PED(sChaseCopsBlockade[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Handle the cars: set them as no longer needed once the recording stops.
|
|
REPEAT COUNT_OF(vehChaseCopsBlockade) i
|
|
IF DOES_ENTITY_EXIST(vehChaseCopsBlockade[i])
|
|
IF NOT IS_ENTITY_DEAD(vehChaseCopsBlockade[i])
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChaseCopsBlockade[i])
|
|
SET_PLAYBACK_SPEED(vehChaseCopsBlockade[i], fChasePlaybackSpeed)
|
|
ELSE
|
|
IF fChasePlaybackTime > fBlockadePlaybackStartTime + 5000.0
|
|
REMOVE_VEHICLE(vehChaseCopsBlockade[i])
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REMOVE_VEHICLE(vehChaseCopsBlockade[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
|
|
//If the player picked a bad crew member to drive, they crash half-way through the chase.
|
|
IF (NOT bPickedGoodCarDriver) AND eMissionStage = STAGE_CHASE
|
|
IF fChasePlaybackTime > 70000.0
|
|
IF DOES_ENTITY_EXIST(sGoldCars[2].veh)
|
|
IF NOT IS_ENTITY_DEAD(sGoldCars[2].veh)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SWITCH sGoldCars[2].iEvent
|
|
CASE 0
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[2].veh)
|
|
TASK_HANDS_UP(sCrew[CREW_DRIVER].ped, -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_DRIVER].ped, TRUE)
|
|
|
|
IF DOES_BLIP_EXIST(sGoldCars[2].blip)
|
|
REMOVE_BLIP(sGoldCars[2].blip)
|
|
ENDIF
|
|
|
|
//Remove a quarter of the take.
|
|
iTakePenaltyCrewDies = iMaxTakeConsideringCrew / 4
|
|
iCurrentTake -= iTakePenaltyCrewDies
|
|
sGoldCars[2].iEvent++
|
|
ELSE
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT bHasTextLabelTriggered[FH3A_SPIN]
|
|
IF fChasePlaybackTime > 81500.0
|
|
IF fChasePlaybackTime < 82250.0
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_SPIN", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_SPIN] = TRUE
|
|
bMichaelSaidInstructionInChase = FALSE //We don't want crew responses to Michael's isntructions triggering after this dialogue.
|
|
ENDIF
|
|
ELSE
|
|
bHasTextLabelTriggered[FH3A_SPIN] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_CRSH]
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_CRSH", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_CRSH] = TRUE
|
|
bMichaelSaidInstructionInChase = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //If the player kills all of the cops trying to arrest the driver then he drives off. If the player drives off then kill the driver so they're removed.
|
|
IF IS_ENEMY_GROUP_DEAD(sChaseCopsBlockade)
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF NOT IS_PED_IN_VEHICLE(NULL, sGoldCars[2].veh)
|
|
TASK_ENTER_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldCars[2].veh)
|
|
ENDIF
|
|
|
|
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, sGoldCars[2].veh, <<-854.9, 207.1, 73.0>>, 40.0, DRIVINGMODE_AVOIDCARS, 10.0)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sCrew[CREW_DRIVER].ped, seq)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_DRIVER].ped, TRUE)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
//Add the previously moved take back.
|
|
iCurrentTake += (iMaxTakeConsideringCrew / 4)
|
|
iTakePenaltyCrewDies = 0
|
|
sGoldCars[2].iEvent++
|
|
ELSE
|
|
IF VDIST2(GET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped), vPlayerPos) > 6400.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT bHasTextLabelTriggered[FH3A_KILL]
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_KILL", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_KILL] = TRUE
|
|
bMichaelSaidInstructionInChase = FALSE //We don't want crew responses to Michael's isntructions triggering after this dialogue.
|
|
ENDIF
|
|
ELSE
|
|
APPLY_DAMAGE_TO_PED(sCrew[CREW_DRIVER].ped, GET_ENTITY_HEALTH(sCrew[CREW_DRIVER].ped) + 50, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Delete the driver eventually once they get away, and flag them as having been rescued.
|
|
IF DOES_ENTITY_EXIST(sGoldCars[2].veh)
|
|
IF NOT bHasTextLabelTriggered[FH3A_SAVE]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_SAVE", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_SAVE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped, FALSE), vPlayerPos) > 10000.0
|
|
OR (IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh) AND IS_ENTITY_ATTACHED(sGoldCars[PLAYERS_GOLD_CAR].veh))
|
|
g_bBigScore2ARescuedBadDriver = TRUE
|
|
|
|
REMOVE_PED(sCrew[CREW_DRIVER].ped)
|
|
REMOVE_VEHICLE(sGoldCars[2].veh)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
REMOVE_PED(sCrew[CREW_DRIVER].ped)
|
|
REMOVE_VEHICLE(sGoldCars[2].veh)
|
|
|
|
IF DOES_BLIP_EXIST(sGoldCars[2].blip)
|
|
REMOVE_BLIP(sGoldCars[2].blip)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REMOVE_PED(sCrew[CREW_DRIVER].ped)
|
|
REMOVE_VEHICLE(sGoldCars[2].veh)
|
|
|
|
IF DOES_BLIP_EXIST(sGoldCars[2].blip)
|
|
REMOVE_BLIP(sGoldCars[2].blip)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Cop car: if player picked good driver this car crashes
|
|
IF SetPieceCarModel[COP_CRASH_SETPIECE_ID_2] = POLICE3
|
|
OR SetPieceCarModel[COP_CRASH_SETPIECE_ID_2] = POLICE
|
|
IF NOT IS_ENTITY_DEAD(SetPieceCarID[COP_CRASH_SETPIECE_ID_2])
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[COP_CRASH_SETPIECE_ID_2])
|
|
FLOAT fTime = GET_TIME_POSITION_IN_RECORDING(SetPieceCarID[COP_CRASH_SETPIECE_ID_2])
|
|
|
|
IF GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(SetPieceCarRecording[COP_CRASH_SETPIECE_ID_2], strCarrec) - fTime < 500.0
|
|
PED_INDEX pedDriver = GET_PED_IN_VEHICLE_SEAT(SetPieceCarID[COP_CRASH_SETPIECE_ID_2])
|
|
|
|
IF NOT IS_PED_INJURED(pedDriver)
|
|
SET_ENTITY_HEALTH(pedDriver, 0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_TYRE_BURST(SetPieceCarID[COP_CRASH_SETPIECE_ID_2], SC_WHEEL_CAR_REAR_LEFT)
|
|
IF fChasePlaybackTime > 44300.0
|
|
SET_VEHICLE_TYRE_BURST(SetPieceCarID[COP_CRASH_SETPIECE_ID_2], SC_WHEEL_CAR_REAR_LEFT, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bPlayedCopCrashSound
|
|
IF fChasePlaybackTime > 44800.0
|
|
//This is a good moment to record footage of the car flipping.
|
|
REPLAY_RECORD_BACK_FOR_TIME(1.0)
|
|
|
|
//PLAY_SOUND_FROM_ENTITY(-1, "Cop_Car_Flipped", SetPieceCarID[COP_CRASH_SETPIECE_ID_2], "BIG_SCORE_3A_SOUNDS")
|
|
bPlayedCopCrashSound = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bPlayedCopCrashSound = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Gas tanker: blows up when police car crashes into it.
|
|
IF SetPieceCarModel[GAS_TRUCK_SETPIECE_ID] = PACKER
|
|
IF SetPieceCarProgress[GAS_TRUCK_SETPIECE_ID] < 99
|
|
AND fChasePlaybackTime < SetPieceCarStartime[GAS_TRUCK_SETPIECE_ID] + 10000.0
|
|
IF fChasePlaybackTime > SetPieceCarStartime[GAS_TRUCK_SETPIECE_ID] - 10000.0
|
|
AND NOT DOES_ENTITY_EXIST(vehTanker)
|
|
REQUEST_MODEL(TANKER)
|
|
ENDIF
|
|
|
|
REQUEST_VEHICLE_RECORDING(CARREC_GAS_TANKER, strCarrec)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(SetPieceCarID[GAS_TRUCK_SETPIECE_ID])
|
|
IF NOT DOES_ENTITY_EXIST(vehTanker)
|
|
IF fChasePlaybackTime < SetPieceCarStartime[GAS_TRUCK_SETPIECE_ID] + 10000.0
|
|
REQUEST_MODEL(TANKER)
|
|
|
|
IF HAS_MODEL_LOADED(TANKER)
|
|
AND NOT bCreatedAnEntityThisFrame
|
|
AND NOT bCreatedUberPlaybackEntityThisFrame
|
|
vehTanker = CREATE_VEHICLE(TANKER, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(SetPieceCarID[GAS_TRUCK_SETPIECE_ID], <<0.0, -10.0, 0.0>>),
|
|
GET_ENTITY_HEADING(SetPieceCarID[GAS_TRUCK_SETPIECE_ID]))
|
|
ATTACH_VEHICLE_TO_TRAILER(SetPieceCarID[GAS_TRUCK_SETPIECE_ID], vehTanker)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(TANKER)
|
|
bCreatedAnEntityThisFrame = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[GAS_TRUCK_SETPIECE_ID])
|
|
//Control trailer playback.
|
|
IF NOT IS_ENTITY_DEAD(vehTanker)
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehTanker)
|
|
IF fChasePlaybackTime < SetPieceCarStartime[GAS_TRUCK_SETPIECE_ID] + 3000.0
|
|
REQUEST_VEHICLE_RECORDING(CARREC_GAS_TANKER, strCarrec)
|
|
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_GAS_TANKER, strCarrec)
|
|
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[GAS_TRUCK_SETPIECE_ID])
|
|
//START_PLAYBACK_RECORDED_VEHICLE_WITH_FLAGS(vehTanker, CARREC_GAS_TANKER, strCarrec, ENUM_TO_INT(SWITCH_ON_ANY_VEHICLE_IMPACT))
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehTanker, CARREC_GAS_TANKER, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehTanker, GET_TIME_POSITION_IN_RECORDING(SetPieceCarID[GAS_TRUCK_SETPIECE_ID]))
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SET_PLAYBACK_SPEED(vehTanker, fChasePlaybackSpeed)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(SetPieceCarID[COP_CRASH_SETPIECE_ID])
|
|
IF IS_ENTITY_TOUCHING_ENTITY(vehTanker, SetPieceCarID[COP_CRASH_SETPIECE_ID])
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[COP_CRASH_SETPIECE_ID])
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(SetPieceCarID[COP_CRASH_SETPIECE_ID])
|
|
ENDIF
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehTanker)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(vehTanker)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_GAS_TANKER, strCarrec)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
//ENDIF
|
|
ENDIF
|
|
|
|
IF eMissionStage = STAGE_CHASE
|
|
SWITCH iGasTankerExplosionEvent
|
|
CASE 0
|
|
bTankerCrashStreamActive = FALSE
|
|
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_EXPLOSION")
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehTanker)
|
|
AND NOT IS_ENTITY_DEAD(SetPieceCarID[COP_CRASH_SETPIECE_ID])
|
|
IF IS_ENTITY_TOUCHING_ENTITY(vehTanker, SetPieceCarID[COP_CRASH_SETPIECE_ID])
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_EXPLOSION")
|
|
PLAY_SOUND_FROM_ENTITY(-1, "Gas_Tanker_Explosion", vehTanker, "BIG_SCORE_3A_SOUNDS")
|
|
ENDIF
|
|
bTankerCrashStreamActive = TRUE
|
|
EXPLODE_VEHICLE(SetPieceCarID[COP_CRASH_SETPIECE_ID])
|
|
|
|
iGasTankerExplosionTimer = GET_GAME_TIMER()
|
|
iGasTankerExplosionEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF NOT IS_ENTITY_DEAD(vehTanker)
|
|
APPLY_FORCE_TO_ENTITY(vehTanker, APPLY_TYPE_FORCE, <<10.0, 0.0, 0.0>>, <<0.0, -5.0, 0.0>>, 0, TRUE, TRUE, TRUE)
|
|
|
|
IF GET_GAME_TIMER() - iGasTankerExplosionTimer > 300
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehTanker)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(vehTanker)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_GAS_TANKER, strCarrec)
|
|
ENDIF
|
|
|
|
//APPLY_FORCE_TO_ENTITY(vehTanker, APPLY_TYPE_IMPULSE, <<3.0, 0.0, 0.0>>, <<0.0, -5.0, 0.0>>, 0, TRUE, TRUE, TRUE)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(vehTanker, -200)
|
|
ADD_EXPLOSION(GET_ENTITY_COORDS(vehTanker), EXP_TAG_TRUCK, 2.0)
|
|
EXPLODE_VEHICLE(vehTanker)
|
|
|
|
IF NOT IS_ENTITY_DEAD(SetPieceCarID[GAS_TRUCK_SETPIECE_ID])
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(SetPieceCarID[GAS_TRUCK_SETPIECE_ID], -200)
|
|
EXPLODE_VEHICLE(SetPieceCarID[GAS_TRUCK_SETPIECE_ID])
|
|
ENDIF
|
|
|
|
REMOVE_VEHICLE(vehTanker, FALSE)
|
|
|
|
iGasTankerExplosionTimer = GET_GAME_TIMER()
|
|
iGasTankerExplosionEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF NOT IS_ENTITY_DEAD(SetPieceCarID[GAS_TRUCK_SETPIECE_ID])
|
|
IF GET_GAME_TIMER() - iGasTankerExplosionTimer > 200
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(SetPieceCarID[GAS_TRUCK_SETPIECE_ID], -200)
|
|
//EXPLODE_VEHICLE(SetPieceCarID[GAS_TRUCK_SETPIECE_ID])
|
|
|
|
iGasTankerExplosionTimer = GET_GAME_TIMER()
|
|
iGasTankerExplosionEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ELSE
|
|
IF fChasePlaybackTime > SetPieceCarStartime[GAS_TRUCK_SETPIECE_ID] + 20000.0
|
|
IF bTankerCrashStreamActive
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_EXPLOSION")
|
|
bTankerCrashStreamActive = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iGasTankerExplosionEvent = 0
|
|
iGasTankerExplosionTimer = 0
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
SCRIPT_ASSERT("BS2A - Gas truck setpiece has changed ID, please update script to match.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
//Make the gold cars invincible when the trailer blows up.
|
|
IF NOT bMichaelInvincibleDuringChase
|
|
IF fChasePlaybackTime > 69000.0
|
|
REPEAT COUNT_OF(sGoldCars) i
|
|
IF i != PLAYERS_GOLD_CAR
|
|
AND NOT IS_ENTITY_DEAD(sGoldCars[i].veh)
|
|
SET_ENTITY_INVINCIBLE(sGoldCars[i].veh, TRUE)
|
|
SET_ENTITY_PROOFS(sGoldCars[i].veh, TRUE, TRUE, TRUE, TRUE, TRUE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
bMichaelInvincibleDuringChase = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF fChasePlaybackTime > 73000.0
|
|
REPEAT COUNT_OF(sGoldCars) i
|
|
IF i != PLAYERS_GOLD_CAR
|
|
AND NOT IS_ENTITY_DEAD(sGoldCars[i].veh)
|
|
SET_ENTITY_INVINCIBLE(sGoldCars[i].veh, FALSE)
|
|
SET_ENTITY_PROOFS(sGoldCars[i].veh, FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
bMichaelInvincibleDuringChase = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC LOAD_ACTION_CAM_DATA()
|
|
sActionCams[0].iRecordingID = 950
|
|
sActionCams[0].fStartTime = 0.0
|
|
|
|
sActionCams[1].iRecordingID = 951
|
|
sActionCams[1].fStartTime = 79500.0000
|
|
ENDPROC
|
|
|
|
FUNC BOOL CHANGE_ACTION_CAM_ANGLE(VEHICLE_INDEX vehCameraCar, INT iNewCamRec, FLOAT fPlaybackTime, FLOAT fActionCamStartTime)
|
|
IF IS_VEHICLE_DRIVEABLE(vehCameraCar)
|
|
IF HAS_CAM_RECORDING_LOADED(iNewCamRec, strCarrec)
|
|
IF fPlaybackTime >= fActionCamStartTime
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(vehCameraCar)
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehCameraCar, iNewCamRec, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehCameraCar, fPlaybackTime - fActionCamStartTime)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehCameraCar)
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC UPDATE_CHASE_CAM(VEHICLE_INDEX &vehActionCamCar, CAMERA_INDEX &cam, FLOAT fPlaybackTime, FLOAT fPlaybackSpeed)
|
|
INT i = 0
|
|
REPEAT COUNT_OF(sActionCams) i
|
|
IF sActionCams[i].iRecordingID != 0
|
|
REQUEST_CAM_RECORDING(sActionCams[i].iRecordingID, strCarrec)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//PRINTLN(iCurrentActionCam)
|
|
|
|
SWITCH iCurrentActionCam
|
|
CASE 0
|
|
IF fPlaybackTime > 0.0
|
|
IF CHANGE_ACTION_CAM_ANGLE(vehActionCamCar, sActionCams[0].iRecordingID, fPlaybackTime, sActionCams[0].fStartTime)
|
|
SET_CAM_FOV(cam, 30.0)
|
|
iCurrentActionCam++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF fPlaybackTime > 87000.0
|
|
IF CHANGE_ACTION_CAM_ANGLE(vehActionCamCar, sActionCams[1].iRecordingID, fPlaybackTime, sActionCams[1].fStartTime)
|
|
SET_CAM_FOV(cam, 22.0)
|
|
iCurrentActionCam++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF fPlaybackTime > 93000.0
|
|
IF CHANGE_ACTION_CAM_ANGLE(vehActionCamCar, sActionCams[0].iRecordingID, fPlaybackTime, sActionCams[0].fStartTime)
|
|
SET_CAM_FOV(cam, 30.0)
|
|
iCurrentActionCam++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3 //Freeze the car once the recording runs out
|
|
IF IS_VEHICLE_DRIVEABLE(vehActionCamCar)
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehActionCamCar)
|
|
FREEZE_ENTITY_POSITION(vehActionCamCar, TRUE)
|
|
iCurrentActionCam++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehActionCamCar)
|
|
UPDATE_CAM_PLAYBACK(cam, vehActionCamCar, fPlaybackSpeed)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DO_CHASE_CAM(VEHICLE_INDEX veh1, VEHICLE_INDEX veh2)
|
|
BOOL bActionCamActivatedThisFrame = FALSE
|
|
BOOL bCamTurnedOffThisFrame = FALSE
|
|
|
|
IF IS_PHONE_ONSCREEN()
|
|
iCineCamPhoneTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
//Check to see if the hint cam is interping (NOTE: taken from chase_hint_cam.sch, as it needs to work in conjunction with the cinematic)
|
|
IF localChaseHintCamStruct.bHintInterpingIn AND IS_GAMEPLAY_HINT_ACTIVE()
|
|
IF GET_GAME_TIMER() > localChaseHintCamStruct.iInterpInTimer + iCHASE_HINT_INTERP_IN_TIME
|
|
localChaseHintCamStruct.bHintInterpingIn = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(vehCamCar)
|
|
REQUEST_MODEL(modelChaseCars)
|
|
|
|
REQUEST_CAM_RECORDING(sActionCams[0].iRecordingID, strCarrec)
|
|
|
|
IF HAS_MODEL_LOADED(modelChaseCars)
|
|
AND HAS_CAM_RECORDING_LOADED(sActionCams[0].iRecordingID, strCarrec)
|
|
vehCamCar = CREATE_VEHICLE(modelChaseCars, GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<0.0, 0.0, 5.0>>)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelChaseCars)
|
|
|
|
camChase = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
|
|
SHAKE_CAM(camChase, "SKY_DIVING_SHAKE", 0.15)
|
|
SET_CAM_FOV(camChase, 30.0)
|
|
SET_CAM_MOTION_BLUR_STRENGTH(camChase, 0.01)
|
|
|
|
START_CAM_PLAYBACK(camChase, vehCamCar, strCarrec, sActionCams[0].iRecordingID)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehCamCar, fChasePlaybackTime)
|
|
|
|
iCurrentActionCam = 0
|
|
ENDIF
|
|
ELSE
|
|
UPDATE_CHASE_CAM(vehCamCar, camChase, fChasePlaybackTime, fChasePlaybackSpeed)
|
|
ENDIF
|
|
|
|
IF fChasePlaybackTime > 3000.0 //Don't run at the start.
|
|
|
|
#IF IS_DEBUG_BUILD SCRIPT_ASSERT("PRIVATE_IsChaseHintCamButtonPressedInVehicle") #ENDIF
|
|
IF IS_VEHICLE_DRIVEABLE(veh1)
|
|
AND IS_VEHICLE_DRIVEABLE(veh2)
|
|
AND PRIVATE_IsChaseHintCamButtonPressedInVehicle()
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), veh2)
|
|
VECTOR vDriverPos = GET_ENTITY_COORDS(veh2)
|
|
VECTOR vTriggerPos = GET_ENTITY_COORDS(veh1)
|
|
|
|
FLOAT fDist = VDIST2(vDriverPos, vTriggerPos)
|
|
IF fDist < 2500.0 //50m
|
|
AND fChasePlaybackTime < 107000.0
|
|
IF NOT IS_GAMEPLAY_HINT_ACTIVE() AND NOT localChaseHintCamStruct.bHintInterpingBack
|
|
IF NOT IS_PHONE_ONSCREEN()
|
|
IF GET_GAME_TIMER() - iCineCamPhoneTimer > 1000
|
|
IF IS_VEHICLE_DRIVEABLE(vehCamCar)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehCamCar)
|
|
IF DOES_CAM_EXIST(camChase)
|
|
IF NOT IS_CAM_RENDERING(camChase)
|
|
SET_CAM_ACTIVE(camChase, TRUE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
bActionCamActivatedThisFrame = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//If the trigger car is too far away, use a chase hint cam instead of the cinematic cam.
|
|
IF DOES_CAM_EXIST(camChase)
|
|
IF IS_CAM_RENDERING(camChase)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
bCamTurnedOffThisFrame = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PHONE_ONSCREEN()
|
|
IF GET_GAME_TIMER() - iCineCamPhoneTimer > 1000
|
|
IF NOT IS_GAMEPLAY_HINT_ACTIVE()
|
|
StartVehicleChaseHintCam(veh1)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Clean up cinematic cam
|
|
IF DOES_CAM_EXIST(camChase)
|
|
IF IS_CAM_RENDERING(camChase)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
bCamTurnedOffThisFrame = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Clean up chase cam (NOTE: taken from chase_hint_cam.sch, as it needs to be integrated with the cinematic cam)
|
|
IF IS_GAMEPLAY_HINT_ACTIVE()
|
|
IF NOT localChaseHintCamStruct.bHintInterpingBack AND NOT localChaseHintCamStruct.bHintInterpingIn
|
|
STOP_GAMEPLAY_HINT()
|
|
SET_GAMEPLAY_ENTITY_HINT(veh1, <<0,0,0>>, TRUE, 0, 0, 500)
|
|
|
|
localChaseHintCamStruct.bHintInterpingBack = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF localChaseHintCamStruct.bHintInterpingBack
|
|
SET_CINEMATIC_BUTTON_ACTIVE(TRUE)
|
|
|
|
localChaseHintCamStruct.bHintInterpingBack = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//One of the cam recordings is inside Michael's car, make it invisible during this time.
|
|
IF NOT IS_ENTITY_DEAD(sGoldCars[0].veh)
|
|
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF ((DOES_CAM_EXIST(camChase) AND IS_CAM_RENDERING(camChase)) OR bActionCamActivatedThisFrame)
|
|
AND VDIST2(GET_ENTITY_COORDS(sGoldCars[0].veh), GET_CAM_COORD(camChase)) < 25.0
|
|
AND NOT bCamTurnedOffThisFrame
|
|
IF IS_ENTITY_VISIBLE(sGoldCars[0].veh)
|
|
SET_ENTITY_VISIBLE(sGoldCars[0].veh, FALSE)
|
|
SET_ENTITY_VISIBLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_VISIBLE(sGoldCars[0].veh)
|
|
SET_ENTITY_VISIBLE(sGoldCars[0].veh, TRUE)
|
|
SET_ENTITY_VISIBLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
///Fail cleanup cannot delete peds in the same group/vehicle as the player, so use this to force delete them.
|
|
PROC FORCE_DELETE_PED_FOR_FAIL(PED_INDEX ped)
|
|
IF NOT IS_ENTITY_DEAD(ped)
|
|
IF IS_PED_GROUP_MEMBER(ped, PLAYER_GROUP_ID())
|
|
OR ARE_CHARS_IN_SAME_VEHICLE(PLAYER_PED_ID(), ped)
|
|
REMOVE_PED(ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SET_HEIST_CREW_END_SCREEN_STATUSES()
|
|
INT i
|
|
REPEAT GET_HEIST_CREW_SIZE(HEIST_FINALE) i
|
|
IF i = CREW_DRIVER
|
|
IF bPickedGoodCarDriver
|
|
OR g_bBigScore2ARescuedBadDriver
|
|
SET_HEIST_END_SCREEN_CREW_STATUS(HEIST_FINALE, GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, i), CMST_FINE)
|
|
ELSE
|
|
SET_HEIST_END_SCREEN_CREW_STATUS(HEIST_FINALE, GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, i), CMST_KILLED)
|
|
ENDIF
|
|
ELSE
|
|
SET_HEIST_END_SCREEN_CREW_STATUS(HEIST_FINALE, GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, i), CMST_FINE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
PROC SET_END_SCREEN_TAKE()
|
|
SET_HEIST_CREW_END_SCREEN_STATUSES()
|
|
|
|
SET_HEIST_END_SCREEN_POTENTIAL_TAKE(HEIST_FINALE, MAX_OVERALL_TAKE)
|
|
SET_HEIST_END_SCREEN_ACTUAL_TAKE(HEIST_FINALE, MAX_OVERALL_TAKE)
|
|
|
|
ADD_PENALTY_TO_HEIST(HEIST_FINALE, HEIST_PENALTY_BIGS_SLOW_LOADING, iTakePenaltyDropGold)
|
|
ADD_PENALTY_TO_HEIST(HEIST_FINALE, HEIST_PENALTY_MONEY_DROPPED, iTakePenaltyCrewDies)
|
|
ADD_PENALTY_TO_HEIST(HEIST_FINALE, HEIST_PENALTY_HOSTAGE_GIFT, iTakePenaltyCaseysCut)
|
|
ENDPROC
|
|
|
|
PROC MISSION_PASSED(BOOL bIsDebugPass = FALSE, BOOL bPassScreenAlreadyDisplayed = FALSE)
|
|
IF bIsDebugPass
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT HAS_CUTSCENE_FINISHED()
|
|
STOP_CUTSCENE()
|
|
ENDIF
|
|
|
|
REMOVE_CUTSCENE()
|
|
|
|
WHILE IS_CUTSCENE_ACTIVE()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
#ENDIF
|
|
|
|
iCurrentTake = iMaxTakeConsideringCrew
|
|
ENDIF
|
|
|
|
IF NOT bPassScreenAlreadyDisplayed
|
|
SET_END_SCREEN_TAKE()
|
|
ENDIF
|
|
|
|
AWARD_ACHIEVEMENT_FOR_MISSION(ACH09) // The Big One
|
|
Mission_Flow_Mission_Passed()
|
|
|
|
MISSION_CLEANUP()
|
|
ENDPROC
|
|
|
|
PROC MISSION_FAILED(FAILED_REASON reason)
|
|
IF NOT bMissionFailed
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
REMOVE_ALL_BLIPS()
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
KILL_ANY_CONVERSATION()
|
|
CLEANUP_PC_CONTROLS()
|
|
|
|
IF bCustomGPSActive
|
|
SET_GPS_CUSTOM_ROUTE_RENDER(FALSE, 18, 30)
|
|
CLEAR_GPS_CUSTOM_ROUTE()
|
|
bCustomGPSActive = FALSE
|
|
ENDIF
|
|
|
|
//Have the security attack the player on fail.
|
|
IF reason = FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS
|
|
OR reason = FAILED_ALERTED_BANK_BY_KILLING_SECURITY
|
|
OR reason = FAILED_ALERTED_BANK_VIA_GPS
|
|
IF NOT IS_PED_INJURED(pedGateSecurity)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(pedGateSecurity, NORMAL_BLEND_OUT, TRUE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(pedGateSecurity, relGroupCops)
|
|
TASK_COMBAT_PED(pedGateSecurity, PLAYER_PED_ID())
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedGateSecurity, FALSE)
|
|
SET_PED_KEEP_TASK(pedGateSecurity, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Have the security guys in the vans flee.
|
|
IF reason = FAILED_SPOOKED_VAN_PEDS
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[0].ped)
|
|
TASK_VEHICLE_MISSION_PED_TARGET(sGoldVanPeds[0].ped, sGoldVans[0].veh, PLAYER_PED_ID(), MISSION_FLEE, 70.0, DRIVINGMODE_AVOIDCARS_RECKLESS, 300.0, 300.0, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[0].ped, FALSE)
|
|
SET_PED_KEEP_TASK(sGoldVanPeds[0].ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[2].ped)
|
|
TASK_VEHICLE_MISSION_PED_TARGET(sGoldVanPeds[2].ped, sGoldVans[1].veh, PLAYER_PED_ID(), MISSION_FLEE, 70.0, DRIVINGMODE_AVOIDCARS_RECKLESS, 300.0, 300.0, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[2].ped, FALSE)
|
|
SET_PED_KEEP_TASK(sGoldVanPeds[2].ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(objFakeVaultDoor)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(objFakeVaultDoor, NORMAL_BLEND_OUT, TRUE)
|
|
FREEZE_ENTITY_POSITION(objFakeVaultDoor, TRUE)
|
|
ENDIF
|
|
|
|
SWITCH reason
|
|
CASE FAILED_GENERIC
|
|
strFailLabel = ""
|
|
BREAK
|
|
|
|
CASE FAILED_ALERTED_BANK_BY_KILLING_SECURITY
|
|
strFailLabel = "F3A_BANKFAIL1"
|
|
BREAK
|
|
|
|
CASE FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS
|
|
strFailLabel = "F3A_BANKFAIL2"
|
|
BREAK
|
|
|
|
CASE FAILED_ALERTED_BANK_VIA_GPS
|
|
strFailLabel = "F3A_BANKFAIL3"
|
|
BREAK
|
|
|
|
CASE FAILED_ALL_SECURITY_WORKERS_DEAD
|
|
strFailLabel = "F3A_SECDEAD3"
|
|
BREAK
|
|
|
|
CASE FAILED_CAUGHT_DURING_TRAFFIC_CONTROL
|
|
strFailLabel = "F3A_TRAFFAIL"
|
|
BREAK
|
|
|
|
CASE FAILED_CREW_MEMBER_DIED
|
|
strFailLabel = "F3A_CREWDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_CREW_MEMBERS_DIED
|
|
strFailLabel = "F3A_CREWDEAD2"
|
|
BREAK
|
|
|
|
CASE FAILED_FRANKLIN_DIED
|
|
strFailLabel = "F3A_FRANDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_GOLD_CAR_DESTROYED
|
|
strFailLabel = "F3A_CARDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_GOLD_CARS_DESTROYED
|
|
strFailLabel = "F3A_CARSDEAD2"
|
|
BREAK
|
|
|
|
CASE FAILED_GOLD_TRUCK_DESTROYED
|
|
strFailLabel = "F3A_VANDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_GOLD_TRUCKS_DESTROYED
|
|
strFailLabel = "F3A_VANSDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_LOST_BUDDIES
|
|
strFailLabel = "F3A_LOSTMICH"
|
|
BREAK
|
|
|
|
CASE FAILED_MICHAEL_DIED
|
|
strFailLabel = "F3A_MICHDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_MISSED_STINGER
|
|
strFailLabel = "F3A_STINGERMISS"
|
|
BREAK
|
|
|
|
CASE FAILED_STINGER_NOT_IN_TIME
|
|
strFailLabel = "F3A_STINGERFAIL"
|
|
BREAK
|
|
|
|
CASE FAILED_SECURITY_WORKER_DEAD
|
|
strFailLabel = "F3A_SECDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_SOME_GOLD_CARS_DESTROYED
|
|
strFailLabel = "F3A_CARSDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_SOME_SECURITY_WORKERS_DEAD
|
|
strFailLabel = "F3A_SECDEAD2"
|
|
BREAK
|
|
|
|
CASE FAILED_SPOOKED_VAN_PEDS
|
|
strFailLabel = "F3A_SPOOKVAN"
|
|
BREAK
|
|
|
|
CASE FAILED_START_CAR_DESTROYED
|
|
strFailLabel = "F3A_CARDEAD2"
|
|
BREAK
|
|
|
|
CASE FAILED_TREVOR_DIED
|
|
strFailLabel = "F3A_TREVDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_MISSED_TRUCKS
|
|
strFailLabel = "F3A_TRUCKFAIL"
|
|
BREAK
|
|
|
|
CASE FAILED_CAR_STUCK
|
|
strFailLabel = "F3A_CARSTUCK"
|
|
BREAK
|
|
|
|
CASE FAILED_VAN_STUCK
|
|
strFailLabel = "F3A_VANSTUCK"
|
|
BREAK
|
|
|
|
CASE FAILED_LEFT_FRANKLIN_BEHIND
|
|
strFailLabel = "F3A_LEFTCREWF"
|
|
BREAK
|
|
|
|
CASE FAILED_LEFT_MICHAEL_BEHIND
|
|
strFailLabel = "F3A_LEFTMICHF"
|
|
BREAK
|
|
|
|
CASE FAILED_LEFT_TREVOR_BEHIND
|
|
strFailLabel = "F3A_LEFTTREVF"
|
|
BREAK
|
|
|
|
CASE FAILED_LEFT_CREW_BEHIND
|
|
strFailLabel = "F3A_LEFTCREW2"
|
|
BREAK
|
|
|
|
CASE FAILED_MISSED_TUNNEL
|
|
strFailLabel = "F3A_TUNNELFAIL"
|
|
BREAK
|
|
|
|
CASE FAILED_DESTROYED_FRANKLINS_BIKE
|
|
strFailLabel = "F3A_BIKEFAIL"
|
|
BREAK
|
|
|
|
CASE FAILED_BANK_WORKER_DEAD
|
|
strFailLabel = "F3A_BANKDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_SPOOKED_BANK_WORKERS
|
|
strFailLabel = "F3A_SPOOKBANK"
|
|
BREAK
|
|
|
|
CASE FAILED_ALERTED_COPS
|
|
strFailLabel = "F3A_COPSALERT"
|
|
BREAK
|
|
|
|
CASE FAILED_ABANDONED_SHOOTOUT_CREW
|
|
strFailLabel = "F3A_FABANCREW"
|
|
BREAK
|
|
|
|
CASE FAILED_ABANDONED_CAR
|
|
strFailLabel = "F3A_CARABAN"
|
|
BREAK
|
|
|
|
CASE FAILED_MICHAEL_VAN_TOO_DAMAGED
|
|
strFailLabel = "F3A_VANDAMM"
|
|
BREAK
|
|
|
|
CASE FAILED_TREVOR_VAN_TOO_DAMAGED
|
|
strFailLabel = "F3A_VANDAMT"
|
|
BREAK
|
|
|
|
CASE FAILED_TRUCK_DRIVER_DIED
|
|
strFailLabel = "F3A_TRUCKDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_LESTER_DIED
|
|
strFailLabel = "F3A_LESTDEAD"
|
|
BREAK
|
|
|
|
CASE FAILED_COPS_SPOTTED_TRANSFER
|
|
strFailLabel = "F3A_COPSPOT"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
bMissionFailed = TRUE
|
|
ENDIF
|
|
|
|
//For certain fails: display a 5 star wanted level before failing.
|
|
IF reason = FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS
|
|
OR reason = FAILED_ALERTED_BANK_BY_KILLING_SECURITY
|
|
OR reason = FAILED_ALERTED_BANK_VIA_GPS
|
|
OR reason = FAILED_ALERTED_COPS
|
|
SETTIMERA(0)
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 5)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
|
|
WHILE TIMERA() < 2000
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2A_MISSION_FAIL")
|
|
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON(strFailLabel)
|
|
|
|
WHILE NOT GET_MISSION_FLOW_SAFE_TO_CLEANUP()
|
|
//Maintain anything that could look weird during fade out (e.g. enemies walking off).
|
|
IF eMissionStage = STAGE_SET_UP_STINGER
|
|
UPDATE_FRANKLIN_ON_BIKE()
|
|
ELIF eMissionStage = STAGE_CHASE
|
|
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
|
|
UPDATE_UBER_PLAYBACK(vehChaseTrigger, fChasePlaybackSpeed)
|
|
UPDATE_CHASE_SET_PIECES()
|
|
ELIF eMissionStage = STAGE_TRAFFIC_CONTROL
|
|
UPDATE_TRAFFIC_GAME()
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
|
|
|
|
IF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_MICHAEL)
|
|
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL, bHasChangedClothesMichael)
|
|
ELIF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
|
|
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN, bHasChangedClothesFranklin)
|
|
ELIF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
|
|
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR, bHasChangedClothesTrevor)
|
|
ENDIF
|
|
|
|
FORCE_DELETE_PED_FOR_FAIL(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
FORCE_DELETE_PED_FOR_FAIL(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
FORCE_DELETE_PED_FOR_FAIL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
FORCE_DELETE_PED_FOR_FAIL(sCrew[CREW_DRIVER].ped)
|
|
FORCE_DELETE_PED_FOR_FAIL(sCrew[CREW_FORCED_GUNMAN].ped)
|
|
FORCE_DELETE_PED_FOR_FAIL(sCrew[CREW_FORCED_DRIVER].ped)
|
|
FORCE_DELETE_PED_FOR_FAIL(sCrew[CREW_GUNMAN].ped)
|
|
FORCE_DELETE_PED_FOR_FAIL(sGoldVanPeds[CASEY_ID].ped)
|
|
|
|
//Fail warps.
|
|
IF eMissionStage >= STAGE_DRIVE_TO_BANK AND eMissionStage < STAGE_LEAVE_BANK
|
|
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<-116.6126, -652.7636, 34.8438>>, 233.8351)
|
|
ELIF eMissionStage = STAGE_LEAVE_BANK OR eMissionStage = STAGE_SWAP_TO_FRANKLIN_CUTSCENE
|
|
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<69.5240, -617.6522, 30.6806>>, 134.0472)
|
|
ELIF eMissionStage = STAGE_TRAFFIC_CONTROL
|
|
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<144.6931, -1300.7626, 28.0422>>, 115.3229)
|
|
ENDIF
|
|
|
|
// check if we need to respawn the player in a different position,
|
|
// if so call MISSION_FLOW_SET_FAIL_WARP_LOCATION() + SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION here
|
|
//MISSION_FLOW_SET_FAIL_WARP_LOCATION(<< 144.2238, -1311.4945, 28.0306 >>, 53.4660)
|
|
//SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<< 145.1657, -1304.0176, 28.0517 >>, 118.8119)
|
|
|
|
MISSION_CLEANUP() // must only take 1 frame and terminate the thread
|
|
ENDPROC
|
|
|
|
//Manages the AI-controlled cops that spawn during the chase and are tasked to take out the player.
|
|
PROC UPDATE_CHASE_COPS()
|
|
VECTOR vCopSpawnPos
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
FLOAT fCopSpawnHeading
|
|
FLOAT fDistToPlayer
|
|
|
|
REQUEST_MODEL(modelCop)
|
|
REQUEST_MODEL(modelCopCar)
|
|
|
|
BOOL bRemoveCar = FALSE
|
|
BOOL bEntitySpawnedThisFrame = FALSE
|
|
INT iDriverIndex
|
|
INT iPassengerIndex
|
|
INT i = 0
|
|
|
|
bSafeToDriveOntoTrucks = TRUE
|
|
|
|
REPEAT COUNT_OF(vehChaseCops) i
|
|
iDriverIndex = i * 2
|
|
iPassengerIndex = iDriverIndex + 1
|
|
|
|
IF NOT DOES_ENTITY_EXIST(vehChaseCops[i])
|
|
//Create more cops once other ones are killed.
|
|
IF fChasePlaybackTime > 12000.0
|
|
AND fChasePlaybackTime < 77500.0
|
|
AND NOT bCreatedUberPlaybackEntityThisFrame
|
|
AND NOT bEntitySpawnedThisFrame
|
|
IF HAS_MODEL_LOADED(modelCop)
|
|
AND HAS_MODEL_LOADED(modelCopCar)
|
|
IF (fChasePlaybackTime < 70000.0 AND GET_COP_SPAWN_POS_FROM_PLAYER(vCopSpawnPos, fCopSpawnHeading, i, 40.0))
|
|
OR (fChasePlaybackTime > 70000.0 AND GET_COP_SPAWN_POS_FROM_PLAYER(vCopSpawnPos, fCopSpawnHeading, i, 60.0))
|
|
CLEAR_AREA(vCopSpawnPos, 3.0, TRUE)
|
|
|
|
vehChaseCops[i] = CREATE_VEHICLE(modelCopCar, vCopSpawnPos, fCopSpawnHeading)
|
|
sChaseCops[iDriverIndex].ped = CREATE_PED_INSIDE_VEHICLE(vehChaseCops[i], PEDTYPE_COP, modelCop)
|
|
//sChaseCops[iPassengerIndex].ped = CREATE_PED_INSIDE_VEHICLE(vehChaseCops[i], PEDTYPE_COP, modelCop, VS_FRONT_RIGHT)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCops[iDriverIndex].ped, TRUE)
|
|
//SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCops[iPassengerIndex].ped, TRUE)
|
|
GIVE_WEAPON_TO_PED(sChaseCops[iDriverIndex].ped, WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE, TRUE)
|
|
//GIVE_WEAPON_TO_PED(sChaseCops[iPassengerIndex].ped, WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE, TRUE)
|
|
sChaseCops[iDriverIndex].iEvent = 0
|
|
//sChaseCops[iPassengerIndex].iEvent = 0
|
|
|
|
SET_VEHICLE_ENGINE_ON(vehChaseCops[i], TRUE, TRUE)
|
|
SET_VEHICLE_SIREN(vehChaseCops[i], TRUE)
|
|
SET_SIREN_WITH_NO_DRIVER(vehChaseCops[i], TRUE)
|
|
SET_VEHICLE_LIGHTS(vehChaseCops[i], FORCE_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_FORWARD_SPEED(vehChaseCops[i], 30.0)
|
|
|
|
iTimeSinceLastChaseCopKilled = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(500, 1000)
|
|
bEntitySpawnedThisFrame = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bRemoveCar = FALSE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehChaseCops[i])
|
|
fDistToPlayer = VDIST2(GET_ENTITY_COORDS(vehChaseCops[i]), vPlayerPos)
|
|
|
|
//Driver: chases the player, if the car is close enough to the player they get out and combat on foot.
|
|
IF NOT IS_PED_INJURED(sChaseCops[iDriverIndex].ped)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
IF sChaseCops[iDriverIndex].iEvent = 0 //In car
|
|
IF NOT IS_PED_IN_VEHICLE(sChaseCops[iDriverIndex].ped, vehChaseCops[i], TRUE)
|
|
IF GET_SCRIPT_TASK_STATUS(sChaseCops[iDriverIndex].ped, SCRIPT_TASK_ENTER_VEHICLE) = FINISHED_TASK
|
|
AND IS_VEHICLE_SEAT_FREE(vehChaseCops[i], VS_DRIVER)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCops[iDriverIndex].ped, TRUE)
|
|
TASK_ENTER_VEHICLE(sChaseCops[iDriverIndex].ped, vehChaseCops[i], DEFAULT_TIME_BEFORE_WARP, VS_DRIVER)
|
|
ENDIF
|
|
ELIF IS_PED_SITTING_IN_VEHICLE(sChaseCops[iDriverIndex].ped, vehChaseCops[i])
|
|
AND ((NOT IS_PED_INJURED(sChaseCops[iPassengerIndex].ped) AND IS_PED_SITTING_IN_VEHICLE(sChaseCops[iPassengerIndex].ped, vehChaseCops[i]))
|
|
OR IS_PED_INJURED(sChaseCops[iPassengerIndex].ped))
|
|
IF GET_SCRIPT_TASK_STATUS(sChaseCops[iDriverIndex].ped, SCRIPT_TASK_VEHICLE_MISSION) != PERFORMING_TASK
|
|
SET_PED_COMBAT_ATTRIBUTES(sChaseCops[iDriverIndex].ped, CA_LEAVE_VEHICLES, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sChaseCops[iDriverIndex].ped, CA_USE_VEHICLE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sChaseCops[iDriverIndex].ped, CA_DO_DRIVEBYS, FALSE)
|
|
//TASK_VEHICLE_MISSION(sChaseCops[iDriverIndex].ped, vehChaseCops[i], sGoldCars[PLAYERS_GOLD_CAR].veh, MISSION_ATTACK, 50.0, DRIVINGMODE_AVOIDCARS_RECKLESS, 1.0, 1.0)
|
|
TASK_COMBAT_PED(sChaseCops[iDriverIndex].ped, PLAYER_PED_ID())
|
|
// TASK_DRIVE_BY(sChaseCops[iDriverIndex].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 100, TRUE)
|
|
//TASK_COMBAT_PED(sChaseCops[iDriverIndex].ped, PLAYER_PED_ID())
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCops[iDriverIndex].ped, TRUE)
|
|
ELSE
|
|
IF fChasePlaybackTime < 82500.0
|
|
SET_DRIVE_TASK_CRUISE_SPEED(sChaseCops[iDriverIndex].ped, CLAMP(3.0 * SQRT(fDistToPlayer), 50.0, 120.0))
|
|
ELSE
|
|
SET_DRIVE_TASK_CRUISE_SPEED(sChaseCops[iDriverIndex].ped, CLAMP(3.0 * SQRT(fDistToPlayer), 5.0, 15.0))
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Make it really hard for the cars to catch up with the player once reaching the end of the chase.
|
|
IF fChasePlaybackTime > 82500.0
|
|
MODIFY_VEHICLE_TOP_SPEED(vehChaseCops[i], -50.0)
|
|
|
|
IF NOT IS_VEHICLE_TYRE_BURST(vehChaseCops[i], SC_WHEEL_CAR_FRONT_LEFT)
|
|
IF GET_RANDOM_INT_IN_RANGE(0, 10) = 5
|
|
SET_VEHICLE_TYRE_BURST(vehChaseCops[i], SC_WHEEL_CAR_FRONT_LEFT, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fDistToPlayer < 900.0
|
|
IF GET_GAME_TIMER() - sChaseCops[iDriverIndex].iTimer > 0
|
|
PLAY_PED_AMBIENT_SPEECH(sChaseCops[iDriverIndex].ped, "STOP_VEHICLE_CAR_MEGAPHONE", SPEECH_PARAMS_FORCE_MEGAPHONE)
|
|
sChaseCops[iDriverIndex].iTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7000, 10000)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fDistToPlayer < 400.0
|
|
IF GET_GAME_TIMER() - iSirenBlipTimer > 0
|
|
PLAY_SOUND_FROM_ENTITY(-1, "SIREN_BLIP", vehChaseCops[i], "BIG_SCORE_3A_SOUNDS")
|
|
iSirenBlipTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 15000)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fDistToPlayer < 289.0
|
|
AND GET_ENTITY_SPEED(sGoldCars[PLAYERS_GOLD_CAR].veh) < 3.0
|
|
CLEAR_PED_TASKS(sChaseCops[iDriverIndex].ped)
|
|
sChaseCops[iDriverIndex].iEvent++
|
|
ENDIF
|
|
ELSE //On foot
|
|
IF GET_SCRIPT_TASK_STATUS(sChaseCops[iDriverIndex].ped, SCRIPT_TASK_ARREST_PED) != PERFORMING_TASK
|
|
SET_PED_COMBAT_ATTRIBUTES(sChaseCops[iDriverIndex].ped, CA_LEAVE_VEHICLES, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sChaseCops[iDriverIndex].ped, CA_USE_VEHICLE, FALSE)
|
|
//TASK_COMBAT_PED(sChaseCops[iDriverIndex].ped, PLAYER_PED_ID())
|
|
TASK_ARREST_PED(sChaseCops[iDriverIndex].ped, PLAYER_PED_ID())
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCops[iDriverIndex].ped, TRUE)
|
|
ENDIF
|
|
|
|
IF fDistToPlayer > 400.0
|
|
OR GET_ENTITY_SPEED(sGoldCars[PLAYERS_GOLD_CAR].veh) > 5.0
|
|
CLEAR_PED_TASKS(sChaseCops[iDriverIndex].ped)
|
|
sChaseCops[iDriverIndex].iEvent = 0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail the mission if one of the AI cops spots the crew loading the cars onto the trucks.
|
|
IF fDistToPlayer < 1600.0
|
|
bSafeToDriveOntoTrucks = FALSE //This dictates if the god text will play
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
|
|
IF VDIST2(vPlayerPos, GET_ENTITY_COORDS(vehTrailer[0])) < 1600.0
|
|
MISSION_FAILED(FAILED_COPS_SPOTTED_TRANSFER)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bSafeToDriveOntoTrucks
|
|
//Do god text and dialogue if the player is nearing the end of the chase and there are still cop cars on them.
|
|
IF fChasePlaybackTime > 84000.0
|
|
AND fChasePlaybackSpeed > 0.7
|
|
IF iCopsTailingFranklinEvent = 0
|
|
IF fDistToPlayer < 900.0
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LOSECOP", CONV_PRIORITY_MEDIUM)
|
|
iCopsTailingFranklinEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF iCopsTailingFranklinEvent = 1
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("F3A_LOSECOPS", DEFAULT_GOD_TEXT_TIME, 0)
|
|
iCopsTailingFranklinEvent++
|
|
ENDIF
|
|
ELSE
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fDistToPlayer > 15000.0
|
|
//Remove the car if it's lost by the player.
|
|
bRemoveCar = TRUE
|
|
ELIF fDistToPlayer < 100.0
|
|
//Play dialogue if a cop car rams the player.
|
|
IF GET_GAME_TIMER() - iFranklinHitCopDialogueTimer > 0
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
AND GET_ENTITY_SPEED(sGoldCars[PLAYERS_GOLD_CAR].veh) > 5.0
|
|
AND IS_ENTITY_TOUCHING_ENTITY(vehChaseCops[i], sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RAMMED2", CONV_PRIORITY_MEDIUM)
|
|
iFranklinHitCopDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(12000, 15000)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bRemoveCar = TRUE
|
|
ENDIF
|
|
|
|
//Passenger: does drive-bys (passengers are currently disabled due to CPU time issues).
|
|
IF NOT IS_PED_INJURED(sChaseCops[iPassengerIndex].ped)
|
|
IF sChaseCops[iPassengerIndex].iEvent = 0 //In car
|
|
IF NOT IS_PED_IN_VEHICLE(sChaseCops[iPassengerIndex].ped, vehChaseCops[i], TRUE)
|
|
IF GET_SCRIPT_TASK_STATUS(sChaseCops[iPassengerIndex].ped, SCRIPT_TASK_ENTER_VEHICLE) = FINISHED_TASK
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCops[iPassengerIndex].ped, TRUE)
|
|
TASK_ENTER_VEHICLE(sChaseCops[iPassengerIndex].ped, vehChaseCops[i], DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
ELIF IS_PED_SITTING_IN_VEHICLE(sChaseCops[iPassengerIndex].ped, vehChaseCops[i])
|
|
IF GET_SCRIPT_TASK_STATUS(sChaseCops[iPassengerIndex].ped, SCRIPT_TASK_DRIVE_BY) = FINISHED_TASK
|
|
SET_PED_COMBAT_ATTRIBUTES(sChaseCops[iPassengerIndex].ped, CA_LEAVE_VEHICLES, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sChaseCops[iPassengerIndex].ped, CA_USE_VEHICLE, TRUE)
|
|
SET_PED_ACCURACY(sChaseCops[iPassengerIndex].ped, 10)
|
|
TASK_DRIVE_BY(sChaseCops[iPassengerIndex].ped, PLAYER_PED_ID(), NULL, <<0.0, 0.0, 0.0>>, 200.0, 100)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCops[iPassengerIndex].ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fDistToPlayer < 289.0
|
|
CLEAR_PED_TASKS(sChaseCops[iPassengerIndex].ped)
|
|
sChaseCops[iPassengerIndex].iEvent++
|
|
ENDIF
|
|
ELSE //On foot
|
|
IF GET_SCRIPT_TASK_STATUS(sChaseCops[iPassengerIndex].ped, SCRIPT_TASK_ARREST_PED) != PERFORMING_TASK
|
|
SET_PED_COMBAT_ATTRIBUTES(sChaseCops[iPassengerIndex].ped, CA_LEAVE_VEHICLES, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sChaseCops[iPassengerIndex].ped, CA_USE_VEHICLE, FALSE)
|
|
//TASK_COMBAT_PED(sChaseCops[iPassengerIndex].ped, PLAYER_PED_ID())
|
|
TASK_ARREST_PED(sChaseCops[iPassengerIndex].ped, PLAYER_PED_ID())
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sChaseCops[iPassengerIndex].ped, TRUE)
|
|
ENDIF
|
|
|
|
IF fDistToPlayer > 400.0
|
|
CLEAR_PED_TASKS(sChaseCops[iPassengerIndex].ped)
|
|
sChaseCops[iPassengerIndex].iEvent = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bRemoveCar = TRUE
|
|
ENDIF
|
|
|
|
IF bRemoveCar
|
|
IF GET_GAME_TIMER() - iTimeSinceLastChaseCopKilled > 0
|
|
iTimeSinceLastChaseCopKilled = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(500, 1000)
|
|
ENDIF
|
|
|
|
REMOVE_PED(sChaseCops[iDriverIndex].ped)
|
|
REMOVE_PED(sChaseCops[iPassengerIndex].ped)
|
|
REMOVE_VEHICLE(vehChaseCops[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
PROC DO_START_CUTSCENE()
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
|
|
|
|
IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) = CHAR_TREVOR
|
|
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_PROPS, PROPS_P2_HEADSET)
|
|
ELIF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) = CHAR_MICHAEL
|
|
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_PROPS, PROPS_P0_HEADSET)
|
|
ELSE
|
|
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_FRANKLIN), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
|
|
ENDIF
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) = CHAR_TREVOR
|
|
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("bs_2a_mcs_10", CS_SECTION_1 | CS_SECTION_2 | CS_SECTION_3 | CS_SECTION_4 | CS_SECTION_5)
|
|
ELIF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) = CHAR_MICHAEL
|
|
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("bs_2a_mcs_10", CS_SECTION_2 | CS_SECTION_3 | CS_SECTION_4 | CS_SECTION_5)
|
|
ELSE
|
|
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("bs_2a_mcs_10", CS_SECTION_3 | CS_SECTION_4 | CS_SECTION_5)
|
|
ENDIF
|
|
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
//REQUEST_CUTSCENE("bs_2a_mcs_10")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_10")
|
|
|
|
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
|
|
|
|
IF iCurrentEvent < 99
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
AND NOT g_FH2_bTimelapseTriggeredInside
|
|
IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(<<0.0, 0.0, 0.0>>, TRUE)
|
|
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<<151.2816, -1309.2737, 28.2024>>, 65.7988)
|
|
ENDIF
|
|
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<129.082687,-1299.175659,28.232706>>, <<136.970322,-1312.649536,33.186874>>, 19.750000, <<151.2816, -1309.2737, 28.2024>>, 65.7988,
|
|
GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
|
|
|
|
CLEAR_AREA_OF_PEDS(<<-17.1615, -1439.0176, 30.1015>>, 400.0)
|
|
CLEAR_AREA_OF_OBJECTS(<<-17.1615, -1439.0176, 30.1015>>, 400.0)
|
|
CLEAR_AREA_OF_PROJECTILES(<<-17.1615, -1439.0176, 30.1015>>, 400.0)
|
|
CLEAR_AREA_OF_VEHICLES(<<-17.1615, -1439.0176, 30.1015>>, 400.0, TRUE)
|
|
REMOVE_PARTICLE_FX_IN_RANGE(<<-17.1615, -1439.0176, 30.1015>>, 50.0)
|
|
|
|
structTimelapseSettings sTimelapseSettings
|
|
GET_SP_MISSION_TOD_CUTSCENE_ATTRIBUTES(SP_HEIST_FINALE_2A, sTimelapseSettings)
|
|
|
|
DESTROY_ALL_CAMS()
|
|
camMain = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<147.032776,-1310.506592,29.858635>>, <<10.395594,-0.000021,49.974117>>, 39.402699, TRUE)
|
|
SET_CAM_PARAMS(camMain, sTimelapseSettings.vCamPos1, sTimelapseSettings.vCamRot1, sTimelapseSettings.fCamFOV, 3000, GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
SETTIMERB(0)
|
|
iCurrentEvent = 99
|
|
ELSE
|
|
SETTIMERB(0)
|
|
iCurrentEvent = 99
|
|
ENDIF
|
|
ELIF iCurrentEvent = 99
|
|
IF TIMERB() > 3000
|
|
OR IS_SCREEN_FADED_OUT()
|
|
OR g_FH2_bTimelapseTriggeredInside
|
|
IF DO_TIMELAPSE(SP_HEIST_FINALE_2A, sTimelapse, FALSE, FALSE)
|
|
iCurrentEvent = 100
|
|
ENDIF
|
|
|
|
IF iTimelapseTimer = 0
|
|
iTimelapseTimer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - iTimelapseTimer > 100 AND GET_GAME_TIMER() - iTimelapseTimer < 200
|
|
DISABLE_STRIP_CLUBS()
|
|
iTimelapseTimer = 1
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
AND NOT IS_SCREEN_FADING_OUT()
|
|
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
ENDIF
|
|
ELIF iCurrentEvent = 100
|
|
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
|
|
IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) != CHAR_TREVOR
|
|
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "Trevor", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_TREVOR))
|
|
ENDIF
|
|
|
|
IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) != CHAR_MICHAEL
|
|
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "Michael", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_MICHAEL))
|
|
ENDIF
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "gunman_selection_1", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_CREW_MEMBER_MODEL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_GUNMAN)))
|
|
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "EXL_2_abandoned_car", CU_DONT_ANIMATE_ENTITY, modelStartCar)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
START_CUTSCENE()
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
sCrew[CREW_GUNMAN].iEvent = 0
|
|
sCrew[CREW_DRIVER].iEvent = 0
|
|
sMichael.iEvent = 0
|
|
sTrevor.iEvent = 0
|
|
|
|
bPreloadedOutfitsForCutscene = FALSE
|
|
iCurrentEvent = 0
|
|
bSkippedMocap = FALSE
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
SWITCH iCurrentEvent
|
|
CASE 0 //Do any setup on first frame of cutscene.
|
|
IF IS_CUTSCENE_PLAYING()
|
|
DISABLE_STRIP_CLUBS()
|
|
SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE)
|
|
SET_CLOCK_TIME(7, 0, 0) //B*819380
|
|
|
|
IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(<<0.0, 0.0, 0.0>>, TRUE)
|
|
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<<151.2816, -1309.2737, 28.2024>>, 65.7988)
|
|
ENDIF
|
|
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<129.082687,-1299.175659,28.232706>>, <<136.970322,-1312.649536,33.186874>>, 19.750000, <<151.2816, -1309.2737, 28.2024>>, 65.7988,
|
|
GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
|
|
//DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES()
|
|
|
|
CLEAR_AREA_OF_PEDS(<<151.2816, -1309.2737, 28.2024>>, 5000.0)
|
|
CLEAR_AREA_OF_OBJECTS(<<151.2816, -1309.2737, 28.2024>>, 5000.0)
|
|
CLEAR_AREA_OF_COPS(<<151.2816, -1309.2737, 28.2024>>, 5000.0)
|
|
CLEAR_AREA_OF_PROJECTILES(<<151.2816, -1309.2737, 28.2024>>, 5000.0)
|
|
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
|
|
MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_HEIST_FINALE_2A)
|
|
|
|
DO_FADE_IN_WITH_WAIT() //In case this is a mission replay, the game will be faded out at this point
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //When Michael and Trevor are off-screen change them into the security outfits.
|
|
|
|
SETUP_REQ_MAIN_DRIVER(<<138.9219, -1306.6428, 27.9476>>, 43.3035)
|
|
|
|
IF NOT DOES_ENTITY_EXIST(sStartCar.veh)
|
|
SETUP_REQ_START_CAR(vStartCarPos, fStartCarHeading)
|
|
ENDIF
|
|
|
|
ENTITY_INDEX entityTrevor, entityMichael, entityGunman
|
|
|
|
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
|
|
entityTrevor = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Trevor")
|
|
IF DOES_ENTITY_EXIST(entityTrevor)
|
|
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = GET_PED_INDEX_FROM_ENTITY_INDEX(entityTrevor)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
|
|
entityMichael = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Michael")
|
|
IF DOES_ENTITY_EXIST(entityMichael)
|
|
sSelectorPeds.pedID[SELECTOR_PED_MICHAEL] = GET_PED_INDEX_FROM_ENTITY_INDEX(entityMichael)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(sCrew[CREW_GUNMAN].ped)
|
|
entityGunman = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("gunman_selection_1")
|
|
IF DOES_ENTITY_EXIST(entityGunman)
|
|
sCrew[CREW_GUNMAN].ped = GET_PED_INDEX_FROM_ENTITY_INDEX(entityGunman)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bPreloadedOutfitsForCutscene
|
|
IF (GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL OR NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
|
|
AND (GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR OR NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
PRELOAD_OUTFIT(GET_PED_INDEX(CHAR_MICHAEL), OUTFIT_P0_SECURITY)
|
|
PRELOAD_OUTFIT(GET_PED_INDEX(CHAR_TREVOR), OUTFIT_P2_SECURITY)
|
|
|
|
bPreloadedOutfitsForCutscene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_CUTSCENE_TIME() > 30500
|
|
IF sMichael.iEvent = 0
|
|
IF (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) OR GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL)
|
|
SETUP_MICHAEL_SECURITY_OUTFIT()
|
|
|
|
RELEASE_PED_PRELOAD_VARIATION_DATA(GET_PED_INDEX(CHAR_MICHAEL))
|
|
RELEASE_PED_PRELOAD_PROP_DATA(GET_PED_INDEX(CHAR_MICHAEL))
|
|
|
|
sMichael.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sTrevor.iEvent = 0
|
|
IF (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) OR GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR)
|
|
SETUP_TREVOR_SECURITY_OUTFIT()
|
|
|
|
RELEASE_PED_PRELOAD_VARIATION_DATA(GET_PED_INDEX(CHAR_TREVOR))
|
|
RELEASE_PED_PRELOAD_PROP_DATA(GET_PED_INDEX(CHAR_TREVOR))
|
|
|
|
sTrevor.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
IF sCrew[CREW_DRIVER].iEvent = 0
|
|
SET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped, <<138.9219, -1306.6428, 27.9476>>)
|
|
SET_ENTITY_HEADING(sCrew[CREW_DRIVER].ped, 43.3035)
|
|
|
|
SETUP_DRIVER_SECURITY_OUTFIT()
|
|
sCrew[CREW_DRIVER].iEvent++
|
|
ELIF sCrew[CREW_DRIVER].iEvent = 1
|
|
IF GET_CUTSCENE_TIME() > 51000
|
|
AND IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
TASK_ENTER_VEHICLE(sCrew[CREW_DRIVER].ped, sStartCar.veh, -1, VS_BACK_LEFT, PEDMOVE_WALK)
|
|
sCrew[CREW_DRIVER].iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sCrew[CREW_GUNMAN].iEvent = 0
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
SETUP_GUNMAN_SECURITY_OUTFIT()
|
|
sCrew[CREW_GUNMAN].iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bHasTextLabelTriggered[FH3A_HK10]
|
|
IF IS_CUTSCENE_PLAYING()
|
|
AND GET_CUTSCENE_TIME() > 37600
|
|
TEXT_LABEL strConvRoot
|
|
TEXT_LABEL strCrewVoiceName
|
|
CrewMember eCrewID
|
|
|
|
eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER)
|
|
|
|
SWITCH eCrewID
|
|
CASE CM_HACKER_B_RICKIE_UNLOCK
|
|
strConvRoot += "FH3A_HK10c"
|
|
strCrewVoiceName = "LIEngineer"
|
|
BREAK
|
|
|
|
CASE CM_HACKER_G_PAIGE
|
|
strConvRoot += "FH3A_HK10"
|
|
strCrewVoiceName = "PAIGE"
|
|
BREAK
|
|
|
|
CASE CM_HACKER_M_CHRIS
|
|
strConvRoot += "FH3A_HK10b"
|
|
strCrewVoiceName = "CHRISTIAN"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, NULL, strCrewVoiceName)
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strConvRoot, CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES, DO_NOT_ADD_TO_BRIEF_SCREEN)
|
|
bHasTextLabelTriggered[FH3A_HK10] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
REPLAY_STOP_EVENT()
|
|
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
ENDIF
|
|
|
|
//Have the player face the car if we're in first-person.
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
|
|
AND NOT IS_SCREEN_FADED_OUT()
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), -100.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
ENDIF
|
|
|
|
ADD_ARMOUR_TO_PED(PLAYER_PED_ID(), -GET_PED_ARMOUR(PLAYER_PED_ID()))
|
|
ADD_ARMOUR_TO_PED(PLAYER_PED_ID(), 100)
|
|
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE, FALSE, FAUS_CUTSCENE_EXIT)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sStartCar.veh, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("gunman_selection_1")
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_GUNMAN].ped, sStartCar.veh, VS_BACK_RIGHT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_DRIVER].ped, sStartCar.veh, VS_BACK_LEFT)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
ENDIF
|
|
|
|
//Fixes issues with LODs popping in after the cutscene.
|
|
IF NOT IS_ENTITY_DEAD(sStartCar.veh)
|
|
SET_FORCE_HD_VEHICLE(sStartCar.veh, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
RELEASE_PED_PRELOAD_VARIATION_DATA(GET_PED_INDEX(CHAR_MICHAEL))
|
|
RELEASE_PED_PRELOAD_PROP_DATA(GET_PED_INDEX(CHAR_MICHAEL))
|
|
|
|
RELEASE_PED_PRELOAD_VARIATION_DATA(GET_PED_INDEX(CHAR_TREVOR))
|
|
RELEASE_PED_PRELOAD_PROP_DATA(GET_PED_INDEX(CHAR_TREVOR))
|
|
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
IF bSkippedMocap
|
|
//For now just do a skip to the next stage.
|
|
JUMP_TO_STAGE(STAGE_SET_UP_STINGER)
|
|
ELSE
|
|
SET_AUDIO_FLAG("AllowScoreAndRadio", TRUE)
|
|
eMissionStage = STAGE_SET_UP_STINGER
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
DO_FADE_OUT_WITH_WAIT()
|
|
|
|
STOP_CUTSCENE()
|
|
bSkippedMocap = TRUE
|
|
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SET_UP_STINGER()
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
IF bHasUsedCheckpoint
|
|
START_REPLAY_SETUP(<<131.0853, -1302.4243, 28.2489>>, 204.9590)
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<131.0853, -1302.4243, 28.2489>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 204.9590)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
LOAD_SCENE(<<131.0853, -1302.4243, 28.2489>>)
|
|
|
|
WAIT(0)
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
|
|
PRELOAD_OUTFIT(PLAYER_PED_ID(), OUTFIT_P0_SECURITY)
|
|
|
|
//Create assets
|
|
WHILE NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
OR NOT DOES_ENTITY_EXIST(sCrew[CREW_DRIVER].ped)
|
|
OR NOT DOES_ENTITY_EXIST(sCrew[CREW_GUNMAN].ped)
|
|
OR NOT DOES_ENTITY_EXIST(sStartCar.veh)
|
|
SETUP_REQ_TREVOR(<<135.6805, -1304.5132, 28.1500>>, 212.6113)
|
|
SETUP_REQ_MAIN_DRIVER(<<138.9219, -1306.6428, 27.9476>>, 43.3035)
|
|
SETUP_REQ_MAIN_GUNMAN(<<136.4418, -1302.2856, 28.2036>>, 204.6212)
|
|
SETUP_REQ_START_CAR(vStartCarPos, fStartCarHeading)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("Assets created: ", TIMERA())
|
|
#ENDIF
|
|
|
|
//Pre-stream the security outfits.
|
|
REQUEST_DRIVER_SECURITY_OUTFIT()
|
|
REQUEST_GUNMAN_SECURITY_OUTFIT()
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
PRELOAD_OUTFIT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], OUTFIT_P2_SECURITY)
|
|
ENDIF
|
|
|
|
WHILE NOT HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(PLAYER_PED_ID())
|
|
OR (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND NOT HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
OR (NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped) AND NOT HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(sCrew[CREW_DRIVER].ped))
|
|
OR (NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped) AND NOT HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(sCrew[CREW_GUNMAN].ped))
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
|
|
RELEASE_PED_PRELOAD_VARIATION_DATA(PLAYER_PED_ID())
|
|
RELEASE_PED_PRELOAD_PROP_DATA(PLAYER_PED_ID())
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
//Reposition the crew members, get them entering the vehicles, then wait for a bit so everything looks smooth on fade-in.
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped, <<138.9219, -1306.6428, 27.9476>>)
|
|
SET_ENTITY_HEADING(sCrew[CREW_DRIVER].ped, 43.3035)
|
|
RELEASE_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_DRIVER].ped)
|
|
RELEASE_PED_PRELOAD_PROP_DATA(sCrew[CREW_DRIVER].ped)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
SET_ENTITY_COORDS(sCrew[CREW_GUNMAN].ped, <<136.4418, -1302.2856, 28.2036>>)
|
|
SET_ENTITY_HEADING(sCrew[CREW_GUNMAN].ped, 204.6212)
|
|
RELEASE_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_GUNMAN].ped)
|
|
RELEASE_PED_PRELOAD_PROP_DATA(sCrew[CREW_GUNMAN].ped)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
RELEASE_PED_PRELOAD_VARIATION_DATA(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
RELEASE_PED_PRELOAD_PROP_DATA(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
|
|
CLEAR_AREA(<<131.0853, -1302.4243, 28.2489>>, 100.0, TRUE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
SET_ROADS_IN_ANGLED_AREA(<<332.834991,-659.348389,27.838188>>, <<120.851776,-573.066589,35.662926>>, 18.750000, FALSE, FALSE)
|
|
SET_ROADS_IN_ANGLED_AREA(<<395.946472,-569.395081,27.532516>>, <<351.844971,-652.105469,29.339520>>, 15.500000, FALSE, FALSE)
|
|
CLOSE_TUNNEL_PAVEMENTS(TRUE)
|
|
|
|
SET_AUDIO_FLAG("AllowScoreAndRadio", TRUE)
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sCrew[CREW_DRIVER].ped, RELGROUPHASH_PLAYER)
|
|
SET_PED_CAN_BE_TARGETTED(sCrew[CREW_DRIVER].ped, FALSE)
|
|
SET_PED_CONFIG_FLAG(sCrew[CREW_DRIVER].ped, PCF_RunFromFiresAndExplosions, FALSE)
|
|
|
|
GIVE_WEAPON_TO_PED(sCrew[CREW_DRIVER].ped, WEAPONTYPE_PISTOL, INFINITE_AMMO, FALSE, FALSE)
|
|
GIVE_WEAPON_TO_PED(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, FALSE, FALSE)
|
|
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, sCrew[CREW_DRIVER].ped, "FH3CREW2")
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
AND NOt IS_PED_IN_VEHICLE(sCrew[CREW_DRIVER].ped, sStartCar.veh)
|
|
AND GET_SCRIPT_TASK_STATUS(sCrew[CREW_DRIVER].ped, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
|
|
TASK_ENTER_VEHICLE(sCrew[CREW_DRIVER].ped, sStartCar.veh, DEFAULT_TIME_BEFORE_WARP, VS_BACK_LEFT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sCrew[CREW_GUNMAN].ped, RELGROUPHASH_PLAYER)
|
|
SET_PED_CAN_BE_TARGETTED(sCrew[CREW_GUNMAN].ped, FALSE)
|
|
SET_PED_CONFIG_FLAG(sCrew[CREW_GUNMAN].ped, PCF_RunFromFiresAndExplosions, FALSE)
|
|
|
|
GIVE_WEAPON_TO_PED(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_PISTOL, INFINITE_AMMO, FALSE, FALSE)
|
|
GIVE_WEAPON_TO_PED(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, FALSE, FALSE)
|
|
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 3, sCrew[CREW_GUNMAN].ped, "FH3CREW1")
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
AND NOT IS_PED_IN_VEHICLE(sCrew[CREW_GUNMAN].ped, sStartCar.veh)
|
|
AND GET_SCRIPT_TASK_STATUS(sCrew[CREW_GUNMAN].ped, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
|
|
TASK_ENTER_VEHICLE(sCrew[CREW_GUNMAN].ped, sStartCar.veh, DEFAULT_TIME_BEFORE_WARP, VS_BACK_RIGHT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_PED_CAN_BE_TARGETTED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_RunFromFiresAndExplosions, FALSE)
|
|
sTrevor.iEvent = 0
|
|
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE, 500, FALSE, FALSE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], RELGROUPHASH_PLAYER)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
AND NOT IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sStartCar.veh)
|
|
AND GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
|
|
TASK_ENTER_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sStartCar.veh, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
SET_CLOCK_TIME(7, 0, 0)
|
|
|
|
WAIT(500)
|
|
ENDIF
|
|
|
|
sCrew[CREW_GUNMAN].iEvent = 0
|
|
sCrew[CREW_DRIVER].iEvent = 0
|
|
sMichael.iEvent = 0
|
|
sTrevor.iEvent = 0
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
IF NOT IS_ENTITY_DEAD(sStartCar.veh)
|
|
SET_FORCE_HD_VEHICLE(sStartCar.veh, TRUE)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
REMOVE_VEHICLE(vehPreMissionCar, FALSE)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
bDoAlternateVanArrivalCutscene = FALSE
|
|
bPlayedFranklinsBikeRevSound = FALSE
|
|
iMusicTriggerEvent = 0
|
|
iStingerAudioSceneEvent = 0
|
|
iCountdownAudioEvent = 0
|
|
bTunnelAudioSceneActive = FALSE
|
|
|
|
SET_INITIAL_PLAYER_STATION("RADIO_01_CLASS_ROCK")
|
|
CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_WHERE", CONV_PRIORITY_MEDIUM)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(1.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
#IF IS_DEBUG_BUILD
|
|
DONT_DO_J_SKIP(sLocatesData)
|
|
#ENDIF
|
|
|
|
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_HIJACK_01")
|
|
FLOAT fDistFromTunnel = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vTunnelPos)
|
|
|
|
//Pre-load the tunnel interior
|
|
IF fDistFromTunnel < 10000.0
|
|
SETUP_REQ_TUNNEL_INTERIOR_LOADED()
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(sStartCar.veh)
|
|
SET_FORCE_HD_VEHICLE(sStartCar.veh, TRUE)
|
|
ENDIF
|
|
|
|
//Setup bank security in case the player tries to go there early.
|
|
//SETUP_REQ_BANK_SECURITY()
|
|
|
|
DISABLE_LOCATES_WANTED_PRINTS_OUTSIDE_OF_VEHICLE(sLocatesData, TRUE)
|
|
|
|
BOOL bPlayerAtTunnelWaitPos = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<278.126892,-636.892761,28.115456>>, <<296.964050,-644.678528,32.056763>>, 8.000000)
|
|
|
|
//Michael has to find the vans and then tail them until they reach the tunnel. As they approach the tunnel overtake them and plant the stinger in front.
|
|
//NOTE: locates header is just being used to handle non-objective blips, groups etc. The actual objective is replaced. Don't display the chevron, as this will be called
|
|
//over the mini-cut.
|
|
IS_PLAYER_AT_LOCATION_WITH_BUDDIES_IN_VEHICLE(sLocatesData, vTunnelPos, <<0.001, 0.001, LOCATE_SIZE_HEIGHT>>, FALSE,
|
|
sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sCrew[CREW_DRIVER].ped, sCrew[CREW_GUNMAN].ped, sStartCar.veh,
|
|
"F3A_TUNNEL", "F3A_LEFTTREV", "F3A_LEAVECREW", "F3A_LEAVECREW", "F3A_LEFTCREW", "F3A_GETINCAR", "F3A_GETBACKCAR", FALSE, TRUE, FALSE)
|
|
|
|
//Play custom dialogue when getting a wanted level.
|
|
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
|
|
IF iCurrentEvent >= 50
|
|
//Fail if the vans already arrived
|
|
MISSION_FAILED(FAILED_ALERTED_COPS)
|
|
ELSE
|
|
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF NOT bHasTextLabelTriggered[FH3A_WANTED]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_WANTED", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
bHasTextLabelTriggered[FH3A_WANTED] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[LOSE_WANTED]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("LOSE_WANTED", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[LOSE_WANTED] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF bHasTextLabelTriggered[LOSE_WANTED]
|
|
bHasTextLabelTriggered[LOSE_WANTED] = FALSE
|
|
ENDIF
|
|
|
|
IF bHasTextLabelTriggered[FH3A_WANTED]
|
|
bHasTextLabelTriggered[FH3A_WANTED] = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Work out which in-car line to play: this is based on which crew members were picked.
|
|
TEXT_LABEL strCarTextBlock, strCarTextBlock2, strCarTextGunmanBlock
|
|
INT iNumTimesDriverHired, iNumTimesGunmanHired
|
|
|
|
iNumTimesDriverHired = GET_NUMBER_OF_TIMES_CREW_MEMBER_HIRED(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER))
|
|
iNumTimesGunmanHired = GET_NUMBER_OF_TIMES_CREW_MEMBER_HIRED(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_GUNMAN))
|
|
|
|
CrewMember eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_GUNMAN)
|
|
|
|
IF iNumTimesDriverHired = 0 AND iNumTimesGunmanHired = 0
|
|
strCarTextBlock = "FH3A_CHAT3"
|
|
strCarTextBlock2 = "FH3A_CHAT3b"
|
|
strCarTextGunmanBlock = "FH3A_NONE"
|
|
ELIF iNumTimesDriverHired > 1 AND iNumTimesGunmanHired > 1
|
|
strCarTextBlock = "FH3A_CHAT"
|
|
strCarTextBlock2 = "FH3A_CHATb"
|
|
|
|
IF eCrewID = CM_GUNMAN_G_PACKIE_UNLOCK
|
|
IF iNumTimesGunmanHired > 2
|
|
strCarTextGunmanBlock = "FH3A_NALL"
|
|
ELSE
|
|
strCarTextGunmanBlock = "FH3A_TWO"
|
|
ENDIF
|
|
ELSE
|
|
strCarTextGunmanBlock = "FH3A_LOTS"
|
|
ENDIF
|
|
ELSE
|
|
strCarTextBlock = "FH3A_CHAT2"
|
|
strCarTextBlock2 = "FH3A_CHAT2b"
|
|
|
|
IF iNumTimesGunmanHired > 0
|
|
IF eCrewID = CM_GUNMAN_G_PACKIE_UNLOCK
|
|
IF IS_BIT_SET(g_savedGlobals.sHeistData.iCrewUsedBitset, CREW_USED_JEWEL_PACKIE)
|
|
strCarTextGunmanBlock = "FH3A_ONE"
|
|
ELIF IS_BIT_SET(g_savedGlobals.sHeistData.iCrewUsedBitset, CREW_USED_PALETO_PACKIE)
|
|
strCarTextGunmanBlock = "FH3A_PAL"
|
|
ELIF IS_BIT_SET(g_savedGlobals.sHeistData.iCrewUsedBitset, CREW_USED_AGENCY_PACKIE)
|
|
strCarTextGunmanBlock = "FH3A_FIB"
|
|
ENDIF
|
|
ELSE
|
|
strCarTextGunmanBlock = "FH3A_ONE"
|
|
ENDIF
|
|
ELSE
|
|
strCarTextGunmanBlock = ""
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Create the stinger in advance.
|
|
IF fDistFromTunnel < 2500.0
|
|
IF NOT DOES_ENTITY_EXIST(objStinger)
|
|
REQUEST_MODEL(modelStinger)
|
|
|
|
IF HAS_MODEL_LOADED(modelStinger)
|
|
objStinger = CREATE_OBJECT(modelStinger, <<314.8, -652.2, 57.8>>)
|
|
//ACTIVATE_PHYSICS(objStinger)
|
|
//SET_ENTITY_DYNAMIC(objStinger, TRUE)
|
|
SET_ENTITY_VISIBLE(objStinger, FALSE)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelStinger)
|
|
ENDIF
|
|
ELSE
|
|
REQUEST_ANIM_DICT(strStingerAnims)
|
|
|
|
IF HAS_ANIM_DICT_LOADED(strStingerAnims)
|
|
AND DOES_ENTITY_HAVE_DRAWABLE(objStinger)
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(objStinger, strStingerAnims, "P_Stinger_S_deploy")
|
|
AND NOT IS_ENTITY_PLAYING_ANIM(objStinger, strStingerAnims, "P_Stinger_S_idle_undeployed")
|
|
PLAY_ENTITY_ANIM(objStinger, "P_Stinger_S_idle_undeployed", strStingerAnims, INSTANT_BLEND_IN, TRUE, FALSE, FALSE, 0.0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0 //Drive to a location near the tunnels.
|
|
PREPARE_MUSIC_EVENT("FH2A_MISSION_START_ST")
|
|
DRAW_CLOCK("F3A_TRUCKCLOCK", TRUE, 7, 45, TIMER_STYLE_DONTUSEMILLISECONDS)
|
|
|
|
//1844289 - Play audio when there's only ten seconds left (10 seconds real time = 5 mins game time)
|
|
INT iHours, iMinutes, iSeconds
|
|
iHours = GET_CLOCK_HOURS()
|
|
iMinutes = GET_CLOCK_MINUTES()
|
|
iSeconds = GET_CLOCK_SECONDS()
|
|
|
|
IF iCountdownAudioEvent = 0
|
|
IF iMinutes = 55 AND iSeconds >= 30
|
|
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
|
|
iCountdownAudioEvent++
|
|
ENDIF
|
|
ELIF iCountdownAudioEvent = 1
|
|
IF iMinutes = 56 AND iSeconds >= 0
|
|
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
|
|
iCountdownAudioEvent++
|
|
ENDIF
|
|
ELIF iCountdownAudioEvent = 2
|
|
IF iMinutes = 56 AND iSeconds >= 30
|
|
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
|
|
iCountdownAudioEvent++
|
|
ENDIF
|
|
ELIF iCountdownAudioEvent = 3
|
|
IF iMinutes = 57 AND iSeconds >= 0
|
|
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
|
|
iCountdownAudioEvent++
|
|
ENDIF
|
|
ELIF iCountdownAudioEvent = 4
|
|
IF iMinutes = 57 AND iSeconds >= 30
|
|
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
|
|
iCountdownAudioEvent++
|
|
ENDIF
|
|
ELIF iCountdownAudioEvent = 5
|
|
IF iMinutes = 58 AND iSeconds >= 0
|
|
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
|
|
iCountdownAudioEvent++
|
|
ENDIF
|
|
ELIF iCountdownAudioEvent = 6
|
|
IF iMinutes = 58 AND iSeconds >= 15
|
|
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
|
|
iCountdownAudioEvent++
|
|
ENDIF
|
|
ELIF iCountdownAudioEvent = 7
|
|
IF iMinutes = 58 AND iSeconds >= 30
|
|
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
|
|
iCountdownAudioEvent++
|
|
ENDIF
|
|
ELIF iCountdownAudioEvent = 8
|
|
IF iMinutes = 58 AND iSeconds >= 45
|
|
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
|
|
iCountdownAudioEvent++
|
|
ENDIF
|
|
ELIF iCountdownAudioEvent = 9
|
|
IF iMinutes = 59 AND iSeconds >= 0
|
|
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
|
|
iCountdownAudioEvent++
|
|
ENDIF
|
|
ELIF iCountdownAudioEvent = 10
|
|
IF iMinutes = 59 AND iSeconds >= 15
|
|
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
|
|
iCountdownAudioEvent++
|
|
ENDIF
|
|
ELIF iCountdownAudioEvent = 11
|
|
IF iMinutes = 59 AND iSeconds >= 30
|
|
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
|
|
iCountdownAudioEvent++
|
|
ENDIF
|
|
ELIF iCountdownAudioEvent = 12
|
|
IF iMinutes = 59 AND iSeconds >= 45
|
|
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
|
|
iCountdownAudioEvent++
|
|
ENDIF
|
|
ELIF iCountdownAudioEvent = 13
|
|
IF iMinutes >= 0 AND iHours = 8
|
|
PLAY_SOUND_FRONTEND(-1, "TIMER_STOP", "HUD_MINI_GAME_SOUNDSET")
|
|
iCountdownAudioEvent++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Do a streaming volume for the cutscene: Note there are two cutscenes that could happen here.
|
|
IF fDistFromTunnel < 2500.0
|
|
OR (iHours >= 7 AND iMinutes >= 50 AND fDistFromTunnel < 4900.0)
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
NEW_LOAD_SCENE_START_SPHERE(<<395.5, -697.8, 30.1>>, 50.0)
|
|
ENDIF
|
|
ELIF fDistFromTunnel > 6400.0
|
|
IF IS_NEW_LOAD_SCENE_ACTIVE()
|
|
NEW_LOAD_SCENE_STOP()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Do locate check just to draw chevron.
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
AND IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND NOT bPlayerAtTunnelWaitPos
|
|
AND NOT bDoAlternateVanArrivalCutscene
|
|
IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vTunnelPos, <<2.0, 2.0, LOCATE_SIZE_HEIGHT>>, TRUE)
|
|
ENDIF
|
|
|
|
//Fade out music when player gets close to the tunnel entrance (or if they hit the locate some other way).
|
|
IF NOT bTunnelAudioSceneActive
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<342.420929,-662.797852,27.306934>>, <<309.718842,-651.177307,36.086140>>, 27.250000)
|
|
OR iCurrentEvent != 0
|
|
TRIGGER_MUSIC_EVENT("FH2A_RADIO_FADE_OUT")
|
|
bTunnelAudioSceneActive = TRUE
|
|
iMusicStartTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Load the gold van assets in advance.
|
|
IF fDistFromTunnel < 10000.0
|
|
REQUEST_VEHICLE_RECORDING(CARREC_GOLD_VANS_APPEAR, strCarrec)
|
|
SETUP_REQ_GOLD_VANS_PRE_HIJACK(<<0.0, 0.0, 0.0>>, 0.0, <<0.0, 0.0, 0.0>>, 0.0, TRUE)
|
|
ELIF fDistFromTunnel > 22500.0
|
|
REMOVE_VEHICLE_RECORDING(CARREC_GOLD_VANS_APPEAR, strCarrec)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelCasey)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldVan)
|
|
//SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldVanPeds) //This is needed for gate security.
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
SET_BLIP_ALPHA(sLocatesData.LocationBlip, 0)
|
|
SET_BLIP_ROUTE(sLocatesData.LocationBlip, FALSE)
|
|
|
|
IF NOT DOES_BLIP_EXIST(blipCurrentObjective)
|
|
blipCurrentObjective = CREATE_BLIP_FOR_COORD(vWaitForVansPos, TRUE)
|
|
|
|
SET_GPS_DISABLED_ZONE(<<138.7158, -1309.0946, 39.1623>>, <<148.0416, -1293.8993, 39.1623>>)
|
|
ENDIF
|
|
|
|
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
|
|
ENDIF
|
|
|
|
//In car chat.
|
|
IF NOT bHasTextLabelTriggered[FH3A_CHAT1]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strCarTextBlock, CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_CHAT1] = TRUE
|
|
iTunnelJourneyDialogueTimer = 0
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_GUNCAR]
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strCarTextGunmanBlock)
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_GUNMAN_CONVERSATION(CREW_GUNMAN, sCrew[CREW_GUNMAN].ped, sConversationPeds, "FH3AAUD", strCarTextGunmanBlock)
|
|
bHasTextLabelTriggered[FH3A_GUNCAR] = TRUE
|
|
iTunnelJourneyDialogueTimer = 0
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bHasTextLabelTriggered[FH3A_GUNCAR] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_CHAT2]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strCarTextBlock2, CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_CHAT2] = TRUE
|
|
iTunnelJourneyDialogueTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_LONG] //If the player hasn't reached the tunnel after the last conversation finished play a "hurry up" line.
|
|
IF IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
OR (fDistFromTunnel < fPrevDistanceFromTunnel AND GET_ENTITY_SPEED(sStartCar.veh) > 10.0)
|
|
iTunnelJourneyDialogueTimer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - iTunnelJourneyDialogueTimer > 7000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LONG", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_LONG] = TRUE
|
|
iTunnelJourneyDialogueTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fPrevDistanceFromTunnel = fDistFromTunnel
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_LONG2] //Play another hurry up line.
|
|
IF IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
OR (fDistFromTunnel < fPrevDistanceFromTunnel AND GET_ENTITY_SPEED(sStartCar.veh) > 10.0)
|
|
iTunnelJourneyDialogueTimer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - iTunnelJourneyDialogueTimer > 7000
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LONG2", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_LONG2] = TRUE
|
|
iTunnelJourneyDialogueTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fPrevDistanceFromTunnel = fDistFromTunnel
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_BLIP_EXIST(blipCurrentObjective)
|
|
REMOVE_ALL_BLIPS()
|
|
ENDIF
|
|
|
|
//Don't pause dialogue if we have a wanted level, as there's going to be some custom dialogue.
|
|
IF bHasTextLabelTriggered[FH3A_CHAT1]
|
|
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
AND GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bCustomGPSActive
|
|
SET_GPS_MULTI_ROUTE_RENDER(FALSE)
|
|
CLEAR_GPS_MULTI_ROUTE()
|
|
bCustomGPSActive = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Progress either if the player drives onto the locate correctly of if the alternate cutscene conditions were met.
|
|
IF (IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND bPlayerAtTunnelWaitPos
|
|
AND CAN_PLAYER_START_CUTSCENE(TRUE, TRUE)
|
|
AND DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
AND BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(sStartCar.veh, DEFAULT, 2, 0.05))
|
|
OR bDoAlternateVanArrivalCutscene
|
|
IF bCustomGPSActive
|
|
SET_GPS_MULTI_ROUTE_RENDER(FALSE)
|
|
CLEAR_GPS_MULTI_ROUTE()
|
|
bCustomGPSActive = FALSE
|
|
ENDIF
|
|
|
|
SET_GPS_DISABLED_ZONE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
IF bFranklinsBikeAudioSceneActive
|
|
STOP_AUDIO_SCENE("BIG_SCORE_2A_Boost_Franklins_Bike")
|
|
bFranklinsBikeAudioSceneActive = FALSE
|
|
ENDIF
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(7.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
REMOVE_ALL_BLIPS()
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
|
|
//When the player runs out of time either fail if they're too far away or play an alternate version of the van cutscene if they're near the tunnel.
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
IF GET_CLOCK_HOURS() >= 8
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vWaitForVansPos) < 4900.0
|
|
bDoAlternateVanArrivalCutscene = TRUE
|
|
ELSE
|
|
MISSION_FAILED(FAILED_MISSED_TUNNEL)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Vans arrive cutscene
|
|
REQUEST_MODEL(modelStinger)
|
|
REQUEST_ANIM_DICT(strStingerAnims)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_GOLD_VANS_APPEAR, strCarrec)
|
|
|
|
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(sStartCar.veh, DEFAULT, 2, 0.05)
|
|
|
|
IF SETUP_REQ_GOLD_VANS_PRE_HIJACK(<<0.0, 0.0, 0.0>>, 0.0, <<0.0, 0.0, 0.0>>, 0.0, TRUE)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_GOLD_VANS_APPEAR, strCarrec)
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
//IF TIMERB() > 15000 OR GET_CLOCK_HOURS() >= 8 //Once dialogue is ready put this in.
|
|
IF TIMERB() > 1000
|
|
AND bHasTextLabelTriggered[FH3A_HOLD]
|
|
SETUP_REQ_GOLD_VANS_PRE_HIJACK(<<0.0, 0.0, 0.0>>, 0.0, <<0.0, 0.0, 0.0>>, 0.0, FALSE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, CARREC_GOLD_VANS_APPEAR, strCarrec)
|
|
IF NOT bDoAlternateVanArrivalCutscene
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, 2650.0)
|
|
ELSE
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, 3750.0)
|
|
ENDIF
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[0].veh)
|
|
SET_VEHICLE_ENGINE_HEALTH(sGoldVans[0].veh, 1000.0)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(sGoldVans[0].veh, 1000.0)
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, CARREC_GOLD_VANS_APPEAR, strCarrec)
|
|
IF NOT bDoAlternateVanArrivalCutscene
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, 500.0)
|
|
ELSE
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, 2500.0)
|
|
ENDIF
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[1].veh)
|
|
SET_VEHICLE_ENGINE_HEALTH(sGoldVans[1].veh, 1000.0)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(sGoldVans[1].veh, 1000.0)
|
|
|
|
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(sGoldVans[1].veh), 15.0)
|
|
ENDIF
|
|
|
|
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
SET_ROADS_IN_ANGLED_AREA(<<328.408264,-737.851563,27.344345>>, <<387.132874,-603.286560,38.589233>>, 43.500000, FALSE, FALSE)
|
|
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100.0, TRUE)
|
|
CLEAR_AREA_OF_VEHICLES(<<358.3, -668.4, 28.8>>, 100.0)
|
|
CLEAR_ANGLED_AREA_OF_VEHICLES(<<327.230835,-653.433594,27.224365>>, <<421.565277,-676.612549,36.074821>>, 180.500000)
|
|
|
|
IF NOT bDoAlternateVanArrivalCutscene
|
|
camMain = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<292.380188,-641.046204,29.708914>>,<<-3.808809,-0.002426,-87.065468>>,37.777313, TRUE)
|
|
//SET_CAM_PARAMS(camMain, <<290.603699,-640.843933,29.566248>>,<<-3.532233,-0.002426,-101.519447>>,40.063507, 12000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
|
|
SHAKE_CAM(camMain, "HAND_SHAKE", 0.4)
|
|
ELSE
|
|
camMain = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<416.518524,-690.654175,29.633583>>,<<-2.970040,0.003319,58.762817>>,40.443851, TRUE)
|
|
SET_CAM_PARAMS(camMain, <<416.418121,-690.593140,31.897556>>,<<-2.970040,0.003319,58.762817>>,40.443851, 8000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
|
|
SHAKE_CAM(camMain, "HAND_SHAKE", 0.1)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
IF NOT bDoAlternateVanArrivalCutscene
|
|
SET_ENTITY_HEADING(sStartCar.veh, 68.8593)
|
|
SET_ENTITY_COORDS(sStartCar.veh, <<294.7272, -640.9750, 28.1689>>)
|
|
ELIF IS_ENTITY_IN_ANGLED_AREA(sStartCar.veh, <<405.685425,-672.307129,27.641361>>, <<405.843140,-733.908447,34.328587>>, 22.000000)
|
|
SET_ENTITY_HEADING(sStartCar.veh, 88.1695)
|
|
SET_ENTITY_COORDS(sStartCar.veh, <<423.8835, -674.2583, 28.2539>>)
|
|
ELIF IS_ENTITY_IN_ANGLED_AREA(sStartCar.veh, <<341.157104,-662.794556,27.787113>>, <<395.308899,-677.472595,34.335789>>, 25.250000)
|
|
SET_ENTITY_HEADING(sStartCar.veh, 341.0817)
|
|
SET_ENTITY_COORDS(sStartCar.veh, <<358.4151, -688.5298, 28.2433>>)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sStartCar.veh)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sStartCar.veh)
|
|
ENDIF
|
|
|
|
IF bDoAlternateVanArrivalCutscene
|
|
CLEAR_AREA_OF_VEHICLES(<<358.3, -668.4, 28.8>>, 100.0)
|
|
ENDIF
|
|
|
|
//SET_ENTITY_VELOCITY(sStartCar.veh, <<0.0, 0.0, 0.0>>)
|
|
//SET_VEHICLE_ON_GROUND_PROPERLY(sStartCar.veh)
|
|
|
|
IF IS_ENTITY_ON_FIRE(sStartCar.veh)
|
|
STOP_ENTITY_FIRE(sStartCar.veh)
|
|
SET_VEHICLE_FIXED(sStartCar.veh)
|
|
SET_VEHICLE_ENGINE_HEALTH(sStartCar.veh, 1000.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
TASK_LOOK_AT_COORD(PLAYER_PED_ID(), <<356.26, -679.22, 30.37>>, -1, SLF_WHILE_NOT_IN_FOV | SLF_SLOW_TURN_RATE)
|
|
|
|
SET_AUDIO_FLAG("AllowScoreAndRadio", FALSE)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
bCamIsInterpingToVans = FALSE
|
|
bTrevorSetToLookInVansArriveCut = FALSE
|
|
bHasFirstPersonFlashTriggered = FALSE
|
|
iCarCreationEvent = 0
|
|
|
|
SETUP_PC_CONTROLS()
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
ELSE
|
|
//Keep the player waiting for the vans, play some dialogue.
|
|
IF NOT bHasTextLabelTriggered[FH3A_HOLD]
|
|
IF NOT bDoAlternateVanArrivalCutscene
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_HOLD", CONV_PRIORITY_MEDIUM)
|
|
OR TIMERB() > 15000
|
|
REPLAY_RECORD_BACK_FOR_TIME(8.0, 3.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
bHasTextLabelTriggered[FH3A_HOLD] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bHasTextLabelTriggered[FH3A_HOLD] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
REQUEST_MODEL(modelStinger)
|
|
REQUEST_ANIM_DICT(strStingerAnims)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
SET_VEHICLE_BRAKE_LIGHTS(sStartCar.veh, FALSE)
|
|
ENDIF
|
|
|
|
//We have to turn off ambient traffic in the tunnels to avoid potential issues with them
|
|
IF NOT bDoAlternateVanArrivalCutscene
|
|
REQUEST_MODEL(EMPEROR)
|
|
REQUEST_MODEL(HABANERO)
|
|
|
|
IF NOT bTrevorSetToLookInVansArriveCut
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND TIMERB() > 700
|
|
TASK_LOOK_AT_COORD(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<398.45, -681.63, 30.37>>, -1, SLF_WHILE_NOT_IN_FOV | SLF_SLOW_TURN_RATE)
|
|
bTrevorSetToLookInVansArriveCut = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF TIMERB() > 7000 //Dialogue roughly ends after 7500 ms
|
|
AND HAS_MODEL_LOADED(EMPEROR)
|
|
AND HAS_MODEL_LOADED(HABANERO)
|
|
VECTOR vPos
|
|
FLOAT fHeading
|
|
INT iRandom
|
|
BOOL bCreatedCarThisFrame
|
|
MODEL_NAMES modelVehicle
|
|
|
|
//If the player skipped the cutscene then create all of the cars at once, otherwise create one per frame.
|
|
WHILE iCarCreationEvent < 3
|
|
AND NOT bCreatedCarThisFrame
|
|
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
|
|
modelVehicle = EMPEROR
|
|
ELSE
|
|
modelVehicle = HABANERO
|
|
ENDIF
|
|
|
|
iRandom = GET_RANDOM_INT_IN_RANGE(0, 4)
|
|
|
|
IF iRandom = 0
|
|
vPos = <<132.4302, -581.0699, 30.4622>>
|
|
fHeading = 251.6688
|
|
ELIF iRandom = 1
|
|
vPos = <<153.7827, -587.8965, 29.7356>>
|
|
fHeading = 254.6748
|
|
ELIF iRandom = 2
|
|
vPos = <<199.6922, -596.1505, 28.3695>>
|
|
fHeading = 67.4431
|
|
ELIF iRandom = 3
|
|
vPos = <<99.5932, -563.0226, 30.6069>>
|
|
fHeading = 70.9581
|
|
ENDIF
|
|
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, vPos, fHeading)
|
|
iCarCreationEvent++
|
|
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
bCreatedCarThisFrame = TRUE
|
|
ENDIF
|
|
ENDWHILE
|
|
|
|
IF iCarCreationEvent >= 3
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(EMPEROR)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(HABANERO)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bDoAlternateVanArrivalCutscene
|
|
IF NOT bHasTextLabelTriggered[FH3A_WAIT]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_WAIT", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
bHasTextLabelTriggered[FH3A_WAIT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bCamIsInterpingToVans
|
|
IF TIMERB() > 2500
|
|
SET_CAM_PARAMS(camMain, <<292.387848,-641.194458,29.708914>>,<<-3.808809,-0.002426,-98.072250>>,37.777313, 4000, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
|
|
bCamIsInterpingToVans = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Handle the first person flash.
|
|
IF NOT bHasFirstPersonFlashTriggered
|
|
AND NOT IS_SCREEN_FADED_OUT()
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON
|
|
OR GET_FOLLOW_VEHICLE_CAM_ZOOM_LEVEL() = VEHICLE_ZOOM_LEVEL_BONNET
|
|
IF (bDoAlternateVanArrivalCutscene AND TIMERB() > 3700)
|
|
OR (NOT bDoAlternateVanArrivalCutscene AND TIMERB() > 8200)
|
|
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] Triggering flash: TIMERB = ", TIMERB())
|
|
|
|
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
bHasFirstPersonFlashTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ((NOT bDoAlternateVanArrivalCutscene AND TIMERB() > 8500) OR (bDoAlternateVanArrivalCutscene AND TIMERB() > 4000))
|
|
AND (NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData) OR bHasFirstPersonFlashTriggered) //Don't check text for first-person as it prevents getting accurate timings for the first-person flash.
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, 5250.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[0].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
|
|
SET_ENTITY_VELOCITY(sGoldVans[0].veh, <<0.0, 0.0, 0.0>>)
|
|
SET_ENTITY_COORDS(sGoldVans[0].veh, <<378.6022, -673.4838, 28.3044>>)
|
|
SET_ENTITY_HEADING(sGoldVans[0].veh, 71.8782)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[0].veh)
|
|
SET_VEHICLE_FORWARD_SPEED(sGoldVans[0].veh, 9.0)
|
|
ENDIF
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, 4000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[1].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
|
|
SET_ENTITY_VELOCITY(sGoldVans[1].veh, <<0.0, 0.0, 0.0>>)
|
|
SET_ENTITY_COORDS(sGoldVans[1].veh, <<393.5128, -675.4417, 28.2723>>)
|
|
SET_ENTITY_HEADING(sGoldVans[1].veh, 79.9870)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[1].veh)
|
|
SET_VEHICLE_FORWARD_SPEED(sGoldVans[1].veh, 9.0)
|
|
ENDIF
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_GOLD_VANS_APPEAR, strCarrec)
|
|
ENDIF
|
|
|
|
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
TASK_CLEAR_LOOK_AT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(EMPEROR)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(HABANERO)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(1.0)
|
|
|
|
SETTIMERB(0)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
iCurrentEvent = 50
|
|
ELSE
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
|
|
DO_FADE_OUT_WITH_WAIT()
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SETTIMERB(10000)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 50 //Place the stinger in the tunnel before the vans get there.
|
|
REQUEST_ANIM_DICT(strStingerAnims)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_DISTRICT_NAME)
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_VEHICLE_NAME)
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_STREET_NAME)
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME)
|
|
|
|
IF NOT IS_ENTITY_DEAD(sStartCar.veh)
|
|
IF TIMERB() < 100
|
|
SET_VEHICLE_BRAKE_LIGHTS(sStartCar.veh, FALSE)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
SET_BLIP_ALPHA(sLocatesData.LocationBlip, 0)
|
|
SET_BLIP_ROUTE(sLocatesData.LocationBlip, FALSE)
|
|
|
|
//Do locate check just to draw chevron.
|
|
//IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vTunnelPos, <<2.0, 2.0, LOCATE_SIZE_HEIGHT>>, TRUE)
|
|
|
|
IF NOT bHasTextLabelTriggered[FH3A_DROP]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_DROP", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(4.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
bHasTextLabelTriggered[FH3A_DROP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[F3A_STINGER]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("F3A_STINGER", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[F3A_STINGER] = TRUE
|
|
SETTIMERB(0)
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_PROMPT]
|
|
IF TIMERB() > 5000
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_PROMPT", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_PROMPT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_BLIP_EXIST(blipCurrentObjective)
|
|
blipCurrentObjective = CREATE_BLIP_FOR_COORD(vTunnelPos, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT DOES_BLIP_EXIST(sGoldVanPeds[CASEY_ID].blip)
|
|
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
sGoldVanPeds[CASEY_ID].blip = CREATE_BLIP_FOR_PED(sGoldVanPeds[CASEY_ID].ped, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT DOES_BLIP_EXIST(sGoldVanPeds[VAN_DRIVER_2].blip)
|
|
AND NOT IS_PED_INJURED(sGoldVanPeds[VAN_DRIVER_2].ped)
|
|
sGoldVanPeds[VAN_DRIVER_2].blip = CREATE_BLIP_FOR_PED(sGoldVanPeds[VAN_DRIVER_2].ped, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<295.067169,-645.779785,27.333458>>, <<209.385574,-602.962524,34.435322>>, 15.000000)
|
|
AND IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sStartCar.veh)
|
|
IF NOT bHasTextLabelTriggered[F3A_STINGHELP]
|
|
PRINT_HELP("F3A_STINGHELP")
|
|
bHasTextLabelTriggered[F3A_STINGHELP] = TRUE
|
|
ENDIF
|
|
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
|
|
|
|
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_SCRIPT_PAD_RIGHT)
|
|
IF DOES_ENTITY_EXIST(objStinger)
|
|
AND HAS_ANIM_DICT_LOADED(strStingerAnims)
|
|
AND IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
AND DOES_ENTITY_HAVE_PHYSICS(objStinger)
|
|
IF DOES_BLIP_EXIST(blipCurrentObjective)
|
|
REMOVE_BLIP(blipCurrentObjective)
|
|
ENDIF
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
vStingerDropPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sStartCar.veh, <<0.0, -2.8, 0.0>>)
|
|
SET_ENTITY_VISIBLE(objStinger, TRUE)
|
|
//SET_ENTITY_COORDS_NO_OFFSET(objStinger, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sStartCar.veh, <<-1.5, -2.8, -0.4>>)) //This spawns it dead centre.
|
|
SET_ENTITY_COORDS_NO_OFFSET(objStinger, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sStartCar.veh, <<-1.0, -2.8, -0.4>>)) //This is better for the scripted cam.
|
|
SET_ENTITY_HEADING(objStinger, GET_ENTITY_HEADING(sStartCar.veh) + 90.0)
|
|
ACTIVATE_PHYSICS(objStinger)
|
|
SET_ENTITY_DYNAMIC(objStinger, TRUE)
|
|
PLAY_ENTITY_ANIM(objStinger, "P_Stinger_S_deploy", strStingerAnims, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.0)
|
|
PLAY_SOUND_FROM_ENTITY(-1, "DROP_STINGER", sStartCar.veh, "BIG_SCORE_3A_SOUNDS")
|
|
SET_ENTITY_VELOCITY(objStinger,
|
|
GET_ENTITY_VELOCITY(sStartCar.veh) - (CONVERT_ROTATION_TO_DIRECTION_VECTOR(GET_ENTITY_ROTATION(sStartCar.veh)) * 5.0))
|
|
CLEAR_HELP()
|
|
CLEAR_PRINTS()
|
|
|
|
//If the stinger was dropped while the vans were there then just fail the mission straight away.
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF VDIST2(GET_ENTITY_COORDS(sGoldVans[0].veh), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 1600.0
|
|
IF GET_ENTITY_SPEED(sGoldVans[0].veh) < 1.0
|
|
MISSION_FAILED(FAILED_SPOOKED_VAN_PEDS)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Do a scripted cam showing the stinger.
|
|
DESTROY_ALL_CAMS()
|
|
SET_USE_HI_DOF()
|
|
camMain = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
|
|
ATTACH_CAM_TO_ENTITY(camMain, sStartCar.veh, <<0.1216, -0.4534, -0.3052>>)
|
|
POINT_CAM_AT_ENTITY(camMain, sStartCar.veh, <<-0.0526, -3.4347, -0.0197>>)
|
|
SHAKE_CAM(camMain, "ROAD_VIBRATION_SHAKE", GET_ENTITY_SPEED(sStartCar.veh) * 0.02)
|
|
SET_CAM_FOV(camMain, 50.0000)
|
|
SET_CAM_DOF_PLANES(camMain, 0.0, 0.0, 10000.0, 10000.0)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISABLE_PLAYER_VEHICLE_CONTROLS_THIS_FRAME()
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 2.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME()
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ELIF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_STINGHELP")
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_BLIP_EXIST(blipCurrentObjective)
|
|
REMOVE_ALL_BLIPS()
|
|
ENDIF
|
|
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_STINGHELP")
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vTunnelPos) > 40000.0
|
|
MISSION_FAILED(FAILED_STINGER_NOT_IN_TIME)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 51
|
|
BOOL bStartCutscene
|
|
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
|
|
IF TIMERB() < 1000
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT) //Prevents the lights/horn coming on straight after deploying the stinger with the same button.
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(camMain)
|
|
DISABLE_PLAYER_VEHICLE_CONTROLS_THIS_FRAME()
|
|
SET_USE_HI_DOF()
|
|
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME()
|
|
|
|
IF TIMERB() > 1500
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bHasTextLabelTriggered[FH3A_STINGER] //Trevor says "let's move"
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_STINGER", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_STINGER] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[F3A_WAITVAN] //God text to move out of the way.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("F3A_WAITVAN", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[F3A_WAITVAN] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_STOP] //Trevor says hurry up if the player still hasn't moved after the god text has finished.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
IF VDIST2(GET_ENTITY_COORDS(sStartCar.veh), vStingerDropPos) < 16.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_STOP", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_STOP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
VECTOR vStingerOffsetFromVan, vPlayerOffsetFromVan, vPlayerOffsetFromFrontVan
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
vStingerOffsetFromVan = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(sGoldVans[0].veh, vStingerDropPos)
|
|
vPlayerOffsetFromVan = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(sGoldVans[1].veh, GET_ENTITY_COORDS(sStartCar.veh))
|
|
vPlayerOffsetFromFrontVan = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(sGoldVans[0].veh, GET_ENTITY_COORDS(sStartCar.veh))
|
|
|
|
//PRINTLN(vOffset)
|
|
|
|
IF vStingerOffsetFromVan.y < 15.0
|
|
IF ABSF(vPlayerOffsetFromFrontVan.y) > 16.0 OR ABSF(vPlayerOffsetFromFrontVan.x) > 7.0
|
|
IF (vStingerOffsetFromVan.x > -3.0 AND vStingerOffsetFromVan.x < 4.5)
|
|
AND vStingerOffsetFromVan.y > -2.0
|
|
bStartCutscene = TRUE
|
|
ELSE
|
|
//Stinger was placed somewhere where the van won't hit it.
|
|
MISSION_FAILED(FAILED_MISSED_STINGER)
|
|
ENDIF
|
|
ELSE
|
|
MISSION_FAILED(FAILED_SPOOKED_VAN_PEDS)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//1047839 - Fail if the player tries to drive out the tunnel.
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<305.131708,-649.726440,28.332701>>, <<336.571625,-661.244324,34.574265>>, 28.750000)
|
|
MISSION_FAILED(FAILED_SPOOKED_VAN_PEDS)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Prevent the player from leaving the tunnel, as streaming won't be able to handle the jump back for the cutscene.
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<48.075649,-554.890991,29.939941>>, <<143.673492,-581.898010,34.491451>>, 18.750000)
|
|
OR (IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<328.173737,-656.818115,26.821844>>, <<380.210327,-676.598755,39.071918>>, 91.250000)
|
|
AND vPlayerOffsetFromVan.y < 1.0)
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
AND IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sStartCar.veh)
|
|
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(sStartCar.veh, DEFAULT, -1)
|
|
|
|
//Start the cutscene early if the player drove off and the vans aren't in view.
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND NOT IS_ENTITY_ON_SCREEN(sGoldVans[0].veh)
|
|
bStartCutscene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Start the cutscene if any of the conditions were met.
|
|
IF bStartCutscene
|
|
CLEAR_PRINTS()
|
|
REMOVE_ALL_BLIPS()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() //In case the "hurry up" line was playing, then the player moves out the way.
|
|
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
//Burst vehicle tyres if they drive over the stinger.
|
|
VEHICLE_INDEX vehClosest
|
|
vehClosest = GET_CLOSEST_VEHICLE(vStingerDropPos, 10.0, DUMMY_MODEL_FOR_SCRIPT, GET_TRAFFIC_AND_PLAYER_VEHICLE_SEARCH_FLAGS())
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehClosest)
|
|
AND vehClosest != sGoldVans[0].veh
|
|
AND NOT IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(vehClosest))
|
|
VECTOR vMinOffset, vMaxOffset, vWheelPos1, vWheelPos2, vWheelPos3, vWheelPos4
|
|
vMinOffset = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objStinger, <<0.0, -0.5, -0.5>>)
|
|
vMaxOffset = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objStinger, <<0.0, 3.5, 1.5>>)
|
|
|
|
//GET_ENTITY_BONE_INDEX_BY_NAME
|
|
|
|
vWheelPos1 = GET_WORLD_POSITION_OF_ENTITY_BONE(vehClosest, GET_ENTITY_BONE_INDEX_BY_NAME(vehClosest, "wheel_lf"))
|
|
vWheelPos2 = GET_WORLD_POSITION_OF_ENTITY_BONE(vehClosest, GET_ENTITY_BONE_INDEX_BY_NAME(vehClosest, "wheel_rf"))
|
|
vWheelPos3 = GET_WORLD_POSITION_OF_ENTITY_BONE(vehClosest, GET_ENTITY_BONE_INDEX_BY_NAME(vehClosest, "wheel_rr"))
|
|
vWheelPos4 = GET_WORLD_POSITION_OF_ENTITY_BONE(vehClosest, GET_ENTITY_BONE_INDEX_BY_NAME(vehClosest, "wheel_lr"))
|
|
|
|
IF IS_POINT_IN_ANGLED_AREA(vWheelPos1, vMinOffset, vMaxOffset, 0.8)
|
|
IF NOT IS_VEHICLE_TYRE_BURST(vehClosest, SC_WHEEL_CAR_FRONT_LEFT)
|
|
SET_VEHICLE_TYRE_BURST(vehClosest, SC_WHEEL_CAR_FRONT_LEFT, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_POINT_IN_ANGLED_AREA(vWheelPos2, vMinOffset, vMaxOffset, 0.8)
|
|
IF NOT IS_VEHICLE_TYRE_BURST(vehClosest, SC_WHEEL_CAR_FRONT_RIGHT)
|
|
SET_VEHICLE_TYRE_BURST(vehClosest, SC_WHEEL_CAR_FRONT_RIGHT, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_POINT_IN_ANGLED_AREA(vWheelPos3, vMinOffset, vMaxOffset, 0.8)
|
|
IF NOT IS_VEHICLE_TYRE_BURST(vehClosest, SC_WHEEL_CAR_REAR_RIGHT)
|
|
SET_VEHICLE_TYRE_BURST(vehClosest, SC_WHEEL_CAR_REAR_RIGHT, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_POINT_IN_ANGLED_AREA(vWheelPos4, vMinOffset, vMaxOffset, 0.8)
|
|
IF NOT IS_VEHICLE_TYRE_BURST(vehClosest, SC_WHEEL_CAR_REAR_LEFT)
|
|
SET_VEHICLE_TYRE_BURST(vehClosest, SC_WHEEL_CAR_REAR_LEFT, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Need to keep some map streamed in for the next shot.
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
NEW_LOAD_SCENE_START_SPHERE(<<395.5, -697.8, 30.1>>, 50.0)
|
|
ENDIF
|
|
|
|
//Pre-stream other assets
|
|
LOAD_STREAM("Trucks_Hijack", "BIG_SCORE_3A_SOUNDS")
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF iCurrentEvent > 0
|
|
SWITCH iMusicTriggerEvent
|
|
CASE 0 //Trigger the score five seconds after the van arrive cutscene starts (do this outside the main stages in case the player skips the cutscene before 5 seconds has passed).
|
|
IF GET_GAME_TIMER() - iMusicStartTimer > 5000
|
|
TRIGGER_MUSIC_EVENT("FH2A_MISSION_START_ST")
|
|
iMusicStartTimer = GET_GAME_TIMER()
|
|
iMusicTriggerEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Prepare the one-shot music trigger for the next cutscene in advance.
|
|
IF bHasTextLabelTriggered[F3A_WAITVAN]
|
|
AND GET_GAME_TIMER() - iMusicStartTimer > 5000
|
|
PREPARE_MUSIC_EVENT("FH2A_MISSION_START_OS")
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
//Audio scenes.
|
|
SWITCH iStingerAudioSceneEvent
|
|
CASE 0 //First audio scene for the car journey.
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sStartCar.veh)
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_TUNNEL")
|
|
START_AUDIO_SCENE("BS_2A_GET_TO_TUNNEL")
|
|
ENDIF
|
|
|
|
iStingerAudioSceneEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Update audio scene when the truck cutscene starts (player control turned off at this point).
|
|
IF NOT IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_TUNNEL")
|
|
STOP_AUDIO_SCENE("BS_2A_GET_TO_TUNNEL")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_TRUCKS_ARRIVE")
|
|
START_AUDIO_SCENE("BS_2A_TRUCKS_ARRIVE")
|
|
ENDIF
|
|
|
|
iStingerAudioSceneEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Update audio scenes when the truck cutscene ends.
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_TRUCKS_ARRIVE")
|
|
STOP_AUDIO_SCENE("BS_2A_TRUCKS_ARRIVE")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_DROP_STINGER")
|
|
START_AUDIO_SCENE("BS_2A_DROP_STINGER")
|
|
ENDIF
|
|
|
|
iStingerAudioSceneEvent++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Manage the vans: once the player gets close, tell them to drive to the bank.
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
AND NOT IS_PED_INJURED(sGoldVanPeds[VAN_DRIVER_2].ped)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointVehVansToBank)
|
|
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehVansToBank)
|
|
IF GET_SCRIPT_TASK_STATUS(sGoldVanPeds[CASEY_ID].ped, SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) != PERFORMING_TASK
|
|
AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
|
|
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(sGoldVanPeds[CASEY_ID].ped, sGoldVans[0].veh, strWaypointVehVansToBank, DRIVINGMODE_STOPFORCARS_STRICT, 78,
|
|
EWAYPOINT_DEFAULT, -1, 15.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[CASEY_ID].ped, TRUE)
|
|
ENDIF
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(sGoldVanPeds[VAN_DRIVER_2].ped, SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) != PERFORMING_TASK
|
|
AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(sGoldVanPeds[VAN_DRIVER_2].ped, sGoldVans[1].veh, strWaypointVehVansToBank, DRIVINGMODE_STOPFORCARS_STRICT, 78,
|
|
EWAYPOINT_DEFAULT, -1, 15.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[VAN_DRIVER_2].ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail if the player sits in front of the vans.
|
|
IF GET_ENTITY_SPEED(sGoldVans[0].veh) < 1.0
|
|
IF GET_GAME_TIMER() - iTimeVansStopped > 15000
|
|
MISSION_FAILED(FAILED_SPOOKED_VAN_PEDS)
|
|
ENDIF
|
|
ELSE
|
|
iTimeVansStopped = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
//Fail if they get to the tunnel before you plant the stinger
|
|
IF NOT DOES_ENTITY_EXIST(objStinger)
|
|
AND IS_ENTITY_IN_ANGLED_AREA(sGoldVans[0].veh, <<279.485504,-648.833862,28.325171>>, <<284.913147,-633.059021,32.177643>>, 27.250000)
|
|
MISSION_FAILED(FAILED_STINGER_NOT_IN_TIME)
|
|
ENDIF
|
|
|
|
//Fail if the player collides into either of the trucks, or if they're damaged in any way by the player.
|
|
IF IS_ENTITY_TOUCHING_ENTITY(sStartCar.veh, sGoldVans[0].veh)
|
|
OR IS_ENTITY_TOUCHING_ENTITY(sStartCar.veh, sGoldVans[1].veh)
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sGoldVans[0].veh, PLAYER_PED_ID())
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sGoldVans[1].veh, PLAYER_PED_ID())
|
|
MISSION_FAILED(FAILED_SPOOKED_VAN_PEDS)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Stage-specific fail conditions
|
|
IF NOT IS_VEHICLE_DRIVEABLE(sStartCar.veh, TRUE)
|
|
MISSION_FAILED(FAILED_START_CAR_DESTROYED)
|
|
ELSE
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
IF IS_VEHICLE_PERMANENTLY_STUCK(sStartCar.veh)
|
|
MISSION_FAILED(FAILED_CAR_STUCK)
|
|
ENDIF
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sStartCar.veh)) > 40000.0
|
|
MISSION_FAILED(FAILED_ABANDONED_CAR)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
REMOVE_ALL_BLIPS()
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_GOLD_VANS_APPEAR, strCarrec)
|
|
|
|
IF bFranklinsBikeAudioSceneActive
|
|
STOP_AUDIO_SCENE("BIG_SCORE_2A_Boost_Franklins_Bike")
|
|
bFranklinsBikeAudioSceneActive = FALSE
|
|
ENDIF
|
|
|
|
CLEANUP_PC_CONTROLS()
|
|
|
|
eMissionStage = STAGE_VAN_CRASH_CUTSCENE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_VAN_CRASH_CUTSCENE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC VAN_CRASH_CUTSCENE()
|
|
INT i = 0
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
AND SETUP_REQ_TREVOR(<<242.4482, -616.4299, 27.6035>>, 215.3280)
|
|
AND SETUP_REQ_MAIN_DRIVER(<<248.2831, -614.3350, 27.7058>>, 218.3951)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<249.2831, -614.3350, 27.7058>>, 218.3951)
|
|
AND SETUP_REQ_START_CAR(<<241.8352, -613.7300, 27.5132>>, 119.6201)
|
|
AND SETUP_REQ_BANK_SECURITY()
|
|
AND SETUP_REQ_GOLD_VANS_PRE_HIJACK(<<0.0, 0.0, 0.0>>, 0.0, <<0.0, 0.0, 0.0>>, 0.0)
|
|
AND SETUP_REQ_TUNNEL_INTERIOR_LOADED()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<243.3412, -611.8222, 27.6962>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 232.4222)
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
ENDIF
|
|
|
|
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_HIJACK_01")
|
|
|
|
REQUEST_MODEL(modelStinger)
|
|
REQUEST_ANIM_DICT(strStingerAnims)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_VAN_STINGER_1, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_VAN_STINGER_2, strCarrec)
|
|
REQUEST_PTFX_ASSET()
|
|
|
|
LOAD_STREAM("Trucks_Hijack", "BIG_SCORE_3A_SOUNDS")
|
|
|
|
IF HAS_MODEL_LOADED(modelStinger)
|
|
AND HAS_ANIM_DICT_LOADED(strStingerAnims)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_VAN_STINGER_1, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_VAN_STINGER_2, strCarrec)
|
|
AND HAS_PTFX_ASSET_LOADED()
|
|
AND LOAD_STREAM("Trucks_Hijack", "BIG_SCORE_3A_SOUNDS")
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
REQUEST_COLLISION_AT_COORD(<<243.3412, -611.8222, 27.6962>>)
|
|
LOAD_SCENE(<<264.9509, -629.4653, 27.8277>>)
|
|
WAIT(1000)
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2A_MISSION_RESTART")
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_LOCKED_PLAYER_INSIDE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, CARREC_VAN_STINGER_1, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, 9500.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[0].veh)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
SET_VEHICLE_DOORS_LOCKED(sGoldVans[1].veh, VEHICLELOCK_LOCKED_PLAYER_INSIDE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, CARREC_VAN_STINGER_2, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, 9500.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[1].veh)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_ROADS_IN_AREA(<<320.0534, -700.1548, 28.2937>>, <<393.6534, -633.9548, 48.2937>>, FALSE)
|
|
SET_ROADS_IN_ANGLED_AREA(<<328.408264,-737.851563,27.344345>>, <<387.132874,-603.286560,38.589233>>, 43.500000, FALSE, FALSE)
|
|
CLEAR_AREA(<<292.7276, -640.21, 28.1260>>, 300.0, TRUE)
|
|
|
|
IF NOT DOES_ENTITY_EXIST(objStinger)
|
|
objStinger = CREATE_OBJECT(modelStinger, <<292.7276, -640.21, 28.1260>>)
|
|
ENDIF
|
|
SET_ENTITY_COORDS(objStinger, <<292.7276, -640.21, 28.1760>>)
|
|
SET_ENTITY_ROTATION(objStinger, <<2.5, 0.0, 160.2906>>)
|
|
//APPLY_FORCE_TO_ENTITY(objStinger, APPLY_TYPE_IMPULSE, <<0.0, 0.0, -0.01>>, <<0.0, 0.0, 0.0>>, 0, TRUE, TRUE, TRUE)
|
|
FREEZE_ENTITY_POSITION(objStinger, TRUE)
|
|
PLAY_ENTITY_ANIM(objStinger, "P_Stinger_S_idle_deployed", strStingerAnims, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.99)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelStinger)
|
|
|
|
REPEAT COUNT_OF(sGoldVanPeds) i
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[i].ped)
|
|
TASK_STAND_STILL(sGoldVanPeds[i].ped, -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[i].ped, TRUE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
SET_ENTITY_COORDS(sStartCar.veh, <<241.8352, -613.7300, 27.5132>>)
|
|
SET_ENTITY_HEADING(sStartCar.veh, 242.2577)
|
|
SET_VEHICLE_RADIO_ENABLED(sStartCar.veh, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF IS_PED_IN_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
TASK_STAND_STILL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -1)
|
|
REMOVE_PED_FROM_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
IF IS_PED_IN_GROUP(sCrew[CREW_DRIVER].ped)
|
|
TASK_STAND_STILL(sCrew[CREW_DRIVER].ped, -1)
|
|
REMOVE_PED_FROM_GROUP(sCrew[CREW_DRIVER].ped)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_DRIVER].ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
IF IS_PED_IN_GROUP(sCrew[CREW_GUNMAN].ped)
|
|
TASK_STAND_STILL(sCrew[CREW_GUNMAN].ped, -1)
|
|
REMOVE_PED_FROM_GROUP(sCrew[CREW_GUNMAN].ped)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_GUNMAN].ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
STOP_AUDIO_SCENES()
|
|
|
|
IF LOAD_STREAM("Trucks_Hijack", "BIG_SCORE_3A_SOUNDS")
|
|
PLAY_STREAM_FRONTEND()
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<243.3412, -611.8222, 27.6962>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 232.4222)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, 300, TRUE)
|
|
|
|
camMain = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA",<<291.629791,-640.293152,28.286768>>,<<5.630339,0.007819,-121.191566>>,38.770943, TRUE)
|
|
SET_CAM_PARAMS(camMain,<<291.632172,-640.294800,28.287039>>,<<6.698129,0.007819,-121.191566>>,38.770943, 1550, GRAPH_TYPE_ACCEL, GRAPH_TYPE_ACCEL)
|
|
|
|
SHAKE_CAM(camMain, "HAND_SHAKE", 0.2)
|
|
SET_ROOM_FOR_GAME_VIEWPORT_BY_NAME("GtaMloRoom001")
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
//Add this cutscene to the captured footage.
|
|
IF NOT bReplayEventStarted
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
bReplayEventStarted = TRUE
|
|
ENDIF
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
SETTIMERA(0)
|
|
SETTIMERB(0)
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
IF IS_ENTITY_PLAYING_ANIM(objStinger, strStingerAnims, "P_Stinger_S_Deploy")
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(objStinger, strStingerAnims, "P_Stinger_S_Deploy") < 0.99
|
|
SET_ENTITY_ANIM_CURRENT_TIME(objStinger, strStingerAnims, "P_Stinger_S_Deploy", 0.99)
|
|
SET_ENTITY_ANIM_SPEED(objStinger, strStingerAnims, "P_Stinger_S_Deploy", 0.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
FLOAT fVanPlaybackTime = 0.0
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
|
|
fVanPlaybackTime = GET_TIME_POSITION_IN_RECORDING(sGoldVans[0].veh)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REQUEST_ANIM_DICT(strAnimsHijack)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
SET_FORCE_HD_VEHICLE(sGoldVans[0].veh, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
SET_FORCE_HD_VEHICLE(sGoldVans[1].veh, TRUE)
|
|
ENDIF
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0
|
|
PREPARE_MUSIC_EVENT("FH2A_MISSION_START_OS")
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF fVanPlaybackTime > 10960.0
|
|
//FORCE_ROOM_FOR_GAME_VIEWPORT(interiorTunnel3, HASH("GtaMloRoom017")) //Maybe need to wait a frame?
|
|
|
|
//WAIT(0)
|
|
|
|
SHAKE_CAM(camMain, "HAND_SHAKE", 0.3)
|
|
SET_CAM_PARAMS(camMain, <<267.228760,-642.403564,28.581345>>, <<2.570032,-0.036703,-87.163521>>, 21.916695, 0)
|
|
SET_CAM_PARAMS(camMain, <<267.228760,-642.403564,28.581345>>, <<6.112918,-0.036703,-55.098663>>, 26.457375, CEIL(12276.0 - 10960.0),
|
|
GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
|
|
|
|
//SET_ROOM_FOR_GAME_VIEWPORT_BY_NAME("GtaMloRoom001")
|
|
|
|
IF NOT IS_ENTITY_DEAD(sGoldVans[0].veh)
|
|
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_bigscore_tyre_spiked", sGoldVans[0].veh, <<-1.500, 3.000, -0.300>>, <<0.0, 0.0, 180.0>>)
|
|
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_bigscore_tyre_spiked", sGoldVans[0].veh, <<1.500, 3.000, -0.300>>, <<0.0, 0.0, 0.0>>)
|
|
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_FRONT_LEFT, FALSE, 1)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_FRONT_RIGHT, FALSE, 1)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_LEFT, FALSE, 1)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_RIGHT, FALSE, 1)
|
|
SET_VEHICLE_TYRES_CAN_BURST(sGoldVans[0].veh, FALSE)
|
|
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_HIJACK_01")
|
|
PLAY_SOUND_FROM_ENTITY(-1, "BLOWOUT", sGoldVans[0].veh, "BIG_SCORE_3A_SOUNDS")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
FREEZE_ENTITY_POSITION(objStinger, TRUE)
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2A_MISSION_START_OS")
|
|
|
|
//This is a good moment to pre-load the hijack conversation (on disc-builds this takes a while to load).
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 3, sCrew[CREW_GUNMAN].ped, "GUNMAN1")
|
|
PRELOAD_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS1_LI", CONV_PRIORITY_MEDIUM)
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF TIMERB() > 350
|
|
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_bigscore_tyre_spiked", sGoldVans[0].veh, <<-1.500, -3.000, -0.300>>, <<0.0, 0.0, 180.0>>)
|
|
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_bigscore_tyre_spiked", sGoldVans[0].veh, <<1.500, -3.000, -0.300>>, <<0.0, 0.0, 0.0>>)
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF fVanPlaybackTime > 12276.0
|
|
SET_CAM_PARAMS(camMain, <<254.448059,-621.939453,28.652695>>,<<0.059326,-0.075160,-130.091187>>,39.955532, 0)
|
|
SET_CAM_PARAMS(camMain, <<254.448059,-621.939453,28.652695>>,<<3.515683,-0.032602,-141.296677>>,39.955532, 2500, GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3
|
|
IF fVanPlaybackTime > 12624.0
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_bigscore_tyre_spiked", sGoldVans[1].veh, <<-1.500, 3.000, -0.300>>, <<0.0, 0.0, 180.0>>)
|
|
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_bigscore_tyre_spiked", sGoldVans[1].veh, <<1.500, 3.000, -0.300>>, <<0.0, 0.0, 0.0>>)
|
|
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_FRONT_LEFT, FALSE, 1.0)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_FRONT_RIGHT, FALSE, 1.0)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_REAR_LEFT, FALSE, 1.0)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_REAR_RIGHT, FALSE, 1.0)
|
|
SET_VEHICLE_TYRES_CAN_BURST(sGoldVans[1].veh, FALSE)
|
|
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_HIJACK_01")
|
|
PLAY_SOUND_FROM_ENTITY(-1, "BLOWOUT_B", sGoldVans[1].veh, "BIG_SCORE_3A_SOUNDS")
|
|
ENDIF
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4
|
|
IF TIMERB() > 350
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_bigscore_tyre_spiked", sGoldVans[1].veh, <<-1.500, -3.000, -0.300>>, <<0.0, 0.0, 180.0>>)
|
|
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_bigscore_tyre_spiked", sGoldVans[1].veh, <<1.500, -3.000, -0.300>>, <<0.0, 0.0, 0.0>>)
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 5 //Start the mocap after the scripted shot of the vans arriving finishes.
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh) AND GET_ENTITY_SPEED(sGoldVans[1].veh) < 0.1
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
|
|
IF bReplayEventStarted
|
|
REPLAY_STOP_EVENT()
|
|
bReplayEventStarted = FALSE
|
|
ENDIF
|
|
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
CLEAR_PRINTS()
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
IF bReplayEventStarted
|
|
REPLAY_STOP_EVENT()
|
|
bReplayEventStarted = FALSE
|
|
ENDIF
|
|
|
|
REMOVE_PTFX_ASSET()
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_HIJACK_01")
|
|
|
|
eMissionStage = STAGE_HIJACK_VANS
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
DO_FADE_OUT_WITH_WAIT()
|
|
|
|
STOP_STREAM()
|
|
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC HIJACK_VANS_PART_2()
|
|
INT i = 0
|
|
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_AIM)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_RADIO_WHEEL)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CELLPHONE_UP)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK1)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
|
|
//DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
REQUEST_MODEL(modelStinger)
|
|
REQUEST_ANIM_DICT(strStingerAnims)
|
|
|
|
IF SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
AND SETUP_REQ_TREVOR(<<242.4482, -616.4299, 27.6035>>, 215.3280)
|
|
AND SETUP_REQ_MAIN_DRIVER(<<248.2831, -614.3350, 27.7058>>, 218.3951)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<249.2831, -614.3350, 27.7058>>, 218.3951)
|
|
AND SETUP_REQ_START_CAR(<<241.8352, -613.7300, 27.5132>>, 119.6201)
|
|
AND SETUP_REQ_BANK_SECURITY()
|
|
AND SETUP_REQ_GOLD_VANS_PRE_HIJACK(<<0.0, 0.0, 0.0>>, 0.0, <<0.0, 0.0, 0.0>>, 0.0)
|
|
AND SETUP_REQ_TUNNEL_INTERIOR_LOADED()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
AND HAS_ANIM_DICT_LOADED(strStingerAnims)
|
|
AND HAS_MODEL_LOADED(modelStinger)
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<243.3412, -611.8222, 27.6962>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 232.4222)
|
|
|
|
objStinger = CREATE_OBJECT(modelStinger, <<292.7276, -640.21, 28.1260>>)
|
|
SET_ENTITY_COORDS(objStinger, <<292.7276, -640.21, 28.1760>>)
|
|
SET_ENTITY_ROTATION(objStinger, <<2.5, 0.0, 160.2906>>)
|
|
FREEZE_ENTITY_POSITION(objStinger, TRUE)
|
|
PLAY_ENTITY_ANIM(objStinger, "P_Stinger_S_idle_deployed", strStingerAnims, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.99)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelStinger)
|
|
|
|
SETUP_REQ_VAN_TYRES_ARE_BURST()
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_ANIM_DICT(strAnimsHijack)
|
|
|
|
IF HAS_ANIM_DICT_LOADED(strAnimsHijack)
|
|
IF IS_SCREEN_FADED_OUT()
|
|
//Preload the conversation in case the previous cutscene was skipped.
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 3, sCrew[CREW_GUNMAN].ped, "GUNMAN1")
|
|
PRELOAD_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS1_LI", CONV_PRIORITY_MEDIUM)
|
|
|
|
REQUEST_COLLISION_AT_COORD(<<237.6041, -613.1452, 28.1464>>)
|
|
LOAD_SCENE(<<237.6041, -613.1452, 28.1464>>)
|
|
|
|
WAIT(1000)
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2A_MISSION_RESTART")
|
|
ENDIF
|
|
|
|
//Create the synched scenes.
|
|
iSyncSceneHijackCars = CREATE_SYNCHRONIZED_SCENE(<<251.686, -623.183, 27.566>>, <<-0.000, 0.000, -0.360>>)
|
|
|
|
//Place the vans into their positions, and guarantee the tyres are down.
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_FRONT_LEFT)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_FRONT_LEFT, FALSE, 1.0)
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_FRONT_RIGHT)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_FRONT_RIGHT, FALSE, 1.0)
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_REAR_LEFT)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_REAR_LEFT, FALSE, 1.0)
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_REAR_RIGHT)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[1].veh, SC_WHEEL_CAR_REAR_RIGHT, FALSE, 1.0)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_TYRES_CAN_BURST(sGoldVans[1].veh, FALSE)
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(sGoldVans[1].veh, iSyncSceneHijackCars, "_leadin_stickup_stockade_b", strAnimsHijack, INSTANT_BLEND_IN, DEFAULT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
|
|
//SET_ENTITY_COORDS_NO_OFFSET(sGoldVans[1].veh, <<262.6830, -627.0226, 28.2027>>)
|
|
//SET_ENTITY_ROTATION(sGoldVans[1].veh, <<-0.5864, 1.8133, 87.6112>>)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
SET_ENTITY_HEADING(sStartCar.veh, 62.0345)
|
|
SET_ENTITY_COORDS(sStartCar.veh, <<248.5367, -618.7416, 27.5541>>)
|
|
//SET_VEHICLE_ON_GROUND_PROPERLY(sStartCar.veh)
|
|
SET_VEHICLE_RADIO_ENABLED(sStartCar.veh, FALSE)
|
|
SET_VEHICLE_DOORS_LOCKED(sStartCar.veh, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
|
|
//PLAY_SYNCHRONIZED_ENTITY_ANIM(sStartCar.veh, iSyncSceneHijackCars, "_leadin_stickup_dubsta", strAnimsHijack, INSTANT_BLEND_IN, DEFAULT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
|
|
PLAY_ENTITY_ANIM(sStartCar.veh, "_leadin_Stickup_DUBSTA_allDOORS", strAnimsHijack, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.0, ENUM_TO_INT(AF_USE_KINEMATIC_PHYSICS))
|
|
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(sStartCar.veh)
|
|
SET_VEHICLE_DOOR_SHUT(sStartCar.veh, SC_DOOR_FRONT_LEFT, TRUE)
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sStartCar.veh, VS_DRIVER)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_ASSAULTRIFLE, 300, TRUE)
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ASSAULTRIFLE, TRUE)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
//Get the crew members ready: they start in the car with their guns.
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sCrew[CREW_DRIVER].ped)
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_ASSAULTRIFLE)
|
|
GIVE_WEAPON_TO_PED(sCrew[CREW_DRIVER].ped, WEAPONTYPE_ASSAULTRIFLE, INFINITE_AMMO)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_ASSAULTRIFLE, TRUE)
|
|
TASK_SYNCHRONIZED_SCENE(sCrew[CREW_DRIVER].ped, iSyncSceneHijackCars, strAnimsHijack, "_leadin_stickup_henchman_a", INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT | RBF_MELEE | RBF_FALLING)
|
|
SET_FORCE_FOOTSTEP_UPDATE(sCrew[CREW_DRIVER].ped, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sCrew[CREW_GUNMAN].ped)
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_ASSAULTRIFLE)
|
|
GIVE_WEAPON_TO_PED(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_ASSAULTRIFLE, INFINITE_AMMO)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_ASSAULTRIFLE, TRUE)
|
|
TASK_SYNCHRONIZED_SCENE(sCrew[CREW_GUNMAN].ped, iSyncSceneHijackCars, strAnimsHijack, "_leadin_stickup_henchman_b", INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT | RBF_MELEE | RBF_FALLING)
|
|
SET_FORCE_FOOTSTEP_UPDATE(sCrew[CREW_GUNMAN].ped, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_ASSAULTRIFLE)
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_ASSAULTRIFLE, 500)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_ASSAULTRIFLE, TRUE)
|
|
TASK_SYNCHRONIZED_SCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], iSyncSceneHijackCars, strAnimsHijack, "_leadin_stickup_trevor", INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT | RBF_MELEE | RBF_FALLING)
|
|
SET_FORCE_FOOTSTEP_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
|
|
ENDIF
|
|
|
|
//If none of the tyres burst (e.g. cutscene was skipped) then burst them now.
|
|
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_FRONT_LEFT)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_FRONT_LEFT, FALSE, 1.0)
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_FRONT_RIGHT)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_FRONT_RIGHT, FALSE, 1.0)
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_LEFT)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_LEFT, FALSE, 1.0)
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_RIGHT)
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_RIGHT, FALSE, 1.0)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_TYRES_CAN_BURST(sGoldVans[0].veh, FALSE)
|
|
|
|
SET_ENTITY_COORDS_NO_OFFSET(sGoldVans[0].veh, <<252.2688, -627.3983, 28.1011>>)
|
|
SET_ENTITY_ROTATION(sGoldVans[0].veh, <<0.5062, -2.3079, 18.8871>>)
|
|
PLAY_ENTITY_ANIM(sGoldVans[0].veh, "_LeadIn_Stickup_STOCKADE_A_FPS_door", strAnimsHijack, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.0, ENUM_TO_INT(AF_USE_KINEMATIC_PHYSICS))
|
|
//BRING_VEHICLE_TO_HALT(sGoldVans[0].veh, 0.0, 60)
|
|
//PLAY_SYNCHRONIZED_ENTITY_ANIM(sGoldVans[0].veh, iSyncSceneHijackCars, "_LeadIn_Stickup_STOCKADE_A_FPS_door", strAnimsHijack, INSTANT_BLEND_IN, DEFAULT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
|
|
ENDIF
|
|
|
|
//Get the hostages playing their synced scenes.
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
TASK_PLAY_ANIM(sGoldVanPeds[CASEY_ID].ped, strAnimsHijack, "_leadin_idles_victim_a", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sGoldVanPeds[CASEY_ID].ped)
|
|
SET_ENTITY_IS_TARGET_PRIORITY(sGoldVanPeds[CASEY_ID].ped, TRUE)
|
|
SET_FORCE_FOOTSTEP_UPDATE(sGoldVanPeds[CASEY_ID].ped, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[CASEY_ID].ped, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[1].ped)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sGoldVanPeds[1].ped)
|
|
TASK_SYNCHRONIZED_SCENE(sGoldVanPeds[1].ped, iSyncSceneHijackCars, strAnimsHijack, "_leadin_stickup_victim_b", INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT | RBF_MELEE | RBF_FALLING)
|
|
SET_FORCE_FOOTSTEP_UPDATE(sGoldVanPeds[1].ped, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[2].ped)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sGoldVanPeds[2].ped)
|
|
TASK_SYNCHRONIZED_SCENE(sGoldVanPeds[2].ped, iSyncSceneHijackCars, strAnimsHijack, "_leadin_stickup_victim_c", INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT | RBF_MELEE | RBF_FALLING)
|
|
SET_FORCE_FOOTSTEP_UPDATE(sGoldVanPeds[2].ped, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[3].ped)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sGoldVanPeds[3].ped)
|
|
TASK_SYNCHRONIZED_SCENE(sGoldVanPeds[3].ped, iSyncSceneHijackCars, strAnimsHijack, "_leadin_stickup_victim_d", INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT | RBF_MELEE | RBF_FALLING)
|
|
SET_FORCE_FOOTSTEP_UPDATE(sGoldVanPeds[3].ped, TRUE)
|
|
ENDIF
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
|
|
//Remove previous assets.
|
|
REMOVE_ALL_AUDIO_SCENES()
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_1, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_2, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_BUDDIES, strCarrec)
|
|
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(180.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
CLEAR_AREA(<<251.686, -623.183, 27.566>>, 500.0, TRUE)
|
|
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
SET_FORCE_HD_VEHICLE(sGoldVans[0].veh, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
SET_FORCE_HD_VEHICLE(sGoldVans[1].veh, TRUE)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
//A couple of cars are potentially spawning in the frame wait, so clear again.
|
|
CLEAR_AREA_OF_VEHICLES(<<251.686, -623.183, 27.566>>, 500.0, TRUE)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
sGoldVanPeds[CASEY_ID].iEvent = 0
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SETTIMERA(0)
|
|
SETTIMERB(0)
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
IF IS_ENTITY_PLAYING_ANIM(objStinger, strStingerAnims, "P_Stinger_S_Deploy")
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(objStinger, strStingerAnims, "P_Stinger_S_Deploy") < 0.99
|
|
SET_ENTITY_ANIM_CURRENT_TIME(objStinger, strStingerAnims, "P_Stinger_S_Deploy", 0.99)
|
|
SET_ENTITY_ANIM_SPEED(objStinger, strStingerAnims, "P_Stinger_S_Deploy", 0.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<220.055954,-607.254761,27.220724>>, <<266.921509,-633.257568,32.445583>>, 23.250000)
|
|
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
SET_FORCE_HD_VEHICLE(sGoldVans[0].veh, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
SET_FORCE_HD_VEHICLE(sGoldVans[1].veh, TRUE)
|
|
ENDIF
|
|
|
|
REQUEST_CUTSCENE("bs_2a_mcs_1")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_1")
|
|
SETUP_REQ_FORCED_CREW()
|
|
SETUP_REQ_CREW_VAN(<<353.1693, -644.8009, 28.2688>>, 148.9754)
|
|
|
|
IF NOT bHasTextLabelTriggered[FH3A_MCS1_LI]
|
|
BEGIN_PRELOADED_CONVERSATION()
|
|
|
|
//ADD_PED_FOR_DIALOGUE(sConversationPeds, 3, sCrew[CREW_GUNMAN].ped, "GUNMAN1")
|
|
|
|
//IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS1_LI", CONV_PRIORITY_MEDIUM)
|
|
// bHasTextLabelTriggered[FH3A_MCS1_LI] = TRUE
|
|
//ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[F3A_JACKVANS]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
//PRINT_NOW("F3A_JACKVANS", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[F3A_JACKVANS] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_THR]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_THR", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_THR] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_PED_RESET_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PRF_DisableFriendlyGunReactAudio, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_PED_RESET_FLAG(sCrew[CREW_DRIVER].ped, PRF_DisableFriendlyGunReactAudio, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_PED_RESET_FLAG(sCrew[CREW_DRIVER].ped, PRF_DisableFriendlyGunReactAudio, TRUE)
|
|
ENDIF
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0 //Get the buddies out of the car
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF TIMERB() > 1800
|
|
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF (IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneHijackCars) AND GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneHijackCars) >= 0.98)
|
|
//OR (bHasTextLabelTriggered[FH3A_MCS1_LI] AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND TIMERB() > 3000)
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sGoldVanPeds[CASEY_ID].iEvent = 0
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF (NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND (IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), sGoldVanPeds[CASEY_ID].ped) OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sGoldVanPeds[CASEY_ID].ped))
|
|
AND TIMERA() > 5700)
|
|
OR TIMERA() > 9500
|
|
PLAY_PED_AMBIENT_SPEECH(sGoldVanPeds[CASEY_ID].ped, "AIMED_AT_BY_PLAYER", SPEECH_PARAMS_FORCE)
|
|
|
|
iSyncSceneHijackCasey = CREATE_SYNCHRONIZED_SCENE(<<251.686, -623.183, 27.566>>, <<-0.000, 0.000, -0.360>>)
|
|
TASK_SYNCHRONIZED_SCENE(sGoldVanPeds[CASEY_ID].ped, iSyncSceneHijackCasey, strAnimsHijack, "_LeadIn_Stickup_michaels_VICTIM_A", WALK_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT | RBF_MELEE | RBF_FALLING, INSTANT_BLEND_IN)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncSceneHijackCasey, FALSE)
|
|
|
|
SET_VEHICLE_DOOR_OPEN(sGoldVans[0].veh, SC_DOOR_FRONT_LEFT)
|
|
//PLAY_ENTITY_ANIM(sGoldVans[0].veh, "_LeadIn_Stickup_michaels_STOCKADE_A_FDS_door", strAnimsHijack, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.0, ENUM_TO_INT(AF_USE_KINEMATIC_PHYSICS))
|
|
|
|
sGoldVanPeds[CASEY_ID].iTimer = GET_GAME_TIMER()
|
|
sGoldVanPeds[CASEY_ID].iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF GET_GAME_TIMER() - sGoldVanPeds[CASEY_ID].iTimer > 2000
|
|
PLAY_PED_AMBIENT_SPEECH(sGoldVanPeds[CASEY_ID].ped, "GENERIC_FRIGHTENED_MED", SPEECH_PARAMS_FORCE)
|
|
sGoldVanPeds[CASEY_ID].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - iHijackSpeechTimer > 1000
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
INT iSpeaker = GET_RANDOM_INT_IN_RANGE(1, 4)
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[iSpeaker].ped)
|
|
PLAY_PED_AMBIENT_SPEECH(sGoldVanPeds[iSpeaker].ped, "GENERIC_FRIGHTENED_MED", SPEECH_PARAMS_FORCE)
|
|
iHijackSpeechTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(0, 500)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(sGoldVanPeds) i
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[i].ped)
|
|
//Do instant deaths on any ped if the player tries to shoot them.
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sGoldVanPeds[i].ped, PLAYER_PED_ID())
|
|
APPLY_DAMAGE_TO_PED(sGoldVanPeds[i].ped, GET_ENTITY_HEALTH(sGoldVanPeds[i].ped) + 50, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Crew van behaviour: get them to drive around the corner.
|
|
IF IS_VEHICLE_DRIVEABLE(vehBuddyVan)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_FORCED_DRIVER].ped)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_FORCED_GUNMAN].ped)
|
|
IF NOT IS_PED_IN_VEHICLE(sCrew[CREW_FORCED_DRIVER].ped, vehBuddyVan)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_FORCED_DRIVER].ped, vehBuddyVan)
|
|
ELSE
|
|
IF GET_SCRIPT_TASK_STATUS(sCrew[CREW_FORCED_DRIVER].ped, SCRIPT_TASK_VEHICLE_DRIVE_TO_COORD) != PERFORMING_TASK
|
|
IF TIMERA() > 10500
|
|
TASK_VEHICLE_DRIVE_TO_COORD(sCrew[CREW_FORCED_DRIVER].ped, vehBuddyVan, <<271.2136, -635.4591, 27.5957>>, 20.0,
|
|
DRIVINGSTYLE_NORMAL, modelBuddyVan, DRIVINGMODE_PLOUGHTHROUGH, 5.0, 20.0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_IN_VEHICLE(sCrew[CREW_FORCED_GUNMAN].ped, vehBuddyVan)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_FORCED_GUNMAN].ped, vehBuddyVan, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
eMissionStage = STAGE_HIJACK_CUTSCENE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_HIJACK_CUTSCENE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC HIJACK_CUTSCENE()
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
AND SETUP_REQ_TREVOR(<<242.4482, -616.4299, 27.6035>>, 215.3280)
|
|
AND SETUP_REQ_MAIN_DRIVER(<<248.2831, -614.3350, 27.7058>>, 218.3951)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<249.2831, -614.3350, 27.7058>>, 218.3951)
|
|
AND SETUP_REQ_START_CAR(<<241.8352, -613.7300, 27.5132>>, 119.6201)
|
|
AND SETUP_REQ_BANK_SECURITY()
|
|
AND SETUP_REQ_GOLD_VANS_PRE_HIJACK(<<0.0, 0.0, 0.0>>, 0.0, <<0.0, 0.0, 0.0>>, 0.0)
|
|
AND SETUP_REQ_TUNNEL_INTERIOR_LOADED()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<243.3412, -611.8222, 27.6962>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 232.4222)
|
|
|
|
SETUP_REQ_VAN_TYRES_ARE_BURST()
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
//2016339 - Don't remove player control until the cutscene has fully started. Instead, disable the controls we don't want the player to use.
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_AIM)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_RADIO_WHEEL)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CELLPHONE_UP)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK1)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
SET_FORCE_HD_VEHICLE(sGoldVans[0].veh, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
SET_FORCE_HD_VEHICLE(sGoldVans[1].veh, TRUE)
|
|
ENDIF
|
|
|
|
SETUP_REQ_FORCED_CREW(TRUE)
|
|
SETUP_REQ_CREW_VAN(<<358.6120, -637.1446, 28.9746>>, 0.0, TRUE)
|
|
REQUEST_CUTSCENE("bs_2a_mcs_1")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_1")
|
|
|
|
IF SETUP_REQ_FORCED_CREW()
|
|
AND SETUP_REQ_CREW_VAN(<<358.6120, -637.1446, 28.9746>>)
|
|
AND HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
|
|
IF IS_SCREEN_FADED_OUT()
|
|
REQUEST_COLLISION_AT_COORD(<<243.3412, -611.8222, 27.6962>>)
|
|
LOAD_SCENE(<<264.9509, -629.4653, 27.8277>>)
|
|
WAIT(1000)
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2A_MISSION_RESTART")
|
|
ENDIF
|
|
|
|
REMOVE_ALL_AUDIO_SCENES()
|
|
|
|
//Register entities
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
//STOP_SYNCHRONIZED_ENTITY_ANIM(sGoldVans[0].veh, NORMAL_BLEND_OUT, TRUE)
|
|
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_LOCKED_PLAYER_INSIDE)
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[0].veh, "Trevors_Truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, DUMMY_MODEL_FOR_SCRIPT, CEO_IS_CASCADE_SHADOW_FOCUS_ENTITY_DURING_EXIT)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
//STOP_SYNCHRONIZED_ENTITY_ANIM(sGoldVans[1].veh, NORMAL_BLEND_OUT, TRUE)
|
|
SET_VEHICLE_DOORS_LOCKED(sGoldVans[1].veh, VEHICLELOCK_LOCKED_PLAYER_INSIDE)
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[1].veh, "Michaels_Truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehBuddyVan)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(vehBuddyVan, "FBI_2_Burrito_Van", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sStartCar.veh, WALK_BLEND_OUT, TRUE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sStartCar.veh, "EXL_2_abandoned_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WALK_BLEND_OUT, TRUE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
SET_FORCE_FOOTSTEP_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sGoldVanPeds[CASEY_ID].ped, WALK_BLEND_OUT, TRUE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[CASEY_ID].ped, "Casey", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
SET_FORCE_FOOTSTEP_UPDATE(sGoldVanPeds[CASEY_ID].ped, FALSE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[CASEY_ID].ped, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[1].ped)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sGoldVanPeds[1].ped, WALK_BLEND_OUT, TRUE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[1].ped, "Left_Security", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
SET_FORCE_FOOTSTEP_UPDATE(sGoldVanPeds[1].ped, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[2].ped)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sGoldVanPeds[2].ped, WALK_BLEND_OUT, TRUE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[2].ped, "Middle_Security", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
SET_FORCE_FOOTSTEP_UPDATE(sGoldVanPeds[2].ped, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[3].ped)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sGoldVanPeds[3].ped, WALK_BLEND_OUT, TRUE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[3].ped, "Right_Security", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
SET_FORCE_FOOTSTEP_UPDATE(sGoldVanPeds[3].ped, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_FORCED_GUNMAN].ped)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_FORCED_GUNMAN].ped, "gunman_selection_2", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_FORCED_DRIVER].ped)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_FORCED_DRIVER].ped, "driver_selection_2", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sCrew[CREW_GUNMAN].ped, WALK_BLEND_OUT, TRUE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_GUNMAN].ped, "gunman_selection_1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
SET_FORCE_FOOTSTEP_UPDATE(sCrew[CREW_GUNMAN].ped, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sCrew[CREW_DRIVER].ped, WALK_BLEND_OUT, TRUE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_DRIVER].ped, "Driver_selection_1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
SET_FORCE_FOOTSTEP_UPDATE(sCrew[CREW_DRIVER].ped, FALSE)
|
|
ENDIF
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
START_CUTSCENE()
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
SETTIMERB(0)
|
|
bPlayersCarExitStateHasBeenHit = FALSE
|
|
iCurrentEvent = 0
|
|
iMusicTriggerEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
SWITCH iCurrentEvent
|
|
CASE 0
|
|
IF IS_CUTSCENE_PLAYING()
|
|
CLEAR_AREA(<<292.7276, -640.21, 28.1260>>, 300.0, TRUE)
|
|
SET_CLOCK_TIME(8, 15, 0)
|
|
|
|
CLEAR_PRINTS()
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
REMOVE_ANIM_DICT(strAnimsHijack)
|
|
SET_VEHICLE_MODEL_PLAYER_WILL_EXIT_SCENE(CAVALCADE2)
|
|
|
|
//Unfreeze the vehicles (they may have been frozen for the hijack sequence).
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
IF iMusicTriggerEvent = 0
|
|
IF GET_CUTSCENE_TIME() > 0
|
|
TRIGGER_MUSIC_EVENT("FH2A_STOP_TRACK")
|
|
iMusicTriggerEvent++
|
|
ENDIF
|
|
ELIF iMusicTriggerEvent = 1
|
|
IF GET_CUTSCENE_TIME() > 20000
|
|
TRIGGER_MUSIC_EVENT("FH2A_VAN_ST")
|
|
iMusicTriggerEvent++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF IS_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_FRONT_LEFT)
|
|
IF GET_CUTSCENE_TIME() > 5000
|
|
AND (GET_CUTSCENE_TIME() < 10000 OR bSkippedMocap)
|
|
FIX_ALL_VEHICLE_TYRES(sGoldVans[0].veh)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
IF IS_VEHICLE_TYRE_BURST(sStartCar.veh, SC_WHEEL_CAR_FRONT_LEFT)
|
|
OR IS_VEHICLE_TYRE_BURST(sStartCar.veh, SC_WHEEL_CAR_FRONT_RIGHT)
|
|
OR IS_VEHICLE_TYRE_BURST(sStartCar.veh, SC_WHEEL_CAR_REAR_LEFT)
|
|
OR IS_VEHICLE_TYRE_BURST(sStartCar.veh, SC_WHEEL_CAR_REAR_RIGHT)
|
|
FIX_ALL_VEHICLE_TYRES(sStartCar.veh)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-13.0 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
ENDIF
|
|
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_Truck")
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
SET_VEHICLE_DOORS_SHUT(sGoldVans[0].veh)
|
|
SET_VEHICLE_ENGINE_ON(sGoldVans[0].veh, TRUE, TRUE)
|
|
ENDIF
|
|
|
|
bPlayersCarExitStateHasBeenHit = TRUE
|
|
ELIF NOT bPlayersCarExitStateHasBeenHit
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION(sGoldVans[0].veh)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
//SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
//SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
//ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), FALSE)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
|
|
IF NOT bSkippedMocap
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
|
|
CLEAR_AREA_OF_VEHICLES(<<305.7, -649.8, 28.5>>, 500.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Casey")
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
SET_PED_INTO_VEHICLE(sGoldVanPeds[CASEY_ID].ped, sGoldVans[0].veh, VS_FRONT_RIGHT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sGoldVanPeds[CASEY_ID].ped)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_Truck")
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
FIX_ALL_VEHICLE_TYRES(sGoldVans[1].veh)
|
|
SET_VEHICLE_DOORS_SHUT(sGoldVans[1].veh)
|
|
//SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[1].veh)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
|
|
IF IS_PED_IN_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REMOVE_PED_FROM_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("gunman_selection_1")
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_GUNMAN].ped, sGoldVans[1].veh, VS_FRONT_RIGHT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sCrew[CREW_GUNMAN].ped)
|
|
|
|
IF IS_PED_IN_GROUP(sCrew[CREW_GUNMAN].ped)
|
|
REMOVE_PED_FROM_GROUP(sCrew[CREW_GUNMAN].ped)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Driver_selection_1")
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldVans[1].veh, VS_BACK_LEFT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sCrew[CREW_DRIVER].ped)
|
|
|
|
IF IS_PED_IN_GROUP(sCrew[CREW_DRIVER].ped)
|
|
REMOVE_PED_FROM_GROUP(sCrew[CREW_DRIVER].ped)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("EXL_2_abandoned_car")
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
//SET_VEHICLE_FORWARD_SPEED(sStartCar.veh, 6.0)
|
|
SET_VEHICLE_DOORS_SHUT(sStartCar.veh)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("FBI_2_Burrito_Van")
|
|
IF IS_VEHICLE_DRIVEABLE(vehBuddyVan)
|
|
SET_ENTITY_COORDS(vehBuddyVan, <<270.5670, -634.9897, 28.0222>>)
|
|
SET_ENTITY_HEADING(vehBuddyVan, 156.3148)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vehBuddyVan)
|
|
SET_VEHICLE_DOORS_SHUT(vehBuddyVan)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//First forced gunman gets in the start car.
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("gunman_selection_2")
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_FORCED_GUNMAN].ped)
|
|
AND IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sCrew[CREW_FORCED_GUNMAN].ped)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_FORCED_GUNMAN].ped, sStartCar.veh, VS_DRIVER)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sCrew[CREW_FORCED_GUNMAN].ped)
|
|
|
|
TASK_VEHICLE_DRIVE_TO_COORD(sCrew[CREW_FORCED_GUNMAN].ped, sStartCar.veh, <<-52.8134, -539.5832, 39.4661>>, 30.0, DRIVINGSTYLE_NORMAL, modelStartCar, DRIVINGMODE_AVOIDCARS, 10.0, 15.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Second one takes the van.
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("driver_selection_2")
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_FORCED_DRIVER].ped)
|
|
AND IS_VEHICLE_DRIVEABLE(vehBuddyVan)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sCrew[CREW_FORCED_DRIVER].ped)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_FORCED_DRIVER].ped, vehBuddyVan, VS_DRIVER)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sCrew[CREW_FORCED_DRIVER].ped)
|
|
|
|
TASK_VEHICLE_DRIVE_TO_COORD(sCrew[CREW_FORCED_DRIVER].ped, vehBuddyVan, <<502.8169, -1720.6942, 28.2174>>, 30.0, DRIVINGSTYLE_NORMAL,
|
|
modelBuddyVan, DRIVINGMODE_STOPFORCARS, 3.0, 3.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("left_security")
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[1].ped)
|
|
AND IS_VEHICLE_DRIVEABLE(vehBuddyVan)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sCrew[CREW_FORCED_DRIVER].ped)
|
|
SET_PED_INTO_VEHICLE(sGoldVanPeds[1].ped, vehBuddyVan, VS_BACK_LEFT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sGoldVanPeds[1].ped)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("middle_security")
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[2].ped)
|
|
AND IS_VEHICLE_DRIVEABLE(vehBuddyVan)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sCrew[CREW_FORCED_DRIVER].ped)
|
|
SET_PED_INTO_VEHICLE(sGoldVanPeds[2].ped, vehBuddyVan, VS_BACK_RIGHT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sGoldVanPeds[2].ped)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("right_security")
|
|
REMOVE_PED(sGoldVanPeds[3].ped, TRUE)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
bSkippedMocap = TRUE
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
CLEAR_PRINTS()
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
REMOVE_OBJECT(objStinger, TRUE)
|
|
|
|
REMOVE_ANIM_DICT(strStingerAnims)
|
|
REMOVE_PTFX_ASSET()
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_HIJACK_01")
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_1, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_2, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_VAN_STINGER_BUDDIES, strCarrec)
|
|
|
|
SET_ROADS_BACK_TO_ORIGINAL(<<320.0534, -700.1548, 28.2937>>, <<393.6534, -633.9548, 48.2937>>)
|
|
CLOSE_TUNNEL_PAVEMENTS(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
eMissionStage = STAGE_DRIVE_TO_BANK
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_DRIVE_TO_BANK)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DRIVE_TO_BANK()
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF iCurrentEvent != 99
|
|
IF SETUP_REQ_TUNNEL_INTERIOR_LOADED()
|
|
IF bHasUsedCheckpoint
|
|
START_REPLAY_SETUP(<<245.3721, -618.3200, 27.6025>>, 0.0, FALSE)
|
|
|
|
iCurrentEvent = 99
|
|
ELSE
|
|
//Fix for B*528757: Guarantee that the tunnel is loaded first before trying to set up everything else.
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<245.3721, -618.3200, 27.6025>>)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
LOAD_SCENE(<<245.3721, -618.3200, 28.6025>>)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
iCurrentEvent = 99
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
AND SETUP_REQ_GOLD_VANS_PRE_HIJACK(<<245.3721, -618.3200, 27.6025>>, 61.8374, <<264.9509, -629.4653, 27.8277>>, 61.4195, TRUE)
|
|
AND SETUP_REQ_MAIN_DRIVER(<<243.3721, -618.3200, 27.6025>>, 269.1434)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<244.3721, -618.3200, 27.6025>>, 269.1434)
|
|
AND SETUP_REQ_TREVOR(<<245.3721, -620.3200, 27.6025>>, 269.1434)
|
|
AND SETUP_REQ_START_CAR(<<228.3, -608.1, 27.16>>, 65.89)
|
|
AND SETUP_REQ_BANK_SECURITY()
|
|
AND SETUP_REQ_FORCED_CREW()
|
|
AND SETUP_REQ_CREW_VAN(<<270.5670, -634.9897, 28.0222>>, 156.3148)
|
|
AND SETUP_REQ_TUNNEL_INTERIOR_LOADED()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
SETUP_REQ_GOLD_VANS_PRE_HIJACK(<<245.3721, -618.3200, 27.6025>>, 61.8374, <<264.9509, -629.4653, 27.8277>>, 61.4195, FALSE) //883924 - Creating the vans too early meant they would fall through the map.
|
|
|
|
WAIT(0)
|
|
|
|
REMOVE_PED(sGoldVanPeds[3].ped, TRUE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehBuddyVan)
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_FORCED_DRIVER].ped)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_FORCED_DRIVER].ped, vehBuddyVan, VS_DRIVER)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[1].ped)
|
|
SET_PED_INTO_VEHICLE(sGoldVanPeds[1].ped, vehBuddyVan, VS_BACK_LEFT)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[2].ped)
|
|
SET_PED_INTO_VEHICLE(sGoldVanPeds[2].ped, vehBuddyVan, VS_BACK_RIGHT)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_DOORS_LOCKED(vehBuddyVan, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
SET_ENTITY_HEADING(sGoldVans[0].veh, 61.8374)
|
|
SET_ENTITY_COORDS(sGoldVans[0].veh, <<245.3721, -618.3200, 27.6025>>)
|
|
|
|
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_LOCKED_PLAYER_INSIDE)
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
SET_PED_INTO_VEHICLE(sGoldVanPeds[CASEY_ID].ped, sGoldVans[0].veh, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
SET_ENTITY_HEADING(sGoldVans[1].veh, 61.4195)
|
|
SET_ENTITY_COORDS(sGoldVans[1].veh, <<264.9509, -629.4653, 27.8277>>)
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_GUNMAN].ped, sGoldVans[1].veh, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldVans[1].veh, VS_BACK_LEFT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(sStartCar.veh)
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_FORCED_GUNMAN].ped)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_FORCED_GUNMAN].ped, sStartCar.veh, VS_DRIVER)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
//Remove anything that should leave during the previous cutscene, one hostage goes with the main crew, another two go with the forced crew.
|
|
REMOVE_PED(sGoldVanPeds[3].ped, TRUE)
|
|
REMOVE_OBJECT(objStinger, TRUE)
|
|
|
|
SETUP_REQ_CREW_HAVE_SHOTGUNS()
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
|
|
SET_ROADS_IN_AREA(<<-142.7897, -705.0483, 30.9823>>, <<-37.9477, -555.9297, 41.7746>>, FALSE)
|
|
SET_ROADS_BLOCKED_FOR_BANK_DRIVE(TRUE)
|
|
|
|
iNavmeshBlockBankEntrance = ADD_NAVMESH_BLOCKING_OBJECT(<<-89.0, -677.0, 34.4>>, <<20.0, 8.0, 5.0>>, DEG_TO_RAD(-111.3))
|
|
SET_PED_NON_CREATION_AREA(<<-103.5288, -691.6404, 17.4339>>, <<-69.4190, -655.5072, 37.4339>>)
|
|
|
|
CLEAR_AREA_OF_COPS(GET_ENTITY_COORDS(PLAYER_PED_ID()), 500.0)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(1.0)
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2A_VAN_RESTART")
|
|
|
|
CLEAR_AREA_OF_VEHICLES(<<305.7, -649.8, 28.5>>, 500.0)
|
|
ENDIF
|
|
|
|
//Allow the radio for the drive.
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
SET_VEHICLE_RADIO_ENABLED(sGoldVans[0].veh, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
SET_VEHICLE_DOORS_SHUT(sGoldVans[1].veh)
|
|
SET_VEHICLE_DOORS_LOCKED(sGoldVans[1].veh, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
AND NOT IS_PED_IN_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldVans[1].veh)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldVans[1].veh, VS_BACK_LEFT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
SET_VEHICLE_FORWARD_SPEED(sStartCar.veh, 6.0)
|
|
SET_VEHICLE_DOORS_LOCKED(sStartCar.veh, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_DRIVE_TO_BANK")
|
|
START_AUDIO_SCENE("BS_2A_DRIVE_TO_BANK")
|
|
ENDIF
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
SET_CLOCK_TIME(8, 15, 0)
|
|
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
SET_VEHICLE_FORWARD_SPEED(sStartCar.veh, 6.0)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
bVanTyreBurst = FALSE
|
|
bCustomGpsActive = FALSE
|
|
bBarriersAddedToBankInterior = FALSE
|
|
iTimeSinceVanLastDamaged = 0
|
|
fPrevDistanceFromBank = 0.0
|
|
sTrevor.iEvent = 0
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_DRIVE_TO_BANK, "DRIVE_TO_BANK")
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
//Set the base value for number of crashes.
|
|
STAT_GET_INT(SP0_NUMBER_CRASHES_CARS, iPrevNumVanCrashes)
|
|
|
|
SETTIMERB(0)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
#IF IS_DEBUG_BUILD
|
|
DONT_DO_J_SKIP(sLocatesData)
|
|
#ENDIF
|
|
|
|
IF TIMERB() < 8000
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
ENDIF
|
|
|
|
//Load path nodes based on where the buddies go in their tasks below.
|
|
//REQUEST_PATH_NODES_IN_AREA_THIS_FRAME(-152.8134, -1820.6942, 602.8169, 282.4809)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF NOT DOES_BLIP_EXIST(sGoldVans[1].blip)
|
|
sGoldVans[1].blip = CREATE_BLIP_FOR_COORD(GET_ENTITY_COORDS(sGoldVans[1].veh))
|
|
SET_BLIP_COLOUR(sGoldVans[1].blip, BLIP_COLOUR_BLUE)
|
|
SET_BLIP_NAME_FROM_TEXT_FILE(sGoldVans[1].blip, "BLIP_VEH")
|
|
ELSE
|
|
VECTOR vBlipPosition = GET_BLIP_COORDS(sGoldVans[1].blip)
|
|
VECTOR vVehiclePosition = GET_ENTITY_COORDS(sGoldVans[1].veh)
|
|
|
|
vBlipPosition.X = vBlipPosition.X + ((vVehiclePosition.X - vBlipPosition.X) * 0.1)
|
|
vBlipPosition.Y = vBlipPosition.Y + ((vVehiclePosition.Y - vBlipPosition.Y) * 0.1)
|
|
vBlipPosition.Z = vBlipPosition.Z + ((vVehiclePosition.Z - vBlipPosition.Z) * 0.1)
|
|
|
|
SET_BLIP_COORDS(sGoldVans[1].blip, vBlipPosition)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
FLOAT fDistToBank = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vOutsideSecurityGate)
|
|
BOOL bDontPlayDialogueAtBank = (fDistToBank < (42.0 * 42.0))
|
|
|
|
//940149 - the player is locked inside the van, disable the exit button too to prevent any attempts to leave.
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
|
|
|
|
SETUP_REQ_SECURITY_BARRIERS()
|
|
|
|
//Need to grab the car park interior due to having to set the doors as part of it across the whole mission.
|
|
IF NOT bBarriersAddedToBankInterior
|
|
IF DOES_ENTITY_EXIST(objSecurityBarriers[0])
|
|
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(objSecurityBarriers[0])) < 10000.0
|
|
IF interiorBankCarPark = NULL
|
|
interiorBankCarPark = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-1.2993, -678.8333, 33.7190>>, "dt1_03_carpark")
|
|
ELSE
|
|
IF IS_INTERIOR_READY(interiorBankCarPark)
|
|
FORCE_ROOM_FOR_ENTITY(objSecurityBarriers[0], interiorBankCarPark, HASH("GtaMloRoom002"))
|
|
bBarriersAddedToBankInterior = TRUE
|
|
ELSE
|
|
PIN_INTERIOR_IN_MEMORY(interiorBankCarPark)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0
|
|
DRAW_CLOCK("F3A_TRUCKCLOCK", TRUE, 9, 0, TIMER_STYLE_DONTUSEMILLISECONDS)
|
|
UPDATE_SECURITY_GUARD_IDLES()
|
|
|
|
IF NOT bHasTextLabelTriggered[FH3A_GOING]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_GOING", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_GOING] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//NOTE: using a custom area check, so this command is just handling blips etc and not progressing the mission.
|
|
IF IS_PLAYER_AT_LOCATION_WITH_BUDDY_IN_VEHICLE(sLocatesData, vOutsideSecurityGate, <<0.001, 0.001, LOCATE_SIZE_HEIGHT>>, TRUE, sGoldVanPeds[CASEY_ID].ped,
|
|
sGoldVans[0].veh, "F3A_GOTOBANK", "F3A_WORKER", "F3A_GETINVAN", "F3A_GETBACKVAN", FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(sGoldVans[0].veh, <<-75.195908,-682.383057,32.872246>>, <<-83.605576,-679.183838,37.291779>>, 10.250000)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
|
|
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ELSE
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT bHasTextLabelTriggered[FH3A_CHAT4]
|
|
AND CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_CHAT4", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_CHAT4] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF bCustomGPSActive
|
|
SET_GPS_CUSTOM_ROUTE_RENDER(FALSE, 18, 30)
|
|
CLEAR_GPS_CUSTOM_ROUTE()
|
|
bCustomGPSActive = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some dialogue from Trevor if the player takes their time.
|
|
IF NOT bHasTextLabelTriggered[FH3A_LATE]
|
|
IF GET_CLOCK_HOURS() >= 9
|
|
AND eSectionStage != SECTION_STAGE_CLEANUP
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LATE", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_LATE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Kill the main conversation early, this is so it doesn't interfere with any preloading next stage.
|
|
IF bDontPlayDialogueAtBank
|
|
TEXT_LABEL strCurrentRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
|
|
|
|
IF ARE_STRINGS_EQUAL(strCurrentRoot, "FH3A_CHAT4")
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Request assets for next stage in advance.
|
|
IF fDistToBank < 22500.0
|
|
REQUEST_VEHICLE_RECORDING(CARREC_BANK_PARK_1, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_BANK_PARK_2, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_BANK_LEAVE_GATE, strCarrec)
|
|
REQUEST_ANIM_DICT(strAnimIG2)
|
|
REQUEST_MODEL(modelIDCard)
|
|
REQUEST_ANIM_DICT("map_objects")
|
|
SETUP_REQ_BANK_WORKER(<<-5.6968, -659.2569, 32.4827>>, 194.4753, TRUE)
|
|
SETUP_REQ_BANK_WORKER_WALKIE_TALKIE(TRUE)
|
|
SETUP_REQ_BANK_SECURITY()
|
|
ENDIF
|
|
|
|
//Remove the tunnel interiors once the buddy has left.
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(sGoldVans[1].veh, <<121.167610,-573.820129,30.425274>>, <<113.940147,-571.216553,36.674660>>, 34.000000)
|
|
IF interiorTunnel != NULL
|
|
UNPIN_INTERIOR(interiorTunnel)
|
|
interiorTunnel = NULL
|
|
ENDIF
|
|
|
|
IF interiorTunnel2 != NULL
|
|
UNPIN_INTERIOR(interiorTunnel2)
|
|
interiorTunnel2 = NULL
|
|
ENDIF
|
|
|
|
IF interiorTunnel3 != NULL
|
|
UNPIN_INTERIOR(interiorTunnel3)
|
|
interiorTunnel3 = NULL
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Trevor behaviour: follows the player and parks nearby and waits for the player to enter the area.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF IS_PED_IN_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REMOVE_PED_FROM_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
|
|
VECTOR vTrevorPos = GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
VECTOR vParkPos1 = <<-111.2413, -652.2602, 34.8744>>
|
|
VECTOR vClosetNodePos, vWarpNodePos, vWarpNodePos2
|
|
//VECTOR vParkPos2 = <<-101.2792, -689.6624, 33.8881>>
|
|
INT iClosestNodePlayer, iClosestNodeTrevor
|
|
|
|
SWITCH sTrevor.iEvent
|
|
CASE 0 //Use a waypoint recording
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointVehGotoBank)
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehGotoBank)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointVehGotoBank, vPlayerPos, iClosestNodePlayer)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointVehGotoBank, vTrevorPos, iClosestNodeTrevor)
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) != PERFORMING_TASK
|
|
IF VDIST2(vTrevorPos, vParkPos1) > 64.0
|
|
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh, strWaypointVehGotoBank,
|
|
DRIVINGMODE_AVOIDCARS, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, -1, 40.0)
|
|
|
|
TASK_LOOK_AT_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
|
|
ENDIF
|
|
ELSE
|
|
IF iClosestNodePlayer - iClosestNodeTrevor < 3
|
|
AND VDIST2(vOutsideSecurityGate, GET_ENTITY_COORDS(PLAYER_PED_ID())) > 100.0
|
|
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
SET_DRIVE_TASK_CRUISE_SPEED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.0)
|
|
ELSE
|
|
SET_DRIVE_TASK_CRUISE_SPEED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 40.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Warp if he gets too far behind.
|
|
IF iClosestNodePlayer - iClosestNodeTrevor > 9
|
|
WAYPOINT_RECORDING_GET_COORD(strWaypointVehGotoBank, iClosestNodePlayer, vClosetNodePos)
|
|
|
|
IF VDIST2(vClosetNodePos, vPlayerPos) < 625.0
|
|
WAYPOINT_RECORDING_GET_COORD(strWaypointVehGotoBank, iClosestNodePlayer - 5, vWarpNodePos)
|
|
WAYPOINT_RECORDING_GET_COORD(strWaypointVehGotoBank, iClosestNodePlayer - 4, vWarpNodePos2)
|
|
|
|
IF NOT IS_SPHERE_VISIBLE(vWarpNodePos, 3.0)
|
|
AND VDIST2(vWarpNodePos, vParkPos1) > 64.0
|
|
CLEAR_AREA(vWarpNodePos, 3.0, TRUE)
|
|
SET_ENTITY_HEADING(sGoldVans[1].veh, GET_HEADING_FROM_VECTOR_2D(vWarpNodePos2.x - vWarpNodePos.x, vWarpNodePos2.y - vWarpNodePos.y))
|
|
SET_ENTITY_COORDS(sGoldVans[1].veh, vWarpNodePos)
|
|
SET_VEHICLE_FORWARD_SPEED(sGoldVans[1].veh, 20.0)
|
|
CLEAR_PED_TASKS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Vehicle recording version
|
|
/*REQUEST_WAYPOINT_RECORDING(strWaypointVehGotoBank)
|
|
REQUEST_VEHICLE_RECORDING(801, strCarrec)
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehGotoBank)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(801, strCarrec)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointVehGotoBank, GET_ENTITY_COORDS(sGoldVans[0].veh), iClosestNodePlayer)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointVehGotoBank, vTrevorPos, iClosestNodeTrevor)
|
|
|
|
IF iClosestNodePlayer - iClosestNodeTrevor > 3
|
|
IF VDIST2(vTrevorPos, vParkPos1) > 25.0
|
|
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
IF NOT IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
START_PLAYBACK_RECORDED_VEHICLE_USING_AI(sGoldVans[1].veh, 801, strCarrec, 30.0, DRIVINGMODE_AVOIDCARS)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF VDIST2(vOutsideSecurityGate, GET_ENTITY_COORDS(PLAYER_PED_ID())) > 100.0
|
|
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
IF IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
//Drive straight to coords version.
|
|
/*REQUEST_WAYPOINT_RECORDING(strWaypointVehGotoBank)
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehGotoBank)
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) != PERFORMING_TASK
|
|
IF VDIST2(vTrevorPos, vParkPos1) > 25.0
|
|
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
TASK_VEHICLE_DRIVE_TO_COORD(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh, vParkPos1, 30.0, DRIVINGSTYLE_NORMAL, GET_ENTITY_MODEL(sGoldVans[1].veh),
|
|
DRIVINGMODE_AVOIDCARS, 2.0, 3.0)
|
|
ENDIF
|
|
ELSE
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointVehGotoBank, GET_ENTITY_COORDS(sGoldVans[0].veh), iClosestNodePlayer)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointVehGotoBank, vTrevorPos, iClosestNodeTrevor)
|
|
|
|
IF iClosestNodePlayer - iClosestNodeTrevor < 3
|
|
AND VDIST2(vOutsideSecurityGate, GET_ENTITY_COORDS(PLAYER_PED_ID())) > 100.0
|
|
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
SET_DRIVE_TASK_CRUISE_SPEED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.0)
|
|
ELSE
|
|
SET_DRIVE_TASK_CRUISE_SPEED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 30.0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
IF iCurrentEvent >= 5
|
|
sTrevor.iEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Once player starts going inside use a waypoint recording as there are no road nodes.
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointVehEnterBank)
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehEnterBank)
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) != PERFORMING_TASK
|
|
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh, strWaypointVehEnterBank,
|
|
DRIVINGMODE_STOPFORCARS_IGNORELIGHTS, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, -1, 10.0)
|
|
SET_DRIVE_TASK_CRUISE_SPEED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 20.0)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
|
|
//Forced crew 2 drives off in the van. Delete all of them once they're off-screen.
|
|
IF DOES_ENTITY_EXIST(vehBuddyVan)
|
|
//Fail if the player messes with this car before it's deleted.
|
|
IF NOT IS_VEHICLE_DRIVEABLE(vehBuddyVan)
|
|
MISSION_FAILED(FAILED_START_CAR_DESTROYED)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_FORCED_DRIVER].ped)
|
|
AND IS_VEHICLE_DRIVEABLE(vehBuddyVan)
|
|
IF NOT IS_PED_SITTING_IN_VEHICLE(sCrew[CREW_FORCED_DRIVER].ped, vehBuddyVan)
|
|
IF GET_SCRIPT_TASK_STATUS(sCrew[CREW_FORCED_DRIVER].ped, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
|
|
TASK_ENTER_VEHICLE(sCrew[CREW_FORCED_DRIVER].ped, vehBuddyVan, -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_FORCED_DRIVER].ped, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF GET_SCRIPT_TASK_STATUS(sCrew[CREW_FORCED_DRIVER].ped, SCRIPT_TASK_VEHICLE_DRIVE_TO_COORD) != PERFORMING_TASK
|
|
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(sCrew[CREW_FORCED_DRIVER].ped, vehBuddyVan, <<502.8169, -1720.6942, 28.2174>>, 30.0, DRIVINGMODE_STOPFORCARS | DF_UseSwitchedOffNodes, 3.0)
|
|
ENDIF
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sCrew[CREW_FORCED_DRIVER].ped)) > 10000.0
|
|
IF NOT IS_ENTITY_ON_SCREEN(sCrew[CREW_FORCED_DRIVER].ped)
|
|
REMOVE_PED(sCrew[CREW_FORCED_DRIVER].ped, TRUE)
|
|
REMOVE_PED(sGoldVanPeds[1].ped, TRUE)
|
|
REMOVE_PED(sGoldVanPeds[2].ped, TRUE)
|
|
REMOVE_VEHICLE(vehBuddyVan, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Forced crew 1 drives off in the start car.
|
|
IF DOES_ENTITY_EXIST(sStartCar.veh)
|
|
//Fail if the player messes with this car before it's deleted.
|
|
IF NOT IS_VEHICLE_DRIVEABLE(sStartCar.veh, TRUE)
|
|
MISSION_FAILED(FAILED_START_CAR_DESTROYED)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_FORCED_GUNMAN].ped)
|
|
AND IS_VEHICLE_DRIVEABLE(sStartCar.veh)
|
|
IF NOT IS_PED_SITTING_IN_VEHICLE(sCrew[CREW_FORCED_GUNMAN].ped, sStartCar.veh)
|
|
IF GET_SCRIPT_TASK_STATUS(sCrew[CREW_FORCED_GUNMAN].ped, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
|
|
TASK_ENTER_VEHICLE(sCrew[CREW_FORCED_GUNMAN].ped, sStartCar.veh, -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_FORCED_GUNMAN].ped, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
SET_VEHICLE_DOOR_CONTROL(sStartCar.veh, SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_CONTROL(sStartCar.veh, SC_DOOR_FRONT_RIGHT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_CONTROL(sStartCar.veh, SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_CONTROL(sStartCar.veh, SC_DOOR_REAR_RIGHT, DT_DOOR_INTACT, 0.0)
|
|
|
|
SEQUENCE_INDEX seq
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(sCrew[CREW_FORCED_GUNMAN].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_VEHICLE_DRIVE_TO_COORD(NULL, sStartCar.veh, <<-52.8134, -539.5832, 39.4661>>, 20.0, DRIVINGSTYLE_ACCURATE, modelStartCar, DRIVINGMODE_AVOIDCARS | DF_UseSwitchedOffNodes, 10.0, 15.0)
|
|
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, sStartCar.veh, <<205.7986, 182.4809, 104.3646>>, 20.0, DRIVINGMODE_AVOIDCARS | DF_UseSwitchedOffNodes, 3.0)
|
|
TASK_VEHICLE_DRIVE_WANDER(NULL, sStartCar.veh, 30.0, DRIVINGMODE_AVOIDCARS | DF_UseSwitchedOffNodes)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sCrew[CREW_FORCED_GUNMAN].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_FORCED_GUNMAN].ped, TRUE)
|
|
ENDIF
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sCrew[CREW_FORCED_GUNMAN].ped)) > 10000.0
|
|
IF NOT IS_ENTITY_ON_SCREEN(sCrew[CREW_FORCED_GUNMAN].ped)
|
|
REMOVE_PED(sCrew[CREW_FORCED_GUNMAN].ped, TRUE)
|
|
REMOVE_VEHICLE(sStartCar.veh, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF bDebugDrawGateCollision
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
|
|
IF DOES_ENTITY_EXIST(objSecurityGateCollision[0])
|
|
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objSecurityGateCollision[0], <<0.0, 0.0, 0.0>>), 0.1)
|
|
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objSecurityGateCollision[0], <<-3.0, 0.0, 0.0>>), 0.1)
|
|
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objSecurityGateCollision[0], <<3.0, 0.0, 0.0>>), 0.1)
|
|
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objSecurityGateCollision[0], <<0.0, 0.0, 2.0>>), 0.1)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(objSecurityGateCollision[1])
|
|
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objSecurityGateCollision[1], <<0.0, 0.0, 0.0>>), 0.1)
|
|
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objSecurityGateCollision[1], <<-3.0, 0.0, 0.0>>), 0.1)
|
|
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objSecurityGateCollision[1], <<3.0, 0.0, 0.0>>), 0.1)
|
|
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objSecurityGateCollision[1], <<0.0, 0.0, 2.0>>), 0.1)
|
|
ENDIF
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
//Fail for the player's van getting stuck
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF IS_VEHICLE_PERMANENTLY_STUCK(sGoldVans[0].veh)
|
|
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
MISSION_FAILED(FAILED_VAN_STUCK)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail if the player hurts the security ped.
|
|
IF NOT IS_PED_INJURED(pedGateSecurity)
|
|
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedGateSecurity, PLAYER_PED_ID())
|
|
OR IS_PED_RAGDOLL(pedGateSecurity)
|
|
OR (IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh) AND GET_ENTITY_SPEED(sGoldVans[0].veh) > 1.0 AND IS_ENTITY_TOUCHING_ENTITY(sGoldVans[0].veh, pedGateSecurity))
|
|
MISSION_FAILED(FAILED_ALERTED_BANK_BY_KILLING_SECURITY)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail if the player causes explosions around the entrance.
|
|
ENTITY_INDEX entityExplosion = GET_OWNER_OF_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, <<-106.440224,-635.586426,25.639248>>, <<49.404850,-692.630066,66.712708>>, 120.750000)
|
|
|
|
IF NOT IS_ENTITY_DEAD(entityExplosion)
|
|
IF IS_ENTITY_A_PED(entityExplosion)
|
|
IF GET_PED_INDEX_FROM_ENTITY_INDEX(entityExplosion) = PLAYER_PED_ID()
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("finale_heist2A.sc - Explosion triggered at bank.")
|
|
#ENDIF
|
|
|
|
MISSION_FAILED(FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail if the player shoots around the entrance.
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-153.177765,-649.173767,30.428072>>, <<104.136414,-744.619141,56.003754>>, 128.500000)
|
|
IF IS_PED_SHOOTING(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("finale_heist2A.sc - Player shooting at bank.")
|
|
#ENDIF
|
|
|
|
MISSION_FAILED(FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail for getting a wanted level.
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
MISSION_FAILED(FAILED_ALERTED_COPS)
|
|
ENDIF
|
|
|
|
//Fail for damaging the vans too much
|
|
IF HAS_VEHICLE_HAD_MULTIPLE_PARTS_DAMAGED(sGoldVans[0].veh, 2)
|
|
MISSION_FAILED(FAILED_MICHAEL_VAN_TOO_DAMAGED)
|
|
ENDIF
|
|
|
|
IF HAS_VEHICLE_HAD_MULTIPLE_PARTS_DAMAGED(sGoldVans[1].veh, 3)
|
|
AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sGoldVans[1].veh, PLAYER_PED_ID())
|
|
MISSION_FAILED(FAILED_TREVOR_VAN_TOO_DAMAGED)
|
|
ENDIF
|
|
|
|
INT iNumCrashes
|
|
STAT_GET_INT(SP0_NUMBER_CRASHES_CARS, iNumCrashes)
|
|
|
|
//Play some dialogue from Trevor if the player crashes.
|
|
IF iNumCrashes > iPrevNumVanCrashes
|
|
AND NOT bDontPlayDialogueAtBank
|
|
IF GET_GAME_TIMER() - iTimeSinceVanLastDamaged > 8000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MESS", CONV_PRIORITY_MEDIUM)
|
|
iTimeSinceVanLastDamaged = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF GET_ENTITY_SPEED(sGoldVans[0].veh) > 5.0
|
|
iTimeSinceVanLastMovedQuickly = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
//If the player picked a bad gunman for the tyre changing bit then one of the tyres bursts.
|
|
IF NOT bVanTyreBurst
|
|
IF NOT bPickedGoodSecondGunman
|
|
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh)
|
|
REQUEST_PTFX_ASSET()
|
|
|
|
IF NOT IS_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_RIGHT)
|
|
IF fDistToBank < 10000.0
|
|
AND HAS_PTFX_ASSET_LOADED()
|
|
SET_VEHICLE_TYRE_BURST(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_RIGHT, FALSE, 1.0)
|
|
SET_VEHICLE_TYRES_CAN_BURST(sGoldVans[0].veh, FALSE)
|
|
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_bigscore_tyre_spiked", sGoldVans[0].veh, <<1.500, -3.000, -0.300>>, <<0.0, 0.0, 0.0>>)
|
|
bVanTyreBurst = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF bHasTextLabelTriggered[FH3A_GOING]
|
|
AND NOT bHasTextLabelTriggered[FH3A_BURST]
|
|
AND NOT bDontPlayDialogueAtBank
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_BURST", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_BURST] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If the player drives off course for a sustained period then play dialogue.
|
|
IF fDistToBank > fPrevDistanceFromBank
|
|
IF GET_GAME_TIMER() - iWrongWayDialogueTimer > 3000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_WRONG", CONV_PRIORITY_MEDIUM)
|
|
iWrongWayDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 5000)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iWrongWayDialogueTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail for taking too long to get to the bank.
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-72.879677,-682.367188,34.794189>>, <<-124.106529,-663.455139,40.755051>>, 40.750000)
|
|
//Fail if the player is near the bank entrance and crashes the van.
|
|
IF iNumCrashes > iPrevNumVanCrashes
|
|
//The stat is a bit too sensitive for this situation, so check how fast the van was going recently.
|
|
IF GET_GAME_TIMER() - iTimeSinceVanLastMovedQuickly < 1000
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("finale_heist2A.sc - Player crashed at bank.")
|
|
#ENDIF
|
|
|
|
MISSION_FAILED(FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage != SECTION_STAGE_CLEANUP
|
|
IF GET_CLOCK_HOURS() >= 9
|
|
AND GET_CLOCK_MINUTES() >= 15
|
|
MISSION_FAILED(FAILED_ALERTED_BANK_VIA_GPS)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iPrevNumVanCrashes = iNumCrashes
|
|
fPrevDistanceFromBank = fDistToBank
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
REMOVE_ALL_BLIPS()
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
SETTIMERB(0)
|
|
|
|
REMOVE_PED(sCrew[CREW_FORCED_GUNMAN].ped, TRUE)
|
|
REMOVE_PED(sCrew[CREW_FORCED_DRIVER].ped, TRUE)
|
|
REMOVE_PED(sGoldVanPeds[1].ped, TRUE)
|
|
REMOVE_PED(sGoldVanPeds[2].ped, TRUE)
|
|
REMOVE_VEHICLE(sStartCar.veh, TRUE)
|
|
SET_ROADS_BLOCKED_FOR_BANK_DRIVE(FALSE)
|
|
|
|
REMOVE_ANIM_DICT(strAnimIG1)
|
|
REMOVE_PTFX_ASSET()
|
|
|
|
REMOVE_VEHICLE_ASSET(modelStartCar)
|
|
|
|
IF bCustomGPSActive
|
|
SET_GPS_MULTI_ROUTE_RENDER(FALSE)
|
|
SET_GPS_CUSTOM_ROUTE_RENDER(FALSE, 18, 30)
|
|
CLEAR_GPS_CUSTOM_ROUTE()
|
|
CLEAR_GPS_MULTI_ROUTE()
|
|
bCustomGPSActive = FALSE
|
|
ENDIF
|
|
|
|
IF interiorTunnel != NULL
|
|
UNPIN_INTERIOR(interiorTunnel)
|
|
interiorTunnel = NULL
|
|
ENDIF
|
|
|
|
IF interiorTunnel2 != NULL
|
|
UNPIN_INTERIOR(interiorTunnel2)
|
|
interiorTunnel2 = NULL
|
|
ENDIF
|
|
|
|
IF interiorTunnel3 != NULL
|
|
UNPIN_INTERIOR(interiorTunnel3)
|
|
interiorTunnel3 = NULL
|
|
ENDIF
|
|
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointVehEnterBank)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointVehGotoBank)
|
|
|
|
eMissionStage = STAGE_BANK_PARK_CUTSCENE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
CLEAR_PRINTS()
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 2.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
SET_PED_INTO_VEHICLE(sGoldVanPeds[CASEY_ID].ped, sGoldVans[0].veh, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh)
|
|
SET_ENTITY_COORDS(sGoldVans[0].veh, <<-77.3776, -679.9720, 33.2765>>)
|
|
SET_ENTITY_HEADING(sGoldVans[0].veh, 253.4059)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[0].veh)
|
|
ENDIF
|
|
|
|
WHILE NOT SETUP_REQ_SECURITY_BARRIERS()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
PROC BANK_PARK_CUTSCENE_2()
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF iCurrentEvent != 99
|
|
IF bHasUsedCheckpoint
|
|
START_REPLAY_SETUP(<<-77.3776, -679.9720, 33.2765>>, 0.0, FALSE)
|
|
|
|
iCurrentEvent = 99
|
|
ELSE
|
|
//Fix for B*528757: Guarantee that the tunnel is loaded first before trying to set up everything else.
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-77.3776, -679.9720, 33.2765>>)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
iCurrentEvent = 99
|
|
ENDIF
|
|
ELSE
|
|
IF SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
AND SETUP_REQ_GOLD_VANS_POST_HIJACK(<<-77.3776, -679.9720, 33.2765>>, 253.4059, <<419.8341, -678.7876, 28.9040>>, 69.4937)
|
|
AND SETUP_REQ_MAIN_DRIVER(<<-4.2024, -675.4505, 31.3410>>, 269.1434)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<-5.2024, -675.4505, 31.3410>>, 269.1434)
|
|
AND SETUP_REQ_TREVOR(<<-77.3776, -674.9720, 33.2765>>, 269.1434)
|
|
AND SETUP_REQ_BANK_SECURITY()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
|
|
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-8.63, -671.79, 31.3406>>, -136.525)
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
|
|
WHILE NOT SETUP_REQ_SECURITY_BARRIERS()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
SET_ENTITY_HEADING(sGoldVans[0].veh, 253.4059)
|
|
SET_ENTITY_COORDS(sGoldVans[0].veh, <<-77.3776, -679.9720, 33.2765>>)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[0].veh)
|
|
|
|
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_LOCKED_PLAYER_INSIDE)
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
SET_PED_INTO_VEHICLE(sGoldVanPeds[CASEY_ID].ped, sGoldVans[0].veh, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
SET_VEHICLE_DOORS_LOCKED(sGoldVans[1].veh, VEHICLELOCK_UNLOCKED)
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldVans[1].veh, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_GUNMAN].ped, sGoldVans[1].veh, VS_BACK_LEFT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_VEHICLE_RECORDING(CARREC_BANK_PARK_1, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_BANK_PARK_2, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_BANK_LEAVE_GATE, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_BANK_TREVOR, strCarrec)
|
|
REQUEST_ANIM_DICT(strAnimIG2)
|
|
REQUEST_MODEL(modelIDCard)
|
|
REQUEST_ANIM_DICT("map_objects")
|
|
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
|
|
IF NOT bHasTextLabelTriggered[FH3A_GATE_PRELOAD]
|
|
IF NOT IS_PED_INJURED(pedGateSecurity)
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, pedGateSecurity, "BS2BankSecurity")
|
|
ENDIF
|
|
|
|
IF PRELOAD_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_GATE", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_GATE_PRELOAD] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BOOL bPreloadedConversationIsReady = FALSE
|
|
|
|
IF bHasTextLabelTriggered[FH3A_GATE_PRELOAD]
|
|
IF GET_IS_PRELOADED_CONVERSATION_READY()
|
|
OR TIMERB() > 3000
|
|
bPreloadedConversationIsReady = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF SETUP_REQ_BANK_WORKER(<<-5.6968, -661.2569, 32.4827>>, 194.4753)
|
|
AND SETUP_REQ_BANK_WORKER_WALKIE_TALKIE()
|
|
AND SETUP_REQ_BANK_INTERIOR_LOADED()
|
|
AND SETUP_REQ_BACKGROUND_CAR_PARK_INTERIOR_LOADED()
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_BANK_PARK_1, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_BANK_PARK_2, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_BANK_LEAVE_GATE, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_BANK_TREVOR, strCarrec)
|
|
AND HAS_ANIM_DICT_LOADED("map_objects")
|
|
AND HAS_ANIM_DICT_LOADED(strAnimIG2)
|
|
AND HAS_MODEL_LOADED(modelIDCard)
|
|
AND (NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData) OR bPreloadedConversationIsReady)
|
|
AND TIMERB() > 700
|
|
CLEAR_PRINTS()
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2A_VAN_RESTART")
|
|
|
|
WAIT(0)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 10.0, TRUE)
|
|
|
|
objIDCard = CREATE_OBJECT(modelIDCard, GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<0.0, 0.0, 1.0>>)
|
|
ATTACH_ENTITY_TO_ENTITY(objIDCard, sGoldVanPeds[CASEY_ID].ped, GET_PED_BONE_INDEX(sGoldVanPeds[CASEY_ID].ped, BONETAG_PH_R_HAND), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelIDCard)
|
|
|
|
//SET_ENTITY_COORDS(sGoldVans[0].veh, <<-78.3811, -680.3818, 33.3975>>)
|
|
//SET_ENTITY_HEADING(sGoldVans[0].veh, 253.0606)
|
|
//SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[0].veh)
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, CARREC_BANK_LEAVE_GATE, strCarrec)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[0].veh)
|
|
SET_PLAYBACK_SPEED(sGoldVans[0].veh, 0.0)
|
|
SET_VEHICLE_ENGINE_HEALTH(sGoldVans[0].veh, 1000.0)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(sGoldVans[0].veh, 1000.0)
|
|
//RESET_VEHICLE_WHEELS(sGoldVans[0].veh, FALSE)
|
|
|
|
//Place Trevor nearby in case he got stuck during the journey.
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
CLEAR_AREA(<<-111.2413, -652.2602, 34.8744>>, 10.0, TRUE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, CARREC_BANK_TREVOR, strCarrec)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[1].veh)
|
|
SET_VEHICLE_ENGINE_HEALTH(sGoldVans[1].veh, 1000.0)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(sGoldVans[1].veh, 1000.0)
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF IS_PED_IN_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REMOVE_PED_FROM_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
|
|
TASK_CLEAR_LOOK_AT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh, VS_DRIVER)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
ENDIF
|
|
|
|
sTrevor.iEvent = 0
|
|
ENDIF
|
|
|
|
ROLL_DOWN_WINDOWS(sGoldVans[0].veh)
|
|
SET_VEHICLE_RADIO_ENABLED(sGoldVans[0].veh, FALSE)
|
|
|
|
//The bank worker and the security guard in this cutscene share the same speaker number, so make sure the guard takes priority here.
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, pedGateSecurity, "BS2BankSecurity")
|
|
|
|
REMOVE_ALL_AUDIO_SCENES()
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_PARK_UP_CUTSCENE")
|
|
START_AUDIO_SCENE("BS_2A_PARK_UP_CUTSCENE")
|
|
ENDIF
|
|
|
|
//Two synced scenes are required for this point: one attached to the car for the peds inside and one not attached for the camera and guard.
|
|
iSyncSceneArriveAtBank = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncSceneArriveAtBank, sGoldVans[0].veh, 0)
|
|
|
|
iSyncSceneArriveAtBank2 = CREATE_SYNCHRONIZED_SCENE(GET_ENTITY_COORDS(sGoldVans[0].veh), GET_ENTITY_ROTATION(sGoldVans[0].veh))
|
|
|
|
camMain = CREATE_CAM("DEFAULT_ANIMATED_CAMERA")
|
|
PLAY_SYNCHRONIZED_CAM_ANIM(camMain, iSyncSceneArriveAtBank2, "check_id_cam", strAnimIG2)
|
|
SET_CAM_ACTIVE(camMain, TRUE)
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sGoldVanPeds[CASEY_ID].ped)
|
|
|
|
IF NOT IS_PED_INJURED(pedGateSecurity)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(pedGateSecurity)
|
|
TASK_SYNCHRONIZED_SCENE(pedGateSecurity, iSyncSceneArriveAtBank2, strAnimIG2, "check_id_guard", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
|
|
ENDIF
|
|
|
|
TASK_SYNCHRONIZED_SCENE(sGoldVanPeds[CASEY_ID].ped, iSyncSceneArriveAtBank, strAnimIG2, "check_id_guy", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
|
|
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSyncSceneArriveAtBank, strAnimIG2, "check_id_player0", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
|
|
|
|
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 200.0, TRUE)
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent = 0
|
|
bSkippedMocap = FALSE
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2A_ARRIVE_BANK")
|
|
|
|
NEW_LOAD_SCENE_START_SPHERE(<<-4.3, -685.2, 33.0>>, 50.0)
|
|
|
|
REMOVE_MICHAEL_SHOTGUN_SILENCER()
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
IF NOT bHasTextLabelTriggered[FH3A_GATE]
|
|
IF NOT bHasTextLabelTriggered[FH3A_GATE_PRELOAD]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_GATE", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_GATE] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
BEGIN_PRELOADED_CONVERSATION()
|
|
bHasTextLabelTriggered[FH3A_GATE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
//IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
// PRINTLN(GET_TIME_POSITION_IN_RECORDING(sGoldVans[1].veh))
|
|
//ENDIF
|
|
|
|
SWITCH sTrevor.iEvent
|
|
CASE 0 //Once Trevor's recording reaches the waiting point then pause playback.
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
IF GET_TIME_POSITION_IN_RECORDING(sGoldVans[1].veh) > 10000.0
|
|
SET_PLAYBACK_SPEED(sGoldVans[1].veh, 0.0)
|
|
|
|
sTrevor.iTimer = 0
|
|
sTrevor.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Once Michael leaves have Trevor follow.
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
IF sTrevor.iTimer = 0
|
|
IF GET_ENTITY_SPEED(sGoldVans[0].veh) > 1.0
|
|
sTrevor.iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELIF GET_GAME_TIMER() - sTrevor.iTimer > 100
|
|
SET_PLAYBACK_SPEED(sGoldVans[1].veh, 1.0)
|
|
|
|
sTrevor.iTimer = 0
|
|
sTrevor.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0 //Start the door opening.
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneArriveAtBank)
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_BANK_DOOR")
|
|
AND HAS_ANIM_DICT_LOADED("map_objects")
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneArriveAtBank) > 0.7
|
|
PLAY_SOUND_FROM_ENTITY(iBankGateOpenSound, "BANK_DOOR_OPEN", objSecurityBarriers[0], "BIG_SCORE_3A_SOUNDS")
|
|
PLAY_ENTITY_ANIM(objSecurityBarriers[0], "p_sec_gate_01_s_open", "map_objects", 4.0, FALSE, TRUE)
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Start Michael driving
|
|
IF IS_ENTITY_PLAYING_ANIM(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_open")
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_open") < 0.7
|
|
SET_ENTITY_ANIM_CURRENT_TIME(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_open", 0.7)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneArriveAtBank)
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_BANK_DOOR")
|
|
AND HAS_ANIM_DICT_LOADED("map_objects")
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneArriveAtBank) > 0.825
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
|
|
SET_PLAYBACK_SPEED(sGoldVans[0].veh, 1.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
|
|
CASE 2 //Wait for the anim to finish, then start the next shot for the vans driving in.
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneArriveAtBank)
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
AND NOT IS_PED_INJURED(pedGateSecurity)
|
|
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
AND NOT IS_PED_INJURED(sBankWorker.ped)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneArriveAtBank) > 0.99
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(PLAYER_PED_ID(), INSTANT_BLEND_OUT, TRUE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sGoldVanPeds[CASEY_ID].ped, INSTANT_BLEND_OUT, TRUE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(pedGateSecurity, INSTANT_BLEND_OUT, TRUE)
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sGoldVanPeds[CASEY_ID].ped)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(pedGateSecurity)
|
|
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh, VS_DRIVER)
|
|
SET_PED_INTO_VEHICLE(sGoldVanPeds[CASEY_ID].ped, sGoldVans[0].veh, VS_FRONT_RIGHT)
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
|
|
ENDIF
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, CARREC_BANK_PARK_1, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, 4000.0)
|
|
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_UNLOCKED)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[0].veh)
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_open")
|
|
SET_ENTITY_ANIM_CURRENT_TIME(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_open", 0.99)
|
|
ENDIF
|
|
|
|
TASK_LOOK_AT_ENTITY(sBankWorker.ped, sGoldVans[0].veh, -1, SLF_SLOW_TURN_RATE | SLF_WHILE_NOT_IN_FOV)
|
|
|
|
REMOVE_OBJECT(objIDCard, TRUE)
|
|
|
|
REMOVE_ANIM_DICT(strAnimIG2)
|
|
REMOVE_ANIM_DICT(strAnimIG1)
|
|
|
|
CLEAR_AREA(<<-5.6968, -659.2569, 32.4827>>, 300.0, TRUE)
|
|
SET_CREATE_RANDOM_COPS(TRUE) //This is turned off during the previous stage.
|
|
|
|
DESTROY_ALL_CAMS()
|
|
|
|
//camMain = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<6.112632,-692.414307,33.635040>>, <<-2.132627,0.000000,78.518257>>, 28.057642, TRUE)
|
|
//SET_CAM_PARAMS(camMain, <<6.112632,-692.414307,33.635040>>, <<-3.035543,0.000000,12.422817>>, 28.057642, 4200, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
|
|
camMain = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<6.375817,-679.126160,32.758102>>,<<0.387843,0.000150,106.671608>>,28.057642, TRUE)
|
|
SET_CAM_PARAMS(camMain, <<9.240410,-682.497559,32.337612>>,<<5.222656,0.048676,109.850189>>,28.057642, 4200, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
|
|
SHAKE_CAM(camMain, "HAND_SHAKE", 0.4)
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3 //Wait for the second shot to start where the vans reverse into place.
|
|
UPDATE_BANK_EMPLOYEE_IDLES()
|
|
|
|
//Stop the bank gate sound once the anim finishes
|
|
IF NOT HAS_SOUND_FINISHED(iBankGateOpenSound)
|
|
IF IS_ENTITY_PLAYING_ANIM(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_open")
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_open") > 0.97
|
|
STOP_SOUND(iBankGateOpenSound)
|
|
ENDIF
|
|
ELSE
|
|
STOP_SOUND(iBankGateOpenSound)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF TIMERB() > 4500
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, 500.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[0].veh)
|
|
ENDIF
|
|
|
|
//Trevor is still playing the first recording, so switch him to the new one.
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
|
|
ENDIF
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, CARREC_BANK_PARK_2, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, 6000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[1].veh)
|
|
SET_ENTITY_COLLISION(sGoldVans[1].veh, FALSE)
|
|
|
|
//SET_CAM_PARAMS(camMain, <<-6.617867,-659.494019,34.851814>>,<<-5.898299,-0.014693,-160.371338>>,28.057642, 0)
|
|
//SET_CAM_PARAMS(camMain, <<-6.665196,-659.435852,34.169460>>,<<-5.898299,-0.014693,-163.004089>>,28.057642, 5000, GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
|
|
|
|
SET_CAM_PARAMS(camMain, <<-5.612391,-662.020142,35.009270>>,<<-6.539274,-0.038196,-167.348267>>,28.057642, 0)
|
|
SET_CAM_PARAMS(camMain, <<-6.440382,-659.405029,34.115765>>,<<-5.598649,-0.038196,-168.676910>>,28.057642, 8000, GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
|
|
SHAKE_CAM(camMain, "HAND_SHAKE", 0.2)
|
|
|
|
TASK_LOOK_AT_ENTITY(sBankWorker.ped, sGoldVans[1].veh, -1, SLF_EXTEND_PITCH_LIMIT | SLF_SLOW_TURN_RATE | SLF_WHILE_NOT_IN_FOV)
|
|
|
|
SETTIMERB(0)
|
|
sBankWorker.iEvent = 0
|
|
iCurrentEvent++
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF NOT GET_IS_VEHICLE_ENGINE_RUNNING(sGoldVans[0].veh)
|
|
SET_VEHICLE_ENGINE_ON(sGoldVans[0].veh, TRUE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF NOT GET_IS_VEHICLE_ENGINE_RUNNING(sGoldVans[1].veh)
|
|
SET_VEHICLE_ENGINE_ON(sGoldVans[1].veh, TRUE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4 //Once the vans have parked start the mocap for everyone getting out.
|
|
UPDATE_BANK_EMPLOYEE_IDLES()
|
|
|
|
REQUEST_CUTSCENE("bs_2a_mcs_2")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_2")
|
|
REQUEST_WEAPON_ASSET(WEAPONTYPE_PUMPSHOTGUN)
|
|
REQUEST_WEAPON_ASSET(WEAPONTYPE_CARBINERIFLE)
|
|
|
|
IF sBankWorker.iEvent = 0
|
|
IF TIMERB() > 3000
|
|
AND NOT IS_PED_INJURED(sBankWorker.ped)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
TASK_LOOK_AT_ENTITY(sBankWorker.ped, sGoldVans[0].veh, -1, SLF_EXTEND_PITCH_LIMIT | SLF_SLOW_TURN_RATE | SLF_WHILE_NOT_IN_FOV)
|
|
|
|
sBankWorker.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
|
|
IF GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(CARREC_BANK_PARK_1, strCarrec) - GET_TIME_POSITION_IN_RECORDING(sGoldVans[0].veh) < 200
|
|
SET_PLAYBACK_SPEED(sGoldVans[0].veh, 0.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF TIMERB() > 2000
|
|
SET_ENTITY_COLLISION(sGoldVans[1].veh, TRUE)
|
|
ENDIF
|
|
|
|
IF HAS_CUTSCENE_LOADED()
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_PUMPSHOTGUN)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_CARBINERIFLE)
|
|
AND GET_ENTITY_SPEED(sGoldVans[0].veh) < 0.1
|
|
AND GET_ENTITY_SPEED(sGoldVans[1].veh) < 0.1
|
|
//AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
//Set the bank gates into their final position.
|
|
IF NOT HAS_SOUND_FINISHED(iBankGateOpenSound)
|
|
STOP_SOUND(iBankGateOpenSound)
|
|
ENDIF
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
IF interiorBackgroundCarPark != NULL
|
|
UNPIN_INTERIOR(interiorBackgroundCarPark)
|
|
interiorBackgroundCarPark = NULL
|
|
ENDIF
|
|
|
|
SETUP_REQ_BANK_PEDS_READY_FOR_WALK(TRUE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_FRONT_RIGHT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_ENGINE_ON(sGoldVans[0].veh, FALSE, FALSE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[0].veh, "Trevors_truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
|
|
ENDIF
|
|
|
|
IF TIMERB() > 2000
|
|
SET_ENTITY_COLLISION(sGoldVans[1].veh, TRUE)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_ENGINE_ON(sGoldVans[1].veh, FALSE, FALSE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[1].veh, "Michaels_truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN)
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN, 100)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN, TRUE)
|
|
|
|
objTrevorsWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objTrevorsWeapon, "Trevors_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, sBankWorker.ped, "BankLiaison")
|
|
TASK_CLEAR_LOOK_AT(sBankWorker.ped)
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sBankWorker.ped, "Bank_Employee", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_ENTITY_MODEL(sBankWorker.ped))
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_GUNMAN].ped, "gunman_selection_1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_DRIVER].ped, "driver_selection", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_ASSAULTRIFLE)
|
|
GIVE_WEAPON_TO_PED(sCrew[CREW_DRIVER].ped, WEAPONTYPE_ASSAULTRIFLE, 100)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_ASSAULTRIFLE, TRUE)
|
|
|
|
objGunmansWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(sCrew[CREW_DRIVER].ped, WEAPONTYPE_ASSAULTRIFLE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objGunmansWeapon, "HC_Gunman_Rifle", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[CASEY_ID].ped, "Casey", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
//Setup all the weapons
|
|
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, TRUE)
|
|
|
|
objMichaelsWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objMichaelsWeapon, "Michaels_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2A_ARRIVE_BANK_2")
|
|
|
|
REMOVE_ALL_AUDIO_SCENES()
|
|
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
START_CUTSCENE()
|
|
|
|
SETTIMERB(0)
|
|
//iCutsceneCamEvent = 0
|
|
iMusicTriggerEvent = 0
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 5
|
|
//Request assets for the next section in advance.
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterTop)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterTopLeft)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterTopRight)
|
|
|
|
IF DOES_CAM_EXIST(camMain)
|
|
IF IS_CUTSCENE_PLAYING()
|
|
DESTROY_CAM(camMain)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SEQUENCE_INDEX seq
|
|
|
|
//Music events during the cutscene.
|
|
IF IS_CUTSCENE_PLAYING()
|
|
IF iMusicTriggerEvent = 0
|
|
PREPARE_MUSIC_EVENT("FH2A_ENTER_BANK_MA")
|
|
|
|
IF GET_CUTSCENE_TIME() > 34500
|
|
TRIGGER_MUSIC_EVENT("FH2A_ENTER_BANK_MA")
|
|
iMusicTriggerEvent++
|
|
ENDIF
|
|
ELIF iMusicTriggerEvent = 1
|
|
IF GET_CUTSCENE_TIME() > 55300
|
|
TRIGGER_MUSIC_EVENT("FH2A_ACCESS_BANK_MA")
|
|
iMusicTriggerEvent++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REMOVE_OBJECT(objBankWorkerWalkieTalkie, TRUE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
ENDIF
|
|
|
|
//Start the walking tasks
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor", GET_ENTITY_MODEL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
//SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<-5.7, -658.9, 32.4824>>, TRUE, TRUE)
|
|
//SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -7.2)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterTopRight, 3, DEFAULT, 15)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<9.2644, -671.3203, 32.4503>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 0.5, DEFAULT, -20.7)
|
|
//TASK_TURN_PED_TO_FACE_COORD(NULL, <<9.9, -667.8, 33.9>>)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN, TRUE)
|
|
FORCE_PED_MOTION_STATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Casey", GET_ENTITY_MODEL(sGoldVanPeds[CASEY_ID].ped))
|
|
SET_ENTITY_COORDS(sGoldVanPeds[CASEY_ID].ped, <<-4.0596, -656.1756, 32.4509>>, TRUE, TRUE)
|
|
SET_ENTITY_HEADING(sGoldVanPeds[CASEY_ID].ped, 33.4509)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterTopLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT, 17)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<11.5542, -671.6187, 32.4502>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 0.5, DEFAULT, 7.0)
|
|
//TASK_TURN_PED_TO_FACE_COORD(NULL, <<9.9, -667.8, 33.9>>)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[CASEY_ID].ped, TRUE)
|
|
|
|
FORCE_PED_MOTION_STATE(sGoldVanPeds[CASEY_ID].ped, MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Bank_Employee", GET_ENTITY_MODEL(sBankWorker.ped))
|
|
SET_ENTITY_COORDS(sBankWorker.ped, <<-3.5995, -656.8430, 32.4511>>, TRUE, TRUE)
|
|
SET_ENTITY_HEADING(sBankWorker.ped, -72.7)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterTop, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT, 32)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<11.844791,-669.347351, 32.4507>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 0.5, DEFAULT, 50.4)
|
|
//TASK_TURN_PED_TO_FACE_COORD(NULL, <<9.9, -667.8, 33.9>>)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBankWorker.ped, TRUE)
|
|
|
|
FORCE_PED_MOTION_STATE(sBankWorker.ped, MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(sGoldVans[0].veh)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_truck")
|
|
SET_ENTITY_HEADING(sGoldVans[0].veh, -176.386)
|
|
SET_ENTITY_COORDS(sGoldVans[0].veh, <<-6.911, -667.815, 31.3154>>)
|
|
SET_VEHICLE_DOOR_SHUT(sGoldVans[0].veh, SC_DOOR_REAR_LEFT, TRUE)
|
|
SET_VEHICLE_DOOR_SHUT(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(sGoldVans[1].veh)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_truck")
|
|
SET_ENTITY_HEADING(sGoldVans[1].veh, -174.161)
|
|
SET_ENTITY_COORDS(sGoldVans[1].veh, <<-2.283, -667.746, 31.3231>>)
|
|
SET_VEHICLE_DOOR_SHUT(sGoldVans[1].veh, SC_DOOR_REAR_LEFT, TRUE)
|
|
SET_VEHICLE_DOOR_SHUT(sGoldVans[1].veh, SC_DOOR_REAR_RIGHT, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael", GET_ENTITY_MODEL(PLAYER_PED_ID()))
|
|
//SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-4.5, -661.4, 32.4824>>, TRUE, TRUE)
|
|
//SET_ENTITY_HEADING(PLAYER_PED_ID(), 31.0)
|
|
//SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, TRUE)
|
|
//FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE, TRUE, FAUS_CUTSCENE_EXIT)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_weapon")
|
|
GIVE_WEAPON_OBJECT_TO_PED(objMichaelsWeapon, PLAYER_PED_ID())
|
|
REMOVE_OBJECT(objMichaelsWeapon, TRUE)
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("HC_Gunman_Weapon")
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
GIVE_WEAPON_OBJECT_TO_PED(objGunmansWeapon, sCrew[CREW_DRIVER].ped)
|
|
REMOVE_OBJECT(objGunmansWeapon, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_weapon")
|
|
GIVE_WEAPON_OBJECT_TO_PED(objTrevorsWeapon, sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REMOVE_OBJECT(objTrevorsWeapon, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT bSkippedMocap
|
|
IF (NOT IS_CUTSCENE_PLAYING() AND IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY())
|
|
OR WAS_CUTSCENE_SKIPPED()
|
|
bSkippedMocap = TRUE
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Move the bank gate collision to match the anim
|
|
IF IS_ENTITY_PLAYING_ANIM(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_open")
|
|
FLOAT fAnimTime = GET_ENTITY_ANIM_CURRENT_TIME(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_open")
|
|
|
|
SET_ENTITY_COORDS(objSecurityGateCollision[0], vGate1 + <<0.0, 0.0, 0.3 + (fAnimTime * 4.0)>>)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
REMOVE_ANIM_DICT(strAnimIG3)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_BANK_PARK_1, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_BANK_PARK_2, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_BANK_LEAVE_GATE, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_BANK_TREVOR, strCarrec)
|
|
|
|
//Close the gate.
|
|
PLAY_ENTITY_ANIM(objSecurityBarriers[0], "p_sec_gate_01_s_close", "map_objects", 4.0, FALSE, TRUE)
|
|
SET_ENTITY_COORDS(objSecurityGateCollision[0], vGate1 + <<0.0, 0.0, 0.1>>)
|
|
|
|
REMOVE_OBJECT(objMichaelsWeapon, TRUE)
|
|
REMOVE_OBJECT(objTrevorsWeapon, TRUE)
|
|
REMOVE_OBJECT(objGunmansWeapon, TRUE)
|
|
REMOVE_OBJECT(objIDCard, TRUE)
|
|
|
|
//Delete the bank worker's walkie talkie, as it doesn't fit with the normal idles/walks.
|
|
REMOVE_OBJECT(objBankWorkerWalkieTalkie, TRUE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sGoldVans[1].veh, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iBankGateOpenSound)
|
|
STOP_SOUND(iBankGateOpenSound)
|
|
ENDIF
|
|
|
|
//This was set up during the drive to the bank, now should be safe to remove.
|
|
IF iNavmeshBlockBankEntrance != -1
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(iNavmeshBlockBankEntrance)
|
|
iNavmeshBlockBankEntrance = -1
|
|
ENDIF
|
|
|
|
IF interiorBackgroundCarPark != NULL
|
|
UNPIN_INTERIOR(interiorBackgroundCarPark)
|
|
interiorBackgroundCarPark = NULL
|
|
ENDIF
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
CLEAR_PED_NON_CREATION_AREA()
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
eMissionStage = STAGE_WALK_TO_LIFT_1
|
|
ENDIF
|
|
|
|
//Can't use Z-skip for this due to streaming issues, also need to assign the tasks at some point as the mocap may not have started so we can't rely on the exit states.
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
DO_FADE_OUT_WITH_WAIT()
|
|
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(PLAYER_PED_ID(), INSTANT_BLEND_OUT, TRUE)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-4.5, -661.4, 32.4824>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 31.0)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
STOP_CUTSCENE()
|
|
REMOVE_CUTSCENE()
|
|
|
|
CANCEL_ALL_PREPARED_MUSIC_EVENTS()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterTop)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterTopLeft)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterTopRight)
|
|
|
|
WHILE IS_CUTSCENE_ACTIVE()
|
|
OR NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterTop)
|
|
OR NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterTopLeft)
|
|
OR NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterTopRight)
|
|
OR NOT SETUP_REQ_BANK_INTERIOR_LOADED()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<-4.5, -661.4, 32.4824>>, 15.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
|
|
WAIT(1000) //Allow some time before fading in.
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
|
|
ENDIF
|
|
|
|
SET_ENTITY_HEADING(sGoldVans[0].veh, -176.386)
|
|
SET_ENTITY_COORDS(sGoldVans[0].veh, <<-6.911, -667.815, 31.3154>>)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
|
|
ENDIF
|
|
|
|
SET_ENTITY_COLLISION(sGoldVans[1].veh, TRUE)
|
|
SET_ENTITY_HEADING(sGoldVans[1].veh, -174.161)
|
|
SET_ENTITY_COORDS(sGoldVans[1].veh, <<-2.283, -667.746, 31.3231>>)
|
|
ENDIF
|
|
|
|
//Get everyone out the cars.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<-5.7, -658.9, 32.4824>>)
|
|
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -7.2)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sGoldVanPeds[CASEY_ID].ped, INSTANT_BLEND_OUT, TRUE)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sGoldVanPeds[CASEY_ID].ped)
|
|
|
|
SET_ENTITY_COORDS(sGoldVanPeds[CASEY_ID].ped, <<-4.0596, -656.1756, 32.4509>>, TRUE, TRUE)
|
|
SET_ENTITY_HEADING(sGoldVanPeds[CASEY_ID].ped, 33.4509)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sBankWorker.ped, INSTANT_BLEND_OUT, TRUE)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sBankWorker.ped)
|
|
|
|
SET_ENTITY_COORDS(sBankWorker.ped, <<-3.5995, -656.8430, 32.4511>>)
|
|
SET_ENTITY_HEADING(sBankWorker.ped, -72.7)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(pedGateSecurity)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(pedGateSecurity, INSTANT_BLEND_OUT, TRUE)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(pedGateSecurity)
|
|
ENDIF
|
|
|
|
//Get the right weapons equipped.
|
|
SETUP_REQ_BANK_PEDS_READY_FOR_WALK(TRUE)
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, TRUE)
|
|
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
PROC WALK_TO_LIFT_1()
|
|
SEQUENCE_INDEX seq
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF iCurrentEvent != 99
|
|
IF SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
AND SETUP_REQ_BANK_INTERIOR_LOADED()
|
|
IF bHasUsedCheckpoint
|
|
START_REPLAY_SETUP(<<-4.9754, -660.9686, 32.4189>>, 0.0, FALSE, TRUE)
|
|
|
|
iCurrentEvent = 99
|
|
ELSE
|
|
//Fix for B*528757: Guarantee that the tunnel is loaded first before trying to set up everything else.
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-4.9754, -660.9686, 32.4189>>)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<-4.9754, -660.9686, 32.4189>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
iCurrentEvent = 99
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterTop)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterTopLeft)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterTopRight)
|
|
REQUEST_WEAPON_ASSET(WEAPONTYPE_PUMPSHOTGUN)
|
|
REQUEST_WEAPON_ASSET(WEAPONTYPE_CARBINERIFLE)
|
|
REQUEST_ANIM_DICT("map_objects")
|
|
|
|
IF SETUP_REQ_BANK_WORKER(<<-3.5995, -656.8430, 32.4511>>, -72.7)
|
|
AND SETUP_REQ_GOLD_VANS_AT_BANK()
|
|
AND SETUP_REQ_MAIN_DRIVER(<<-4.2024, -675.4505, 31.3410>>, 269.1434)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<-5.2024, -675.4505, 31.3410>>, 269.1434)
|
|
AND SETUP_REQ_TREVOR(<<-5.7, -658.9, 32.4824>>, -7.2)
|
|
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-4.0596, -656.1756, 32.4509>>, 33.4509)
|
|
AND SETUP_REQ_SECURITY_BARRIERS()
|
|
AND SETUP_REQ_BANK_SECURITY()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterTop)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterTopLeft)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterTopRight)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_PUMPSHOTGUN)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_CARBINERIFLE)
|
|
AND HAS_ANIM_DICT_LOADED("map_objects")
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
SETUP_REQ_BANK_PEDS_READY_FOR_WALK(TRUE)
|
|
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
|
|
REMOVE_MICHAEL_SHOTGUN_SILENCER()
|
|
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, TRUE)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-4.5, -661.4, 32.4824>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 31.0)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
WAIT(1000) //B*635494 - Allow some time before fading in.
|
|
|
|
//Start the walking tasks
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
//Reposition the crew members in front of the trucks
|
|
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
SET_CURRENT_PED_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_CURRENT_PED_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
ENDIF
|
|
|
|
//If the gate anim started playing in the previous frame force it to reach the end
|
|
IF IS_ENTITY_PLAYING_ANIM(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_close")
|
|
SET_ENTITY_ANIM_CURRENT_TIME(objSecurityBarriers[0], "map_objects", "p_sec_gate_01_s_close", 0.99)
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
SETTIMERB(0)
|
|
|
|
//If we skipped here (either Z-skip or cutscene skip) make sure the peds perform their tasks.
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2A_ACCESS_BANK_RESTART")
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterTopRight, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT, 15)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<9.2644, -671.3203, 32.4503>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 0.5, DEFAULT, -20.7)
|
|
//TASK_TURN_PED_TO_FACE_COORD(NULL, <<9.9, -667.8, 33.9>>)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterTopLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT, 17)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<11.5542, -671.6187, 32.4502>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 0.5, DEFAULT, 7.0)
|
|
//TASK_TURN_PED_TO_FACE_COORD(NULL, <<9.9, -667.8, 33.9>>)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGoldVanPeds[CASEY_ID].ped, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterTop, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT, 32)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<11.844791,-669.347351, 32.4507>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 0.5, DEFAULT, 50.4)
|
|
//TASK_TURN_PED_TO_FACE_COORD(NULL, <<9.9, -667.8, 33.9>>)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBankWorker.ped, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//The bank worker and the security guard from the previous cutscene share the same speaker number, so make sure the bank worker is set up.
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, sBankWorker.ped, "BankLiaison")
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_FOLLOW_MANAGER")
|
|
START_AUDIO_SCENE("BS_2A_FOLLOW_MANAGER")
|
|
ENDIF
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
|
|
bPlayedLiftSound = FALSE
|
|
fLiftOpenRatio = 0.0
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_FINELEVDOOR01, <<11.7, -668.5, 32.4>>, FALSE)
|
|
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_FINELEVDOOR01, <<8.8, -668.7, 32.4>>, FALSE)
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_BANK_TOUR, "COLLECT_GOLD_FROM_BANK")
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
bClosedVaultDoor = FALSE
|
|
iCurrentEvent = 0
|
|
iGameplayHintEvent = 0
|
|
sBankWorker.iEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
//Create the vault worker and trolleys in advance
|
|
SETUP_REQ_VAULT_WORKER(<<-6.0290, -686.3659, 15.1306>>, 161.4787)
|
|
SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
|
|
|
|
//Require lift sounds throughout
|
|
REQUEST_SCRIPT_AUDIO_BANK("Freight_Elevator")
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
IF NOT DOES_BLIP_EXIST(sBankWorker.blip)
|
|
sBankWorker.blip = CREATE_BLIP_FOR_ENTITY(sBankWorker.ped)
|
|
SET_BLIP_NAME_FROM_TEXT_FILE(sBankWorker.blip, "F3A_WORKNAME")
|
|
ENDIF
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0
|
|
//SET_PED_MOVE_RATE_OVERRIDE(sBankWorker.ped, 1.1)
|
|
//SET_PED_MOVE_RATE_OVERRIDE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.9)
|
|
|
|
//Rubber banding on peds to keep them close
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<10.596344,-673.539246,32.211445>>, <<9.996563,-667.079468,35.699215>>, 4.000000)
|
|
RUBBER_BAND_WALKING_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.94, 7.0, 10.0)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA(sBankWorker.ped, <<10.596344,-673.539246,32.211445>>, <<9.996563,-667.079468,35.699215>>, 4.000000)
|
|
RUBBER_BAND_WALKING_PED(sBankWorker.ped, 1.12, 7.0, 10.0)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA(sGoldVanPeds[CASEY_ID].ped, <<10.596344,-673.539246,32.211445>>, <<9.996563,-667.079468,35.699215>>, 4.000000)
|
|
RUBBER_BAND_WALKING_PED(sGoldVanPeds[CASEY_ID].ped, 1.07, 7.0, 10.0)
|
|
ENDIF
|
|
|
|
REQUEST_CUTSCENE("BS_2A_MCS_3_alt")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("BS_2A_MCS_3_alt")
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(sBankWorker.ped), vLiftTop1) < 49.0
|
|
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_OPEN, vLiftTop1, vLiftTop2, modelLiftDoor)
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<10.640754,-673.535767,32.479485>>, <<9.958423,-665.871521,35.949272>>, 4.000000)
|
|
//IF (GET_SCRIPT_TASK_STATUS(sBankWorker.ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
//AND GET_SCRIPT_TASK_STATUS(sGoldVanPeds[CASEY_ID].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK)
|
|
//OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<10.773432,-673.525513,32.485138>>, <<10.276505,-668.525818,34.949657>>, 3.250000)
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
//ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SWITCH iGameplayHintEvent
|
|
CASE 0
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<7.217823,-664.156372,32.450058>>, <<10.608177,-658.160156,35.449062>>, 1.250000)
|
|
SET_GAMEPLAY_COORD_HINT(<<10.6, -673.3, 33.7934>>, -1, 2000)
|
|
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(0.8)
|
|
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(0.015)
|
|
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(0.2)
|
|
SET_GAMEPLAY_HINT_FOV(40.0)
|
|
SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), <<10.2414, -668.6328, 32.6694>>, PEDMOVE_WALK, -1, 0.25, ENAV_NO_STOPPING)
|
|
//TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(), <<10.1914, -671.6328, 32.6694>>, PEDMOVE_WALK)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 2.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
iGameplayHintEvent++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Chat between Trevor
|
|
IF NOT bHasTextLabelTriggered[F3A_FOLLOW]
|
|
PRINT_NOW("F3A_FOLLOW", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[F3A_FOLLOW] = TRUE
|
|
ELSE
|
|
IF NOT bHasTextLabelTriggered[FH3A_LIASON]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])) < 36.0
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<10.596344,-673.539246,32.211445>>, <<9.996563,-667.079468,35.699215>>, 4.000000)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LIASON", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_LIASON] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Kill the conversation before the player approaches the lift, to avoid having to cut a line off mid-way for the cutscene.
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<11.997320,-661.298523,32.448719>>, <<4.313392,-661.590698,34.950577>>, 6.000000)
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play a line if the player lags behind
|
|
IF NOT bHasTextLabelTriggered[FH3A_LAG1]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT IS_MESSAGE_BEING_DISPLAYED() OR NOT IS_SUBTITLE_PREFERENCE_SWITCHED_ON()
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])) > 49.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LAG", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_LAG1] = TRUE
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play the lag line again if the player just stands by the elevator and doesn't get in.
|
|
IF NOT bHasTextLabelTriggered[FH3A_LAG1B]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
IF GET_GAME_TIMER() - iTrevorLagDialogueTimer > 6000
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LAG", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_LAG1B] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iTrevorLagDialogueTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Get the manager to look at the player.
|
|
IF sBankWorker.iEvent = 0
|
|
IF IS_ENTITY_IN_ANGLED_AREA(sBankWorker.ped, <<10.773432,-673.525513,32.485138>>, <<10.276505,-668.525818,34.949657>>, 3.250000)
|
|
//AND GET_SCRIPT_TASK_STATUS(sBankWorker.ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
TASK_LOOK_AT_ENTITY(sBankWorker.ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
|
|
sBankWorker.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail if the player tries to leave the area.
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<14.952208,-672.626892,31.232529>>, <<27.430967,-677.752441,34.482529>>, 4.750000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-61.700726,-693.533020,31.268063>>, <<-56.521435,-680.950562,34.601341>>, 4.750000)
|
|
MISSION_FAILED(FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS)
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_ACTING_SUSPICIOUS_IN_BANK()
|
|
MISSION_FAILED(FAILED_SPOOKED_BANK_WORKERS)
|
|
ENDIF
|
|
|
|
//Disable any weapon controls to prevent shenanigans.
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
REMOVE_ALL_BLIPS()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iLiftSoundID)
|
|
STOP_SOUND(iLiftSoundID)
|
|
ENDIF
|
|
|
|
eMissionStage = STAGE_LIFT_CUTSCENE_1
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_LIFT_CUTSCENE_1)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC LIFT_CUTSCENE_1()
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF iCurrentEvent != 99
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<10.5, -671.6, 32.44>>)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
IF SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
AND SETUP_REQ_BANK_INTERIOR_LOADED()
|
|
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<10.5, -671.6, 32.44>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
iCurrentEvent = 99
|
|
ENDIF
|
|
ELSE
|
|
IF SETUP_REQ_BANK_WORKER(<<-3.61, -657.35, 32.4518>>, 263.770699)
|
|
AND SETUP_REQ_VAULT_WORKER(<<-6.0290, -686.3659, 15.1306>>, 161.4787)
|
|
AND SETUP_REQ_GOLD_VANS_AT_BANK()
|
|
AND SETUP_REQ_MAIN_DRIVER(<<-6.5872, -671.7311, 31.3406>>, 269.1434)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<-7.5872, -671.7311, 31.3406>>, 269.1434)
|
|
AND SETUP_REQ_TREVOR(<<-5.53, -658.22, 32.4518>>, -153.477966)
|
|
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-4.68, -657.71, 33.429>>, -127.999458)
|
|
AND SETUP_REQ_SECURITY_BARRIERS()
|
|
AND SETUP_REQ_BANK_SECURITY()
|
|
AND SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
|
|
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
|
|
SETUP_REQ_BANK_PEDS_READY_FOR_WALK()
|
|
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
|
|
REMOVE_MICHAEL_SHOTGUN_SILENCER()
|
|
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_CUTSCENE("BS_2A_MCS_3_alt")
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("BS_2A_MCS_3_alt")
|
|
|
|
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2A_ACCESS_BANK_RESTART")
|
|
|
|
WAIT(0)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
TASK_CLEAR_LOOK_AT(sBankWorker.ped)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sBankWorker.ped, "Bank_Employee", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_ENTITY_MODEL(sBankWorker.ped))
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[CASEY_ID].ped, "Casey", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
START_CUTSCENE()
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2A_ENTER_LIFT")
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
|
|
bSkippedMocap = FALSE
|
|
iMusicTriggerEvent = 0
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
REQUEST_SCRIPT_AUDIO_BANK("Freight_Elevator")
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL,INPUT_NEXT_CAMERA)
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0 //Play the lift entry mocap
|
|
REQUEST_ANIM_DICT(strAnimLiftLeadOut)
|
|
|
|
//Handle lift doors and audio.
|
|
SWITCH iMusicTriggerEvent
|
|
CASE 0
|
|
IF IS_CUTSCENE_PLAYING()
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
STOP_GAMEPLAY_HINT(TRUE)
|
|
REMOVE_ALL_AUDIO_SCENES()
|
|
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_INSTANT_CLOSE, vLiftBottom1, vLiftBottom2, modelLiftDoor, FALSE)
|
|
|
|
fLiftOpenRatio = 1.0
|
|
bPlayedLiftSound = FALSE
|
|
iMusicTriggerEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
PREPARE_MUSIC_EVENT("FH2A_BANK_MID")
|
|
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
AND GET_CUTSCENE_TIME() > 500
|
|
NEW_LOAD_SCENE_START_SPHERE(<<-0.1, -706.2, 16.6>>, 5.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
|
|
ENDIF
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
IF GET_CUTSCENE_TIME() > 5100
|
|
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_CLOSE, vLiftTop1, vLiftTop2, modelLiftDoor)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Preload the lift conversation.
|
|
IF NOT bHasTextLabelTriggered[FH3A_MCS3_LO_PRELOAD]
|
|
IF sConversationPeds.PedInfo[5].Index != sGoldVanPeds[CASEY_ID].ped
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 5, sGoldVanPeds[CASEY_ID].ped, "CASEY")
|
|
ENDIF
|
|
|
|
IF sConversationPeds.PedInfo[8].Index != sBankWorker.ped
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, sBankWorker.ped, "BankLiaison")
|
|
ENDIF
|
|
|
|
IF PRELOAD_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS3_LO", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_MCS3_LO_PRELOAD] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF HAS_ANIM_DICT_LOADED(strAnimLiftLeadOut)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
|
|
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<-1.26, -705.72, 15.3>>)
|
|
|
|
iSyncSceneLiftLeadOut[0] = CREATE_SYNCHRONIZED_SCENE(<<-1.233, -702.975, 15.136>>, <<-0.000, 0.000, 160.0>>)
|
|
TASK_SYNCHRONIZED_SCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], iSyncSceneLiftLeadOut[0], strAnimLiftLeadOut, "trevor_leadout_action",
|
|
INSTANT_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT)
|
|
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_PUMPSHOTGUN, TRUE)
|
|
RETAIN_ENTITY_IN_INTERIOR(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], interiorBank)
|
|
//FORCE_PED_MOTION_STATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
|
|
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Casey")
|
|
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
SET_ENTITY_COORDS(sGoldVanPeds[CASEY_ID].ped, <<0.6, -707.0, 15.3>>)
|
|
|
|
iSyncSceneLiftLeadOut[1] = CREATE_SYNCHRONIZED_SCENE(<<-1.233, -702.975, 15.136>>, <<-0.000, 0.000, 160.0>>)
|
|
TASK_SYNCHRONIZED_SCENE(sGoldVanPeds[CASEY_ID].ped, iSyncSceneLiftLeadOut[1], strAnimLiftLeadOut, "casey_leadout_action",
|
|
INSTANT_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT)
|
|
RETAIN_ENTITY_IN_INTERIOR(sGoldVanPeds[CASEY_ID].ped, interiorBank)
|
|
FORCE_ROOM_FOR_ENTITY(sGoldVanPeds[CASEY_ID].ped, interiorBank, HASH("GtaMloRoom013"))
|
|
|
|
//FORCE_PED_MOTION_STATE(sGoldVanPeds[CASEY_ID].ped, MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sGoldVanPeds[CASEY_ID].ped)
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Bank_Employee")
|
|
AND NOT IS_PED_INJURED(sBankWorker.ped)
|
|
SET_ENTITY_COORDS(sBankWorker.ped, <<1.2, -705.5, 15.3>>)
|
|
|
|
iSyncSceneLiftLeadOut[2] = CREATE_SYNCHRONIZED_SCENE(<<-1.233, -702.975, 15.136>>, <<-0.000, 0.000, 160.0>>)
|
|
TASK_SYNCHRONIZED_SCENE(sBankWorker.ped, iSyncSceneLiftLeadOut[2], strAnimLiftLeadOut, "bankman_leadout_action",
|
|
INSTANT_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT)
|
|
RETAIN_ENTITY_IN_INTERIOR(sBankWorker.ped, interiorBank)
|
|
FORCE_ROOM_FOR_ENTITY(sBankWorker.ped, interiorBank, HASH("GtaMloRoom013"))
|
|
|
|
//FORCE_PED_MOTION_STATE(sBankWorker.ped, MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sBankWorker.ped)
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-0.6656, -707.2256, 15.1307>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 337.8443)
|
|
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, TRUE)
|
|
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE, TRUE, FAUS_CUTSCENE_EXIT)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
|
|
|
|
//Play idle animation with camera data to lock player in place and limit view to a spring [MT]
|
|
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
|
|
TASK_PLAY_ANIM (PLAYER_PED_ID(), strAnimLiftLeadOut, "PLAYER_SHOTGUN_LOOP", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING, 0, FALSE, AIK_USE_FP_ARM_RIGHT | AIK_USE_FP_ARM_LEFT )
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
//IF interiorBank != NULL
|
|
// FORCE_ROOM_FOR_GAME_VIEWPORT(interiorBank, HASH("GtaMloRoom013"))
|
|
//ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
iMusicTriggerEvent = 0
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ELSE
|
|
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Wait for the synced scene to finish
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottom)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomLeft)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomRight)
|
|
|
|
SEQUENCE_INDEX seq
|
|
|
|
INT iWaypointStopNode
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottom)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointLiftExitBottom, <<-3.4008, -694.3450, 15.1556>>, iWaypointStopNode)
|
|
ENDIF
|
|
|
|
IF NOT bHasTextLabelTriggered[FH3A_MCS3_LO]
|
|
IF sConversationPeds.PedInfo[5].Index != sGoldVanPeds[CASEY_ID].ped
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 5, sGoldVanPeds[CASEY_ID].ped, "CASEY")
|
|
ENDIF
|
|
|
|
IF sConversationPeds.PedInfo[8].Index != sBankWorker.ped
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, sBankWorker.ped, "BankLiaison")
|
|
ENDIF
|
|
|
|
IF bHasTextLabelTriggered[FH3A_MCS3_LO_PRELOAD]
|
|
BEGIN_PRELOADED_CONVERSATION()
|
|
bHasTextLabelTriggered[FH3A_MCS3_LO] = TRUE
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS3_LO", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_MCS3_LO] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_MCS3_LO_7]
|
|
//The last line plays too soon, split it from the rest of the dialgue.
|
|
/*IF IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
|
|
TEXT_LABEL strCurrentLine
|
|
|
|
strCurrentLine = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL()
|
|
|
|
IF ARE_STRINGS_EQUAL(strCurrentLine, "FH3A_MCS3_LO_6")
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLiftLeadOut[2]) > 0.85
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS3_LO", "FH3A_MCS3_LO_7", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_MCS3_LO_7] = TRUE
|
|
ENDIF
|
|
ENDIF*/
|
|
ENDIF
|
|
|
|
SWITCH iMusicTriggerEvent
|
|
CASE 0 //Play lift move sound
|
|
IF HAS_SOUND_FINISHED(iLiftMoveSoundID)
|
|
PLAY_SOUND_FROM_COORD(iLiftMoveSoundID, "FREIGHT_ELEVATOR_01_MOTOR", GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<0.0, 0.0, 3.0>>)
|
|
ENDIF
|
|
|
|
SHAKE_GAMEPLAY_CAM("SKY_DIVING_SHAKE", 0.02)
|
|
|
|
iMusicTriggerEvent++
|
|
BREAK
|
|
|
|
CASE 1 //Stop lift sound
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLiftLeadOut[2]) > 0.82
|
|
IF NOT HAS_SOUND_FINISHED(iLiftMoveSoundID)
|
|
STOP_SOUND(iLiftMoveSoundID)
|
|
ENDIF
|
|
|
|
STOP_GAMEPLAY_CAM_SHAKING(TRUE)
|
|
|
|
iMusicTriggerEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Open door.
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLiftLeadOut[2]) > 0.85
|
|
fLiftOpenRatio = 0.0
|
|
bPlayedLiftSound = FALSE
|
|
|
|
iMusicTriggerEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3
|
|
IF PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_OPEN, vLiftBottom1, vLiftBottom2, modelLiftDoor)
|
|
iMusicTriggerEvent++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLiftLeadOut[0])
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLiftLeadOut[0]) > 0.93
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
// Clear tasks to remove limited camera animation [MT]
|
|
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLiftLeadOut[0])
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLiftLeadOut[0]) > 0.96
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WALK_BLEND_OUT, TRUE)
|
|
iSyncSceneLiftLeadOut[0] = -1
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottomLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iWaypointStopNode)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-5.8, -689.6968, 15.1556>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
FORCE_PED_MOTION_STATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], MS_ON_FOOT_WALK)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLiftLeadOut[1])
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLiftLeadOut[1]) > 0.96
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sGoldVanPeds[CASEY_ID].ped, WALK_BLEND_OUT, TRUE)
|
|
iSyncSceneLiftLeadOut[1] = -1
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottomRight, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iWaypointStopNode)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-4.9572, -689.6028, 15.1556>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
FORCE_PED_MOTION_STATE(sGoldVanPeds[CASEY_ID].ped, MS_ON_FOOT_WALK)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
IF NOT DOES_BLIP_EXIST(sBankWorker.blip)
|
|
sBankWorker.blip = CREATE_BLIP_FOR_ENTITY(sBankWorker.ped)
|
|
SET_BLIP_NAME_FROM_TEXT_FILE(sBankWorker.blip, "F3A_WORKNAME")
|
|
ENDIF
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLiftLeadOut[2])
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneLiftLeadOut[2]) > 0.96
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sBankWorker.ped, WALK_BLEND_OUT, TRUE)
|
|
iSyncSceneLiftLeadOut[2] = -1
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottom, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iWaypointStopNode)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-4.7, -688.6003, 15.1306>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
FORCE_PED_MOTION_STATE(sBankWorker.ped, MS_ON_FOOT_WALK)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLiftLeadOut[0])
|
|
AND NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLiftLeadOut[1])
|
|
AND NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneLiftLeadOut[2])
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
REMOVE_ANIM_DICT(strAnimLiftLeadOut)
|
|
|
|
IF IS_NEW_LOAD_SCENE_ACTIVE()
|
|
NEW_LOAD_SCENE_STOP()
|
|
ENDIF
|
|
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
eMissionStage = STAGE_WALK_TO_VAULT
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
BOOL bTopDoorWasMidClosing = FALSE
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
IF GET_CUTSCENE_TIME() > 5100 AND GET_CUTSCENE_TIME() < 10100
|
|
bTopDoorWasMidClosing = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
IF NOT IS_SCREEN_FADING_OUT()
|
|
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
IF bTopDoorWasMidClosing
|
|
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_CLOSE, vLiftTop1, vLiftTop2, modelLiftDoor, FALSE)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
JUMP_TO_STAGE(STAGE_WALK_TO_VAULT)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC WALK_TO_VAULT()
|
|
SEQUENCE_INDEX seq
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF iCurrentEvent != 99
|
|
//Interior needs to be loaded first, to stop entities falling through the map
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-0.65, -707.22, 15.1306>>)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
IF SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
AND SETUP_REQ_BANK_INTERIOR_LOADED()
|
|
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<-0.65, -707.22, 15.1306>>, 20.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
iCurrentEvent = 99
|
|
ENDIF
|
|
ELSE
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottom)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomLeft)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomRight)
|
|
|
|
IF SETUP_REQ_BANK_WORKER(<<-0.7164, -700.7703, 15.1309>>, 27.6258)
|
|
AND SETUP_REQ_VAULT_WORKER(<<-6.0290, -686.3659, 15.1306>>, 161.4787)
|
|
AND SETUP_REQ_GOLD_VANS_AT_BANK()
|
|
AND SETUP_REQ_MAIN_DRIVER(<<-6.5872, -671.7311, 31.3406>>, 269.1434)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<-7.5872, -671.7311, 31.3406>>, 269.1434)
|
|
AND SETUP_REQ_TREVOR(<<0.1575, -703.0106, 15.1309>>, 12.6224)
|
|
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<0.6822, -701.7074, 15.1309>>, 20.3976)
|
|
AND SETUP_REQ_SECURITY_BARRIERS()
|
|
AND SETUP_REQ_BANK_SECURITY()
|
|
AND SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottom)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottomLeft)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottomRight)
|
|
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
|
|
SETUP_REQ_BANK_PEDS_READY_FOR_WALK()
|
|
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
|
|
REMOVE_MICHAEL_SHOTGUN_SILENCER()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-0.65, -707.22, 15.1306>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), -24.06)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
|
|
|
|
INT iWaypointStopNode
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointLiftExitBottom, <<-3.4008, -694.3450, 15.1556>>, iWaypointStopNode)
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottomLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iWaypointStopNode)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-5.8, -689.6968, 15.1556>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottomRight, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iWaypointStopNode)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-4.9572, -689.6028, 15.1556>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottom, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iWaypointStopNode)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-4.7, -688.6003, 15.1306>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vVaultDoorPos, 5.0, modelVaultDoor)
|
|
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelVaultDoor, vVaultDoorPos, TRUE, 0.0)
|
|
ENDIF
|
|
|
|
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_INSTANT_OPEN, vLiftBottom1, vLiftBottom2, modelLiftDoor)
|
|
|
|
fLiftOpenRatio = 1.0
|
|
bPlayedLiftSound = FALSE
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
IF IS_SCREEN_FADED_OUT()
|
|
//Skipped to this point: restart the music stream.
|
|
TRIGGER_MUSIC_EVENT("FH2A_BANK_MID_RESTART")
|
|
ELSE
|
|
TRIGGER_MUSIC_EVENT("FH2A_BANK_MID")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_VAULT")
|
|
START_AUDIO_SCENE("BS_2A_GET_TO_VAULT")
|
|
ENDIF
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
bClosedVaultDoor = FALSE
|
|
fLiftOpenRatio = 1.0
|
|
iLiftEvent = 0
|
|
bPlayedLiftSound = TRUE
|
|
iCurrentEvent = 0
|
|
iGameplayHintEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
UPDATE_VAULT_WORKER_IDLES()
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
RUBBER_BAND_WALKING_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.93)
|
|
RUBBER_BAND_WALKING_PED(sBankWorker.ped, 1.0)
|
|
RUBBER_BAND_WALKING_PED(sGoldVanPeds[CASEY_ID].ped, 1.0)
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0 //Back up in the elevator
|
|
IF NOT DOES_BLIP_EXIST(sBankWorker.blip)
|
|
sBankWorker.blip = CREATE_BLIP_FOR_ENTITY(sBankWorker.ped)
|
|
SET_BLIP_NAME_FROM_TEXT_FILE(sBankWorker.blip, "F3A_WORKNAME")
|
|
ENDIF
|
|
|
|
REQUEST_CUTSCENE("bs_2a_mcs_4")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_4")
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-0.654319,-696.364868,15.130766>>, <<-7.095732,-700.145325,17.630766>>, 1.000000)
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SWITCH iGameplayHintEvent
|
|
CASE 0
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-3.877056,-701.371399,14.261276>>, <<1.083258,-697.605896,17.728502>>, 4.000000)
|
|
SET_GAMEPLAY_COORD_HINT(<<-6.0877, -686.4245, 16.5762>>, -1, 2000)
|
|
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(0.5)
|
|
//SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(-0.9)
|
|
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(0.015)
|
|
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(0.2)
|
|
SET_GAMEPLAY_HINT_FOV(40.0)
|
|
SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), <<-4.7636, -689.6049, 15.2538>>, PEDMOVE_WALK, -1, 0.25, ENAV_NO_STOPPING)
|
|
//TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(), <<-4.7636, -689.6049, 15.2538>>, PEDMOVE_WALK)
|
|
|
|
iGameplayHintEvent++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
//Dialogue
|
|
IF NOT bHasTextLabelTriggered[FH3A_WORKER] //Vault worker says a line when he sees them approach.
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_WORKER", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_WORKER] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_VAULT] //Trevor says a line when approaching the vault door.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_VAULT", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_VAULT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play a line if the player lags behind
|
|
IF NOT bHasTextLabelTriggered[FH3A_LAG2]
|
|
IF NOT IS_MESSAGE_BEING_DISPLAYED() OR NOT IS_SUBTITLE_PREFERENCE_SWITCHED_ON()
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])) > 64.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LAG", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_LAG2] = TRUE
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REQUEST_SCRIPT_AUDIO_BANK("Freight_Elevator")
|
|
|
|
//Open/close the lift manually, sync sounds to match
|
|
IF iLiftEvent = 0
|
|
//PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_OPEN, vLiftBottom1, vLiftBottom2, modelLiftDoor)
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-4.281778,-701.224304,15.042150>>, <<-0.120090,-697.080261,17.881498>>, 1.500000)
|
|
fLiftOpenRatio = 1.0
|
|
bPlayedLiftSound = FALSE
|
|
iLiftEvent++
|
|
ENDIF
|
|
ELIF iLiftEvent = 1
|
|
IF PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_CLOSE, vLiftBottom1, vLiftBottom2, modelLiftDoor)
|
|
iLiftEvent++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bClosedVaultDoor
|
|
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vVaultDoorPos, 5.0, modelVaultDoor)
|
|
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelVaultDoor, vVaultDoorPos, TRUE, 0.0)
|
|
bClosedVaultDoor = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
|
|
IF IS_PLAYER_ACTING_SUSPICIOUS_IN_BANK()
|
|
MISSION_FAILED(FAILED_SPOOKED_BANK_WORKERS)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
CLEAR_PRINTS()
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iLiftSoundID)
|
|
STOP_SOUND(iLiftSoundID)
|
|
ENDIF
|
|
|
|
eMissionStage = STAGE_VAULT_OPEN_CUTSCENE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_VAULT_OPEN_CUTSCENE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
PROC VAULT_OPEN_CUTSCENE()
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF iCurrentEvent != 99
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-4.51, -689.49, 15.1306>>)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
IF SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
AND SETUP_REQ_BANK_INTERIOR_LOADED()
|
|
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<-4.51, -689.49, 15.1306>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
iCurrentEvent = 99
|
|
ENDIF
|
|
ELSE
|
|
IF SETUP_REQ_BANK_WORKER(<<-2.314122,-662.947083,15.1306>>, 263.770699)
|
|
AND SETUP_REQ_VAULT_WORKER(<<-6.0290, -686.3659, 15.1306>>, 161.4787)
|
|
AND SETUP_REQ_GOLD_VANS_AT_BANK()
|
|
AND SETUP_REQ_MAIN_DRIVER(<<-6.5872, -671.7311, 31.3406>>, 269.1434)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<-7.5872, -671.7311, 31.3406>>, 269.1434)
|
|
AND SETUP_REQ_TREVOR(<<-0.848102,-665.244019,15.1306>>, -153.477966)
|
|
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-1.900313,-666.880005,15.1306>>, -127.999458)
|
|
AND SETUP_REQ_SECURITY_BARRIERS()
|
|
AND SETUP_REQ_BANK_SECURITY()
|
|
AND SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
|
|
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
|
|
SETUP_REQ_BANK_PEDS_READY_FOR_WALK()
|
|
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
|
|
REMOVE_MICHAEL_SHOTGUN_SILENCER()
|
|
|
|
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vVaultDoorPos, 5.0, modelVaultDoor)
|
|
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelVaultDoor, vVaultDoorPos, TRUE, 0.0)
|
|
ENDIF
|
|
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_CUTSCENE("bs_2a_mcs_4")
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_4")
|
|
|
|
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sBankWorker.ped, "Bank_Employee", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_ENTITY_MODEL(sBankWorker.ped))
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sVaultWorker.ped)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sVaultWorker.ped, "Vault_Guy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_ENTITY_MODEL(sVaultWorker.ped))
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[CASEY_ID].ped, "Casey", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
objMichaelsWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objMichaelsWeapon, "Michaels_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
objTrevorsWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objTrevorsWeapon, "Trevors_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
START_CUTSCENE()
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2A_BANK_MID_RESTART")
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_VAULT")
|
|
START_AUDIO_SCENE("BS_2A_GET_TO_VAULT")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
|
|
bSkippedMocap = FALSE
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
IF NOT bSkippedMocap
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
bSkippedMocap = TRUE
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SEQUENCE_INDEX seq
|
|
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottom)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomLeft)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomRight)
|
|
|
|
INT iNumNodesInWaypoint
|
|
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0
|
|
IF IS_CUTSCENE_PLAYING()
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
STOP_GAMEPLAY_HINT(TRUE)
|
|
|
|
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vVaultDoorPos, 8.0, modelVaultDoor)
|
|
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelVaultDoor, vVaultDoorPos, TRUE, 1.273)
|
|
ENDIF
|
|
|
|
//CREATE_MODEL_HIDE(vVaultDoorPos, 8.0, modelVaultDoor, TRUE)
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor", GET_ENTITY_MODEL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
//SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<0.68, -667.42, 15.1306>>, TRUE, TRUE)
|
|
//SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -143.239449)
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottomRight)
|
|
WAYPOINT_RECORDING_GET_NUM_POINTS(strWaypointLiftExitBottomRight, iNumNodesInWaypoint)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottomRight, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iNumNodesInWaypoint - 3)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-0.2089, -663.8649, 15.1556>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING, 14.1)
|
|
TASK_TURN_PED_TO_FACE_COORD(NULL, <<-2.0, -658.0, 16.8>>)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
FORCE_PED_MOTION_STATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Casey", GET_ENTITY_MODEL(sGoldVanPeds[CASEY_ID].ped))
|
|
SET_ENTITY_COORDS(sGoldVanPeds[CASEY_ID].ped, <<-5.8014, -688.0304, 15.1306>>, TRUE, TRUE)
|
|
SET_ENTITY_HEADING(sGoldVanPeds[CASEY_ID].ped, 316.4831)
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottomLeft)
|
|
WAYPOINT_RECORDING_GET_NUM_POINTS(strWaypointLiftExitBottomLeft, iNumNodesInWaypoint)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottomLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iNumNodesInWaypoint - 4)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-1.8, -664.0665, 15.1556>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING, -23.0)
|
|
TASK_TURN_PED_TO_FACE_COORD(NULL, <<1.7, -657.2, 16.5>>)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
FORCE_PED_MOTION_STATE(sGoldVanPeds[CASEY_ID].ped, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Bank_Employee", GET_ENTITY_MODEL(sBankWorker.ped))
|
|
SET_ENTITY_COORDS(sBankWorker.ped, <<-4.4338, -687.1326, 15.1306>>, TRUE, TRUE)
|
|
SET_ENTITY_HEADING(sBankWorker.ped, 331.3175)
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottom)
|
|
WAYPOINT_RECORDING_GET_NUM_POINTS(strWaypointLiftExitBottom, iNumNodesInWaypoint)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottom, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iNumNodesInWaypoint - 3)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-2.4, -663.0, 15.1307>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING, -119.7)
|
|
TASK_TURN_PED_TO_FACE_COORD(NULL, <<7.01, -668.95, 16.5>>)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
FORCE_PED_MOTION_STATE(sBankWorker.ped, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sVaultWorker.ped)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Vault_Guy", GET_ENTITY_MODEL(sVaultWorker.ped))
|
|
UPDATE_VAULT_WORKER_IDLES(TRUE)
|
|
//SET_ENTITY_COORDS(sVaultWorker.ped, <<-0.2, -677.3, 15.1306>>, TRUE, TRUE)
|
|
//SET_ENTITY_HEADING(sVaultWorker.ped, 158.5)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael", GET_ENTITY_MODEL(PLAYER_PED_ID()))
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, TRUE)
|
|
|
|
IF NOT bSkippedMocap
|
|
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 2000, -21.9, FALSE)
|
|
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_weapon")
|
|
GIVE_WEAPON_OBJECT_TO_PED(objMichaelsWeapon, PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_weapon")
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
GIVE_WEAPON_OBJECT_TO_PED(objTrevorsWeapon, sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
OR bSkippedMocap
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vVaultDoorPos, 8.0, modelVaultDoor)
|
|
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelVaultDoor, vVaultDoorPos, TRUE, 1.273)
|
|
ENDIF
|
|
|
|
//REMOVE_MODEL_HIDE(vVaultDoorPos, 8.0, modelVaultDoor, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
REPLAY_STOP_EVENT()
|
|
|
|
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_INSTANT_CLOSE, vLiftBottom1, vLiftBottom2, modelLiftDoor)
|
|
fLiftOpenRatio = 0.0
|
|
bPlayedLiftSound = FALSE
|
|
|
|
//If the mocap is skipped then the peds bump into each other, so reposition them to where they would be on a Z-skip.
|
|
IF bSkippedMocap
|
|
AND IS_SCREEN_FADED_OUT()
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-3.6537, -686.9020, 15.1306>>, TRUE, TRUE)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 331.3624)
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<-3.0, -684.2, 15.1306>>, TRUE, TRUE)
|
|
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -28.64)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
SET_ENTITY_COORDS(sBankWorker.ped, <<-1.52, -681.30, 15.1306>>, TRUE, TRUE)
|
|
SET_ENTITY_HEADING(sBankWorker.ped, -32.08)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
SET_ENTITY_COORDS(sGoldVanPeds[CASEY_ID].ped, <<-1.3, -683.1, 15.1306>>, TRUE, TRUE)
|
|
SET_ENTITY_HEADING(sGoldVanPeds[CASEY_ID].ped, -28.64)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//REMOVE_MODEL_HIDE(vVaultDoorPos, 8.0, modelVaultDoor, FALSE)
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
eMissionStage = STAGE_WALK_TO_GOLD
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
STOP_CUTSCENE()
|
|
REMOVE_CUTSCENE()
|
|
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottom)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomLeft)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomRight)
|
|
|
|
WHILE NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottom)
|
|
OR NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottomLeft)
|
|
OR NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottomRight)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
bSkippedMocap = TRUE
|
|
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC WALK_TO_GOLD()
|
|
SEQUENCE_INDEX seq
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF iCurrentEvent != 99
|
|
//Interior needs to be loaded first, to stop entities falling through the map
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-4.51, -689.49, 15.1306>>)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
IF SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
AND SETUP_REQ_BANK_INTERIOR_LOADED()
|
|
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<-4.51, -689.49, 15.1306>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
iCurrentEvent = 99
|
|
ENDIF
|
|
ELSE
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottom)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomLeft)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitBottomRight)
|
|
|
|
IF SETUP_REQ_BANK_WORKER(<<-1.52, -681.30, 15.1306>>, -32.08)
|
|
AND SETUP_REQ_VAULT_WORKER(<<-3.66, -690.01, 15.1306>>, 99.69)
|
|
AND SETUP_REQ_GOLD_VANS_AT_BANK()
|
|
AND SETUP_REQ_MAIN_DRIVER(<<-6.5872, -671.7311, 31.3406>>, 269.1434)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<-7.5872, -671.7311, 31.3406>>, 269.1434)
|
|
AND SETUP_REQ_TREVOR(<<-2.43, -684.33, 15.1306>>, -28.64)
|
|
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-2.19, -682.82, 15.1306>>, 0.0)
|
|
AND SETUP_REQ_SECURITY_BARRIERS()
|
|
AND SETUP_REQ_BANK_SECURITY()
|
|
AND SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottom)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottomLeft)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitBottomRight)
|
|
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
|
|
SETUP_REQ_BANK_PEDS_READY_FOR_WALK()
|
|
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
|
|
REMOVE_MICHAEL_SHOTGUN_SILENCER()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-4.8836, -688.7708, 15.1308>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 336.3668)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
|
|
|
|
INT iNumNodesInWaypoint
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
WAYPOINT_RECORDING_GET_NUM_POINTS(strWaypointLiftExitBottomRight, iNumNodesInWaypoint)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_PAUSE(NULL, 1000)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottomRight, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iNumNodesInWaypoint - 3)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-0.2089, -663.8649, 15.1556>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING, 14.1)
|
|
TASK_TURN_PED_TO_FACE_COORD(NULL, <<-2.0, -658.0, 16.8>>)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
WAYPOINT_RECORDING_GET_NUM_POINTS(strWaypointLiftExitBottomLeft, iNumNodesInWaypoint)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_PAUSE(NULL, 1300)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottomLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iNumNodesInWaypoint - 4)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-1.8, -664.0665, 15.1556>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING, -23.0)
|
|
TASK_TURN_PED_TO_FACE_COORD(NULL, <<1.7, -657.2, 16.5>>)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
WAYPOINT_RECORDING_GET_NUM_POINTS(strWaypointLiftExitBottom, iNumNodesInWaypoint)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitBottom, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, iNumNodesInWaypoint - 3)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-2.4, -663.0, 15.1307>>, PEDMOVEBLENDRATIO_WALK, -1, DEFAULT, ENAV_NO_STOPPING, -119.7)
|
|
TASK_TURN_PED_TO_FACE_COORD(NULL, <<7.01, -668.95, 16.5>>)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(vVaultDoorPos, 5.0, modelVaultDoor)
|
|
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(modelVaultDoor, vVaultDoorPos, TRUE, 1.6)
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2A_BANK_MID_RESTART")
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_VAULT")
|
|
START_AUDIO_SCENE("BS_2A_GET_TO_VAULT")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sVaultWorker.ped)
|
|
TASK_LOOK_AT_ENTITY(sVaultWorker.ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
|
|
ENDIF
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iCurrentEvent = 0
|
|
iGameplayHintEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
UPDATE_VAULT_WORKER_IDLES()
|
|
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
RUBBER_BAND_WALKING_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.93)
|
|
RUBBER_BAND_WALKING_PED(sBankWorker.ped, 1.0)
|
|
RUBBER_BAND_WALKING_PED(sGoldVanPeds[CASEY_ID].ped, 1.0)
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0 //Back up in the elevator
|
|
IF NOT DOES_BLIP_EXIST(sBankWorker.blip)
|
|
sBankWorker.blip = CREATE_BLIP_FOR_ENTITY(sBankWorker.ped)
|
|
SET_BLIP_NAME_FROM_TEXT_FILE(sBankWorker.blip, "F3A_WORKNAME")
|
|
ENDIF
|
|
|
|
REQUEST_CUTSCENE("bs_2a_mcs_5")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_5")
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-0.777570,-668.833984,15.130619>>, <<7.135055,-658.786804,17.971445>>, 2.250000)
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SWITCH iGameplayHintEvent
|
|
CASE 0
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1.552530,-673.366821,14.130619>>, <<3.509254,-674.941711,17.630619>>, 2.000000)
|
|
SET_GAMEPLAY_COORD_HINT(<<-0.6273, -660.5535, 16.3168>>, -1, 2500)
|
|
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(0.75)
|
|
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(0.015)
|
|
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(0.2)
|
|
SET_GAMEPLAY_HINT_FOV(40.0)
|
|
SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<0.8, -669.3, 15.2893>>, PEDMOVE_WALK, -1, 0.25, ENAV_NO_STOPPING)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-0.2, -664.7, 15.2893>>, PEDMOVE_WALK, -1, 0.25, ENAV_NO_STOPPING)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
//TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), <<2.0, -666.2, 15.2893>>, PEDMOVE_WALK, -1, 0.25, ENAV_NO_STOPPING)
|
|
//TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(), <<2.0, -666.2, 15.2893>>, PEDMOVE_WALK)
|
|
|
|
iGameplayHintEvent++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT bHasTextLabelTriggered[FH3A_WALK] //Michael says a line after walking into vault.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<0.803486,-681.658264,15.130619>>, <<-3.866011,-679.937256,17.630619>>, 7.750000)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_WALK", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_WALK] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play a line if the player lags behind
|
|
IF NOT bHasTextLabelTriggered[FH3A_LAG3]
|
|
IF NOT IS_MESSAGE_BEING_DISPLAYED() OR NOT IS_SUBTITLE_PREFERENCE_SWITCHED_ON()
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])) > 64.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LAG", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_LAG3] = TRUE
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
|
|
IF IS_PLAYER_ACTING_SUSPICIOUS_IN_BANK()
|
|
MISSION_FAILED(FAILED_SPOOKED_BANK_WORKERS)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
REPLAY_RECORD_BACK_FOR_TIME(4.0, 2.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
CLEAR_PRINTS()
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
eMissionStage = STAGE_COLLECT_GOLD_CUTSCENE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_COLLECT_GOLD_CUTSCENE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC COLLECT_GOLD_CUTSCENE()
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF iCurrentEvent != 99
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-3.0475, -665.4576, 15.1306>>)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
IF SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
AND SETUP_REQ_BANK_INTERIOR_LOADED()
|
|
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<-3.0475, -665.4576, 15.1306>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
iCurrentEvent = 99
|
|
ENDIF
|
|
ELSE
|
|
IF SETUP_REQ_BANK_WORKER(<<-2.314122,-662.947083,15.1306>>, 263.770699)
|
|
AND SETUP_REQ_VAULT_WORKER(<<-6.0290, -686.3659, 15.1306>>, 161.4787)
|
|
AND SETUP_REQ_GOLD_VANS_AT_BANK()
|
|
AND SETUP_REQ_MAIN_DRIVER(<<-6.5872, -671.7311, 31.3406>>, 269.1434)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<-7.5872, -671.7311, 31.3406>>, 269.1434)
|
|
AND SETUP_REQ_TREVOR(<<-0.848102,-665.244019,15.1306>>, -153.477966)
|
|
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-1.900313,-666.880005,15.1306>>, -127.999458)
|
|
AND SETUP_REQ_SECURITY_BARRIERS()
|
|
AND SETUP_REQ_BANK_SECURITY()
|
|
AND SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
|
|
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
|
|
SETUP_REQ_BANK_PEDS_READY_FOR_WALK()
|
|
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
|
|
REMOVE_MICHAEL_SHOTGUN_SILENCER()
|
|
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_CUTSCENE("bs_2a_mcs_5")
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_5")
|
|
|
|
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sBankWorker.ped, "Bank_Employee", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_ENTITY_MODEL(sBankWorker.ped))
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[CASEY_ID].ped, "Casey", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objGoldTrolleys[0], "GoldCargo", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objGoldTrolleys[1], "GoldCargo^1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
objMichaelsWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objMichaelsWeapon, "Michaels_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
START_CUTSCENE()
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2A_BANK_MID_RESTART")
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_VAULT")
|
|
START_AUDIO_SCENE("BS_2A_GET_TO_VAULT")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
IF NOT bSkippedMocap
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
bSkippedMocap = TRUE
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Request assets for next section in advance.
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottom)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottomLeft)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottomRight)
|
|
REQUEST_ANIM_DICT(strAnimIG5)
|
|
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
|
|
|
|
SEQUENCE_INDEX seq
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
SWITCH iCurrentEvent
|
|
CASE 0
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
STOP_GAMEPLAY_HINT(TRUE)
|
|
|
|
iCurrentEvent++
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF GET_CUTSCENE_TIME() > 5000
|
|
SET_TROLLEY_SOUNDS_ACTIVE(TRUE)
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor", GET_ENTITY_MODEL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("GoldCargo^1")
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<2.7, -667.4, 15.1306>>, TRUE, TRUE)
|
|
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 169.8)
|
|
|
|
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[1], sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_UNARMED, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterBottomRight, 0, EWAYPOINT_START_FROM_CLOSEST_POINT)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], objGoldTrolleys[1], TRUE, FALSE, TRUE)
|
|
|
|
FORCE_PED_MOTION_STATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Casey", GET_ENTITY_MODEL(sGoldVanPeds[CASEY_ID].ped))
|
|
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("GoldCargo")
|
|
SET_ENTITY_COORDS(sGoldVanPeds[CASEY_ID].ped, <<2.0, -671.6, 15.1306>>, TRUE, TRUE)
|
|
SET_ENTITY_HEADING(sGoldVanPeds[CASEY_ID].ped, 158.5)
|
|
|
|
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[0], sGoldVanPeds[CASEY_ID].ped, -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterBottomLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sGoldVanPeds[CASEY_ID].ped, objGoldTrolleys[0], TRUE, FALSE, TRUE)
|
|
|
|
FORCE_PED_MOTION_STATE(sGoldVanPeds[CASEY_ID].ped, MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Bank_Employee", GET_ENTITY_MODEL(sBankWorker.ped))
|
|
SET_ENTITY_COORDS(sBankWorker.ped, <<-0.2, -677.3, 15.1306>>, TRUE, TRUE)
|
|
SET_ENTITY_HEADING(sBankWorker.ped, 158.5)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterBottom, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, 24)
|
|
//TASK_GO_STRAIGHT_TO_COORD(NULL, <<2.9645, -702.7947, 15.1308>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 33.1252) //Outside lift.
|
|
TASK_GO_STRAIGHT_TO_COORD(NULL, <<1.9, -705.2, 15.1308>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP) //Cutscene pos.
|
|
TASK_TURN_PED_TO_FACE_COORD(NULL, <<1.1275, -703.0607, 16.7345>>)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
FORCE_PED_MOTION_STATE(sBankWorker.ped, MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
IF NOT bSkippedMocap
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_weapon")
|
|
GIVE_WEAPON_OBJECT_TO_PED(objMichaelsWeapon, PLAYER_PED_ID())
|
|
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objMichaelsWeapon)
|
|
ENDIF
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME() //In case player control turned back on for the exit state.
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
iCurrentEvent = 0
|
|
|
|
REMOVE_OBJECT(objMichaelsWeapon, TRUE)
|
|
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLiftExitBottom)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLiftExitBottomLeft)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLiftExitBottomRight)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
eMissionStage = STAGE_WALK_TO_LIFT_2
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
STOP_CUTSCENE()
|
|
REMOVE_CUTSCENE()
|
|
|
|
REPLAY_CANCEL_EVENT()
|
|
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottom)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottomLeft)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottomRight)
|
|
REQUEST_ANIM_DICT(strAnimIG5)
|
|
|
|
WHILE NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterBottom)
|
|
OR NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterBottomLeft)
|
|
OR NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterBottomRight)
|
|
OR NOT HAS_ANIM_DICT_LOADED(strAnimIG5)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
bSkippedMocap = TRUE
|
|
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC WALK_TO_LIFT_2()
|
|
SEQUENCE_INDEX seq
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF iCurrentEvent != 99
|
|
//Interior needs to be loaded first, to stop entities falling through the map
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-3.0475, -665.4576, 15.1306>>)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
IF SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
AND SETUP_REQ_BANK_INTERIOR_LOADED()
|
|
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<-3.0475, -665.4576, 15.1306>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
iCurrentEvent = 99
|
|
ENDIF
|
|
ELSE
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottom)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottomLeft)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottomRight)
|
|
REQUEST_ANIM_DICT(strAnimIG5)
|
|
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
|
|
|
|
IF SETUP_REQ_BANK_WORKER(<<-0.2, -677.3, 15.1306>>, 158.5)
|
|
AND SETUP_REQ_VAULT_WORKER(<<-6.0290, -686.3659, 15.1306>>, 161.4787)
|
|
AND SETUP_REQ_GOLD_VANS_AT_BANK()
|
|
AND SETUP_REQ_MAIN_DRIVER(<<-6.5872, -671.7311, 31.3406>>, 269.1434)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<-7.5872, -671.7311, 31.3406>>, 269.1434)
|
|
AND SETUP_REQ_TREVOR(<<2.7, -667.4, 15.1306>>, 169.8)
|
|
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<2.0, -671.6, 15.1306>>, 158.5)
|
|
AND SETUP_REQ_SECURITY_BARRIERS()
|
|
AND SETUP_REQ_BANK_SECURITY()
|
|
AND SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterBottom)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterBottomLeft)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterBottomRight)
|
|
AND HAS_ANIM_DICT_LOADED(strAnimIG5)
|
|
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
|
|
SETUP_REQ_BANK_PEDS_READY_FOR_WALK()
|
|
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
|
|
REMOVE_MICHAEL_SHOTGUN_SILENCER()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-1.80, -664.26, 15.1306>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), -152.406774)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[1], sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_UNARMED, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterBottomRight, 0, EWAYPOINT_START_FROM_CLOSEST_POINT)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], objGoldTrolleys[1], TRUE, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[0], sGoldVanPeds[CASEY_ID].ped, -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterBottomLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sGoldVanPeds[CASEY_ID].ped, objGoldTrolleys[0], TRUE, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterBottom, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, 24)
|
|
//TASK_GO_STRAIGHT_TO_COORD(NULL, <<2.9645, -702.7947, 15.1308>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 33.1252) //Outside lift.
|
|
TASK_GO_STRAIGHT_TO_COORD(NULL, <<1.9, -705.2, 15.1308>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP) //Cutscene pos.
|
|
TASK_TURN_PED_TO_FACE_COORD(NULL, <<1.1275, -703.0607, 16.7345>>)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottom)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottomLeft)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftEnterBottomRight)
|
|
REQUEST_ANIM_DICT(strAnimIG5)
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterBottom)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterBottomLeft)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftEnterBottomRight)
|
|
AND HAS_ANIM_DICT_LOADED(strAnimIG5)
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2A_BANK_MID_RESTART")
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_VAULT")
|
|
START_AUDIO_SCENE("BS_2A_GET_TO_VAULT")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SETTIMERB(0)
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_PED_CAPSULE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.5)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
SET_PED_CAPSULE(sGoldVanPeds[CASEY_ID].ped, 0.5)
|
|
ENDIF
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
SET_TROLLEY_SOUNDS_ACTIVE(TRUE)
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
|
|
sMichael.iEvent = 0
|
|
sVaultWorker.iEvent = 0
|
|
sBankWorker.iEvent = 0
|
|
bWorkerLeftVault = FALSE
|
|
bHostageLeftVault = FALSE
|
|
bPlayerLeftVault = FALSE
|
|
bTrevorLeftVault = FALSE
|
|
fLiftOpenRatio = 0.0
|
|
iGameplayHintEvent = 0
|
|
bPlayedLiftSound = FALSE
|
|
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_UNLOCK, vLiftBottom1, vLiftBottom2, modelLiftDoor)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_BANK_DOOR")
|
|
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
RUBBER_BAND_WALKING_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.93, 5.0, 15.0)
|
|
RUBBER_BAND_WALKING_PED(sBankWorker.ped, 1.08, 5.0, 15.0)
|
|
RUBBER_BAND_WALKING_PED(sGoldVanPeds[CASEY_ID].ped, 1.10, 5.0, 15.0)
|
|
SET_PED_MOVE_RATE_OVERRIDE(PLAYER_PED_ID(), 0.97)
|
|
|
|
REQUEST_SCRIPT_AUDIO_BANK("Freight_Elevator")
|
|
|
|
IF TIMERB() < 1000
|
|
UPDATE_TROLLEY_WALK_ANIMS(FALSE, FALSE, TRUE)
|
|
ELSE
|
|
UPDATE_TROLLEY_WALK_ANIMS()
|
|
ENDIF
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0 //Back up in the elevator
|
|
REQUEST_CUTSCENE("bs_2a_mcs_6")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_6")
|
|
|
|
IF NOT DOES_BLIP_EXIST(sBankWorker.blip)
|
|
sBankWorker.blip = CREATE_BLIP_FOR_ENTITY(sBankWorker.ped)
|
|
SET_BLIP_NAME_FROM_TEXT_FILE(sBankWorker.blip, "F3A_WORKNAME")
|
|
ENDIF
|
|
|
|
//Bank worker stands outside lift first (to allow room for trolleys).
|
|
/*IF VDIST2(GET_ENTITY_COORDS(sBankWorker.ped), <<2.9645, -702.7947, 15.1308>>) > 4.0
|
|
AND GET_SCRIPT_TASK_STATUS(sBankWorker.ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftEnterBottom, 0, EWAYPOINT_START_FROM_CLOSEST_POINT, 24)
|
|
TASK_GO_STRAIGHT_TO_COORD(NULL, <<2.9645, -702.7947, 15.1308>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 33.1252) //Oustside lift.
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF*/
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(sBankWorker.ped), vLiftBottom1) < 49.0
|
|
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_OPEN, vLiftBottom1, vLiftBottom2, modelLiftDoor)
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-0.944279,-708.157898,14.880627>>, <<1.774363,-700.803101,18.131031>>, 4.000000)
|
|
IF (GET_SCRIPT_TASK_STATUS(sBankWorker.ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
AND GET_ENTITY_SPEED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) < 1.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-0.758487,-708.129211,15.130634>>, <<0.732468,-703.698669,17.881027>>, 3.500000)
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SWITCH iGameplayHintEvent
|
|
CASE 0
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-0.430255,-696.756348,14.175640>>, <<-5.093378,-700.722168,17.631031>>, 4.000000)
|
|
SET_GAMEPLAY_COORD_HINT(<<1.9453, -705.3939, 16.6141>>, -1, 2000)
|
|
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(0.8)
|
|
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(0.015)
|
|
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(0.2)
|
|
SET_GAMEPLAY_HINT_FOV(40.0)
|
|
SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), <<1.0, -702.4409, 15.2546>>, PEDMOVE_WALK, -1, 0.25, ENAV_NO_STOPPING)
|
|
//TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(), <<1.0, -702.4409, 15.2546>>, PEDMOVE_WALK)
|
|
|
|
iGameplayHintEvent++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
//Chat between Trevor and the liason.
|
|
IF NOT bHasTextLabelTriggered[FH3A_PSHTROL]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_PSHTROL", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_PSHTROL] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Kill the conversation before the player approaches the lift, to avoid having to cut a line off mid-way for the cutscene.
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<0.006684,-695.472107,15.133235>>, <<-6.646950,-700.182800,17.631029>>, 1.000000)
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play a line if the player lags behind
|
|
IF NOT bHasTextLabelTriggered[FH3A_LAG4]
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])) > 64.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LAG", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_LAG4] = TRUE
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Close the vault door once everyone has left the vault
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
IF NOT bWorkerLeftVault
|
|
bWorkerLeftVault = IS_ENTITY_IN_ANGLED_AREA(sBankWorker.ped, <<-9.435379,-688.462769,15.130812>>, <<0.869906,-692.525757,17.631247>>, 1.500000)
|
|
ENDIF
|
|
|
|
IF NOT bTrevorLeftVault
|
|
bTrevorLeftVault = IS_ENTITY_IN_ANGLED_AREA(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<-9.435379,-688.462769,15.130812>>, <<0.869906,-692.525757,17.631247>>, 1.500000)
|
|
ENDIF
|
|
|
|
IF NOT bHostageLeftVault
|
|
bHostageLeftVault = IS_ENTITY_IN_ANGLED_AREA(sGoldVanPeds[CASEY_ID].ped, <<-9.435379,-688.462769,15.130812>>, <<0.869906,-692.525757,17.631247>>, 1.500000)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bPlayerLeftVault
|
|
//bPlayerLeftVault = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-0.415301,-696.714905,15.275375>>, <<-15.518509,-696.049011,17.630766>>, 1.250000)
|
|
bPlayerLeftVault = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-4.294104,-690.640320,15.130766>>, <<-5.094479,-692.881531,17.630766>>, 12.250000)
|
|
ENDIF
|
|
|
|
//Update the vault worker's behaviour: plays an anim to close the door, then returns to idle.
|
|
IF NOT IS_PED_INJURED(sVaultWorker.ped)
|
|
VECTOR vInitialWaitPos, vInitialWaitRot, vInitialDoorPos, vInitialDoorRot
|
|
VECTOR vSyncScenePos = <<-5.017, -685.369, 15.909>>
|
|
VECTOR vSyncSceneRot = <<0.000, 0.000, -20.000>>
|
|
|
|
SWITCH sVaultWorker.iEvent
|
|
CASE 0 //Play an idle loop.
|
|
REQUEST_ANIM_DICT(strAnimIG6)
|
|
REQUEST_MODEL(modelFakeVaultDoor)
|
|
REQUEST_MODEL(modelWalkieTalkie)
|
|
REQUEST_SCRIPT_AUDIO_BANK("Vault_Door")
|
|
|
|
IF HAS_ANIM_DICT_LOADED(strAnimIG6)
|
|
AND HAS_MODEL_LOADED(modelFakeVaultDoor)
|
|
vInitialWaitPos = GET_ANIM_INITIAL_OFFSET_POSITION(strAnimIG6, "close_vaultdoor", vSyncScenePos, vSyncSceneRot, 0.0)
|
|
vInitialWaitRot = GET_ANIM_INITIAL_OFFSET_ROTATION(strAnimIG6, "close_vaultdoor", vSyncScenePos, vSyncSceneRot, 0.0)
|
|
vInitialDoorPos = GET_ANIM_INITIAL_OFFSET_POSITION(strAnimIG6, "Close_VaultDoor_Door", vSyncScenePos, vSyncSceneRot, 0.0)
|
|
vInitialDoorRot = GET_ANIM_INITIAL_OFFSET_ROTATION(strAnimIG6, "Close_VaultDoor_Door", vSyncScenePos, vSyncSceneRot, 0.0)
|
|
|
|
//Hide the map version of the door and create one that can be animated.
|
|
CREATE_MODEL_HIDE(vSyncScenePos, 3.0, modelVaultDoor, FALSE)
|
|
|
|
objFakeVaultDoor = CREATE_OBJECT_NO_OFFSET(modelFakeVaultDoor, vInitialDoorPos)
|
|
SET_ENTITY_ROTATION(objFakeVaultDoor, vInitialDoorRot)
|
|
FREEZE_ENTITY_POSITION(objFakeVaultDoor, TRUE)
|
|
FORCE_ROOM_FOR_ENTITY(objFakeVaultDoor, interiorBank, HASH("GtaMloRoom009"))
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelFakeVaultDoor)
|
|
|
|
SET_ENTITY_COORDS(sVaultWorker.ped, vInitialWaitPos)
|
|
SET_ENTITY_HEADING(sVaultWorker.ped, vInitialWaitRot.z)
|
|
|
|
//Create a walkie-talkie for the worker to hold.
|
|
objWalkieTalkie = CREATE_OBJECT_NO_OFFSET(modelWalkieTalkie, vInitialDoorPos)
|
|
ATTACH_ENTITY_TO_ENTITY(objWalkieTalkie, sVaultWorker.ped, GET_PED_BONE_INDEX(sVaultWorker.ped, BONETAG_PH_L_HAND), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelWalkieTalkie)
|
|
|
|
TASK_PLAY_ANIM(sVaultWorker.ped, strAnimIG6, "Wait_Loop", NORMAL_BLEND_IN, WALK_BLEND_OUT, -1, AF_LOOPING | AF_USE_KINEMATIC_PHYSICS)
|
|
|
|
TASK_LOOK_AT_ENTITY(sVaultWorker.ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
|
|
|
|
sVaultWorker.iEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Play the close door anim.
|
|
//When the player goes near the worker give him a lookat task.
|
|
IF bWorkerLeftVault
|
|
AND bHostageLeftVault
|
|
AND bPlayerLeftVault
|
|
AND bTrevorLeftVault
|
|
iVaultWorkerSyncScene = CREATE_SYNCHRONIZED_SCENE(vSyncScenePos, vSyncSceneRot)
|
|
|
|
TASK_CLEAR_LOOK_AT(sVaultWorker.ped)
|
|
TASK_SYNCHRONIZED_SCENE(sVaultWorker.ped, iVaultWorkerSyncScene, strAnimIG6, "close_vaultdoor", WALK_BLEND_IN, WALK_BLEND_OUT,
|
|
SYNCED_SCENE_USE_PHYSICS, RBF_NONE)
|
|
|
|
FREEZE_ENTITY_POSITION(objFakeVaultDoor, FALSE)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objFakeVaultDoor, iVaultWorkerSyncScene, "Close_VaultDoor_Door", strAnimIG6,
|
|
NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
sVaultWorker.iEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Return to idle loop.
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iVaultWorkerSyncScene)
|
|
FLOAT fScenePhase
|
|
fScenePhase = GET_SYNCHRONIZED_SCENE_PHASE(iVaultWorkerSyncScene)
|
|
|
|
//Play a sound for the door
|
|
IF fScenePhase > 0.196
|
|
IF fScenePhase < 0.405
|
|
IF HAS_SOUND_FINISHED(iVaultDoorCloseSoundID)
|
|
AND REQUEST_SCRIPT_AUDIO_BANK("Vault_Door")
|
|
PLAY_SOUND_FROM_COORD(iVaultDoorCloseSoundID, "VAULT_DOOR_CLOSE", <<-3.4801, -686.1755, 16.1308>>)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT HAS_SOUND_FINISHED(iVaultDoorCloseSoundID)
|
|
STOP_SOUND(iVaultDoorCloseSoundID)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fScenePhase > 0.99
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sVaultWorker.ped, NORMAL_BLEND_OUT, TRUE)
|
|
TASK_PLAY_ANIM(sVaultWorker.ped, strAnimIG6, "Wait_Loop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
|
|
TASK_LOOK_AT_ENTITY(sVaultWorker.ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
|
|
|
|
sVaultWorker.iEvent++
|
|
ENDIF
|
|
|
|
//Fail if the player tries to walk back in.
|
|
IF fScenePhase > 0.2 AND fScenePhase < 0.9
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<1.651060,-674.266541,15.130766>>, <<-4.217375,-689.260010,17.630766>>, 6.500000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<5.924709,-660.075928,15.130619>>, <<-3.049540,-684.865051,18.630619>>, 16.750000)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sVaultWorker.ped, NORMAL_BLEND_OUT, TRUE)
|
|
|
|
IF DOES_ENTITY_EXIST(objFakeVaultDoor)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(objFakeVaultDoor, NORMAL_BLEND_OUT, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iVaultDoorCloseSoundID)
|
|
STOP_SOUND(iVaultDoorCloseSoundID)
|
|
ENDIF
|
|
|
|
TASK_SMART_FLEE_PED(sVaultWorker.ped, PLAYER_PED_ID(), 50.0, -1)
|
|
|
|
IF DOES_ENTITY_EXIST(objWalkieTalkie)
|
|
AND IS_ENTITY_ATTACHED_TO_ENTITY(objWalkieTalkie, sVaultWorker.ped)
|
|
DETACH_ENTITY(objWalkieTalkie, TRUE, FALSE)
|
|
ENDIF
|
|
|
|
MISSION_FAILED(FAILED_SPOOKED_BANK_WORKERS)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Sync dialogue.
|
|
IF NOT bHasTextLabelTriggered[FH3A_SEEN_1]
|
|
IF sConversationPeds.PedInfo[6].Index != sVaultWorker.ped
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 6, sVaultWorker.ped, "FH3VAULT")
|
|
ENDIF
|
|
|
|
IF fScenePhase > 0.108
|
|
IF fScenePhase < 0.15
|
|
//PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(sVaultWorker.ped, "FH3A_CDAA", "FH3VAULT", SPEECH_PARAMS_FORCE_NORMAL)
|
|
//bHasTextLabelTriggered[FH3A_SEEN_1] = TRUE
|
|
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SEEN", "FH3A_SEEN_1", CONV_PRIORITY_AMBIENT_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
bHasTextLabelTriggered[FH3A_SEEN_1] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bHasTextLabelTriggered[FH3A_SEEN_1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_SEEN_2]
|
|
IF fScenePhase > 0.755
|
|
IF fScenePhase < 0.81
|
|
//PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(sVaultWorker.ped, "FH3A_CDAB", "FH3VAULT", SPEECH_PARAMS_FORCE_NORMAL)
|
|
//bHasTextLabelTriggered[FH3A_SEEN_2] = TRUE
|
|
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SEEN", "FH3A_SEEN_2", CONV_PRIORITY_AMBIENT_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
bHasTextLabelTriggered[FH3A_SEEN_2] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bHasTextLabelTriggered[FH3A_SEEN_2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Get the manager to look at the player.
|
|
IF sBankWorker.iEvent = 0
|
|
IF IS_ENTITY_IN_ANGLED_AREA(sBankWorker.ped, <<-0.758487,-708.129211,15.130634>>, <<0.732468,-703.698669,17.881027>>, 3.500000)
|
|
AND GET_SCRIPT_TASK_STATUS(sBankWorker.ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
TASK_LOOK_AT_ENTITY(sBankWorker.ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
|
|
sBankWorker.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//TODO 655058: Have the player look at the vault worker when nearby
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sVaultWorker.ped)) < 36.0
|
|
IF sMichael.iEvent = 0
|
|
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sVaultWorker.ped, -1)
|
|
sMichael.iEvent = 1
|
|
ENDIF
|
|
ELSE
|
|
IF sMichael.iEvent = 1
|
|
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
|
|
sMichael.iEvent = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
|
|
IF IS_PLAYER_ACTING_SUSPICIOUS_IN_BANK()
|
|
MISSION_FAILED(FAILED_SPOOKED_BANK_WORKERS)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(4.0, 2.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
CLEAR_PRINTS()
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLiftEnterBottom)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLiftEnterTopLeft)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLiftEnterTopRight)
|
|
|
|
REMOVE_OBJECT(objWalkieTalkie, TRUE)
|
|
REMOVE_PED(sVaultWorker.ped, TRUE)
|
|
REMOVE_OBJECT(objFakeVaultDoor, TRUE)
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iVaultDoorCloseSoundID)
|
|
STOP_SOUND(iVaultDoorCloseSoundID)
|
|
ENDIF
|
|
|
|
REMOVE_ANIM_DICT(strAnimIG6)
|
|
REMOVE_ANIM_DICT(strVaultWorkerAnims)
|
|
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Vault_Door")
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_BANK_DOOR")
|
|
|
|
eMissionStage = STAGE_LIFT_CUTSCENE_2
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_LIFT_CUTSCENE_2)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC LIFT_CUTSCENE_2()
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF iCurrentEvent != 99
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<10.5, -671.6, 32.44>>)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
IF SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
AND SETUP_REQ_BANK_INTERIOR_LOADED()
|
|
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<10.5, -671.6, 32.44>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
iCurrentEvent = 99
|
|
ENDIF
|
|
ELSE
|
|
IF SETUP_REQ_BANK_WORKER(<<-2.314122,-662.947083,15.1306>>, 263.770699)
|
|
AND SETUP_REQ_VAULT_WORKER(<<-6.0290, -686.3659, 15.1306>>, 161.4787)
|
|
AND SETUP_REQ_GOLD_VANS_AT_BANK()
|
|
AND SETUP_REQ_MAIN_DRIVER(<<-6.5872, -671.7311, 31.3406>>, 269.1434)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<-7.5872, -671.7311, 31.3406>>, 269.1434)
|
|
AND SETUP_REQ_TREVOR(<<-0.848102,-665.244019,15.1306>>, -153.477966)
|
|
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-1.900313,-666.880005,15.1306>>, -127.999458)
|
|
AND SETUP_REQ_SECURITY_BARRIERS()
|
|
AND SETUP_REQ_BANK_SECURITY()
|
|
AND SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
|
|
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
|
|
SETUP_REQ_BANK_PEDS_READY_FOR_WALK()
|
|
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
|
|
REMOVE_MICHAEL_SHOTGUN_SILENCER()
|
|
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
//Bottom door
|
|
//2.10, -704.07, 15.13
|
|
//Top door
|
|
//11.66, -668.47, 32.45
|
|
//Difference
|
|
//9.56, 35.6, 17.32
|
|
//Bottom cutscene node MCS_6
|
|
//14.810, -688.770, 44.960
|
|
//Potential top node
|
|
//24.37, -653.17, 62.28
|
|
//Fudged position
|
|
//16.770, -649.170, 62.280
|
|
|
|
REQUEST_CUTSCENE("bs_2a_mcs_6")
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_6")
|
|
|
|
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
TASK_CLEAR_LOOK_AT(sBankWorker.ped) //May have carried over from previous section.
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sBankWorker.ped, "Bank_Employee", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_ENTITY_MODEL(sBankWorker.ped))
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[CASEY_ID].ped, "Casey", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
DETACH_ENTITY(objGoldTrolleys[0])
|
|
DETACH_ENTITY(objGoldTrolleys[1])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objGoldTrolleys[0], "Prop_Large_gold", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_ENTITY_MODEL(objGoldTrolleys[0]))
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objGoldTrolleys[1], "Prop_Large_gold^1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_ENTITY_MODEL(objGoldTrolleys[1]))
|
|
|
|
SET_TROLLEY_SOUNDS_ACTIVE(FALSE)
|
|
|
|
//SET_CUTSCENE_TRIGGER_AREA(<<0.0, 0.0, 0.0>>, 0.0, 24.82, 0.0)
|
|
//START_CUTSCENE_AT_COORDS(<<16.770, -649.170, 62.280>>)
|
|
START_CUTSCENE()
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2A_BANK_MID_RESTART")
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_VAULT")
|
|
START_AUDIO_SCENE("BS_2A_GET_TO_VAULT")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2A_GOLD")
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
IF NOT bSkippedMocap
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
bSkippedMocap = TRUE
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Request assets for next section in advance.
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitTop)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitTopLeft)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitTopRight)
|
|
REQUEST_ANIM_DICT(strAnimIG5)
|
|
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
|
|
|
|
SEQUENCE_INDEX seq
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor", GET_ENTITY_MODEL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Prop_Large_gold^1", GET_ENTITY_MODEL(objGoldTrolleys[1]))
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<11.0, -668.3, 32.44>>, TRUE, TRUE)
|
|
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 8.664)
|
|
|
|
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[1], sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_UNARMED, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitTopRight, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], objGoldTrolleys[1], TRUE, FALSE, TRUE)
|
|
|
|
FORCE_PED_MOTION_STATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Casey", GET_ENTITY_MODEL(sGoldVanPeds[CASEY_ID].ped))
|
|
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Prop_Large_gold", GET_ENTITY_MODEL(objGoldTrolleys[0]))
|
|
SET_ENTITY_COORDS(sGoldVanPeds[CASEY_ID].ped, <<10.3, -664.3, 32.44>>, TRUE, TRUE)
|
|
SET_ENTITY_HEADING(sGoldVanPeds[CASEY_ID].ped, 11.8)
|
|
|
|
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[0], sGoldVanPeds[CASEY_ID].ped, -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitTopLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sGoldVanPeds[CASEY_ID].ped, objGoldTrolleys[0], TRUE, FALSE, TRUE)
|
|
|
|
FORCE_PED_MOTION_STATE(sGoldVanPeds[CASEY_ID].ped, MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Bank_Employee")
|
|
SET_ENTITY_COORDS(sBankWorker.ped, <<7.9, -661.3, 32.44>>)
|
|
SET_ENTITY_HEADING(sBankWorker.ped, 42.3)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitTop, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS, 17)
|
|
TASK_GO_STRAIGHT_TO_COORD(NULL, vBankWorkerExit, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 49.5274)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
FORCE_PED_MOTION_STATE(sBankWorker.ped, MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael", GET_ENTITY_MODEL(PLAYER_PED_ID()))
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<10.5094, -672.1926, 32.4495>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 3.5059)
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, TRUE)
|
|
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE, TRUE, FAUS_CUTSCENE_EXIT)
|
|
|
|
IF NOT bSkippedMocap
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
ENDIF
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_CUTSCENE_TIME())
|
|
#ENDIF
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0
|
|
IF IS_CUTSCENE_PLAYING()
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
STOP_GAMEPLAY_HINT(TRUE)
|
|
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_INSTANT_OPEN, vLiftTop1, vLiftTop2, modelLiftDoor)
|
|
|
|
fLiftOpenRatio = 1.0
|
|
bPlayedLiftSound = FALSE
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF GET_CUTSCENE_TIME() > 2500
|
|
IF PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_CLOSE, vLiftBottom1, vLiftBottom2, modelLiftDoor)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF GET_CUTSCENE_TIME() > 5000
|
|
SET_TROLLEY_SOUNDS_ACTIVE(TRUE)
|
|
|
|
fLiftOpenRatio = 0.0
|
|
bPlayedLiftSound = FALSE
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3
|
|
IF GET_CUTSCENE_TIME() > 20500
|
|
IF PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_OPEN, vLiftBottom1, vLiftBottom2, modelLiftDoor)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
//NEW_LOAD_SCENE_START(<<10.5403, -673.2892, 34.0379>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-1.2445, 0.0019, 3.4569>>), 20.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
|
|
NEW_LOAD_SCENE_START_SPHERE(<<9.6, -666.4, 33.3>>, 15.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
|
|
ENDIF
|
|
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
REPLAY_STOP_EVENT()
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
eMissionStage = STAGE_WALK_TO_VANS
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
REPLAY_CANCEL_EVENT()
|
|
STOP_CUTSCENE()
|
|
REMOVE_CUTSCENE()
|
|
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitTop)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitTopLeft)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitTopRight)
|
|
REQUEST_ANIM_DICT(strAnimIG5)
|
|
|
|
WHILE NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitTop)
|
|
OR NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitTopLeft)
|
|
OR NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitTopRight)
|
|
OR NOT HAS_ANIM_DICT_LOADED(strAnimIG5)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
bSkippedMocap = TRUE
|
|
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC WALK_TO_VANS()
|
|
SEQUENCE_INDEX seq
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF iCurrentEvent != 99
|
|
//Interior needs to be loaded first, to stop entities falling through the map
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<10.5, -671.6, 32.44>>)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
IF SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
AND SETUP_REQ_BANK_INTERIOR_LOADED()
|
|
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<10.5, -671.6, 32.44>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
|
|
WAIT(1000)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
iCurrentEvent = 99
|
|
ENDIF
|
|
ELSE
|
|
REQUEST_ANIM_DICT(strAnimIG5)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitTop)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitTopLeft)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointLiftExitTopRight)
|
|
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
|
|
|
|
IF SETUP_REQ_BANK_WORKER(<<7.9, -661.3, 32.44>>, 42.3)
|
|
AND SETUP_REQ_VAULT_WORKER(<<-6.0290, -686.3659, 15.1306>>, 161.4787)
|
|
AND SETUP_REQ_GOLD_VANS_AT_BANK()
|
|
AND SETUP_REQ_MAIN_DRIVER(<<-6.5872, -671.7311, 31.3406>>, 269.1434)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<-7.5872, -671.7311, 31.3406>>, 269.1434)
|
|
AND SETUP_REQ_TREVOR(<<11.0, -668.3, 32.44>>, 8.664)
|
|
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<10.3, -664.3, 32.44>>, 11.8)
|
|
AND SETUP_REQ_SECURITY_BARRIERS()
|
|
AND SETUP_REQ_BANK_SECURITY()
|
|
AND SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
|
|
IF HAS_ANIM_DICT_LOADED(strAnimIG5)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitTop)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitTopLeft)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointLiftExitTopRight)
|
|
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
|
|
SETUP_REQ_BANK_PEDS_READY_FOR_WALK()
|
|
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
|
|
REMOVE_MICHAEL_SHOTGUN_SILENCER()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<10.5, -671.6, 32.44>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 6.7)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[1], sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_UNARMED, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitTopRight, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], objGoldTrolleys[1], TRUE, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[0], sGoldVanPeds[CASEY_ID].ped, -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitTopLeft, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
UPDATE_TROLLEY_WALK_ANIMS_FOR_PED(sGoldVanPeds[CASEY_ID].ped, objGoldTrolleys[0], TRUE, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointLiftExitTop, 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS, 17)
|
|
TASK_GO_STRAIGHT_TO_COORD(NULL, vBankWorkerExit, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 49.5274)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sBankWorker.ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_INSTANT_OPEN, vLiftTop1, vLiftTop2, modelLiftDoor)
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2A_CARTS_RESTART")
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_GET_TO_VAULT")
|
|
START_AUDIO_SCENE("BS_2A_GET_TO_VAULT")
|
|
ENDIF
|
|
ELSE
|
|
TRIGGER_MUSIC_EVENT("FH2A_CARTS_MA")
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_PED_CAPSULE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.5)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
SET_PED_CAPSULE(sGoldVanPeds[CASEY_ID].ped, 0.5)
|
|
ENDIF
|
|
|
|
SETTIMERB(0)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
SET_TROLLEY_SOUNDS_ACTIVE(TRUE)
|
|
|
|
DO_FADE_IN_WITH_WAIT() //In case of skip.
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
NEW_LOAD_SCENE_STOP() //From previous section.
|
|
|
|
iLiftEvent = 0
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
RUBBER_BAND_WALKING_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.91)
|
|
RUBBER_BAND_WALKING_PED(sBankWorker.ped, 1.0)
|
|
RUBBER_BAND_WALKING_PED(sGoldVanPeds[CASEY_ID].ped, 1.0)
|
|
|
|
REQUEST_SCRIPT_AUDIO_BANK("Freight_Elevator")
|
|
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
|
|
|
|
IF TIMERB() < 1000
|
|
UPDATE_TROLLEY_WALK_ANIMS(FALSE, FALSE, TRUE)
|
|
ELSE
|
|
UPDATE_TROLLEY_WALK_ANIMS()
|
|
ENDIF
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0
|
|
//Open/close the lift manually, sync sounds to match
|
|
IF iLiftEvent = 0
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<6.687630,-664.025696,31.950871>>, <<6.645411,-656.735718,35.200790>>, 1.500000)
|
|
fLiftOpenRatio = 1.0
|
|
bPlayedLiftSound = FALSE
|
|
iLiftEvent++
|
|
ENDIF
|
|
ELIF iLiftEvent = 1
|
|
IF PERFORM_LIFT_DOOR_ACTION(LIFT_DOOR_CLOSE, vLiftTop1, vLiftTop2, modelLiftDoor)
|
|
iLiftEvent++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Start requesting the next mocap
|
|
REQUEST_CUTSCENE("BS_2A_MCS_7_P1")
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("BS_2A_MCS_7_P1")
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<3.760101,-655.617981,32.450539>>, <<-10.188398,-657.055481,35.201187>>, 3.750000)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(objGoldTrolleys[0], <<1.681838,-660.596497,32.481625>>, <<-11.531109,-661.686096,35.231617>>, 4.50000)
|
|
bHasTextLabelTriggered[F3A_GETINVAN] = FALSE
|
|
CLEAR_PRINTS()
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent = 10
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Chat between Trevor and the liason.
|
|
IF NOT bHasTextLabelTriggered[FH3A_TROLLEY]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_TROLLEY", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_TROLLEY] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Kill the conversation before the player approaches the lift, to avoid having to cut a line off mid-way for the cutscene.
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-5.126129,-656.038208,32.450607>>, <<2.8,-657.035815,34.951149>>, 5.250000)
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play a line if the player lags behind
|
|
IF NOT bHasTextLabelTriggered[FH3A_LAG5]
|
|
IF NOT IS_MESSAGE_BEING_DISPLAYED() OR NOT IS_SUBTITLE_PREFERENCE_SWITCHED_ON()
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])) > 64.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LAG", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_LAG5] = TRUE
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME()
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
|
|
IF IS_PLAYER_ACTING_SUSPICIOUS_IN_BANK()
|
|
MISSION_FAILED(FAILED_SPOOKED_BANK_WORKERS)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 1.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLiftExitTop)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLiftEnterTop)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLiftExitBottom)
|
|
|
|
REMOVE_ANIM_DICT(strAnimIG6)
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iLiftSoundID)
|
|
STOP_SOUND(iLiftSoundID)
|
|
ENDIF
|
|
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Freight_Elevator")
|
|
|
|
eMissionStage = STAGE_LOAD_GOLD_IN_VANS_CUTSCENE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_LOAD_GOLD_IN_VANS_CUTSCENE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC LOAD_GOLD_INTO_VANS_CUTSCENE()
|
|
SEQUENCE_INDEX seq
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF iCurrentEvent != 99
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-3.6475, -661.4576, 33.3306>>)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
IF SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
AND SETUP_REQ_BANK_INTERIOR_LOADED()
|
|
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<-3.6475, -661.4576, 33.3306>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
|
|
WAIT(1000)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
iCurrentEvent = 99
|
|
ENDIF
|
|
ELSE
|
|
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
|
|
|
|
IF SETUP_REQ_BANK_WORKER(<<-2.314122,-662.947083,15.1306>>, 263.770699)
|
|
AND SETUP_REQ_GOLD_VANS_AT_BANK()
|
|
AND SETUP_REQ_MAIN_DRIVER(<<-6.5872, -671.7311, 31.3406>>, 269.1434)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<-7.5872, -671.7311, 31.3406>>, 269.1434)
|
|
AND SETUP_REQ_TREVOR(<<-0.848102,-665.244019,15.1306>>, -153.477966)
|
|
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-1.900313,-666.880005,15.1306>>, -127.999458)
|
|
AND SETUP_REQ_SECURITY_BARRIERS()
|
|
AND SETUP_REQ_BANK_SECURITY()
|
|
AND SETUP_REQ_GOLD_TROLLEYS_IN_VAULT()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
|
|
SETUP_REQ_CREW_STANDING_IN_FRONT_OF_VANS()
|
|
SETUP_REQ_BANK_PEDS_READY_FOR_WALK()
|
|
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
|
|
REMOVE_MICHAEL_SHOTGUN_SILENCER()
|
|
|
|
//Open the back doors on the vans
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
SET_VEHICLE_DOOR_OPEN(sGoldVans[0].veh, SC_DOOR_REAR_LEFT)
|
|
SET_VEHICLE_DOOR_OPEN(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
SET_VEHICLE_DOOR_OPEN(sGoldVans[1].veh, SC_DOOR_REAR_LEFT)
|
|
SET_VEHICLE_DOOR_OPEN(sGoldVans[1].veh, SC_DOOR_REAR_RIGHT)
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-3.0475, -665.4576, 15.1306>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 250.9940)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100, TRUE)
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_UNARMED, TRUE)
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_CUTSCENE("BS_2A_MCS_7_P1")
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("BS_2A_MCS_7_P1")
|
|
|
|
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_FRONT_RIGHT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT, DT_DOOR_INTACT, 0.0)
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[0].veh, "Trevors_truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_FRONT_RIGHT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_REAR_RIGHT, DT_DOOR_INTACT, 0.0)
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[1].veh, "Michaels_truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_PED_CAPSULE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 0.)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sBankWorker.ped, "Bank_Employee", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_ENTITY_MODEL(sBankWorker.ped))
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
SET_PED_LOD_MULTIPLIER(sCrew[CREW_GUNMAN].ped, 1.5)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_GUNMAN].ped, "gunman_selection_1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, 100)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
|
|
objGunmansWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objGunmansWeapon, "HC_Gunman_Rifle", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_PED_LOD_MULTIPLIER(sCrew[CREW_DRIVER].ped, 1.5)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_DRIVER].ped, "driver_selection", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE, 100)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
|
|
objDriversWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(sCrew[CREW_DRIVER].ped, WEAPONTYPE_CARBINERIFLE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objDriversWeapon, "HC_Driver_Rifle", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
SET_PED_CAPSULE(sGoldVanPeds[CASEY_ID].ped, 0.0)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVanPeds[CASEY_ID].ped, "Casey", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
//Setup all the weapons
|
|
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 100)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, TRUE)
|
|
|
|
objMichaelsWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objMichaelsWeapon, "Michaels_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
DETACH_ENTITY(objGoldTrolleys[0])
|
|
DETACH_ENTITY(objGoldTrolleys[1])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objGoldTrolleys[0], "GoldCargo", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objGoldTrolleys[1], "GoldCargo^1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
SET_TROLLEY_SOUNDS_ACTIVE(TRUE)
|
|
|
|
START_CUTSCENE()
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
REMOVE_ALL_AUDIO_SCENES()
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2A_CARTS_RESTART")
|
|
ENDIF
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
|
|
iMusicTriggerEvent = 0
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
IF NOT bSkippedMocap
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
bSkippedMocap = TRUE
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Request assets for next section in advance.
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointVehLeaveBank)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_BANK_LEAVE, strCarrec)
|
|
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF IS_CUTSCENE_PLAYING()
|
|
IF iCurrentEvent = 0
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
CLEAR_AREA_OF_PEDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), 300.0)
|
|
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 300.0)
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<0.4, -662.530, 32.4815>>, PEDMOVE_WALK, DEFAULT, 0.5, ENAV_NO_STOPPING)
|
|
TASK_ENTER_VEHICLE(NULL, sGoldVans[1].veh, DEFAULT, VS_DRIVER, PEDMOVE_WALK)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("gunman_selection_1")
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_GUNMAN].ped, sGoldVans[1].veh, VS_BACK_RIGHT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sCrew[CREW_GUNMAN].ped)
|
|
SET_PED_LOD_MULTIPLIER(sCrew[CREW_GUNMAN].ped, 1.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("driver_selection")
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<0.7, -667.0, 32.4815>>, PEDMOVE_WALK, DEFAULT, 0.5, ENAV_NO_STOPPING)
|
|
TASK_ENTER_VEHICLE(NULL, sGoldVans[1].veh, DEFAULT, VS_FRONT_RIGHT, PEDMOVE_WALK)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sCrew[CREW_DRIVER].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
SET_PED_LOD_MULTIPLIER(sCrew[CREW_DRIVER].ped, 1.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Casey")
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<0.1678, -661.1131, 32.4818>>, PEDMOVE_WALK, DEFAULT, 0.5, ENAV_NO_STOPPING)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<0.5, -666.4, 31.6818>>, PEDMOVE_WALK, DEFAULT, 0.5, ENAV_NO_STOPPING)
|
|
TASK_ENTER_VEHICLE(NULL, sGoldVans[0].veh, DEFAULT, VS_FRONT_RIGHT, PEDMOVE_WALK)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, TRUE)
|
|
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE, FALSE, FAUS_CUTSCENE_EXIT)
|
|
|
|
IF NOT bSkippedMocap
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2A_LEAVE_BANK_MA")
|
|
iMusicTriggerEvent++
|
|
ENDIF
|
|
|
|
IF iMusicTriggerEvent = 0
|
|
PREPARE_MUSIC_EVENT("FH2A_LEAVE_BANK_MA")
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Bank_Employee")
|
|
//Currently don't need to do anything.
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("GoldCargo")
|
|
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("GoldCargo^1")
|
|
SETUP_REQ_GOLD_TROLLEYS_IN_VANS(TRUE)
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_truck")
|
|
SET_VEHICLE_ENGINE_ON(sGoldVans[0].veh, TRUE, TRUE)
|
|
SET_VEHICLE_DOORS_SHUT(sGoldVans[0].veh)
|
|
SET_ENTITY_VELOCITY(sGoldVans[0].veh, <<0.0, 0.0, 0.0>>)
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_truck")
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_BANK_LEAVE, strCarrec)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehLeaveBank)
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, CARREC_BANK_LEAVE, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, 0.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[1].veh)
|
|
SET_PLAYBACK_SPEED(sGoldVans[1].veh, 0.0)
|
|
ELSE
|
|
SET_ENTITY_HEADING(sGoldVans[1].veh, -174.161)
|
|
SET_ENTITY_COORDS(sGoldVans[1].veh, <<-2.283, -667.746, 31.3231>>)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_DOORS_SHUT(sGoldVans[1].veh)
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_weapon")
|
|
GIVE_WEAPON_OBJECT_TO_PED(objMichaelsWeapon, PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("HC_Gunman_Rifle")
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
GIVE_WEAPON_OBJECT_TO_PED(objGunmansWeapon, sCrew[CREW_GUNMAN].ped)
|
|
REMOVE_OBJECT(objGunmansWeapon, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("HC_Driver_Rifle")
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
GIVE_WEAPON_OBJECT_TO_PED(objDriversWeapon, sCrew[CREW_DRIVER].ped)
|
|
REMOVE_OBJECT(objDriversWeapon, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME(TRUE)
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
iCurrentEvent = 0
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
IF DOES_CAM_EXIST(camMain)
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, TRUE, 1000)
|
|
ENDIF
|
|
|
|
REMOVE_ANIM_DICT(strAnimIG5)
|
|
|
|
REMOVE_OBJECT(objGunmansWeapon, TRUE)
|
|
REMOVE_OBJECT(objDriversWeapon, TRUE)
|
|
|
|
SET_TROLLEY_SOUNDS_ACTIVE(FALSE)
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_GOLD_CAGE_ROLL")
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
eMissionStage = STAGE_LEAVE_BANK
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
STOP_CUTSCENE()
|
|
REMOVE_CUTSCENE()
|
|
|
|
CANCEL_ALL_PREPARED_MUSIC_EVENTS()
|
|
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointVehLeaveBank)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_BANK_LEAVE, strCarrec)
|
|
|
|
WHILE NOT GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehLeaveBank)
|
|
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_BANK_LEAVE, strCarrec)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
bSkippedMocap = TRUE
|
|
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC LEAVE_BANK()
|
|
SEQUENCE_INDEX seq
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF iCurrentEvent != 99
|
|
IF SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
AND SETUP_REQ_BANK_INTERIOR_LOADED()
|
|
IF bHasUsedCheckpoint
|
|
START_REPLAY_SETUP(<<-6.9994, -662.0037, 32.4819>>, 283.9521, FALSE, TRUE)
|
|
|
|
iCurrentEvent = 99
|
|
ELSE
|
|
//Fix for B*528757: Guarantee that the tunnel is loaded first before trying to set up everything else.
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-6.9994, -662.0037, 32.4819>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 283.9521)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<-6.9994, -662.0037, 32.4819>>, 30.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
iCurrentEvent = 99
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
ELSE
|
|
IF SETUP_REQ_BANK_WORKER(<<-9.0005, -661.1465, 32.4815>>, 259.9744)
|
|
AND SETUP_REQ_GOLD_VANS_AT_BANK()
|
|
AND SETUP_REQ_MAIN_DRIVER(<<-5.314122,-662.947083,15.1306>>, 269.1434)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<-6.314122,-662.947083,15.1306>>, 269.1434)
|
|
AND SETUP_REQ_TREVOR(<<-0.848102,-665.244019, 15.1306>>, -153.477966)
|
|
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-1.900313,-666.880005,15.1306>>, -127.999458)
|
|
AND SETUP_REQ_SECURITY_BARRIERS()
|
|
AND SETUP_REQ_BANK_SECURITY()
|
|
AND SETUP_REQ_GOLD_TROLLEYS_IN_VANS(TRUE)
|
|
AND SETUP_REQ_CREW_IN_GOLD_VANS(FALSE)
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
|
|
REMOVE_MICHAEL_SHOTGUN_SILENCER()
|
|
|
|
WHILE NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
OR (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<-3.456, -662.13, 32.4821>>)
|
|
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 13.65)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<0.4, -662.530, 32.4815>>, PEDMOVE_WALK, DEFAULT, 0.5, ENAV_NO_STOPPING)
|
|
TASK_ENTER_VEHICLE(NULL, sGoldVans[1].veh, DEFAULT, VS_DRIVER, PEDMOVE_WALK)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped, <<0.8804, -662.3219, 32.4815>>)
|
|
SET_ENTITY_HEADING(sCrew[CREW_DRIVER].ped, -175.62)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<0.7, -667.0, 32.4815>>, PEDMOVE_WALK, DEFAULT, 0.5, ENAV_NO_STOPPING)
|
|
TASK_ENTER_VEHICLE(NULL, sGoldVans[1].veh, DEFAULT, VS_FRONT_RIGHT, PEDMOVE_WALK)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sCrew[CREW_DRIVER].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
SET_ENTITY_COORDS(sGoldVanPeds[CASEY_ID].ped, <<-1.2656, -660.8115, 32.4817>>)
|
|
SET_ENTITY_HEADING(sGoldVanPeds[CASEY_ID].ped, -87.68)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<0.1678, -661.1131, 32.4818>>, PEDMOVE_WALK, DEFAULT, 0.5, ENAV_NO_STOPPING)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<0.5, -666.4, 31.6818>>, PEDMOVE_WALK, DEFAULT, 0.5, ENAV_NO_STOPPING)
|
|
TASK_ENTER_VEHICLE(NULL, sGoldVans[0].veh, DEFAULT, VS_FRONT_RIGHT, PEDMOVE_WALK)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(sGoldVanPeds[CASEY_ID].ped, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-6.9994, -662.0037, 32.4819>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 283.9521)
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointVehLeaveBank)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_BANK_LEAVE, strCarrec)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehLeaveBank)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_BANK_LEAVE, strCarrec)
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_PED_CAN_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
|
|
IF IS_PED_IN_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REMOVE_PED_FROM_GROUP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
SET_PED_CAN_RAGDOLL(sGoldVanPeds[CASEY_ID].ped, FALSE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sGoldVanPeds[CASEY_ID].ped, RELGROUPHASH_PLAYER)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
TASK_LOOK_AT_ENTITY(sBankWorker.ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
|
|
ENDIF
|
|
|
|
DELETE_OBJECT(objSecurityGateCollision[1])
|
|
DELETE_OBJECT(objSecurityBarriers[1])
|
|
|
|
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_UNLOCKED)
|
|
SET_VEHICLE_ENGINE_ON(sGoldVans[0].veh, TRUE, TRUE)
|
|
SET_VEHICLE_RADIO_ENABLED(sGoldVans[0].veh, TRUE)
|
|
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, FALSE)
|
|
|
|
//Turn off the road outside the bank so Trevor's van doesn't crash into vehicles.
|
|
SET_ROADS_IN_ANGLED_AREA(<<96.116104,-572.902649,25.195431>>, <<26.738914,-761.622437,39.121941>>, 16.750000, FALSE, FALSE)
|
|
CLEAR_AREA(<<72.2324, -631.7999, 30.5926>>, 30.0, TRUE)
|
|
|
|
sTrevor.iEvent = 0
|
|
sMichael.iEvent = 0
|
|
sBankWorker.iEvent = 0
|
|
sGoldVanPeds[CASEY_ID].iEvent = 0
|
|
sCrew[CREW_DRIVER].iEvent = 0
|
|
sCrew[CREW_GUNMAN].iEvent = 0
|
|
|
|
REMOVE_OBJECT(objMichaelsWeapon)
|
|
|
|
//NG 1724354 - on nextgen there's a high chance of peds spawning where the vans leave the bank.
|
|
BLOCK_PAVEMENTS_AT_BANK_EXIT(TRUE)
|
|
CLEAR_AREA_OF_PEDS(<<67.8, -632.0, 31.4>>, 3.0)
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_LEAVE_BANK")
|
|
START_AUDIO_SCENE("BS_2A_LEAVE_BANK")
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
WAIT(500) //This is to allow the AI tasks to start before fading in.
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2A_LEAVE_BANK_RESTART")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME(TRUE)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
IF interiorBank != NULL
|
|
UNPIN_INTERIOR(interiorBank)
|
|
interiorBank = NULL
|
|
ENDIF
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_LEAVE_BANK, "LEAVE_BANK")
|
|
|
|
STAT_GET_INT(SP0_NUMBER_CRASHES_CARS, iPrevNumVanCrashes)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iBankDoorState = 0
|
|
iPrevNumVanCrashes = 0
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
|
|
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_ForcePlayerToEnterVehicleThroughDirectDoorOnly, TRUE)
|
|
REQUEST_VEHICLE_ASSET(modelGoldVan, ENUM_TO_INT(VRF_REQUEST_ENTRY_ANIMS | VRF_REQUEST_ALTERNATE_ENTRY_ANIMS))
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DONT_DO_J_SKIP(sLocatesData)
|
|
#ENDIF
|
|
|
|
IF sMichael.iEvent = 0
|
|
IF NOT bHasTextLabelTriggered[FH3A_MCS7LO1]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS7LO1", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_MCS7LO1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IS_PLAYER_AT_LOCATION_IN_VEHICLE(sLocatesData, vBankExit, <<0.001, 0.001, LOCATE_SIZE_HEIGHT>>, FALSE, sGoldVans[0].veh,
|
|
"F3A_FOLLOWTREV", "F3A_GETINVAN", "F3A_GETBACKVAN", FALSE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh, TRUE)
|
|
sMichael.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IS_PLAYER_AT_LOCATION_WITH_BUDDY_IN_VEHICLE(sLocatesData, vBankExit, <<0.001, 0.001, LOCATE_SIZE_HEIGHT>>, FALSE, sGoldVanPeds[CASEY_ID].ped, sGoldVans[0].veh,
|
|
"F3A_FOLLOWTREV", "F3A_LEFTCASE", "F3A_GETINVAN", "F3A_GETBACKVAN", FALSE)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
SET_BLIP_ALPHA(sLocatesData.LocationBlip, 0)
|
|
SET_BLIP_ROUTE(sLocatesData.LocationBlip, FALSE)
|
|
ELSE
|
|
IF DOES_BLIP_EXIST(sGoldVans[1].blip)
|
|
REMOVE_BLIP(sGoldVans[1].blip)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0 //Wait for Michael and Casey to get in the car
|
|
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), 0.98)
|
|
DISABLE_COMBAT_CONTROLS_THIS_FRAME(TRUE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
SET_PED_CAN_RAGDOLL(sGoldVanPeds[CASEY_ID].ped, TRUE)
|
|
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_LOCKED_PLAYER_INSIDE)
|
|
|
|
SETTIMERA(0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
|
|
//Fail if the player tries to leave the bank at this point without the gold.
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sGoldVans[0].veh)) > 3600.0
|
|
MISSION_FAILED(FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Franklin contacts Michael on the headset.
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF NOT DOES_BLIP_EXIST(sGoldVans[1].blip)
|
|
sGoldVans[1].blip = CREATE_BLIP_FOR_VEHICLE(sGoldVans[1].veh)
|
|
ENDIF
|
|
|
|
//Play a "let's go" conversation.
|
|
IF NOT bHasTextLabelTriggered[FH3A_GOING2]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_GOING2", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_GOING2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF SETUP_REQ_FRANKLIN(<<150.2, -752.6, 263.1>>)
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
FREEZE_ENTITY_POSITION(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
SET_ENTITY_COLLISION(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
|
|
AND TIMERA() > 15000
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Play conversation, then tell the player to switch.
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF NOT DOES_BLIP_EXIST(sGoldVans[1].blip)
|
|
sGoldVans[1].blip = CREATE_BLIP_FOR_VEHICLE(sGoldVans[1].veh)
|
|
ENDIF
|
|
|
|
REQUEST_CUSTOM_SWITCH_ASSETS()
|
|
|
|
SETUP_REQ_FRANKLIN(<<128.9, -1181.3, 30.0>>, 0.0, TRUE)
|
|
SETUP_REQ_LESTER(<<126.2, -1186.9, 29.0>>, 0.0, TRUE)
|
|
SETUP_REQ_HACKER(<<124.2, -1186.9, 29.0>>, 0.0, TRUE)
|
|
SETUP_REQ_TRAFFIC_LAPTOPS(<<127.4, -1184.4, 29.6>>, <<126.7, -1184.2, 29.6>>, 0.0, 0.0, TRUE)
|
|
SETUP_REQ_CHASE_CARS_START(TRUE)
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
|
|
IF NOT bHasTextLabelTriggered[FH3A_RADIO]
|
|
//NOTE: there are issues with playing conversations with peds that are frozen (like Franklin), so add a NULL ped for him.
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, NULL, "FRANKLIN")
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RADIO", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
bHasTextLabelTriggered[FH3A_RADIO] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_FSEES]
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, NULL, "LESTER")
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, NULL, "FRANKLIN")
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_FSEES", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_FSEES] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_RESPOND]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RESPOND", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_RESPOND] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_AWAY]
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, NULL, "FRANKLIN")
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_AWAY", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_AWAY] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
SET_SELECTOR_PED_PRIORITY(sSelectorPeds, SELECTOR_PED_FRANKLIN, SELECTOR_PED_MICHAEL, SELECTOR_PED_TREVOR)
|
|
SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_TREVOR, TRUE)
|
|
|
|
PRINT_NOW("F3A_SWITCHFRAN", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[F3A_SWITCHFRAN] = TRUE
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3 //Wait for the switch to occur.
|
|
IF NOT DOES_BLIP_EXIST(sGoldVans[1].blip)
|
|
sGoldVans[1].blip = CREATE_BLIP_FOR_VEHICLE(sGoldVans[1].veh)
|
|
ENDIF
|
|
|
|
REQUEST_CUSTOM_SWITCH_ASSETS()
|
|
|
|
SETUP_REQ_FRANKLIN(<<128.9, -1181.3, 30.0>>, 0.0, TRUE)
|
|
SETUP_REQ_LESTER(<<126.2, -1186.9, 29.0>>, 0.0, TRUE)
|
|
SETUP_REQ_HACKER(<<124.2, -1186.9, 29.0>>, 0.0, TRUE)
|
|
SETUP_REQ_TRAFFIC_LAPTOPS(<<127.4, -1184.4, 29.6>>, <<126.7, -1184.2, 29.6>>, 0.0, 0.0, TRUE)
|
|
SETUP_REQ_CHASE_CARS_START(TRUE)
|
|
|
|
IF CAN_PLAYER_START_CUTSCENE()
|
|
IF UPDATE_SELECTOR_HUD(sSelectorPeds, FALSE)
|
|
OR TIMERB() > 25000
|
|
OR VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vChaseTriggerStart) < 10000.0
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FH2A_SWITCHES)
|
|
|
|
//IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_GOGO", CONV_PRIORITY_MEDIUM)
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//remove the car park interior.
|
|
IF interiorBankCarPark != NULL
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<-4.7, -669.0262, 33.9594>>) > 10000.0
|
|
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<56.906719,-704.206482,47.467571>>,<<32.000000,16.250000,17.500000>>)
|
|
REMOVE_OBJECT(objWalkieTalkie, TRUE)
|
|
REMOVE_OBJECT(objBankWorkerWalkieTalkie, TRUE)
|
|
REMOVE_PED(sBankWorker.ped, TRUE)
|
|
REMOVE_ANIM_DICT("map_objects")
|
|
REMOVE_ANIM_DICT(strManagerLeadOut)
|
|
REMOVE_VEHICLE_ASSET(modelGoldVan)
|
|
|
|
REMOVE_OBJECT(objSecurityBarriers[0], TRUE)
|
|
REMOVE_OBJECT(objSecurityBarriers[1], TRUE)
|
|
REMOVE_OBJECT(objSecurityGateCollision[0], TRUE)
|
|
REMOVE_OBJECT(objSecurityGateCollision[1], TRUE)
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_BANK_CAR_PARK_SHUTTERS, BUILDINGSTATE_NORMAL)
|
|
|
|
REMOVE_PED(pedGateSecurity, TRUE)
|
|
|
|
UNPIN_INTERIOR(interiorBankCarPark)
|
|
interiorBankCarPark = NULL
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Pre-stream the cutscene location.
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
IF bHasTextLabelTriggered[FH3A_AWAY]
|
|
//Lower the budgets to help with streaming.
|
|
SET_VEHICLE_POPULATION_BUDGET(1)
|
|
SET_PED_POPULATION_BUDGET(1)
|
|
|
|
NEW_LOAD_SCENE_START_SPHERE(<<134.9, -1181.2, 28.6>>, 12.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Pre-stream the music event that triggers on the switch.
|
|
PREPARE_MUSIC_EVENT("FH2A_TRAFFIC_START")
|
|
|
|
IF bHasTextLabelTriggered[F3A_SWITCHFRAN]
|
|
//Preload the next conversation.
|
|
IF NOT bHasTextLabelTriggered[FH3A_SWITCH_PRELOAD]
|
|
IF PRELOAD_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SWITCH", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_SWITCH_PRELOAD] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//This used to trigger extra dialogue if the player didn't switch, but we need to preload the next conversation.
|
|
/*IF NOT bHasTextLabelTriggered[FH3A_NOGO]
|
|
IF TIMERB() > 12500
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, NULL, "FRANKLIN")
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_NOGO", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_NOGO] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
ENDIF
|
|
|
|
//Fail for getting a wanted level.
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
MISSION_FAILED(FAILED_ALERTED_COPS)
|
|
ENDIF
|
|
|
|
//Control the bank door.
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF iBankDoorState = 0
|
|
IF VDIST2(GET_ENTITY_COORDS(sGoldVans[1].veh), <<60.2288, -632.9772, 31.8562>>) < 900.0
|
|
OR VDIST2(GET_ENTITY_COORDS(sGoldVans[0].veh), <<60.2288, -632.9772, 31.8562>>) < 400.0
|
|
DOOR_SYSTEM_SET_HOLD_OPEN(iBankExitBarrierHash, TRUE)
|
|
iBankDoorState = 1
|
|
ENDIF
|
|
ELSE
|
|
IF VDIST2(GET_ENTITY_COORDS(sGoldVans[1].veh), <<60.2288, -632.9772, 31.8562>>) > 900.0
|
|
AND VDIST2(GET_ENTITY_COORDS(sGoldVans[0].veh), <<60.2288, -632.9772, 31.8562>>) > 400.0
|
|
DOOR_SYSTEM_SET_HOLD_OPEN(iBankExitBarrierHash, FALSE)
|
|
iBankDoorState = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Trevor plays back a recording to begin with, then switches to waypoint.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
AND NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
SWITCH sTrevor.iEvent
|
|
CASE 0 //Start playback once everyone is in the van.
|
|
IF IS_PED_SITTING_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh)
|
|
AND IS_PED_SITTING_IN_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldVans[1].veh)
|
|
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh)
|
|
AND IS_PED_IN_VEHICLE(sGoldVanPeds[CASEY_ID].ped, sGoldVans[0].veh)
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
AND NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, CARREC_BANK_LEAVE, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, 0.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[1].veh)
|
|
ENDIF
|
|
|
|
SET_PLAYBACK_SPEED(sGoldVans[1].veh, 1.0)
|
|
sTrevor.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Open the barrier once Trevor is close.
|
|
IF VDIST2(GET_ENTITY_COORDS(sGoldVans[1].veh), <<60.2288, -632.9772, 31.8562>>) < 400.0
|
|
sTrevor.iEvent++
|
|
sTrevor.iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Switch to waypoint after getting out of the car park.
|
|
IF GET_GAME_TIMER() - sTrevor.iTimer > 5500
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
|
|
ENDIF
|
|
|
|
IF NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh, strWaypointVehLeaveBank, DRIVINGMODE_STOPFORCARS, -1,
|
|
EWAYPOINT_START_FROM_CLOSEST_POINT, -1, 30.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
ELSE
|
|
sTrevor.iTimer = GET_GAME_TIMER()
|
|
sTrevor.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3 //Switch to AI if the waypoint recording finishes.
|
|
BOOL bSwitchToAI
|
|
|
|
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
INT iClosestNode, iMaxNodes
|
|
|
|
WAYPOINT_RECORDING_GET_NUM_POINTS(strWaypointVehLeaveBank, iMaxNodes)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointVehLeaveBank, GET_ENTITY_COORDS(sGoldVans[1].veh), iClosestNode)
|
|
|
|
IF iMaxNodes - iClosestNode < 5
|
|
bSwitchToAI = TRUE
|
|
ENDIF
|
|
ELIF GET_SCRIPT_TASK_STATUS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], SCRIPT_TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE) != PERFORMING_TASK
|
|
AND GET_GAME_TIMER() - sTrevor.iTimer > 500
|
|
bSwitchToAI = TRUE
|
|
ENDIF
|
|
|
|
IF bSwitchToAI
|
|
//TASK_VEHICLE_DRIVE_TO_COORD(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh, <<-286.3095, -1286.0005, 29.9973>>, 25.0,
|
|
// DRIVINGSTYLE_NORMAL, GET_ENTITY_MODEL(sGoldVans[1].veh), DRIVINGMODE_STOPFORCARS, 5.0, 10.0)
|
|
|
|
//NG bug 1696456
|
|
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh, <<-274.6815, -1117.2107, 22.1099>>, 15.0,
|
|
DRIVINGMODE_STOPFORCARS, 5.0)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
//Bank manager: walks back into the bank once everyone is in the cars.
|
|
IF NOT IS_PED_INJURED(sBankWorker.ped)
|
|
IF IS_PED_RAGDOLL(sBankWorker.ped) OR HAS_PED_RECEIVED_EVENT(sBankWorker.ped, EVENT_PED_COLLISION_WITH_PLAYER)
|
|
MISSION_FAILED(FAILED_SPOOKED_BANK_WORKERS)
|
|
ENDIF
|
|
|
|
SWITCH sBankWorker.iEvent
|
|
CASE 0 //Wait for player to go downstairs, then walk to scene position.
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-5.151732,-663.403198,31.088076>>, <<-4.253166,-672.639709,34.338078>>, 14.500000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<0.158653,-658.836792,32.230839>>, <<0.488017,-662.644226,35.482761>>, 3.000000)
|
|
sBankWorker.vDest = <<-5.300, -662.000, 33.480>>
|
|
|
|
iBankWorkerSyncScene = -1
|
|
sBankWorker.iEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Once in position and the player is near their van then play the synced scene.
|
|
REQUEST_ANIM_DICT(strManagerLeadOut)
|
|
|
|
FLOAT fDistFromScene
|
|
fDistFromScene = VDIST(GET_ENTITY_COORDS(sBankWorker.ped), sBankWorker.vDest)
|
|
|
|
IF fDistFromScene > 1.5
|
|
IF GET_SCRIPT_TASK_STATUS(sBankWorker.ped, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) != PERFORMING_TASK
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(sBankWorker.ped, sBankWorker.vDest, PEDMOVE_WALK, -1, 0.2, ENAV_STOP_EXACTLY, -106.920)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF HAS_ANIM_DICT_LOADED(strManagerLeadOut)
|
|
AND SETUP_REQ_BANK_WORKER_WALKIE_TALKIE(TRUE)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-3.919883,-669.252258,31.088078>>, <<-9.787007,-669.863098,34.447842>>, 4.000000)
|
|
OR IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh, TRUE)
|
|
IF fDistFromScene < 1.5
|
|
SETUP_REQ_BANK_WORKER_WALKIE_TALKIE()
|
|
|
|
iBankWorkerSyncScene = CREATE_SYNCHRONIZED_SCENE(<<-5.300, -662.000, 33.480>>, <<0.000, -0.000, -106.920>>)
|
|
TASK_SYNCHRONIZED_SCENE(sBankWorker.ped, iBankWorkerSyncScene, strManagerLeadOut, "leadout_wave_walkoff", WALK_BLEND_IN, SLOW_BLEND_OUT,
|
|
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT)
|
|
TASK_CLEAR_LOOK_AT(sBankWorker.ped)
|
|
|
|
sBankWorker.iEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Go into walking task.
|
|
IF NOT bHasTextLabelTriggered[FH3A_MCS7LO2_1]
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iBankWorkerSyncScene)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iBankWorkerSyncScene) > 0.125
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iBankWorkerSyncScene) < 0.15
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF sConversationPeds.PedInfo[8].Index != sBankWorker.ped
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, sBankWorker.ped, "BankLiaison")
|
|
ENDIF
|
|
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS7LO2", "FH3A_MCS7LO2_1", CONV_PRIORITY_MEDIUM)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(1.0, 3.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
bHasTextLabelTriggered[FH3A_MCS7LO2_1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//We missed the chance to play this line.
|
|
bHasTextLabelTriggered[FH3A_MCS7LO2_1] = TRUE
|
|
bHasTextLabelTriggered[FH3A_MCS7LO2_1_SKIPPED] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_MCS7LO2_2]
|
|
IF NOT bHasTextLabelTriggered[FH3A_MCS7LO2_1_SKIPPED]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF sConversationPeds.PedInfo[8].Index != sBankWorker.ped
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, sBankWorker.ped, "BankLiaison")
|
|
ENDIF
|
|
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS7LO2", "FH3A_MCS7LO2_2", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_MCS7LO2_2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bHasTextLabelTriggered[FH3A_MCS7LO2_2] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_MCS7LO2_3]
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iBankWorkerSyncScene) > 0.68
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iBankWorkerSyncScene) < 0.7
|
|
IF sConversationPeds.PedInfo[8].Index != sBankWorker.ped
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, sBankWorker.ped, "BankLiaison")
|
|
ENDIF
|
|
|
|
//This line needs to be forced through, play it without subtitles if necessary.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS7LO2", "FH3A_MCS7LO2_3", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_MCS7LO2_3] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MCS7LO2", "FH3A_MCS7LO2_3", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
bHasTextLabelTriggered[FH3A_MCS7LO2_3] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//We missed the chance to play this line.
|
|
bHasTextLabelTriggered[FH3A_MCS7LO2_3] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF (IS_SYNCHRONIZED_SCENE_RUNNING(iBankWorkerSyncScene) AND GET_SYNCHRONIZED_SCENE_PHASE(iBankWorkerSyncScene) > 0.99)
|
|
OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(iBankWorkerSyncScene)
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iBankWorkerSyncScene)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sBankWorker.ped, SLOW_BLEND_OUT, TRUE)
|
|
ENDIF
|
|
|
|
iBankWorkerSyncScene = -1
|
|
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(sBankWorker.ped, <<9.8060, -666.9023, 32.4493>>, PEDMOVE_WALK)
|
|
REMOVE_ANIM_DICT(strManagerLeadOut)
|
|
|
|
sBankWorker.iEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3 //Delete once out of view.
|
|
IF VDIST2(GET_ENTITY_COORDS(sBankWorker.ped), <<9.8060, -666.9023, 32.4493>>) < 4.0
|
|
REMOVE_OBJECT(objWalkieTalkie, TRUE)
|
|
REMOVE_PED(sBankWorker.ped, TRUE)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
//Fail for the player's van getting stuck.
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF IS_VEHICLE_PERMANENTLY_STUCK(sGoldVans[0].veh)
|
|
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
MISSION_FAILED(FAILED_VAN_STUCK)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail for crashing the van in the area.
|
|
INT iNumCrashes
|
|
STAT_GET_INT(SP0_NUMBER_CRASHES_CARS, iNumCrashes)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF GET_ENTITY_SPEED(sGoldVans[0].veh) > 5.0
|
|
iTimeSinceVanLastMovedQuickly = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail for going in certain area of the bank.
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-127.548843,-662.109497,39.146435>>, <<-38.674873,-693.079834,30.838036>>, 18.250000)
|
|
//Fail if the player is near the bank entrance and crashes the van.
|
|
IF iNumCrashes > iPrevNumVanCrashes
|
|
//The stat is a bit too sensitive for this situation, so check how fast the van was going recently.
|
|
IF GET_GAME_TIMER() - iTimeSinceVanLastMovedQuickly < 1000
|
|
MISSION_FAILED(FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(),<<3.737513,-655.875000,31.700588>>, <<-4.347250,-656.102539,34.950783>>, 5.250000)
|
|
MISSION_FAILED(FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS)
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_ACTING_SUSPICIOUS_IN_BANK()
|
|
MISSION_FAILED(FAILED_ALERTED_BANK_BY_BEING_CONSPICUOUS)
|
|
ENDIF
|
|
|
|
iPrevNumVanCrashes = iNumCrashes
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 12.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
//Delete anything from the bank
|
|
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 8)
|
|
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 6)
|
|
|
|
BLOCK_PAVEMENTS_AT_BANK_EXIT(FALSE)
|
|
REMOVE_OBJECT(objWalkieTalkie, TRUE)
|
|
REMOVE_OBJECT(objBankWorkerWalkieTalkie, TRUE)
|
|
REMOVE_OBJECT(objSecurityBarriers[0])
|
|
REMOVE_OBJECT(objSecurityBarriers[1])
|
|
REMOVE_OBJECT(objSecurityGateCollision[0])
|
|
REMOVE_OBJECT(objSecurityGateCollision[1])
|
|
REMOVE_PED(sBankWorker.ped, TRUE)
|
|
REMOVE_PED(pedGateSecurity)
|
|
REMOVE_ANIM_DICT("map_objects")
|
|
REMOVE_ANIM_DICT(strManagerLeadOut)
|
|
//REQUEST_IPL("DT1_03_Shutter") //Put the original map gates back
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_BANK_CAR_PARK_SHUTTERS, BUILDINGSTATE_NORMAL)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointVehLeaveBank)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_BANK_LEAVE, strCarrec)
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
FREEZE_ENTITY_POSITION(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
SET_ENTITY_COLLISION(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
ENDIF
|
|
|
|
IF interiorBankCarPark != NULL
|
|
UNPIN_INTERIOR(interiorBankCarPark)
|
|
interiorBankCarPark = NULL
|
|
ENDIF
|
|
|
|
IF interiorBank != NULL
|
|
UNPIN_INTERIOR(interiorBank)
|
|
interiorBank = NULL
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_LEAVE_BANK")
|
|
STOP_AUDIO_SCENE("BS_2A_LEAVE_BANK")
|
|
ENDIF
|
|
|
|
CLEAR_SELECTOR_PED_PRIORITY(sSelectorPeds)
|
|
SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
|
|
|
|
eMissionStage = STAGE_SWAP_TO_FRANKLIN_CUTSCENE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldVans[0].veh)
|
|
SET_ENTITY_COORDS(sGoldVans[0].veh, <<64.243668,-626.103149,31.742626>>)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SWAP_TO_FRANKLIN_CUTSCENE_NEW()
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_AIM)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_RADIO_WHEEL)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CELLPHONE_UP)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK1)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
|
|
|
|
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() //Fix for bug 2176432
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF SETUP_REQ_PLAYER_IS_MICHAEL()
|
|
AND SETUP_REQ_GOLD_VANS_AT_BANK()
|
|
AND SETUP_REQ_MAIN_DRIVER(<<-5.314122,-662.947083,15.1306>>, 269.1434)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<-6.314122,-662.947083,15.1306>>, 269.1434)
|
|
AND SETUP_REQ_TREVOR(<<-0.848102,-665.244019, 15.1306>>, -153.477966)
|
|
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-1.900313,-666.880005,15.1306>>, -127.999458)
|
|
AND SETUP_REQ_GOLD_VANS_POST_HIJACK(<<-110.3915, -667.8174, 34.4690>>, 159.0429, <<-115.0201, -680.6793, 34.1122>>, 159.4947)
|
|
AND SETUP_REQ_GOLD_TROLLEYS_IN_VANS()
|
|
AND SETUP_REQ_CREW_IN_GOLD_VANS()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
|
|
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_CUSTOM_SWITCH_ASSETS()
|
|
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
//NEW_LOAD_SCENE_START(<<125.4, -1184.8, 30.1>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-11.3, 0.0, -60.8>>), 20.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
|
|
NEW_LOAD_SCENE_START_SPHERE(<<134.9, -1181.2, 28.6>>, 12.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
|
|
ENDIF
|
|
|
|
IF SETUP_REQ_FRANKLIN(<<128.9, -1181.3, 30.0>>, 0.0, TRUE)
|
|
AND SETUP_REQ_LESTER(<<126.2, -1186.9, 29.0>>, 0.0, TRUE)
|
|
AND SETUP_REQ_HACKER(<<124.2, -1186.9, 29.0>>, 0.0, TRUE)
|
|
AND SETUP_REQ_TRAFFIC_LAPTOPS(<<127.4, -1184.4, 29.6>>, <<126.7, -1184.2, 29.6>>, 0.0, 0.0, TRUE)
|
|
AND SETUP_REQ_CHASE_CARS_START(TRUE)
|
|
AND HAVE_CUSTOM_SWITCH_ASSETS_LOADED()
|
|
AND IS_NEW_LOAD_SCENE_ACTIVE()
|
|
HIDE_JUNK_FOR_SWITCH_CUTSCENE(TRUE)
|
|
SETUP_REQ_CHASE_CARS_START()
|
|
SETUP_REQ_FRANKLIN(<<128.9, -1181.3, 30.0>>)
|
|
SETUP_REQ_LESTER(<<126.2, -1186.9, 29.0>>, 0.0)
|
|
SETUP_REQ_HACKER(<<124.2, -1186.9, 29.0>>, 0.0)
|
|
SETUP_REQ_TRAFFIC_LAPTOPS(<<127.4, -1184.4, 29.6>>, <<126.7, -1184.2, 29.6>>, 0.0, 0.0)
|
|
SETUP_FRANKLIN_OUTFIT()
|
|
INITIALISE_TRAFFIC_GAME()
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], <<138.4, -1212.8, 29.0>>)
|
|
FREEZE_ENTITY_POSITION(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(sGoldVans[0].veh)
|
|
SET_VEHICLE_RADIO_ENABLED(sGoldVans[0].veh, FALSE)
|
|
ENDIF
|
|
|
|
bTriggeredTrafficIntro = FALSE
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
WHILE GET_NUMBER_OF_STREAMING_REQUESTS() > 0
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
ENDIF
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
SWITCH iCurrentEvent
|
|
CASE 0 //Start the switch
|
|
INFORM_MISSION_STATS_OF_INCREMENT(FH2A_SWITCHES)
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], <<134.9, -1181.2, 28.6>>)
|
|
FREEZE_ENTITY_POSITION(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
SET_VEHICLE_DOORS_SHUT(sGoldCars[PLAYERS_GOLD_CAR].veh, TRUE)
|
|
ENDIF
|
|
|
|
CLEAR_PRINTS()
|
|
|
|
SETTIMERB(0)
|
|
|
|
eSwitchCamState = SWITCH_CAM_START_SPLINE1
|
|
iCurrentEvent++
|
|
FALLTHRU
|
|
|
|
CASE 1 //Run the switch and request all lead-in assets
|
|
REQUEST_STREAMED_TEXTURE_DICT(strTrafficTextures)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointVehTrafficMain)
|
|
|
|
IF NOT bRequestedTrafficScaleform
|
|
sfTrafficHud = REQUEST_SCALEFORM_MOVIE("traffic_cam")
|
|
bRequestedTrafficScaleform = TRUE
|
|
ENDIF
|
|
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
|
|
IF HANDLE_SWITCH_CAM(scsSwitchCam)
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
CLEAR_PED_TASKS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
CLEAR_PED_TASKS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
ENDIF
|
|
|
|
//Reposition the vans to where they start in the traffic control game.
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
|
|
OR IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(sGoldVans[0].veh, <<-110.3915, -667.8174, 34.4690>>)
|
|
SET_ENTITY_HEADING(sGoldVans[0].veh, 159.0429)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sGoldVans[0].veh, TRUE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sGoldVans[0].veh, TRUE)
|
|
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
OR IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(sGoldVans[1].veh, <<-115.0201, -680.6793, 34.1122>>)
|
|
SET_ENTITY_HEADING(sGoldVans[1].veh, 159.4947)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sGoldVans[1].veh, TRUE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sGoldVans[1].veh, TRUE)
|
|
FREEZE_ENTITY_POSITION(sGoldVans[1].veh, TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2A_TRAFFIC_START")
|
|
|
|
IF HAS_STREAMED_TEXTURE_DICT_LOADED(strTrafficTextures)
|
|
AND HAS_SCALEFORM_MOVIE_LOADED(sfTrafficHud)
|
|
UPDATE_TRAFFIC_GAME() //Draws the loading overlay.
|
|
ENDIF
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK(strAudioBankBigScoreLaptop)
|
|
REMOVE_ANIM_DICT(strAnimsCamShake)
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
SET_TIME_SCALE(1.0)
|
|
CLEAR_FOCUS()
|
|
STOP_SOUND(iWooshSoundID)
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
eMissionStage = STAGE_TRAFFIC_CONTROL
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_TRAFFIC_CONTROL)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
|
|
PROC DO_TRAFFIC_CONTROL()
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() //Fix for bug 2176432
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
//NOTE: this is a checkpoint stage, but we shouldn't need to load the map as the splash screen hides everything.
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<44.0696, -870.6827, 29.4558>>) //This is a central point in the traffic grid, which should help with collision/streaming.
|
|
|
|
IF SETUP_REQ_PLAYER_IS_FRANKLIN()
|
|
IF SETUP_REQ_MICHAEL(<<140.4548, -1202.2416, 28.2951>>)
|
|
AND SETUP_REQ_TREVOR(<<141.4548, -1202.2416, 28.2951>>)
|
|
AND SETUP_REQ_MAIN_DRIVER(<<124.5559, -1190.2872, 28.2951>>, 173.7492)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<125.5559, -1190.2872, 28.2951>>, 173.7492)
|
|
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-1.900313,-666.880005,15.1306>>, -127.999458)
|
|
AND SETUP_REQ_CHASE_CARS_START()
|
|
AND SETUP_REQ_GOLD_VANS_POST_HIJACK(<<-110.3915, -667.8174, 34.4690>>, 159.0429, <<-115.0201, -680.6793, 34.1122>>, 159.4947)
|
|
AND SETUP_REQ_GOLD_TROLLEYS_IN_VANS()
|
|
AND SETUP_REQ_CREW_IN_GOLD_VANS()
|
|
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
|
|
SETUP_FRANKLIN_OUTFIT()
|
|
|
|
bTriggeredTrafficIntro = FALSE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT(strTrafficTextures)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointVehTrafficMain)
|
|
|
|
IF NOT bRequestedTrafficScaleform
|
|
sfTrafficHud = REQUEST_SCALEFORM_MOVIE("traffic_cam")
|
|
bRequestedTrafficScaleform = TRUE
|
|
ENDIF
|
|
|
|
IF HAS_STREAMED_TEXTURE_DICT_LOADED(strTrafficTextures)
|
|
AND HAS_SCALEFORM_MOVIE_LOADED(sfTrafficHud)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehTrafficMain)
|
|
INITIALISE_TRAFFIC_GAME()
|
|
CLEAR_TRIGGERED_LABELS()
|
|
|
|
//Remove all assets from the lead-in.
|
|
REMOVE_OBJECT(objWalkieTalkie, TRUE)
|
|
REMOVE_OBJECT(objLaptops[0], TRUE)
|
|
REMOVE_OBJECT(objLaptops[1], TRUE)
|
|
REMOVE_OBJECT(objwalkingStick, TRUE)
|
|
REMOVE_PED(pedLester, TRUE)
|
|
REMOVE_PED(sCrew[CREW_HACKER].ped, TRUE)
|
|
REMOVE_ANIM_DICT(strAnimsTrafficSwitch)
|
|
|
|
SET_TIME_SCALE(1.0) // In case the switch cutscene was skipped.
|
|
|
|
CLEAR_AREA(<<-110.3915, -667.8174, 34.4690>>, 100.0, TRUE)
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
CLEAR_PED_TASKS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
|
|
IF NOT IS_ENTITY_DEAD(sGoldVans[1].veh)
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldVans[1].veh, VS_DRIVER)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(sGoldVans[0].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
|
|
OR IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
|
|
ENDIF
|
|
|
|
|
|
|
|
SET_ENTITY_HEADING(sGoldVans[0].veh, 159.0429)
|
|
SET_ENTITY_COORDS(sGoldVans[0].veh, <<-110.3915, -667.8174, 34.4690>>)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sGoldVans[0].veh, TRUE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sGoldVans[0].veh, TRUE)
|
|
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, TRUE)
|
|
SET_ENTITY_VELOCITY(sGoldVans[0].veh, <<0.0, 0.0, 0.0>>)
|
|
SET_VEHICLE_TYRE_FIXED(sGoldVans[0].veh, SC_WHEEL_CAR_REAR_RIGHT) //In case this tyre was deliberately burst earlier, it may mess up the AI.
|
|
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_ENTITY_COORDS(sGoldVans[0].veh) - <<0.0, 0.0, 5.0>>)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(sGoldVans[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
OR IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
|
|
ENDIF
|
|
|
|
CLEAR_AREA_OF_VEHICLES(<<-115.0201, -680.6793, 34.1122>>, 10.0)
|
|
SET_ENTITY_HEADING(sGoldVans[1].veh, 159.4947)
|
|
SET_ENTITY_COORDS(sGoldVans[1].veh, <<-115.0201, -680.6793, 34.1122>>)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sGoldVans[1].veh, TRUE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sGoldVans[1].veh, TRUE)
|
|
SET_ENTITY_VELOCITY(sGoldVans[1].veh, <<0.0, 0.0, 0.0>>)
|
|
FREEZE_ENTITY_POSITION(sGoldVans[1].veh, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT DOES_CAM_EXIST(camMain)
|
|
DESTROY_CAM(camMain)
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
LOAD_SCENE(<<44.0696, -870.6827, 29.4558>>)
|
|
|
|
WAIT(0)
|
|
ENDIF
|
|
|
|
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), FALSE)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_POPULATION_BUDGET(0)
|
|
SET_PED_POPULATION_BUDGET(1)
|
|
SET_RANDOM_TRAINS(FALSE)
|
|
sbiTrafficControl = ADD_SCENARIO_BLOCKING_AREA(<<-9999.9, -9999.9, -9999.9>>, <<9999.9, 9999.9, 9999.9>>)
|
|
CLEAR_AREA(<<-111.8524, -673.9980, 34.3226>>, 1000.0, TRUE)
|
|
|
|
camMain = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", vTrafficGameMainCamPos, vTrafficGameMainCamRot, fTrafficGameMainCamFOV, TRUE)
|
|
|
|
SET_TIMECYCLE_MODIFIER("traffic_skycam")
|
|
SET_NOISEOVERIDE(TRUE)
|
|
SET_NOISINESSOVERIDE(sTrafficGame.fNoiseLevel)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE,DEFAULT, DEFAULT, TRUE)
|
|
|
|
SET_CAM_FAR_CLIP(camMain, 1000.0)
|
|
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 7, NULL, "LESTER")
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 1, NULL, "FRANKLIN")
|
|
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(TRUE)
|
|
|
|
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE)
|
|
SETTIMERA(0)
|
|
|
|
//Disable all controls at first, so the player can't do things during the loading screen.
|
|
sTrafficGame.bAllowMovement = FALSE
|
|
sTrafficGame.bAllowCamSwitch = FALSE
|
|
sTrafficGame.bAllowSwitch = FALSE
|
|
|
|
//1836183 - If there's rain falling then change the weather type for the traffic control section.
|
|
IF IS_PREV_WEATHER_TYPE("RAIN")
|
|
OR IS_PREV_WEATHER_TYPE("THUNDER")
|
|
SET_WEATHER_TYPE_NOW("CLEAR")
|
|
ENDIF
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
TRIGGER_MUSIC_EVENT("FH2A_TRAFFIC_RESTART")
|
|
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
UPDATE_TRAFFIC_GAME()
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_TRAFFIC_CONTROL_STAGE")
|
|
START_AUDIO_SCENE("BS_2A_TRAFFIC_CONTROL_STAGE")
|
|
ENDIF
|
|
|
|
bTrafficEndStreamingActive = FALSE
|
|
bTCPrimedTrevorNearMissDialogue = FALSE
|
|
bTCPrimedMichaelNearMissDialogue = FALSE
|
|
bMichaelReachedTrafficFinish = FALSE
|
|
bTrevorReachedTrafficFinish = FALSE
|
|
iRedLightDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 12000)
|
|
iRedLightHornTimer = 0
|
|
iTrafficBlipFlashTimer = 0
|
|
iTrafficLightOverrideEvent = 0
|
|
iTimeOfLastTrafficSwitch = 0
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_TRAFFIC_CONTROL, "TRAFFIC_CONTROL")
|
|
iTrafficControlHelpEvent = 0
|
|
iTrafficInstructionEvent = 0
|
|
iTCDialogueTimer = 0
|
|
iTrafficHighlightEvent = 0
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ELSE
|
|
//If we didn't skip here make sure the traffic game loading screen is drawn if we're waiting for assets to stream.
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
IF HAS_STREAMED_TEXTURE_DICT_LOADED(strTrafficTextures)
|
|
AND HAS_SCALEFORM_MOVIE_LOADED(sfTrafficHud)
|
|
UPDATE_TRAFFIC_GAME()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
//Handle the sequence of help: as help displays new buttons are unlocked
|
|
SWITCH iTrafficControlHelpEvent
|
|
CASE 0 //Franklin says "I'm in".
|
|
//Wait until the loading screen is done.
|
|
IF TIMERA() > 3000
|
|
sTrafficGame.bAllowMovement = FALSE
|
|
sTrafficGame.bAllowCamSwitch = TRUE
|
|
sTrafficGame.bAllowSwitch = TRUE
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_CAM", CONV_PRIORITY_MEDIUM)
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, FALSE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sGoldVans[0].veh, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
FREEZE_ENTITY_POSITION(sGoldVans[1].veh, FALSE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sGoldVans[1].veh, TRUE)
|
|
ENDIF
|
|
|
|
iTrafficControlHelpEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ELIF TIMERA() < 1000
|
|
//1902102 - Trevor's van seems to be sliding around the map for unknown reasons, repeatedly force it into the correct position while the scaleform intro is running.
|
|
IF NOT IS_ENTITY_DEAD(sGoldVans[1].veh)
|
|
SET_ENTITY_HEADING(sGoldVans[1].veh, 159.4947)
|
|
SET_ENTITY_COORDS(sGoldVans[1].veh, <<-115.0201, -680.6793, 34.1122>>)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //God text.
|
|
//Once loading screen has finished display the god text.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
SETTIMERA(0)
|
|
PRINT_NOW("F3A_TRAFFIC", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[F3A_TRAFFIC] = TRUE
|
|
|
|
iTrafficControlHelpEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Overall description of game.
|
|
IF TIMERA() > 2000
|
|
SETTIMERA(0)
|
|
PRINT_HELP("F3A_TRAFDESC")
|
|
iTrafficControlHelpEvent++
|
|
|
|
IF iTrafficBlipFlashTimer = 0
|
|
iTrafficBlipFlashTimer = GET_GAME_TIMER() //This triggers the van blips to be revealed.
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3 //Switch lights help.
|
|
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
|
|
OR (sTrafficGame.bAllowMovement AND TIMERA() > 5000) //Display early if the player already switched lights
|
|
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
PRINT_HELP_FOREVER("F3A_TRAFHELP1A_KM")
|
|
ELSE
|
|
PRINT_HELP_FOREVER("F3A_TRAFHELP1A")
|
|
ENDIF
|
|
SETTIMERA(0)
|
|
iTrafficControlHelpEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4 //Cursor help.
|
|
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
|
|
IF bPCCursorAccept
|
|
OR (sTrafficGame.bAllowMovement AND TIMERA() > 5000)
|
|
SETTIMERA(0)
|
|
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
PRINT_HELP("F3A_TRAFHELP1C_KM")
|
|
ELSE
|
|
PRINT_HELP("F3A_TRAFHELP1C")
|
|
ENDIF
|
|
iTrafficControlHelpEvent++
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF (IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SPRINT) AND TIMERA() > 1000)
|
|
OR (sTrafficGame.bAllowMovement AND TIMERA() > 5000)
|
|
SETTIMERA(0)
|
|
PRINT_HELP("F3A_TRAFHELP1C")
|
|
iTrafficControlHelpEvent++
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 5 //Junction cam help.
|
|
IF (IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_VEH_CIN_CAM) OR IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL))
|
|
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_TRAFHELP1B")
|
|
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_TRAFHELP1C")
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
|
|
// Keyboard and mouse control help
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_TRAFHELP1B_KM")
|
|
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_TRAFHELP1C_KM")
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Camera moving help.
|
|
IF sTrafficGame.bJunctionCamActive
|
|
AND iHackerLevel = HACKER_LEVEL_GOOD
|
|
IF NOT bHasTextLabelTriggered[F3A_TRAFHELP1D]
|
|
AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_TRAFHELP3") //Merryweather help takes priority.
|
|
IF NOT IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
PRINT_HELP("F3A_TRAFHELP1D")
|
|
ELSE
|
|
PRINT_HELP("F3A_TRAFHELP1D_KM")
|
|
ENDIF
|
|
bHasTextLabelTriggered[F3A_TRAFHELP1D] = TRUE
|
|
bHasTextLabelTriggered[F3A_TRAFHELP1B] = TRUE //Don't need to show this any more.
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Clear move cam help
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_TRAFHELP1D")
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
|
|
//Clear cursor help as when the player moves the cursor.
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_TRAFHELP1C")
|
|
AND TIMERA() > 3000
|
|
IF ABSI(GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_MOVE_LR) - 128) > 10
|
|
OR ABSI(GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_MOVE_UD) - 128) > 10
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Clear cursor help as when the player moves the cursor.
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_TRAFHELP1C_KM")
|
|
AND TIMERA() > 3000
|
|
IF bPCCursorMoved
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//Use cam help.
|
|
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
|
|
AND NOT sTrafficGame.bJunctionCamActive
|
|
AND iHackerLevel = HACKER_LEVEL_GOOD
|
|
IF NOT bHasTextLabelTriggered[F3A_TRAFHELP1B]
|
|
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
PRINT_HELP("F3A_TRAFHELP1B_KM")
|
|
ELSE
|
|
PRINT_HELP("F3A_TRAFHELP1B")
|
|
ENDIF
|
|
bHasTextLabelTriggered[F3A_TRAFHELP1B] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Hacker gives an intro as soon as the god text is finished.
|
|
IF NOT bHasTextLabelTriggered[FH3A_HACK]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND bHasTextLabelTriggered[F3A_TRAFFIC]
|
|
TEXT_LABEL strLabel
|
|
TEXT_LABEL strCrewVoiceName = ""
|
|
CrewMember eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER)
|
|
|
|
IF iHackerLevel = HACKER_LEVEL_GOOD
|
|
IF eCrewID = CM_HACKER_G_PAIGE
|
|
strLabel = "FH3A_HACK1"
|
|
strCrewVoiceName = "PAIGE"
|
|
ELIF eCrewID = CM_HACKER_M_CHRIS
|
|
strLabel = "FH3A_HACK2b"
|
|
strCrewVoiceName = "CHRISTIAN"
|
|
ELIF eCrewID = CM_HACKER_B_RICKIE_UNLOCK
|
|
strLabel = "FH3A_HACK3c"
|
|
strCrewVoiceName = "LIEngineer"
|
|
ENDIF
|
|
ELIF iHackerLevel = HACKER_LEVEL_MEDIUM
|
|
IF eCrewID = CM_HACKER_M_CHRIS
|
|
strLabel = "FH3A_HACK2"
|
|
strCrewVoiceName = "CHRISTIAN"
|
|
ELIF eCrewID = CM_HACKER_B_RICKIE_UNLOCK
|
|
strLabel = "FH3A_HACK3b"
|
|
strCrewVoiceName = "LIEngineer"
|
|
ENDIF
|
|
ELSE
|
|
strLabel = "FH3A_HACK3"
|
|
strCrewVoiceName = "LIEngineer"
|
|
ENDIF
|
|
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 7, NULL, strCrewVoiceName)
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_HACK] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Play dialogue whenever the lights are switched.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF iTimeOfLastTrafficSwitch != 0
|
|
INT iTimeSinceLastSwitch = GET_GAME_TIMER() - iTimeOfLastTrafficSwitch
|
|
|
|
IF iTimeSinceLastSwitch < 200
|
|
TEXT_LABEL strLabel
|
|
TEXT_LABEL strCrewVoiceName = ""
|
|
CrewMember eCrewID = GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_HACKER)
|
|
|
|
IF iHackerLevel = HACKER_LEVEL_GOOD
|
|
IF eCrewID = CM_HACKER_G_PAIGE
|
|
strLabel = "FH3A_HLIGHT1"
|
|
strCrewVoiceName = "PAIGE"
|
|
ELIF eCrewID = CM_HACKER_M_CHRIS
|
|
strLabel = "FH3A_HLIGHT4"
|
|
strCrewVoiceName = "CHRISTIAN"
|
|
ELIF eCrewID = CM_HACKER_B_RICKIE_UNLOCK
|
|
strLabel = "FH3A_HLIGHT5"
|
|
strCrewVoiceName = "LIEngineer"
|
|
ENDIF
|
|
ELIF iHackerLevel = HACKER_LEVEL_MEDIUM
|
|
IF eCrewID = CM_HACKER_M_CHRIS
|
|
strLabel = "FH3A_HLIGHT2"
|
|
strCrewVoiceName = "CHRISTIAN"
|
|
ELIF eCrewID = CM_HACKER_B_RICKIE_UNLOCK
|
|
strLabel = "FH3A_HLIGHT3"
|
|
strCrewVoiceName = "LIEngineer"
|
|
ENDIF
|
|
ELSE
|
|
strLabel = "FH3A_HLIGHT6"
|
|
strCrewVoiceName = "LIEngineer"
|
|
ENDIF
|
|
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 7, NULL, strCrewVoiceName)
|
|
|
|
CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Movement starts off disabled, enable once the player changes the first lights
|
|
//(also enable straight away on a retry).
|
|
IF NOT sTrafficGame.bAllowMovement
|
|
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SPRINT)
|
|
OR bPCCursorAccept
|
|
OR bRetryingTrafficSection
|
|
sTrafficGame.bAllowMovement = TRUE
|
|
|
|
//If the vans haven't been flashed yet just bypass it.
|
|
IF iTrafficBlipFlashTimer = 0
|
|
iTrafficBlipFlashTimer = GET_GAME_TIMER() - 5000
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Handle van and cops behaviour
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
|
|
VECTOR vMichaelPos = GET_ENTITY_COORDS(sGoldVans[0].veh)
|
|
VECTOR vTrevorPos = GET_ENTITY_COORDS(sGoldVans[1].veh)
|
|
VECTOR vFrontVanPos, vRearVanPos
|
|
INT iMichaelClosestWaypoint, iTrevorClosestWaypoint
|
|
|
|
//Work out which van is at the front: this is used later to determine triggers for dialogue, cops etc.
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointVehTrafficMain, vMichaelPos, iMichaelClosestWaypoint)
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(strWaypointVehTrafficMain, vTrevorPos, iTrevorClosestWaypoint)
|
|
|
|
IF iMichaelClosestWaypoint > iTrevorClosestWaypoint
|
|
vFrontVanPos = vMichaelPos
|
|
vRearVanPos = vTrevorPos
|
|
ELSE
|
|
vFrontVanPos = vTrevorPos
|
|
vRearVanPos = vMichaelPos
|
|
ENDIF
|
|
|
|
REQUEST_MODEL(modelMerryCar)
|
|
REQUEST_MODEL(modelMerryweather)
|
|
|
|
//NOTE: Main car path through the current set of junctions is this (numbers correspond to the array elements):
|
|
// 0 1 ..... 2 ..... 3
|
|
// . . .
|
|
// . . .
|
|
// 4 ..... 5 6 ..... 7
|
|
// .
|
|
// .
|
|
// 8 9 10
|
|
// .
|
|
// .
|
|
// EXIT
|
|
SWITCH iCurrentEvent
|
|
CASE 0 //Once the first cop car is created play some dialogue.
|
|
IF DOES_ENTITY_EXIST(sTrafficGameCops[0].veh)
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF ((NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData) AND TIMERB() > 3000) OR TIMERB() > 10000)
|
|
AND NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
|
|
IF NOT bHasTextLabelTriggered[F3A_TRAFHELP3]
|
|
PRINT_HELP("F3A_TRAFHELP3")
|
|
bHasTextLabelTriggered[F3A_TRAFHELP3] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF VDIST2(vFrontVanPos, sTrafficJunction[7].sCrossings[TC_NORTH_JUNCTION].vCentre) < 1600.0
|
|
iCurrentEvent = 100
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 100
|
|
//Request next cutscene assets in advance
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_VAN_1, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_VAN_2, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_COP_1, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_COP_2, strCarrec)
|
|
|
|
IF NOT bMichaelReachedTrafficFinish
|
|
bMichaelReachedTrafficFinish = IS_ENTITY_IN_ANGLED_AREA(sGoldVans[0].veh, <<78.806602,-1170.024292,28.179527>>, <<43.142773,-1173.263062,37.764736>>, 6.000000)
|
|
ENDIF
|
|
|
|
IF NOT bTrevorReachedTrafficFinish
|
|
bTrevorReachedTrafficFinish = IS_ENTITY_IN_ANGLED_AREA(sGoldVans[1].veh, <<78.806602,-1170.024292,28.179527>>, <<43.142773,-1173.263062,37.764736>>, 6.000000)
|
|
ENDIF
|
|
|
|
IF bMichaelReachedTrafficFinish
|
|
AND bTrevorReachedTrafficFinish
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Need to rewrite: create an UPDATE_TC_ENEMIES proc to handle this and the processing.
|
|
//Create the enemy cars when the player reaches certain bits of the chase
|
|
IF NOT sTrafficGameCops[0].bIsCreated
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointVehTCGoon1)
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehTCGoon1)
|
|
IF VDIST2(vFrontVanPos, sTrafficJunction[4].sCrossings[TC_NORTH_JUNCTION].vCentre) < 10000.0
|
|
IF CREATE_TRAFFIC_CAR_USING_WAYPOINT(sTrafficGameCops[0], modelMerryCar, modelMerryweather, strWaypointVehTCGoon1, TRUE)
|
|
SET_VEHICLE_COLOURS(sTrafficGameCops[0].veh, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
|
|
SET_VEHICLE_EXTRA_COLOURS(sTrafficGameCops[0].veh, MERRY_CAR_COLOUR, 0)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SET_VEHICLE_NAME_DEBUG(sTrafficGameCops[0].veh, "0")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT sTrafficGameCops[1].bIsCreated
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointVehTCGoon2)
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehTCGoon2)
|
|
IF VDIST2(vFrontVanPos, sTrafficJunction[5].sCrossings[TC_WEST_JUNCTION].vCentre) < 900.0
|
|
IF CREATE_TRAFFIC_CAR_USING_WAYPOINT(sTrafficGameCops[1], modelMerryCar, modelMerryweather, strWaypointVehTCGoon2, TRUE)
|
|
SET_VEHICLE_COLOURS(sTrafficGameCops[1].veh, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
|
|
SET_VEHICLE_EXTRA_COLOURS(sTrafficGameCops[1].veh, MERRY_CAR_COLOUR, 0)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SET_VEHICLE_NAME_DEBUG(sTrafficGameCops[1].veh, "1")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT sTrafficGameCops[2].bIsCreated
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointVehTCGoon3)
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehTCGoon3)
|
|
IF VDIST2(vFrontVanPos, sTrafficJunction[3].sCrossings[TC_WEST_JUNCTION].vCentre) < 900.0
|
|
IF CREATE_TRAFFIC_CAR_USING_WAYPOINT(sTrafficGameCops[2], modelMerryCar, modelMerryweather, strWaypointVehTCGoon4, TRUE)
|
|
SET_VEHICLE_COLOURS(sTrafficGameCops[2].veh, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
|
|
SET_VEHICLE_EXTRA_COLOURS(sTrafficGameCops[2].veh, MERRY_CAR_COLOUR, 0)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SET_VEHICLE_NAME_DEBUG(sTrafficGameCops[2].veh, "2")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT sTrafficGameCops[3].bIsCreated
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointVehTCGoon4)
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehTCGoon4)
|
|
IF VDIST2(vFrontVanPos, sTrafficJunction[7].sCrossings[TC_WEST_JUNCTION].vCentre) < 3600.0
|
|
IF CREATE_TRAFFIC_CAR_USING_WAYPOINT(sTrafficGameCops[3], modelMerryCar, modelMerryweather, strWaypointVehTCGoon3, TRUE)
|
|
SET_VEHICLE_COLOURS(sTrafficGameCops[3].veh, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
|
|
SET_VEHICLE_EXTRA_COLOURS(sTrafficGameCops[3].veh, MERRY_CAR_COLOUR, 0)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SET_VEHICLE_NAME_DEBUG(sTrafficGameCops[3].veh, "3")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT sTrafficGameCops[4].bIsCreated
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointVehTCGoon5)
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehTCGoon5)
|
|
IF VDIST2(vFrontVanPos, sTrafficJunction[7].sCrossings[TC_NORTH_JUNCTION].vCentre) < 3600.0
|
|
IF CREATE_TRAFFIC_CAR_USING_WAYPOINT(sTrafficGameCops[4], modelMerryCar, modelMerryweather, strWaypointVehTCGoon5, TRUE)
|
|
SET_VEHICLE_COLOURS(sTrafficGameCops[4].veh, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
|
|
SET_VEHICLE_EXTRA_COLOURS(sTrafficGameCops[4].veh, MERRY_CAR_COLOUR, 0)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SET_VEHICLE_NAME_DEBUG(sTrafficGameCops[4].veh, "4")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT sTrafficGameCops[5].bIsCreated
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointVehTCGoon6)
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointVehTCGoon6)
|
|
IF VDIST2(vFrontVanPos, sTrafficJunction[7].sCrossings[TC_NORTH_JUNCTION].vCentre) < 900.0
|
|
IF CREATE_TRAFFIC_CAR_USING_WAYPOINT(sTrafficGameCops[5], modelMerryCar, modelMerryweather, strWaypointVehTCGoon6, TRUE)
|
|
SET_VEHICLE_COLOURS(sTrafficGameCops[5].veh, MERRY_CAR_COLOUR, MERRY_CAR_COLOUR)
|
|
SET_VEHICLE_EXTRA_COLOURS(sTrafficGameCops[5].veh, MERRY_CAR_COLOUR, 0)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SET_VEHICLE_NAME_DEBUG(sTrafficGameCops[5].veh, "5")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Highlight enemy cars as they enter the screen, also play dialogue when the flash occurs
|
|
SWITCH iTrafficHighlightEvent
|
|
CASE 0
|
|
IF NOT IS_ENTITY_DEAD(sTrafficGameCops[0].veh)
|
|
IF IS_ENTITY_ON_SCREEN(sTrafficGameCops[0].veh)
|
|
sTrafficGameCops[0].iFlashTimer = GET_GAME_TIMER()
|
|
sTrafficGame.vehIndicatorTarget = sTrafficGameCops[0].veh
|
|
iTCDialogueTimer = GET_GAME_TIMER()
|
|
iTrafficHighlightEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF NOT IS_ENTITY_DEAD(sTrafficGameCops[1].veh)
|
|
IF IS_ENTITY_ON_SCREEN(sTrafficGameCops[1].veh)
|
|
sTrafficGameCops[1].iFlashTimer = GET_GAME_TIMER()
|
|
sTrafficGame.vehIndicatorTarget = sTrafficGameCops[1].veh
|
|
iTCDialogueTimer = GET_GAME_TIMER()
|
|
iTrafficHighlightEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF NOT IS_ENTITY_DEAD(sTrafficGameCops[2].veh)
|
|
IF IS_ENTITY_ON_SCREEN(sTrafficGameCops[2].veh)
|
|
sTrafficGameCops[2].iFlashTimer = GET_GAME_TIMER()
|
|
sTrafficGame.vehIndicatorTarget = sTrafficGameCops[2].veh
|
|
iTCDialogueTimer = GET_GAME_TIMER()
|
|
iTrafficHighlightEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3
|
|
IF NOT IS_ENTITY_DEAD(sTrafficGameCops[3].veh)
|
|
IF IS_ENTITY_ON_SCREEN(sTrafficGameCops[3].veh)
|
|
sTrafficGameCops[3].iFlashTimer = GET_GAME_TIMER()
|
|
sTrafficGame.vehIndicatorTarget = sTrafficGameCops[3].veh
|
|
iTCDialogueTimer = GET_GAME_TIMER()
|
|
iTrafficHighlightTimer = 0
|
|
iTrafficHighlightEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4
|
|
IF NOT IS_ENTITY_DEAD(sTrafficGameCops[4].veh)
|
|
IF IS_ENTITY_ON_SCREEN(sTrafficGameCops[4].veh)
|
|
IF iTrafficHighlightTimer = 0
|
|
iTrafficHighlightTimer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - iTrafficHighlightTimer > 7000
|
|
sTrafficGameCops[4].iFlashTimer = GET_GAME_TIMER()
|
|
sTrafficGame.vehIndicatorTarget = sTrafficGameCops[4].veh
|
|
iTCDialogueTimer = GET_GAME_TIMER()
|
|
iTrafficHighlightEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 5
|
|
IF NOT IS_ENTITY_DEAD(sTrafficGameCops[5].veh)
|
|
IF IS_ENTITY_ON_SCREEN(sTrafficGameCops[5].veh)
|
|
sTrafficGameCops[5].iFlashTimer = GET_GAME_TIMER()
|
|
sTrafficGame.vehIndicatorTarget = sTrafficGameCops[5].veh
|
|
iTCDialogueTimer = GET_GAME_TIMER()
|
|
iTrafficHighlightEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Some lights are fudged to green at specific points, to force the player to change them.
|
|
SWITCH iTrafficLightOverrideEvent
|
|
CASE 0 //First enemy car: set the the first lights they approach to green.
|
|
IF NOT IS_ENTITY_DEAD(sTrafficGameCops[0].veh)
|
|
IF VDIST2(GET_ENTITY_COORDS(sTrafficGameCops[0].veh), sTrafficJunction[7].vCentre) < 22500.0
|
|
IF GET_GAME_TIMER() - sTrafficJunction[7].iChangeTimer > 2000
|
|
IF sTrafficJunction[7].sCrossings[TC_EAST_JUNCTION].bIsBlocked
|
|
INT j
|
|
REPEAT 4 j
|
|
sTrafficJunction[7].sCrossings[j].bIsBlocked = NOT sTrafficJunction[7].sCrossings[j].bIsBlocked
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
sTrafficJunction[7].iChangeTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(-3000, 3000)
|
|
iTrafficLightOverrideEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//While the indicator is flashing play some relevant dialogue.
|
|
IF GET_GAME_TIMER() - iTCDialogueTimer < 5000
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND bHasTextLabelTriggered[FH3A_HACK]
|
|
IF sTrafficGame.vehIndicatorTarget = sTrafficGameCops[0].veh
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MERRYE", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_FSEES] = TRUE
|
|
iTCDialogueTimer -= 20000 //Prevents the dialogue triggering again until a new car appears.
|
|
ENDIF
|
|
ELIF sTrafficGame.vehIndicatorTarget = sTrafficGameCops[1].veh
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MERRY", CONV_PRIORITY_MEDIUM)
|
|
iTCDialogueTimer -= 20000
|
|
ENDIF
|
|
ELIF sTrafficGame.vehIndicatorTarget = sTrafficGameCops[2].veh
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MERRYW", CONV_PRIORITY_MEDIUM)
|
|
iTCDialogueTimer -= 20000
|
|
ENDIF
|
|
ELIF sTrafficGame.vehIndicatorTarget = sTrafficGameCops[3].veh
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MERRYS", CONV_PRIORITY_MEDIUM)
|
|
iTCDialogueTimer -= 20000
|
|
ENDIF
|
|
/*ELIF sTrafficGame.vehIndicatorTarget = sTrafficGameCops[4].veh
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MERRYS", CONV_PRIORITY_MEDIUM)
|
|
iTCDialogueTimer -= 20000
|
|
ENDIF*/
|
|
ELIF sTrafficGame.vehIndicatorTarget = sTrafficGameCops[5].veh
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MERRYN", CONV_PRIORITY_MEDIUM)
|
|
iTCDialogueTimer -= 20000
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Update main vans
|
|
TRAFFIC_CAR_STATE eMichaelState, eTrevorState
|
|
|
|
IF sTrafficGame.bAllowSwitch
|
|
eMichaelState = UPDATE_TRAFFIC_CAR_WAYPOINT_MOVEMENT(sGoldVans[0].veh, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], strWaypointVehTrafficMain, DRIVINGMODE_STOPFORCARS_IGNORELIGHTS, sGoldVans[1].veh)
|
|
eTrevorState = UPDATE_TRAFFIC_CAR_WAYPOINT_MOVEMENT(sGoldVans[1].veh, sSelectorPeds.pedID[SELECTOR_PED_TREVOR], strWaypointVehTrafficMain, DRIVINGMODE_STOPFORCARS_IGNORELIGHTS)
|
|
ELSE
|
|
eMichaelState = TC_STATE_MOVING
|
|
eTrevorState = TC_STATE_MOVING
|
|
ENDIF
|
|
|
|
//Update cops: always driving, currently they stop at the lights.
|
|
INT iNumCopCarsProcessedThisFrame = 0
|
|
INT iNumCopCars = COUNT_OF(sTrafficGameCops)
|
|
|
|
WHILE iCurrentCopCarToProcess < iNumCopCars
|
|
AND iNumCopCarsProcessedThisFrame < 2
|
|
UPDATE_TRAFFIC_GAME_CAR(sTrafficGameCops[iCurrentCopCarToProcess], sTrafficGameCops[iCurrentCopCarToProcess].strCurrentWaypoint,
|
|
<<0.0, 0.0, 0.0>>, DRIVINGMODE_STOPFORCARS_IGNORELIGHTS)
|
|
|
|
IF NOT IS_ENTITY_DEAD(sTrafficGameCops[iCurrentCopCarToProcess].veh)
|
|
//Delete the car once it's out of view of the main cam.
|
|
IF sTrafficGameCops[iCurrentCopCarToProcess].bIsOffScreen
|
|
REMOVE_PED(sTrafficGameCops[iCurrentCopCarToProcess].ped, TRUE)
|
|
REMOVE_VEHICLE(sTrafficGameCops[iCurrentCopCarToProcess].veh, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iNumCopCarsProcessedThisFrame++
|
|
iCurrentCopCarToProcess++
|
|
ENDWHILE
|
|
|
|
IF iCurrentCopCarToProcess >= iNumCopCars
|
|
iCurrentCopCarToProcess = 0
|
|
ENDIF
|
|
|
|
//Update traffic cars when viewing a junction: when they get too far from the current junction warp them back in a random off-screen spot.
|
|
//NOTE: the number of cars processed per frame is limited as it's CPU-heavy, there shouldn't be anything in here that needs to be called every frame.
|
|
INT iNumTrafficProcessedThisFrame = 0
|
|
INT iNumTrafficCars = COUNT_OF(sTrafficGameCars)
|
|
|
|
WHILE iCurrentTrafficCarToProcess < iNumTrafficCars
|
|
AND iNumTrafficProcessedThisFrame < 3
|
|
IF NOT sTrafficGameCars[iCurrentTrafficCarToProcess].bIsCreated
|
|
//Create traffic car.
|
|
REQUEST_MODEL(modelDefaultTCCar)
|
|
REQUEST_MODEL(modelDefaultTCCar2)
|
|
REQUEST_MODEL(modelDefaultTCPed)
|
|
|
|
IF HAS_MODEL_LOADED(modelDefaultTCCar)
|
|
AND HAS_MODEL_LOADED(modelDefaultTCCar2)
|
|
AND HAS_MODEL_LOADED(modelDefaultTCPed)
|
|
IF GET_RANDOM_BOOL()
|
|
sTrafficGameCars[iCurrentTrafficCarToProcess].veh = CREATE_VEHICLE(modelDefaultTCCar, GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<iCurrentTrafficCarToProcess * 5.0, 0.0, 20.0>>)
|
|
ELSE
|
|
sTrafficGameCars[iCurrentTrafficCarToProcess].veh = CREATE_VEHICLE(modelDefaultTCCar2, GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<iCurrentTrafficCarToProcess * 5.0, 0.0, 20.0>>)
|
|
ENDIF
|
|
sTrafficGameCars[iCurrentTrafficCarToProcess].ped = CREATE_PED_INSIDE_VEHICLE(sTrafficGameCars[iCurrentTrafficCarToProcess].veh, PEDTYPE_MISSION, modelDefaultTCPed, VS_DRIVER)
|
|
sTrafficGameCars[iCurrentTrafficCarToProcess].bIsCreated = TRUE
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sTrafficGameCars[iCurrentTrafficCarToProcess].veh, TRUE)
|
|
FREEZE_ENTITY_POSITION(sTrafficGameCars[iCurrentTrafficCarToProcess].veh, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF IS_VEHICLE_DRIVEABLE(sTrafficGameCars[iCurrentTrafficCarToProcess].veh)
|
|
IF sTrafficGame.bJunctionCamActive
|
|
//Update traffic cars.
|
|
UPDATE_TRAFFIC_CAR_TASK_MOVEMENT(sTrafficGameCars[iCurrentTrafficCarToProcess].veh, sTrafficGameCars[iCurrentTrafficCarToProcess].ped,
|
|
sTrafficGameCars[iCurrentTrafficCarToProcess].vCurrentDest, DRIVINGMODE_STOPFORCARS_IGNORELIGHTS)
|
|
|
|
//When the cars go off-screen put them back.
|
|
IF VDIST2(GET_ENTITY_COORDS(sTrafficGameCars[iCurrentTrafficCarToProcess].veh), sTrafficJunction[sTrafficGame.iSelection].vCentre) > 10000.0
|
|
AND NOT IS_ENTITY_ON_SCREEN(sTrafficGameCars[iCurrentTrafficCarToProcess].veh)
|
|
SET_TRAFFIC_CAR_RANDOM_POSITION_AROUND_JUNCTION(sTrafficGameCars[iCurrentTrafficCarToProcess], sTrafficGame.iSelection, TRUE, 60.0, 90.0)
|
|
ENDIF
|
|
ELSE
|
|
//If the car is in the way of the vans then warp it (only when using the overhead cam).
|
|
IF IS_ENTITY_IN_ANGLED_AREA(sTrafficGameCars[iCurrentTrafficCarToProcess].veh,
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[0].veh, <<0.0, 3.1, -0.66>>),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[0].veh, <<0.0, 10.1, 2.66>>), 6.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(sTrafficGameCars[iCurrentTrafficCarToProcess].veh,
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[1].veh, <<0.0, 3.1, -0.66>>),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[1].veh, <<0.0, 10.1, 2.66>>), 6.0)
|
|
SET_ENTITY_COORDS(sTrafficGameCars[iCurrentTrafficCarToProcess].veh, GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<iCurrentTrafficCarToProcess * 5.0, 0.0, 20.0>>)
|
|
FREEZE_ENTITY_POSITION(sTrafficGameCars[iCurrentTrafficCarToProcess].veh, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iNumTrafficProcessedThisFrame++
|
|
iCurrentTrafficCarToProcess++
|
|
ENDWHILE
|
|
|
|
IF iCurrentTrafficCarToProcess >= iNumTrafficCars
|
|
iCurrentTrafficCarToProcess = 0
|
|
ENDIF
|
|
|
|
//Get the closest junction to Michael and Trevor: these are used for a number of different things later (e.g. dialogue, fudging lights, etc).
|
|
INT iTrevorClosestJunction, iMichaelClosestJunction
|
|
FLOAT fTrevorClosestJunctionDist, fMichaelClosestJunctionDist
|
|
|
|
GET_CLOSEST_JUNCTION_TO_COORDS(vTrevorPos, iTrevorClosestJunction, fTrevorClosestJunctionDist)
|
|
GET_CLOSEST_JUNCTION_TO_COORDS(vMichaelPos, iMichaelClosestJunction, fMichaelClosestJunctionDist)
|
|
|
|
//B*1082122: Freeze lights that the player peds are close to, so they don't switch at the last second.
|
|
IF fTrevorClosestJunctionDist < 2500.0
|
|
sTrafficJunction[iTrevorClosestJunction].bLightsFrozen = TRUE
|
|
ELSE
|
|
IF (iMichaelClosestJunction != iTrevorClosestJunction)
|
|
OR (iMichaelClosestJunction = iTrevorClosestJunction AND fMichaelClosestJunctionDist > 2500.0)
|
|
sTrafficJunction[iTrevorClosestJunction].bLightsFrozen = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fMichaelClosestJunctionDist < 2500.0
|
|
sTrafficJunction[iMichaelClosestJunction].bLightsFrozen = TRUE
|
|
ELSE
|
|
IF (iMichaelClosestJunction != iTrevorClosestJunction)
|
|
OR (iMichaelClosestJunction = iTrevorClosestJunction AND fTrevorClosestJunctionDist > 2500.0)
|
|
sTrafficJunction[iMichaelClosestJunction].bLightsFrozen = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
UPDATE_TRAFFIC_GAME()
|
|
|
|
//Set the player in a central point that should help stream the area.
|
|
VECTOR vPlayerPos = vTrafficGameMainCamPos
|
|
IF sTrafficGame.bJunctionCamActive
|
|
vPlayerPos = sTrafficJunction[sTrafficGame.iSelection].vCentre + <<0.0, 0.0, 4.0>>
|
|
ENDIF
|
|
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vPlayerPos) > 25.0
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), vPlayerPos)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), sTrafficJunction[sTrafficGame.iSelection].vCamRot.z)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
|
|
//Once the cars get close to the exit start streaming in the shootout area.
|
|
IF NOT bTrafficEndStreamingActive
|
|
IF NOT STREAMVOL_IS_VALID(svChaseStart)
|
|
IF VDIST2(vFrontVanPos, <<132.7, -1226.1, 29.8>>) < 40000.0
|
|
IF sTrafficGame.bJunctionStreamingActive
|
|
NEW_LOAD_SCENE_STOP()
|
|
sTrafficGame.bJunctionStreamingActive = FALSE
|
|
ENDIF
|
|
|
|
//svChaseStart = STREAMVOL_CREATE_SPHERE(<<132.7, -1226.1, 29.8>>, 15.0, FLAG_MAPDATA)
|
|
svChaseStart = STREAMVOL_CREATE_FRUSTUM(<<139.516541,-1184.388794,32.141018>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-4.597814,0.269738,161.160843>>), 70.0, FLAG_MAPDATA | FLAG_COLLISIONS_MOVER)
|
|
bTrafficEndStreamingActive = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REQUEST_MODEL(modelHobo)
|
|
ENDIF
|
|
|
|
//DIALOGUE
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND bHasTextLabelTriggered[FH3A_HACK]
|
|
//Response to dialogue for first Merryweather car showing up.
|
|
IF bHasTextLabelTriggered[FH3A_FSEES]
|
|
IF NOT bHasTextLabelTriggered[FH3A_JUNCT2]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_JUNCT2", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_JUNCT2] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some dialogue when the rear car is approaching the destination.
|
|
IF NOT bHasTextLabelTriggered[FH3A_NEARLY]
|
|
IF VDIST2(vRearVanPos, sTrafficJunction[9].sCrossings[TC_NORTH_JUNCTION].vCentre) < 10000.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_NEARLY", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_NEARLY] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play instructions from Franklin about which way to turn.
|
|
FLOAT fDistToNextJunction
|
|
|
|
SWITCH iTrafficInstructionEvent
|
|
CASE 0
|
|
fDistToNextJunction = VDIST2(vFrontVanPos, sTrafficJunction[4].sCrossings[TC_NORTH_JUNCTION].vCentre)
|
|
|
|
IF fDistToNextJunction < 6400.0
|
|
IF fDistToNextJunction > VDIST2(vFrontVanPos, sTrafficJunction[4].vCentre)
|
|
iTrafficInstructionEvent++
|
|
ELSE
|
|
//Currently testing not playing dialogue for the first turn, as Trevor also has dialogue here.
|
|
//IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LEFT", CONV_PRIORITY_MEDIUM)
|
|
iTrafficInstructionEvent++
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
fDistToNextJunction = VDIST2(vFrontVanPos, sTrafficJunction[5].sCrossings[TC_WEST_JUNCTION].vCentre)
|
|
|
|
IF fDistToNextJunction < 6400.0
|
|
IF fDistToNextJunction > VDIST2(vFrontVanPos, sTrafficJunction[5].vCentre)
|
|
iTrafficInstructionEvent++
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LEFT", CONV_PRIORITY_MEDIUM)
|
|
iTrafficInstructionEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
fDistToNextJunction = VDIST2(vFrontVanPos, sTrafficJunction[1].sCrossings[TC_SOUTH_JUNCTION].vCentre)
|
|
|
|
IF fDistToNextJunction < 6400.0
|
|
IF fDistToNextJunction > VDIST2(vFrontVanPos, sTrafficJunction[1].vCentre)
|
|
iTrafficInstructionEvent++
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RIGHT", CONV_PRIORITY_MEDIUM)
|
|
iTrafficInstructionEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3
|
|
fDistToNextJunction = VDIST2(vFrontVanPos, sTrafficJunction[2].sCrossings[TC_WEST_JUNCTION].vCentre)
|
|
|
|
IF fDistToNextJunction < 6400.0
|
|
IF fDistToNextJunction > VDIST2(vFrontVanPos, sTrafficJunction[2].vCentre)
|
|
iTrafficInstructionEvent++
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_STRAIGH", CONV_PRIORITY_MEDIUM)
|
|
iTrafficInstructionEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4
|
|
fDistToNextJunction = VDIST2(vFrontVanPos, sTrafficJunction[3].sCrossings[TC_WEST_JUNCTION].vCentre)
|
|
|
|
IF fDistToNextJunction < 6400.0
|
|
IF fDistToNextJunction > VDIST2(vFrontVanPos, sTrafficJunction[3].vCentre)
|
|
iTrafficInstructionEvent++
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RIGHT", CONV_PRIORITY_MEDIUM)
|
|
iTrafficInstructionEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 5
|
|
fDistToNextJunction = VDIST2(vFrontVanPos, sTrafficJunction[7].sCrossings[TC_NORTH_JUNCTION].vCentre)
|
|
|
|
IF fDistToNextJunction < 6400.0
|
|
IF fDistToNextJunction > VDIST2(vFrontVanPos, sTrafficJunction[7].vCentre)
|
|
iTrafficInstructionEvent++
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RIGHT", CONV_PRIORITY_MEDIUM)
|
|
iTrafficInstructionEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 6
|
|
fDistToNextJunction = VDIST2(vFrontVanPos, sTrafficJunction[7].sCrossings[TC_EAST_JUNCTION].vCentre)
|
|
|
|
IF fDistToNextJunction < 6400.0
|
|
IF fDistToNextJunction > VDIST2(vFrontVanPos, sTrafficJunction[7].vCentre)
|
|
iTrafficInstructionEvent++
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LEFT", CONV_PRIORITY_MEDIUM)
|
|
iTrafficInstructionEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
IF eMichaelState = TC_STATE_STOPPED_AT_RED OR eTrevorState = TC_STATE_STOPPED_AT_RED
|
|
//Play some dialogue if Michael or Trevor are stuck at a junction.
|
|
IF bHasTextLabelTriggered[FH3A_HACK] //Don't play until after the intro text.
|
|
IF GET_GAME_TIMER() - iRedLightDialogueTimer > 0
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF eTrevorState = TC_STATE_STOPPED_AT_RED
|
|
IF sTrafficGame.bAllowMovement
|
|
//Generic stop lines for every other red light.
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_TRED2", CONV_PRIORITY_MEDIUM)
|
|
sTrafficJunction[iTrevorClosestJunction].bPlayedLightStatusDialogue = TRUE
|
|
iRedLightDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 12000)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bHasTextLabelTriggered[FH3A_RED] //Trevor says he's stuck at the first light.
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RED", CONV_PRIORITY_MEDIUM)
|
|
iRedLightDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 12000)
|
|
bHasTextLabelTriggered[FH3A_RED] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_IMPAT] //Trevor gets impatient at the first light.
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_IMPAT", CONV_PRIORITY_MEDIUM)
|
|
iRedLightDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 12000)
|
|
bHasTextLabelTriggered[FH3A_IMPAT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Only play Michael's line if he has been separated from Trevor.
|
|
IF iTrevorClosestWaypoint - iMichaelClosestWaypoint >= 10
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SPLIT", CONV_PRIORITY_MEDIUM)
|
|
iRedLightDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 12000)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//TODO 547911: If the player is using a junction cam have the stopped van honk their horn.
|
|
IF sTrafficGame.bJunctionCamActive
|
|
IF GET_GAME_TIMER() - iRedLightHornTimer > 0
|
|
IF eMichaelState = TC_STATE_STOPPED_AT_RED
|
|
IF IS_ENTITY_ON_SCREEN(sGoldVans[0].veh)
|
|
START_VEHICLE_HORN(sGoldVans[0].veh, 2000)
|
|
iRedLightHornTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 12000)
|
|
ENDIF
|
|
ELSE
|
|
IF IS_ENTITY_ON_SCREEN(sGoldVans[1].veh)
|
|
START_VEHICLE_HORN(sGoldVans[1].veh, 2000)
|
|
iRedLightHornTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 12000)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF eTrevorState = TC_STATE_GOING_THROUGH_GREEN
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND bHasTextLabelTriggered[FH3A_HACK]
|
|
//Play a line from Trevor if he passes through a light for the first time and it's already green.
|
|
IF NOT sTrafficJunction[iTrevorClosestJunction].bPlayedLightStatusDialogue
|
|
IF iTrevorClosestJunction = 0
|
|
//Play custom dialogue for the first junction.
|
|
IF NOT bHasTextLabelTriggered[FH3A_GREEN]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_GREEN", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_GREEN] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MGREEN", CONV_PRIORITY_MEDIUM)
|
|
sTrafficJunction[iTrevorClosestJunction].bPlayedLightStatusDialogue = TRUE
|
|
iRedLightDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 12000)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_TGREEN", CONV_PRIORITY_MEDIUM)
|
|
sTrafficJunction[iTrevorClosestJunction].bPlayedLightStatusDialogue = TRUE
|
|
iRedLightDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 3000)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//If no one is passing through lights keep the timer updated so once they stop it takes a few seconds before they say something.
|
|
IF GET_GAME_TIMER() - iRedLightDialogueTimer > -500
|
|
iRedLightDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 3000)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
FLOAT fClosestMerryDistFromMike, fClosestMerryDistFromTrev
|
|
TEXT_LABEL strNearMissLabel
|
|
|
|
VEHICLE_INDEX vehClosestCarToMike = TC_GET_CLOSEST_ENEMY_CAR_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], fClosestMerryDistFromMike)
|
|
VEHICLE_INDEX vehClosestCarToTrev = TC_GET_CLOSEST_ENEMY_CAR_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], fClosestMerryDistFromTrev)
|
|
|
|
//PRINTLN(fClosestMerryDistFromMike, " ", fClosestMerryDistFromTrev)
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehClosestCarToMike)
|
|
//Fail if any of the enemies catch up to Michael/Trevor.
|
|
IF fClosestMerryDistFromMike < 5000.0
|
|
IF fClosestMerryDistFromMike < 3600.0
|
|
OR (GET_ENTITY_SPEED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) < 0.5 AND GET_ENTITY_SPEED(vehClosestCarToMike) < 0.5)
|
|
MISSION_FAILED(FAILED_CAUGHT_DURING_TRAFFIC_CONTROL)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play dialogue if a Merryweather car is getting close, then again if they manage to escape.
|
|
IF NOT bTCPrimedMichaelNearMissDialogue
|
|
//Merryweather car is heading towards Trevor and getting close.
|
|
IF fClosestMerryDistFromMike < 15625.0
|
|
AND fPrevClosestMerryDistMike > fClosestMerryDistFromMike
|
|
AND GET_GAME_TIMER() - iTCNearMissDialogueTimer > 15000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
strNearMissLabel = GET_NEAR_MISS_TEXT_LABEL(sGoldVans[0].veh, GET_ENTITY_COORDS(vehClosestCarToMike))
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strNearMissLabel, CONV_PRIORITY_MEDIUM)
|
|
iTCNearMissDialogueTimer = GET_GAME_TIMER()
|
|
bTCPrimedMichaelNearMissDialogue = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Merryweather car is heading away from Trevor.
|
|
IF fClosestMerryDistFromMike > 6400.0
|
|
AND fClosestMerryDistFromTrev > 6400.0
|
|
AND fPrevClosestMerryDistMike < fClosestMerryDistFromMike
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF fClosestMerryDistFromMike < 14400.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_NEAR", CONV_PRIORITY_MEDIUM)
|
|
bTCPrimedMichaelNearMissDialogue = FALSE
|
|
ENDIF
|
|
ELSE
|
|
//There wasn't enough time to play the dialogue before Trevor moved away, so just reset.
|
|
bTCPrimedMichaelNearMissDialogue = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehClosestCarToTrev)
|
|
IF fClosestMerryDistFromTrev < 5000.0
|
|
IF fClosestMerryDistFromMike < 3600.0
|
|
OR (GET_ENTITY_SPEED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) < 0.5 AND GET_ENTITY_SPEED(vehClosestCarToTrev) < 0.5)
|
|
MISSION_FAILED(FAILED_CAUGHT_DURING_TRAFFIC_CONTROL)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play dialogue if a Merryweather car is getting close, then again if they manage to escape.
|
|
IF NOT bTCPrimedTrevorNearMissDialogue
|
|
//Merryweather car is heading towards Trevor and getting close.
|
|
IF fClosestMerryDistFromTrev < 15625.0
|
|
AND fPrevClosestMerryDistTrev > fClosestMerryDistFromTrev
|
|
AND GET_GAME_TIMER() - iTCNearMissDialogueTimer > 15000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
strNearMissLabel = GET_NEAR_MISS_TEXT_LABEL(sGoldVans[1].veh, GET_ENTITY_COORDS(vehClosestCarToTrev))
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strNearMissLabel, CONV_PRIORITY_MEDIUM)
|
|
iTCNearMissDialogueTimer = GET_GAME_TIMER()
|
|
bTCPrimedTrevorNearMissDialogue = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Merryweather car is heading away from Trevor.
|
|
IF fClosestMerryDistFromTrev > 6400.0
|
|
AND fClosestMerryDistFromMike > 6400.0
|
|
AND fPrevClosestMerryDistTrev < fClosestMerryDistFromTrev
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF fClosestMerryDistFromTrev < 14400.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_NEAR", CONV_PRIORITY_MEDIUM)
|
|
bTCPrimedTrevorNearMissDialogue = FALSE
|
|
ENDIF
|
|
ELSE
|
|
//There wasn't enough time to play the dialogue before Trevor moved away, so just reset.
|
|
bTCPrimedTrevorNearMissDialogue = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fPrevClosestMerryDistMike = fClosestMerryDistFromMike
|
|
fPrevClosestMerryDistTrev = fClosestMerryDistFromTrev
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelDefaultTCPed)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelDefaultTCCar)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelDefaultTCCar2)
|
|
|
|
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 7)
|
|
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
|
|
|
|
IF sbiTrafficControl != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sbiTrafficControl)
|
|
ENDIF
|
|
|
|
//Reset any collision flags turned on for this section
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sGoldVans[0].veh, TRUE)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sGoldVans[0].veh, FALSE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sGoldVans[1].veh, TRUE)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sGoldVans[1].veh, FALSE)
|
|
ENDIF
|
|
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_TRAFFIC_CONTROL_FAIL")
|
|
|
|
eMissionStage = STAGE_ARRIVAL_CUTSCENE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC ARRIVAL_CUTSCENE()
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() //Fix for bug 2176432
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF iCurrentEvent != 99
|
|
IF bHasUsedCheckpoint
|
|
START_REPLAY_SETUP(<<143.59, -1198.29, 28.2951>>, 0.0, FALSE)
|
|
|
|
iCurrentEvent = 99
|
|
ELSE
|
|
//Fix for B*528757: Guarantee that the tunnel is loaded first before trying to set up everything else.
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<143.59, -1198.29, 28.2951>>)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<143.59, -1198.29, 28.2951>>, 100.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
iCurrentEvent = 99
|
|
ENDIF
|
|
ELSE
|
|
IF SETUP_REQ_PLAYER_IS_FRANKLIN()
|
|
IF SETUP_REQ_MICHAEL(<<140.4548, -1202.2416, 28.2951>>)
|
|
AND SETUP_REQ_TREVOR(<<141.4548, -1202.2416, 28.2951>>)
|
|
AND SETUP_REQ_MAIN_DRIVER(<<124.5559, -1190.2872, 28.2951>>, 173.7492)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<125.5559, -1190.2872, 28.2951>>, 173.7492)
|
|
AND SETUP_REQ_GOLD_VAN_HOSTAGE(<<-1.900313,-666.880005,15.1306>>, -127.999458)
|
|
AND SETUP_REQ_CHASE_CARS_START()
|
|
AND SETUP_REQ_GOLD_VANS_AT_TRANSFER_POINT(FALSE, FALSE)
|
|
AND SETUP_REQ_GOLD_TROLLEYS_IN_VANS()
|
|
AND SETUP_REQ_CREW_HAVE_SHOTGUNS()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
|
|
SETUP_REQ_CREW_IN_GOLD_VANS()
|
|
SETUP_FRANKLIN_OUTFIT()
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_VAN_1, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_VAN_2, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_COP_1, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_COPS_COP_2, strCarrec)
|
|
REQUEST_MODEL(modelMerryweather)
|
|
REQUEST_MODEL(modelHobo)
|
|
REQUEST_ANIM_DICT(strVanArriveCamAnim)
|
|
REQUEST_WAYPOINT_RECORDING(strWaypointHobo)
|
|
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_VAN_1, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_VAN_2, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_COP_1, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COPS_COP_2, strCarrec)
|
|
AND HAS_MODEL_LOADED(modelHobo)
|
|
AND HAS_ANIM_DICT_LOADED(strVanArriveCamAnim)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointHobo)
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
UPDATE_TRAFFIC_GAME(FALSE)
|
|
ENDIF
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
|
|
|
|
//Clean up the traffic game in the same frame to avoid pops.
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED(strTrafficTextures)
|
|
|
|
IF bDisabledSwitch
|
|
ENABLE_SELECTOR()
|
|
bDisabledSwitch = FALSE
|
|
ENDIF
|
|
|
|
IF bRequestedTrafficScaleform
|
|
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(sfTrafficHud)
|
|
bRequestedTrafficScaleform = FALSE
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(sTrafficGame.iBackgroundSound)
|
|
STOP_SOUND(sTrafficGame.iBackgroundSound)
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(sTrafficGame.iStaticSound)
|
|
STOP_SOUND(sTrafficGame.iStaticSound)
|
|
ENDIF
|
|
|
|
IF bTrafficGameAudioSceneActive
|
|
STOP_AUDIO_SCENE("BIG_SCORE_TRAFFIC_CONTROL_SCENE")
|
|
bTrafficGameAudioSceneActive = FALSE
|
|
ENDIF
|
|
|
|
REMOVE_ALL_AUDIO_SCENES()
|
|
|
|
STOP_STREAM()
|
|
bTrafficAudioStreamActive = FALSE
|
|
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(1.0)
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(sTrafficGameCops) i
|
|
REMOVE_PED(sTrafficGameCops[i].ped, TRUE)
|
|
REMOVE_VEHICLE(sTrafficGameCops[i].veh, TRUE)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(sTrafficGameCars) i
|
|
REMOVE_PED(sTrafficGameCars[i].ped, TRUE)
|
|
REMOVE_VEHICLE(sTrafficGameCars[i].veh, TRUE)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(sGoldCars) i
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
|
|
SET_VEHICLE_DOORS_SHUT(sGoldCars[i].veh)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
SETUP_REQ_CREW_HAVE_CORRECT_WEAPONS_FOR_SHOOTOUT()
|
|
SETUP_REQ_GOLD_TROLLEYS_IN_VANS() //Trolley will be offset for buddy, so reset it here.
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_FRONT_RIGHT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOORS_SHUT(sGoldVans[0].veh)
|
|
SET_VEHICLE_DOORS_LOCKED(sGoldVans[0].veh, VEHICLELOCK_UNLOCKED) //In case they were locked earlier.
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, CARREC_COPS_VAN_1, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, 5000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[0].veh)
|
|
SET_HORN_ENABLED(sGoldVans[0].veh, FALSE) //Potential fix for B*598101
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_FRONT_RIGHT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_REAR_RIGHT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOORS_SHUT(sGoldVans[1].veh)
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, CARREC_COPS_VAN_2, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh, 3000.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldVans[1].veh)
|
|
SET_HORN_ENABLED(sGoldVans[1].veh, FALSE)
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<126.9, -1182.5, 28.2951>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), -178.5)
|
|
|
|
//Clear up traffic cam first
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
SET_NOISEOVERIDE(FALSE)
|
|
DESTROY_ALL_CAMS()
|
|
CLEAR_AREA_OF_PEDS(vChaseTriggerStart, 300.0)
|
|
|
|
//Create hobos and get them running away.
|
|
SEQUENCE_INDEX seq
|
|
pedHobos[0] = CREATE_PED(PEDTYPE_CIVMALE, modelHobo, <<129.9348, -1210.9138, 28.2951>>, 183.9956)
|
|
pedHobos[1] = CREATE_PED(PEDTYPE_CIVMALE, modelHobo, <<143.7292, -1197.2333, 28.3355>>, 102.6304)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelHobo)
|
|
|
|
SET_PED_COMPONENT_VARIATION(pedHobos[0], PED_COMP_HEAD, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(pedHobos[0], PED_COMP_HAIR, 2, 0)
|
|
SET_PED_COMPONENT_VARIATION(pedHobos[0], PED_COMP_TORSO, 0, 2)
|
|
SET_PED_COMPONENT_VARIATION(pedHobos[0], PED_COMP_LEG, 0, 2)
|
|
|
|
SET_PED_COMPONENT_VARIATION(pedHobos[1], PED_COMP_HEAD, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(pedHobos[1], PED_COMP_HAIR, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(pedHobos[1], PED_COMP_TORSO, 2, 1)
|
|
SET_PED_COMPONENT_VARIATION(pedHobos[1], PED_COMP_LEG, 0, 1)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedHobos[0], TRUE)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(pedHobos[0], <<133.1677, -1261.4180, 28.4797>>, PEDMOVE_RUN, -1, 0.5, ENAV_NO_STOPPING)
|
|
IF IS_SCREEN_FADED_OUT()
|
|
FORCE_PED_MOTION_STATE(pedHobos[0], MS_ON_FOOT_RUN)
|
|
ENDIF
|
|
TASK_LOOK_AT_ENTITY(pedHobos[0], sGoldVans[0].veh, -1, SLF_WHILE_NOT_IN_FOV)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedHobos[1], TRUE)
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TASK_PAUSE(NULL, 1000)
|
|
ELSE
|
|
TASK_PAUSE(NULL, 500)
|
|
ENDIF
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointHobo, 0, EWAYPOINT_START_FROM_CLOSEST_POINT)
|
|
|
|
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<131.8, -1203.2, 28.6044>>, PEDMOVE_RUN, -1, 0.25, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<132.1, -1209.9, 28.4247>>, PEDMOVE_RUN, -1, 0.5, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<132.4963, -1266.7313, 28.3247>>, PEDMOVE_RUN, -1, 0.5, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(pedHobos[1], seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
TASK_LOOK_AT_ENTITY(pedHobos[1], sGoldVans[1].veh, -1, SLF_WHILE_NOT_IN_FOV)
|
|
|
|
//Lower the budgets in advance (this will also help with cutscene streaming)
|
|
SET_PED_POPULATION_BUDGET(0)
|
|
SET_VEHICLE_POPULATION_BUDGET(0)
|
|
CLEAR_AREA(<<137.9836, -1201.9281, 28.4865>>, 1000.0, TRUE)
|
|
|
|
//camMain = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<139.516541,-1184.388794,32.141018>>,<<-4.597814,0.269738,161.160843>>,26.594543, TRUE)
|
|
//SET_CAM_PARAMS(camMain, <<139.576233,-1184.242798,30.182281>>,<<-1.150314,0.269738,142.363632>>,26.594543, 6000, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
|
|
camMain = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", TRUE)
|
|
PLAY_CAM_ANIM(camMain, "Vans2Cars_Arrival_Camera", strVanArriveCamAnim, <<150.0, -1212.13, 28.27>>, <<0.0, 0.0, 0.0>>)
|
|
|
|
//SHAKE_CAM(camMain, "HAND_SHAKE", 0.4)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2A_TRAFFIC_END")
|
|
|
|
bPlayerInShootoutSafeArea = TRUE
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
|
|
IF STREAMVOL_IS_VALID(svChaseStart)
|
|
STREAMVOL_DELETE(svChaseStart)
|
|
svChaseStart = NULL
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
SETTIMERB(0)
|
|
bSkippedMocap = FALSE
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ELSE
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
UPDATE_TRAFFIC_GAME(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
SWITCH iCurrentEvent
|
|
CASE 0 //Start the mocap after the scripted shot of the vans arriving finishes.
|
|
REQUEST_CUTSCENE("bs_2a_mcs_8")
|
|
REQUEST_WEAPON_ASSET(WEAPONTYPE_CARBINERIFLE)
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_8")
|
|
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ELSE
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
AND ABSF(GET_ENTITY_SPEED(sGoldVans[0].veh)) < 1.0
|
|
AND ABSF(GET_ENTITY_SPEED(sGoldVans[1].veh)) < 1.0
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_CARBINERIFLE)
|
|
AND HAS_CUTSCENE_LOADED()
|
|
/*CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, 1000, TRUE)
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
objMachineGun = CREATE_WEAPON_OBJECT_FROM_CURRENT_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID())
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objMachineGun, "W_AR_AssaultRifle", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)*/
|
|
|
|
FILL_PUSH_IN_DATA(sPushInData, sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CHAR_TREVOR, 0.5, 750, 750, 450, 450, 0.2)
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
|
|
ENDIF
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[0].veh, "Michaels_Truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
|
|
ENDIF
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[1].veh, "Trevors_Truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE, 100)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
|
|
objTrevorsWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], WEAPONTYPE_CARBINERIFLE)
|
|
objDriversWeapon = CREATE_WEAPON_OBJECT(WEAPONTYPE_ASSAULTRIFLE, 100, GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]), TRUE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objTrevorsWeapon, "HC_Gunman_Rifle", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objDriversWeapon, "HC_Driver_Rifle", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_GUNMAN].ped, "gunman_selection_1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_DRIVER].ped, "driver_selection", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldCars[0].veh, "far_right_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldCars[1].veh, "middle_right_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldCars[2].veh, "middle_left_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[3].veh)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldCars[3].veh, "far_left_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
SET_ENTITY_VISIBLE(objGoldTrolleys[0], FALSE)
|
|
SET_ENTITY_VISIBLE(objGoldTrolleys[1], FALSE)
|
|
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
|
|
START_CUTSCENE(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH)
|
|
|
|
SETTIMERB(0)
|
|
bHitCutsceneCamExitState = FALSE
|
|
iMusicTriggerEvent = 0
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF NOT bSkippedMocap
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
bSkippedMocap = TRUE
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
IF iMusicTriggerEvent = 0
|
|
IF GET_CUTSCENE_TIME() > 56000
|
|
TRIGGER_MUSIC_EVENT("FH2A_FIGHT_PRE")
|
|
iMusicTriggerEvent++
|
|
ENDIF
|
|
ELSE
|
|
PREPARE_MUSIC_EVENT("FH2A_FIGHT_MID")
|
|
ENDIF
|
|
|
|
//Set up the first wave of enemies
|
|
IF GET_CUTSCENE_TIME() > 59000
|
|
//From this point onwards they need to be in the cutscene.
|
|
MANAGE_SHOOTOUT_ENEMIES(FALSE, TRUE)
|
|
ELIF GET_CUTSCENE_TIME() > 50000
|
|
//Request the assets.
|
|
MANAGE_SHOOTOUT_ENEMIES(TRUE)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(pedHobos[0])
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
|
|
INT i
|
|
REPEAT COUNT_OF(sGoldCars) i
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
|
|
SET_VEHICLE_DOORS_SHUT(sGoldCars[i].veh)
|
|
SET_VEHICLE_DOOR_OPEN(sGoldCars[i].veh, SC_DOOR_BOOT, FALSE, TRUE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REMOVE_ANIM_DICT(strVanArriveCamAnim)
|
|
|
|
REMOVE_PED(pedHobos[0], TRUE)
|
|
ENDIF
|
|
|
|
|
|
REMOVE_PED(pedHobos[1], TRUE)
|
|
REMOVE_PED(sGoldVanPeds[CASEY_ID].ped, TRUE)
|
|
ENDIF
|
|
|
|
//Get the player into cover at the end of the cutscene.
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, DEFAULT, TRUE, TCF_CLEAR_TASK_INTERRUPT_CHECKS)
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<138.0075, -1201.9452, 28.3113>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 92.3275)
|
|
|
|
REMOVE_COVER_POINT(sTrevor.cover)
|
|
sTrevor.cover = ADD_COVER_POINT(<<138.0075, -1201.9452, 28.3113>>, 182.3275, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
|
|
//If we're in first person then don't place Trevor in cover as it causes issues.
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) != CAM_VIEW_MODE_FIRST_PERSON
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), <<137.9775, -1201.9205, 28.3121>>, 100000, FALSE, 0.0, TRUE, FALSE, sTrevor.cover)
|
|
ELSE
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 108.2275)
|
|
ENDIF
|
|
//GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, 600, TRUE)
|
|
//SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), TRUE)
|
|
//FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_DO_NOTHING, FALSE, FAUS_CUTSCENE_EXIT)
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("HC_Gunman_Rifle")
|
|
GIVE_WEAPON_OBJECT_TO_PED(objTrevorsWeapon, GET_PED_INDEX(CHAR_TREVOR))
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("HC_Driver_Rifle")
|
|
REMOVE_OBJECT(objDriversWeapon, TRUE)
|
|
ENDIF
|
|
|
|
//Move Franklin out of the way so he doesn't pop on screen
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
|
|
SET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN), <<127.7625, -1208.8765, 28.2951>>)
|
|
SET_ENTITY_HEADING(GET_PED_INDEX(CHAR_FRANKLIN), 189.6171)
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(GET_PED_INDEX(CHAR_FRANKLIN), WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(GET_PED_INDEX(CHAR_FRANKLIN), WEAPONTYPE_CARBINERIFLE, 500, TRUE)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(GET_PED_INDEX(CHAR_FRANKLIN), WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
|
|
TASK_AIM_GUN_AT_COORD(GET_PED_INDEX(CHAR_FRANKLIN), <<131.3, -1230.1, 29.8>>, -1, TRUE)
|
|
//FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_PED_INDEX(CHAR_FRANKLIN))
|
|
FORCE_PED_MOTION_STATE(GET_PED_INDEX(CHAR_FRANKLIN), MS_AIMING)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
SET_ENTITY_COORDS(GET_PED_INDEX(CHAR_MICHAEL), <<130.5688, -1202.8179, 28.3423>>)
|
|
SET_ENTITY_HEADING(GET_PED_INDEX(CHAR_MICHAEL), 271.5105)
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(GET_PED_INDEX(CHAR_MICHAEL), WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(GET_PED_INDEX(CHAR_MICHAEL), WEAPONTYPE_CARBINERIFLE, 500, TRUE)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(GET_PED_INDEX(CHAR_MICHAEL), WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
|
|
SET_PED_COVER_POINT_AND_SPHERE(GET_PED_INDEX(CHAR_MICHAEL), sMichael.cover, <<130.5688, -1202.8179, 28.3423>>, 181.5105,
|
|
2.0, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60, FALSE)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(GET_PED_INDEX(CHAR_MICHAEL), <<130.5688, -1202.8179, 28.3423>>, 100000, FALSE, 0.0, TRUE, TRUE, sMichael.cover)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_PED_INDEX(CHAR_MICHAEL))
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//2002220 - Make sure the van doors are open on their exit state.
|
|
IF NOT IS_ENTITY_DEAD(sGoldVans[0].veh)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_Truck")
|
|
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, FALSE)
|
|
SET_ENTITY_COORDS(sGoldVans[0].veh, <<126.4855, -1195.3433, 28.4754>>)
|
|
SET_ENTITY_HEADING(sGoldVans[0].veh, 85.6665)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[0].veh)
|
|
SET_VEHICLE_DOOR_OPEN(sGoldVans[0].veh, SC_DOOR_REAR_LEFT, FALSE, TRUE)
|
|
SET_VEHICLE_DOOR_OPEN(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT, FALSE, TRUE)
|
|
|
|
SET_ENTITY_VISIBLE(objGoldTrolleys[0], TRUE)
|
|
|
|
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] ARRIVAL_CUTSCENE: Exit state for Michaels_Truck has been hit.")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(sGoldVans[1].veh)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_Truck")
|
|
FREEZE_ENTITY_POSITION(sGoldVans[1].veh, FALSE)
|
|
SET_ENTITY_COORDS(sGoldVans[1].veh, <<124.6472, -1199.2728, 28.4650>>)
|
|
SET_ENTITY_HEADING(sGoldVans[1].veh, 89.8633)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[1].veh)
|
|
SET_VEHICLE_DOOR_OPEN(sGoldVans[1].veh, SC_DOOR_REAR_LEFT, FALSE, TRUE)
|
|
SET_VEHICLE_DOOR_OPEN(sGoldVans[1].veh, SC_DOOR_REAR_RIGHT, FALSE, TRUE)
|
|
|
|
SET_ENTITY_VISIBLE(objGoldTrolleys[1], TRUE)
|
|
|
|
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] ARRIVAL_CUTSCENE: Exit state for Trevors_Truck has been hit.")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//2002220 - Move the crew members out of the way of the first-person view.
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("gunman_selection_1")
|
|
SET_ENTITY_COORDS(sCrew[CREW_GUNMAN].ped, <<135.3087, -1190.4631, 28.5013>>)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("driver_selection")
|
|
SET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped, <<131.6153, -1190.9659, 28.5028>>)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) != CAM_VIEW_MODE_FIRST_PERSON
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(180.0 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
ELSE
|
|
RESET_PUSH_IN(sPushInData)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
ENDIF
|
|
|
|
bHitCutsceneCamExitState = TRUE
|
|
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
|
|
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] ARRIVAL_CUTSCENE: Exit state for camera has been hit. Cutscene time = ", GET_CUTSCENE_TIME())
|
|
ENDIF
|
|
|
|
IF NOT bHitCutsceneCamExitState
|
|
//Handle the custom push-in if in first-person mode.
|
|
IF IS_CUTSCENE_PLAYING()
|
|
AND GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
|
|
INT iCamCutTime
|
|
iCamCutTime = 62566
|
|
|
|
//Failsafe in case the cutscene duration changes in the future.
|
|
IF iCamCutTime > GET_CUTSCENE_TOTAL_DURATION()
|
|
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] ARRIVAL_CUTSCENE: Cam cut time is later than the cutscene duration. Cutscene duration = ", GET_CUTSCENE_TOTAL_DURATION())
|
|
|
|
iCamCutTime = GET_CUTSCENE_TOTAL_DURATION()
|
|
ENDIF
|
|
|
|
IF iCamCutTime - GET_CUTSCENE_TIME() <= sPushInData.iCutTime
|
|
//Switch to Trevor during this section
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, DEFAULT, TRUE, TCF_CLEAR_TASK_INTERRUPT_CHECKS)
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
ENDIF
|
|
|
|
//The first-person view is taking the spline position as the direction the player should face after the cutscene. This is because the gameplay cam (which is the normal fallback)
|
|
//is never active during the cutscene. This bit of script forces the gameplay cam to be active so when we cut to first-person it'll take that position instead.
|
|
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(90.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE)
|
|
|
|
BYPASS_CUTSCENE_CAM_RENDERING_THIS_UPDATE()
|
|
HANDLE_PUSH_IN(sPushInData, FALSE, TRUE, TRUE, FALSE, TRUE)
|
|
|
|
//2005416 - Handle the push-in effect manually as the timing seems to be off by 50-100ms when using the header.
|
|
IF NOT sPushInData.bDonePostFX
|
|
IF iCamCutTime - GET_CUTSCENE_TIME() <= 305
|
|
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] ARRIVAL_CUTSCENE: Manually triggering effect, cutscene time = ", GET_CUTSCENE_TIME())
|
|
|
|
ANIMPOSTFX_PLAY("CamPushInTrevor", 0, FALSE)
|
|
sPushInData.bDonePostFX = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
REPLAY_STOP_EVENT()
|
|
|
|
//Casey is no longer needed
|
|
REMOVE_PED(sGoldVanPeds[CASEY_ID].ped, TRUE)
|
|
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 5)
|
|
REMOVE_OBJECT(objTrevorsWeapon, TRUE)
|
|
REMOVE_OBJECT(objDriversWeapon, TRUE)
|
|
REMOVE_PED(pedHobos[0], TRUE)
|
|
REMOVE_PED(pedHobos[1], TRUE)
|
|
REMOVE_ANIM_DICT(strVanArriveCamAnim)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointHobo)
|
|
|
|
SETUP_REQ_BUDDIES_START_FIGHT()
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
SETUP_REQ_GOLD_VANS_AT_TRANSFER_POINT()
|
|
ELSE
|
|
SETUP_REQ_GOLD_VANS_AT_TRANSFER_POINT(FALSE, TRUE, FALSE)
|
|
ENDIF
|
|
|
|
SET_ENTITY_VISIBLE(objGoldTrolleys[0], TRUE)
|
|
SET_ENTITY_VISIBLE(objGoldTrolleys[1], TRUE)
|
|
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
eMissionStage = STAGE_SHOOTOUT
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
DO_FADE_OUT_WITH_WAIT()
|
|
|
|
STOP_CUTSCENE()
|
|
REMOVE_CUTSCENE()
|
|
|
|
WHILE IS_CUTSCENE_ACTIVE()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
RESET_PUSH_IN(sPushInData)
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<137.9836, -1201.9281, 28.4865>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 187.6068)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(180.0 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[0].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldVans[1].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[1].veh)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sCrew[CREW_GUNMAN].ped)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sCrew[CREW_DRIVER].ped)
|
|
ENDIF
|
|
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DO_SHOOTOUT()
|
|
INT i = 0
|
|
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF iCurrentEvent != 99
|
|
IF SETUP_REQ_PLAYER_IS_TREVOR()
|
|
IF bHasUsedCheckpoint
|
|
START_REPLAY_SETUP(<<143.59, -1198.29, 28.2951>>, 0.0, FALSE)
|
|
|
|
iCurrentEvent = 99
|
|
ELSE
|
|
//Fix for B*528757: Guarantee that the tunnel is loaded first before trying to set up everything else.
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<143.59, -1198.29, 28.2951>>)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(GET_ENTITY_COORDS(PLAYER_PED_ID()), 200.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
iCurrentEvent = 99
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF SETUP_REQ_MICHAEL(<<130.1593, -1201.0360, 28.4717>>)
|
|
AND SETUP_REQ_FRANKLIN(<<127.7625, -1208.8765, 28.2951>>)
|
|
AND SETUP_REQ_MAIN_DRIVER(<<124.5559, -1190.2872, 28.2951>>, 173.7492)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<125.5559, -1190.2872, 28.2951>>, 173.7492)
|
|
AND SETUP_REQ_CHASE_CARS_START()
|
|
AND SETUP_REQ_GOLD_VANS_AT_TRANSFER_POINT()
|
|
AND SETUP_REQ_GOLD_TROLLEYS_IN_VANS()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
AND SETUP_REQ_CREW_HAVE_CORRECT_WEAPONS_FOR_SHOOTOUT()
|
|
IF SETUP_REQ_BUDDIES_START_FIGHT()
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
SETUP_FRANKLIN_OUTFIT()
|
|
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<137.9775, -1201.9205, 28.3121>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 177.0091)
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, 600, TRUE)
|
|
ENDIF
|
|
|
|
bPlayerInShootoutSafeArea = TRUE //Set this first as some enemies trigger immediately if it's FALSE.
|
|
|
|
//Create the first shootout set-pieces
|
|
WHILE NOT sCopsStart[0].bIsCreated
|
|
OR NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
OR (NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sCrew[CREW_GUNMAN].ped))
|
|
OR (NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sCrew[CREW_DRIVER].ped))
|
|
OR (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
|
|
OR (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]))
|
|
MANAGE_SHOOTOUT_ENEMIES()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SETUP_REQ_GOLD_VANS_AT_TRANSFER_POINT()
|
|
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_MODEL(modelMerryweather)
|
|
REQUEST_MODEL(modelMerryCar)
|
|
REQUEST_MODEL(modelGoldBar)
|
|
REQUEST_SCRIPT_AUDIO_BANK("FBI_HEIST_3B_SHOOTOUT")
|
|
|
|
IF HAS_MODEL_LOADED(modelMerryweather)
|
|
AND HAS_MODEL_LOADED(modelMerryCar)
|
|
AND HAS_MODEL_LOADED(modelGoldBar)
|
|
//Remove guns from crew.
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
SET_CURRENT_PED_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_UNARMED, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_CURRENT_PED_WEAPON(sCrew[CREW_DRIVER].ped, WEAPONTYPE_UNARMED, TRUE)
|
|
ENDIF
|
|
|
|
//Collision needs to be turned off between the crew members and the cars as the synchronised scenes involve overlapping collision.
|
|
IF NOT IS_ENTITY_DEAD(sGoldCars[0].veh)
|
|
AND NOT IS_ENTITY_DEAD(sGoldCars[1].veh)
|
|
AND NOT IS_ENTITY_DEAD(sGoldCars[2].veh)
|
|
AND NOT IS_ENTITY_DEAD(sGoldCars[3].veh)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[0].veh, sCrew[CREW_GUNMAN].ped, FALSE)
|
|
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[1].veh, sCrew[CREW_GUNMAN].ped, FALSE)
|
|
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[2].veh, sCrew[CREW_DRIVER].ped, FALSE)
|
|
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[3].veh, sCrew[CREW_DRIVER].ped, FALSE)
|
|
ENDIF
|
|
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_POLICE_RADAR_BLIPS(FALSE)
|
|
SET_RANDOM_TRAINS(FALSE)
|
|
sbiStripClub = ADD_SCENARIO_BLOCKING_AREA(<<135.1, -1363.4, 24.0>>, <<144.4, -1189.6, 54.1>>)
|
|
SET_ROADS_IN_AREA(<<-220.0, -1400.0, 0.0>>, <<500.0, -900.0, 100.0>>, FALSE)
|
|
CLEAR_AREA(<<137.9836, -1201.9281, 28.4865>>, 300.0, TRUE)
|
|
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), FALSE)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
|
|
SET_PED_POPULATION_BUDGET(0)
|
|
SET_VEHICLE_POPULATION_BUDGET(0)
|
|
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(TRUE)
|
|
BLOCK_PEDS_SPAWNING_AT_UNDERPASS(TRUE)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_SHOOTOUT")
|
|
START_AUDIO_SCENE("BS_2A_SHOOTOUT")
|
|
ENDIF
|
|
|
|
REMOVE_COVER_POINT(sFranklin.cover)
|
|
REMOVE_COVER_POINT(sMichael.cover)
|
|
REMOVE_COVER_POINT(sTrevor.cover)
|
|
sFranklin.cover = NULL
|
|
sMichael.cover = NULL
|
|
sTrevor.cover = NULL
|
|
|
|
iNumFrontInfiniteEnemiesSpawned = 0
|
|
iNumFlankInfiniteEnemiesSpawned = 0
|
|
iCurrentTake = 0
|
|
iDisplayedTake = iCurrentTake
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
//If we skipped here do some extra setup.
|
|
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, 600, TRUE)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
REMOVE_COVER_POINT(sTrevor.cover)
|
|
sTrevor.cover = ADD_COVER_POINT(<<137.9775, -1201.9205, 28.3121>>, 177.0091, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_0TO60)
|
|
|
|
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) != CAM_VIEW_MODE_FIRST_PERSON
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), <<137.9775, -1201.9205, 28.3121>>, 100000, FALSE, 0.0, TRUE, FALSE, sTrevor.cover)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(180.0 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
ELSE
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 108.2)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
ENDIF
|
|
|
|
SETTIMERB(0)
|
|
|
|
WHILE TIMERB() < 1000
|
|
OR NOT sCopsStart[0].bIsCreated
|
|
MANAGE_SHOOTOUT_ENEMIES()
|
|
|
|
WAIT(0) //B*635611 - Allow some time before fading in.
|
|
ENDWHILE
|
|
|
|
//Make sure the buddies are in a task before fading in (this is more important for first-person view as they're on-screen).
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
|
|
SET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN), <<127.7625, -1208.8765, 28.2951>>)
|
|
SET_ENTITY_HEADING(GET_PED_INDEX(CHAR_FRANKLIN), 271.5105)
|
|
|
|
TASK_AIM_GUN_AT_COORD(GET_PED_INDEX(CHAR_FRANKLIN), <<131.3, -1230.1, 29.8>>, -1, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
SET_ENTITY_COORDS(GET_PED_INDEX(CHAR_MICHAEL), <<130.1593, -1201.0360, 28.4717>>)
|
|
SET_ENTITY_HEADING(GET_PED_INDEX(CHAR_MICHAEL), 271.5105)
|
|
|
|
TASK_AIM_GUN_AT_COORD(GET_PED_INDEX(CHAR_MICHAEL), <<131.3, -1230.1, 29.8>>, -1, TRUE)
|
|
ENDIF
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2A_FIGHT_RESTART")
|
|
ELSE
|
|
TRIGGER_MUSIC_EVENT("FH2A_FIGHT_MID")
|
|
ENDIF
|
|
|
|
//Hide one of the fences at the back, so vehicles can drive through during the shootout.
|
|
CREATE_MODEL_HIDE(<<179.4, -1233.9, 29.2>>, 5.0, modelShootoutFence, TRUE)
|
|
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_SHOOTING)
|
|
|
|
//Remove some other objects just for the shootout.
|
|
iNavmeshBlockShootout[0] = ADD_NAVMESH_BLOCKING_OBJECT(<<176.1, -1232.8, 28.7>>, <<20.0, 5.0, 5.0>>, DEG_TO_RAD(165.3))
|
|
iNavmeshBlockShootout[1] = ADD_NAVMESH_BLOCKING_OBJECT(<<118.9, -1239.1, 28.7>>, <<36.5, 3.0, 2.5>>, DEG_TO_RAD(94.9))
|
|
iNavmeshBlockShootout[2] = ADD_NAVMESH_BLOCKING_OBJECT(<<142.6, -1251.6, 29.6>>, <<15.0, 3.0, 4.5>>, DEG_TO_RAD(121.4))
|
|
iNavmeshBlockShootout[3] = ADD_NAVMESH_BLOCKING_OBJECT(<<161.19191, -1238.521545, 28.2>>, <<22.5, 4.0, 3.5>>, DEG_TO_RAD(-61.3))
|
|
iNavmeshBlockShootout[4] = ADD_NAVMESH_BLOCKING_OBJECT(<<83.4, -1194.3, 28.0>>, <<22.5, 4.0, 3.5>>, DEG_TO_RAD(-87.9))
|
|
SETUP_REQ_REMOVE_JUNK_FOR_SHOOTOUT(TRUE)
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
|
|
|
|
sMichael.vDest = <<0.0, 0.0, 0.0>>
|
|
sFranklin.vDest = <<0.0, 0.0, 0.0>>
|
|
sTrevor.vDest = <<0.0, 0.0, 0.0>>
|
|
sMichael.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT
|
|
sFranklin.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT
|
|
sTrevor.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT
|
|
iTrolleyEmptyingStage[0] = 0
|
|
iTrolleyEmptyingStage[1] = 0
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
//Open the doors on the vans (need to unfreeze them first)
|
|
IF NOT IS_ENTITY_DEAD(sGoldVans[0].veh)
|
|
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, FALSE)
|
|
SET_VEHICLE_DOOR_OPEN(sGoldVans[0].veh, SC_DOOR_REAR_LEFT, FALSE, TRUE)
|
|
SET_VEHICLE_DOOR_OPEN(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(sGoldVans[1].veh)
|
|
FREEZE_ENTITY_POSITION(sGoldVans[1].veh, FALSE)
|
|
SET_VEHICLE_DOOR_OPEN(sGoldVans[1].veh, SC_DOOR_REAR_LEFT, FALSE, TRUE)
|
|
SET_VEHICLE_DOOR_OPEN(sGoldVans[1].veh, SC_DOOR_REAR_RIGHT, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
DISPLAY_TAKE()
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
CLEAR_AREA_OF_VEHICLES(<<137.9836, -1201.9281, 28.4865>>, 300.0)
|
|
ENDIF
|
|
|
|
//Unfreeze the cars for a bit and make sure the boots are open.
|
|
REPEAT COUNT_OF(sGoldCars) i
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
|
|
FREEZE_ENTITY_POSITION(sGoldCars[i].veh, FALSE)
|
|
SET_VEHICLE_DOOR_OPEN(sGoldCars[i].veh, SC_DOOR_BOOT, FALSE, TRUE)
|
|
SET_VEHICLE_DOORS_LOCKED(sGoldCars[i].veh, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
SETTIMERA(0)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_SHOOTOUT, "SHOOTOUT")
|
|
eCurrentPlayer = SELECTOR_PED_TREVOR
|
|
eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_1
|
|
bBuddiesPushedToFlank = FALSE
|
|
bNearInfiniteFlankSpawnArea = FALSE
|
|
bDriverGoldBarsCreated = FALSE
|
|
bGunmanGoldBarsCreated = FALSE
|
|
bInSafeAreaForInfiniteFlankSpawn = FALSE
|
|
bFrozenVehiclesForShootout = FALSE
|
|
iMusicTriggerEvent = 0
|
|
iCurrentEvent = 0
|
|
iSwitchStage = 0
|
|
iShootoutEndTimer = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
BOOL bGunmanDroppedOffGold, bDriverDroppedOffGold
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
TEXT_LABEL strLabel
|
|
//PLAYER_SHOOTOUT_STATE ePlayerState
|
|
//SETUP_REQ_EXTRA_SHOOTOUT_COVER()
|
|
|
|
REQUEST_SCRIPT_AUDIO_BANK("FBI_HEIST_3B_SHOOTOUT")
|
|
|
|
bPlayerInShootoutSafeArea = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<120.063802,-1203.822021,27.795198>>, <<184.646594,-1199.640503,33.555710>>, 51.000000)
|
|
|
|
CHECK_LOCATES_FOR_SHOOTOUT()
|
|
MANAGE_SHOOTOUT_ENEMIES()
|
|
MANAGE_FREE_HOTSWAP()
|
|
|
|
UPDATE_CREW_MEMBER_CARRYING_GOLD(sCrew[CREW_DRIVER], strAnimIG7Driver, iDriverGoldSyncScene, objGoldBarsDriver, bDriverDroppedOffGold, bDriverGoldBarsCreated)
|
|
UPDATE_CREW_MEMBER_CARRYING_GOLD(sCrew[CREW_GUNMAN], strAnimIG7Gunman, iGunmanGoldSyncScene, objGoldBarsGunman, bGunmanDroppedOffGold, bGunmanGoldBarsCreated)
|
|
EMPTY_TROLLEY_DURING_SHOOTOUT(0)
|
|
EMPTY_TROLLEY_DURING_SHOOTOUT(1)
|
|
|
|
//To save on physics processing freeze the vans after the doors are open.
|
|
IF NOT bFrozenVehiclesForShootout
|
|
IF TIMERA() > 500
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
FREEZE_ENTITY_POSITION(sGoldVans[1].veh, TRUE)
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(sGoldCars) i
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
|
|
FREEZE_ENTITY_POSITION(sGoldCars[i].veh, TRUE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
bFrozenVehiclesForShootout = TRUE
|
|
ELSE
|
|
REPEAT COUNT_OF(sGoldCars) i
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
|
|
SET_VEHICLE_DOOR_OPEN(sGoldCars[i].veh, SC_DOOR_BOOT, FALSE, TRUE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//New shootout flow: currently disabled by default.
|
|
IF bDoNewVersionOfShootout
|
|
SWITCH eShootoutState
|
|
CASE SHOOTOUT_STATE_DEFEND_FRONT_1
|
|
IF sNooseRope1[0].iEvent > 0
|
|
OR (iNumAliveCopsStart = 0 AND iNumAliveCopsWave2 = 0)
|
|
iTimeLastFlankingEnemyDamaged = GET_GAME_TIMER()
|
|
eShootoutState = SHOOTOUT_STATE_DEFEND_FLANK_1
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE SHOOTOUT_STATE_DEFEND_FLANK_1
|
|
UPDATE_INFINITE_ENEMIES_FRONT(vPlayerPos, TRUE)
|
|
|
|
IF sVanCrash[0].bIsCreated
|
|
//OR (iNumAliveNooseRope1 = 0 AND iNumAliveVanFlank = 0 AND iNumAliveNooseAbove = 0 AND iNumAliveGoonsWave3b = 0)
|
|
OR (iNumAliveNooseRope1 = 0 AND iNumAliveVanFlank = 0 AND iNumAliveGoonsWave3b = 0)
|
|
//Remove the blocking area to allow the infinite enemies to start running in.
|
|
IF iNavmeshBlockShootout[0] != -1
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(iNavmeshBlockShootout[0])
|
|
iNavmeshBlockShootout[0] = -1
|
|
ENDIF
|
|
|
|
//Clear any peds currently classed as damaged, as the objective was completed.
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
|
|
iTimeLastFrontEnemyDamaged = GET_GAME_TIMER()
|
|
eShootoutState = SHOOTOUT_STATE_DEFEND_FRONT_2
|
|
ELSE
|
|
//Keep the status of the buddies up to date: the player and one buddy go to the left, the other buddy stays at the front.
|
|
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
IF sTrevor.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FRONT
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sTrevor, BUDDY_STATE_DEFENDING_FRONT)
|
|
ENDIF
|
|
|
|
IF sMichael.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FLANK_FAR
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sMichael, BUDDY_STATE_DEFENDING_FLANK_FAR)
|
|
ENDIF
|
|
|
|
IF sFranklin.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FLANK_FAR
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sFranklin, BUDDY_STATE_DEFENDING_FLANK_FAR)
|
|
ENDIF
|
|
ELIF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
IF sTrevor.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FLANK_FAR
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sTrevor, BUDDY_STATE_DEFENDING_FLANK_FAR)
|
|
ENDIF
|
|
|
|
IF sMichael.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FLANK_FAR
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sMichael, BUDDY_STATE_DEFENDING_FLANK_FAR)
|
|
ENDIF
|
|
|
|
IF sFranklin.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FRONT
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sFranklin, BUDDY_STATE_DEFENDING_FRONT)
|
|
ENDIF
|
|
ELIF eCurrentPlayer = SELECTOR_PED_TREVOR
|
|
IF sTrevor.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FLANK_FAR
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sTrevor, BUDDY_STATE_DEFENDING_FLANK_FAR)
|
|
ENDIF
|
|
|
|
IF sMichael.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FLANK_FAR
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sMichael, BUDDY_STATE_DEFENDING_FLANK_FAR)
|
|
ENDIF
|
|
|
|
IF sFranklin.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FRONT
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sFranklin, BUDDY_STATE_DEFENDING_FRONT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If the player doesn't go to defend the flank then flag any buddy peds there as in danger.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF (sMichael.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FLANK_FAR)
|
|
IF GET_GAME_TIMER() - sMichael.iTimeOfShootoutRouteSwitch > 10000
|
|
AND GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged > 10000
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, TRUE)
|
|
|
|
//Kill the buddy if the player doesn't go over after 30 seconds.
|
|
IF GET_GAME_TIMER() - sMichael.iTimeOfShootoutRouteSwitch > 30000
|
|
AND GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged > 30000
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
APPLY_DAMAGE_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 4000, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play dialogue if they're in trouble.
|
|
IF NOT bHasTextLabelTriggered[FH3A_KOSHM]
|
|
IF GET_GAME_TIMER() - sMichael.iTimeOfShootoutRouteSwitch > 15000
|
|
AND GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged > 15000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_KOSHM", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_KOSHM] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
|
|
ENDIF
|
|
ELSE
|
|
sMichael.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER()
|
|
bHasTextLabelTriggered[FH3A_KOSHM] = FALSE
|
|
ENDIF
|
|
ELSE
|
|
//This is the player, turn off and adjust the timer so switching away doesn't turn them red immediately.
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
|
|
|
|
IF GET_GAME_TIMER() - sMichael.iTimeOfShootoutRouteSwitch > 7000
|
|
sMichael.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER() - 7000
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF (sTrevor.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FLANK_FAR)
|
|
IF GET_GAME_TIMER() - sTrevor.iTimeOfShootoutRouteSwitch > 10000
|
|
AND GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged > 10000
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, TRUE)
|
|
|
|
//Kill the buddy if the player doesn't go over after 30 seconds.
|
|
IF GET_GAME_TIMER() - sTrevor.iTimeOfShootoutRouteSwitch > 30000
|
|
AND GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged > 30000
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
APPLY_DAMAGE_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 4000, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play dialogue if they're in trouble.
|
|
IF NOT bHasTextLabelTriggered[FH3A_KOSHT]
|
|
IF GET_GAME_TIMER() - sTrevor.iTimeOfShootoutRouteSwitch > 15000
|
|
AND GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged > 15000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_KOSHT", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_KOSHT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
|
|
ENDIF
|
|
ELSE
|
|
sTrevor.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER()
|
|
bHasTextLabelTriggered[FH3A_KOSHT] = FALSE
|
|
ENDIF
|
|
ELSE
|
|
//This is the player, turn off and adjust the timer so switching away doesn't turn them red immediately.
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
|
|
|
|
IF GET_GAME_TIMER() - sTrevor.iTimeOfShootoutRouteSwitch > 7000
|
|
sTrevor.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER() - 7000
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF (sFranklin.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FLANK_FAR)
|
|
IF GET_GAME_TIMER() - sFranklin.iTimeOfShootoutRouteSwitch > 10000
|
|
AND GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged > 10000
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, TRUE)
|
|
|
|
//Kill the buddy if the player doesn't go over after 30 seconds.
|
|
IF GET_GAME_TIMER() - sFranklin.iTimeOfShootoutRouteSwitch > 30000
|
|
AND GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged > 30000
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
APPLY_DAMAGE_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 4000, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play dialogue if they're in trouble.
|
|
IF NOT bHasTextLabelTriggered[FH3A_KOSHF]
|
|
IF GET_GAME_TIMER() - sFranklin.iTimeOfShootoutRouteSwitch > 15000
|
|
AND GET_GAME_TIMER() - iTimeLastFlankingEnemyDamaged > 15000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_KOSHF", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_KOSHF] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
ENDIF
|
|
ELSE
|
|
sFranklin.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER()
|
|
bHasTextLabelTriggered[FH3A_KOSHF] = FALSE
|
|
ENDIF
|
|
ELSE
|
|
//This is the player, turn off and adjust the timer so switching away doesn't turn them red immediately.
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
|
|
IF GET_GAME_TIMER() - sFranklin.iTimeOfShootoutRouteSwitch > 7000
|
|
sFranklin.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER() - 7000
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some dialogue from whoever is staying to cover the front.
|
|
IF NOT bHasTextLabelTriggered[FH3A_FRONT]
|
|
IF bHasTextLabelTriggered[FH3A_LOOKL]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND (sMichael.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
|
|
strLabel = "FH3A_MFRONT"
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND (sTrevor.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
|
|
strLabel = "FH3A_TFRONT"
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
AND (sFranklin.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
|
|
strLabel = "FH3A_FFRONT"
|
|
ENDIF
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_FRONT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE SHOOTOUT_STATE_DEFEND_FRONT_2
|
|
UPDATE_INFINITE_ENEMIES_FRONT(vPlayerPos, FALSE)
|
|
UPDATE_INFINITE_ENEMIES_FLANK(vPlayerPos, TRUE)
|
|
|
|
IF (iNumAliveVanCrash = 0 AND iNumAliveGoonsSnipe = 0)
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sTrevor, BUDDY_STATE_DEFENDING_FLANK_FAR)
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sMichael, BUDDY_STATE_DEFENDING_FLANK_FAR)
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sFranklin, BUDDY_STATE_DEFENDING_FLANK_FAR)
|
|
|
|
//Clear any peds currently classed as damaged, as the objective was completed.
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
|
|
eShootoutState = SHOOTOUT_STATE_KILL_REMAINDER
|
|
ELSE
|
|
//Keep the status of the buddies up to date: the player and one buddy go to the front, the other buddy stays at the left.
|
|
IF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
IF sTrevor.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FRONT
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sTrevor, BUDDY_STATE_DEFENDING_FRONT)
|
|
ENDIF
|
|
|
|
IF sMichael.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FLANK_FAR
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sMichael, BUDDY_STATE_DEFENDING_FLANK_FAR)
|
|
ENDIF
|
|
|
|
IF sFranklin.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FRONT
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sFranklin, BUDDY_STATE_DEFENDING_FRONT)
|
|
ENDIF
|
|
ELIF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
IF sTrevor.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FLANK_FAR
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sTrevor, BUDDY_STATE_DEFENDING_FLANK_FAR)
|
|
ENDIF
|
|
|
|
IF sMichael.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FRONT
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sMichael, BUDDY_STATE_DEFENDING_FRONT)
|
|
ENDIF
|
|
|
|
IF sFranklin.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FRONT
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sFranklin, BUDDY_STATE_DEFENDING_FRONT)
|
|
ENDIF
|
|
ELIF eCurrentPlayer = SELECTOR_PED_TREVOR
|
|
IF sTrevor.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FRONT
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sTrevor, BUDDY_STATE_DEFENDING_FRONT)
|
|
ENDIF
|
|
|
|
IF sMichael.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FLANK_FAR
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sMichael, BUDDY_STATE_DEFENDING_FLANK_FAR)
|
|
ENDIF
|
|
|
|
IF sFranklin.eBuddyShootoutState != BUDDY_STATE_DEFENDING_FRONT
|
|
SET_SELECTOR_PED_SHOOTOUT_STATE(sFranklin, BUDDY_STATE_DEFENDING_FRONT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If the player doesn't go to defend the front then flag any buddy peds there as in danger.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF (sMichael.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
|
|
IF GET_GAME_TIMER() - sMichael.iTimeOfShootoutRouteSwitch > 10000
|
|
AND GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged > 10000
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, TRUE)
|
|
|
|
//Kill the buddy if the player doesn't go over after 30 seconds.
|
|
IF GET_GAME_TIMER() - sMichael.iTimeOfShootoutRouteSwitch > 30000
|
|
AND GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged > 30000
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
APPLY_DAMAGE_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 4000, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play dialogue if they're in trouble.
|
|
IF NOT bHasTextLabelTriggered[FH3A_KOSHM]
|
|
IF GET_GAME_TIMER() - sMichael.iTimeOfShootoutRouteSwitch > 15000
|
|
AND GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged > 15000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_KOSHM", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_KOSHM] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
|
|
ENDIF
|
|
ELSE
|
|
sMichael.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER()
|
|
bHasTextLabelTriggered[FH3A_KOSHM] = FALSE
|
|
ENDIF
|
|
ELSE
|
|
//This is the player, turn off and adjust the timer so switching away doesn't turn them red immediately.
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
|
|
|
|
IF GET_GAME_TIMER() - sMichael.iTimeOfShootoutRouteSwitch > 7000
|
|
sMichael.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER() - 7000
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF (sTrevor.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
|
|
IF GET_GAME_TIMER() - sTrevor.iTimeOfShootoutRouteSwitch > 10000
|
|
AND GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged > 10000
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, TRUE)
|
|
|
|
//Kill the buddy if the player doesn't go over after 30 seconds.
|
|
IF GET_GAME_TIMER() - sTrevor.iTimeOfShootoutRouteSwitch > 30000
|
|
AND GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged > 30000
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
APPLY_DAMAGE_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 4000, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play dialogue if they're in trouble.
|
|
IF NOT bHasTextLabelTriggered[FH3A_KOSHT]
|
|
IF GET_GAME_TIMER() - sTrevor.iTimeOfShootoutRouteSwitch > 15000
|
|
AND GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged > 15000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_KOSHT", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_KOSHT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
|
|
ENDIF
|
|
ELSE
|
|
sTrevor.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER()
|
|
bHasTextLabelTriggered[FH3A_KOSHT] = FALSE
|
|
ENDIF
|
|
ELSE
|
|
//This is the player, turn off and adjust the timer so switching away doesn't turn them red immediately.
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
|
|
|
|
IF GET_GAME_TIMER() - sTrevor.iTimeOfShootoutRouteSwitch > 7000
|
|
sTrevor.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER() - 7000
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF (sFranklin.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
|
|
IF GET_GAME_TIMER() - sFranklin.iTimeOfShootoutRouteSwitch > 10000
|
|
AND GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged > 10000
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, TRUE)
|
|
|
|
//Kill the buddy if the player doesn't go over after 30 seconds.
|
|
IF GET_GAME_TIMER() - sFranklin.iTimeOfShootoutRouteSwitch > 30000
|
|
AND GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged > 30000
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
APPLY_DAMAGE_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 4000, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play dialogue if they're in trouble.
|
|
IF NOT bHasTextLabelTriggered[FH3A_KOSHF]
|
|
IF GET_GAME_TIMER() - sFranklin.iTimeOfShootoutRouteSwitch > 15000
|
|
AND GET_GAME_TIMER() - iTimeLastFrontEnemyDamaged > 15000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_KOSHF", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_KOSHF] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
ENDIF
|
|
ELSE
|
|
sFranklin.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER()
|
|
bHasTextLabelTriggered[FH3A_KOSHF] = FALSE
|
|
ENDIF
|
|
ELSE
|
|
//This is the player, turn off and adjust the timer so switching away doesn't turn them red immediately.
|
|
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
|
|
|
|
IF GET_GAME_TIMER() - sFranklin.iTimeOfShootoutRouteSwitch > 7000
|
|
sFranklin.iTimeOfShootoutRouteSwitch = GET_GAME_TIMER() - 7000
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Dialogue to play during the transition back to the front.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT bHasTextLabelTriggered[FH3A_FRONT2]
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND (sMichael.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
|
|
strLabel = "FH3A_MFRONT2"
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND (sTrevor.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
|
|
strLabel = "FH3A_TFRONT2"
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
AND (sFranklin.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
|
|
strLabel = "FH3A_FFRONT2"
|
|
ENDIF
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_FRONT2] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_STAY]
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND (sMichael.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FLANK_CLOSE OR sMichael.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FLANK_FAR)
|
|
strLabel = "FH3A_MSTAY"
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND (sTrevor.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FLANK_CLOSE OR sTrevor.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FLANK_FAR)
|
|
strLabel = "FH3A_TSTAY"
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
AND (sFranklin.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FLANK_CLOSE OR sFranklin.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FLANK_FAR)
|
|
strLabel = "FH3A_FSTAY"
|
|
ENDIF
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_STAY] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Dialogue for the snipers.
|
|
IF NOT bHasTextLabelTriggered[FH3A_SNIPE]
|
|
IF sGoonsSnipe[0].bIsCreated
|
|
PED_INDEX pedBuddyToSpeak
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND (sMichael.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
|
|
strLabel = "FH3A_MSNIPE"
|
|
pedBuddyToSpeak = sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND (sTrevor.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
|
|
strLabel = "FH3A_TSNIPE"
|
|
pedBuddyToSpeak = sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
AND (sFranklin.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
|
|
strLabel = "FH3A_FSNIPE"
|
|
pedBuddyToSpeak = sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(pedBuddyToSpeak)
|
|
IF VDIST2(GET_ENTITY_COORDS(pedBuddyToSpeak), vPlayerPos) < 225.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_SNIPE] = TRUE
|
|
iTimeSniperDialogueTriggered = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF iNumAliveGoonsSnipe > 0
|
|
//Play dialogue if snipers not killed after a while
|
|
IF NOT bHasTextLabelTriggered[FH3A_OUT]
|
|
IF GET_GAME_TIMER() - iTimeSniperDialogueTriggered > 12000
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND (sMichael.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
|
|
strLabel = "FH3A_OUTM"
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND (sTrevor.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
|
|
strLabel = "FH3A_OUTT"
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
AND (sFranklin.eBuddyShootoutState = BUDDY_STATE_DEFENDING_FRONT)
|
|
strLabel = "FH3A_OUTF"
|
|
ENDIF
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_OUT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Play dialogue immediately after the snipers are killed (the person who killed them speaks).
|
|
IF NOT bHasTextLabelTriggered[FH3A_GONE]
|
|
IF GET_GAME_TIMER() - iTimeSnipersKilledByPlayer < 2000
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
strLabel = "FH3A_GONEM"
|
|
ELIF eCurrentPlayer = SELECTOR_PED_TREVOR
|
|
strLabel = "FH3A_GONET"
|
|
ELIF eCurrentPlayer = SELECTOR_PED_FRANKLIN
|
|
strLabel = "FH3A_GONEF"
|
|
ENDIF
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", strLabel, CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_GONE] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bHasTextLabelTriggered[FH3A_GONE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE SHOOTOUT_STATE_KILL_REMAINDER
|
|
UPDATE_INFINITE_ENEMIES_FRONT(vPlayerPos, FALSE)
|
|
UPDATE_INFINITE_ENEMIES_FLANK(vPlayerPos, FALSE)
|
|
|
|
INT iNumEnemiesLeft
|
|
iNumEnemiesLeft = iNumAliveNooseRope1 + iNumAliveVanCrash + iNumAliveVanFlank + iNumAliveCopsStart + iNumAliveCopsWave2 + iNumAliveGoonsWave3b + iNumAliveInfiniteEnemiesFront + iNumAliveInfiniteEnemiesFlank
|
|
|
|
IF iNumEnemiesLeft = 0
|
|
//All enemies are dead, time to cleanup
|
|
IF sGoonsWave3b[0].bIsCreated
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_TRIGGER, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_1, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_2, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(iCarrecChaseBuddy3, strCarrec)
|
|
REQUEST_MODEL(modelChaseCars)
|
|
ENDIF
|
|
|
|
IF iShootoutEndTimer = 0
|
|
iShootoutEndTimer = GET_GAME_TIMER()
|
|
ELSE
|
|
IF NOT bHasTextLabelTriggered[FH3A_SHEND]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SHEND", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_SHEND] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - iShootoutEndTimer > 3000
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
IF (bHasTextLabelTriggered[FH3A_SHEND] AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF))
|
|
OR GET_GAME_TIMER() - iShootoutEndTimer > 10000
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play some dialogue from Michael if we picked bad crew members to carry the gold.
|
|
IF NOT bPickedGoodGunman
|
|
OR NOT bPickedGoodCarDriver
|
|
IF NOT bHasTextLabelTriggered[FH3A_EXPLAIN]
|
|
IF iNumEnemiesLeft < 4
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, NULL, "LESTER")
|
|
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_EXPLAIN", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_EXPLAIN] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_NOTIME]
|
|
IF iNumEnemiesLeft < 3
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF eCurrentPlayer = SELECTOR_PED_MICHAEL
|
|
OR (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) AND VDIST2(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]), vPlayerPos) < 625.0)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_NOTIME1", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_NOTIME] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0 //Main fight
|
|
//Note: the buddy behaviour has to come after deciding the routes, otherwise there's a single frame where the buddies think they're on the player's old route after a switch.
|
|
IF bDoNewVersionOfShootout
|
|
UPDATE_MICHAEL_DURING_SHOOTOUT()
|
|
UPDATE_FRANKLIN_DURING_SHOOTOUT()
|
|
UPDATE_TREVOR_DURING_SHOOTOUT()
|
|
ELSE
|
|
|
|
ENDIF
|
|
|
|
IF bPlayerInShootoutSafeArea
|
|
IF DOES_BLIP_EXIST(sCrew[CREW_GUNMAN].blip)
|
|
REMOVE_BLIP(sCrew[CREW_GUNMAN].blip)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sCrew[CREW_DRIVER].blip)
|
|
REMOVE_BLIP(sCrew[CREW_DRIVER].blip)
|
|
ENDIF
|
|
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("F3A_ABANCREW")
|
|
CLEAR_PRINTS()
|
|
ENDIF
|
|
|
|
IF NOT bHasTextLabelTriggered[F3A_KILLCOPS]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_NOW("F3A_KILLCOPS", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[F3A_KILLCOPS] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play dialogue for the second wave.
|
|
IF NOT bHasTextLabelTriggered[FH3A_CAR]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF sCopsWave2[0].iEvent > 0
|
|
IF GET_PLAYER_MODEL() = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_CARM", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_CAR] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_CAR", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_CAR] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Play dialogue when guys are on the bridge.
|
|
/*IF NOT bHasTextLabelTriggered[FH3A_LOOKUP]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF sNooseAbove[0].iEvent > 0
|
|
IF iBridgeNooseDialogueTimer = 0
|
|
iBridgeNooseDialogueTimer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - iBridgeNooseDialogueTimer > 3000
|
|
IF GET_PLAYER_MODEL() = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LOOKUP", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_LOOKUP] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LOOKT", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_LOOKUP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
//Play dialogue when the guys try to flank
|
|
IF NOT bHasTextLabelTriggered[FH3A_LOOKL]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF sNooseRope1[0].iEvent > 0
|
|
IF GET_PLAYER_MODEL() = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LOOKL", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_LOOKL] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LOOKLT", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_LOOKL] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
UPDATE_SHOOTOUT_DIALOGUE()
|
|
|
|
IF NOT bDoNewVersionOfShootout
|
|
IF iNumAliveNooseRope1 = 0
|
|
AND iNumAliveVanCrash = 0
|
|
AND iNumAliveVanFlank = 0
|
|
//AND iNumAliveNooseAbove = 0
|
|
AND iNumAliveCopsStart = 0
|
|
AND iNumAliveCopsWave2 = 0
|
|
AND iNumAliveGoonsWave3b = 0
|
|
//Request chase start assets in advance
|
|
IF sGoonsWave3b[0].bIsCreated
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_TRIGGER, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_1, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_2, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(iCarrecChaseBuddy3, strCarrec)
|
|
REQUEST_MODEL(modelChaseCars)
|
|
ENDIF
|
|
|
|
IF iShootoutEndTimer = 0
|
|
iShootoutEndTimer = GET_GAME_TIMER()
|
|
ELSE
|
|
IF NOT bHasTextLabelTriggered[FH3A_SHEND]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SHEND", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_SHEND] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - iShootoutEndTimer > 3000
|
|
IF (bHasTextLabelTriggered[FH3A_SHEND] AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF))
|
|
OR GET_GAME_TIMER() - iShootoutEndTimer > 10000
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_BLIP_EXIST(sCrew[CREW_GUNMAN].blip)
|
|
sCrew[CREW_GUNMAN].blip = CREATE_BLIP_FOR_ENTITY(sCrew[CREW_GUNMAN].ped)
|
|
sCrew[CREW_DRIVER].blip = CREATE_BLIP_FOR_ENTITY(sCrew[CREW_DRIVER].ped)
|
|
ENDIF
|
|
|
|
IF NOT bHasTextLabelTriggered[F3A_ABANCREW]
|
|
PRINT_NOW("F3A_ABANCREW", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[F3A_ABANCREW] = TRUE
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<93.896111,-1205.677368,27.795156>>, <<196.813644,-1198.531616,35.795170>>, 105.000000)
|
|
OR bNearInfiniteFlankSpawnArea
|
|
MISSION_FAILED(FAILED_ABANDONED_SHOOTOUT_CREW)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Update buddy blips: remove the blip for whoever is the player, add blips for other buddies.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
IF NOT DOES_BLIP_EXIST(sFranklin.blip)
|
|
sFranklin.blip = CREATE_BLIP_FOR_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_BLIP_EXIST(sFranklin.blip)
|
|
REMOVE_BLIP(sFranklin.blip)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF NOT DOES_BLIP_EXIST(sMichael.blip)
|
|
sMichael.blip = CREATE_BLIP_FOR_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_BLIP_EXIST(sMichael.blip)
|
|
REMOVE_BLIP(sMichael.blip)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF NOT DOES_BLIP_EXIST(sTrevor.blip)
|
|
sTrevor.blip = CREATE_BLIP_FOR_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_BLIP_EXIST(sTrevor.blip)
|
|
REMOVE_BLIP(sTrevor.blip)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Dialogue:
|
|
|
|
//If the shootout hasn't finished yet then play general dialogue.
|
|
IF iShootoutEndTimer = 0
|
|
UPDATE_BUDDY_SHOOTOUT_DIALOGUE(vPlayerPos)
|
|
ENDIF
|
|
|
|
//Music events: trigger event mid-way into the shootout.
|
|
IF iMusicTriggerEvent = 0
|
|
IF TIMERA() > 10000
|
|
PREPARE_MUSIC_EVENT("FH2A_FIGHT_DROP")
|
|
ENDIF
|
|
|
|
IF TIMERA() > 30000
|
|
TRIGGER_MUSIC_EVENT("FH2A_FIGHT_DROP")
|
|
iMusicTriggerEvent++
|
|
ELSE
|
|
//If the shootout was completed before the music change takes place then it needs to be cancelled.
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
CANCEL_MUSIC_EVENT("FH2A_FIGHT_DROP")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
//Work out what the take should be: when the crew drop gold the take goes up a little bit, the rest is determined by killing enemies.
|
|
INT iDesiredTake = CONVERT_SHOOTOUT_PROGRESS_INTO_TAKE(iMaxTakeConsideringCrew)
|
|
|
|
IF iCurrentTake < iMaxTakeConsideringCrew
|
|
IF bGunmanDroppedOffGold
|
|
iCurrentTake += 500000
|
|
ENDIF
|
|
|
|
IF bDriverDroppedOffGold
|
|
iCurrentTake += 500000
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF iDesiredTake > iCurrentTake
|
|
iCurrentTake = iDesiredTake
|
|
ENDIF
|
|
|
|
IF iCurrentTake > iMaxTakeConsideringCrew
|
|
iCurrentTake = iMaxTakeConsideringCrew
|
|
ENDIF
|
|
|
|
DISPLAY_TAKE()
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(8.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
MANAGE_SHOOTOUT_ENEMIES() //Call this once more to ensure all enemies are guaranteed to be cleaned up
|
|
|
|
REMOVE_ANIM_DICT(strRappelAnims)
|
|
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold1A)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold1B)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold1C)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold2A)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold2B)
|
|
REMOVE_WAYPOINT_RECORDING(strWaypointLoadGold2C)
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_VAN_1, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_VAN_2, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_COP_1, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_COPS_COP_2, strCarrec)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelMerryweather)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelMerryCar)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldBar)
|
|
|
|
REMOVE_VEHICLE_ASSET(modelMerryCar)
|
|
REMOVE_WEAPON_ASSET(WEAPONTYPE_CARBINERIFLE)
|
|
REMOVE_WEAPON_ASSET(WEAPONTYPE_ADVANCEDRIFLE)
|
|
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
|
|
|
|
//REMOVE_OBJECT(objShootoutPallet, FALSE)
|
|
REMOVE_OBJECT(objShootoutCover, FALSE)
|
|
|
|
REPEAT COUNT_OF(iNavmeshBlockShootout) i
|
|
IF iNavmeshBlockShootout[i] != -1
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(iNavmeshBlockShootout[i])
|
|
iNavmeshBlockShootout[i] = -1
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
SET_ROADS_BACK_TO_ORIGINAL(<<-220.0, -1400.0, 0.0>>, <<500.0, -900.0, 100.0>>)
|
|
|
|
SETTIMERA(0)
|
|
|
|
eMissionStage = STAGE_CHASE_START_CUTSCENE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_CHASE_START_CUTSCENE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC CHASE_START_CUTSCENE()
|
|
INT i = 0
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF SETUP_REQ_PLAYER_IS_TREVOR()
|
|
IF SETUP_REQ_MICHAEL(<<140.4548, -1202.2416, 28.2951>>)
|
|
AND SETUP_REQ_FRANKLIN(<<141.4548, -1202.2416, 28.2951>>)
|
|
AND SETUP_REQ_MAIN_DRIVER(<<124.5559, -1190.2872, 28.2951>>, 173.7492)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<125.5559, -1190.2872, 28.2951>>, 173.7492)
|
|
AND SETUP_REQ_CHASE_CARS_START()
|
|
AND SETUP_REQ_GOLD_VANS_AT_TRANSFER_POINT()
|
|
AND SETUP_REQ_GOLD_TROLLEYS_IN_VANS()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
IF SETUP_REQ_BUDDIES_START_FIGHT()
|
|
SETUP_FRANKLIN_OUTFIT()
|
|
|
|
REPEAT COUNT_OF(sGoldCars) i
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
|
|
SET_VEHICLE_DOOR_SHUT(sGoldCars[i].veh, SC_DOOR_BOOT)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
LOAD_SCENE(<<140.4548, -1202.2416, 28.2951>>)
|
|
|
|
WHILE NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
AND (NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sCrew[CREW_GUNMAN].ped))
|
|
AND (NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sCrew[CREW_DRIVER].ped))
|
|
AND (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
|
|
AND (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]))
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
WAIT(1000)
|
|
|
|
BLOCK_PEDS_SPAWNING_AT_UNDERPASS(TRUE)
|
|
SETUP_REQ_BURST_MICHAELS_VAN_TYRE()
|
|
CLEAR_AREA_OF_PEDS(vChaseTriggerStart, 300.0)
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_TRIGGER, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_1, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_2, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(iCarrecChaseBuddy3, strCarrec)
|
|
REQUEST_MODEL(modelChaseCars)
|
|
REQUEST_MODEL(modelEmptyTrolley)
|
|
REQUEST_CUTSCENE("bs_2a_mcs_8_p3")
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_8_p3")
|
|
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_TRIGGER, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_1, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_2, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrecChaseBuddy3, strCarrec)
|
|
AND HAS_MODEL_LOADED(modelChaseCars)
|
|
AND HAS_MODEL_LOADED(modelEmptyTrolley)
|
|
AND HAS_CUTSCENE_LOADED()
|
|
AND TIMERA() > 1500 //Timer is set at the end of the previous section.
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2A_FIGHT_RESTART")
|
|
|
|
WAIT(0)
|
|
ENDIF
|
|
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("FBI_HEIST_3B_SHOOTOUT")
|
|
|
|
REPEAT COUNT_OF(sGoldCars) i
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
|
|
FREEZE_ENTITY_POSITION(sGoldCars[i].veh, FALSE)
|
|
SET_VEHICLE_DOORS_LOCKED(sGoldCars[i].veh, VEHICLELOCK_UNLOCKED)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
bUberPlaybackHasStartedFromMocap = FALSE
|
|
iCurrentTake = iMaxTakeConsideringCrew
|
|
iDisplayedTake = iCurrentTake
|
|
|
|
vehChaseTrigger = CREATE_VEHICLE(modelChaseCars, vChaseTriggerStart, fChaseTriggerHeading)
|
|
SET_ENTITY_COLLISION(vehChaseTrigger, FALSE)
|
|
SET_ENTITY_VISIBLE(vehChaseTrigger, FALSE)
|
|
SET_ENTITY_INVINCIBLE(vehChaseTrigger, TRUE)
|
|
FREEZE_ENTITY_POSITION(vehChaseTrigger, TRUE)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelChaseCars)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, FALSE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[0].veh, "Michaels_truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
FREEZE_ENTITY_POSITION(sGoldVans[1].veh, FALSE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldVans[1].veh, "Trevors_truck", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sCrew[CREW_GUNMAN].ped, INSTANT_BLEND_OUT, TRUE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_GUNMAN].ped, "gunman_selection_1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sCrew[CREW_DRIVER].ped, INSTANT_BLEND_OUT, TRUE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sCrew[CREW_DRIVER].ped, "driver_selection", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldCars[0].veh, "far_right_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldCars[1].veh, "middle_right_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldCars[2].veh, "middle_left_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[3].veh)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sGoldCars[3].veh, "far_left_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
objEmptyTrolleys[0] = CREATE_OBJECT(modelEmptyTrolley, GET_ENTITY_COORDS(PLAYER_PED_ID()) - <<0.0, 0.0, 50.0>>)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objEmptyTrolleys[0], "GoldEmpty", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
objEmptyTrolleys[1] = CREATE_OBJECT(modelEmptyTrolley, GET_ENTITY_COORDS(PLAYER_PED_ID()) - <<0.0, 0.0, 55.0>>)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objEmptyTrolleys[1], "GoldEmpty^1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelEmptyTrolley)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelContainerAlt1)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelContainerAlt2)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelContainerAlt3)
|
|
|
|
//Reset the no-collision flags from earlier.
|
|
IF NOT IS_ENTITY_DEAD(sGoldCars[0].veh)
|
|
AND NOT IS_ENTITY_DEAD(sGoldCars[1].veh)
|
|
AND NOT IS_ENTITY_DEAD(sGoldCars[2].veh)
|
|
AND NOT IS_ENTITY_DEAD(sGoldCars[3].veh)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
AND NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[0].veh, sCrew[CREW_GUNMAN].ped, TRUE)
|
|
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[1].veh, sCrew[CREW_GUNMAN].ped, TRUE)
|
|
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[2].veh, sCrew[CREW_DRIVER].ped, TRUE)
|
|
SET_ENTITY_NO_COLLISION_ENTITY(sGoldCars[3].veh, sCrew[CREW_DRIVER].ped, TRUE)
|
|
ENDIF
|
|
|
|
REPEAT COUNT_OF(objGoldBarsDriver) i
|
|
REMOVE_OBJECT(objGoldBarsDriver[i], TRUE)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(objGoldBarsGunman) i
|
|
REMOVE_OBJECT(objGoldBarsGunman[i], TRUE)
|
|
ENDREPEAT
|
|
|
|
REMOVE_ANIM_DICT(strAnimIG7Driver)
|
|
REMOVE_ANIM_DICT(strAnimIG7Gunman)
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iMoneyCountSoundID)
|
|
STOP_SOUND(iMoneyCountSoundID)
|
|
ENDIF
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2A_FIGHT_END")
|
|
|
|
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_BigScoreSubtle")
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
START_CUTSCENE()
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
SETTIMERB(0)
|
|
|
|
|
|
|
|
REMOVE_ALL_AUDIO_SCENES()
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
IF NOT bSkippedMocap
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
bSkippedMocap = TRUE
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0
|
|
IF IS_CUTSCENE_PLAYING()
|
|
//Remove the cars when the cutscene starts to avoid any popping issues.
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
REMOVE_ALL_BLIPS()
|
|
CLEAR_ANGLED_AREA_OF_VEHICLES(<<134.162811,-1198.184937,25.988131>>, <<132.339874,-1275.314819,33.051426>>, 8.750000)
|
|
CLEAR_AREA_OF_OBJECTS(<<134.8234, -1196.9601, 28.4795>>, 20.0)
|
|
CLEAR_AREA_OF_PROJECTILES(<<134.8234, -1196.9601, 28.4795>>, 20.0)
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehCopsStart[0])
|
|
AND IS_ENTITY_IN_ANGLED_AREA(vehCopsStart[0], <<134.162811,-1198.184937,25.988131>>, <<132.339874,-1275.314819,33.051426>>, 8.750000)
|
|
REMOVE_VEHICLE(vehCopsStart[0], TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehCopsStart[1])
|
|
AND IS_ENTITY_IN_ANGLED_AREA(vehCopsStart[1], <<134.162811,-1198.184937,25.988131>>, <<132.339874,-1275.314819,33.051426>>, 8.750000)
|
|
REMOVE_VEHICLE(vehCopsStart[1], TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehCopsWave2)
|
|
AND IS_ENTITY_IN_ANGLED_AREA(vehCopsWave2, <<134.162811,-1198.184937,25.988131>>, <<132.339874,-1275.314819,33.051426>>, 8.750000)
|
|
REMOVE_VEHICLE(vehCopsWave2, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehVanCrash)
|
|
AND IS_ENTITY_IN_ANGLED_AREA(vehVanCrash, <<134.162811,-1198.184937,25.988131>>, <<132.339874,-1275.314819,33.051426>>, 8.750000)
|
|
REMOVE_VEHICLE(vehVanCrash, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehNooseChopper1)
|
|
AND IS_ENTITY_IN_ANGLED_AREA(vehNooseChopper1, <<134.162811,-1198.184937,25.988131>>, <<132.339874,-1275.314819,33.051426>>, 8.750000)
|
|
REMOVE_VEHICLE(vehNooseChopper1, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehNooseWave1)
|
|
AND IS_ENTITY_IN_ANGLED_AREA(vehNooseWave1, <<134.162811,-1198.184937,25.988131>>, <<132.339874,-1275.314819,33.051426>>, 8.750000)
|
|
REMOVE_VEHICLE(vehNooseWave1, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehGoons3a)
|
|
AND IS_ENTITY_IN_ANGLED_AREA(vehGoons3a, <<134.162811,-1198.184937,25.988131>>, <<132.339874,-1275.314819,33.051426>>, 8.750000)
|
|
REMOVE_VEHICLE(vehGoons3a, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehGoons3b)
|
|
AND IS_ENTITY_IN_ANGLED_AREA(vehGoons3b, <<134.162811,-1198.184937,25.988131>>, <<132.339874,-1275.314819,33.051426>>, 8.750000)
|
|
REMOVE_VEHICLE(vehGoons3b, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
FIX_ALL_VEHICLE_TYRES(sGoldVans[0].veh)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_MODEL_PLAYER_WILL_EXIT_SCENE(modelChaseCars)
|
|
|
|
SET_ENTITY_VISIBLE(objGoldTrolleys[0], FALSE)
|
|
SET_ENTITY_VISIBLE(objGoldTrolleys[1], FALSE)
|
|
|
|
REPEAT COUNT_OF(sGoldCars) i
|
|
IF NOT IS_ENTITY_DEAD(sGoldCars[i].veh)
|
|
//SET_VEHICLE_FIXED(sGoldCars[i].veh)
|
|
FIX_ALL_VEHICLE_TYRES(sGoldCars[i].veh)
|
|
SET_VEHICLE_ENGINE_HEALTH(sGoldCars[i].veh, 1000.0)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(sGoldCars[i].veh, 1000.0)
|
|
//SET_VEHICLE_DOOR_OPEN(sGoldCars[i].veh, SC_DOOR_BOOT, FALSE, TRUE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF IS_CUTSCENE_PLAYING()
|
|
IF GET_CUTSCENE_TIME() > 16100
|
|
TRIGGER_MUSIC_EVENT("FH2A_CARS")
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
PREPARE_MUSIC_EVENT("FH2A_GETAWAY_DRIVE_MA")
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Exit states:
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
ANIMPOSTFX_PLAY("SwitchSceneFranklin", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "Hit_1", "LONG_PLAYER_SWITCH_SOUNDS")
|
|
ENDIF
|
|
|
|
//Player goes in the last car.
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
|
|
IF GET_PLAYER_PED_MODEL(CHAR_FRANKLIN) != GET_ENTITY_MODEL(PLAYER_PED_ID())
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE)
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
|
|
IF NOT bSkippedMocap
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Michael goes in the first car
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sGoldCars[0].veh)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Trevor gets into the second car
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldCars[1].veh)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Crew driver gets into the third car
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("driver_selection")
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldCars[2].veh)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_DRIVER].ped, TRUE)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sCrew[CREW_DRIVER].ped)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Crew gunman takes cover by the vans
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("gunman_selection_1")
|
|
IF NOT HAS_PED_GOT_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, TRUE)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
SET_ENTITY_COORDS(sCrew[CREW_GUNMAN].ped, <<128.2898, -1203.2582, 28.3282>>)
|
|
SET_ENTITY_HEADING(sCrew[CREW_GUNMAN].ped, 189.4779)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sCrew[CREW_GUNMAN].ped)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Gold vans are positioned to a better location for the chase.
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_truck")
|
|
FREEZE_ENTITY_POSITION(sGoldVans[0].veh, FALSE)
|
|
SET_ENTITY_COORDS(sGoldVans[0].veh, <<124.6597, -1200.9230, 28.4754>>)
|
|
//SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 0.0)
|
|
//SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOORS_SHUT(sGoldVans[0].veh, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_truck")
|
|
FREEZE_ENTITY_POSITION(sGoldVans[1].veh, FALSE)
|
|
SET_ENTITY_COORDS(sGoldVans[1].veh, <<125.0192, -1197.5840, 28.4754>>)
|
|
//SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 0.0)
|
|
//SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_REAR_RIGHT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOORS_SHUT(sGoldVans[1].veh, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(objEmptyTrolleys[0])
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("GoldEmpty")
|
|
REMOVE_OBJECT(objEmptyTrolleys[0], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(objEmptyTrolleys[1])
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("GoldEmpty^1")
|
|
REMOVE_OBJECT(objEmptyTrolleys[1], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Buddy cars are set to play back recordings: they need to be ahead of the player when cutting back to gameplay.
|
|
FLOAT fChaseStartTime = 2300.0
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(vehChaseTrigger)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("far_right_car")
|
|
SET_VEHICLE_DOORS_SHUT(sGoldCars[0].veh)
|
|
|
|
INITIALISE_UBER_PLAYBACK(strCarrec, CARREC_CHASE_TRIGGER)
|
|
LOAD_CHASE_UBER_DATA()
|
|
LOAD_ACTION_CAM_DATA()
|
|
FREEZE_ENTITY_POSITION(vehChaseTrigger, FALSE)
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehChaseTrigger, CARREC_CHASE_TRIGGER, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehChaseTrigger, fChaseStartTime)
|
|
SET_UBER_PLAYBACK_TO_TIME_NOW(vehChaseTrigger, fChaseStartTime)
|
|
|
|
fUberPlaybackDensitySwitchOffRange = 250.0
|
|
allow_veh_to_stop_on_PLAYER_impact = TRUE
|
|
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
|
|
SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02)
|
|
fChasePlaybackSpeed = 1.0
|
|
bTrafficDontSwitchToAI = TRUE
|
|
|
|
//Set the main cars to be a frame behind: this is how they would normally be as set-piece cars, but as they need to be moving instantly after the cutscene
|
|
//forcing playback update seems to put them a frame ahead.
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldCars[0].veh, CARREC_CHASE_BUDDY_1, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldCars[0].veh, fChaseStartTime)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldCars[0].veh)
|
|
|
|
bUberPlaybackHasStartedFromMocap = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("middle_right_car")
|
|
SET_VEHICLE_DOORS_SHUT(sGoldCars[1].veh)
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldCars[1].veh, CARREC_CHASE_BUDDY_2, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldCars[1].veh, fChaseStartTime)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldCars[1].veh)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("middle_left_car")
|
|
SET_VEHICLE_DOORS_SHUT(sGoldCars[2].veh)
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldCars[2].veh, iCarrecChaseBuddy3, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldCars[2].veh, fChaseStartTime)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldCars[2].veh)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("far_left_car")
|
|
SET_ENTITY_HEADING(sGoldCars[PLAYERS_GOLD_CAR].veh, 194.1942)
|
|
SET_ENTITY_COORDS(sGoldCars[PLAYERS_GOLD_CAR].veh, <<127.3749, -1186.2219, 28.5033>>)
|
|
SET_VEHICLE_DOORS_SHUT(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
SET_VEHICLE_ENGINE_ON(sGoldCars[PLAYERS_GOLD_CAR].veh, TRUE, TRUE)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_BRAKE_LIGHTS(sGoldCars[PLAYERS_GOLD_CAR].veh, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
IF bUberPlaybackHasStartedFromMocap
|
|
PRELOAD_ALL_CHASE_RECORDINGS(fChasePlaybackTime)
|
|
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
|
|
UPDATE_UBER_PLAYBACK(vehChaseTrigger, fChasePlaybackSpeed)
|
|
UPDATE_CHASE_SET_PIECES()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
REMOVE_OBJECT(objGoldTrolleys[0], TRUE)
|
|
REMOVE_OBJECT(objGoldTrolleys[1], TRUE)
|
|
|
|
REMOVE_OBJECT(objEmptyTrolleys[0], TRUE)
|
|
REMOVE_OBJECT(objEmptyTrolleys[1], TRUE)
|
|
|
|
REMOVE_VEHICLE(vehCopsStart[0])
|
|
REMOVE_VEHICLE(vehCopsStart[1])
|
|
REMOVE_VEHICLE(vehCopsWave2)
|
|
REMOVE_VEHICLE(vehVanCrash)
|
|
REMOVE_VEHICLE(vehNooseChopper1)
|
|
REMOVE_VEHICLE(vehNooseWave1)
|
|
REMOVE_VEHICLE(vehGoons3a)
|
|
REMOVE_VEHICLE(vehGoons3b)
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
eMissionStage = STAGE_CHASE
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
STOP_CUTSCENE()
|
|
REMOVE_CUTSCENE()
|
|
REPLAY_CANCEL_EVENT()
|
|
CANCEL_ALL_PREPARED_MUSIC_EVENTS()
|
|
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DO_CHASE()
|
|
INT i = 0
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF SETUP_REQ_PLAYER_IS_FRANKLIN()
|
|
IF bHasUsedCheckpoint
|
|
START_REPLAY_SETUP(<<127.3, -1181.4, 29.5>>, fChaseTriggerHeading, FALSE)
|
|
ELSE
|
|
//Fix for B*528757: Guarantee that the tunnel is loaded first before trying to set up everything else.
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<127.3, -1181.4, 29.5>>)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(GET_ENTITY_COORDS(PLAYER_PED_ID()), 200.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_TRIGGER, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_1, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_2, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(iCarrecChaseBuddy3, strCarrec)
|
|
|
|
WHILE NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_TRIGGER, strCarrec)
|
|
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_1, strCarrec)
|
|
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_2, strCarrec)
|
|
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrecChaseBuddy3, strCarrec)
|
|
OR NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
OR NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
OR NOT DOES_ENTITY_EXIST(sCrew[CREW_DRIVER].ped)
|
|
OR NOT DOES_ENTITY_EXIST(sCrew[CREW_GUNMAN].ped)
|
|
OR NOT DOES_ENTITY_EXIST(sGoldCars[0].veh)
|
|
OR NOT DOES_ENTITY_EXIST(sGoldVans[0].veh)
|
|
SETUP_REQ_MICHAEL(<<140.4548, -1202.2416, 28.2951>>)
|
|
SETUP_REQ_TREVOR(<<141.4548, -1202.2416, 28.2951>>)
|
|
SETUP_REQ_MAIN_DRIVER(<<124.5559, -1190.2872, 28.2951>>, 173.7492)
|
|
SETUP_REQ_MAIN_GUNMAN(<<125.5559, -1190.2872, 28.2951>>, 173.7492)
|
|
SETUP_REQ_CHASE_CARS_START()
|
|
SETUP_REQ_GOLD_VANS_AT_TRANSFER_POINT(FALSE)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SETUP_REQ_BUDDIES_START_FIGHT()
|
|
PRELOAD_OUTFIT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], OUTFIT_P0_SECURITY)
|
|
PRELOAD_OUTFIT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], OUTFIT_P2_SECURITY)
|
|
REQUEST_DRIVER_SECURITY_OUTFIT()
|
|
REQUEST_GUNMAN_SECURITY_OUTFIT()
|
|
REQUEST_MODEL(modelChaseCars)
|
|
|
|
WHILE NOT HAS_MODEL_LOADED(modelChaseCars)
|
|
OR (NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped) AND NOT HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(sCrew[CREW_DRIVER].ped))
|
|
OR (NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped) AND NOT HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(sCrew[CREW_GUNMAN].ped))
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
SET_VEHICLE_DOOR_SHUT(sGoldCars[PLAYERS_GOLD_CAR].veh, SC_DOOR_BOOT)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
RELEASE_PED_PRELOAD_VARIATION_DATA(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
RELEASE_PED_PRELOAD_PROP_DATA(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldCars[1].veh)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_DOOR_SHUT(sGoldCars[1].veh, SC_DOOR_BOOT)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
RELEASE_PED_PRELOAD_VARIATION_DATA(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
RELEASE_PED_PRELOAD_PROP_DATA(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sGoldCars[0].veh)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_DOOR_SHUT(sGoldCars[0].veh, SC_DOOR_BOOT)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
RELEASE_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_DRIVER].ped)
|
|
RELEASE_PED_PRELOAD_PROP_DATA(sCrew[CREW_DRIVER].ped)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldCars[2].veh)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_DOOR_SHUT(sGoldCars[2].veh, SC_DOOR_BOOT)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
IF NOT HAS_PED_GOT_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE)
|
|
GIVE_WEAPON_TO_PED(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, TRUE)
|
|
ENDIF
|
|
|
|
SET_CURRENT_PED_WEAPON(sCrew[CREW_GUNMAN].ped, WEAPONTYPE_CARBINERIFLE, TRUE)
|
|
RELEASE_PED_PRELOAD_VARIATION_DATA(sCrew[CREW_GUNMAN].ped)
|
|
RELEASE_PED_PRELOAD_PROP_DATA(sCrew[CREW_GUNMAN].ped)
|
|
|
|
SET_ENTITY_COORDS(sCrew[CREW_GUNMAN].ped, <<128.2898, -1203.2582, 28.3282>>)
|
|
SET_ENTITY_HEADING(sCrew[CREW_GUNMAN].ped, 189.4779)
|
|
sCrew[CREW_GUNMAN].iEvent = 0
|
|
ENDIF
|
|
|
|
//Move the vans out of the way.
|
|
IF NOT IS_ENTITY_DEAD(sGoldVans[0].veh)
|
|
SET_ENTITY_COORDS(sGoldVans[0].veh, <<124.6597, -1200.9230, 28.4754>>)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[0].veh)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(sGoldVans[1].veh)
|
|
SET_ENTITY_COORDS(sGoldVans[1].veh, <<125.0192, -1197.5840, 28.4754>>)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldVans[1].veh)
|
|
ENDIF
|
|
|
|
BLOCK_PEDS_SPAWNING_AT_UNDERPASS(TRUE)
|
|
CLEAR_AREA_OF_PEDS(vChaseTriggerStart, 300.0)
|
|
|
|
//Start the uber chase.
|
|
vehChaseTrigger = CREATE_VEHICLE(modelChaseCars, vChaseTriggerStart, fChaseTriggerHeading)
|
|
SET_ENTITY_COLLISION(vehChaseTrigger, FALSE)
|
|
SET_ENTITY_VISIBLE(vehChaseTrigger, FALSE)
|
|
SET_ENTITY_INVINCIBLE(vehChaseTrigger, TRUE)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelChaseCars)
|
|
|
|
FLOAT fPlaybackStartTime = 1500.0
|
|
|
|
INITIALISE_UBER_PLAYBACK(strCarrec, CARREC_CHASE_TRIGGER)
|
|
LOAD_CHASE_UBER_DATA()
|
|
LOAD_ACTION_CAM_DATA()
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehChaseTrigger, CARREC_CHASE_TRIGGER, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehChaseTrigger, fPlaybackStartTime)
|
|
SET_UBER_PLAYBACK_TO_TIME_NOW(vehChaseTrigger, fPlaybackStartTime)
|
|
fUberPlaybackDensitySwitchOffRange = 250.0
|
|
fUberMinTimeBeforePlaybackStartToCreate = 1000.0
|
|
allow_veh_to_stop_on_PLAYER_impact = TRUE
|
|
bTrafficDontSwitchToAI = TRUE
|
|
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
|
|
SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
SET_VEHICLE_ENGINE_ON(sGoldCars[PLAYERS_GOLD_CAR].veh, TRUE, TRUE)
|
|
|
|
SET_ENTITY_COORDS(sGoldCars[PLAYERS_GOLD_CAR].veh, <<127.3749, -1186.2219, 28.5033>>)
|
|
SET_ENTITY_HEADING(sGoldCars[PLAYERS_GOLD_CAR].veh, 194.1942)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldCars[PLAYERS_GOLD_CAR].veh, SC_DOOR_BOOT, FALSE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldCars[0].veh, CARREC_CHASE_BUDDY_1, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldCars[0].veh, fPlaybackStartTime)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldCars[0].veh)
|
|
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldCars[0].veh, SC_DOOR_BOOT, FALSE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldCars[1].veh, CARREC_CHASE_BUDDY_2, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldCars[1].veh, fPlaybackStartTime)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldCars[1].veh)
|
|
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldCars[1].veh, SC_DOOR_BOOT, FALSE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldCars[2].veh, iCarrecChaseBuddy3, strCarrec)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sGoldCars[2].veh, fPlaybackStartTime)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sGoldCars[2].veh)
|
|
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(sGoldCars[2].veh, SC_DOOR_BOOT, FALSE)
|
|
ENDIF
|
|
|
|
fChasePlaybackSpeed = 1.0
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
SET_PED_POPULATION_BUDGET(1)
|
|
SET_VEHICLE_POPULATION_BUDGET(1)
|
|
SET_STUNT_JUMPS_CAN_TRIGGER(FALSE)
|
|
SET_VEHICLE_POPULATION_BUDGET(1)
|
|
|
|
//Turn ragdoll back on for the peds left behind, to prevent issues with colliding with vehicles.
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
SET_PED_CAN_RAGDOLL(sCrew[CREW_GUNMAN].ped, TRUE)
|
|
sCrew[CREW_GUNMAN].iEvent = 0
|
|
ENDIF
|
|
|
|
SET_AGGRESSIVE_HORNS(TRUE)
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 5)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
//SET_MAX_WANTED_LEVEL(0)
|
|
//SET_FAKE_WANTED_LEVEL(5)
|
|
SET_POLICE_RADAR_BLIPS(TRUE)
|
|
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), FALSE)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
|
|
SET_RANDOM_TRAINS(FALSE)
|
|
DELETE_ALL_TRAINS()
|
|
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(TRUE)
|
|
CLEAR_TRIGGERED_LABELS()
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TRIGGER_MUSIC_EVENT("FH2A_GETAWAY_RESTART")
|
|
ELSE
|
|
TRIGGER_MUSIC_EVENT("FH2A_GETAWAY_DRIVE_MA")
|
|
ENDIF
|
|
|
|
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 1800)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1800)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1800)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_PED_MAX_HEALTH(sCrew[CREW_DRIVER].ped, 1800)
|
|
SET_ENTITY_HEALTH(sCrew[CREW_DRIVER].ped, 1800)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sCrew[CREW_DRIVER].ped, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_DRIVER].ped, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
SET_VEHICLE_BRAKE_LIGHTS(sGoldCars[PLAYERS_GOLD_CAR].veh, FALSE)
|
|
ENDIF
|
|
|
|
//Gold trolleys are no longer needed (the van doors will be closed).
|
|
REMOVE_OBJECT(objGoldTrolleys[0], TRUE)
|
|
REMOVE_OBJECT(objGoldTrolleys[1], TRUE)
|
|
|
|
SET_FORCED_OBJECTS_FOR_CHASE(TRUE)
|
|
BLOCK_PEDS_DURING_CHASE(TRUE)
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_CHASE_MAIN")
|
|
START_AUDIO_SCENE("BS_2A_CHASE_MAIN")
|
|
ENDIF
|
|
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_DRIVING)
|
|
|
|
sCrew[CREW_FORCED_GUNMAN].iEvent = 0
|
|
bMichaelInvincibleDuringChase = FALSE
|
|
bHeliAudioSceneSet = FALSE
|
|
iChaseEndTimer = 0
|
|
iMusicTriggerEvent = 0
|
|
iJumpSlomoStage = 0
|
|
iGasTankerDialogueTimer = 0
|
|
iCurrentEvent = 0
|
|
iChaseAudioSceneEvent = 0
|
|
iCopsTailingFranklinEvent = 0
|
|
fUberPlaybackParkedCarCleanupDistance = 50.0
|
|
bPlayTruckMusicEvent = FALSE
|
|
iCurrentTake = iMaxTakeConsideringCrew
|
|
iDisplayedTake = iCurrentTake
|
|
iNumTimesPlayedTrevorLostDialogue = 0
|
|
iNumTimesPlayedMichaelLostDialogue = 0
|
|
iNumTimesPlayedTrevorFoundDialogue = 0
|
|
iNumTimesPlayedMichaelFoundDialogue = 0
|
|
iNumTimesPlayedCrewLostDialogue = 0
|
|
iLostDialogueTimer = 0
|
|
fCurrentTimeScale = 1.0
|
|
g_bBigScore2ARescuedBadDriver = FALSE
|
|
|
|
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_DOWN, TRUE)
|
|
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_UP, TRUE)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
PRELOAD_ALL_CHASE_RECORDINGS(fChasePlaybackTime)
|
|
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
|
|
UPDATE_UBER_PLAYBACK(vehChaseTrigger, 1.0)
|
|
UPDATE_CHASE_SET_PIECES()
|
|
DISPLAY_TAKE()
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_CHASE, "CAR_CHASE")
|
|
|
|
SETTIMERA(0)
|
|
SETTIMERB(0)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 14.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
UPDATE_WANTED_POSITION_THIS_FRAME(PLAYER_ID())
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS_FOR_AMBIENT_PEDS_THIS_FRAME(TRUE)
|
|
REQUEST_SCRIPT_AUDIO_BANK("CAR_CRASHES_01")
|
|
|
|
IF fChasePlaybackTime < 70000.0
|
|
fUberMinTimeBeforePlaybackStartToCreate = 1500.0
|
|
ELSE
|
|
fUberMinTimeBeforePlaybackStartToCreate = 4000.0
|
|
ENDIF
|
|
|
|
DISPLAY_TAKE()
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehChaseTrigger)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChaseTrigger)
|
|
fChasePlaybackTime = GET_TIME_POSITION_IN_RECORDING(vehChaseTrigger)
|
|
ELSE
|
|
IF NOT IS_ENTITY_STATIC(vehChaseTrigger)
|
|
FREEZE_ENTITY_POSITION(vehChaseTrigger, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Disable the player's brake lights at the start, as they flick on after the seamless blendout from the cutscene.
|
|
IF TIMERA() < 500
|
|
SET_VEHICLE_BRAKE_LIGHTS(sGoldCars[PLAYERS_GOLD_CAR].veh, FALSE)
|
|
ENDIF
|
|
|
|
//Distance is based on next closest car: one of the cars can crash halfway through so update relative to a different car when this happens.
|
|
FLOAT fDistToNextCar = 0.0
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh) AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[2].veh)
|
|
/*IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh) AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh) AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[1].veh)
|
|
PRINTLN(GET_TIME_POSITION_IN_RECORDING(sGoldCars[2].veh), " ", GET_TIME_POSITION_IN_RECORDING(sGoldCars[0].veh), " ", GET_TIME_POSITION_IN_RECORDING(sGoldCars[1].veh))
|
|
ENDIF*/
|
|
|
|
RUBBER_BAND_CHASE(fChasePlaybackSpeed, sGoldCars[PLAYERS_GOLD_CAR].veh, sGoldCars[2].veh)
|
|
fDistToNextCar = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sGoldCars[2].veh))
|
|
ELIF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
|
|
RUBBER_BAND_CHASE(fChasePlaybackSpeed, sGoldCars[PLAYERS_GOLD_CAR].veh, sGoldCars[1].veh)
|
|
fDistToNextCar = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sGoldCars[1].veh))
|
|
ENDIF
|
|
|
|
PRELOAD_ALL_CHASE_RECORDINGS(fChasePlaybackTime)
|
|
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
|
|
UPDATE_UBER_PLAYBACK(vehChaseTrigger, fChasePlaybackSpeed)
|
|
UPDATE_CHASE_SET_PIECES()
|
|
UPDATE_CHASE_COPS()
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
|
|
CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, sGoldCars[2].veh)
|
|
//DO_CHASE_CAM(sGoldCars[2].veh, sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
ELSE
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
|
|
CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, sGoldCars[1].veh)
|
|
ENDIF
|
|
//DO_CHASE_CAM(sGoldCars[1].veh, sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
ENDIF
|
|
|
|
//Get the closest vehicle to the player periodically: this is used to check dialogue and horn triggers elsewhere.
|
|
VEHICLE_INDEX vehClosest
|
|
IF GET_GAME_TIMER() - iClosestVehicleCheckTimer > 200
|
|
vehClosest = GET_CLOSEST_VEHICLE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 10.0, DUMMY_MODEL_FOR_SCRIPT, GET_TRAFFIC_VEHICLE_SEARCH_FLAGS())
|
|
iClosestVehicleCheckTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("F3A_GETBACKCAR")
|
|
CLEAR_PRINTS()
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sGoldCars[PLAYERS_GOLD_CAR].blip)
|
|
REMOVE_BLIP(sGoldCars[PLAYERS_GOLD_CAR].blip)
|
|
ENDIF
|
|
|
|
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_ReduceEffectOfVehicleRamControlLoss, TRUE)
|
|
|
|
//Pre-stream final cutscene location once the player is about the reach the end.
|
|
IF fChasePlaybackTime > 100000.0
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(vehTrailer[0])) < 900.0
|
|
NEW_LOAD_SCENE_START_SPHERE(<<-1613.5, -724.0, 10.8>>, 60.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Help text (action cam is currently commented out
|
|
/*IF NOT IS_MESSAGE_BEING_DISPLAYED()
|
|
IF fChasePlaybackTime > 7000.0
|
|
AND NOT bHasTextLabelTriggered[F3A_CAMHELP]
|
|
IF fDistToNextCar < 2500.0
|
|
PRINT_HELP("F3A_CAMHELP")
|
|
bHasTextLabelTriggered[F3A_CAMHELP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
//Chase dialogue.
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
//Play a line from Michael before the god text.
|
|
IF NOT bHasTextLabelTriggered[FH3A_DRIVEOF]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_DRIVEOF", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_DRIVEOF] = TRUE
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[F3A_CHASE]
|
|
//This is also a good moment to play the custom police report.
|
|
PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_BS_2A_01")
|
|
|
|
PRINT_NOW("F3A_CHASE", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[F3A_CHASE] = TRUE
|
|
ENDIF
|
|
|
|
//All dialogue below comes after the initial god text.
|
|
IF bHasTextLabelTriggered[F3A_CHASE]
|
|
//Dialogue if Franklin crashes into crew cars.
|
|
IF iChaseCrashTimer = 0 OR GET_GAME_TIMER() - iChaseCrashTimer > 20000
|
|
AND fChasePlaybackTime < 110000.0
|
|
IF (IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh) AND IS_ENTITY_TOUCHING_ENTITY(sGoldCars[PLAYERS_GOLD_CAR].veh, sGoldCars[2].veh))
|
|
IF NOT IS_ENTITY_ATTACHED(sGoldCars[2].veh)
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_HIT", CONV_PRIORITY_MEDIUM)
|
|
iChaseCrashTimer = GET_GAME_TIMER()
|
|
|
|
//Cancel any responses if this dialogue cuts in.
|
|
bMichaelSaidInstructionInChase = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF (IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh) AND IS_ENTITY_TOUCHING_ENTITY(sGoldCars[PLAYERS_GOLD_CAR].veh, sGoldCars[1].veh))
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_HIT", CONV_PRIORITY_MEDIUM)
|
|
iChaseCrashTimer = GET_GAME_TIMER()
|
|
|
|
bMichaelSaidInstructionInChase = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fDistToNextCar < 2500.0
|
|
//Dialogue in here will be followed by a response from Trevor on some occasions.
|
|
IF NOT bMichaelSaidInstructionInChase
|
|
//Turn left.
|
|
IF (fChasePlaybackTime > 9000.0 AND fChasePlaybackTime < 10000.0)
|
|
OR (fChasePlaybackTime > 22000.0 AND fChasePlaybackTime < 23000.0)
|
|
OR (fChasePlaybackTime > 33000.0 AND fChasePlaybackTime < 34000.0)
|
|
OR (fChasePlaybackTime > 78000.0 AND fChasePlaybackTime < 79000.0)
|
|
OR (fChasePlaybackTime > 49000.0 AND fChasePlaybackTime < 50000.0)
|
|
|
|
bMichaelSaidInstructionInChase = CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LEFTM", CONV_PRIORITY_MEDIUM)
|
|
ENDIF
|
|
|
|
//Turn right.
|
|
IF (fChasePlaybackTime > 26000.0 AND fChasePlaybackTime < 27000.0)
|
|
OR (fChasePlaybackTime > 83000.0 AND fChasePlaybackTime < 84000.0)
|
|
bMichaelSaidInstructionInChase = CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RIGHT2", CONV_PRIORITY_MEDIUM)
|
|
ENDIF
|
|
|
|
//Go straight.
|
|
IF (fChasePlaybackTime > 18000.0 AND fChasePlaybackTime < 19000.0)
|
|
OR (fChasePlaybackTime > 73500.0 AND fChasePlaybackTime < 74500.0)
|
|
bMichaelSaidInstructionInChase = CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_STRAM", CONV_PRIORITY_MEDIUM)
|
|
ENDIF
|
|
|
|
//Michael gives general encouragement.
|
|
IF (fChasePlaybackTime > 13000.0 AND fChasePlaybackTime < 14000.0)
|
|
OR (fChasePlaybackTime > 31000.0 AND fChasePlaybackTime < 32000.0)
|
|
OR (fChasePlaybackTime > 58000.0 AND fChasePlaybackTime < 59000.0)
|
|
OR (fChasePlaybackTime > 94000.0 AND fChasePlaybackTime < 95000.0)
|
|
CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_KEEP", CONV_PRIORITY_MEDIUM)
|
|
ENDIF
|
|
|
|
//Dialogue when cops are getting close to crew.
|
|
IF GET_GAME_TIMER() - iCopsCollisionDialogueTimer > 10000
|
|
IF (fChasePlaybackTime > 16500.0 AND fChasePlaybackTime < 18500.0)
|
|
OR (fChasePlaybackTime > 37500.0 AND fChasePlaybackTime < 39500.0)
|
|
OR (fChasePlaybackTime > 75000.0 AND fChasePlaybackTime < 80500.0)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RAMMED", CONV_PRIORITY_MEDIUM)
|
|
iCopsCollisionDialogueTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Hard right.
|
|
IF (fChasePlaybackTime > 50000.0 AND fChasePlaybackTime < 52000.0)
|
|
IF NOT bHasTextLabelTriggered[FH3A_HARDR]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_HARDR", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
bHasTextLabelTriggered[FH3A_HARDR] = TRUE
|
|
bMichaelSaidInstructionInChase = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Rockford jump.
|
|
IF (fChasePlaybackTime > 59000.0 AND fChasePlaybackTime < 60000.0)
|
|
bMichaelSaidInstructionInChase = CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_ROCK", CONV_PRIORITY_MEDIUM)
|
|
ENDIF
|
|
|
|
//Doing the stunt jump.
|
|
IF (fChasePlaybackTime > 63300.0 AND fChasePlaybackTime < 64300.0)
|
|
IF NOT bHasTextLabelTriggered[FH3A_MJUMP]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_MJUMP", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
bHasTextLabelTriggered[FH3A_MJUMP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Michael goes over the jump.
|
|
IF (fChasePlaybackTime > 65300.0 AND fChasePlaybackTime < 66300.0)
|
|
IF NOT bHasTextLabelTriggered[FH3A_GOOFF]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_GOOFF", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_GOOFF] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Crew member goes over the jump.
|
|
IF (fChasePlaybackTime > 68700.0 AND fChasePlaybackTime < 69700.0)
|
|
IF NOT bHasTextLabelTriggered[FH3A_JUMP]
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_JUMP", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_JUMP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Crew member reacts to the explosion.
|
|
IF (fChasePlaybackTime > 72000.0 AND fChasePlaybackTime < 73500.0)
|
|
IF NOT bHasTextLabelTriggered[FH3A_EXP]
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_EXP", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
bHasTextLabelTriggered[FH3A_EXP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Michael sees the chopper.
|
|
IF (fChasePlaybackTime > 90500.0 AND fChasePlaybackTime < 93500.0)
|
|
IF NOT bHasTextLabelTriggered[FH3A_CHOP]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_CHOP", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
bHasTextLabelTriggered[FH3A_CHOP] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Michael sees the tunnel.
|
|
IF (fChasePlaybackTime > 98000.0 AND fChasePlaybackTime < 100000.0)
|
|
IF NOT bHasTextLabelTriggered[FH3A_SEETUN]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SEETUN", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
bHasTextLabelTriggered[FH3A_SEETUN] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
INT iRandom = GET_RANDOM_INT_IN_RANGE(0, 3)
|
|
|
|
IF iRandom = 0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SARKY", CONV_PRIORITY_MEDIUM)
|
|
bMichaelSaidInstructionInChase = FALSE
|
|
ENDIF
|
|
ELIF iRandom = 1
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_ONM", CONV_PRIORITY_MEDIUM)
|
|
bMichaelSaidInstructionInChase = FALSE
|
|
ENDIF
|
|
ELSE
|
|
bMichaelSaidInstructionInChase = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF NOT bHasTextLabelTriggered[FH3A_COPS]
|
|
//Cop roadblock by building site.
|
|
IF fChasePlaybackTime > 40500.0 AND fChasePlaybackTime < 42000.0
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_COPS", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_COPS] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
/*ELIF NOT bHasTextLabelTriggered[FH3A_COPSCREW]
|
|
IF fChasePlaybackTime < 44000.0
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_COPS", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_COPSCREW] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bHasTextLabelTriggered[FH3A_COPSCREW] = TRUE
|
|
ENDIF*/
|
|
ENDIF
|
|
|
|
//Go through building site.
|
|
IF fChasePlaybackTime > 42000.0 AND fChasePlaybackTime < 44000.0
|
|
IF NOT bHasTextLabelTriggered[FH3A_SITE]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_SITE", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_SITE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bPickedGoodCarDriver
|
|
AND fChasePlaybackTime > 85000.0
|
|
AND IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
AND NOT g_bBigScore2ARescuedBadDriver
|
|
IF NOT bHasTextLabelTriggered[FH3A_LOST]
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LOST", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_LOST] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Important dialogue about trucks: allow this to trigger from further back.
|
|
IF fDistToNextCar < 4900.0
|
|
//Get in truck dialogue: this syncs with a blip update.
|
|
IF NOT bHasTextLabelTriggered[FH3A_TRUCK]
|
|
IF fChasePlaybackTime > 101000.0
|
|
AND bSafeToDriveOntoTrucks
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_TRUCK", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_TRUCK] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_RTRUCK]
|
|
IF bPickedGoodCarDriver
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RTRUCK", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_RTRUCK] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_RTRUCK2", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_RTRUCK] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Extra lines from the good driver.
|
|
IF bPickedGoodCarDriver
|
|
IF NOT bHasTextLabelTriggered[FH3A_TRK]
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
|
|
AND NOT IS_ENTITY_ATTACHED(sGoldCars[2].veh)
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_TRK", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_TRK] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bHasTextLabelTriggered[FH3A_TRK] = TRUE
|
|
ENDIF
|
|
ELIF NOT bPlayerIsDrivingUpRamp
|
|
//Line encouraging the player.
|
|
IF NOT bHasTextLabelTriggered[FH3A_ENC]
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
|
|
AND IS_ENTITY_ATTACHED(sGoldCars[2].veh)
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_ENC", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_ENC] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Line if the player is running out of time.
|
|
IF NOT bHasTextLabelTriggered[FH3A_MAKE]
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
|
|
AND IS_ENTITY_ATTACHED(sGoldCars[2].veh)
|
|
IF fChasePlaybackTime > 114500.0
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_MAKE", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_MAKE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fChasePlaybackTime > 10000.0
|
|
IF fDistToNextCar > 10000.0
|
|
//Dialogue if Franklin falls too far behind: can be Trevor or Michael speaking
|
|
IF NOT bHasTextLabelTriggered[FH3A_WHERE]
|
|
IF GET_GAME_TIMER() - iLostDialogueTimer > 10000
|
|
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
|
|
IF iNumTimesPlayedTrevorLostDialogue < 3
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_WHERET", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_WHERE] = TRUE
|
|
bHasTextLabelTriggered[FH3A_WHF] = FALSE
|
|
bMichaelSaidInstructionInChase = FALSE
|
|
iNumTimesPlayedTrevorLostDialogue++
|
|
iLostDialogueTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF iNumTimesPlayedMichaelLostDialogue < 3
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_WHEREM", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_WHERE] = TRUE
|
|
bHasTextLabelTriggered[FH3A_WHF] = FALSE
|
|
iNumTimesPlayedMichaelLostDialogue++
|
|
iLostDialogueTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF iNumTimesPlayedCrewLostDialogue < 4
|
|
IF NOT bHasTextLabelTriggered[FH3A_WHF]
|
|
IF CREATE_DRIVER_CONVERSATION(CREW_DRIVER, sCrew[CREW_DRIVER].ped, sConversationPeds, "FH3AAUD", "FH3A_WHF", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_WHF] = TRUE
|
|
iNumTimesPlayedCrewLostDialogue++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Once the player gets close enough flag the dialogue so it can be triggered later.
|
|
IF bHasTextLabelTriggered[FH3A_WHERE]
|
|
AND NOT bHasTextLabelTriggered[FH3A_TRUCK] //Don't trigger once we reach the trucks.
|
|
IF fDistToNextCar < 2500.0
|
|
BOOL bPlayedConvo
|
|
|
|
//Play a conversation with them noticing the player returned.
|
|
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
|
|
IF iNumTimesPlayedTrevorFoundDialogue < 2
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_FBACKT", CONV_PRIORITY_MEDIUM)
|
|
iNumTimesPlayedTrevorFoundDialogue++
|
|
bPlayedConvo = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF iNumTimesPlayedMichaelFoundDialogue < 2
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_FBACKM", CONV_PRIORITY_MEDIUM)
|
|
iNumTimesPlayedMichaelFoundDialogue++
|
|
bPlayedConvo = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bPlayedConvo
|
|
OR (iNumTimesPlayedMichaelFoundDialogue >= 2 AND iNumTimesPlayedTrevorFoundDialogue >= 2)
|
|
bHasTextLabelTriggered[FH3A_WHERE] = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Franklin says a line when the gas tanker blows up.
|
|
IF iGasTankerDialogueTimer != 0
|
|
IF NOT bHasTextLabelTriggered[FH3A_TANKER]
|
|
IF GET_GAME_TIMER() - iGasTankerDialogueTimer > 1000
|
|
AND GET_GAME_TIMER() - iGasTankerDialogueTimer < 5000
|
|
IF IS_SPHERE_VISIBLE(<<-338.5, -184.3, 40.7>>, 5.0)
|
|
AND fChasePlaybackSpeed > 0.7
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_TANKER", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
bHasTextLabelTriggered[FH3A_TANKER] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If the truck driver is bad the good car driver will comment.
|
|
IF NOT bHasTextLabelTriggered[FH3A_BADTRK]
|
|
IF NOT bPickedGoodTruckDriver
|
|
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
|
|
VECTOR vTrailerPos = GET_ENTITY_COORDS(vehTrailer[0])
|
|
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
IF VDIST2(vTrailerPos, vPlayerPos) < 10000.0
|
|
AND ABSF(vTrailerPos.z - vPlayerPos.z) < 10.0 //Don't trigger if the player starts driving off above the tunnel.
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_BADTRK", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_BADTRK] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bHasTextLabelTriggered[FH3A_BADTRK] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//God text at end: instructs player to drive onto the truck
|
|
IF fChasePlaybackTime > 90000.0
|
|
IF bHasTextLabelTriggered[FH3A_RTRUCK]
|
|
AND bHasTextLabelTriggered[FH3A_BADTRK]
|
|
IF NOT DOES_BLIP_EXIST(blipCurrentObjective)
|
|
AND NOT IS_ENTITY_DEAD(vehTrailer[0])
|
|
REMOVE_ALL_BLIPS()
|
|
blipCurrentObjective = CREATE_BLIP_FOR_ENTITY(vehTrailer[0])
|
|
ENDIF
|
|
|
|
IF NOT bHasTextLabelTriggered[F3A_TRUCK]
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
|
|
AND bSafeToDriveOntoTrucks
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
PRINT_NOW("F3A_TRUCK", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[F3A_TRUCK] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Do some slomo on the stunt jump
|
|
SWITCH iJumpSlomoStage
|
|
CASE 0
|
|
IF fChasePlaybackTime > 45000.0
|
|
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_MUSCLE_JUMP")
|
|
|
|
IF IS_ENTITY_IN_AIR(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
AND GET_ENTITY_SPEED(sGoldCars[PLAYERS_GOLD_CAR].veh) > 5.0
|
|
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-268.697235,-209.381454,37.027538>>, <<-240.500488,-209.981812,51.379856>>, 16.000000)
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_MUSCLE_JUMP")
|
|
PLAY_SOUND_FROM_ENTITY(-1, "Muscle_Jump", sGoldCars[PLAYERS_GOLD_CAR].veh, "BIG_SCORE_3A_SOUNDS")
|
|
ENDIF
|
|
|
|
ACTIVATE_AUDIO_SLOWMO_MODE("SLOWMO_BIG_SCORE_JUMP")
|
|
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", TRUE)
|
|
|
|
//Record footage of the player doing the jump.
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
fCurrentTimeScale = 1.0
|
|
bSlomoActive = TRUE
|
|
iJumpSlomoStage++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
fCurrentTimeScale = fCurrentTimeScale -@ 2.0
|
|
IF fCurrentTimeScale < 0.25
|
|
fCurrentTimeScale = 0.25
|
|
ENDIF
|
|
|
|
SET_TIME_SCALE(fCurrentTimeScale)
|
|
|
|
IF NOT IS_ENTITY_IN_AIR(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_MUSCLE_JUMP")
|
|
PLAY_SOUND_FROM_ENTITY(-1, "Muscle_Land", sGoldCars[PLAYERS_GOLD_CAR].veh, "BIG_SCORE_3A_SOUNDS")
|
|
ENDIF
|
|
|
|
DEACTIVATE_AUDIO_SLOWMO_MODE("SLOWMO_BIG_SCORE_JUMP")
|
|
|
|
iJumpSlomoStage++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
fCurrentTimeScale = fCurrentTimeScale +@ 2.0
|
|
IF fCurrentTimeScale > 1.0
|
|
fCurrentTimeScale = 1.0
|
|
ENDIF
|
|
|
|
SET_TIME_SCALE(fCurrentTimeScale)
|
|
|
|
IF fCurrentTimeScale = 1.0
|
|
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", FALSE)
|
|
|
|
bSlomoActive = FALSE
|
|
iJumpSlomoStage++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3
|
|
IF fChasePlaybackTime > 85000.0
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_MUSCLE_JUMP")
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Music events during chase.
|
|
SWITCH iMusicTriggerEvent
|
|
CASE 0 //Slomo jump start.
|
|
IF fChasePlaybackTime > 25000.0
|
|
PREPARE_MUSIC_EVENT("FH2A_JUMP_START")
|
|
|
|
IF bSlomoActive
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_STUNT_JUMP")
|
|
START_AUDIO_SCENE("BS_2A_STUNT_JUMP")
|
|
ENDIF
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2A_JUMP_START")
|
|
iMusicTriggerEvent++
|
|
ENDIF
|
|
|
|
//Skip this event if the player missed the jump.
|
|
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(vehTrailer[0])) < 2500.0
|
|
CANCEL_MUSIC_EVENT("FH2A_JUMP_START")
|
|
iMusicTriggerEvent = 10
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1 //Slomo jump end.
|
|
IF NOT bSlomoActive
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_STUNT_JUMP")
|
|
STOP_AUDIO_SCENE("BS_2A_STUNT_JUMP")
|
|
ENDIF
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2A_JUMP_LAND_MA")
|
|
iMusicTriggerEvent = 10
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 10 //Entered tunnel
|
|
IF fChasePlaybackTime > 90000.0
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1136.715332,-652.429749,9.754271>>, <<-1149.459961,-662.953308,19.357641>>, 52.750000)
|
|
TRIGGER_MUSIC_EVENT("FH2A_ENTER_TUNNEL")
|
|
iMusicTriggerEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 11 //Made it onto truck.
|
|
IF fChasePlaybackTime > 100000.0
|
|
PREPARE_MUSIC_EVENT("FH2A_ENTER_TRUCK")
|
|
|
|
IF bPlayTruckMusicEvent //This gets set when the player hits the locate on the truck.
|
|
TRIGGER_MUSIC_EVENT("FH2A_ENTER_TRUCK")
|
|
iMusicTriggerEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Main audio scenes during chase.
|
|
SWITCH iChaseAudioSceneEvent
|
|
CASE 0 //Once the player reaches the tunnel change scenes.
|
|
IF fChasePlaybackTime > 90000.0
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1136.715332,-652.429749,9.754271>>, <<-1149.459961,-662.953308,19.357641>>, 52.750000)
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CHASE_MAIN")
|
|
STOP_AUDIO_SCENE("BS_2A_CHASE_MAIN")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_DRIVE_INTO_TRUCK")
|
|
START_AUDIO_SCENE("BS_2A_DRIVE_INTO_TRUCK")
|
|
ENDIF
|
|
|
|
iChaseAudioSceneEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Cop heli audio scene
|
|
IF NOT bHeliAudioSceneSet
|
|
IF DOES_ENTITY_EXIST(pedHeliGunner)
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-1023.497925,-587.214844,32.478542>>,<<37.750000,49.000000,17.000000>>)
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("BS_2A_CHASE_TUNNEL_CHOPPER")
|
|
START_AUDIO_SCENE("BS_2A_CHASE_TUNNEL_CHOPPER")
|
|
bHeliAudioSceneSet = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_AUDIO_SCENE_ACTIVE("BS_2A_CHASE_TUNNEL_CHOPPER")
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1144.928955,-656.833252,9.215416>>, <<-1152.370605,-661.714722,17.095579>>, 50.500000)
|
|
STOP_AUDIO_SCENE("BS_2A_CHASE_TUNNEL_CHOPPER")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF vehClosest != sGoldCars[0].veh
|
|
AND vehClosest != sGoldCars[1].veh
|
|
AND vehClosest != sGoldCars[2].veh
|
|
//Horns
|
|
UPDATE_CHASE_HORNS(iChaseHornTimer, vehClosest)
|
|
|
|
//Ambient dialogue
|
|
UPDATE_CHASE_AMBIENT_SHOUTS(iAmbientDialogueTimer, sGoldCars[PLAYERS_GOLD_CAR].veh, vehClosest)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
//Blip the vehicle and tell the player to get back in.
|
|
IF NOT DOES_BLIP_EXIST(sGoldCars[PLAYERS_GOLD_CAR].blip)
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
sGoldCars[PLAYERS_GOLD_CAR].blip = CREATE_BLIP_FOR_VEHICLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
ENDIF
|
|
|
|
IF NOT bHasTextLabelTriggered[F3A_GETBACKCAR]
|
|
PRINT_NOW("F3A_GETBACKCAR", DEFAULT_GOD_TEXT_TIME, 0)
|
|
bHasTextLabelTriggered[F3A_GETBACKCAR] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Clear any text that should not appear outside the car.
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("F3A_CAMHELP")
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
|
|
//If the player ditched the car during the slomo sequence go back into regular time.
|
|
IF bSlomoActive
|
|
fCurrentTimeScale = fCurrentTimeScale +@ 2.0
|
|
IF fCurrentTimeScale > 1.0
|
|
fCurrentTimeScale = 1.0
|
|
ENDIF
|
|
|
|
SET_TIME_SCALE(fCurrentTimeScale)
|
|
|
|
IF fCurrentTimeScale = 1.0
|
|
bSlomoActive = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Warp chase cars onto the back of the truck
|
|
VECTOR vAttachOffset, vAttachRotation
|
|
VECTOR vWheelOffsetFromTruck[4]
|
|
VECTOR vWheelPos[4]
|
|
FLOAT fGoodDriverPlaybackTime, fCrewDriverPlaybackSpeed
|
|
|
|
REPEAT COUNT_OF(sGoldCars) i
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
|
|
//Blip the buddies and display god text if needed
|
|
IF i != PLAYERS_GOLD_CAR
|
|
IF NOT IS_ENTITY_ATTACHED(sGoldCars[i].veh)
|
|
IF fChasePlaybackTime < 90000.0
|
|
AND NOT DOES_BLIP_EXIST(sGoldCars[i].blip)
|
|
AND IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
sGoldCars[i].blip = CREATE_BLIP_FOR_ENTITY(sGoldCars[i].veh)
|
|
ENDIF
|
|
|
|
//Match playback speed to main chase
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[i].veh)
|
|
//908012 - The crew driver seems to be ahead of the chase during normal playback, this causes issues with the trucks so slow them down a bit.
|
|
IF i != 2
|
|
SET_PLAYBACK_SPEED(sGoldCars[i].veh, fChasePlaybackSpeed)
|
|
ELSE
|
|
fCrewDriverPlaybackSpeed = fChasePlaybackSpeed
|
|
|
|
IF bPickedGoodCarDriver
|
|
AND NOT bPickedGoodTruckDriver
|
|
IF fChasePlaybackTime > 95000.0
|
|
fGoodDriverPlaybackTime = GET_TIME_POSITION_IN_RECORDING(sGoldCars[i].veh)
|
|
|
|
IF fChasePlaybackTime - fGoodDriverPlaybackTime < 200.0
|
|
//fCrewDriverPlaybackSpeed -= 0.02
|
|
ENDIF
|
|
|
|
//PRINTLN(fChasePlaybackTime, " ", fGoodDriverPlaybackTime, " ", fChasePlaybackTime - fGoodDriverPlaybackTime)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_PLAYBACK_SPEED(sGoldCars[i].veh, fCrewDriverPlaybackSpeed)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BOOL bAttach = FALSE
|
|
FLOAT fRecordingDuration = 0.0
|
|
FLOAT fTimeLeftInRecording = 0.0
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
|
|
AND NOT IS_ENTITY_DEAD(vehTrailer[1])
|
|
IF i = 0
|
|
IF fChasePlaybackTime > 100000.0
|
|
bAttach = FALSE
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[i].veh)
|
|
fRecordingDuration = GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_1, strCarrec)
|
|
fTimeLeftInRecording = fRecordingDuration - GET_TIME_POSITION_IN_RECORDING(sGoldCars[i].veh)
|
|
|
|
IF fTimeLeftInRecording < 150.0
|
|
vAttachOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrailer[1], GET_ENTITY_COORDS(sGoldCars[i].veh))
|
|
vAttachRotation = GET_ENTITY_ROTATION(sGoldCars[i].veh) - GET_ENTITY_ROTATION(vehTrailer[1])
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldCars[i].veh)
|
|
ATTACH_VEHICLE_ON_TO_TRAILER(sGoldCars[i].veh, vehTrailer[1], <<0.0, 0.0, 0.0>>, vAttachOffset, vAttachRotation, -1)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF i = 1
|
|
IF fChasePlaybackTime > 100000.0
|
|
bAttach = FALSE
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[i].veh)
|
|
fRecordingDuration = GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_2, strCarrec)
|
|
fTimeLeftInRecording = fRecordingDuration - GET_TIME_POSITION_IN_RECORDING(sGoldCars[i].veh)
|
|
|
|
IF fTimeLeftInRecording < 150.0
|
|
vAttachOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrailer[1], GET_ENTITY_COORDS(sGoldCars[i].veh))
|
|
vAttachRotation = GET_ENTITY_ROTATION(sGoldCars[i].veh) - GET_ENTITY_ROTATION(vehTrailer[1])
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldCars[i].veh)
|
|
ATTACH_VEHICLE_ON_TO_TRAILER(sGoldCars[i].veh, vehTrailer[1], <<0.0, 0.0, 0.0>>, vAttachOffset, vAttachRotation, -1)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF i = 2
|
|
IF fChasePlaybackTime > 100000.0
|
|
bAttach = FALSE
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[i].veh)
|
|
fRecordingDuration = GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iCarrecChaseBuddy3, strCarrec)
|
|
fTimeLeftInRecording = fRecordingDuration - GET_TIME_POSITION_IN_RECORDING(sGoldCars[i].veh)
|
|
|
|
IF fTimeLeftInRecording < 500.0
|
|
bAttach = TRUE
|
|
ENDIF
|
|
|
|
IF fTimeLeftInRecording < 1500.0
|
|
IF bPickedGoodTruckDriver
|
|
fPlaybackOffset = 0.3 * (1.0 - (fTimeLeftInRecording / 1500.0))
|
|
ELSE
|
|
fPlaybackOffset = 0.05 * (1.0 - (fTimeLeftInRecording / 1500.0))
|
|
ENDIF
|
|
|
|
SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(sGoldCars[i].veh, <<0.0, 0.0, fPlaybackOffset>>)
|
|
ENDIF
|
|
ELSE
|
|
IF bPickedGoodCarDriver
|
|
AND VDIST2(GET_ENTITY_COORDS(vehTrailer[0]), GET_ENTITY_COORDS(sGoldCars[i].veh)) < 400.0
|
|
bAttach = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bAttach
|
|
vAttachOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrailer[0], GET_ENTITY_COORDS(sGoldCars[i].veh))
|
|
vAttachRotation = GET_ENTITY_ROTATION(sGoldCars[i].veh) - GET_ENTITY_ROTATION(vehTrailer[0])
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldCars[i].veh)
|
|
SET_ENTITY_INVINCIBLE(sGoldCars[i].veh, TRUE)
|
|
ATTACH_VEHICLE_ON_TO_TRAILER(sGoldCars[i].veh, vehTrailer[0], <<0.0, 0.0, 0.0>>, vAttachOffset, vAttachRotation, -1)
|
|
ENDIF
|
|
ELSE
|
|
fPlaybackOffset = 0.0
|
|
ENDIF
|
|
|
|
IF (bPickedGoodTruckDriver AND fChasePlaybackTime > 110272.0)
|
|
OR (NOT bPickedGoodTruckDriver AND fChasePlaybackTime > 110002.0)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bPlayerIsDrivingUpRamp = FALSE
|
|
|
|
IF fChasePlaybackTime > 100000.0
|
|
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
|
|
VECTOR vTrailerFront = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehTrailer[0], <<-0.1580, 5.7477, 1.5380>>)
|
|
VECTOR vTrailerFarBack = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehTrailer[0], <<-0.0096, -20.5751, -4.0258>>)
|
|
|
|
//Stop the player from diving out the vehicle at the last moment.
|
|
IF IS_ENTITY_IN_ANGLED_AREA(sGoldCars[PLAYERS_GOLD_CAR].veh, vTrailerFront, vTrailerFarBack, 5.0)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
ENDIF
|
|
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
VECTOR vTrailerBackMoreLenient = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehTrailer[0], <<-0.0096, -6.5751, -2.0258>>)
|
|
VECTOR vTrailerBack = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehTrailer[0], <<-0.0096, -5.7751, -1.8258>>)
|
|
|
|
vWheelPos[0] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldCars[i].veh, <<0.7, 1.49, -0.4>>)
|
|
vWheelPos[1] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldCars[i].veh, <<-0.7, 1.49, -0.4>>)
|
|
vWheelPos[2] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldCars[i].veh, <<0.7, -1.47, -0.4>>)
|
|
vWheelPos[3] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldCars[i].veh, <<-0.7, -1.47, -0.4>>)
|
|
|
|
//Keep track of if the player is potentially driving up the ramp (for dialogue).
|
|
IF vWheelPos[0].z > 10.6
|
|
bPlayerIsDrivingUpRamp = TRUE
|
|
ENDIF
|
|
|
|
//Slow the player down when they get close to he trailer.
|
|
IF VDIST2(vWheelPos[0], vTrailerBackMoreLenient) < 1600.0
|
|
IF GET_ENTITY_SPEED(sGoldCars[PLAYERS_GOLD_CAR].veh) > 17.0
|
|
SET_ENTITY_VELOCITY(sGoldCars[PLAYERS_GOLD_CAR].veh, GET_ENTITY_VELOCITY(sGoldCars[PLAYERS_GOLD_CAR].veh) * 0.99)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_POINT_IN_ANGLED_AREA(vWheelPos[0], vTrailerBackMoreLenient, vTrailerFront, 3.0)
|
|
AND IS_POINT_IN_ANGLED_AREA(vWheelPos[1], vTrailerBackMoreLenient, vTrailerFront, 3.0)
|
|
AND IS_POINT_IN_ANGLED_AREA(vWheelPos[2], vTrailerBackMoreLenient, vTrailerFront, 3.0)
|
|
AND IS_POINT_IN_ANGLED_AREA(vWheelPos[3], vTrailerBackMoreLenient, vTrailerFront, 3.0)
|
|
bPlayTruckMusicEvent = TRUE
|
|
|
|
//Pass check: player needs to stay inside the truck for at least a second (doesn't need to be attached).
|
|
IF GET_GAME_TIMER() - iChaseEndTimer > 200
|
|
//Now is a good moment to record some footage of driving up the ramp.
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0)
|
|
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
//Attach check: keep the car in place if it's in a good position.
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
IF NOT IS_ENTITY_ATTACHED(sGoldCars[i].veh)
|
|
AND IS_POINT_IN_ANGLED_AREA(vWheelPos[0], vTrailerBack, vTrailerFront, 3.0)
|
|
AND IS_POINT_IN_ANGLED_AREA(vWheelPos[1], vTrailerBack, vTrailerFront, 3.0)
|
|
AND IS_POINT_IN_ANGLED_AREA(vWheelPos[2], vTrailerBack, vTrailerFront, 3.0)
|
|
AND IS_POINT_IN_ANGLED_AREA(vWheelPos[3], vTrailerBack, vTrailerFront, 3.0)
|
|
vWheelOffsetFromTruck[0] = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrailer[0], vWheelPos[0])
|
|
vWheelOffsetFromTruck[1] = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrailer[0], vWheelPos[1])
|
|
vWheelOffsetFromTruck[2] = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrailer[0], vWheelPos[2])
|
|
vWheelOffsetFromTruck[3] = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrailer[0], vWheelPos[3])
|
|
|
|
IF vWheelOffsetFromTruck[0].z < -1.2
|
|
AND vWheelOffsetFromTruck[1].z < -1.2
|
|
AND vWheelOffsetFromTruck[2].z < -1.2
|
|
AND vWheelOffsetFromTruck[3].z < -1.2
|
|
vAttachOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(vehTrailer[0], GET_ENTITY_COORDS(sGoldCars[i].veh))
|
|
vAttachRotation = GET_ENTITY_ROTATION(sGoldCars[i].veh) - GET_ENTITY_ROTATION(vehTrailer[0])
|
|
ATTACH_ENTITY_TO_ENTITY(sGoldCars[i].veh, vehTrailer[0], 0, vAttachOffset, vAttachRotation,
|
|
FALSE, FALSE, FALSE)
|
|
SET_ENTITY_INVINCIBLE(sGoldCars[i].veh, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iChaseEndTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Prestream the assets for the chase end cutscene.
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vTrailerFarBack) < 400.0
|
|
REQUEST_MODEL(modelEndTruck)
|
|
REQUEST_MODEL(modelEndTrailers)
|
|
REQUEST_MODEL(modelEndHeli)
|
|
REQUEST_MODEL(modelCop)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_END_TRAILER_1, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_END_TRAILER_2, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_END_TRUCK_1, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_END_TRUCK_2, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_END_HELI, strCarrec)
|
|
REQUEST_ANIM_DICT(strTrailerRampAnims)
|
|
REQUEST_MODELS_FOR_HEIST_CREW(HEIST_FINALE)
|
|
REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_RAMP")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF eSectionStage != SECTION_STAGE_CLEANUP
|
|
AND NOT IS_ENTITY_DEAD(SetPieceCarID[0]) //Trucks leave the tunnel at this point
|
|
IF IS_ENTITY_IN_ANGLED_AREA(SetPieceCarID[0], <<-1602.814453,-716.280029,9.910825>>, <<-1600.750488,-742.499084,16.425133>>, 7.000000)
|
|
MISSION_FAILED(FAILED_MISSED_TRUCKS)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Cleanup all the shootout stuff once the player gets far enough away
|
|
IF DOES_ENTITY_EXIST(sGoldVans[0].veh)
|
|
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vChaseTriggerStart) > 10000.0
|
|
REMOVE_PED(sCrew[CREW_GUNMAN].ped)
|
|
REMOVE_COVER_POINT(sCrew[CREW_GUNMAN].cover)
|
|
sCrew[CREW_GUNMAN].cover = NULL
|
|
REMOVE_VEHICLE(sGoldVans[0].veh)
|
|
REMOVE_VEHICLE(sGoldVans[1].veh)
|
|
ENDIF
|
|
|
|
//Fail for the player's car getting stuck.
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
IF IS_VEHICLE_PERMANENTLY_STUCK(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
AND NOT IS_ENTITY_ATTACHED(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
MISSION_FAILED(FAILED_CAR_STUCK)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
|
|
IF fChasePlaybackTime > 75000.0
|
|
IF VDIST2(GET_ENTITY_COORDS(sGoldCars[1].veh), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 90000.0
|
|
MISSION_FAILED(FAILED_LOST_BUDDIES)
|
|
ENDIF
|
|
ELSE
|
|
IF VDIST2(GET_ENTITY_COORDS(sGoldCars[1].veh), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 60000.0
|
|
MISSION_FAILED(FAILED_LOST_BUDDIES)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail if one of the truck drivers dies.
|
|
REPEAT 2 i
|
|
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[i])
|
|
AND SetPieceCarModel[i] = PACKER
|
|
PED_INDEX pedDriver = GET_PED_IN_VEHICLE_SEAT(SetPieceCarID[i])
|
|
|
|
IF DOES_ENTITY_EXIST(pedDriver)
|
|
IF IS_PED_INJURED(pedDriver)
|
|
MISSION_FAILED(FAILED_TRUCK_DRIVER_DIED)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Have the gunman take cover at the start if he wasn't told already (e.g. when skipping to this stage)
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_GUNMAN].ped)
|
|
IF (NOT IS_PED_IN_COVER(sCrew[CREW_GUNMAN].ped) OR VDIST2(GET_ENTITY_COORDS(sCrew[CREW_GUNMAN].ped), <<128.2898, -1203.2582, 28.3282>>) > 2.0)
|
|
AND GET_SCRIPT_TASK_STATUS(sCrew[CREW_GUNMAN].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
SET_PED_COVER_POINT_AND_SPHERE(sCrew[CREW_GUNMAN].ped, sCrew[CREW_GUNMAN].cover, <<128.2898, -1203.2582, 28.3282>>, 189.4779, 2.0, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sCrew[CREW_GUNMAN].ped, NORMAL_BLEND_OUT, TRUE)
|
|
SET_PED_CURRENT_WEAPON_VISIBLE(sCrew[CREW_GUNMAN].ped, TRUE)
|
|
SEQ_GO_TO_COVER(sCrew[CREW_GUNMAN].ped, <<128.2898, -1203.2582, 28.3282>>, PEDMOVE_RUN, -1, TRUE, TRUE, DEFAULT_TIME_BEFORE_WARP, 1.0, ENAV_NO_STOPPING)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
REMOVE_ALL_BLIPS()
|
|
|
|
STOP_CAM_PLAYBACK(vehCamCar)
|
|
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
|
|
REMOVE_VEHICLE(vehCamCar, TRUE)
|
|
|
|
REPEAT COUNT_OF(pedChaseBlockade2) i
|
|
REMOVE_PED(pedChaseBlockade2[i])
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(pedChaseBlockadeMall) i
|
|
REMOVE_PED(pedChaseBlockadeMall[i])
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(pedChaseCops) i
|
|
REMOVE_PED(pedChaseCops[i])
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(sChaseCops) i
|
|
REMOVE_PED(sChaseCops[i].ped)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(sChaseCopsBlockade) i
|
|
REMOVE_PED(sChaseCopsBlockade[i].ped)
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(vehChaseCops) i
|
|
REMOVE_VEHICLE(vehChaseCops[i])
|
|
ENDREPEAT
|
|
|
|
REMOVE_PED(pedHeliGunner)
|
|
|
|
REPEAT COUNT_OF(interiorChaseTunnel) i
|
|
IF interiorChaseTunnel[i] != NULL
|
|
UNPIN_INTERIOR(interiorChaseTunnel[i])
|
|
interiorChaseTunnel[i] = NULL
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelCopCar)
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_GAS_TANKER, strCarrec)
|
|
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
|
|
|
|
eMissionStage = STAGE_CHASE_END_CUTSCENE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DO_CHASE_END_CUTSCENE_NEW_VERSION()
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) //Temp fix for cars popping in.
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
REQUEST_PTFX_ASSET()
|
|
|
|
IF SETUP_REQ_PLAYER_IS_FRANKLIN()
|
|
IF SETUP_REQ_MICHAEL(<<-1484.3656, -749.0569, 10.1031>>)
|
|
AND SETUP_REQ_TREVOR(<<-1484.3656, -747.0569, 10.1031>>)
|
|
AND SETUP_REQ_MAIN_DRIVER(<<-1484.3656, -745.0569, 10.1031>>, 173.7492)
|
|
AND SETUP_REQ_MAIN_GUNMAN(<<-1485.3656, -745.0569, 10.1031>>, 173.7492)
|
|
AND SETUP_REQ_CHASE_CARS_START()
|
|
AND SETUP_REQ_ALL_CREW_IN_SECURITY_GEAR()
|
|
AND REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_RAMP")
|
|
AND HAS_PTFX_ASSET_LOADED()
|
|
IF SETUP_REQ_BUDDIES_START_FIGHT()
|
|
SETUP_FRANKLIN_OUTFIT()
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
SET_VEHICLE_DOOR_SHUT(sGoldCars[PLAYERS_GOLD_CAR].veh, SC_DOOR_BOOT)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sGoldCars[1].veh)
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sGoldCars[1].veh)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_DOOR_SHUT(sGoldCars[1].veh, SC_DOOR_BOOT)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], sGoldCars[0].veh)
|
|
ELIF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], sGoldCars[0].veh)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_DOOR_SHUT(sGoldCars[0].veh, SC_DOOR_BOOT)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_DRIVER].ped, sGoldCars[2].veh)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_DOOR_SHUT(sGoldCars[2].veh, SC_DOOR_BOOT)
|
|
ENDIF
|
|
|
|
iCurrentTake = iMaxTakeConsideringCrew
|
|
|
|
IF NOT bPickedGoodCarDriver
|
|
AND NOT g_bBigScore2ARescuedBadDriver
|
|
iTakePenaltyCrewDies = iMaxTakeConsideringCrew / 4
|
|
iCurrentTake -= iTakePenaltyCrewDies
|
|
ENDIF
|
|
|
|
iDisplayedTake = iCurrentTake
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
REQUEST_MODEL(modelEndTruck)
|
|
REQUEST_MODEL(modelEndTrailers)
|
|
REQUEST_MODEL(modelEndHeli)
|
|
REQUEST_MODEL(modelCop)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_END_TRAILER_1, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_END_TRAILER_2, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_END_TRUCK_1, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_END_TRUCK_2, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_END_HELI, strCarrec)
|
|
REQUEST_ANIM_DICT(strTrailerRampAnims)
|
|
REQUEST_MODELS_FOR_HEIST_CREW(HEIST_FINALE)
|
|
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_RAMP")
|
|
AND HAS_MODEL_LOADED(modelEndTruck)
|
|
AND HAS_MODEL_LOADED(modelEndTrailers)
|
|
AND HAS_MODEL_LOADED(modelEndHeli)
|
|
AND HAS_MODEL_LOADED(modelCop)
|
|
AND HAS_ANIM_DICT_LOADED(strTrailerRampAnims)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_END_TRAILER_1, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_END_TRAILER_2, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_END_TRUCK_1, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_END_TRUCK_2, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_END_HELI, strCarrec)
|
|
AND HAVE_MODELS_LOADED_FOR_HEIST_CREW(HEIST_FINALE)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
|
|
REMOVE_PED(sCrew[CREW_DRIVER].ped, TRUE)
|
|
REMOVE_PED(sCrew[CREW_GUNMAN].ped, TRUE)
|
|
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
|
|
//Cleanup the uber chase if there are still cars left: delete the trucks and ramps used in the uber immediately.
|
|
REMOVE_VEHICLE(vehTrailer[0], TRUE)
|
|
REMOVE_VEHICLE(vehTrailer[1], TRUE)
|
|
REMOVE_VEHICLE(SetPieceCarID[0], TRUE)
|
|
REMOVE_VEHICLE(SetPieceCarID[1], TRUE)
|
|
REMOVE_VEHICLE(SetPieceCarID[CHOPPER_SETPIECE_ID], TRUE)
|
|
REMOVE_VEHICLE(vehEndTrucks[0], TRUE)
|
|
REMOVE_VEHICLE(vehEndTrucks[1], TRUE)
|
|
|
|
|
|
CLEANUP_UBER_PLAYBACK()
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[PLAYERS_GOLD_CAR].veh)
|
|
SET_ENTITY_COORDS(sGoldCars[PLAYERS_GOLD_CAR].veh, <<-1502.1, -755.1, 11.4031>>)
|
|
ENDIF
|
|
|
|
LOAD_SCENE(<<-1502.1, -755.1, 11.4031>>)
|
|
|
|
WAIT(500)
|
|
ENDIF
|
|
|
|
vehEndTrucks[0] = CREATE_VEHICLE(modelEndTruck, <<-1519.3656, -748.5569, 10.1031>>, 95.8660)
|
|
vehEndTrucks[1] = CREATE_VEHICLE(modelEndTruck, <<-1523.0845, -760.0131, 10.1498>>, 95.2415)
|
|
SET_VEHICLE_COLOURS(vehEndTrucks[0], 73, 70)
|
|
SET_VEHICLE_COLOURS(vehEndTrucks[1], 45, 40)
|
|
SET_VEHICLE_EXTRA_COLOURS(vehEndTrucks[0], 63, 156)
|
|
SET_VEHICLE_EXTRA_COLOURS(vehEndTrucks[1], 35, 156)
|
|
|
|
vehEndTrailers[0] = CREATE_VEHICLE(modelEndTrailers, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehEndTrucks[0], <<0.0, -10.0, 0.0>>), GET_ENTITY_HEADING(vehEndTrucks[0]))
|
|
vehEndTrailers[1] = CREATE_VEHICLE(modelEndTrailers, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehEndTrucks[1], <<0.0, -10.0, 0.0>>), GET_ENTITY_HEADING(vehEndTrucks[1]))
|
|
ATTACH_VEHICLE_TO_TRAILER(vehEndTrucks[0], vehEndTrailers[0])
|
|
ATTACH_VEHICLE_TO_TRAILER(vehEndTrucks[1], vehEndTrailers[1])
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
ATTACH_ENTITY_TO_ENTITY(PLAYER_PED_ID(), vehEndTrailers[0], 0, <<0.0, 0.0, -0.6>>, <<0.0, 0.0, 0.0>>)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ATTACH_ENTITY_TO_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], vehEndTrailers[0], 0, <<0.0, 0.5, -0.6>>, <<0.0, 0.0, 0.0>>)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
ATTACH_ENTITY_TO_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], vehEndTrailers[0], 0, <<0.0, 1.0, -0.6>>, <<0.0, 0.0, 0.0>>)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sCrew[CREW_DRIVER].ped)
|
|
ATTACH_ENTITY_TO_ENTITY(sCrew[CREW_DRIVER].ped, vehEndTrailers[0], 0, <<0.0, 1.5, -0.6>>, <<0.0, 0.0, 0.0>>)
|
|
ENDIF
|
|
|
|
vehEndHeli = CREATE_VEHICLE(modelEndHeli, <<-1644.5035, -714.8908, 29.8235>>, 0.0)
|
|
SET_VEHICLE_ENGINE_ON(vehEndHeli, TRUE, TRUE)
|
|
SET_HELI_BLADES_FULL_SPEED(vehEndHeli)
|
|
SET_VEHICLE_LIVERY(vehEndHeli, 0)
|
|
|
|
sCrew[CREW_FORCED_GUNMAN].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, 0, <<-1484.3656, -749.0569, 13.1031>>, 0.0)
|
|
sCrew[CREW_FORCED_DRIVER].ped = CREATE_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, 1, <<-1486.0845, -760.0131, 13.1498>>, 0.0)
|
|
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_FORCED_GUNMAN].ped, vehEndTrucks[0], VS_DRIVER)
|
|
SET_PED_INTO_VEHICLE(sCrew[CREW_FORCED_DRIVER].ped, vehEndTrucks[1], VS_DRIVER)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_FORCED_GUNMAN].ped, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sCrew[CREW_FORCED_DRIVER].ped, TRUE)
|
|
|
|
pedEndCops[0] = CREATE_PED_INSIDE_VEHICLE(vehEndHeli, PEDTYPE_MISSION, modelCop, VS_DRIVER)
|
|
pedEndCops[1] = CREATE_PED_INSIDE_VEHICLE(vehEndHeli, PEDTYPE_MISSION, modelCop, VS_BACK_RIGHT)
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 6, pedEndCops[0], "BS2ACopHeli")
|
|
ADD_PED_FOR_DIALOGUE(sConversationPeds, 7, pedEndCops[1], "BS2ACop2")
|
|
|
|
SET_MODELS_FOR_HEIST_CREW_AS_NO_LONGER_NEEDED(HEIST_FINALE)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelEndTruck)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelEndTrailers)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelEndHeli)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelCop)
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iTrailerRampSounds[0])
|
|
STOP_SOUND(iTrailerRampSounds[0])
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iTrailerRampSounds[1])
|
|
STOP_SOUND(iTrailerRampSounds[1])
|
|
ENDIF
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(ptfxRampSparks) i
|
|
IF ptfxRampSparks[i] != NULL
|
|
STOP_PARTICLE_FX_LOOPED(ptfxRampSparks[i])
|
|
ptfxRampSparks[i] = NULL
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
ptfxRampSparks[0] = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_bigscore_ramp_sparks", vehEndTrailers[0], <<0.23, -9.6955, -3.0130>>, <<0.0, 0.0, 0.0>>)
|
|
ptfxRampSparks[1] = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_bigscore_ramp_sparks", vehEndTrailers[0], <<1.3358, -9.6955, -3.0130>>, <<0.0, 0.0, 0.0>>)
|
|
ptfxRampSparks[2] = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_bigscore_ramp_sparks", vehEndTrailers[1], <<0.23, -9.6355, -2.9630>>, <<0.0, 0.0, 0.0>>)
|
|
ptfxRampSparks[3] = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_bigscore_ramp_sparks", vehEndTrailers[1], <<1.3358, -9.6355, -2.9630>>, <<0.0, 0.0, 0.0>>)
|
|
|
|
REMOVE_ALL_AUDIO_SCENES()
|
|
|
|
REMOVE_VEHICLE(sGoldCars[0].veh, TRUE)
|
|
REMOVE_VEHICLE(sGoldCars[1].veh, TRUE)
|
|
REMOVE_VEHICLE(sGoldCars[2].veh, TRUE)
|
|
REMOVE_VEHICLE(sGoldCars[3].veh, TRUE)
|
|
|
|
//Reset the budget reductions from earlier.
|
|
SET_PED_POPULATION_BUDGET(3)
|
|
SET_VEHICLE_POPULATION_BUDGET(3)
|
|
|
|
//Turn the wanted level off.
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
|
|
//First shot: car roofs go up
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[0], CARREC_END_TRUCK_1, strCarrec)
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[1], CARREC_END_TRUCK_2, strCarrec)
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[0], CARREC_END_TRAILER_1, strCarrec)
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[1], CARREC_END_TRAILER_2, strCarrec)
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehEndHeli, CARREC_END_HELI, strCarrec)
|
|
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndHeli, 1000)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehEndHeli, FALSE)
|
|
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[0], 4350.0)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[1], 5000.0)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[0], 4350.0)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[1], 5000.0)
|
|
|
|
PLAY_ENTITY_ANIM(vehEndTrailers[0], "Trailer3_Door_Open", strTrailerRampAnims, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.715)
|
|
PLAY_ENTITY_ANIM(vehEndTrailers[1], "Trailer3_Door_Open", strTrailerRampAnims, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 0.715)
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(vehEndTrailers[0])
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(vehEndTrailers[1])
|
|
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehEndTrucks[0], TRUE)
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehEndTrucks[1], TRUE)
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehEndTrailers[0], TRUE)
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehEndTrailers[1], TRUE)
|
|
|
|
SET_VEHICLE_INACTIVE_DURING_PLAYBACK(vehEndTrucks[0], FALSE)
|
|
SET_VEHICLE_INACTIVE_DURING_PLAYBACK(vehEndTrucks[1], FALSE)
|
|
SET_VEHICLE_INACTIVE_DURING_PLAYBACK(vehEndTrailers[0], FALSE)
|
|
SET_VEHICLE_INACTIVE_DURING_PLAYBACK(vehEndTrailers[1], FALSE)
|
|
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehEndTrucks[0], FALSE)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehEndTrucks[1], FALSE)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehEndTrailers[0], FALSE)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehEndTrailers[1], FALSE)
|
|
|
|
SPECIAL_ABILITY_DEACTIVATE(PLAYER_ID())
|
|
|
|
fTrailerDoorRatios[0] = 1.0
|
|
fTrailerDoorRatios[1] = 1.0
|
|
|
|
//SET_VEHICLE_DOOR_OPEN(vehEndTrailers[0], SC_DOOR_BOOT, FALSE, TRUE)
|
|
//SET_VEHICLE_DOOR_OPEN(vehEndTrailers[1], SC_DOOR_BOOT, FALSE, TRUE)
|
|
|
|
camMain = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<-1505.737793,-770.717712,11.810378>>,<<4.722565,0.009218,-1.592357>>,39.866249, TRUE)
|
|
SET_CAM_PARAMS(camMain, <<-1531.579956,-769.483582,11.830682>>,<<5.169897,-0.220527,-3.891246>>,39.866249, 2550, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
|
|
SHAKE_CAM(camMain, "HAND_SHAKE", 1.0)
|
|
CLEAR_AREA(<<-1601.105103,-730.149841,10.743475>>, 10.0, TRUE)
|
|
|
|
//SET_VEHICLE_GENERATOR_AREA_OF_INTEREST(<<-1555.6846, -746.6412, 10.3336>>, 20.0)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
|
|
SETTIMERB(0)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
REQUEST_MODEL(EMPEROR)
|
|
REQUEST_MODEL(HABANERO)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehEndTrucks[0])
|
|
AND IS_VEHICLE_DRIVEABLE(vehEndTrucks[1])
|
|
AND IS_VEHICLE_DRIVEABLE(vehEndTrailers[0])
|
|
AND IS_VEHICLE_DRIVEABLE(vehEndTrailers[1])
|
|
AND IS_VEHICLE_DRIVEABLE(vehEndHeli)
|
|
SET_FORCE_HD_VEHICLE(vehEndHeli, TRUE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehEndTrucks[0])
|
|
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehEndHeli)
|
|
PRINTLN(GET_TIME_POSITION_IN_RECORDING(vehEndTrucks[0]), " ", GET_TIME_POSITION_IN_RECORDING(vehEndHeli))
|
|
ENDIF
|
|
|
|
PRINTLN(fTrailerDoorRatios[0])
|
|
#ENDIF
|
|
|
|
//Preload the cops conversation.
|
|
IF NOT bHasTextLabelTriggered[FH3A_ENDC_PRELOAD]
|
|
AND NOT bHasTextLabelTriggered[FH3A_ENDC]
|
|
IF PRELOAD_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_ENDC", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_ENDC_PRELOAD] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0 //Close first truck ramp.
|
|
IF IS_ENTITY_PLAYING_ANIM(vehEndTrailers[0], strTrailerRampAnims, "Trailer3_Door_Open")
|
|
SET_ENTITY_ANIM_SPEED(vehEndTrailers[0], strTrailerRampAnims, "Trailer3_Door_Open", 0.0)
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(vehEndTrailers[1], strTrailerRampAnims, "Trailer3_Door_Open")
|
|
SET_ENTITY_ANIM_SPEED(vehEndTrailers[1], strTrailerRampAnims, "Trailer3_Door_Open", 0.0)
|
|
ENDIF
|
|
|
|
IF TIMERB() > 200
|
|
IF IS_ENTITY_PLAYING_ANIM(vehEndTrailers[1], strTrailerRampAnims, "Trailer3_Door_Open")
|
|
SET_ENTITY_ANIM_SPEED(vehEndTrailers[1], strTrailerRampAnims, "Trailer3_Door_Open", -0.75)
|
|
ENDIF
|
|
|
|
PLAY_SOUND_FROM_ENTITY(iTrailerRampRaiseSounds[1], "Truck_Ramp_Raise", vehEndTrailers[1], "BIG_SCORE_3A_SOUNDS")
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
CONVERGE_VALUE(fTrailerDoorRatios[1], 0.0, 0.6, TRUE)
|
|
|
|
IF TIMERB() > 500
|
|
IF IS_ENTITY_PLAYING_ANIM(vehEndTrailers[0], strTrailerRampAnims, "Trailer3_Door_Open")
|
|
SET_ENTITY_ANIM_SPEED(vehEndTrailers[0], strTrailerRampAnims, "Trailer3_Door_Open", -0.74)
|
|
ENDIF
|
|
|
|
PLAY_SOUND_FROM_ENTITY(iTrailerRampRaiseSounds[0], "Truck_Ramp_Raise", vehEndTrailers[0], "BIG_SCORE_3A_SOUNDS")
|
|
STOP_PARTICLE_FX_LOOPED(ptfxRampSparks[2])
|
|
STOP_PARTICLE_FX_LOOPED(ptfxRampSparks[3])
|
|
ptfxRampSparks[2] = NULL
|
|
ptfxRampSparks[3] = NULL
|
|
|
|
iCarCreationEvent = 0
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2 //Second shot: trucks drive past cam towards exit.
|
|
CONVERGE_VALUE(fTrailerDoorRatios[0], 0.0, 0.6, TRUE)
|
|
CONVERGE_VALUE(fTrailerDoorRatios[1], 0.0, 0.6, TRUE)
|
|
|
|
//SET_VEHICLE_DOOR_CONTROL(vehEndTrailers[0], SC_DOOR_BOOT, DT_DOOR_INTACT, fTrailerDoorRatios[0])
|
|
//SET_VEHICLE_DOOR_CONTROL(vehEndTrailers[1], SC_DOOR_BOOT, DT_DOOR_INTACT, fTrailerDoorRatios[1])
|
|
|
|
IF TIMERB() > 800
|
|
IF ptfxRampSparks[0] != NULL
|
|
STOP_PARTICLE_FX_LOOPED(ptfxRampSparks[0])
|
|
STOP_PARTICLE_FX_LOOPED(ptfxRampSparks[1])
|
|
ptfxRampSparks[0] = NULL
|
|
ptfxRampSparks[1] = NULL
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iTrailerRampRaiseSounds[0])
|
|
AND NOT IS_ENTITY_DEAD(vehEndTrailers[0])
|
|
IF IS_ENTITY_PLAYING_ANIM(vehEndTrailers[0], strTrailerRampAnims, "Trailer3_Door_Open")
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(vehEndTrailers[0], strTrailerRampAnims, "Trailer3_Door_Open") < 0.01
|
|
STOP_SOUND(iTrailerRampRaiseSounds[0])
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iTrailerRampRaiseSounds[1])
|
|
AND NOT IS_ENTITY_DEAD(vehEndTrailers[1])
|
|
IF IS_ENTITY_PLAYING_ANIM(vehEndTrailers[1], strTrailerRampAnims, "Trailer3_Door_Open")
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(vehEndTrailers[1], strTrailerRampAnims, "Trailer3_Door_Open") < 0.01
|
|
STOP_SOUND(iTrailerRampRaiseSounds[1])
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF TIMERB() > 1500
|
|
AND HAS_MODEL_LOADED(EMPEROR)
|
|
AND HAS_MODEL_LOADED(HABANERO)
|
|
MODEL_NAMES modelVehicle
|
|
|
|
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
|
|
modelVehicle = EMPEROR
|
|
ELSE
|
|
modelVehicle = HABANERO
|
|
ENDIF
|
|
|
|
IF iCarCreationEvent = 0
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1612.2810, -733.1164, 9.8386>>, 54.6237)
|
|
iCarCreationEvent++
|
|
ELIF iCarCreationEvent = 1
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1627.4, -712.7, 10.4532>>, 53.8765)
|
|
iCarCreationEvent++
|
|
ELIF iCarCreationEvent = 2
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1668.6, -696.3, 10.6189>>, 49.8116)
|
|
iCarCreationEvent++
|
|
ELIF iCarCreationEvent = 3
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1798.2206, -604.9295, 10.4532>>, 50.8837)
|
|
iCarCreationEvent++
|
|
ELIF iCarCreationEvent = 4
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1982.8767, -465.3074, 10.3848>>, 227.3706)
|
|
iCarCreationEvent++
|
|
ELIF iCarCreationEvent = 5
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1930.5171, -523.3510, 10.7951>>, 228.8018)
|
|
iCarCreationEvent++
|
|
ELIF iCarCreationEvent = 6
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1858.2153, -575.5817, 10.7383>>, 230.2613)
|
|
iCarCreationEvent++
|
|
ELIF iCarCreationEvent = 7
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1796.8267, -617.9168, 10.4393>>, 233.3197)
|
|
iCarCreationEvent++
|
|
ELIF iCarCreationEvent = 8
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1779.1719, -653.7441, 10.1227>>, 227.9754)
|
|
iCarCreationEvent++
|
|
ELIF iCarCreationEvent = 9
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1704.9510, -698.3457, 9.8345>>, 234.2902)
|
|
iCarCreationEvent++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF TIMERB() > 2500
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[0], 5000)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[1], 5000)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[0], 5000)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[1], 5000)
|
|
SET_PLAYBACK_SPEED(vehEndTrucks[0], 1.5)
|
|
SET_PLAYBACK_SPEED(vehEndTrucks[1], 1.5)
|
|
SET_PLAYBACK_SPEED(vehEndTrailers[0], 1.5)
|
|
SET_PLAYBACK_SPEED(vehEndTrailers[1], 1.5)
|
|
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndHeli, 1000)
|
|
|
|
WAIT(0)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehEndTrailers[0])
|
|
SET_VEHICLE_DOOR_SHUT(vehEndTrailers[0], SC_DOOR_BOOT, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehEndTrailers[1])
|
|
SET_VEHICLE_DOOR_SHUT(vehEndTrailers[1], SC_DOOR_BOOT, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iTrailerRampRaiseSounds[0])
|
|
STOP_SOUND(iTrailerRampRaiseSounds[0])
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iTrailerRampRaiseSounds[1])
|
|
STOP_SOUND(iTrailerRampRaiseSounds[1])
|
|
ENDIF
|
|
|
|
CLEAR_AREA_OF_VEHICLES(<<-1548.6, -750.5, 10.4>>, 80.0)
|
|
|
|
SHAKE_CAM(camMain, "HAND_SHAKE", 0.1)
|
|
SET_CAM_PARAMS(camMain, <<-1519.964844,-756.131470,10.994718>>,<<1.601808,0.020343,74.378578>>,37.068741, 0)
|
|
SET_CAM_PARAMS(camMain, <<-1524.864136,-754.761719,11.136974>>,<<1.601808,0.020343,74.378578>>,37.068741, 3600, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3 //Third shot: heli enters.
|
|
IF TIMERB() > 2500
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[0], 8500)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[1], 8500)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[0], 8500)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[1], 8500)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndHeli, 1000)
|
|
SET_PLAYBACK_SPEED(vehEndTrucks[0], 1.0)
|
|
SET_PLAYBACK_SPEED(vehEndTrucks[1], 1.0)
|
|
SET_PLAYBACK_SPEED(vehEndTrailers[0], 1.0)
|
|
SET_PLAYBACK_SPEED(vehEndTrailers[1], 1.0)
|
|
|
|
WAIT(0)
|
|
|
|
SHAKE_CAM(camMain, "HAND_SHAKE", 1.0)
|
|
SET_CAM_PARAMS(camMain, <<-1638.905029,-721.330933,25.269371>>,<<12.838796,0.067302,44.328854>>,39.992065, 0)
|
|
SET_CAM_PARAMS(camMain, <<-1638.818726,-721.418518,25.839569>>,<<6.903760,0.067302,45.597054>>,39.992065, 1500, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2A_MISSION_END")
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 4 //Fourth shot: shot looking down (from old cutscene).
|
|
IF NOT bHasTextLabelTriggered[FH3A_ENDC]
|
|
IF TIMERB() > 1000
|
|
IF bHasTextLabelTriggered[FH3A_ENDC_PRELOAD]
|
|
BEGIN_PRELOADED_CONVERSATION()
|
|
bHasTextLabelTriggered[FH3A_ENDC] = TRUE
|
|
ELSE
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_ENDC", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_ENDC] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF TIMERB() > 2500
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[0], 10500)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[1], 10500)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[0], 10500)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[1], 10500)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndHeli, 12000)
|
|
SET_PLAYBACK_SPEED(vehEndTrucks[0], 1.0)
|
|
SET_PLAYBACK_SPEED(vehEndTrucks[1], 1.0)
|
|
SET_PLAYBACK_SPEED(vehEndTrailers[0], 1.0)
|
|
SET_PLAYBACK_SPEED(vehEndTrailers[1], 1.0)
|
|
|
|
WAIT(0)
|
|
|
|
CLEAR_AREA_OF_VEHICLES(<<-1588.6, -737.5, 10.4>>, 40.0)
|
|
|
|
SHAKE_CAM(camMain, "HAND_SHAKE", 0.2)
|
|
SET_CAM_PARAMS(camMain, <<-1659.574463,-707.854370,29.237783>>,<<-7.422939,0.059666,-117.388649>>,43.055702, 0)
|
|
SET_CAM_PARAMS(camMain, <<-1660.918579,-710.748718,28.883806>>,<<-7.502350,0.059666,-111.732796>>,43.055702, 9100, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2A_MISSION_END")
|
|
|
|
SETTIMERB(0)
|
|
iCarCreationEvent = 0
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 5 //Final shot: heli flies off, trucks drive away.
|
|
//Create some random cars off-screen.
|
|
IF TIMERB() > 2800
|
|
AND HAS_MODEL_LOADED(EMPEROR)
|
|
AND HAS_MODEL_LOADED(HABANERO)
|
|
MODEL_NAMES modelVehicle
|
|
|
|
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
|
|
modelVehicle = EMPEROR
|
|
ELSE
|
|
modelVehicle = HABANERO
|
|
ENDIF
|
|
|
|
IF iCarCreationEvent = 0
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1735.7810, -648.1164, 9.8386>>, 54.6237)
|
|
iCarCreationEvent++
|
|
ELIF iCarCreationEvent = 1
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1798.2206, -604.9295, 10.4532>>, 53.8765)
|
|
iCarCreationEvent++
|
|
ELIF iCarCreationEvent = 2
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1839.1724, -557.7636, 10.6189>>, 49.8116)
|
|
iCarCreationEvent++
|
|
ELIF iCarCreationEvent = 3
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1887.6597, -518.9340, 10.8328>>, 50.8837)
|
|
iCarCreationEvent++
|
|
ELIF iCarCreationEvent = 4
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1982.8767, -465.3074, 10.3848>>, 227.3706)
|
|
iCarCreationEvent++
|
|
ELIF iCarCreationEvent = 5
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1930.5171, -523.3510, 10.7951>>, 228.8018)
|
|
iCarCreationEvent++
|
|
ELIF iCarCreationEvent = 6
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1858.2153, -575.5817, 10.7383>>, 230.2613)
|
|
iCarCreationEvent++
|
|
ELIF iCarCreationEvent = 7
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1796.8267, -617.9168, 10.4393>>, 233.3197)
|
|
iCarCreationEvent++
|
|
ELIF iCarCreationEvent = 8
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1779.1719, -653.7441, 10.1227>>, 227.9754)
|
|
iCarCreationEvent++
|
|
ELIF iCarCreationEvent = 9
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle, <<-1714.2510, -683.6457, 10.2345>>, -127.3902)
|
|
iCarCreationEvent++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF TIMERB() > 3800
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[0], 15000)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrucks[1], 15000)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[0], 15000)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndTrailers[1], 15000)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehEndHeli, 15500)
|
|
|
|
WAIT(0)
|
|
|
|
CLEAR_AREA_OF_VEHICLES(<<-1731.7, -650.6, 9.4>>, 40.0)
|
|
|
|
SHAKE_CAM(camMain, "HAND_SHAKE", 0.05)
|
|
SET_CAM_PARAMS(camMain, <<-1627.726318,-723.586487,29.519999>>,<<-20.488827,0.079089,64.552872>>,46.603870, 0)
|
|
SET_CAM_PARAMS(camMain, <<-1629.679810,-722.650574,31.872229>>,<<-0.304170,0.079089,64.135292>>,46.603870, 6600, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 6
|
|
IF TIMERB() > 4500
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Create the traffic manually so it's consistent across shots.
|
|
IF iCurrentEvent > 3
|
|
IF GET_GAME_TIMER() - iChaseCutsceneCarSpawnTimer > 0
|
|
AND HAS_MODEL_LOADED(EMPEROR)
|
|
AND HAS_MODEL_LOADED(HABANERO)
|
|
INT iRandom
|
|
VECTOR vCreationPos
|
|
FLOAT fCreationHeading
|
|
MODEL_NAMES modelVehicle
|
|
|
|
iRandom = GET_RANDOM_INT_IN_RANGE(0, 3)
|
|
|
|
IF iRandom = 0
|
|
vCreationPos = <<-1558.9962, -747.1423, 11.0064>>
|
|
fCreationHeading = 71.2521
|
|
ELIF iRandom = 1
|
|
vCreationPos = <<-1549.2703, -743.0364, 10.5949>>
|
|
fCreationHeading = 74.8274
|
|
ELSE
|
|
vCreationPos = <<-1552.5983, -755.3263, 10.5250>>
|
|
fCreationHeading = 74.8274
|
|
ENDIF
|
|
|
|
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
|
|
modelVehicle = EMPEROR
|
|
ELSE
|
|
modelVehicle = HABANERO
|
|
ENDIF
|
|
|
|
CREATE_RANDOM_CAR_AT_POS(modelVehicle,vCreationPos, fCreationHeading)
|
|
iChaseCutsceneCarSpawnTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 2000)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
IF NOT IS_SCREEN_FADING_OUT()
|
|
DO_SCREEN_FADE_OUT(2000)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehEndHeli)
|
|
SET_FORCE_HD_VEHICLE(vehEndHeli, TRUE)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
IF IS_NEW_LOAD_SCENE_ACTIVE()
|
|
NEW_LOAD_SCENE_STOP()
|
|
ENDIF
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(EMPEROR)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(HABANERO)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(SPEEDO)
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
//Get all of the peds out of the vehicles, then force delete everything else.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<195.7771, 2796.8718, 44.6551>>)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<201.0530, 2795.8323, 44.6551>>)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sCrew[CREW_DRIVER].ped)
|
|
SET_ENTITY_COORDS(sCrew[CREW_DRIVER].ped, <<203.0530, 2795.8323, 44.6551>>)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<201.0530, 2795.8323, 44.6551>>)
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<198.8228, 2795.1470, 44.6551>>)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
REMOVE_PED(pedEndCops[0], TRUE)
|
|
REMOVE_PED(pedEndCops[1], TRUE)
|
|
REMOVE_PED(sCrew[CREW_FORCED_GUNMAN].ped, TRUE)
|
|
REMOVE_PED(sCrew[CREW_FORCED_DRIVER].ped, TRUE)
|
|
REMOVE_PED(sCrew[CREW_DRIVER].ped, TRUE)
|
|
REMOVE_PED(sCrew[CREW_GUNMAN].ped, TRUE)
|
|
REMOVE_ALL_VEHICLES(TRUE)
|
|
|
|
REMOVE_VEHICLE_RECORDING(CARREC_END_TRUCK_1, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_END_TRAILER_1, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_END_TRUCK_2, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_END_TRAILER_2, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_END_HELI, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_CHASE_COPS_BLOCKADE, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_CHASE_COPS_BLOCKADE_2, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_CHASE_TRIGGER, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_TRAILER_RIGHT, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_TRUCK_RIGHT_BAD, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_TRAILER_LEFT, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_1, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_2, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_3_GOOD_TRUCK, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_3_BAD_DRIVER, strCarrec)
|
|
REMOVE_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_3_BAD_TRUCK, strCarrec)
|
|
|
|
REMOVE_ANIM_DICT(strTrailerRampAnims)
|
|
REMOVE_PTFX_ASSET()
|
|
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(1.0)
|
|
CLEAR_VEHICLE_GENERATOR_AREA_OF_INTEREST()
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iTrailerRampRaiseSounds[0])
|
|
STOP_SOUND(iTrailerRampRaiseSounds[0])
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iTrailerRampRaiseSounds[1])
|
|
STOP_SOUND(iTrailerRampRaiseSounds[1])
|
|
ENDIF
|
|
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("BIG_SCORE_TRUCK_RAMP")
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
eMissionStage = STAGE_DROP_OFF_TRUCKS_CUTSCENE
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
IF NOT IS_SCREEN_FADING_OUT()
|
|
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DO_DROP_OFF_TRUCKS_CUTSCENE()
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF SETUP_REQ_PLAYER_IS_FRANKLIN()
|
|
AND SETUP_REQ_MICHAEL(<<201.0530, 2795.8323, 44.6551>>)
|
|
AND SETUP_REQ_TREVOR(<<195.7771, 2796.8718, 44.6551>>)
|
|
iCurrentTake = iMaxTakeConsideringCrew
|
|
|
|
IF NOT bPickedGoodCarDriver
|
|
AND NOT g_bBigScore2ARescuedBadDriver
|
|
iTakePenaltyCrewDies = iMaxTakeConsideringCrew / 4
|
|
iCurrentTake -= iTakePenaltyCrewDies
|
|
ENDIF
|
|
|
|
iDisplayedTake = iCurrentTake
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
IF iCurrentEvent != 99
|
|
IF bHasUsedCheckpoint
|
|
START_REPLAY_SETUP(<<198.8228, 2795.1470, 44.6551>>, 0.0, FALSE)
|
|
|
|
iCurrentEvent = 99
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<198.8228, 2795.1470, 44.6551>>)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
iCurrentEvent = 99
|
|
ENDIF
|
|
ELSE
|
|
IF SETUP_REQ_MICHAELS_CAR(<<200.0565, 2802.0796, 44.6551>>, 136.8986)
|
|
AND SETUP_REQ_MICHAEL(<<201.0530, 2795.8323, 44.6551>>)
|
|
AND SETUP_REQ_TREVOR(<<195.7771, 2796.8718, 44.6551>>)
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
REMOVE_PED(sCrew[CREW_GUNMAN].ped, TRUE)
|
|
REMOVE_PED(sCrew[CREW_DRIVER].ped, TRUE)
|
|
BLOCK_PEDS_AT_DROP_OFF(TRUE)
|
|
|
|
//Warp everyone into position and reset their outfits.
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<198.8228, 2795.1470, 44.6551>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 351.1441)
|
|
RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
|
|
REMOVE_PED_COMP_ITEM_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
|
|
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN, bHasChangedClothesFranklin)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], <<195.7771, 2796.8718, 44.6551>>)
|
|
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 334.2309)
|
|
//RESTORE_PLAYER_PED_VARIATIONS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT)
|
|
REMOVE_PED_COMP_ITEM_SP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_PROPS, PROPS_P0_HEADSET)
|
|
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL)
|
|
|
|
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
SET_ENTITY_INVINCIBLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 200)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 200)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<201.0530, 2795.8323, 44.6551>>)
|
|
SET_ENTITY_HEADING(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 17.1842)
|
|
//RESTORE_PLAYER_PED_VARIATIONS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT)
|
|
REMOVE_PED_COMP_ITEM_SP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], COMP_TYPE_PROPS, PROPS_P2_HEADSET)
|
|
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR)
|
|
|
|
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
SET_ENTITY_INVINCIBLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 200)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 200)
|
|
ENDIF
|
|
|
|
REQUEST_CUTSCENE("bs_2a_mcs_11")
|
|
|
|
WHILE NOT HAS_CUTSCENE_LOADED()
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_mcs_11")
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehMichaelsCar)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(vehMichaelsCar, "rear_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, DUMMY_MODEL_FOR_SCRIPT, CEO_IS_CASCADE_SHADOW_FOCUS_ENTITY_DURING_EXIT)
|
|
ENDIF
|
|
|
|
SET_AGGRESSIVE_HORNS(FALSE)
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
SET_POLICE_RADAR_BLIPS(TRUE)
|
|
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), TRUE)
|
|
SET_CREATE_RANDOM_COPS(TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
|
|
SET_RANDOM_TRAINS(TRUE)
|
|
CLEAR_TRIGGERED_LABELS()
|
|
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
START_CUTSCENE()
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
SETTIMERB(0)
|
|
bPlayersCarExitStateHasBeenHit = FALSE
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
bSkippedMocap = TRUE
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0
|
|
IF IS_CUTSCENE_PLAYING()
|
|
CLEAR_AREA(<<195.7771, 2796.8718, 44.6551>>, 500.0, TRUE)
|
|
|
|
SET_VEHICLE_MODEL_PLAYER_WILL_EXIT_SCENE(modelChaseCars)
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF IS_VEHICLE_DRIVEABLE(vehMichaelsCar)
|
|
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("rear_car")
|
|
SET_VEHICLE_DOORS_SHUT(vehMichaelsCar)
|
|
SET_VEHICLE_ENGINE_ON(vehMichaelsCar, TRUE, TRUE)
|
|
|
|
bPlayersCarExitStateHasBeenHit = TRUE
|
|
ELIF NOT bPlayersCarExitStateHasBeenHit
|
|
SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION(vehMichaelsCar)
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], vehMichaelsCar, VS_FRONT_RIGHT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], vehMichaelsCar, VS_BACK_LEFT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehMichaelsCar, VS_DRIVER)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
|
|
IF NOT bSkippedMocap
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehMichaelsCar)
|
|
SET_VEHICLE_BRAKE_LIGHTS(vehMichaelsCar, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
REPLAY_STOP_EVENT()
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
eMissionStage = STAGE_GO_TO_MICHAELS_HOUSE
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_GO_TO_MICHAELS_HOUSE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC GO_TO_MICHAELS_HOUSE()
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF iCurrentEvent != 99
|
|
IF bHasUsedCheckpoint
|
|
START_REPLAY_SETUP(<<198.8228, 2795.1470, 44.6551>>, 0.0, FALSE)
|
|
|
|
iCurrentEvent = 99
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<198.8228, 2795.1470, 44.6551>>)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
WAIT(0)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
iCurrentEvent = 99
|
|
ENDIF
|
|
|
|
WHILE NOT SETUP_REQ_PLAYER_IS_FRANKLIN()
|
|
OR NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
OR NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
OR NOT DOES_ENTITY_EXIST(vehMichaelsCar)
|
|
SETUP_REQ_MICHAEL(<<201.0530, 2795.8323, 44.6551>>)
|
|
SETUP_REQ_TREVOR(<<195.7771, 2796.8718, 44.6551>>)
|
|
SETUP_REQ_MICHAELS_CAR(<<200.0565, 2802.0796, 44.6551>>, 136.8986)
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
BLOCK_PEDS_AT_DROP_OFF(TRUE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehMichaelsCar)
|
|
//Warp everyone into position and reset their outfits.
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehMichaelsCar)
|
|
RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
|
|
REMOVE_PED_COMP_ITEM_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], vehMichaelsCar, VS_FRONT_RIGHT)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT)
|
|
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
SET_ENTITY_INVINCIBLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
|
|
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 200)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 200)
|
|
REMOVE_PED_COMP_ITEM_SP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_PROPS, PROPS_P0_HEADSET)
|
|
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_MICHAEL)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], vehMichaelsCar, VS_BACK_LEFT)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT)
|
|
REMOVE_PED_COMP_ITEM_SP(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], COMP_TYPE_PROPS, PROPS_P2_HEADSET)
|
|
SET_PED_USING_ACTION_MODE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
SET_ENTITY_INVINCIBLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], FALSE)
|
|
SET_PED_MAX_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 200)
|
|
SET_ENTITY_HEALTH(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 200)
|
|
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_TREVOR)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
|
|
WHILE TIMERA() < 3000
|
|
IF (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
|
|
AND (NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("Streaming completed/timed out: ", TIMERA())
|
|
#ENDIF
|
|
|
|
SETTIMERA(100000)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
CLEAR_AREA(<<195.7771, 2796.8718, 44.6551>>, 500.0, TRUE)
|
|
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
iCurrentTake = iMaxTakeConsideringCrew
|
|
|
|
IF NOT bPickedGoodCarDriver
|
|
AND NOT g_bBigScore2ARescuedBadDriver
|
|
iTakePenaltyCrewDies = iMaxTakeConsideringCrew / 4
|
|
iCurrentTake -= iTakePenaltyCrewDies
|
|
ENDIF
|
|
|
|
iDisplayedTake = iCurrentTake
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
SET_MICHAELS_HOUSE_FOR_FINAL_CUTSCENE(TRUE)
|
|
REASSIGN_PLAYER_CHAR_DIALOGUE_SPEAKERS()
|
|
|
|
SET_AGGRESSIVE_HORNS(FALSE)
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
SET_POLICE_RADAR_BLIPS(TRUE)
|
|
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), TRUE)
|
|
SET_CREATE_RANDOM_COPS(TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
|
|
SET_RANDOM_TRAINS(TRUE)
|
|
CLEAR_TRIGGERED_LABELS()
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_GO_HOME, "GO_HOME", TRUE)
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SET_HEIST_CREW_END_SCREEN_STATUSES()
|
|
INCREMENT_ALL_CREW_MEMBER_STATS_DURING_HEIST(HEIST_FINALE, TRUE)
|
|
|
|
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_DOWN, FALSE)
|
|
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_UP, FALSE)
|
|
|
|
TRIGGER_MUSIC_EVENT("FH2A_FINAL_DRIVE_RADIO")
|
|
|
|
SETTIMERA(0)
|
|
SETTIMERB(0)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 15.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
#IF IS_DEBUG_BUILD
|
|
DONT_DO_J_SKIP(sLocatesData)
|
|
#ENDIF
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0
|
|
IS_PLAYER_AT_LOCATION_WITH_BUDDIES_ANY_MEANS(sLocatesData, vMichaelsHousePos, <<0.001, 0.001, LOCATE_SIZE_HEIGHT>>, TRUE, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL],
|
|
sSelectorPeds.pedID[SELECTOR_PED_TREVOR], NULL, "F3A_MIKEHOME", "CMN_MLEAVE", "CMN_TLEAVE", "", "F3A_LEFTCREW",
|
|
FALSE, TRUE)
|
|
|
|
//Dialogue for the journey.
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
AND IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND ARE_CHARS_IN_SAME_VEHICLE(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND ARE_CHARS_IN_SAME_VEHICLE(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
|
|
ENDIF
|
|
|
|
IF NOT bHasTextLabelTriggered[FH3A_TALK]
|
|
IF TIMERA() > 10000
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_TALK", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_TALK] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_TALK2]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
//IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_TALK2", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_TALK2] = TRUE
|
|
//ENDIF
|
|
ENDIF
|
|
ELIF NOT bHasTextLabelTriggered[FH3A_FNEAR]
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMichaelsHousePos) < 2500.0
|
|
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-812.726990,171.304443,82.298965>>, <<-845.853821,173.509262,60.365059>>, 35.500000)
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
//IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_FNEAR", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_FNEAR] = TRUE
|
|
//ENDIF
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF bHasTextLabelTriggered[FH3A_TALK]
|
|
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Set the warp flag on the buddies if they're not moving but they're in the player's group
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF GET_ENTITY_SPEED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) < 0.25
|
|
AND IS_PED_GROUP_MEMBER(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PLAYER_GROUP_ID())
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_TeleportToLeaderVehicle, TRUE)
|
|
ELSE
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_TeleportToLeaderVehicle, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF GET_ENTITY_SPEED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) < 0.25
|
|
AND IS_PED_GROUP_MEMBER(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PLAYER_GROUP_ID())
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_TeleportToLeaderVehicle, TRUE)
|
|
ELSE
|
|
SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PCF_TeleportToLeaderVehicle, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-823.896912,175.752808,70.023056>>, <<-816.462646,178.295502,74.782898>>, 9.500000)
|
|
OR (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-815.577087,178.607849,67.653091>>, <<-829.362427,174.757614,75.670959>>, 17.750000))
|
|
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
|
|
ENDIF
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF NOT bHasTextLabelTriggered[FH3A_LESTER]
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])) < 625.0
|
|
//IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_LESTER", CONV_PRIORITY_MEDIUM)
|
|
bHasTextLabelTriggered[FH3A_LESTER] = TRUE
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
|
|
UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE)
|
|
|
|
IF iLesterEndEvent >= 50
|
|
AND TIMERB() > 1000
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ELSE
|
|
VEHICLE_INDEX vehPlayerVehicle
|
|
vehPlayerVehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID(), TRUE)
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehPlayerVehicle)
|
|
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vehPlayerVehicle, DEFAULT, 1)
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//Pre-stream the final cutscene
|
|
FLOAT fDistFromHouse = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMichaelsHousePos)
|
|
|
|
IF fDistFromHouse < 22500.0
|
|
IF NOT DOES_ENTITY_EXIST(pedLester)
|
|
iLesterEndEvent = 0
|
|
ENDIF
|
|
|
|
SETUP_REQ_MICHAELS_HOUSE_INTERIOR_LOADED()
|
|
SETUP_REQ_LESTER(<<-812.9495, 179.6283, 71.1592>>, 109.5783)
|
|
|
|
REQUEST_ANIM_DICT(strAnimsLesterLeadIn)
|
|
|
|
//Lester was just created, give him a look task.
|
|
IF NOT IS_PED_INJURED(pedLester)
|
|
IF iLesterEndEvent = 0
|
|
IF HAS_ANIM_DICT_LOADED(strAnimsLesterLeadIn)
|
|
TASK_LOOK_AT_ENTITY(pedLester, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
|
|
TASK_PLAY_ANIM(pedLester, strAnimsLesterLeadIn, "Lester_Left_hand_override_bottle", DEFAULT, DEFAULT, DEFAULT, AF_LOOPING | AF_SECONDARY | AF_UPPERBODY)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedLester, TRUE)
|
|
iLesterEndEvent++
|
|
ENDIF
|
|
ELIF iLesterEndEvent = 1
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-815.577087,178.607849,67.653091>>, <<-829.362427,174.757614,75.670959>>, 17.750000)
|
|
TASK_GO_STRAIGHT_TO_COORD(pedLester, <<-817.2549, 178.0433, 71.2275>>, PEDMOVE_WALK)
|
|
iLesterEndEvent = 50
|
|
ENDIF
|
|
ELIF iLesterEndEvent = 50
|
|
SET_PED_MOVE_RATE_OVERRIDE(pedLester, 0.6)
|
|
ENDIF
|
|
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedLester, PLAYER_PED_ID())
|
|
APPLY_DAMAGE_TO_PED(pedLester, GET_ENTITY_HEALTH(pedLester) + 50, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Create and animate the doors.
|
|
IF NOT DOES_ENTITY_EXIST(objMichaelsHouseDoors[0])
|
|
REQUEST_MODEL(modelMichaelsDoorLeft)
|
|
REQUEST_MODEL(modelMichaelsDoorRight)
|
|
|
|
IF HAS_MODEL_LOADED(modelMichaelsDoorLeft)
|
|
AND HAS_MODEL_LOADED(modelMichaelsDoorRight)
|
|
AND HAS_ANIM_DICT_LOADED(strAnimsLesterLeadIn)
|
|
IF NOT DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[0])
|
|
objMichaelsHouseMapDoors[0] = GET_CLOSEST_OBJECT_OF_TYPE(<<-816.7168, 179.0980, 72.82>>, 4.0, modelMichaelsDoorLeft)
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[1])
|
|
objMichaelsHouseMapDoors[1] = GET_CLOSEST_OBJECT_OF_TYPE(<<-816.1068, 177.5109, 72.82>>, 4.0, modelMichaelsDoorRight)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[0])
|
|
SET_ENTITY_VISIBLE(objMichaelsHouseMapDoors[0], FALSE)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[1])
|
|
SET_ENTITY_VISIBLE(objMichaelsHouseMapDoors[1], FALSE)
|
|
ENDIF
|
|
|
|
objMichaelsHouseDoors[0] = CREATE_OBJECT(modelMichaelsDoorLeft, <<-818.6, 176.8, 72.4>>)
|
|
objMichaelsHouseDoors[1] = CREATE_OBJECT(modelMichaelsDoorRight, <<-819.6, 176.8, 72.4>>)
|
|
|
|
iSyncSceneMichaelsHouseDoors = CREATE_SYNCHRONIZED_SCENE(<<-817.305, 179.330, 71.241>>, <<0.000, 0.000, -113.000>>)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objMichaelsHouseDoors[0], iSyncSceneMichaelsHouseDoors, "_leadin_doorl","missbigscore2aleadinout@bs_2a_ext",
|
|
INSTANT_BLEND_IN, INSTANT_BLEND_OUT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objMichaelsHouseDoors[1], iSyncSceneMichaelsHouseDoors, "_leadin_doorr","missbigscore2aleadinout@bs_2a_ext",
|
|
INSTANT_BLEND_IN, INSTANT_BLEND_OUT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneMichaelsHouseDoors, 0.0)
|
|
SET_SYNCHRONIZED_SCENE_RATE(iSyncSceneMichaelsHouseDoors, 0.0)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelMichaelsDoorLeft)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelMichaelsDoorRight)
|
|
ENDIF
|
|
ELSE
|
|
//Once the player gets close open the doors.
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneMichaelsHouseDoors)
|
|
AND GET_SYNCHRONIZED_SCENE_RATE(iSyncSceneMichaelsHouseDoors) = 0.0
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-815.577087,178.607849,67.653091>>, <<-829.362427,174.757614,75.670959>>, 17.750000)
|
|
SET_SYNCHRONIZED_SCENE_RATE(iSyncSceneMichaelsHouseDoors, 0.8)
|
|
|
|
SET_ENTITY_COLLISION(objMichaelsHouseDoors[0], FALSE)
|
|
SET_ENTITY_COLLISION(objMichaelsHouseDoors[1], FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF fDistFromHouse > 40000.0
|
|
IF interiorMichaelsHouse != NULL
|
|
UNPIN_INTERIOR(interiorMichaelsHouse)
|
|
interiorMichaelsHouse = NULL
|
|
ENDIF
|
|
|
|
REMOVE_OBJECT(objwalkingStick, TRUE)
|
|
REMOVE_OBJECT(objMichaelsHouseDoors[0], TRUE)
|
|
REMOVE_OBJECT(objMichaelsHouseDoors[1], TRUE)
|
|
REMOVE_PED(pedLester, TRUE)
|
|
REMOVE_ANIM_DICT(strAnimsLesterLeadIn)
|
|
|
|
IF DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[0])
|
|
SET_ENTITY_VISIBLE(objMichaelsHouseMapDoors[0], TRUE)
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(objMichaelsHouseMapDoors[0])
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[1])
|
|
SET_ENTITY_VISIBLE(objMichaelsHouseMapDoors[1], TRUE)
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(objMichaelsHouseMapDoors[1])
|
|
ENDIF
|
|
|
|
iSyncSceneMichaelsHouseDoors = -1
|
|
ENDIF
|
|
|
|
IF fDistFromHouse < (DEFAULT_CUTSCENE_LOAD_DIST * DEFAULT_CUTSCENE_LOAD_DIST)
|
|
IF DOES_ENTITY_EXIST(pedLester)
|
|
REQUEST_CUTSCENE("bs_2a_ext")
|
|
SET_SRL_FORCE_PRESTREAM(SRL_PRESTREAM_FORCE_OFF)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_ext")
|
|
ENDIF
|
|
ELIF fDistFromHouse > (DEFAULT_CUTSCENE_UNLOAD_DIST * DEFAULT_CUTSCENE_UNLOAD_DIST)
|
|
IF IS_CUTSCENE_ACTIVE()
|
|
REMOVE_CUTSCENE()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fail for abandoning any of the buddies.
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
FLOAT fDistFromTrevor = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]))
|
|
FLOAT fDistFromMichael = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]))
|
|
|
|
IF fDistFromTrevor > 90000.0 OR fDistFromMichael > 90000.0
|
|
IF fDistFromTrevor > 90000.0
|
|
IF fDistFromMichael > 10000.0
|
|
MISSION_FAILED(FAILED_LEFT_CREW_BEHIND)
|
|
ELSE
|
|
MISSION_FAILED(FAILED_LEFT_TREVOR_BEHIND)
|
|
ENDIF
|
|
ELSE
|
|
MISSION_FAILED(FAILED_LEFT_MICHAEL_BEHIND)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
REPLAY_RECORD_BACK_FOR_TIME(10.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
|
|
SETTIMERA(0) //For timing the next cutscene start
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
eMissionStage = STAGE_FINAL_CUTSCENE
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
JUMP_TO_STAGE(STAGE_FINAL_CUTSCENE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
PROC DO_FINAL_CUTSCENE()
|
|
DISABLE_VEH_CONTROLS_THIS_FRAME()
|
|
|
|
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
IF iCurrentEvent != 99
|
|
IF bHasUsedCheckpoint
|
|
START_REPLAY_SETUP(<<-820.6664, 176.5967, 70.6085>>, 0.0, FALSE)
|
|
|
|
iCurrentEvent = 99
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-820.6664, 176.5967, 70.6085>>)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
LOAD_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
iCurrentEvent = 99
|
|
ENDIF
|
|
ELSE
|
|
IF SETUP_REQ_PLAYER_IS_FRANKLIN()
|
|
AND SETUP_REQ_MICHAEL(<<-820.6664, 174.5967, 70.6085>>)
|
|
AND SETUP_REQ_TREVOR(<<-820.6664, 178.5967, 70.6085>>)
|
|
AND SETUP_REQ_MICHAELS_HOUSE_INTERIOR_LOADED()
|
|
AND SETUP_REQ_LESTER(<<-815.1111, 178.8064, 71.1592>>, 111.8100)
|
|
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
|
|
SET_MICHAELS_HOUSE_FOR_FINAL_CUTSCENE(TRUE)
|
|
iCurrentTake = iMaxTakeConsideringCrew
|
|
|
|
IF NOT bPickedGoodCarDriver
|
|
AND NOT g_bBigScore2ARescuedBadDriver
|
|
iTakePenaltyCrewDies = iMaxTakeConsideringCrew / 4
|
|
iCurrentTake -= iTakePenaltyCrewDies
|
|
ENDIF
|
|
|
|
REMOVE_PED_COMP_ITEM_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P1_HEADSET)
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_PROPS, PROPS_P0_HEADSET)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
REMOVE_PED_COMP_ITEM_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_PROPS, PROPS_P2_HEADSET)
|
|
ENDIF
|
|
|
|
iDisplayedTake = iCurrentTake
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
|
|
ENDIF
|
|
|
|
REQUEST_CUTSCENE("bs_2a_ext")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATIONS("bs_2a_ext")
|
|
|
|
IF TIMERA() > 1000
|
|
AND (NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF) OR TIMERA() > 10000)
|
|
AND HAS_CUTSCENE_LOADED()
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
//REGISTER_ENTITY_FOR_CUTSCENE(NULL, "driver_selection", CU_DONT_ANIMATE_ENTITY, GET_CREW_MEMBER_MODEL(GET_HEIST_CREW_MEMBER_AT_INDEX(HEIST_FINALE, CREW_DRIVER)))
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "Michael", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(pedLester)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(pedLester, "Lester", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
//IF IS_VEHICLE_DRIVEABLE(vehMichaelsCar)
|
|
// REGISTER_ENTITY_FOR_CUTSCENE(vehMichaelsCar, "Michaels_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
//ENDIF
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
START_CUTSCENE()
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, TRUE, FALSE)
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
bMissionPassedScreenDisplayed = FALSE
|
|
//bPlayerExitStateHit = FALSE
|
|
//bCameraExitStateHit = FALSE
|
|
iCurrentEvent = 0
|
|
bSkippedMocap = FALSE
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
SWITCH iCurrentEvent
|
|
CASE 0
|
|
IF IS_CUTSCENE_PLAYING()
|
|
//Move the last vehicle somewhere if it's in the way.
|
|
VEHICLE_INDEX vehFinalCar
|
|
vehFinalCar = GET_PLAYERS_LAST_VEHICLE()
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehFinalCar)
|
|
IF IS_ENTITY_AT_COORD(vehFinalCar, vMichaelsHousePos, <<25.0, 25.0, 10.0>>)
|
|
PED_INDEX pedDriver
|
|
IF NOT IS_VEHICLE_SEAT_FREE(vehFinalCar)
|
|
pedDriver = GET_PED_IN_VEHICLE_SEAT(vehFinalCar)
|
|
ENDIF
|
|
|
|
//Don't warp if we arrived as a passenger (e.g. in a taxi ride)
|
|
IF pedDriver = NULL OR pedDriver = PLAYER_PED_ID()
|
|
SET_ENTITY_AS_MISSION_ENTITY(vehFinalCar)
|
|
SET_ENTITY_COORDS(vehFinalCar, <<-831.2876, 169.8409, 68.9352>>)
|
|
SET_ENTITY_HEADING(vehFinalCar, 335.8960)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vehFinalCar)
|
|
SET_VEHICLE_DOORS_SHUT(vehFinalCar)
|
|
SET_VEHICLE_ENGINE_ON(vehFinalCar, FALSE, FALSE)
|
|
SET_VEHICLE_LIGHTS(vehFinalCar, FORCE_VEHICLE_LIGHTS_OFF)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_VEH_RADIO_STATION(vehFinalCar, "OFF")
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[0])
|
|
SET_ENTITY_VISIBLE(objMichaelsHouseMapDoors[0], TRUE)
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(objMichaelsHouseMapDoors[0])
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(objMichaelsHouseMapDoors[1])
|
|
SET_ENTITY_VISIBLE(objMichaelsHouseMapDoors[1], TRUE)
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(objMichaelsHouseMapDoors[1])
|
|
ENDIF
|
|
|
|
//Get rid of Lester's stick.
|
|
REMOVE_OBJECT(objwalkingStick, TRUE)
|
|
REMOVE_OBJECT(objBeer, TRUE)
|
|
REMOVE_OBJECT(objMichaelsHouseDoors[0], TRUE)
|
|
REMOVE_OBJECT(objMichaelsHouseDoors[1], TRUE)
|
|
|
|
CLEAR_AREA(vMichaelsHousePos, 200.0, TRUE)
|
|
REMOVE_ANIM_DICT(strAnimsLesterLeadIn)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
DO_FADE_IN_WITH_WAIT()
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
IF NOT bSkippedMocap
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
bSkippedMocap = TRUE
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
IF GET_CUTSCENE_TIME() > 93000
|
|
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
OR bSkippedMocap
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
//bCameraExitStateHit = TRUE
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
|
|
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 7500, 0.0)
|
|
//bPlayerExitStateHit = TRUE
|
|
ENDIF
|
|
|
|
/*IF (bPlayerExitStateHit AND bCameraExitStateHit)
|
|
OR bSkippedMocap
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
|
|
IF NOT bSkippedMocap
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_EXT_LO", CONV_PRIORITY_MEDIUM)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent = 50
|
|
ENDIF
|
|
ELSE
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
SETTIMERB(0)
|
|
iCurrentEvent = 50
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
SETTIMERB(0)
|
|
iCurrentEvent = 50
|
|
ENDIF*/
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
OR bSkippedMocap
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
|
|
/*IF NOT bSkippedMocap
|
|
IF CREATE_CONVERSATION(sConversationPeds, "FH3AAUD", "FH3A_EXT_LO", CONV_PRIORITY_MEDIUM)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent = 50
|
|
ENDIF
|
|
ELSE
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
SETTIMERB(0)
|
|
iCurrentEvent = 50
|
|
ENDIF*/
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
SETTIMERB(0)
|
|
iCurrentEvent = 50
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 50
|
|
IF IS_SCREEN_FADED_OUT()
|
|
OR TIMERB() > 0
|
|
//OR TIMERB() > 1250
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
AND NOT IS_SCREEN_FADING_OUT()
|
|
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
SET_NO_LOADING_SCREEN(TRUE)
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 51 //Once the screen has faded out trigger the mission passed screen.
|
|
IF TIMERB() > 3000
|
|
OR IS_SCREEN_FADED_OUT()
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
REMOVE_PED(pedLester, TRUE)
|
|
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
|
|
REMOVE_VEHICLE(vehMichaelsCar, TRUE)
|
|
|
|
DESTROY_ALL_CAMS()
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
|
|
IF interiorMichaelsHouse != NULL
|
|
UNPIN_INTERIOR(interiorMichaelsHouse)
|
|
interiorMichaelsHouse = NULL
|
|
ENDIF
|
|
|
|
SET_END_SCREEN_TAKE()
|
|
TRIGGER_MISSION_STATS_UI(TRUE, TRUE)
|
|
|
|
IF NOT IS_REPEAT_PLAY_ACTIVE()
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
CLEAR_AREA(vFranklinPostMissionPos, 100.0, TRUE)
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
|
|
WHILE NOT SETUP_REQ_FRANKLINS_BIKE(vFranklinPostMissionPos, fFranklinPostMissionHeading)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehFranklinsBike)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehFranklinsBike)
|
|
|
|
SET_ENTITY_HEADING(vehFranklinsBike, fFranklinPostMissionHeading)
|
|
SET_ENTITY_COORDS(vehFranklinsBike, vFranklinPostMissionPos)
|
|
|
|
FREEZE_ENTITY_POSITION(vehFranklinsBike, TRUE)
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
NEW_LOAD_SCENE_START(<<-2431.2317, -231.8247, 17.1559>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-3.0038, 0.0000, 61.4522>>), 300.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
|
|
ENDIF
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 52 //Wait for the screen to display, then continue
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF g_bResultScreenDisplaying
|
|
OR GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_stat_watcher")) < 1
|
|
bMissionPassedScreenDisplayed = TRUE
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 53 //Progress once the screen is gone.
|
|
IF NOT g_bResultScreenDisplaying
|
|
IF IS_REPEAT_PLAY_ACTIVE()
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ELSE
|
|
IF (IS_NEW_LOAD_SCENE_ACTIVE() AND IS_NEW_LOAD_SCENE_LOADED())
|
|
OR TIMERB() > 15000
|
|
CLEAR_AREA(vFranklinPostMissionPos, 50.0, TRUE)
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehFranklinsBike)
|
|
SET_VEHICLE_FIXED(vehFranklinsBike)
|
|
FREEZE_ENTITY_POSITION(vehFranklinsBike, FALSE)
|
|
|
|
SET_ENTITY_HEADING(vehFranklinsBike, fFranklinPostMissionHeading)
|
|
SET_ENTITY_COORDS(vehFranklinsBike, vFranklinPostMissionPos)
|
|
|
|
SET_VEHICLE_ENGINE_ON(vehFranklinsBike, TRUE, TRUE)
|
|
SET_VEHICLE_RADIO_ENABLED(vehFranklinsBike, TRUE)
|
|
SET_VEH_RADIO_STATION(vehFranklinsBike, "RADIO_03_HIPHOP_NEW")
|
|
ENDIF
|
|
|
|
SET_NO_LOADING_SCREEN(FALSE)
|
|
|
|
//New version.
|
|
DESTROY_ALL_CAMS()
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(3000)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
DISABLE_VEH_CONTROLS_THIS_FRAME()
|
|
SET_AMBIENT_VEHICLE_RANGE_MULTIPLIER_THIS_FRAME(2.0)
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehFranklinsBike)
|
|
SET_VEHICLE_FORWARD_SPEED(vehFranklinsBike, 15.0)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
|
|
//Old version
|
|
/*camMain = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<1324.220093,628.036438,87.027969>>,<<-2.527736,0.512502,133.285507>>,50.000000, TRUE)
|
|
SET_CAM_PARAMS(camMain, <<1324.267700,628.066162,85.775108>>,<<-2.527736,0.512502,133.285507>>,50.000000, 4000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
|
|
SHAKE_CAM(camMain, "HAND_SHAKE", 0.05)
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
SETTIMERB(0)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
IF NOT IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
DISABLE_VEH_CONTROLS_THIS_FRAME()
|
|
SET_AMBIENT_VEHICLE_RANGE_MULTIPLIER_THIS_FRAME(2.0)
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehFranklinsBike)
|
|
SET_VEHICLE_FORWARD_SPEED(vehFranklinsBike, 15.0)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
iCurrentEvent++*/
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
/*CASE 54 //Finish final shot.
|
|
IF NOT IS_ENTITY_DEAD(vehFranklinsBike)
|
|
SET_VEHICLE_FORWARD_SPEED(vehFranklinsBike, 15.0)
|
|
ENDIF
|
|
|
|
SET_AMBIENT_VEHICLE_RANGE_MULTIPLIER_THIS_FRAME(2.0)
|
|
|
|
IF TIMERB() > 2000
|
|
//DESTROY_ALL_CAMS()
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
RENDER_SCRIPT_CAMS(FALSE, TRUE, 2000, FALSE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
SETTIMERB(0)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 55 //Wait for interp to finish.
|
|
IF NOT IS_ENTITY_DEAD(vehFranklinsBike)
|
|
SET_VEHICLE_FORWARD_SPEED(vehFranklinsBike, 15.0)
|
|
ENDIF
|
|
|
|
SET_AMBIENT_VEHICLE_RANGE_MULTIPLIER_THIS_FRAME(2.0)
|
|
|
|
IF TIMERB() > 2000
|
|
DESTROY_ALL_CAMS()
|
|
|
|
eSectionStage = SECTION_STAGE_CLEANUP
|
|
ENDIF
|
|
BREAK*/
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_CLEANUP
|
|
NEW_LOAD_SCENE_STOP()
|
|
REPLAY_STOP_EVENT()
|
|
REMOVE_PED(pedLester, TRUE)
|
|
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE)
|
|
REMOVE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
|
|
|
|
REMOVE_VEHICLE(vehMichaelsCar, TRUE)
|
|
|
|
REMOVE_VEHICLE(vehFranklinsBike, FALSE)
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
SET_SRL_FORCE_PRESTREAM(SRL_PRESTREAM_DEFAULT)
|
|
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
MISSION_PASSED(FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
DO_FADE_OUT_WITH_WAIT()
|
|
|
|
STOP_CUTSCENE()
|
|
|
|
bSkippedMocap = TRUE
|
|
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
///Fail checks that are relevant across the entire mission or over a number of stages.
|
|
PROC DO_GLOBAL_FAIL_CHECKS()
|
|
IF NOT bMissionPassedScreenDisplayed
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
AND IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
|
|
MISSION_FAILED(FAILED_FRANKLIN_DIED)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
AND IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
MISSION_FAILED(FAILED_MICHAEL_DIED)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
AND IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
MISSION_FAILED(FAILED_TREVOR_DIED)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(pedGateSecurity)
|
|
AND IS_PED_INJURED(pedGateSecurity)
|
|
MISSION_FAILED(FAILED_ALERTED_BANK_BY_KILLING_SECURITY)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(pedLester)
|
|
AND IS_PED_INJURED(pedLester)
|
|
MISSION_FAILED(FAILED_LESTER_DIED)
|
|
ENDIF
|
|
|
|
//Crew member deaths: usually the mission will fail, but a crew member can die without failing during the chase section.
|
|
INT i = 0
|
|
INT iNumCrewAlive = 0
|
|
REPEAT COUNT_OF(sCrew) i
|
|
IF DOES_ENTITY_EXIST(sCrew[i].ped)
|
|
IF NOT IS_PED_INJURED(sCrew[i].ped)
|
|
OR (NOT bPickedGoodCarDriver AND i = CREW_DRIVER AND eMissionStage >= STAGE_CHASE)
|
|
iNumCrewAlive++
|
|
ENDIF
|
|
ELSE
|
|
iNumCrewAlive++
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF iNumCrewAlive < COUNT_OF(sCrew)
|
|
IF iNumCrewAlive = 0
|
|
MISSION_FAILED(FAILED_CREW_MEMBERS_DIED)
|
|
ELSE
|
|
IF eMissionStage != STAGE_CHASE
|
|
MISSION_FAILED(FAILED_CREW_MEMBER_DIED)
|
|
ELIF bPickedGoodCarDriver
|
|
MISSION_FAILED(FAILED_CREW_MEMBER_DIED)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Car deaths: the crew member's gold car can die during the chase, but not elsewhere.
|
|
INT iNumCarsAlive = 0
|
|
REPEAT COUNT_OF(sGoldCars) i
|
|
IF DOES_ENTITY_EXIST(sGoldCars[i].veh)
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
|
|
OR (i = 2 AND eMissionStage >= STAGE_CHASE)
|
|
iNumCarsAlive++
|
|
ENDIF
|
|
ELSE
|
|
iNumCarsAlive++
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF iNumCarsAlive < COUNT_OF(sGoldCars)
|
|
IF iNumCarsAlive = 0
|
|
MISSION_FAILED(FAILED_GOLD_CARS_DESTROYED)
|
|
ELSE
|
|
IF iNumCarsAlive = COUNT_OF(sGoldCars) - 1
|
|
MISSION_FAILED(FAILED_GOLD_CAR_DESTROYED)
|
|
ELSE
|
|
MISSION_FAILED(FAILED_SOME_GOLD_CARS_DESTROYED)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
//Gold van deaths: after the shootout they're not needed
|
|
IF eMissionStage <= STAGE_SHOOTOUT
|
|
INT iNumVansDead = 0
|
|
REPEAT COUNT_OF(sGoldVans) i
|
|
IF DOES_ENTITY_EXIST(sGoldVans[i].veh)
|
|
IF NOT IS_VEHICLE_DRIVEABLE(sGoldVans[i].veh)
|
|
iNumVansDead++
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF iNumVansDead > 0
|
|
IF iNumVansDead > 1
|
|
MISSION_FAILED(FAILED_GOLD_TRUCKS_DESTROYED)
|
|
ELSE
|
|
MISSION_FAILED(FAILED_GOLD_TRUCK_DESTROYED)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
INT iVanCrewAlive = 0
|
|
REPEAT COUNT_OF(sGoldVanPeds) i
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[i].ped)
|
|
OR NOT DOES_ENTITY_EXIST(sGoldVanPeds[i].ped)
|
|
iVanCrewAlive++
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF iVanCrewAlive < COUNT_OF(sGoldVanPeds)
|
|
IF iVanCrewAlive = 0
|
|
MISSION_FAILED(FAILED_ALL_SECURITY_WORKERS_DEAD)
|
|
ELIF iVanCrewAlive < COUNT_OF(sGoldVanPeds) - 1
|
|
MISSION_FAILED(FAILED_SOME_SECURITY_WORKERS_DEAD)
|
|
ELSE
|
|
MISSION_FAILED(FAILED_SECURITY_WORKER_DEAD)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Bank worker deaths
|
|
IF eMissionStage <= STAGE_TRAFFIC_CONTROL
|
|
IF (DOES_ENTITY_EXIST(sVaultWorker.ped) AND IS_PED_INJURED(sVaultWorker.ped))
|
|
OR (DOES_ENTITY_EXIST(sBankWorker.ped) AND IS_PED_INJURED(sBankWorker.ped))
|
|
MISSION_FAILED(FAILED_BANK_WORKER_DEAD)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PROC UPDATE_WIDGETS()
|
|
INT i = 0
|
|
|
|
IF bDebugRecordTraffic
|
|
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
MISSION_CLEANUP()
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
eMissionStage = STAGE_DEBUG_RECORD_TRAFFIC
|
|
bDebugRecordTraffic = FALSE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF bDebugRecordSetpieces
|
|
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
MISSION_CLEANUP()
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
eMissionStage = STAGE_DEBUG_RECORD_SETPIECES
|
|
bDebugRecordSetpieces = FALSE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF bDebugRecordVanCrash
|
|
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
MISSION_CLEANUP()
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
eMissionStage = STAGE_DEBUG_RECORD_VAN_CRASH
|
|
bDebugRecordVanCrash = FALSE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF bDebugRecordRampDrive
|
|
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
MISSION_CLEANUP()
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
eMissionStage = STAGE_DEBUG_RECORD_RAMP_DRIVE
|
|
bDebugRecordRampDrive = FALSE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF bDebugPlayRampDrive
|
|
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
MISSION_CLEANUP()
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
eMissionStage = STAGE_DEBUG_TEST_RAMP_DRIVE_PLAYBACK
|
|
bDebugPlayRampDrive = FALSE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF bDebugRecordTruckTrailer
|
|
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
MISSION_CLEANUP()
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
eMissionStage = STAGE_DEBUG_RECORD_TRUCK_AND_TRAILER
|
|
bDebugRecordTruckTrailer = FALSE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF bDebugRecordChaseCamera
|
|
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
MISSION_CLEANUP()
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
eMissionStage = STAGE_DEBUG_RECORD_CHASE_CAM
|
|
bDebugRecordChaseCamera = FALSE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF bDebugPlayChaseCamera
|
|
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
|
|
MISSION_CLEANUP()
|
|
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
eMissionStage = STAGE_DEBUG_PLAY_CHASE_CAM
|
|
bDebugPlayChaseCamera = FALSE
|
|
eSectionStage = SECTION_STAGE_SETUP
|
|
ENDIF
|
|
|
|
IF bDebugStartJunctionPlacement
|
|
IF NOT DOES_CAM_EXIST(camMain)
|
|
camMain = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<53.0731, -922.8204, 259.4142>>, <<-89.4995, 0.0000, -38.8765>>, 112.1350, TRUE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
ENDIF
|
|
|
|
//Place a junction where the right mouse is clicked
|
|
IF IS_BUTTON_JUST_PRESSED(PAD1, DPADDOWN)
|
|
CAMERA_INDEX camDebug = GET_DEBUG_CAM()
|
|
|
|
vDebugTcJunctionPos = GET_CAM_COORD(camDebug)
|
|
|
|
fDebugTcCrossingHeading[TC_NORTH_JUNCTION] = 0.0
|
|
fDebugTcCrossingHeading[TC_EAST_JUNCTION] = -90.0
|
|
fDebugTcCrossingHeading[TC_SOUTH_JUNCTION] = 180.0
|
|
fDebugTcCrossingHeading[TC_WEST_JUNCTION] = 90.0
|
|
|
|
REPEAT COUNT_OF(fDebugTcCrossingWidth) i
|
|
fDebugTcCrossingWidth[i] = 20.0
|
|
|
|
VECTOR v_dir = CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<0.0, 0.0, fDebugTcCrossingHeading[i]>>)
|
|
vDebugTcCrossingPos[i] = vDebugTcJunctionPos + (v_dir * 10.0)
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
//Draw debug
|
|
DRAW_DEBUG_SPHERE(vDebugTcJunctionPos, 0.5, 255, 0, 0)
|
|
|
|
REPEAT COUNT_OF(fDebugTcCrossingWidth) i
|
|
DRAW_DEBUG_SPHERE(vDebugTcCrossingPos[i], 0.25, 0, 0, 255)
|
|
|
|
VECTOR vPerpDir1 = CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<0.0, 0.0, fDebugTcCrossingHeading[i] + 90.0>>)
|
|
VECTOR vPerpDir2 = CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<0.0, 0.0, fDebugTcCrossingHeading[i] - 90.0>>)
|
|
|
|
DRAW_DEBUG_SPHERE(vDebugTcCrossingPos[i] + (vPerpDir1 * (fDebugTcCrossingWidth[i] / 2.0)), 0.15, 0, 0, 200)
|
|
DRAW_DEBUG_SPHERE(vDebugTcCrossingPos[i] + (vPerpDir2 * (fDebugTcCrossingWidth[i] / 2.0)), 0.15, 0, 0, 200)
|
|
ENDREPEAT
|
|
|
|
IF bDebugOutputData
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("sTrafficJunction[].vCentre = ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(vDebugTcJunctionPos)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
|
|
REPEAT COUNT_OF(fDebugTcCrossingWidth) i
|
|
SAVE_STRING_TO_DEBUG_FILE("sTrafficJunction[].sCrossings[")
|
|
SAVE_INT_TO_DEBUG_FILE(i)
|
|
SAVE_STRING_TO_DEBUG_FILE("].vCentre = ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(vDebugTcCrossingPos[i])
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("sTrafficJunction[].sCrossings[")
|
|
SAVE_INT_TO_DEBUG_FILE(i)
|
|
SAVE_STRING_TO_DEBUG_FILE("].fHeading = ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(fDebugTcCrossingHeading[i])
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("sTrafficJunction[].sCrossings[")
|
|
SAVE_INT_TO_DEBUG_FILE(i)
|
|
SAVE_STRING_TO_DEBUG_FILE("].fWidth = ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(fDebugTcCrossingWidth[i])
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
ENDREPEAT
|
|
|
|
bDebugOutputData = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bDebugTrafficLightTest
|
|
IF IS_MOUSE_BUTTON_JUST_PRESSED(MB_LEFT_BTN)
|
|
vDebugMousePos = GET_SCRIPT_MOUSE_POINTER_IN_WORLD_COORDS()
|
|
ENDIF
|
|
|
|
//TEMP: to fix compile errors, need the proper traffic light model.
|
|
OBJECT_INDEX objLight //= GET_CLOSEST_OBJECT_OF_TYPE(vDebugMousePos, 20.0, PROP_TRAFFIC_02A002)
|
|
|
|
IF DOES_ENTITY_EXIST(objLight)
|
|
AND vDebugMousePos.x != 0.0
|
|
SET_ENTITY_TRAFFICLIGHT_OVERRIDE(objLight, INT_TO_ENUM(TRAFFICLIGHT_OVERRIDE_MODE, iDebugTrafficLightColour))
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bDebugForceActivate
|
|
ENTITY_INDEX veh = GET_FOCUS_ENTITY_INDEX()
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh)
|
|
IF IS_BUTTON_PRESSED(PAD1, LEFTSHOULDER1)
|
|
APPLY_FORCE_TYPE eForceType
|
|
|
|
IF iDebugForceType = 0
|
|
eForceType = APPLY_TYPE_FORCE
|
|
ELIF iDebugForceType = 1
|
|
eForceType = APPLY_TYPE_IMPULSE
|
|
ELIF iDebugForceType = 2
|
|
eForceType = APPLY_TYPE_EXTERNAL_FORCE
|
|
ELIF iDebugForceType = 3
|
|
eForceType = APPLY_TYPE_EXTERNAL_IMPULSE
|
|
ELIF iDebugForceType = 4
|
|
eForceType = APPLY_TYPE_TORQUE
|
|
ELIF iDebugForceType = 5
|
|
eForceType = APPLY_TYPE_ANGULAR_IMPULSE
|
|
ENDIF
|
|
|
|
APPLY_FORCE_TO_ENTITY(veh, eForceType, vDebugForceDir, vDebugForceOffset, iDebugForceComponent,
|
|
bDebugForceLocalForce, bDebugForceLocalOffset, bDebugForceScaleByMass)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bDebugReattachTrolleys
|
|
IF NOT IS_PED_INJURED(sGoldVanPeds[CASEY_ID].ped)
|
|
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
DETACH_ENTITY(objGoldTrolleys[0])
|
|
DETACH_ENTITY(objGoldTrolleys[1])
|
|
|
|
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[0], sGoldVanPeds[CASEY_ID].ped, -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
|
|
ATTACH_ENTITY_TO_ENTITY(objGoldTrolleys[1], sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -1, vTrolleyAttach, <<0.0, 0.0, 90.0>>, FALSE, FALSE, TRUE)
|
|
|
|
bDebugReattachTrolleys = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
UPDATE_CREW_CHASE_RECORDING_TO_MATCH_SELECTIONS()
|
|
|
|
iDebugTrevorShootoutState = ENUM_TO_INT(sTrevor.eBuddyShootoutState)
|
|
iDebugMichaelShootoutState = ENUM_TO_INT(sMichael.eBuddyShootoutState)
|
|
iDebugFranklinShootoutState = ENUM_TO_INT(sFranklin.eBuddyShootoutState)
|
|
ENDPROC
|
|
|
|
PROC DO_DEBUG()
|
|
UPDATE_WIDGETS()
|
|
|
|
//Reset any skipping from the previous frame
|
|
IF eSectionStage = SECTION_STAGE_SKIP
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
AND NOT bMissionPassedScreenDisplayed
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
|
|
MISSION_PASSED(TRUE)
|
|
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)
|
|
MISSION_FAILED(FAILED_GENERIC)
|
|
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
|
|
eSectionStage = SECTION_STAGE_SKIP
|
|
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
|
|
//Work out which stage we want to reach based on the current stage
|
|
INT iCurrentStage = ENUM_TO_INT(eMissionStage)
|
|
|
|
IF iCurrentStage > 0
|
|
MISSION_STAGE eStage = INT_TO_ENUM(MISSION_STAGE, iCurrentStage - 1)
|
|
|
|
//Special case: the swap stage is a lot shorter now and hard to P-skip, so just go to the stage before it.
|
|
IF eStage = STAGE_SWAP_TO_FRANKLIN_CUTSCENE
|
|
eStage = STAGE_LEAVE_BANK
|
|
ENDIF
|
|
|
|
JUMP_TO_STAGE(eStage, TRUE)
|
|
ELSE
|
|
JUMP_TO_STAGE(STAGE_START_CUTSCENE, TRUE)
|
|
ENDIF
|
|
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD1)
|
|
OUTPUT_DEBUG_CAM_RELATIVE_TO_ENTITY(GET_FOCUS_ENTITY_INDEX())
|
|
ENDIF
|
|
|
|
IF LAUNCH_MISSION_STAGE_MENU(sSkipMenu, iDebugJumpStage, 0, FALSE, "", TRUE, FALSE, KEY_Z, KEYBOARD_MODIFIER_NONE, TRUE, FALSE, 0.9)
|
|
MISSION_STAGE eStage = INT_TO_ENUM(MISSION_STAGE, iDebugJumpStage)
|
|
JUMP_TO_STAGE(eStage, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC RECORD_CHASE_TRIGGER_AND_TRAFFIC()
|
|
MODEL_NAMES modelTrigger = GAUNTLET
|
|
|
|
//Request models of cars we want to appear as traffic.
|
|
REQUEST_MODEL(HABANERO)
|
|
REQUEST_MODEL(EMPEROR)
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_MODEL(modelTrigger)
|
|
|
|
IF HAS_MODEL_LOADED(modelTrigger)
|
|
vehChaseTrigger = CREATE_VEHICLE(modelTrigger, <<133.7468, -1204.6522, 28.2951>>, 182.9051)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelTrigger)
|
|
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehChaseTrigger)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehChaseTrigger)
|
|
ENDIF
|
|
|
|
INIT_UBER_RECORDING(strCarrec)
|
|
|
|
SET_VEHICLE_POPULATION_BUDGET(1)
|
|
SET_PED_POPULATION_BUDGET(1)
|
|
|
|
IF bDebugAutoPlayTriggerCar
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(3.0)
|
|
INSTANTLY_FILL_VEHICLE_POPULATION()
|
|
ENDIF
|
|
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
REQUEST_MODEL(HABANERO)
|
|
REQUEST_MODEL(EMPEROR)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(3.0)
|
|
|
|
UPDATE_UBER_RECORDING()
|
|
|
|
//If we just want more traffic, play back the current trigger recording instead of driving the car.
|
|
IF bDebugAutoPlayTriggerCar
|
|
IF IS_VEHICLE_DRIVEABLE(vehChaseTrigger)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_TRIGGER, strCarrec)
|
|
|
|
IF IS_RECORDING_GOING_ON_FOR_VEHICLE(vehChaseTrigger)
|
|
AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChaseTrigger)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_TRIGGER, strCarrec)
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehChaseTrigger, CARREC_CHASE_TRIGGER, strCarrec)
|
|
SET_ENTITY_COLLISION(vehChaseTrigger, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC RECORD_CHASE_SETPIECES()
|
|
MODEL_NAMES modelTrigger = PCJ
|
|
bPickedGoodCarDriver = TRUE
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_MODEL(modelTrigger)
|
|
|
|
IF HAS_MODEL_LOADED(modelTrigger)
|
|
//AND SETUP_REQ_CHASE_CARS_START()
|
|
vehChaseTrigger = CREATE_VEHICLE(modelTrigger, vChaseTriggerStart, fChaseTriggerHeading)
|
|
SET_ENTITY_COLLISION(vehChaseTrigger, FALSE)
|
|
SET_ENTITY_PROOFS(vehChaseTrigger, TRUE, TRUE, TRUE, TRUE, TRUE)
|
|
SET_ENTITY_INVINCIBLE(vehChaseTrigger, TRUE)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelTrigger)
|
|
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehChaseTrigger)
|
|
//SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldCars[1].veh)
|
|
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_NEVER)
|
|
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
|
|
SET_STUNT_JUMPS_CAN_TRIGGER(FALSE)
|
|
SET_RANDOM_TRAINS(FALSE)
|
|
DELETE_ALL_TRAINS()
|
|
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
SET_GAMEPLAY_CAM_MAX_MOTION_BLUR_STRENGTH_THIS_UPDATE(0.0)
|
|
SET_GAMEPLAY_CAM_MOTION_BLUR_SCALING_THIS_UPDATE(0.0)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehChaseTrigger)
|
|
IF iCurrentEvent = 0
|
|
INITIALISE_UBER_PLAYBACK(strCarrec, CARREC_CHASE_TRIGGER)
|
|
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
|
|
SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02)
|
|
LOAD_CHASE_UBER_DATA()
|
|
LOAD_ACTION_CAM_DATA()
|
|
|
|
iCurrentEvent++
|
|
ELIF iCurrentEvent = 1
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_TRIGGER, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_1, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_2, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(iCarrecChaseBuddy3, strCarrec)
|
|
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_TRIGGER, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_1, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_2, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrecChaseBuddy3, strCarrec)
|
|
IF SET_CAR_AT_PLAYBACK_POSITION(vehChaseTrigger, CARREC_CHASE_TRIGGER, 0.0, TRUE, FALSE)
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ELIF iCurrentEvent = 2
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChaseTrigger)
|
|
fChasePlaybackTime = GET_TIME_POSITION_IN_RECORDING(vehChaseTrigger)
|
|
fChasePlaybackSpeed = 1.0
|
|
fUberMinTimeBeforePlaybackStartToCreate = 1500.0
|
|
|
|
bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE
|
|
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
|
|
CREATE_ALL_WAITING_UBER_CARS()
|
|
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
|
|
UPDATE_UBER_PLAYBACK(vehChaseTrigger, 1.0)
|
|
UPDATE_CHASE_SET_PIECES()
|
|
|
|
//TEMP - v280 has issues with blending from vehicle recordings, need to warp the player out of their car.
|
|
VEHICLE_INDEX vehPlayer
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
vehPlayer = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
/*IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
|
|
IF IS_VEHICLE_DRIVEABLE(vehPlayer)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehPlayer)
|
|
STOP_PLAYBACK_RECORDED_vehicle(vehPlayer)
|
|
ENDIF
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehPlayer)
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
IF bSetPieceCarIsRecording
|
|
IF IS_VEHICLE_DRIVEABLE(vehPlayer)
|
|
AND GET_VEHICLE_TRAILER_VEHICLE(vehPlayer, vehDebug)
|
|
AND NOT IS_ENTITY_DEAD(vehDebug)
|
|
AND NOT IS_RECORDING_GOING_ON_FOR_VEHICLE(vehDebug)
|
|
START_RECORDING_VEHICLE(vehDebug, 0, strCarrec, TRUE)
|
|
|
|
FLOAT f_quat_x, f_quat_y, f_quat_z, f_quat_w
|
|
GET_ENTITY_QUATERNION(vehDebug, f_quat_x, f_quat_y, f_quat_z, f_quat_w)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_VECTOR_TO_DEBUG_FILE(GET_ENTITY_COORDS(vehDebug))
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_FLOAT_TO_DEBUG_FILE(f_quat_x)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_FLOAT_TO_DEBUG_FILE(f_quat_y)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_FLOAT_TO_DEBUG_FILE(f_quat_z)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_FLOAT_TO_DEBUG_FILE(f_quat_w)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
|
|
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "RECORDING TRAILER", 4000, 0)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_DEAD(vehDebug)
|
|
IF IS_RECORDING_GOING_ON_FOR_VEHICLE(vehDebug)
|
|
STOP_RECORDING_VEHICLE(vehDebug)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Draw spheres in front of the trigger: this is useful for recording cars that need to be in front.
|
|
VECTOR v_pos_1 = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(CARREC_CHASE_TRIGGER, fChasePlaybackTime + 500.0, strCarrec)
|
|
VECTOR v_pos_2 = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(CARREC_CHASE_TRIGGER, fChasePlaybackTime + 1000.0, strCarrec)
|
|
VECTOR v_pos_3 = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(CARREC_CHASE_TRIGGER, fChasePlaybackTime + 3000.0, strCarrec)
|
|
|
|
DRAW_DEBUG_SPHERE(v_pos_1, 1.0, 0, 255, 0, 128)
|
|
DRAW_DEBUG_SPHERE(v_pos_2, 1.0, 0, 255, 0, 128)
|
|
DRAW_DEBUG_SPHERE(v_pos_3, 1.0, 0, 255, 0, 128)
|
|
|
|
//TEMP: Remove collision on the main cars.
|
|
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[2])
|
|
//SET_ENTITY_COLLISION(SetPieceCarID[2], FALSE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[3])
|
|
//SET_ENTITY_COLLISION(SetPieceCarID[3], FALSE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[4])
|
|
//SET_ENTITY_COLLISION(SetPieceCarID[4], FALSE)
|
|
ENDIF
|
|
ELSE
|
|
iCurrentEvent = 1
|
|
|
|
CLEANUP_UBER_PLAYBACK(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC RECORD_VAN_CRASH()
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_MODEL(modelGoldVan)
|
|
|
|
IF HAS_MODEL_LOADED(modelGoldVan)
|
|
sGoldVans[0].veh = CREATE_VEHICLE(modelGoldVan, <<412.834, -675.788, 28.9051>>, 86.137695)
|
|
sGoldVans[1].veh = CREATE_VEHICLE(modelGoldVan, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[0].veh, <<0.0, -10.0, 0.0>>), 86.137695)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelGoldVan)
|
|
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sGoldVans[1].veh)
|
|
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_NEVER)
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF iCurrentEvent = 0
|
|
SET_ENTITY_COORDS(sGoldVans[0].veh, <<412.834, -675.788, 28.9051>>)
|
|
SET_ENTITY_HEADING(sGoldVans[0].veh, 86.137695)
|
|
|
|
SET_ENTITY_COORDS(sGoldVans[1].veh, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[0].veh, <<0.0, -10.0, 0.0>>))
|
|
SET_ENTITY_HEADING(sGoldVans[1].veh, 86.137695)
|
|
|
|
iCurrentEvent++
|
|
ELIF iCurrentEvent = 1
|
|
REQUEST_VEHICLE_RECORDING(CARREC_VAN_STINGER_1, strCarrec)
|
|
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_VAN_STINGER_1, strCarrec)
|
|
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
|
|
START_RECORDING_VEHICLE(sGoldVans[1].veh, CARREC_VAN_STINGER_2, strCarrec, TRUE)
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, CARREC_VAN_STINGER_1, strCarrec)
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ELIF iCurrentEvent = 2
|
|
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
|
|
STOP_RECORDING_VEHICLE(sGoldVans[1].veh)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh)
|
|
|
|
iCurrentEvent = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
PROC RECORD_RAMP_DRIVE()
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_MODEL(PACKER)
|
|
REQUEST_MODEL(modelEndTrailers)
|
|
//REQUEST_MODEL(PROP_SECTION_GARAGE_01)
|
|
REQUEST_MODEL(modelChaseCars)
|
|
|
|
IF HAS_MODEL_LOADED(modelChaseCars)
|
|
AND HAS_MODEL_LOADED(PACKER)
|
|
AND HAS_MODEL_LOADED(modelEndTrailers)
|
|
//AND HAS_MODEL_LOADED(PROP_SECTION_GARAGE_01)
|
|
vehDebug = CREATE_VEHICLE(modelChaseCars, <<-1166.2612, -658.4529, 10.0745>>, 122.5773)
|
|
|
|
sGoldVans[0].veh = CREATE_VEHICLE(PACKER, <<-1224.3223, -691.0797, 10.0816>>, 115.2663)
|
|
sGoldVans[1].veh = CREATE_VEHICLE(modelEndTrailers, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[0].veh, <<0.0, -10.0, 0.0>>), GET_ENTITY_HEADING(sGoldVans[0].veh))
|
|
|
|
ATTACH_VEHICLE_TO_TRAILER(sGoldVans[0].veh, sGoldVans[1].veh)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[1].veh, SC_DOOR_BOOT, DT_DOOR_INTACT, 1.0)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelChaseCars)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(PACKER)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelEndTrailers)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_SECTION_GARAGE_01)
|
|
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehDebug)
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
IF NOT IS_ENTITY_DEAD(vehDebug)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
IF iCurrentEvent = 0
|
|
SET_ENTITY_COORDS(vehDebug, <<-1166.2612, -658.4529, 10.0745>>)
|
|
SET_ENTITY_HEADING(vehDebug, 122.5773)
|
|
|
|
iCurrentEvent++
|
|
ELIF iCurrentEvent = 1
|
|
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
|
|
START_RECORDING_VEHICLE(vehDebug, CARREC_RAMP_HACK_CAR, strCarrec, TRUE)
|
|
START_RECORDING_VEHICLE(sGoldVans[1].veh, CARREC_RAMP_HACK_TRAILER, strCarrec, TRUE)
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ELIF iCurrentEvent = 2
|
|
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
|
|
STOP_RECORDING_VEHICLE(vehDebug)
|
|
STOP_RECORDING_VEHICLE(sGoldVans[1].veh)
|
|
|
|
iCurrentEvent = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC PLAY_RAMP_DRIVE()
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_MODEL(PACKER)
|
|
REQUEST_MODEL(modelEndTrailers)
|
|
REQUEST_MODEL(modelChaseCars)
|
|
|
|
IF HAS_MODEL_LOADED(modelChaseCars)
|
|
AND HAS_MODEL_LOADED(PACKER)
|
|
AND HAS_MODEL_LOADED(modelEndTrailers)
|
|
sGoldCars[0].veh = CREATE_VEHICLE(modelChaseCars, <<-1166.2612, -658.4529, 10.0745>>, 122.5773)
|
|
sGoldVans[0].veh = CREATE_VEHICLE(modelEndTrailers, <<-1224.3223, -691.0797, 10.0816>>, 115.2663)
|
|
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_LEFT, DT_DOOR_SWINGING_FREE, 1.0)
|
|
SET_VEHICLE_DOOR_CONTROL(sGoldVans[0].veh, SC_DOOR_REAR_RIGHT, DT_DOOR_SWINGING_FREE, 1.0)
|
|
|
|
vehDebug = CREATE_VEHICLE(PACKER, <<-1253.1776, -697.2492, 11.1198>>, 115.2663)
|
|
|
|
sGoldVans[1].veh = CREATE_VEHICLE(modelEndTrailers, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehDebug, <<0.0, -10.0, 0.0>>), GET_ENTITY_HEADING(vehDebug))
|
|
ATTACH_VEHICLE_TO_TRAILER(vehDebug, sGoldVans[1].veh)
|
|
|
|
sGoldCars[1].veh = CREATE_VEHICLE(modelChaseCars, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehDebug, <<0.0, -15.0, 0.0>>), GET_ENTITY_HEADING(vehDebug))
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelChaseCars)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(PACKER)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelEndTrailers)
|
|
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehDebug)
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[0].veh)
|
|
AND IS_VEHICLE_DRIVEABLE(sGoldVans[1].veh)
|
|
AND NOT IS_ENTITY_DEAD(vehDebug)
|
|
IF iCurrentEvent = 0
|
|
REQUEST_VEHICLE_RECORDING(CARREC_RAMP_HACK_CAR, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_RAMP_HACK_TRAILER, strCarrec)
|
|
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_RAMP_HACK_CAR, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_RAMP_HACK_TRAILER, strCarrec)
|
|
SET_VEHICLE_FIXED(sGoldCars[0].veh)
|
|
SET_VEHICLE_FIXED(sGoldCars[1].veh)
|
|
SET_VEHICLE_FIXED(sGoldVans[0].veh)
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldCars[0].veh, CARREC_RAMP_HACK_CAR, strCarrec)
|
|
START_PLAYBACK_RECORDED_VEHICLE(sGoldVans[0].veh, CARREC_RAMP_HACK_TRAILER, strCarrec)
|
|
|
|
SET_ENTITY_COLLISION(sGoldCars[1].veh, FALSE)
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ELIF iCurrentEvent = 1
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[0].veh)
|
|
FLOAT fTruckHeading = GET_ENTITY_HEADING(sGoldVans[0].veh)
|
|
FLOAT fCarHeading = GET_ENTITY_HEADING(sGoldCars[0].veh)
|
|
FLOAT fHeadingDiff = fCarHeading - fTruckHeading
|
|
|
|
VECTOR vRotation = GET_ENTITY_ROTATION(sGoldCars[0].veh)
|
|
VECTOR vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(sGoldVans[0].veh, GET_ENTITY_COORDS(sGoldCars[0].veh))
|
|
|
|
SET_ENTITY_COORDS_NO_OFFSET(sGoldCars[1].veh, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sGoldVans[1].veh, vOffset))
|
|
SET_ENTITY_ROTATION(sGoldCars[1].veh, <<vRotation.x, vRotation.y, fHeadingDiff + GET_ENTITY_HEADING(sGoldVans[1].veh)>>)
|
|
ELSE
|
|
iCurrentEvent = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC RECORD_TRUCK_AND_TRAILER(VECTOR vTruckStartPos, FLOAT fTruckStartHeading, INT iTruckCarrec, INT iTrailerCarrec, BOOL bPlayBackExistingRecording = FALSE, INT iExistingRecording = 0,
|
|
BOOL bOpenTrailerDoor = FALSE)
|
|
MODEL_NAMES modelTruck = PACKER
|
|
MODEL_NAMES modelTrailer = TRAILERS3
|
|
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
SWITCH iCurrentEvent
|
|
CASE 0
|
|
CLEAR_AREA(vTruckStartPos, 500.0, TRUE)
|
|
|
|
IF NOT IS_VEHICLE_DRIVEABLE(vehDebug)
|
|
REQUEST_MODEL(modelTruck)
|
|
REQUEST_MODEL(modelTrailer)
|
|
|
|
IF HAS_MODEL_LOADED(modelTruck)
|
|
AND HAS_MODEL_LOADED(modelTrailer)
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), vTruckStartPos)
|
|
|
|
LOAD_SCENE(vTruckStartPos)
|
|
|
|
vehDebug = CREATE_VEHICLE(modelTruck, vTruckStartPos, fTruckStartHeading)
|
|
vehTrailer[0] = CREATE_VEHICLE(modelTrailer, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehDebug, <<0.0, -10.0, 0.0>>), GET_ENTITY_HEADING(vehDebug))
|
|
|
|
IF bPlaybackExistingRecording
|
|
REQUEST_VEHICLE_RECORDING(iExistingRecording, strCarrec)
|
|
|
|
WHILE NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(iExistingRecording, strCarrec)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
vehDebugCamCar = CREATE_VEHICLE(modelTruck, vTruckStartPos, fTruckStartHeading)
|
|
SET_ENTITY_COLLISION(vehDebugCamCar, FALSE)
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehDebugCamCar, iExistingRecording, strCarrec)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehDebugCamCar)
|
|
SET_PLAYBACK_SPEED(vehDebugCamCar, 0.0)
|
|
ENDIF
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelTruck)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelTrailer)
|
|
ENDIF
|
|
ELSE
|
|
SET_ENTITY_COORDS(vehDebug, vTruckStartPos)
|
|
SET_ENTITY_HEADING(vehDebug, fTruckStartHeading)
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
|
|
SET_ENTITY_COORDS(vehTrailer[0], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehDebug, <<0.0, -10.0, 0.0>>))
|
|
SET_ENTITY_HEADING(vehTrailer[0], GET_ENTITY_HEADING(vehDebug))
|
|
|
|
ATTACH_VEHICLE_TO_TRAILER(vehDebug, vehTrailer[0])
|
|
ENDIF
|
|
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehDebug)
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF IS_VEHICLE_DRIVEABLE(vehDebug)
|
|
AND NOT IS_ENTITY_DEAD(vehTrailer[0])
|
|
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
|
|
START_RECORDING_VEHICLE(vehDebug, iTruckCarrec, strCarrec, TRUE)
|
|
START_RECORDING_VEHICLE(vehTrailer[0], iTrailerCarrec, strCarrec, TRUE)
|
|
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "RECORDING STARTED", DEFAULT_GOD_TEXT_TIME, 0)
|
|
|
|
IF bPlaybackExistingRecording
|
|
IF NOT IS_ENTITY_DEAD(vehDebugCamCar)
|
|
SET_PLAYBACK_SPEED(vehDebugCamCar, 1.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehDebugCamCar)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF IS_VEHICLE_DRIVEABLE(vehDebug)
|
|
AND NOT IS_ENTITY_DEAD(vehTrailer[0])
|
|
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
|
|
STOP_RECORDING_VEHICLE(vehDebug)
|
|
STOP_RECORDING_VEHICLE(vehTrailer[0])
|
|
|
|
IF bPlaybackExistingRecording
|
|
IF NOT IS_ENTITY_DEAD(vehDebugCamCar)
|
|
SET_PLAYBACK_SPEED(vehDebugCamCar, 0.0)
|
|
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehDebugCamCar, 0.0)
|
|
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehDebugCamCar)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iCurrentEvent = 0
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehTrailer[0])
|
|
AND bOpenTrailerDoor
|
|
SET_VEHICLE_DOOR_CONTROL(vehTrailer[0], SC_DOOR_BOOT, DT_DOOR_INTACT, 1.0)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC RECORD_CHASE_CAM(FLOAT fUberStartTime, INT iCarrecToAttachTo, INT iRecordingCarrec, MODEL_NAMES modelAttachCar, VECTOR vAttachOffset)
|
|
bPickedGoodCarDriver = TRUE
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
MODEL_NAMES modelTrigger = PCJ
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_MODEL(modelTrigger)
|
|
REQUEST_MODEL(modelAttachCar)
|
|
|
|
IF HAS_MODEL_LOADED(modelTrigger)
|
|
AND HAS_MODEL_LOADED(modelAttachCar)
|
|
AND SETUP_REQ_CHASE_CARS_START()
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_STUNT_JUMPS_CAN_TRIGGER(FALSE)
|
|
|
|
vehChaseTrigger = CREATE_VEHICLE(modelTrigger, vChaseTriggerStart, fChaseTriggerHeading)
|
|
SET_ENTITY_COLLISION(vehChaseTrigger, FALSE)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehChaseTrigger)
|
|
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_NEVER)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelTrigger)
|
|
|
|
vehDebug = CREATE_VEHICLE(modelAttachCar, vChaseTriggerStart + <<5.0, 0.0, 0.0>>, fChaseTriggerHeading)
|
|
vehDebugCamCar = CREATE_VEHICLE(modelAttachCar, vChaseTriggerStart + <<0.0, 0.0, 2.0>>, fChaseTriggerHeading)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelAttachCar)
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
IF IS_VEHICLE_DRIVEABLE(vehChaseTrigger)
|
|
IF iCurrentEvent = 0
|
|
INITIALISE_UBER_PLAYBACK(strCarrec, CARREC_CHASE_TRIGGER)
|
|
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
|
|
SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02)
|
|
LOAD_CHASE_UBER_DATA()
|
|
LOAD_ACTION_CAM_DATA()
|
|
|
|
iCurrentEvent++
|
|
ELIF iCurrentEvent = 1
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_TRIGGER, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_1, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_2, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_3_GOOD_TRUCK, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(iCarrecToAttachTo, strCarrec)
|
|
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_TRIGGER, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_1, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_2, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_3_GOOD_TRUCK, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrecToAttachTo, strCarrec)
|
|
IF SET_CAR_AT_PLAYBACK_POSITION(vehChaseTrigger, CARREC_CHASE_TRIGGER, fUberStartTime, TRUE, FALSE)
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
|
|
SET_CAR_AT_PLAYBACK_POSITION(sGoldCars[0].veh, CARREC_CHASE_BUDDY_1, fUberStartTime, TRUE, FALSE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
|
|
SET_CAR_AT_PLAYBACK_POSITION(sGoldCars[1].veh, CARREC_CHASE_BUDDY_2, fUberStartTime, TRUE, FALSE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
|
|
SET_CAR_AT_PLAYBACK_POSITION(sGoldCars[2].veh, CARREC_CHASE_BUDDY_3_GOOD_TRUCK, fUberStartTime, TRUE, FALSE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehDebug)
|
|
START_PLAYBACK_RECORDED_VEHICLE(vehDebug, iCarrecToAttachTo, strCarrec)
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehDebug, 0.0)
|
|
SET_ENTITY_COLLISION(vehDebug, FALSE)
|
|
ENDIF
|
|
|
|
START_CAM_RECORDING_RELATIVE_TO_ENTITY(sCamData, vehDebug, vehDebugCamCar, vAttachOffset, <<0.0, -0.5, 0.1>>, 30.0, strCarrec, iRecordingCarrec,
|
|
TRUE, TRUE, FALSE, TRUE)
|
|
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ELIF iCurrentEvent = 2
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChaseTrigger)
|
|
fChasePlaybackTime = GET_TIME_POSITION_IN_RECORDING(vehChaseTrigger)
|
|
fChasePlaybackSpeed = 1.0
|
|
|
|
bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE
|
|
PRELOAD_ALL_CHASE_RECORDINGS(fChasePlaybackTime)
|
|
CREATE_ALL_WAITING_UBER_CARS()
|
|
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
|
|
UPDATE_UBER_PLAYBACK(vehChaseTrigger, 1.0)
|
|
UPDATE_CHASE_SET_PIECES()
|
|
UPDATE_CAM_RECORDING(sCamData)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehDebug)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehDebug)
|
|
//SET_PLAYBACK_SPEED(vehDebugCamCar, 1.66666) //Set-piece was recorded at 0.6 for the uber
|
|
ENDIF
|
|
ENDIF
|
|
|
|
INT i = 0
|
|
REPEAT COUNT_OF(sGoldCars) i
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[i].veh)
|
|
//Match playback speed to main chase
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sGoldCars[i].veh)
|
|
SET_PLAYBACK_SPEED(sGoldCars[i].veh, fChasePlaybackSpeed)
|
|
ENDIF
|
|
|
|
SET_ENTITY_COLLISION(sGoldCars[i].veh, FALSE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
|
|
STOP_CAM_RECORDING(sCamData)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC PLAY_CHASE_CAM()
|
|
MODEL_NAMES modelTrigger = PCJ
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
IF eSectionStage = SECTION_STAGE_SETUP
|
|
REQUEST_MODEL(modelTrigger)
|
|
|
|
IF HAS_MODEL_LOADED(modelTrigger)
|
|
AND SETUP_REQ_CHASE_CARS_START()
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_STUNT_JUMPS_CAN_TRIGGER(FALSE)
|
|
|
|
vehChaseTrigger = CREATE_VEHICLE(modelTrigger, vChaseTriggerStart, fChaseTriggerHeading)
|
|
SET_ENTITY_COLLISION(vehChaseTrigger, FALSE)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehChaseTrigger)
|
|
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_NEVER)
|
|
|
|
vehDebugCamCar = CREATE_VEHICLE(modelTrigger, vChaseTriggerStart + <<3.0, 0.0, 0.0>>, fChaseTriggerHeading)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelTrigger)
|
|
|
|
iCurrentEvent = 0
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
IF IS_VEHICLE_DRIVEABLE(vehChaseTrigger)
|
|
IF iCurrentEvent = 0
|
|
INITIALISE_UBER_PLAYBACK(strCarrec, CARREC_CHASE_TRIGGER)
|
|
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
|
|
SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02)
|
|
LOAD_CHASE_UBER_DATA()
|
|
LOAD_ACTION_CAM_DATA()
|
|
|
|
iCurrentEvent++
|
|
ELIF iCurrentEvent = 1
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_TRIGGER, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_1, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(CARREC_CHASE_BUDDY_2, strCarrec)
|
|
REQUEST_VEHICLE_RECORDING(iCarrecChaseBuddy3, strCarrec)
|
|
REQUEST_CAM_RECORDING(sActionCams[0].iRecordingID, strCarrec)
|
|
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_TRIGGER, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_1, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CHASE_BUDDY_2, strCarrec)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrecChaseBuddy3, strCarrec)
|
|
AND HAS_CAM_RECORDING_LOADED(sActionCams[0].iRecordingID, strCarrec)
|
|
IF SET_CAR_AT_PLAYBACK_POSITION(vehChaseTrigger, CARREC_CHASE_TRIGGER, 0.0, TRUE, FALSE)
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[0].veh)
|
|
SET_CAR_AT_PLAYBACK_POSITION(sGoldCars[0].veh, CARREC_CHASE_BUDDY_1, 0.0, TRUE, FALSE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[1].veh)
|
|
SET_CAR_AT_PLAYBACK_POSITION(sGoldCars[1].veh, CARREC_CHASE_BUDDY_2, 0.0, TRUE, FALSE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sGoldCars[2].veh)
|
|
SET_CAR_AT_PLAYBACK_POSITION(sGoldCars[2].veh, CARREC_CHASE_BUDDY_3_GOOD_TRUCK, 0.0, TRUE, FALSE)
|
|
ENDIF
|
|
|
|
camMain = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
|
|
SHAKE_CAM(camMain, "SKY_DIVING_SHAKE", 0.15)
|
|
SET_CAM_FOV(camMain, 30.0)
|
|
|
|
START_CAM_PLAYBACK(camMain, vehDebugCamCar, strCarrec, sActionCams[0].iRecordingID)
|
|
iDebugCurrentCam = 0
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
|
|
iCurrentActionCam = 0
|
|
iCurrentEvent++
|
|
ENDIF
|
|
ENDIF
|
|
ELIF iCurrentEvent = 2
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehChaseTrigger)
|
|
fChasePlaybackTime = GET_TIME_POSITION_IN_RECORDING(vehChaseTrigger)
|
|
fChasePlaybackSpeed = 1.0
|
|
|
|
bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE
|
|
PRELOAD_ALL_CHASE_RECORDINGS(fChasePlaybackTime)
|
|
CREATE_ALL_WAITING_UBER_CARS()
|
|
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
|
|
UPDATE_UBER_PLAYBACK(vehChaseTrigger, 1.0)
|
|
//UPDATE_CHASE_SET_PIECES()
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[2])
|
|
SET_ENTITY_COLLISION(SetPieceCarID[2], FALSE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[3])
|
|
SET_ENTITY_COLLISION(SetPieceCarID[3], FALSE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[4])
|
|
SET_ENTITY_COLLISION(SetPieceCarID[4], FALSE)
|
|
ENDIF
|
|
|
|
IF bDebugPlayFinalEdit
|
|
UPDATE_CHASE_CAM(vehDebugCamCar, camMain, fChasePlaybackTime, 1.0)
|
|
ELSE
|
|
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
|
|
iDebugCurrentCam++
|
|
|
|
IF sActionCams[iDebugCurrentCam].iRecordingID = 0
|
|
iDebugCurrentCam = 0
|
|
ENDIF
|
|
|
|
CHANGE_ACTION_CAM_ANGLE(vehDebugCamCar, sActionCams[iDebugCurrentCam].iRecordingID, fChasePlaybackTime, sActionCams[iDebugCurrentCam].fStartTime)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
UPDATE_CAM_PLAYBACK(camMain, vehDebugCamCar, 1.0)
|
|
|
|
SET_TEXT_SCALE(0.5, 0.5)
|
|
TEXT_LABEL_63 strTime = "Time: "
|
|
strTime += GET_STRING_FROM_FLOAT(fChasePlaybackTime)
|
|
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.1, "STRING", strTime)
|
|
|
|
SET_TEXT_SCALE(0.5, 0.5)
|
|
TEXT_LABEL_23 strCam = "Cam: "
|
|
strCam += iDebugCurrentCam
|
|
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.15, "STRING", strCam)
|
|
ELSE
|
|
iCurrentEvent = 1
|
|
|
|
CLEANUP_UBER_PLAYBACK(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
SCRIPT
|
|
SET_MISSION_FLAG(TRUE)
|
|
IF HAS_FORCE_CLEANUP_OCCURRED()
|
|
Mission_Flow_Mission_Force_Cleanup()
|
|
eSectionStage = SECTION_STAGE_RUNNING
|
|
MISSION_CLEANUP()
|
|
ENDIF
|
|
|
|
MISSION_SETUP()
|
|
|
|
/*#IF IS_DEBUG_BUILD
|
|
WIDGET_GROUP_ID widWidgets = START_WIDGET_GROUP("MISSION DEBUG")
|
|
STOP_WIDGET_GROUP()
|
|
SETUP_SPLINE_CAM_NODE_ARRAY(scsSwitchCam, INT_TO_NATIVE(PED_INDEX, 0), INT_TO_NATIVE(PED_INDEX, 0))
|
|
CREATE_SPLINE_CAM_WIDGETS(scsSwitchCam, "Michael", "Franklin", widWidgets)
|
|
#ENDIF*/
|
|
|
|
IF Is_Replay_In_Progress()
|
|
INT iStage = Get_Replay_Mid_Mission_Stage()
|
|
|
|
IF g_bShitskipAccepted
|
|
iStage++
|
|
ENDIF
|
|
|
|
IF iStage = 0
|
|
JUMP_TO_STAGE(STAGE_SET_UP_STINGER)
|
|
ELIF iStage = CHECKPOINT_DRIVE_TO_BANK
|
|
JUMP_TO_STAGE(STAGE_DRIVE_TO_BANK)
|
|
ELIF iStage = CHECKPOINT_BANK_TOUR
|
|
IF g_bShitskipAccepted
|
|
JUMP_TO_STAGE(STAGE_BANK_PARK_CUTSCENE)
|
|
ELSE
|
|
JUMP_TO_STAGE(STAGE_WALK_TO_LIFT_1)
|
|
ENDIF
|
|
ELIF iStage = CHECKPOINT_LEAVE_BANK
|
|
JUMP_TO_STAGE(STAGE_LEAVE_BANK)
|
|
ELIF iStage = CHECKPOINT_TRAFFIC_CONTROL
|
|
JUMP_TO_STAGE(STAGE_TRAFFIC_CONTROL)
|
|
ELIF iStage = CHECKPOINT_SHOOTOUT
|
|
IF g_bShitskipAccepted
|
|
JUMP_TO_STAGE(STAGE_ARRIVAL_CUTSCENE)
|
|
ELSE
|
|
JUMP_TO_STAGE(STAGE_SHOOTOUT)
|
|
ENDIF
|
|
ELIF iStage = CHECKPOINT_CHASE
|
|
JUMP_TO_STAGE(STAGE_CHASE)
|
|
ELIF iStage = CHECKPOINT_GO_HOME
|
|
IF g_bShitskipAccepted
|
|
JUMP_TO_STAGE(STAGE_DROP_OFF_TRUCKS_CUTSCENE)
|
|
ELSE
|
|
JUMP_TO_STAGE(STAGE_GO_TO_MICHAELS_HOUSE)
|
|
ENDIF
|
|
ELIF iStage > CHECKPOINT_GO_HOME
|
|
JUMP_TO_STAGE(STAGE_FINAL_CUTSCENE)
|
|
ENDIF
|
|
|
|
IF iStage >= CHECKPOINT_TRAFFIC_CONTROL
|
|
bRetryingTrafficSection = TRUE
|
|
ENDIF
|
|
|
|
DISABLE_STRIP_CLUBS() //This is no longer disabled on mission setup due to lead-in issues
|
|
|
|
bHasUsedCheckpoint = TRUE
|
|
ELSE
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "HIJACK_VANS")
|
|
ENDIF
|
|
|
|
//TRACE_NATIVE_COMMAND("TRIGGER_MUSIC_EVENT")
|
|
|
|
WHILE (TRUE)
|
|
WAIT(0)
|
|
|
|
/*#IF IS_DEBUG_BUILD
|
|
UPDATE_SPLINE_CAM_WIDGETS(scsSwitchCam)
|
|
#ENDIF*/
|
|
|
|
//Used for getting the times for music triggers during mocap cutscenes.
|
|
/*IF IS_CUTSCENE_ACTIVE()
|
|
IF IS_CUTSCENE_PLAYING()
|
|
PRINTLN(GET_CUTSCENE_TIME())
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_BigScoreSubtle")
|
|
|
|
DO_GLOBAL_FAIL_CHECKS()
|
|
|
|
//Stats
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
AND NOT bMissionPassedScreenDisplayed
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
//Track the vehicle speed/damage stat.
|
|
VEHICLE_INDEX veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh)
|
|
IF NOT DOES_ENTITY_EXIST(g_MissionStatSingleDamageWatchEntity)
|
|
OR NOT IS_ENTITY_A_VEHICLE(g_MissionStatSingleDamageWatchEntity)
|
|
OR (IS_ENTITY_A_VEHICLE(g_MissionStatSingleDamageWatchEntity) AND GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(g_MissionStatSingleDamageWatchEntity) != veh)
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(veh, FH2A_CAR_DAMAGE)
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(g_MissionStatSingleSpeedWatchEntity)
|
|
OR NOT IS_ENTITY_A_VEHICLE(g_MissionStatSingleSpeedWatchEntity)
|
|
OR (IS_ENTITY_A_VEHICLE(g_MissionStatSingleSpeedWatchEntity) AND GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(g_MissionStatSingleSpeedWatchEntity) != veh)
|
|
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(veh)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Track the player damage stat.
|
|
IF NOT DOES_ENTITY_EXIST(g_MissionStatSingleDamageWatchEntity)
|
|
OR NOT IS_ENTITY_A_PED(g_MissionStatSingleDamageWatchEntity)
|
|
OR (IS_ENTITY_A_PED(g_MissionStatSingleDamageWatchEntity) AND GET_PED_INDEX_FROM_ENTITY_INDEX(g_MissionStatSingleDamageWatchEntity) != PLAYER_PED_ID())
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID(), FH2A_DAMAGE)
|
|
ENDIF
|
|
|
|
//Remove any vehicles from the speed tracking stat.
|
|
IF g_MissionStatSingleSpeedWatchEntity != NULL
|
|
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(NULL)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Remove Michael's helmet if he gets into a non-mission car.
|
|
IF eMissionStage < STAGE_GO_TO_MICHAELS_HOUSE
|
|
IF GET_ENTITY_MODEL(PLAYER_PED_ID()) != GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
|
|
IF NOT bMichaelsHelmetRemoved
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
VEHICLE_INDEX veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_ENTITY_DEAD(veh)
|
|
MODEL_NAMES modelVeh = GET_ENTITY_MODEL(veh)
|
|
|
|
IF modelVeh != modelGoldVan
|
|
AND modelVeh != modelChaseCars
|
|
AND modelVeh != modelStartCar
|
|
AND NOT IS_THIS_MODEL_A_BIKE(modelVeh)
|
|
AND NOT IS_THIS_MODEL_A_BICYCLE(modelVeh)
|
|
REMOVE_PED_COMP_ITEM_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P0_SECURITY_HELMET)
|
|
|
|
bMichaelsHelmetRemoved = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_P0_SECURITY_HELMET, FALSE)
|
|
bMichaelsHelmetRemoved = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bHasUsedCheckpoint
|
|
IF eSectionStage = SECTION_STAGE_RUNNING
|
|
bHasUsedCheckpoint = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Main stages
|
|
SWITCH eMissionStage
|
|
CASE STAGE_START_CUTSCENE
|
|
DO_START_CUTSCENE()
|
|
BREAK
|
|
|
|
CASE STAGE_SET_UP_STINGER
|
|
SET_UP_STINGER()
|
|
BREAK
|
|
|
|
CASE STAGE_VAN_CRASH_CUTSCENE
|
|
VAN_CRASH_CUTSCENE()
|
|
BREAK
|
|
|
|
CASE STAGE_HIJACK_VANS
|
|
HIJACK_VANS_PART_2()
|
|
BREAK
|
|
|
|
CASE STAGE_HIJACK_CUTSCENE
|
|
HIJACK_CUTSCENE()
|
|
BREAK
|
|
|
|
CASE STAGE_DRIVE_TO_BANK
|
|
DRIVE_TO_BANK()
|
|
BREAK
|
|
|
|
CASE STAGE_BANK_PARK_CUTSCENE
|
|
BANK_PARK_CUTSCENE_2()
|
|
BREAK
|
|
|
|
CASE STAGE_WALK_TO_LIFT_1
|
|
WALK_TO_LIFT_1()
|
|
BREAK
|
|
|
|
CASE STAGE_LIFT_CUTSCENE_1
|
|
LIFT_CUTSCENE_1()
|
|
BREAK
|
|
|
|
CASE STAGE_WALK_TO_VAULT
|
|
WALK_TO_VAULT()
|
|
BREAK
|
|
|
|
CASE STAGE_VAULT_OPEN_CUTSCENE
|
|
VAULT_OPEN_CUTSCENE()
|
|
BREAK
|
|
|
|
CASE STAGE_WALK_TO_GOLD
|
|
WALK_TO_GOLD()
|
|
BREAK
|
|
|
|
CASE STAGE_COLLECT_GOLD_CUTSCENE
|
|
COLLECT_GOLD_CUTSCENE()
|
|
BREAK
|
|
|
|
CASE STAGE_WALK_TO_LIFT_2
|
|
WALK_TO_LIFT_2()
|
|
BREAK
|
|
|
|
CASE STAGE_LIFT_CUTSCENE_2
|
|
LIFT_CUTSCENE_2()
|
|
BREAK
|
|
|
|
CASE STAGE_WALK_TO_VANS
|
|
WALK_TO_VANS()
|
|
BREAK
|
|
|
|
CASE STAGE_LOAD_GOLD_IN_VANS_CUTSCENE
|
|
LOAD_GOLD_INTO_VANS_CUTSCENE()
|
|
BREAK
|
|
|
|
CASE STAGE_LEAVE_BANK
|
|
LEAVE_BANK()
|
|
BREAK
|
|
|
|
CASE STAGE_SWAP_TO_FRANKLIN_CUTSCENE
|
|
//SWAP_TO_FRANKLIN_CUTSCENE()
|
|
SWAP_TO_FRANKLIN_CUTSCENE_NEW()
|
|
BREAK
|
|
|
|
CASE STAGE_TRAFFIC_CONTROL
|
|
DO_TRAFFIC_CONTROL()
|
|
BREAK
|
|
|
|
CASE STAGE_ARRIVAL_CUTSCENE
|
|
ARRIVAL_CUTSCENE()
|
|
BREAK
|
|
|
|
CASE STAGE_SHOOTOUT
|
|
DO_SHOOTOUT()
|
|
BREAK
|
|
|
|
CASE STAGE_CHASE_START_CUTSCENE
|
|
CHASE_START_CUTSCENE()
|
|
BREAK
|
|
|
|
CASE STAGE_CHASE
|
|
DO_CHASE()
|
|
BREAK
|
|
|
|
CASE STAGE_CHASE_END_CUTSCENE
|
|
DO_CHASE_END_CUTSCENE_NEW_VERSION()
|
|
BREAK
|
|
|
|
CASE STAGE_DROP_OFF_TRUCKS_CUTSCENE
|
|
DO_DROP_OFF_TRUCKS_CUTSCENE()
|
|
BREAK
|
|
|
|
CASE STAGE_GO_TO_MICHAELS_HOUSE
|
|
GO_TO_MICHAELS_HOUSE()
|
|
BREAK
|
|
|
|
CASE STAGE_FINAL_CUTSCENE
|
|
DO_FINAL_CUTSCENE()
|
|
BREAK
|
|
|
|
CASE STAGE_DEBUG_RECORD_TRAFFIC
|
|
#IF IS_DEBUG_BUILD
|
|
RECORD_CHASE_TRIGGER_AND_TRAFFIC()
|
|
#ENDIF
|
|
BREAK
|
|
|
|
CASE STAGE_DEBUG_RECORD_SETPIECES
|
|
#IF IS_DEBUG_BUILD
|
|
RECORD_CHASE_SETPIECES()
|
|
#ENDIF
|
|
BREAK
|
|
|
|
CASE STAGE_DEBUG_RECORD_VAN_CRASH
|
|
#IF IS_DEBUG_BUILD
|
|
RECORD_VAN_CRASH()
|
|
#ENDIF
|
|
BREAK
|
|
|
|
CASE STAGE_DEBUG_RECORD_RAMP_DRIVE
|
|
#IF IS_DEBUG_BUILD
|
|
RECORD_RAMP_DRIVE()
|
|
#ENDIF
|
|
BREAK
|
|
|
|
CASE STAGE_DEBUG_TEST_RAMP_DRIVE_PLAYBACK
|
|
#IF IS_DEBUG_BUILD
|
|
PLAY_RAMP_DRIVE()
|
|
#ENDIF
|
|
BREAK
|
|
|
|
CASE STAGE_DEBUG_RECORD_TRUCK_AND_TRAILER
|
|
#IF IS_DEBUG_BUILD
|
|
RECORD_TRUCK_AND_TRAILER(<<-1242.3896, -704.7631, 11.1252>>, 94.9908, 2003, 2004, TRUE, 102, TRUE)
|
|
//RECORD_TRUCK_AND_TRAILER(<<-1484.3673, -749.0250, 10.1029>>, 95.4430, 2001, 2002, TRUE, 701)
|
|
//RECORD_TRUCK_AND_TRAILER(<<-1253.1776, -697.2492, 11.1198>>, 90.0, 98, 99, TRUE, 101) //Currently setup to re-record the trailer the player drives up on.
|
|
#ENDIF
|
|
BREAK
|
|
|
|
CASE STAGE_DEBUG_RECORD_CHASE_CAM
|
|
#IF IS_DEBUG_BUILD
|
|
RECORD_CHASE_CAM(79500.0000, 110, 951, POLMAV, <<0.0, 0.0, -3.0>>)
|
|
#ENDIF
|
|
BREAK
|
|
|
|
CASE STAGE_DEBUG_PLAY_CHASE_CAM
|
|
#IF IS_DEBUG_BUILD
|
|
PLAY_CHASE_CAM()
|
|
#ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DO_DEBUG()
|
|
#ENDIF
|
|
ENDWHILE
|
|
ENDSCRIPT
|