Files
gtav-src/script/dev_ng/singleplayer/scripts/missions/Armenian/Armenian1.sc
T
2025-09-29 00:52:08 +02:00

16945 lines
612 KiB
Python
Executable File

// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : Armenian1.sc
// AUTHOR : Matthew Booton
// DESCRIPTION : Franklin and a buddy collect two cars and race them across town.
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//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_cutscene.sch"
USING "commands_clock.sch"
USING "commands_debug.sch"
USING "commands_entity.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_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 "cheat_controller_public.sch"
USING "dialogue_public.sch"
USING "flow_public_core_override.sch"
USING "flow_processing_game.sch"
USING "flow_public_core.sch"
USING "script_blips.sch"
USING "script_player.sch"
USING "script_misc.sch"
USING "chase_hint_cam.sch"
USING "locates_public.sch"
USING "selector_public.sch"
USING "replay_public.sch"
USING "comms_control_public.sch"
USING "cam_recording_public.sch"
USING "help_at_location.sch"
USING "vehicle_gen_public.sch"
USING "cutscene_public.sch"
USING "mission_stat_public.sch"
USING "CompletionPercentage_public.sch"
USING "taxi_functions.sch"
USING "shop_public.sch"
USING "code_control_data_gta5.sch"
USING "tv_control_public.sch"
USING "achievement_public.sch"
// total should not exceed 225
CONST_INT TOTAL_NUMBER_OF_TRAFFIC_CARS 117
CONST_INT TOTAL_NUMBER_OF_PARKED_CARS 15
CONST_INT TOTAL_NUMBER_OF_SET_PIECE_CARS 38
// total should not exceed 12
CONST_INT MAX_NUMBER_OF_TRAFFIC_CARS_PLAYING_BACK 15
CONST_INT MAX_NUMBER_OF_SET_PIECE_CARS_PLAYING_BACK 12
// this should be fine
CONST_INT MAX_NUMBER_OF_PARKED_CARS_PLAYING_BACK 10
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_OPENING_CUTSCENE = 0,
STAGE_CHOOSE_CAR,
STAGE_START_CHASE_CUTSCENE,
STAGE_CHASE,
STAGE_CHASE_MID_POINT,
STAGE_COPS_ARRIVE_CUTSCENE,
STAGE_GO_TO_GARAGE,
STAGE_SHOWROOM_INTRO_CUTSCENE,
STAGE_MEET_SIMEON,
STAGE_SHOWROOM_CUTSCENE,
STAGE_GO_TO_HOUSE,
STAGE_HOUSE_CUTSCENE,
STAGE_RECORD_TRAFFIC,
STAGE_RECORD_SET_PIECES,
STAGE_REDO_TRIGGER_RECORDING,
STAGE_RECORD_CAMERA,
STAGE_PLAYBACK_CAMERA,
STAGE_DEBUG_RECORD_TRAILER,
STAGE_DEBUG_RESPAWN_CAM_TEST,
STAGE_DEBUG_COMPARE_RECORDINGS
ENDENUM
ENUM MISSION_REQUIREMENT
REQ_NINEF,
REQ_RAPIDGT,
REQ_UBER_CHASE_LOADED,
REQ_FRANKLINS_CAR,
REQ_ROOFS_DOWN,
REQ_PLAYER_INSIDE_CAR,
REQ_LAMAR_INSIDE_CAR,
REQ_CARS_CHOSEN,
REQ_MAIN_RECORDING_LOADED,
REQ_ARRIVAL_CAR_RECORDINGS_CHOSEN,
REQ_RAGE_BAR_NEARLY_FULL,
REQ_LAMARS_CAR_IN_GARAGE,
REQ_BANK_SHUTTERS_REMOVED,
REQ_SHOWROOM_CARS
ENDENUM
ENUM FAILED_REASON
FAILED_GENERIC = 0,
FAILED_KILLED_BUDDY,
FAILED_DESTROYED_CAR,
FAILED_DESTROYED_A_CAR,
FAILED_DESTROYED_BOTH_CARS,
FAILED_LOST_BUDDY,
FAILED_DESTROYED_FRANKLINS_CAR,
FAILED_CAR_STUCK,
FAILED_FRANKLINS_CAR_STUCK,
FAILED_ABANDONED_LAMAR,
FAILED_ALERTED_COPS,
FAILED_DAMAGED_CARS_BEFORE_RACE,
FAILED_DAMAGED_CARS_AFTER_DROPOFF,
FAILED_ABANDONED_CAR,
FAILED_TRASH_SHOWROOM,
FAILED_DROVE_IN_SHOWROOM,
FAILED_BROKEN_INTO_CAR,
FAILED_DISTURBED_SHOWROOM,
FAILED_DISTURBED_DEAL,
FAILED_KILLED_SIMEON,
FAILED_KILLED_JIMMY,
FAILED_LAMARS_CAR_DAMAGED,
FAILED_LED_COPS_TO_SHOWROOM
ENDENUM
ENUM SECTION_STAGE
SECTION_STAGE_SETUP = 0,
SECTION_STAGE_RUNNING,
SECTION_STAGE_CLEANUP,
SECTION_STAGE_SKIP,
SECTION_STAGE_JUMPING_TO_STAGE
ENDENUM
ENUM CREDITS_STAGE
CREDITS_STAGE_0_SHRINK = 0,
CREDITS_STAGE_1_LEAVE_SHRINK,
CREDITS_STAGE_2_OVERHEAD,
CREDITS_STAGE_3_SPORTS_CAR,
CREDITS_STAGE_4_SPORTS_CAR_PARK,
CREDITS_STAGE_5_YOGA,
CREDITS_STAGE_6_FERRIS_FLAG,
CREDITS_STAGE_7_FERRIS_OVERHEAD,
CREDITS_STAGE_8_COUPLE_PIER,
CREDITS_STAGE_9_MAD_CYCLIST,
CREDITS_STAGE_10_GYM,
CREDITS_STAGE_11_SUNBATHERS,
CREDITS_STAGE_12_SUNBATHER_DOG,
CREDITS_STAGE_13_SUNBATHER_DOG_2,
CREDITS_STAGE_14_HOUSES,
CREDITS_STAGE_15_MICHAEL_JOGGERS,
CREDITS_STAGE_16_MICHAEL_JOGGERS_2,
CREDITS_STAGE_17_BUM,
CREDITS_STAGE_18_MICHAEL_BUM,
CREDITS_STAGE_19_MICHAEL_SIT,
CREDITS_STAGE_20_FRANKLIN_ARRIVES,
CREDITS_STAGE_21_LAMAR_ASKS_MICHAEL,
CREDITS_STAGE_22_END,
CREDITS_STAGE_NUM_STAGES
ENDENUM
ENUM TRIGGERED_TEXT_LABEL
ARM1_EXTRAS2 = 0,
AR1_CHASE,
AR1_WAIT,
AR1_CHOOSE,
AR1_CARHELP,
ARM1_INTP6_1,
ARM1_GOTD,
ARM1_GOTD2,
ARM1_PICK,
ARM1_RACE,
ARM1_RACE_PRELOAD,
AR1_CONVHELP,
AR1_CAMHELP,
AR1_BRAKE,
ARM1_CYCL,
ARM1_ALIEN,
ARM1_TOW,
ARM1_TOW2,
ARM1_RING,
AR1_RAGEBAR,
AR1_RAGEHOW,
AR1_RAGESTAT,
AR1_RAGEDEACT,
AR1_HEADHELP,
AR1_JUMPHELP,
AR1_JUMPHELP2,
ARM1_RINGINDIC,
ARM1_PARK2,
ARM1_BANK,
ARM1_HILL,
ARM1_WRONG,
ARM1_WARN1,
ARM1_WARN2,
ARM1_FRONT1,
ARM1_FRONT2,
ARM1_FRONT3,
ARM1_STREET,
ARM1_RINGTOW,
ARM1_BABY,
AR1_PARK,
CMN_GENGETBCK,
CMN_FPSHELP,
ARM1_DISS_FINISHED,
ARM1_DISS_PRELOADED,
ARM1_COPS_3,
AR1_COPHELP1,
AR1_COPHELP2,
AR1_COPHELP2B,
AR1_COPHELP3,
AR1_DUCKHELP,
AR1_COPAMB,
AR1_SHOWROOM,
ARM1_MCS1LI,
ARM1_LEAVEG,
AR1_VIEWSTATS,
AR1_VIEWSTATS2,
ARM1_DRIV,
ARM1_DRIVEND,
ARM1_ATHOME,
AR1_GARHELP1,
AR1_UNIQUE,
AR1_APPHELP,
ARM1_MCS1LO,
AR1_BARBERS,
ARM1_HOUSE,
ARM1_CHAT1,
ARM1_CHAT2,
ARM1_CHAT3,
ARM1_CHAT4,
ARM1_CHAT5,
ARM1_CHAT6,
ARM1_CHAT7,
ARM1_INDIC,
ARM1_STDIO,
AR1_CHOICE,
ARM1_LOSE,
ARM1_RADIO1,
ARM1_FNKLEV1,
AR1_CAMHELP2,
AR1_VEHCAMH
ENDENUM
STRUCT MISSION_PED
PED_INDEX ped
BLIP_INDEX blip
INT iEvent
INT iTimer
INT iSyncedScene
ENDSTRUCT
STRUCT BIRD_DATA
PED_INDEX ped
INT iEvent
INT iTimer
VECTOR vDir
FLOAT fSpeed
ENDSTRUCT
STRUCT CHASE_VEHICLE
VEHICLE_INDEX veh
BLIP_INDEX blip
VECTOR vStartPos
FLOAT fStartHeading
INT iStartCarrec
ENDSTRUCT
STRUCT RAGE_BAR_DATA
FLOAT fCurrentRage
BOOL bHasRaged
ENDSTRUCT
BOOL bCloseFinish = FALSE
BOOL bFranklinsCarTrashed = FALSE
BOOL bLamarsCarTrashed = FALSE
BOOL bBuddyFinished = FALSE
BOOL bTruckHornActivated = FALSE
BOOL bBusHornActivated = FALSE
BOOL bVanHornActivated = FALSE
BOOL bChangedTruckColour = FALSE
BOOL bTrafficHeliRotorsOn = FALSE
//BOOL bTrailerSkidsActive = FALSE
BOOL bCutsceneSkipped = FALSE
BOOL bGrabbedCreditsSportsCar = FALSE
BOOL bShowroomCarsBlocked = FALSE
BOOL bLamarJustTeasedFranklin = FALSE
BOOL bLamarJustInstructedFranklin = FALSE
BOOL bMissionFailed = FALSE
//BOOL bAlreadyPlayedCarTrashedDialogue = FALSE
BOOL bAllowSpecialAbilityDuringChase = TRUE
BOOL bPlayFirstPartOfCopsCutscene = TRUE
BOOL bCustomGPSActive = FALSE
BOOL bCarCollisionIsDisabled = FALSE
BOOL bPlayedCyclistBellSound = FALSE
BOOL bPlayerControlTurnedOffByMission = FALSE
BOOL bTriggeredShowroomCutFromLeft = FALSE
BOOL bBypassedShowroomCutLocates = FALSE
BOOL bRequestedFranklinsCarAsset = FALSE
BOOL bLostWantedLevelForFirstTime = FALSE
BOOL bAliensStatHasBeenSet = FALSE
BOOL bAlleyAssistedRouteActive = FALSE
BOOL bUseNewRubberBanding = FALSE
BOOl bCarOwnerActive = FALSE
BOOL bPlayerHasBeenInCar = FALSE
BOOL bPlayLamarRearViewCam = FALSE
BOOL bHideCredits = FALSE
BOOL bCurrentVehicleIsOutsideShowroom = FALSE
BOOL bDialToneTriggered = FALSE
BOOL bForcedObjectsAreActive = FALSE
BOOL bLamarGivenWalkToCarTask = FALSE
BOOL bMovieBarrierSmashed = FALSE
BOOL bSafeToPlayCamAnim = FALSE
BOOL bForceAnimatedCamsOn = TRUE
BOOL bCyclistsSetToFlee = FALSE
BOOL bLamarAlreadyGotIntoCar = FALSE
BOOL bClearedHelp = FALSE
BOOL bUsedACheckpoint = FALSE
BOOL bSafeToDoSeamlessCarTasks = FALSE
BOOL bPlayedPoliceReport = FALSE
BOOL bRequestedCreditsScaleform = FALSE
BOOL bOverriddenVanColour = FALSE
BOOL bReplayEventStarted = FALSE
BOOL bSkippedSpecialAbilityTutorial = FALSE
BOOL bWarpedCarEarlyForShowroomScene = FALSE
BOOL bForcedFirstPersonView = FALSE
BOOL bHasFirstPersonFlashTriggered = FALSE
BOOL bGrabbedMapObjectsForCredits = FALSE
BOOL bUnlockedMichaelsMansion = FALSE
BOOL bHasTextLabelTriggered[80]
FLOAT fCurrentPlaybackTime = 0.0
FLOAT fCurrentPlaybackSpeed = 0.0
FLOAT fNextActionCamFov = 0.0
FLOAT fFranklinsCarStartHeading = 123.7440 //71.4776
FLOAT fFranklinByCarHeading = -77.7//294.6570
FLOAT fLamarByCarHeading = -87.9//263.4475
FLOAT fLamarLeadOutHeading = 322.2873
FLOAT fFranklinLeadOutHeading = 316.7220
FLOAT fLamarByStartCarHeading = 251.8757
FLOAT fFranklinsCarFinalHeading = 0.4923//275.1384
FLOAT fSpeedWhenHitFinalLocate = 0.0
FLOAT fJimmyStartHeading = 17.3
FLOAT fSimeonStartHeading = -160.9
FLOAT fPlayersCarShowroomHeading = 153.3213
FLOAT fLamarsCarShowroomHeading = 159.5713
CONST_INT MAX_CAR_HEALTH 2000
CONST_INT CARREC_BUDDY 5
CONST_INT CARREC_BUDDY_ALTERNATE 5 //Currently the same as CARREC_BUDDY, but may need to be shifted to match the alternate vehicle
CONST_INT CARREC_BUDDY_ESCAPE 8
CONST_INT CARREC_BUDDY_ESCAPE_2 9
CONST_INT CARREC_COP_ESCAPE 300
CONST_INT CARREC_COP_ESCAPE_START 301
CONST_INT CARREC_SLOMO_RAPIDGT 320
CONST_INT CARREC_SLOMO_NINEF 321
CONST_INT CARREC_SHOWROOM_NINEF_1 330
CONST_INT CARREC_SHOWROOM_NINEF_2 331
CONST_INT CARREC_SHOWROOM_RAPIDGT_1 332
CONST_INT CARREC_SHOWROOM_RAPIDGT_2 333
CONST_INT CARREC_CREDITS_BOAT_1 601
CONST_INT CARREC_CREDITS_BOAT_2 602
CONST_INT SETPIECE_PACKER_INDEX 15
CONST_INT NINEF_INDEX 0
CONST_INT RAPIDGT_INDEX 1
CONST_INT CARREC_TRAILER 991
CONST_INT CARREC_TRAILER_2 993
CONST_INT CHECKPOINT_MID_CHASE 1
CONST_INT CHECKPOINT_LOSE_COPS 2
CONST_INT CHECKPOINT_GO_HOME 3
CONST_INT DECAL_SAND_TREAD_ID 3011
CONST_INT CREDITS_FEMALE_1 0
CONST_INT CREDITS_FEMALE_2 1
CONST_INT CREDITS_MALE_1 2
CONST_INT CREDITS_FEMALE_3 3
CONST_INT CREDITS_MALE_2 4
CONST_INT CREDITS_MALE_3 5
CONST_INT CREDITS_MALE_4 6
CONST_INT CREDITS_JOGGER_1 7
INT iCurrentEvent = 0
INT iPlayersCar = 0
INT iBuddiesCar = 0
INT iCarrecBuddyEscape = 0
INT iCarrecBuddyArrive = 0
INT iCarrecPlayerArrive = 0
INT iCarrecMain = 0
//INT iBuddyCallTimer = 0
INT iCineCamPhoneTimer = 0
INT iCurrentCinematicCam = 0
INT iCrashTimer = 0
INT iCloseTimer = 0
INT iTimeSinceLastHorn = 0
INT iTimeSinceLastNearMissDialogue = 0
INT iLamarRevSound = 0
INT iAmbientDialogueTimer = 0
INT iCamRecs[10]
INT iDispatchSpawnBlockBank1 = -1
INT iDispatchSpawnBlockBank2 = -1
//INT iClosestVehicleCheckTimer = 0
INT iHurryDialogueTimer = 0
INT iNumTimesPlayedHurryDialogue = 0
INT iStartFailTimer = 0
INT iStartFailUnarmedCounter = 0
INT iRaceChatTimer = 0
INT iInFrontChatTimer = 0
INT iTimeWhenFranklinGotInFront = 0
//INT iNumTimesMissedFinalCall = 0
INT iPlayerSyncScene = 0
INT iCameraSyncScene = 0
//INT iCarSyncScene = 0
INT iPreloadRecordingsIndex = 0
INT iBusLightsTimer = 0
INT iRandomCarCreationEvent = 0
//INT iClockTime[3]
INT iPlayersHealthBeforeRace = 0
INT iLamarsHealthBeforeRace = 0
INT iLoseCopsTimer = 0
INT iCopsAITimer = 0
INT iChasePedBlockingArea = -1
INT iChasePedBlockingArea2 = -1
INT iGatePedBlockingArea = -1
INT iShowroomPedBlockingArea = -1
INT iShowroomPedBlockingArea2 = -1
INT iRageHelpTimer = 0
INT iHintCamHelpTimer = 0
INT iPrevUnarmedHits = 0
INT iNumTimesPlayedLostDialogue = 0
INT iNumTimesPlayedFailWarnDialogue = 0
INT iLostDialogueTimer = 0
INT iWarnDialogueTimer = 0
INT iWarnDialogueTimer2 = 0
INT iInFrontHornTimer = 0
INT iStatsHelpTextTimer = 0
INT iAudioSceneEventDialPhone = 0
INT iAudioSceneEventLoseCops = 0
INT iAudioSceneEventMovieStudio = 0
INT iAudioSceneEventBumps = 0
INT iAudioSceneEventCarPark = 0
INT iLamarWalkToCarTimer = 0
INT iCreditsTextEvent = 0
INT iSyncSceneJimmySimeon = 0
INT iSyncSceneCar = 0
INT iCreditsEvent = 0
INT iMeleeDialogueTimer = 0
INT iJimmySimeonDialogueTimer = 0
INT iNumJimmySimeonConversationsPlayed = 0
INT iNumTimesPlayedSimeonDialogue = 0
INT iCarHelpTimer = 0
INT iLamarFireTimer = 0
INT iChaseCamTimer = 0
INT iLamarDamageDialogueTimer = 0
INT iNavmeshBlockCutscene = -1
INT iDuckHelpTimer = 0
INT iSyncSceneFerrisWheel[10]
VECTOR vOutsideGarage = <<-31.1700, -1090.7544, 25.4344>>
VECTOR vNextToBuddy = <<0.0, 0.0, 0.0>>
VECTOR vFranklinsHouse = <<-25.4559, -1426.9977, 29.6560>>
VECTOR vRoomCorner1 = <<-56.8445, -1107.2435, 24.4344>>
VECTOR vRoomCorner2 = <<-33.6656, -1092.6023, 30.4344>>
VECTOR vFranklinsCarStartPos = <<-16.1017, -1079.5923, 25.6721>> //<<-20.2035, -1084.2188, 25.6348>>
VECTOR vFranklinByCarPos = <<-40.54, -1096.27, 25.43>>//<<-25.0341, -1084.6193, 25.5747>>
VECTOR vLamarByCarPos = <<-42.0, -1095.5, 25.43>> //<<-25.1225, -1082.4664, 25.6048>>
VECTOR vLamarLeadOutPos = <<-1899.2156, -593.5246, 10.8973>>
VECTOR vFranklinLeadOutPos = <<-1899.7908, -594.6526, 10.8853>>
VECTOR vLamarByStartCarPos = <<-1883.5654, -575.7982, 10.7861>>
VECTOR vFranklinsCarFinalPos = <<-24.9598, -1437.6470, 29.6552>> //<<-13.8292, -1458.0117, 29.4598>>
VECTOR vJimmyStartPos = <<-42.95, -1097.30, 25.41>>
VECTOR vSimeonStartPos = <<-43.98, -1095.47, 25.41>>
VECTOR vPlayersCarInShowroom = <<-29.9308, -1089.8215, 25.4221>>
VECTOR vLamarsCarInShowroom = <<-34.2931, -1089.3936, 25.4222>> //<<-33.5231, -1089.3937, 25.4222>>
VECTOR vFerrisWheelCentre = <<-1663.970, -1126.700, 30.700>>
//VECTOR vPrevCreditsCamPos = <<0.0, 0.0, 0.0>>
STRING strCarrec = "mattarmenian"
STRING strStartCutscene = "armenian_1_int"
STRING strGarageCutscene = "armenian_1_mcs_1"
STRING strHouseCutscene = "arm_1_mcs_2_concat"
STRING strChaseStartAnims = "missarmenian1walktocar"
STRING strShowroomCamAnims = "missarmenian1@dealership"
STRING strChaseEndAnims = "missarmenian1banter"
STRING strAlienAnims = "missarmenian1movieextras"
STRING strLamarAnnoyedAnims = "missarmenian1ig_13"
STRING strLamarLeadOutAnims = "missarmenian1leadinout"
STRING strShowroomLeadInOutAnims = "missarmenian1leadinoutarmenian_1_mcs_1_leadinout"
STRING strWaypointStartAlley = "arm1_01"
STRING strWaypointAroundCar = "arm1_05"
STRING strLamarCarAnimsTaunt = "missarmenian1driving_taunts@lamar_1"
STRING strLamarCarAnimsCrash = "missarmenian1driving_taunts@lamar_2"
STRING strFranklinCarAnimsTaunt = "missarmenian1driving_taunts@franklin"
STRING strLamarShowroomAnims = "missarmenian1leadinoutarm_1_ig_14_leadinout"
STRING strFerrisWheelAnims = "MISSFINALE_C2IG_5"
//STRING strWaypointCreditsBoat = "arm1_10"
VEHICLE_INDEX vehTriggerCar
VEHICLE_INDEX vehCutsceneCop
VEHICLE_INDEX vehTrailer
VEHICLE_INDEX vehFranklinsCar
VEHICLE_INDEX vehCameraTest
VEHICLE_INDEX vehTransporter
VEHICLE_INDEX vehTanker
VEHICLE_INDEX vehShowroomCars[4]
VEHICLE_INDEX vehCarsOutsideShowroom[1] //Used to be more cars, can probably remove this array at some point.
VEHICLE_INDEX vehCreditsCars[20]
VEHICLE_INDEX vehFinalCutsceneCar
VEHICLE_INDEX vehCreditsBoat
VEHICLE_INDEX vehCreditsSailboat
VEHICLE_INDEX vehCreditsSportsCar
PED_INDEX pedCutsceneCops[2]
PED_INDEX pedCurrentAngryDriver
PED_INDEX pedCarOwner
PED_INDEX pedCreditsBoat
PED_INDEX pedCreditsFerrisWheel[10]
PED_INDEX pedCreditsCars[20]
PTFX_ID ptfxCreditsBoat[2]
BLIP_INDEX blipCurrentDestination
BLIP_INDEX blipLamarsCar
BLIP_INDEX blipFakeGPS
CAMERA_INDEX camCutscene
CAMERA_INDEX camChase
OBJECT_INDEX objCigarette
OBJECT_INDEX objShowroomGlass[8]
OBJECT_INDEX objShirt
OBJECT_INDEX objHealthPack
OBJECT_INDEX objWardrobeDoors[2]
OBJECT_INDEX objVaultShutter
OBJECT_INDEX objLamarsPhone
OBJECT_INDEX objFerrisWheel
OBJECT_INDEX objFerrisCars[16]
OBJECT_INDEX objBankGates[2]
OBJECT_INDEX objBankGateCollision[2]
SCALEFORM_INDEX sfCredits
//PICKUP_INDEX pickupHouse
PTFX_ID iWheelSkidPtfx[2]
INTERIOR_INSTANCE_INDEX interiorShowroom
INTERIOR_INSTANCE_INDEX interiorFranklinsHouse
INTERIOR_INSTANCE_INDEX interiorShrink
INTERIOR_INSTANCE_INDEX interiorBank
INTERIOR_INSTANCE_INDEX interiorCarPark
INTERIOR_INSTANCE_INDEX interiorCarPark2
SCENARIO_BLOCKING_INDEX sbiMovieStudio
SCENARIO_BLOCKING_INDEX sbiPastMovieStudio
SCENARIO_BLOCKING_INDEX sbiShowroom
SCENARIO_BLOCKING_INDEX sbiShowroomBrowse
SCENARIO_BLOCKING_INDEX sbiSecurityGuards
SCENARIO_BLOCKING_INDEX sbiCutscene
//GROUP_INDEX groupPlayer
MODEL_NAMES modelMainCar1 = NINEF2
MODEL_NAMES modelMainCar2 = RAPIDGT2
MODEL_NAMES modelCamCar = manana //emperor //Model is one of the common models used in the chase to save memory
MODEL_NAMES modelBankGate = P_Sec_Gate_01_S
MODEL_NAMES modelBankGateCollision = P_SEC_GATE_01_S_COL
MODEL_NAMES modelBankSecurity = S_M_M_Armoured_01
MODEL_NAMES modelMovieGuards = S_M_M_SECURITY_01
MODEL_NAMES modelCarOwner = A_M_Y_BEACH_02 //U_M_Y_BABYD
MODEL_NAMES modelShirt = P_CS_SHIRT_01_S
MODEL_NAMES modelWardrobeLeft = V_ILEV_FA_WARDDOORL
MODEL_NAMES modelWardrobeRight = V_ILEV_FA_WARDDOORR
MODEL_NAMES modelHealthPack = prop_ld_health_pack
MODEL_NAMES modelCreditsBoat = JETMAX
MODEL_NAMES modelCreditsSailboat = MARQUIS
MODEL_NAMES modelCreditsBoatPed = A_M_Y_BEACH_01
MODEL_NAMES modelLamarsPhone = PROP_PHONE_ING
MODEL_NAMES modelFerrisWheel = PROP_LD_FERRIS_WHEEL
MODEL_NAMES modelFerrisCar = PROP_FERRIS_CAR_01
MODEL_NAMES modelFerrisWheelPed1 = A_F_Y_BEACH_01
MODEL_NAMES modelFerrisWheelPed2 = A_M_Y_BEACH_01
MODEL_NAMES modelJoggerFemale = A_F_Y_FITNESS_02
MODEL_NAMES modelCreditsMale = A_M_Y_BEACHVESP_01
MODEL_NAMES modelCreditsFemale = A_F_Y_HIPSTER_02
//MODEL_NAMES modelFranklinDoor = V_ILEV_FA_ROOMDOOR
MISSION_PED sLamar
MISSION_PED sSimeon
MISSION_PED sJimmy
MISSION_PED sAliens[4]
MISSION_PED sAliensGroup2[2]
MISSION_PED sSmoker
//MISSION_PED sSetSmash[2]
BIRD_DATA sBirds[6]
MISSION_PED sSecurityGuard
MISSION_PED sMovieGuards[2]
CHASE_VEHICLE sMainCars[2]
RAGE_BAR_DATA sRageData
LOCATES_HEADER_DATA sLocatesData
SELECTOR_PED_STRUCT sDummySelectorPeds
//DOOR_LOCK_DATA sStudioGates[2]
CREDITS_STAGE eCreditsStage = CREDITS_STAGE_0_SHRINK
MISSION_STAGE eMissionStage = STAGE_OPENING_CUTSCENE
SECTION_STAGE eSectionStage = SECTION_STAGE_SETUP
CAM_VIEW_MODE ePrevCarViewMode = CAM_VIEW_MODE_THIRD_PERSON_MEDIUM
STRING strFailText
structPedsForConversation sConversationPeds
CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID widgetDebug
BOOL bDebugRecordTraffic = FALSE
BOOL bDebugRecordSetpieces = FALSE
BOOL bDebugRedoTrigger = FALSE
BOOL bDebugShowChaseStats = FALSE
BOOL bDebugEnhanceDriving = FALSE
BOOL bDebugAttachFilmSet = FALSE
BOOL bDebugAutoPlayTrigger = FALSE
BOOL bDebugRecordCamera = FALSE
BOOL bDebugPlaybackCamera = FALSE
BOOL bDebugFreeModeCamera = FALSE
BOOL bDebugPlayEdit = FALSE
BOOL bDebugRecordEdit = FALSE
BOOL bDebugPlayMixdown = FALSE
BOOL bDebugRecordTrailer = FALSE
BOOL bDebugDontUseStopWait = FALSE
BOOL bDebugDisplayMissionDebug = FALSE
BOOL bDebugEnableHornAsserts = FALSE
BOOL bDebugTestRespawnCutscene = FALSE
BOOL bDebugUseNewAbilityButton = FALSE
BOOL bDebugSticksReleased = FALSE
BOOL bDebugCompareTriggerRecordings = FALSE
BOOL bDebugDisplayCreditsText = FALSE
BOOL bDebugTestCreditsSingleLine = FALSE
BOOL bDebugTestCreditsLogo = FALSE
BOOL bDebugTestCreditsLogoHide = FALSE
BOOL bDebugClearCreditsText = FALSE
BOOL bDebugDisplayCreditsInfo = FALSE
BOOL bDebugUnloadCloudHats = FALSE
BOOL bDebugLoadWispyCloud = FALSE
BOOL bDebugLoadHorizonCloud = FALSE
BOOL bDebugLoadContrailsCloud = FALSE
BOOL bDebugLoadPuffsCloud = FALSE
BOOL bDebugLoadStormyCloud = FALSE
BOOL bDebugLoadAltoCloud = FALSE
BOOL bDebugFerrisWheelTest = FALSE
BOOL bDebugFerrisWheelReattach = FALSE
INT iDebugCurrentCam = 0
INT iDebugCloudHat = 0
INT iDebugWheelAnim = 0
INT iDebugCreditsIndex = 0
TEXT_WIDGET_ID textWidgetRole1
TEXT_WIDGET_ID textWidgetNames1
TEXT_WIDGET_ID textWidgetRole2
TEXT_WIDGET_ID textWidgetNames2
TEXT_WIDGET_ID textWidgetRole3
TEXT_WIDGET_ID textWidgetNames3
TEXT_WIDGET_ID textWidgetCreditsAlign
TEXT_WIDGET_ID textWidgetCreditsColour
FLOAT fDebugCreditsBlockX = 0.0
FLOAT fDebugCreditsBlockY = 70.0
FLOAT fDebugRole1XOffset = 0.0
FLOAT fDebugRole2XOffset = 0.0
FLOAT fDebugRole3XOffset = 0.0
FLOAT fDebugNames1XOffset = 0.0
FLOAT fDebugNames2XOffset = 0.0
FLOAT fDebugNames3XOffset = 0.0
FLOAT fDebugTimeSinceLeftStickPressed = 0.0
FLOAT fDebugOldTriggerTime = 0.0
FLOAT fDebugNewTriggerTime = 0.0
VECTOR vDebugFilmSetPos = <<-0.040, 7.080, 1.280>>//<<-0.040, 1.230, 1.280>>
VECTOR vDebugFilmSetRot = <<-8.400, 0.000, -90.400>>//<<8.400, 0.000, 90.400>>
VECTOR vDebugVectorA = <<0.0, 0.0, 0.0>>
VECTOR vDebugVectorB = <<0.0, 0.0, 0.0>>
VECTOR vDebugVectorResult = <<0.0, 0.0, 0.0>>
VECTOR vDebugFerrisWheelOffset = <<0.0, 0.0, 0.0>>
VECTOR vDebugFerrisWheelRot = <<0.0, 0.0, 0.0>>
VEHICLE_INDEX vehDebug[10]
VEHICLE_INDEX vehDebugFov
VEHICLE_INDEX vehDebugCamCar
CONST_INT MAX_SKIP_MENU_LENGTH 12
INT iDebugJumpStage = 0
INT iDebugNumPrintsThisFrame = 0
MissionStageMenuTextStruct sSkipMenu[MAX_SKIP_MENU_LENGTH]
CAM_RECORDING_DATA sCamData
PROC CREATE_WIDGETS()
widgetDebug = START_WIDGET_GROUP("Armenian1")
ADD_WIDGET_BOOL("Enable credits debug", bDebugDisplayCreditsInfo)
ADD_WIDGET_BOOL("Compare trigger recordings", bDebugCompareTriggerRecordings)
ADD_WIDGET_BOOL("New rubber banding", bUseNewRubberBanding)
ADD_WIDGET_BOOL("Do respawn cutscene test", bDebugTestRespawnCutscene)
ADD_WIDGET_BOOL("Enable horn asserts", bDebugEnableHornAsserts)
ADD_WIDGET_BOOL("Show debug", bDebugDisplayMissionDebug)
ADD_WIDGET_BOOL("Show chase info", bDebugShowChaseStats)
ADD_WIDGET_BOOL("Don't wait after car stop", bDebugDontUseStopWait)
ADD_WIDGET_BOOL("Allow special ability during chase", bAllowSpecialAbilityDuringChase)
ADD_WIDGET_BOOL("Use alternate special ability controls", bDebugUseNewAbilityButton)
ADD_WIDGET_BOOL("Do Lamar wait cutscene variation", bPlayLamarRearViewCam)
ADD_WIDGET_BOOL("Force animated cams on", bForceAnimatedCamsOn)
START_WIDGET_GROUP("Ferris wheel test")
ADD_WIDGET_BOOL("Enable test", bDebugFerrisWheelTest)
ADD_WIDGET_BOOL("Reattach", bDebugFerrisWheelReattach)
ADD_WIDGET_INT_SLIDER("Anim", iDebugWheelAnim, 0, 4, 1)
ADD_WIDGET_VECTOR_SLIDER("Attach", vDebugFerrisWheelOffset, -10.0, 10.0, 0.1)
ADD_WIDGET_VECTOR_SLIDER("Rotation", vDebugFerrisWheelRot, 0, 360.0, 1.0)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Cops cutscene variations")
ADD_WIDGET_BOOL("Franklin's car trashed", bFranklinsCarTrashed)
ADD_WIDGET_BOOL("Lamar's car trashed", bLamarsCarTrashed)
ADD_WIDGET_BOOL("Franklin finished first", bCloseFinish)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Credits")
ADD_WIDGET_BOOL("Hide credits", bHideCredits)
ADD_WIDGET_BOOL("Display logo", bDebugTestCreditsLogo)
ADD_WIDGET_BOOL("Hide logo", bDebugTestCreditsLogoHide)
ADD_WIDGET_BOOL("Display test text", bDebugDisplayCreditsText)
ADD_WIDGET_BOOL("Clear test text", bDebugClearCreditsText)
ADD_WIDGET_BOOL("Test single line", bDebugTestCreditsSingleLine)
ADD_WIDGET_FLOAT_SLIDER("Credits block X", fDebugCreditsBlockX, -1000.0, 1000.0, 1.0)
ADD_WIDGET_FLOAT_SLIDER("Credits block Y", fDebugCreditsBlockY, -1000.0, 1000.0, 1.0)
textWidgetCreditsAlign = ADD_TEXT_WIDGET("Align")
textWidgetCreditsColour = ADD_TEXT_WIDGET("Colour")
ADD_WIDGET_STRING("")
textWidgetRole1 = ADD_TEXT_WIDGET("Role 1")
ADD_WIDGET_FLOAT_SLIDER("Role 1 X offset", fDebugRole1XOffset, -1000.0, 1000.0, 1.0)
textWidgetNames1 = ADD_TEXT_WIDGET("Names 1")
ADD_WIDGET_FLOAT_SLIDER("Names 1 X offset", fDebugNames1XOffset, -1000.0, 1000.0, 1.0)
textWidgetRole2 = ADD_TEXT_WIDGET("Role 2")
ADD_WIDGET_FLOAT_SLIDER("Role 2 X offset", fDebugRole2XOffset, -1000.0, 1000.0, 1.0)
textWidgetNames2 = ADD_TEXT_WIDGET("Names 2")
ADD_WIDGET_FLOAT_SLIDER("Names 2 X offset", fDebugNames2XOffset, -1000.0, 1000.0, 1.0)
textWidgetRole3 = ADD_TEXT_WIDGET("Role 3")
ADD_WIDGET_FLOAT_SLIDER("Role 3 X offset", fDebugRole3XOffset, -1000.0, 1000.0, 1.0)
textWidgetNames3 = ADD_TEXT_WIDGET("Names 3")
ADD_WIDGET_FLOAT_SLIDER("Names 3 X offset", fDebugNames3XOffset, -1000.0, 1000.0, 1.0)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Clouds")
ADD_WIDGET_INT_SLIDER("Cloud Hat", iDebugCloudHat, 0, 10, 1)
ADD_WIDGET_BOOL("Load wispy", bDebugLoadWispyCloud)
ADD_WIDGET_BOOL("Load stormy", bDebugLoadStormyCloud)
ADD_WIDGET_BOOL("Load contrails", bDebugLoadContrailsCloud)
ADD_WIDGET_BOOL("Load puffs", bDebugLoadPuffsCloud)
ADD_WIDGET_BOOL("Load altostratus", bDebugLoadAltoCloud)
ADD_WIDGET_BOOL("Load horizon", bDebugLoadHorizonCloud)
ADD_WIDGET_BOOL("Unload all hats", bDebugUnloadCloudHats)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Chase recording")
ADD_WIDGET_BOOL("Start traffic recording", bDebugRecordTraffic)
ADD_WIDGET_BOOL("Play trigger while traffic recording", bDebugAutoPlayTrigger)
ADD_WIDGET_BOOL("Start setpiece recording", bDebugRecordSetpieces)
ADD_WIDGET_BOOL("Redo trigger recording", bDebugRedoTrigger)
ADD_WIDGET_BOOL("Record trailer set-piece", bDebugRecordTrailer)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Compare trigger recordings")
ADD_WIDGET_FLOAT_SLIDER("Old trigger time", fDebugOldTriggerTime, 0.0, 300000.0, 100.0)
ADD_WIDGET_FLOAT_SLIDER("New trigger time", fDebugNewTriggerTime, 0.0, 300000.0, 100.0)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("billboard test")
ADD_WIDGET_BOOL("Enable attach editing", bDebugAttachFilmSet)
ADD_WIDGET_VECTOR_SLIDER("Pos", vDebugFilmSetPos, -10.0, 10.0, 0.01)
ADD_WIDGET_VECTOR_SLIDER("Rot", vDebugFilmSetRot, -180.0, 180.0, 0.1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Vector calculator")
ADD_WIDGET_VECTOR_SLIDER("A", vDebugVectorA, -10000.0, 10000.0, 0.01)
ADD_WIDGET_VECTOR_SLIDER("B", vDebugVectorB, -10000.0, 10000.0, 0.01)
ADD_WIDGET_VECTOR_SLIDER("Result", vDebugVectorResult, -10000.0, 10000.0, 0.01)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Camera recording")
ADD_WIDGET_BOOL("Start camera recording", bDebugRecordCamera)
ADD_WIDGET_BOOL("Start camera playback", bDebugPlaybackCamera)
ADD_WIDGET_BOOL("Free-mode camera", bDebugFreeModeCamera)
ADD_WIDGET_BOOL("Play edited version", bDebugPlayEdit)
ADD_WIDGET_BOOL("Record edited version as single recording", bDebugRecordEdit)
ADD_WIDGET_BOOL("Play mixdown", bDebugPlayMixdown)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
SET_UBER_PARENT_WIDGET_GROUP(widgetDebug)
SET_LOCATES_HEADER_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_STRING_TO_DEBUG_DISPLAY(STRING strDebug)
IF bDebugDisplayMissionDebug
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
DRAW_DEBUG_TEXT_2D(strDebug, <<0.05, 0.05 + (0.05 * iDebugNumPrintsThisFrame), 0.0>>, 0, 0, 255, 255)
iDebugNumPrintsThisFrame++
ENDIF
ENDPROC
PROC DRAW_INT_TO_DEBUG_DISPLAY(INT iDebug, STRING strLabel)
IF bDebugDisplayMissionDebug
TEXT_LABEL strConcat = strLabel
strConcat += iDebug
DRAW_STRING_TO_DEBUG_DISPLAY(strConcat)
ENDIF
ENDPROC
PROC DRAW_FLOAT_TO_DEBUG_DISPLAY(FLOAT fDebug, STRING strLabel)
IF bDebugDisplayMissionDebug
TEXT_LABEL strConcat = strLabel
strConcat += GET_STRING_FROM_FLOAT(fDebug)
DRAW_STRING_TO_DEBUG_DISPLAY(strConcat)
ENDIF
ENDPROC
#ENDIF
PROC LOAD_CHASE_UBER_DATA()
TrafficCarPos[0] = <<-1869.4471, -533.4042, 11.2620>>
TrafficCarQuatX[0] = -0.0008
TrafficCarQuatY[0] = -0.0089
TrafficCarQuatZ[0] = 0.4259
TrafficCarQuatW[0] = 0.9047
TrafficCarRecording[0] = 47
TrafficCarStartime[0] = 2000.0000
TrafficCarModel[0] = intruder
TrafficCarPos[1] = <<-2017.4979, -425.4558, 11.0772>>
TrafficCarQuatX[1] = -0.0102
TrafficCarQuatY[1] = -0.0039
TrafficCarQuatZ[1] = 0.4351
TrafficCarQuatW[1] = 0.9003
TrafficCarRecording[1] = 250
TrafficCarStartime[1] = 2050.0000
TrafficCarModel[1] = intruder
TrafficCarPos[2] = <<-2140.0793, -363.5818, 12.7760>>
TrafficCarQuatX[2] = 0.0018
TrafficCarQuatY[2] = -0.0046
TrafficCarQuatZ[2] = 0.8084
TrafficCarQuatW[2] = -0.5886
TrafficCarRecording[2] = 251
TrafficCarStartime[2] = 2100.0000
TrafficCarModel[2] = intruder
TrafficCarPos[3] = <<-1994.4319, -437.5106, 11.7305>>
TrafficCarQuatX[3] = -0.0021
TrafficCarQuatY[3] = -0.0005
TrafficCarQuatZ[3] = 0.4319
TrafficCarQuatW[3] = 0.9019
TrafficCarRecording[3] = 284
TrafficCarStartime[3] = 2500.0000
TrafficCarModel[3] = BUS
TrafficCarPos[4] = <<-1924.5322, -488.0420, 11.3844>>
TrafficCarQuatX[4] = -0.0082
TrafficCarQuatY[4] = -0.0039
TrafficCarQuatZ[4] = 0.4332
TrafficCarQuatW[4] = 0.9012
TrafficCarRecording[4] = 67
TrafficCarStartime[4] = 3000.0000
TrafficCarModel[4] = manana
TrafficCarPos[5] = <<-1941.4397, -481.0277, 11.4080>>
TrafficCarQuatX[5] = -0.0022
TrafficCarQuatY[5] = -0.0095
TrafficCarQuatZ[5] = 0.4264
TrafficCarQuatW[5] = 0.9045
TrafficCarRecording[5] = 68
TrafficCarStartime[5] = 3050.0000
TrafficCarModel[5] = intruder
TrafficCarPos[6] = <<-2057.1311, -404.9521, 10.7321>>
TrafficCarQuatX[6] = 0.0017
TrafficCarQuatY[6] = -0.0034
TrafficCarQuatZ[6] = 0.9104
TrafficCarQuatW[6] = -0.4136
TrafficCarRecording[6] = 30
TrafficCarStartime[6] = 5000.0000
TrafficCarModel[6] = manana
TrafficCarPos[7] = <<-2036.5444, -436.0986, 11.0454>>
TrafficCarQuatX[7] = 0.0002
TrafficCarQuatY[7] = 0.0039
TrafficCarQuatZ[7] = 0.9073
TrafficCarQuatW[7] = -0.4204
TrafficCarRecording[7] = 31
TrafficCarStartime[7] = 5040.0000
TrafficCarModel[7] = manana
TrafficCarPos[8] = <<-1984.7413, -437.6598, 11.2996>>
TrafficCarQuatX[8] = -0.0053
TrafficCarQuatY[8] = -0.0097
TrafficCarQuatZ[8] = 0.4337
TrafficCarQuatW[8] = 0.9010
TrafficCarRecording[8] = 32
TrafficCarStartime[8] = 5080.0000
TrafficCarModel[8] = intruder
TrafficCarPos[9] = <<-1927.4957, -498.7926, 11.3251>>
TrafficCarQuatX[9] = 0.0041
TrafficCarQuatY[9] = 0.0017
TrafficCarQuatZ[9] = 0.4102
TrafficCarQuatW[9] = 0.9120
TrafficCarRecording[9] = 35
TrafficCarStartime[9] = 5120.0000
TrafficCarModel[9] = intruder
TrafficCarPos[10] = <<-2114.0156, -377.4624, 12.3287>>
TrafficCarQuatX[10] = -0.0107
TrafficCarQuatY[10] = -0.0139
TrafficCarQuatZ[10] = 0.8500
TrafficCarQuatW[10] = -0.5266
TrafficCarRecording[10] = 36
TrafficCarStartime[10] = 5160.0000
TrafficCarModel[10] = intruder
TrafficCarPos[11] = <<-2155.5698, -357.4149, 12.5796>>
TrafficCarQuatX[11] = -0.0008
TrafficCarQuatY[11] = -0.0001
TrafficCarQuatZ[11] = 0.8151
TrafficCarQuatW[11] = -0.5793
TrafficCarRecording[11] = 33
TrafficCarStartime[11] = 5200.0000
TrafficCarModel[11] = manana
TrafficCarPos[12] = <<-1955.9728, -417.3983, 17.2001>>
TrafficCarQuatX[12] = -0.0326
TrafficCarQuatY[12] = -0.0247
TrafficCarQuatZ[12] = 0.4751
TrafficCarQuatW[12] = 0.8790
TrafficCarRecording[12] = 39
TrafficCarStartime[12] = 9500.0000
TrafficCarModel[12] = intruder
TrafficCarPos[13] = <<-1760.4513, -547.8943, 35.8235>>
TrafficCarQuatX[13] = -0.0664
TrafficCarQuatY[13] = -0.0238
TrafficCarQuatZ[13] = 0.4498
TrafficCarQuatW[13] = 0.8904
TrafficCarRecording[13] = 44
TrafficCarStartime[13] = 14100.0000
TrafficCarModel[13] = manana
TrafficCarPos[14] = <<-1883.8774, -465.7772, 23.5569>>
TrafficCarQuatX[14] = -0.0264
TrafficCarQuatY[14] = -0.0213
TrafficCarQuatZ[14] = 0.4694
TrafficCarQuatW[14] = 0.8823
TrafficCarRecording[14] = 43
TrafficCarStartime[14] = 16733.0000
TrafficCarModel[14] = intruder
TrafficCarPos[15] = <<-1844.1317, -499.3117, 27.1005>>
TrafficCarQuatX[15] = -0.0111
TrafficCarQuatY[15] = 0.0344
TrafficCarQuatZ[15] = 0.8823
TrafficCarQuatW[15] = -0.4693
TrafficCarRecording[15] = 46
TrafficCarStartime[15] = 16781.0000
TrafficCarModel[15] = intruder
TrafficCarPos[16] = <<-1669.5397, -574.1034, 33.3805>>
TrafficCarQuatX[16] = 0.0115
TrafficCarQuatY[16] = -0.0228
TrafficCarQuatZ[16] = 0.8892
TrafficCarQuatW[16] = -0.4567
TrafficCarRecording[16] = 252
TrafficCarStartime[16] = 20000.0000
TrafficCarModel[16] = intruder
TrafficCarPos[17] = <<-1553.6389, -643.6885, 28.7234>>
TrafficCarQuatX[17] = 0.0099
TrafficCarQuatY[17] = -0.0012
TrafficCarQuatZ[17] = 0.6289
TrafficCarQuatW[17] = 0.7774
TrafficCarRecording[17] = 253
TrafficCarStartime[17] = 20050.0000
TrafficCarModel[17] = intruder
TrafficCarPos[18] = <<-1612.9589, -618.0091, 31.3797>>
TrafficCarQuatX[18] = 0.0086
TrafficCarQuatY[18] = -0.0260
TrafficCarQuatZ[18] = 0.9021
TrafficCarQuatW[18] = -0.4307
TrafficCarRecording[18] = 254
TrafficCarStartime[18] = 20100.0000
TrafficCarModel[18] = manana
TrafficCarPos[19] = <<-1598.3412, -514.3162, 34.7884>>
TrafficCarQuatX[19] = -0.0217
TrafficCarQuatY[19] = -0.0010
TrafficCarQuatZ[19] = 0.9766
TrafficCarQuatW[19] = 0.2140
TrafficCarRecording[19] = 255
TrafficCarStartime[19] = 20150.0000
TrafficCarModel[19] = manana
/*TrafficCarPos[20] = <<-1707.4438, -545.4189, 36.8241>>
TrafficCarQuatX[20] = 0.0027
TrafficCarQuatY[20] = -0.0139
TrafficCarQuatZ[20] = 0.9113
TrafficCarQuatW[20] = -0.4115
TrafficCarRecording[20] = 48
TrafficCarStartime[20] = 21153.0000
TrafficCarModel[20] = manana*/
TrafficCarPos[21] = <<-1664.3258, -561.4086, 33.5174>>
TrafficCarQuatX[21] = 0.0283
TrafficCarQuatY[21] = 0.0288
TrafficCarQuatZ[21] = 0.2157
TrafficCarQuatW[21] = 0.9756
TrafficCarRecording[21] = 50
TrafficCarStartime[21] = 21869.0000
TrafficCarModel[21] = intruder
TrafficCarPos[22] = <<-1617.1469, -600.6409, 32.0157>>
TrafficCarQuatX[22] = 0.0260
TrafficCarQuatY[22] = 0.0126
TrafficCarQuatZ[22] = 0.4342
TrafficCarQuatW[22] = 0.9003
TrafficCarRecording[22] = 72
TrafficCarStartime[22] = 22500.0000
TrafficCarModel[22] = manana
TrafficCarPos[23] = <<-1650.5247, -560.7370, 33.0326>>
TrafficCarQuatX[23] = 0.0204
TrafficCarQuatY[23] = -0.0131
TrafficCarQuatZ[23] = 0.8283
TrafficCarQuatW[23] = 0.5597
TrafficCarRecording[23] = 51
TrafficCarStartime[23] = 22584.0000
TrafficCarModel[23] = manana
TrafficCarPos[24] = <<-1626.8370, -568.3124, 33.0075>>
TrafficCarQuatX[24] = 0.0218
TrafficCarQuatY[24] = 0.0175
TrafficCarQuatZ[24] = -0.4180
TrafficCarQuatW[24] = 0.9080
TrafficCarRecording[24] = 34
TrafficCarStartime[24] = 25000.0000
TrafficCarModel[24] = manana
TrafficCarPos[25] = <<-1553.5674, -492.1296, 35.1499>>
TrafficCarQuatX[25] = -0.0086
TrafficCarQuatY[25] = -0.0063
TrafficCarQuatZ[25] = 0.8700
TrafficCarQuatW[25] = 0.4929
TrafficCarRecording[25] = 49
TrafficCarStartime[25] = 25050.0000
TrafficCarModel[25] = manana
TrafficCarPos[26] = <<-1566.8817, -512.4595, 35.1885>>
TrafficCarQuatX[26] = 0.0010
TrafficCarQuatY[26] = -0.0090
TrafficCarQuatZ[26] = -0.4840
TrafficCarQuatW[26] = 0.8750
TrafficCarRecording[26] = 57
TrafficCarStartime[26] = 27000.0000
TrafficCarModel[26] = pcj
TrafficCarPos[27] = <<-1405.6613, -398.7107, 36.1960>>
TrafficCarQuatX[27] = -0.0010
TrafficCarQuatY[27] = -0.0172
TrafficCarQuatZ[27] = 0.8676
TrafficCarQuatW[27] = 0.4969
TrafficCarRecording[27] = 79
TrafficCarStartime[27] = 28900.0000
TrafficCarModel[27] = intruder
/*TrafficCarPos[28] = <<-1540.7920, -502.6374, 35.3152>>
TrafficCarQuatX[28] = 0.0080
TrafficCarQuatY[28] = 0.0105
TrafficCarQuatZ[28] = -0.5651
TrafficCarQuatW[28] = 0.8249
TrafficCarRecording[28] = 59
TrafficCarStartime[28] = 29003.0000
TrafficCarModel[28] = pcj*/
TrafficCarPos[29] = <<-1385.9791, -406.3781, 36.1497>>
TrafficCarQuatX[29] = 0.0030
TrafficCarQuatY[29] = 0.0057
TrafficCarQuatZ[29] = -0.4769
TrafficCarQuatW[29] = 0.8789
TrafficCarRecording[29] = 256
TrafficCarStartime[29] = 30000.0000
TrafficCarModel[29] = manana
TrafficCarPos[30] = <<-1511.8464, -486.1111, 35.2985>>
TrafficCarQuatX[30] = 0.0015
TrafficCarQuatY[30] = 0.0010
TrafficCarQuatZ[30] = -0.4916
TrafficCarQuatW[30] = 0.8708
TrafficCarRecording[30] = 61
TrafficCarStartime[30] = 30912.0000
TrafficCarModel[30] = intruder
TrafficCarPos[31] = <<-1503.2793, -453.5208, 35.1137>>
TrafficCarQuatX[31] = 0.0005
TrafficCarQuatY[31] = 0.0009
TrafficCarQuatZ[31] = 0.8742
TrafficCarQuatW[31] = 0.4855
TrafficCarRecording[31] = 62
TrafficCarStartime[31] = 30962.0000
TrafficCarModel[31] = intruder
TrafficCarPos[32] = <<-1441.9612, -436.8392, 35.3180>>
TrafficCarQuatX[32] = 0.0051
TrafficCarQuatY[32] = -0.0027
TrafficCarQuatZ[32] = -0.4849
TrafficCarQuatW[32] = 0.8746
TrafficCarRecording[32] = 60
TrafficCarStartime[32] = 31000.0000
TrafficCarModel[32] = manana
TrafficCarPos[33] = <<-1429.4720, -475.7137, 33.7061>>
TrafficCarQuatX[33] = 0.0134
TrafficCarQuatY[33] = 0.0239
TrafficCarQuatZ[33] = 0.2968
TrafficCarQuatW[33] = 0.9545
TrafficCarRecording[33] = 56
TrafficCarStartime[33] = 31050.0000
TrafficCarModel[33] = intruder
//2047053 - There's a chance this car collides with another one on creation.
/*TrafficCarPos[34] = <<-1288.1838, -331.0012, 36.3186>>
TrafficCarQuatX[34] = -0.0073
TrafficCarQuatY[34] = -0.0118
TrafficCarQuatZ[34] = 0.8727
TrafficCarQuatW[34] = 0.4880
TrafficCarRecording[34] = 122
TrafficCarStartime[34] = 32000.0000
TrafficCarModel[34] = intruder*/
TrafficCarPos[35] = <<-1280.4327, -384.1887, 36.0295>>
TrafficCarQuatX[35] = 0.0126
TrafficCarQuatY[35] = 0.0032
TrafficCarQuatZ[35] = 0.2431
TrafficCarQuatW[35] = 0.9699
TrafficCarRecording[35] = 257
TrafficCarStartime[35] = 33000.0000
TrafficCarModel[35] = manana
TrafficCarPos[36] = <<-1343.5938, -355.1015, 36.2497>>
TrafficCarQuatX[36] = -0.0052
TrafficCarQuatY[36] = -0.0032
TrafficCarQuatZ[36] = 0.8108
TrafficCarQuatW[36] = 0.5852
TrafficCarRecording[36] = 69
TrafficCarStartime[36] = 33994.0000
TrafficCarModel[36] = manana
TrafficCarPos[37] = <<-1216.5325, -307.8270, 37.3348>>
TrafficCarQuatX[37] = -0.0036
TrafficCarQuatY[37] = 0.0027
TrafficCarQuatZ[37] = -0.5369
TrafficCarQuatW[37] = 0.8436
TrafficCarRecording[37] = 65
TrafficCarStartime[37] = 35000.0000
TrafficCarModel[37] = manana
TrafficCarPos[38] = <<-1105.8495, -222.9649, 37.3392>>
TrafficCarQuatX[38] = -0.0060
TrafficCarQuatY[38] = 0.0021
TrafficCarQuatZ[38] = 0.8546
TrafficCarQuatW[38] = 0.5192
TrafficCarRecording[38] = 258
TrafficCarStartime[38] = 36000.0000
TrafficCarModel[38] = manana
TrafficCarPos[39] = <<-1080.2947, -214.4883, 37.4765>>
TrafficCarQuatX[39] = -0.0017
TrafficCarQuatY[39] = -0.0037
TrafficCarQuatZ[39] = 0.8656
TrafficCarQuatW[39] = 0.5006
TrafficCarRecording[39] = 259
TrafficCarStartime[39] = 36100.0000
TrafficCarModel[39] = intruder
TrafficCarPos[40] = <<-1193.5811, -297.1006, 37.7095>>
TrafficCarQuatX[40] = -0.0010
TrafficCarQuatY[40] = 0.0003
TrafficCarQuatZ[40] = -0.5278
TrafficCarQuatW[40] = 0.8494
TrafficCarRecording[40] = 260
TrafficCarStartime[40] = 36200.0000
TrafficCarModel[40] = Burrito3
TrafficCarPos[41] = <<-1020.4266, -177.1401, 37.4026>>
TrafficCarQuatX[41] = -0.0125
TrafficCarQuatY[41] = 0.0031
TrafficCarQuatZ[41] = 0.8613
TrafficCarQuatW[41] = 0.5079
TrafficCarRecording[41] = 261
TrafficCarStartime[41] = 36300.0000
TrafficCarModel[41] = intruder
TrafficCarPos[42] = <<-1267.4415, -336.0135, 36.4325>>
TrafficCarQuatX[42] = -0.0032
TrafficCarQuatY[42] = -0.0065
TrafficCarQuatZ[42] = -0.5100
TrafficCarQuatW[42] = 0.8602
TrafficCarRecording[42] = 70
TrafficCarStartime[42] = 37000.0000
TrafficCarModel[42] = intruder
/*TrafficCarPos[43] = <<-1325.1547, -349.2796, 36.0825>>
TrafficCarQuatX[43] = 0.0059
TrafficCarQuatY[43] = 0.0067
TrafficCarQuatZ[43] = 0.7667
TrafficCarQuatW[43] = 0.6419
TrafficCarRecording[43] = 71
TrafficCarStartime[43] = 37056.0000
TrafficCarModel[43] = intruder*/
TrafficCarPos[44] = <<-1272.1207, -343.9194, 36.2108>>
TrafficCarQuatX[44] = 0.0064
TrafficCarQuatY[44] = -0.0040
TrafficCarQuatZ[44] = -0.5243
TrafficCarQuatW[44] = 0.8515
TrafficCarRecording[44] = 75
TrafficCarStartime[44] = 37140.0000
TrafficCarModel[44] = intruder
TrafficCarPos[45] = <<-1031.8419, -289.7789, 37.6673>>
TrafficCarQuatX[45] = -0.0070
TrafficCarQuatY[45] = -0.0007
TrafficCarQuatZ[45] = 0.2092
TrafficCarQuatW[45] = 0.9778
TrafficCarRecording[45] = 85
TrafficCarStartime[45] = 37200.0000
TrafficCarModel[45] = Burrito3
/*TrafficCarPos[46] = <<-1233.9241, -302.6840, 37.1774>>
TrafficCarQuatX[46] = -0.0099
TrafficCarQuatY[46] = -0.0010
TrafficCarQuatZ[46] = 0.9191
TrafficCarQuatW[46] = 0.3939
TrafficCarRecording[46] = 76
TrafficCarStartime[46] = 37256.0000
TrafficCarModel[46] = manana*/
/*TrafficCarPos[47] = <<-1218.5978, -293.2798, 36.9743>>
TrafficCarQuatX[47] = -0.0009
TrafficCarQuatY[47] = -0.0013
TrafficCarQuatZ[47] = 0.8495
TrafficCarQuatW[47] = 0.5276
TrafficCarRecording[47] = 78
TrafficCarStartime[47] = 37422.0000
TrafficCarModel[47] = intruder*/
TrafficCarPos[48] = <<-1284.5294, -330.2454, 36.3752>>
TrafficCarQuatX[48] = -0.0032
TrafficCarQuatY[48] = -0.0043
TrafficCarQuatZ[48] = 0.8520
TrafficCarQuatW[48] = 0.5235
TrafficCarRecording[48] = 201
TrafficCarStartime[48] = 37950.0000
TrafficCarModel[48] = intruder
TrafficCarPos[49] = <<-961.5755, -200.8471, 37.1363>>
TrafficCarQuatX[49] = -0.0379
TrafficCarQuatY[49] = 0.0200
TrafficCarQuatZ[49] = 0.8755
TrafficCarQuatW[49] = 0.4814
TrafficCarRecording[49] = 262
TrafficCarStartime[49] = 39000.0000
TrafficCarModel[49] = intruder
TrafficCarPos[50] = <<-1030.5999, -250.9640, 37.2496>>
TrafficCarQuatX[50] = 0.0131
TrafficCarQuatY[50] = 0.0248
TrafficCarQuatZ[50] = -0.5153
TrafficCarQuatW[50] = 0.8565
TrafficCarRecording[50] = 263
TrafficCarStartime[50] = 39050.0000
TrafficCarModel[50] = manana
TrafficCarPos[51] = <<-1212.0898, -293.2291, 37.3428>>
TrafficCarQuatX[51] = 0.0037
TrafficCarQuatY[51] = 0.0035
TrafficCarQuatZ[51] = 0.8554
TrafficCarQuatW[51] = 0.5179
TrafficCarRecording[51] = 202
TrafficCarStartime[51] = 39600.0000
TrafficCarModel[51] = manana
TrafficCarPos[52] = <<-1045.8507, -276.7056, 37.2715>>
TrafficCarQuatX[52] = -0.0005
TrafficCarQuatY[52] = 0.0000
TrafficCarQuatZ[52] = 0.9753
TrafficCarQuatW[52] = -0.2209
TrafficCarRecording[52] = 73
TrafficCarStartime[52] = 40000.0000
TrafficCarModel[52] = manana
TrafficCarPos[53] = <<-1018.1578, -236.3702, 37.3773>>
TrafficCarQuatX[53] = 0.0028
TrafficCarQuatY[53] = -0.0089
TrafficCarQuatZ[53] = 0.8524
TrafficCarQuatW[53] = 0.5227
TrafficCarRecording[53] = 94
TrafficCarStartime[53] = 40200.0000
TrafficCarModel[53] = intruder
TrafficCarPos[54] = <<-992.8951, -381.1576, 37.3940>>
TrafficCarQuatX[54] = 0.0005
TrafficCarQuatY[54] = -0.0092
TrafficCarQuatZ[54] = 0.9712
TrafficCarQuatW[54] = -0.2382
TrafficCarRecording[54] = 170
TrafficCarStartime[54] = 42500.0000
TrafficCarModel[54] = manana
TrafficCarPos[55] = <<-943.2020, -420.0762, 37.3229>>
TrafficCarQuatX[55] = -0.0044
TrafficCarQuatY[55] = 0.0127
TrafficCarQuatZ[55] = 0.8549
TrafficCarQuatW[55] = 0.5186
TrafficCarRecording[55] = 264
TrafficCarStartime[55] = 43000.0000
TrafficCarModel[55] = intruder
TrafficCarPos[56] = <<-973.2485, -426.7131, 37.4479>>
TrafficCarQuatX[56] = -0.0159
TrafficCarQuatY[56] = -0.0064
TrafficCarQuatZ[56] = 0.9638
TrafficCarQuatW[56] = -0.2662
TrafficCarRecording[56] = 265
TrafficCarStartime[56] = 43200.0000
TrafficCarModel[56] = intruder
TrafficCarPos[57] = <<-1003.6150, -333.3123, 36.9974>>
TrafficCarQuatX[57] = 0.0000
TrafficCarQuatY[57] = 0.0000
TrafficCarQuatZ[57] = 0.2417
TrafficCarQuatW[57] = 0.9703
TrafficCarRecording[57] = 86
TrafficCarStartime[57] = 43753.0000
TrafficCarModel[57] = intruder
TrafficCarPos[58] = <<-910.7939, -480.5219, 36.1598>>
TrafficCarQuatX[58] = -0.0004
TrafficCarQuatY[58] = -0.0009
TrafficCarQuatZ[58] = 0.8607
TrafficCarQuatW[58] = 0.5090
TrafficCarRecording[58] = 266
TrafficCarStartime[58] = 44000.0000
TrafficCarModel[58] = manana
TrafficCarPos[59] = <<-903.4105, -534.6552, 34.3315>>
TrafficCarQuatX[59] = 0.0250
TrafficCarQuatY[59] = 0.0193
TrafficCarQuatZ[59] = 0.2328
TrafficCarQuatW[59] = 0.9720
TrafficCarRecording[59] = 267
TrafficCarStartime[59] = 44200.0000
TrafficCarModel[59] = manana
TrafficCarPos[60] = <<-1001.2458, -349.7690, 37.5263>>
TrafficCarQuatX[60] = -0.0195
TrafficCarQuatY[60] = -0.0038
TrafficCarQuatZ[60] = 0.2914
TrafficCarQuatW[60] = 0.9564
TrafficCarRecording[60] = 89
TrafficCarStartime[60] = 45271.0000
TrafficCarModel[60] = intruder
TrafficCarPos[61] = <<-944.2744, -457.4497, 37.0746>>
TrafficCarQuatX[61] = 0.0051
TrafficCarQuatY[61] = -0.0062
TrafficCarQuatZ[61] = 0.2376
TrafficCarQuatW[61] = 0.9713
TrafficCarRecording[61] = 90
TrafficCarStartime[61] = 46500.0000
TrafficCarModel[61] = intruder
TrafficCarPos[62] = <<-1066.3922, -457.1241, 36.0125>>
TrafficCarQuatX[62] = -0.0210
TrafficCarQuatY[62] = -0.0058
TrafficCarQuatZ[62] = 0.8835
TrafficCarQuatW[62] = -0.4680
TrafficCarRecording[62] = 108
TrafficCarStartime[62] = 47600.0000
TrafficCarModel[62] = manana
SET_TRAFFIC_CAR_SWITCH_TO_AI_EARLY(62, FALSE)
TrafficCarPos[63] = <<-1372.2000, -703.8073, 23.8866>>
TrafficCarQuatX[63] = 0.0254
TrafficCarQuatY[63] = 0.0194
TrafficCarQuatZ[63] = -0.4350
TrafficCarQuatW[63] = 0.8999
TrafficCarRecording[63] = 95
TrafficCarStartime[63] = 52500.0000
TrafficCarModel[63] = manana
TrafficCarPos[64] = <<-1359.6655, -694.3884, 24.9078>>
TrafficCarQuatX[64] = 0.0261
TrafficCarQuatY[64] = 0.0166
TrafficCarQuatZ[64] = -0.4655
TrafficCarQuatW[64] = 0.8845
TrafficCarRecording[64] = 13
TrafficCarStartime[64] = 54500.0000
TrafficCarModel[64] = pcj
TrafficCarPos[65] = <<-1251.4202, -580.7559, 27.7332>>
TrafficCarQuatX[65] = 0.0033
TrafficCarQuatY[65] = -0.0427
TrafficCarQuatZ[65] = 0.9369
TrafficCarQuatW[65] = -0.3470
TrafficCarRecording[65] = 93
TrafficCarStartime[65] = 55000.0000
TrafficCarModel[65] = intruder
TrafficCarPos[66] = <<-1186.8662, -629.9144, 23.4611>>
TrafficCarQuatX[66] = 0.0371
TrafficCarQuatY[66] = 0.0124
TrafficCarQuatZ[66] = 0.3335
TrafficCarQuatW[66] = 0.9420
TrafficCarRecording[66] = 268
TrafficCarStartime[66] = 55050.0000
TrafficCarModel[66] = manana
TrafficCarPos[67] = <<-1104.0922, -750.3582, 18.9453>>
TrafficCarQuatX[67] = -0.0083
TrafficCarQuatY[67] = -0.0215
TrafficCarQuatZ[67] = 0.9362
TrafficCarQuatW[67] = -0.3506
TrafficCarRecording[67] = 115
TrafficCarStartime[67] = 66000.0000
TrafficCarModel[67] = manana
TrafficCarPos[68] = <<-1100.6582, -748.1008, 19.0332>>
TrafficCarQuatX[68] = 0.0156
TrafficCarQuatY[68] = -0.0216
TrafficCarQuatZ[68] = 0.9336
TrafficCarQuatW[68] = -0.3572
TrafficCarRecording[68] = 116
TrafficCarStartime[68] = 66050.0000
TrafficCarModel[68] = pcj
TrafficCarPos[69] = <<-1109.1354, -719.9675, 19.9357>>
TrafficCarQuatX[69] = 0.0113
TrafficCarQuatY[69] = -0.0008
TrafficCarQuatZ[69] = 0.3447
TrafficCarQuatW[69] = 0.9386
TrafficCarRecording[69] = 154
TrafficCarStartime[69] = 66100.0000
TrafficCarModel[69] = intruder
TrafficCarPos[70] = <<-1161.2339, -685.1978, 21.6411>>
TrafficCarQuatX[70] = -0.0033
TrafficCarQuatY[70] = -0.0261
TrafficCarQuatZ[70] = 0.9396
TrafficCarQuatW[70] = -0.3413
TrafficCarRecording[70] = 156
TrafficCarStartime[70] = 66500.0000
TrafficCarModel[70] = intruder
TrafficCarPos[71] = <<-1094.9194, -761.5510, 18.9358>>
TrafficCarQuatX[71] = -0.0024
TrafficCarQuatY[71] = -0.0034
TrafficCarQuatZ[71] = 0.9406
TrafficCarQuatW[71] = -0.3395
TrafficCarRecording[71] = 272
TrafficCarStartime[71] = 69000.0000
TrafficCarModel[71] = intruder
TrafficCarPos[72] = <<-1085.7266, -737.9604, 18.5164>>
TrafficCarQuatX[72] = 0.0186
TrafficCarQuatY[72] = 0.0051
TrafficCarQuatZ[72] = 0.2729
TrafficCarQuatW[72] = 0.9619
TrafficCarRecording[72] = 101
TrafficCarStartime[72] = 69902.0000
TrafficCarModel[72] = intruder
TrafficCarPos[73] = <<-1191.9774, -862.7239, 13.4924>>
TrafficCarQuatX[73] = 0.0167
TrafficCarQuatY[73] = -0.0078
TrafficCarQuatZ[73] = -0.4888
TrafficCarQuatW[73] = 0.8722
TrafficCarRecording[73] = 109
TrafficCarStartime[73] = 70000.0000
TrafficCarModel[73] = pcj
TrafficCarPos[74] = <<-1017.1104, -801.2603, 16.2402>>
TrafficCarQuatX[74] = 0.0237
TrafficCarQuatY[74] = -0.0005
TrafficCarQuatZ[74] = 0.5066
TrafficCarQuatW[74] = 0.8619
TrafficCarRecording[74] = 269
TrafficCarStartime[74] = 70050.0000
TrafficCarModel[74] = manana
TrafficCarPos[75] = <<-1042.9668, -723.3073, 19.0664>>
TrafficCarQuatX[75] = -0.0227
TrafficCarQuatY[75] = -0.0131
TrafficCarQuatZ[75] = 0.9117
TrafficCarQuatW[75] = 0.4101
TrafficCarRecording[75] = 270
TrafficCarStartime[75] = 70100.0000
TrafficCarModel[75] = manana
TrafficCarPos[76] = <<-986.2640, -811.2874, 15.3855>>
TrafficCarQuatX[76] = 0.0037
TrafficCarQuatY[76] = 0.0064
TrafficCarQuatZ[76] = 0.4970
TrafficCarQuatW[76] = 0.8677
TrafficCarRecording[76] = 271
TrafficCarStartime[76] = 70150.0000
TrafficCarModel[76] = manana
/*TrafficCarPos[77] = <<-1068.7451, -764.3805, 18.8507>>
TrafficCarQuatX[77] = 0.0089
TrafficCarQuatY[77] = -0.0077
TrafficCarQuatZ[77] = 0.2601
TrafficCarQuatW[77] = 0.9655
TrafficCarRecording[77] = 102
TrafficCarStartime[77] = 70200.0000
TrafficCarModel[77] = intruder*/
TrafficCarPos[78] = <<-1099.2067, -723.0576, 19.5426>>
TrafficCarQuatX[78] = 0.0172
TrafficCarQuatY[78] = 0.0138
TrafficCarQuatZ[78] = 0.2758
TrafficCarQuatW[78] = 0.9610
TrafficCarRecording[78] = 96
TrafficCarStartime[78] = 70242.0000
TrafficCarModel[78] = intruder
TrafficCarPos[79] = <<-1128.7385, -796.8690, 16.4235>>
TrafficCarQuatX[79] = -0.0331
TrafficCarQuatY[79] = -0.0425
TrafficCarQuatZ[79] = 0.9062
TrafficCarQuatW[79] = 0.4193
TrafficCarRecording[79] = 104
TrafficCarStartime[79] = 74000.0000
TrafficCarModel[79] = manana
TrafficCarPos[80] = <<-1155.6365, -834.2766, 13.8095>>
TrafficCarQuatX[80] = 0.0081
TrafficCarQuatY[80] = -0.0058
TrafficCarQuatZ[80] = -0.4207
TrafficCarQuatW[80] = 0.9071
TrafficCarRecording[80] = 105
TrafficCarStartime[80] = 74050.0000
TrafficCarModel[80] = manana
TrafficCarPos[81] = <<-1175.9929, -835.8189, 13.8260>>
TrafficCarQuatX[81] = -0.0051
TrafficCarQuatY[81] = 0.0066
TrafficCarQuatZ[81] = 0.9051
TrafficCarQuatW[81] = 0.4251
TrafficCarRecording[81] = 273
TrafficCarStartime[81] = 75000.0000
TrafficCarModel[81] = intruder
TrafficCarPos[82] = <<-1110.6803, -919.0346, 2.2867>>
TrafficCarQuatX[82] = -0.0002
TrafficCarQuatY[82] = -0.0064
TrafficCarQuatZ[82] = 0.8645
TrafficCarQuatW[82] = 0.5025
TrafficCarRecording[82] = 203
TrafficCarStartime[82] = 82357.0000
TrafficCarModel[82] = manana
TrafficCarPos[83] = <<-1014.4996, -1099.9009, 1.3071>>
TrafficCarQuatX[83] = -0.0089
TrafficCarQuatY[83] = -0.0024
TrafficCarQuatZ[83] = 0.2603
TrafficCarQuatW[83] = 0.9655
TrafficCarRecording[83] = 113
TrafficCarStartime[83] = 84818.0000
TrafficCarModel[83] = intruder
TrafficCarPos[84] = <<-989.3825, -1154.4706, 2.0856>>
TrafficCarQuatX[84] = -0.0107
TrafficCarQuatY[84] = 0.0386
TrafficCarQuatZ[84] = 0.9645
TrafficCarQuatW[84] = -0.2611
TrafficCarRecording[84] = 119
TrafficCarStartime[84] = 86732.0000
TrafficCarModel[84] = intruder
TrafficCarPos[85] = <<-925.1222, -1200.2721, 4.4888>>
TrafficCarQuatX[85] = 0.0002
TrafficCarQuatY[85] = 0.0000
TrafficCarQuatZ[85] = 0.8763
TrafficCarQuatW[85] = 0.4818
TrafficCarRecording[85] = 134
TrafficCarStartime[85] = 92700.0000
TrafficCarModel[85] = manana
TrafficCarPos[86] = <<-983.4543, -1252.4944, 5.2503>>
TrafficCarQuatX[86] = -0.0040
TrafficCarQuatY[86] = 0.0161
TrafficCarQuatZ[86] = -0.5021
TrafficCarQuatW[86] = 0.8646
TrafficCarRecording[86] = 274
TrafficCarStartime[86] = 93000.0000
TrafficCarModel[86] = intruder
TrafficCarPos[87] = <<-849.5126, -1152.5116, 6.0559>>
TrafficCarQuatX[87] = -0.0229
TrafficCarQuatY[87] = -0.0190
TrafficCarQuatZ[87] = 0.7997
TrafficCarQuatW[87] = 0.5997
TrafficCarRecording[87] = 130
TrafficCarStartime[87] = 95518.0000
TrafficCarModel[87] = manana
TrafficCarPos[88] = <<-848.8896, -1205.2084, 5.6769>>
TrafficCarQuatX[88] = -0.0236
TrafficCarQuatY[88] = -0.0291
TrafficCarQuatZ[88] = 0.2576
TrafficCarQuatW[88] = 0.9655
TrafficCarRecording[88] = 126
TrafficCarStartime[88] = 97000.0000
TrafficCarModel[88] = intruder
TrafficCarPos[89] = <<-873.4331, -1135.9908, 6.2755>>
TrafficCarQuatX[89] = 0.0124
TrafficCarQuatY[89] = -0.0485
TrafficCarQuatZ[89] = 0.9657
TrafficCarQuatW[89] = -0.2547
TrafficCarRecording[89] = 125
TrafficCarStartime[89] = 97050.0000
TrafficCarModel[89] = manana
/*TrafficCarPos[90] = <<-801.6751, -1063.4163, 11.5952>>
TrafficCarQuatX[90] = 0.0146
TrafficCarQuatY[90] = -0.0269
TrafficCarQuatZ[90] = 0.9700
TrafficCarQuatW[90] = -0.2412
TrafficCarRecording[90] = 18
TrafficCarStartime[90] = 99500.0000
TrafficCarModel[90] = intruder*/
TrafficCarPos[91] = <<-667.5715, -873.9283, 41.4232>>
TrafficCarQuatX[91] = 0.0242
TrafficCarQuatY[91] = -0.0155
TrafficCarQuatZ[91] = -0.6235
TrafficCarQuatW[91] = 0.7813
TrafficCarRecording[91] = 25
TrafficCarStartime[91] = 104000.0000
TrafficCarModel[91] = maverick
TrafficCarPos[92] = <<-668.2998, -1048.5413, 16.3267>>
TrafficCarQuatX[92] = 0.0058
TrafficCarQuatY[92] = -0.0334
TrafficCarQuatZ[92] = 0.8869
TrafficCarQuatW[92] = 0.4606
TrafficCarRecording[92] = 26
TrafficCarStartime[92] = 104500.0000
TrafficCarModel[92] = intruder
TrafficCarPos[93] = <<-646.0926, -913.8471, 23.5267>>
TrafficCarQuatX[93] = -0.0178
TrafficCarQuatY[93] = -0.0373
TrafficCarQuatZ[93] = 0.9990
TrafficCarQuatW[93] = 0.0153
TrafficCarRecording[93] = 136
TrafficCarStartime[93] = 106500.0000
TrafficCarModel[93] = intruder
TrafficCarPos[94] = <<-636.0123, -980.1482, 20.8531>>
TrafficCarQuatX[94] = 0.0095
TrafficCarQuatY[94] = -0.0064
TrafficCarQuatZ[94] = -0.0199
TrafficCarQuatW[94] = 0.9997
TrafficCarRecording[94] = 276
TrafficCarStartime[94] = 107000.0000
TrafficCarModel[94] = manana
TrafficCarPos[95] = <<-679.2947, -959.8151, 20.1611>>
TrafficCarQuatX[95] = 0.0390
TrafficCarQuatY[95] = 0.0031
TrafficCarQuatZ[95] = -0.7025
TrafficCarQuatW[95] = 0.7106
TrafficCarRecording[95] = 277
TrafficCarStartime[95] = 108000.0000
TrafficCarModel[95] = manana
TrafficCarPos[96] = <<-645.9667, -872.5993, 24.0909>>
TrafficCarQuatX[96] = -0.0308
TrafficCarQuatY[96] = 0.0030
TrafficCarQuatZ[96] = 0.9995
TrafficCarQuatW[96] = -0.0065
TrafficCarRecording[96] = 278
TrafficCarStartime[96] = 108050.0000
TrafficCarModel[96] = manana
TrafficCarPos[97] = <<-532.2497, -1015.1015, 22.4589>>
TrafficCarQuatX[97] = 0.0006
TrafficCarQuatY[97] = 0.0229
TrafficCarQuatZ[97] = 0.0582
TrafficCarQuatW[97] = 0.9980
TrafficCarRecording[97] = 279
TrafficCarStartime[97] = 112000.0000
TrafficCarModel[97] = manana
TrafficCarPos[98] = <<-492.1226, -871.4891, 29.2373>>
TrafficCarQuatX[98] = 0.0305
TrafficCarQuatY[98] = -0.0002
TrafficCarQuatZ[98] = -0.0364
TrafficCarQuatW[98] = 0.9989
TrafficCarRecording[98] = 152
TrafficCarStartime[98] = 114001.0000
TrafficCarModel[98] = manana
TrafficCarPos[99] = <<-477.2830, -845.0166, 29.9852>>
TrafficCarQuatX[99] = -0.0032
TrafficCarQuatY[99] = -0.0105
TrafficCarQuatZ[99] = 0.7135
TrafficCarQuatW[99] = -0.7006
TrafficCarRecording[99] = 148
TrafficCarStartime[99] = 116000.0000
TrafficCarModel[99] = intruder
TrafficCarPos[100] = <<-517.6269, -758.5123, 31.4468>>
TrafficCarQuatX[100] = -0.0165
TrafficCarQuatY[100] = -0.0260
TrafficCarQuatZ[100] = 0.9731
TrafficCarQuatW[100] = -0.2283
TrafficCarRecording[100] = 280
TrafficCarStartime[100] = 117000.0000
TrafficCarModel[100] = manana
TrafficCarPos[101] = <<-496.5247, -816.1506, 30.0963>>
TrafficCarQuatX[101] = -0.0035
TrafficCarQuatY[101] = -0.0011
TrafficCarQuatZ[101] = -0.0339
TrafficCarQuatW[101] = 0.9994
TrafficCarRecording[101] = 281
TrafficCarStartime[101] = 117050.0000
TrafficCarModel[101] = intruder
TrafficCarPos[102] = <<-502.5592, -804.7895, 30.2477>>
TrafficCarQuatX[102] = 0.0037
TrafficCarQuatY[102] = -0.0047
TrafficCarQuatZ[102] = 0.9996
TrafficCarQuatW[102] = -0.0291
TrafficCarRecording[102] = 157
TrafficCarStartime[102] = 118845.0000
TrafficCarModel[102] = intruder
TrafficCarPos[103] = <<-367.6438, -834.8538, 31.2414>>
TrafficCarQuatX[103] = -0.0128
TrafficCarQuatY[103] = 0.0035
TrafficCarQuatZ[103] = 0.6848
TrafficCarQuatW[103] = 0.7286
TrafficCarRecording[103] = 158
TrafficCarStartime[103] = 119000.0000
TrafficCarModel[103] = pcj
TrafficCarPos[104] = <<-286.6659, -846.1884, 31.3065>>
TrafficCarQuatX[104] = -0.0127
TrafficCarQuatY[104] = -0.0018
TrafficCarQuatZ[104] = 0.6461
TrafficCarQuatW[104] = 0.7631
TrafficCarRecording[104] = 282
TrafficCarStartime[104] = 120000.0000
TrafficCarModel[104] = intruder
TrafficCarPos[105] = <<-233.8871, -869.6703, 29.9880>>
TrafficCarQuatX[105] = 0.0115
TrafficCarQuatY[105] = 0.0067
TrafficCarQuatZ[105] = 0.5974
TrafficCarQuatW[105] = 0.8018
TrafficCarRecording[105] = 283
TrafficCarStartime[105] = 120050.0000
TrafficCarModel[105] = intruder
TrafficCarPos[106] = <<-507.5561, -826.8052, 29.6210>>
TrafficCarQuatX[106] = 0.0000
TrafficCarQuatY[106] = -0.0021
TrafficCarQuatZ[106] = 1.0000
TrafficCarQuatW[106] = 0.0026
TrafficCarRecording[106] = 155
TrafficCarStartime[106] = 120449.0000
TrafficCarModel[106] = intruder
TrafficCarPos[107] = <<-387.6420, -844.1628, 31.0928>>
TrafficCarQuatX[107] = -0.0048
TrafficCarQuatY[107] = 0.0048
TrafficCarQuatZ[107] = 0.7350
TrafficCarQuatW[107] = -0.6781
TrafficCarRecording[107] = 205
TrafficCarStartime[107] = 123701.0000
TrafficCarModel[107] = manana
TrafficCarPos[108] = <<-332.0064, -860.2901, 31.1178>>
TrafficCarQuatX[108] = -0.0038
TrafficCarQuatY[108] = 0.0044
TrafficCarQuatZ[108] = 0.7627
TrafficCarQuatW[108] = -0.6467
TrafficCarRecording[108] = 206
TrafficCarStartime[108] = 124493.0000
TrafficCarModel[108] = manana
TrafficCarPos[109] = <<-316.7719, -857.1534, 31.1568>>
TrafficCarQuatX[109] = -0.0030
TrafficCarQuatY[109] = 0.0034
TrafficCarQuatZ[109] = 0.7628
TrafficCarQuatW[109] = -0.6466
TrafficCarRecording[109] = 207
TrafficCarStartime[109] = 124955.0000
TrafficCarModel[109] = manana
TrafficCarPos[110] = <<-369.8260, -661.4047, 31.1689>>
TrafficCarQuatX[110] = 0.0061
TrafficCarQuatY[110] = -0.0061
TrafficCarQuatZ[110] = -0.7071
TrafficCarQuatW[110] = 0.7071
TrafficCarRecording[110] = 166
TrafficCarStartime[110] = 130000.0000
TrafficCarModel[110] = intruder
TrafficCarPos[111] = <<-248.7058, -603.2553, 33.5757>>
TrafficCarQuatX[111] = -0.0274
TrafficCarQuatY[111] = -0.0092
TrafficCarQuatZ[111] = 0.9839
TrafficCarQuatW[111] = 0.1762
TrafficCarRecording[111] = 285
TrafficCarStartime[111] = 130050.0000
TrafficCarModel[111] = intruder
TrafficCarPos[112] = <<-247.1978, -612.5249, 33.4505>>
TrafficCarQuatX[112] = -0.0124
TrafficCarQuatY[112] = -0.0091
TrafficCarQuatZ[112] = 0.9849
TrafficCarQuatW[112] = 0.1726
TrafficCarRecording[112] = 286
TrafficCarStartime[112] = 130100.0000
TrafficCarModel[112] = manana
TrafficCarPos[113] = <<-243.4324, -620.5720, 33.7070>>
TrafficCarQuatX[113] = -0.0019
TrafficCarQuatY[113] = -0.0092
TrafficCarQuatZ[113] = 0.9875
TrafficCarQuatW[113] = 0.1574
TrafficCarRecording[113] = 287
TrafficCarStartime[113] = 130150.0000
TrafficCarModel[113] = Burrito3
TrafficCarPos[114] = <<-277.3765, -654.3015, 32.7939>>
TrafficCarQuatX[114] = -0.0041
TrafficCarQuatY[114] = 0.0062
TrafficCarQuatZ[114] = 0.6547
TrafficCarQuatW[114] = 0.7558
TrafficCarRecording[114] = 208
TrafficCarStartime[114] = 133831.0000
TrafficCarModel[114] = intruder
TrafficCarPos[115] = <<-226.6089, -599.4540, 33.7347>>
TrafficCarQuatX[115] = 0.0071
TrafficCarQuatY[115] = -0.0012
TrafficCarQuatZ[115] = -0.1741
TrafficCarQuatW[115] = 0.9847
TrafficCarRecording[115] = 164
TrafficCarStartime[115] = 137506.0000
TrafficCarModel[115] = intruder
//Set-piece cars
//Used to be traffic 0
SetPieceCarPos[0] = <<-1829.1702, -579.5376, 10.9467>>
SetPieceCarQuatX[0] = -0.0059
SetPieceCarQuatY[0] = -0.0026
SetPieceCarQuatZ[0] = 0.4222
SetPieceCarQuatW[0] = 0.9065
SetPieceCarRecording[0] = 38
SetPieceCarStartime[0] = 0.0000
SetPieceCarRecordingSpeed[0] = 1.0000
SetPieceCarModel[0] = manana
SetPieceCarPos[1] = <<-1940.0116, -473.7903, 11.9182>>
SetPieceCarQuatX[1] = -0.0040
SetPieceCarQuatY[1] = 0.0114
SetPieceCarQuatZ[1] = 0.4266
SetPieceCarQuatW[1] = 0.9043
SetPieceCarRecording[1] = 516
SetPieceCarStartime[1] = 1500.0000
SetPieceCarRecordingSpeed[1] = 1.0000
SetPieceCarModel[1] = flatbed
SetPieceCarPos[2] = <<-1893.9094, -519.8182, 11.2157>>
SetPieceCarQuatX[2] = 0.0010
SetPieceCarQuatY[2] = 0.0005
SetPieceCarQuatZ[2] = 0.4314
SetPieceCarQuatW[2] = 0.9022
SetPieceCarRecording[2] = 52
SetPieceCarStartime[2] = 2000.0000
SetPieceCarRecordingSpeed[2] = 1.0000
SetPieceCarModel[2] = youga
SetPieceCarPos[3] = <<-1875.3740, -542.2328, 11.2263>>
SetPieceCarQuatX[3] = -0.0070
SetPieceCarQuatY[3] = -0.0033
SetPieceCarQuatZ[3] = 0.4363
SetPieceCarQuatW[3] = 0.8998
SetPieceCarRecording[3] = 45
SetPieceCarStartime[3] = 3000.0000
SetPieceCarRecordingSpeed[3] = 1.0000
SetPieceCarModel[3] = manana
SetPieceCarPos[4] = <<-1732.9817, -524.2459, 37.3373>>
SetPieceCarQuatX[4] = 0.0203
SetPieceCarQuatY[4] = -0.0250
SetPieceCarQuatZ[4] = 0.9005
SetPieceCarQuatW[4] = -0.4336
SetPieceCarRecording[4] = 501
SetPieceCarStartime[4] = 19000.0000
SetPieceCarRecordingSpeed[4] = 1.0000
SetPieceCarModel[4] = intruder
SetPieceCarPos[5] = <<-1568.3964, -522.3314, 34.8755>>
SetPieceCarQuatX[5] = -0.0010
SetPieceCarQuatY[5] = 0.0003
SetPieceCarQuatZ[5] = -0.4567
SetPieceCarQuatW[5] = 0.8896
SetPieceCarRecording[5] = 54
SetPieceCarStartime[5] = 27947.0000
SetPieceCarRecordingSpeed[5] = 1.0000
SetPieceCarModel[5] = intruder
SetPieceCarPos[6] = <<-1405.9943, -412.4767, 36.0144>>
SetPieceCarQuatX[6] = -0.0127
SetPieceCarQuatY[6] = 0.0028
SetPieceCarQuatZ[6] = -0.4831
SetPieceCarQuatW[6] = 0.8754
SetPieceCarRecording[6] = 509
SetPieceCarStartime[6] = 28000.0000
SetPieceCarRecordingSpeed[6] = 1.0000
SetPieceCarModel[6] = manana
SetPieceCarPos[7] = <<-1518.7917, -386.8024, 41.1265>>
SetPieceCarQuatX[7] = 0.0254
SetPieceCarQuatY[7] = -0.0525
SetPieceCarQuatZ[7] = 0.9088
SetPieceCarQuatW[7] = -0.4131
SetPieceCarRecording[7] = 23
SetPieceCarStartime[7] = 29000.0000
SetPieceCarRecordingSpeed[7] = 1.0000
SetPieceCarModel[7] = intruder
SetPieceCarPos[8] = <<-1350.0201, -427.0193, 34.9505>>
SetPieceCarQuatX[8] = 0.0377
SetPieceCarQuatY[8] = 0.0064
SetPieceCarQuatZ[8] = 0.3218
SetPieceCarQuatW[8] = 0.9460
SetPieceCarRecording[8] = 510
SetPieceCarStartime[8] = 31000.0000
SetPieceCarRecordingSpeed[8] = 1.0000
SetPieceCarModel[8] = intruder
SetPieceCarPos[9] = <<-1007.4637, -361.0907, 37.5214>>
SetPieceCarQuatX[9] = -0.0193
SetPieceCarQuatY[9] = 0.0110
SetPieceCarQuatZ[9] = 0.9759
SetPieceCarQuatW[9] = -0.2173
SetPieceCarRecording[9] = 503
SetPieceCarStartime[9] = 43500.0000
SetPieceCarRecordingSpeed[9] = 1.0000
SetPieceCarModel[9] = cruiser
SetPieceCarPos[10] = <<-1007.2927, -357.3345, 37.5357>>
SetPieceCarQuatX[10] = -0.0075
SetPieceCarQuatY[10] = 0.0251
SetPieceCarQuatZ[10] = 0.9720
SetPieceCarQuatW[10] = -0.2335
SetPieceCarRecording[10] = 502
SetPieceCarStartime[10] = 44000.0000
SetPieceCarRecordingSpeed[10] = 1.0000
SetPieceCarModel[10] = cruiser
SetPieceCarPos[11] = <<-1010.9365, -358.4532, 37.5252>>
SetPieceCarQuatX[11] = -0.0052
SetPieceCarQuatY[11] = 0.0138
SetPieceCarQuatZ[11] = 0.9724
SetPieceCarQuatW[11] = -0.2330
SetPieceCarRecording[11] = 504
SetPieceCarStartime[11] = 44100.0000
SetPieceCarRecordingSpeed[11] = 1.0000
SetPieceCarModel[11] = cruiser
SetPieceCarPos[12] = <<-1013.8927, -392.8538, 36.0627>>
SetPieceCarQuatX[12] = 0.0589
SetPieceCarQuatY[12] = -0.0367
SetPieceCarQuatZ[12] = -0.5154
SetPieceCarQuatW[12] = 0.8542
SetPieceCarRecording[12] = 84
SetPieceCarStartime[12] = 46000.0000
SetPieceCarRecordingSpeed[12] = 1.0000
SetPieceCarModel[12] = manana
/*SetPieceCarPos[13] = <<-1273.2351, -545.6791, 30.4319>>
SetPieceCarQuatX[13] = 0.0109
SetPieceCarQuatY[13] = -0.0390
SetPieceCarQuatZ[13] = 0.9335
SetPieceCarQuatW[13] = -0.3563
SetPieceCarRecording[13] = 508
SetPieceCarStartime[13] = 54500.0000
SetPieceCarRecordingSpeed[13] = 1.0000
SetPieceCarModel[13] = pcj*/
SetPieceCarPos[14] = <<-1294.7389, -621.9509, 26.9939>>
SetPieceCarQuatX[14] = 0.0257
SetPieceCarQuatY[14] = 0.0005
SetPieceCarQuatZ[14] = 0.2810
SetPieceCarQuatW[14] = 0.9594
SetPieceCarRecording[14] = 511
SetPieceCarStartime[14] = 55000.0000
SetPieceCarRecordingSpeed[14] = 1.0000
SetPieceCarModel[14] = benson
SetPieceCarPos[15] = <<-1138.3113, -811.2895, 15.7751>>
SetPieceCarQuatX[15] = 0.0298
SetPieceCarQuatY[15] = -0.0129
SetPieceCarQuatZ[15] = -0.4436
SetPieceCarQuatW[15] = 0.8956
SetPieceCarRecording[15] = 992
SetPieceCarStartime[15] = 67000.0 //68000.0000
SetPieceCarRecordingSpeed[15] = 1.0000
SetPieceCarModel[15] = Packer
SetPieceCarPos[16] = <<-1163.0713, -741.8860, 19.4365>>
SetPieceCarQuatX[16] = -0.0020
SetPieceCarQuatY[16] = -0.0283
SetPieceCarQuatZ[16] = 0.9308
SetPieceCarQuatW[16] = -0.3644
SetPieceCarRecording[16] = 515
SetPieceCarStartime[16] = 69000.0000
SetPieceCarRecordingSpeed[16] = 1.0000
SetPieceCarModel[16] = Burrito3
SetPieceCarPos[17] = <<-1201.0022, -821.8204, 14.7233>>
SetPieceCarQuatX[17] = -0.0160
SetPieceCarQuatY[17] = -0.0359
SetPieceCarQuatZ[17] = 0.8871
SetPieceCarQuatW[17] = -0.4599
SetPieceCarRecording[17] = 512
SetPieceCarStartime[17] = 71500.0000
SetPieceCarRecordingSpeed[17] = 1.0000
SetPieceCarModel[17] = youga
SetPieceCarPos[18] = <<-1259.1127, -907.3938, 10.8468>>
SetPieceCarQuatX[18] = 0.0139
SetPieceCarQuatY[18] = -0.0091
SetPieceCarQuatZ[18] = -0.4673
SetPieceCarQuatW[18] = 0.8840
SetPieceCarRecording[18] = 513
SetPieceCarStartime[18] = 71600.0000
SetPieceCarRecordingSpeed[18] = 1.0000
SetPieceCarModel[18] = manana
SetPieceCarPos[19] = <<-960.4544, -1235.3582, 5.1090>>
SetPieceCarQuatX[19] = -0.0003
SetPieceCarQuatY[19] = 0.0005
SetPieceCarQuatZ[19] = -0.5006
SetPieceCarQuatW[19] = 0.8657
SetPieceCarRecording[19] = 11
SetPieceCarStartime[19] = 83000.0000
SetPieceCarRecordingSpeed[19] = 1.0000
SetPieceCarModel[19] = benson
SetPieceCarPos[20] = <<-1030.3206, -1135.5731, 1.6671>>
SetPieceCarQuatX[20] = 0.0094
SetPieceCarQuatY[20] = -0.0037
SetPieceCarQuatZ[20] = -0.4742
SetPieceCarQuatW[20] = 0.8804
SetPieceCarRecording[20] = 507
SetPieceCarStartime[20] = 88000.0000
SetPieceCarRecordingSpeed[20] = 1.0000
SetPieceCarModel[20] = intruder
SetPieceCarPos[21] = <<-776.4766, -1115.1191, 10.0461>>
SetPieceCarQuatX[21] = 0.0003
SetPieceCarQuatY[21] = 0.0000
SetPieceCarQuatZ[21] = 0.8673
SetPieceCarQuatW[21] = 0.4978
SetPieceCarRecording[21] = 20
SetPieceCarStartime[21] = 96000.0000
SetPieceCarRecordingSpeed[21] = 1.0000
SetPieceCarModel[21] = manana
SetPieceCarPos[22] = <<-729.9686, -1088.1537, 11.4620>>
SetPieceCarQuatX[22] = -0.0111
SetPieceCarQuatY[22] = -0.0437
SetPieceCarQuatZ[22] = 0.8583
SetPieceCarQuatW[22] = 0.5112
SetPieceCarRecording[22] = 506
SetPieceCarStartime[22] = 98000.0000
SetPieceCarRecordingSpeed[22] = 1.0000
SetPieceCarModel[22] = intruder
SetPieceCarPos[23] = <<-792.2863, -1091.0381, 10.7970>>
SetPieceCarQuatX[23] = -0.0186
SetPieceCarQuatY[23] = -0.0192
SetPieceCarQuatZ[23] = 0.9698
SetPieceCarQuatW[23] = -0.2422
SetPieceCarRecording[23] = 12
SetPieceCarStartime[23] = 100700.0000
SetPieceCarRecordingSpeed[23] = 1.0000
SetPieceCarModel[23] = benson
SetPieceCarPos[24] = <<-733.6007, -1164.0098, 9.9703>>
SetPieceCarQuatX[24] = -0.0104
SetPieceCarQuatY[24] = -0.0027
SetPieceCarQuatZ[24] = 0.2836
SetPieceCarQuatW[24] = 0.9589
SetPieceCarRecording[24] = 17
SetPieceCarStartime[24] = 101000.0000
SetPieceCarRecordingSpeed[24] = 1.0000
SetPieceCarModel[24] = intruder
SetPieceCarPos[25] = <<-799.6644, -1066.3711, 11.3241>>
SetPieceCarQuatX[25] = 0.0092
SetPieceCarQuatY[25] = -0.0294
SetPieceCarQuatZ[25] = 0.9687
SetPieceCarQuatW[25] = -0.2464
SetPieceCarRecording[25] = 132
SetPieceCarStartime[25] = 101500.0000
SetPieceCarRecordingSpeed[25] = 1.0000
SetPieceCarModel[25] = manana
SetPieceCarPos[26] = <<-641.2161, -945.9627, 21.1608>>
SetPieceCarQuatX[26] = -0.0126
SetPieceCarQuatY[26] = -0.0188
SetPieceCarQuatZ[26] = 0.9977
SetPieceCarQuatW[26] = 0.0640
SetPieceCarRecording[26] = 24
SetPieceCarStartime[26] = 103000.0000
SetPieceCarRecordingSpeed[26] = 1.0000
SetPieceCarModel[26] = manana
/*SetPieceCarPos[27] = <<-684.8077, -1054.4844, 14.9669>>
SetPieceCarQuatX[27] = -0.0101
SetPieceCarQuatY[27] = -0.0407
SetPieceCarQuatZ[27] = 0.8647
SetPieceCarQuatW[27] = 0.5005
SetPieceCarRecording[27] = 27
SetPieceCarStartime[27] = 104500.0000
SetPieceCarRecordingSpeed[27] = 1.0000
SetPieceCarModel[27] = manana*/
SetPieceCarPos[28] = <<-622.8137, -964.5755, 20.9500>>
SetPieceCarQuatX[28] = -0.0052
SetPieceCarQuatY[28] = -0.0167
SetPieceCarQuatZ[28] = -0.4032
SetPieceCarQuatW[28] = 0.9150
SetPieceCarRecording[28] = 149
SetPieceCarStartime[28] = 109446.0000
SetPieceCarRecordingSpeed[28] = 1.0000
SetPieceCarModel[28] = intruder
SetPieceCarPos[29] = <<-527.2289, -948.6147, 22.9859>>
SetPieceCarQuatX[29] = 0.0037
SetPieceCarQuatY[29] = 0.0266
SetPieceCarQuatZ[29] = -0.1871
SetPieceCarQuatW[29] = 0.9820
SetPieceCarRecording[29] = 514
SetPieceCarStartime[29] = 113000.0000
SetPieceCarRecordingSpeed[29] = 1.0000
SetPieceCarModel[29] = manana
SetPieceCarPos[30] = <<-507.5158, -866.4927, 29.2588>>
SetPieceCarQuatX[30] = -0.0191
SetPieceCarQuatY[30] = -0.0472
SetPieceCarQuatZ[30] = 0.9921
SetPieceCarQuatW[30] = 0.1146
SetPieceCarRecording[30] = 22
SetPieceCarStartime[30] = 114000.0000
SetPieceCarRecordingSpeed[30] = 1.0000
SetPieceCarModel[30] = intruder
SetPieceCarPos[31] = <<-510.2627, -885.1514, 27.9052>>
SetPieceCarQuatX[31] = -0.0331
SetPieceCarQuatY[31] = -0.0438
SetPieceCarQuatZ[31] = 0.9805
SetPieceCarQuatW[31] = 0.1885
SetPieceCarRecording[31] = 165
SetPieceCarStartime[31] = 115000.0000
SetPieceCarRecordingSpeed[31] = 1.0000
SetPieceCarModel[31] = intruder
SetPieceCarPos[32] = <<-387.9428, -838.6669, 31.4645>>
SetPieceCarQuatX[32] = -0.0002
SetPieceCarQuatY[32] = 0.0000
SetPieceCarQuatZ[32] = 0.6826
SetPieceCarQuatW[32] = 0.7308
SetPieceCarRecording[32] = 159
SetPieceCarStartime[32] = 117750.0000
SetPieceCarRecordingSpeed[32] = 0.900 //TODO 487010: slow the bus down a touch.
SetPieceCarModel[32] = bus
SetPieceCarPos[33] = <<-358.8373, -747.3198, 33.7962>>
SetPieceCarQuatX[33] = 0.0007
SetPieceCarQuatY[33] = -0.0008
SetPieceCarQuatZ[33] = 0.7083
SetPieceCarQuatW[33] = 0.7059
SetPieceCarRecording[33] = 21
SetPieceCarStartime[33] = 128000.0000
SetPieceCarRecordingSpeed[33] = 1.0000
SetPieceCarModel[33] = burrito3
SetPieceCarPos[34] = <<-142.6160, -753.6062, 33.9993>>
SetPieceCarQuatX[34] = 0.0337
SetPieceCarQuatY[34] = -0.0062
SetPieceCarQuatZ[34] = -0.1730
SetPieceCarQuatW[34] = 0.9843
SetPieceCarRecording[34] = 15
SetPieceCarStartime[34] = 134600.0000
SetPieceCarRecordingSpeed[34] = 1.0000
SetPieceCarModel[34] = benson
SetPieceCarPos[35] = <<-100.8266, -622.9727, 35.7906>>
SetPieceCarQuatX[35] = -0.0093
SetPieceCarQuatY[35] = -0.0050
SetPieceCarQuatZ[35] = 0.9830
SetPieceCarQuatW[35] = 0.1832
SetPieceCarRecording[35] = 168
SetPieceCarStartime[35] = 140400.0000
SetPieceCarRecordingSpeed[35] = 1.0000
SetPieceCarModel[35] = intruder
//Parked cars
ParkedCarPos[0] = <<-963.3202, -453.4057, 36.7332>>
ParkedCarQuatX[0] = 0.0330
ParkedCarQuatY[0] = -0.0051
ParkedCarQuatZ[0] = 0.9744
ParkedCarQuatW[0] = -0.2222
ParkedCarModel[0] = BURRITO3
ParkedCarPos[1] = <<-1116.9606, -779.3914, 17.4599>>
ParkedCarQuatX[1] = -0.0053
ParkedCarQuatY[1] = -0.0372
ParkedCarQuatZ[1] = 0.5192
ParkedCarQuatW[1] = 0.8538
ParkedCarModel[1] = intruder //intruder
ParkedCarPos[2] = <<-1143.3539, -748.5402, 19.1161>>
ParkedCarQuatX[2] = 0.0336
ParkedCarQuatY[2] = 0.0100
ParkedCarQuatZ[2] = -0.5869
ParkedCarQuatW[2] = 0.8089
ParkedCarModel[2] = manana //emperor
ParkedCarPos[3] = <<-1129.9711, -755.3607, 18.9380>>
ParkedCarQuatX[3] = 0.0135
ParkedCarQuatY[3] = -0.0293
ParkedCarQuatZ[3] = 0.8093
ParkedCarQuatW[3] = 0.5865
ParkedCarModel[3] = intruder //intruder
ParkedCarPos[4] = <<-1329.2493, -396.6274, 36.1102>>
ParkedCarQuatX[4] = -0.0000
ParkedCarQuatY[4] = -0.0024
ParkedCarQuatZ[4] = 0.9673
ParkedCarQuatW[4] = -0.2538
ParkedCarModel[4] = manana //emperor
ParkedCarPos[5] = <<-1341.7618, -403.7986, 36.0021>>
ParkedCarQuatX[5] = -0.0050
ParkedCarQuatY[5] = -0.0058
ParkedCarQuatZ[5] = 0.9646
ParkedCarQuatW[5] = -0.2634
ParkedCarModel[5] = intruder //intruder
ParkedCarPos[6] = <<-1322.9462, -383.0046, 36.1916>>
ParkedCarQuatX[6] = 0.0043
ParkedCarQuatY[6] = 0.0031
ParkedCarQuatZ[6] = -0.4992
ParkedCarQuatW[6] = 0.8665
ParkedCarModel[6] = manana //emperor
ParkedCarPos[7] = <<-1838.4237, -510.6184, 27.6644>>
ParkedCarQuatX[7] = -0.0368
ParkedCarQuatY[7] = -0.0152
ParkedCarQuatZ[7] = 0.8217
ParkedCarQuatW[7] = 0.5685
ParkedCarModel[7] = intruder //intruder
ParkedCarPos[8] = <<-1857.2256, -498.4425, 26.0763>>
ParkedCarQuatX[8] = -0.0340
ParkedCarQuatY[8] = -0.0146
ParkedCarQuatZ[8] = 0.8269
ParkedCarQuatW[8] = 0.5612
ParkedCarModel[8] = BURRITO3
ParkedCarPos[9] = <<-1146.8906, -850.3187, 14.2053>>
ParkedCarQuatX[9] = 0.0276
ParkedCarQuatY[9] = 0.0353
ParkedCarQuatZ[9] = -0.4192
ParkedCarQuatW[9] = 0.9068
ParkedCarModel[9] = PACKER
ParkedCarPos[10] = <<-358.9616, -754.4509, 33.5192>>
ParkedCarQuatX[10] = 0.0094
ParkedCarQuatY[10] = 0.0004
ParkedCarQuatZ[10] = 0.7147
ParkedCarQuatW[10] = -0.6994
ParkedCarModel[10] = intruder //intruder
ParkedCarPos[11] = <<-358.6446, -768.9286, 33.5192>>
ParkedCarQuatX[11] = 0.0007
ParkedCarQuatY[11] = -0.0093
ParkedCarQuatZ[11] = 0.7056
ParkedCarQuatW[11] = 0.7085
ParkedCarModel[11] = intruder //intruder
ParkedCarPos[12] = <<-342.1623, -767.6207, 33.5187>>
ParkedCarQuatX[12] = 0.0006
ParkedCarQuatY[12] = -0.0094
ParkedCarQuatZ[12] = 0.7064
ParkedCarQuatW[12] = 0.7078
ParkedCarModel[12] = intruder //intruder
ParkedCarPos[13] = <<-342.2834, -753.7252, 33.5180>>
ParkedCarQuatX[13] = 0.0093
ParkedCarQuatY[13] = 0.0006
ParkedCarQuatZ[13] = 0.7134
ParkedCarQuatW[13] = -0.7007
ParkedCarModel[13] = intruder //intruder
ParkedCarPos[14] = <<-6.5124, -667.6953, 31.3380>>
ParkedCarQuatX[14] = -0.0001
ParkedCarQuatY[14] = 0.0003
ParkedCarQuatZ[14] = 0.9997
ParkedCarQuatW[14] = -0.0264
ParkedCarModel[14] = stockade
//Custom flags
SET_BIT(TrafficCarFlags[34], TRAFFIC_FLAGS_FREEZE_CAR_FOR_COLLISION)
ENDPROC
PROC LOAD_UBER_DATA_2()
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
PROC REMOVE_ALL_CHASE_RECORDINGS()
INT i = 0
REPEAT COUNT_OF(SetPieceCarID) i
IF SetPieceCarRecording[i] > 0
REMOVE_VEHICLE_RECORDING(SetPieceCarRecording[i], strCarrec)
ENDIF
ENDREPEAT
REPEAT COUNT_OF(TrafficCarID) i
IF TrafficCarRecording[i] > 0
REMOVE_VEHICLE_RECORDING(TrafficCarRecording[i], strCarrec)
ENDIF
ENDREPEAT
ENDPROC
PROC CONVERGE_VALUE(FLOAT &val, FLOAT fDesiredVal, FLOAT fAmountToConverge, BOOL bAdjustForFramerate = FALSE)
IF val != fDesiredVal
FLOAT fConvergeAmountThisFrame = fAmountToConverge
IF bAdjustForFramerate
fConvergeAmountThisFrame = 0.0 +@ (fAmountToConverge * 30.0)
ENDIF
IF val - fDesiredVal > fConvergeAmountThisFrame
val -= fConvergeAmountThisFrame
ELIF val - fDesiredVal < -fConvergeAmountThisFrame
val += fConvergeAmountThisFrame
ELSE
val = fDesiredVal
ENDIF
ENDIF
ENDPROC
PROC CLEAR_TRIGGERED_LABELS()
INT iArraySize = COUNT_OF(bHasTextLabelTriggered)
INT i = 0
REPEAT iArraySize i
bHasTextLabelTriggered[i] = FALSE
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
FUNC INT GET_ALL_VEHICLE_SEARCH_FLAGS()
RETURN (VEHICLE_SEARCH_FLAG_ALLOW_VEHICLE_OCCUPANTS_TO_BE_PERFORMING_A_SCRIPTED_TASK |
VEHICLE_SEARCH_FLAG_RETURN_LAW_ENFORCER_VEHICLES |
VEHICLE_SEARCH_FLAG_RETURN_MISSION_VEHICLES |
VEHICLE_SEARCH_FLAG_RETURN_RANDOM_VEHICLES |
VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_A_DEAD_OR_DYING_PED |
VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_A_PLAYER |
VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_GROUP_MEMBERS |
VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_WITH_PEDS_ENTERING_OR_EXITING)
ENDFUNC
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 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
PROC DO_FADE_OUT_WITH_WAIT()
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()
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_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)
STOP_SYNCHRONIZED_ENTITY_ANIM(veh, NORMAL_BLEND_OUT, TRUE)
IF IS_ENTITY_ATTACHED(veh)
DETACH_ENTITY(veh)
ENDIF
ENDIF
IF bForceDelete
DELETE_VEHICLE(veh)
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(veh)
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)
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
IF IS_PED_GROUP_MEMBER(ped, PLAYER_GROUP_ID())
REMOVE_PED_FROM_GROUP(ped)
ENDIF
IF NOT bForceDelete
SET_PED_KEEP_TASK(ped, TRUE)
ENDIF
ENDIF
IF bForceDelete
DELETE_PED(ped)
ELSE
SET_PED_AS_NO_LONGER_NEEDED(ped)
ENDIF
ENDIF
ENDPROC
PROC REMOVE_ALL_BLIPS()
IF DOES_BLIP_EXIST(blipCurrentDestination)
REMOVE_BLIP(blipCurrentDestination)
ENDIF
IF DOES_BLIP_EXIST(sLamar.blip)
REMOVE_BLIP(sLamar.blip)
ENDIF
IF DOES_BLIP_EXIST(sJimmy.blip)
REMOVE_BLIP(sJimmy.blip)
ENDIF
IF DOES_BLIP_EXIST(sSimeon.blip)
REMOVE_BLIP(sSimeon.blip)
ENDIF
IF DOES_BLIP_EXIST(blipLamarsCar)
REMOVE_BLIP(blipLamarsCar)
ENDIF
IF DOES_BLIP_EXIST(blipFakeGPS)
REMOVE_BLIP(blipFakeGPS)
ENDIF
REMOVE_BLIP(sMainCars[0].blip)
REMOVE_BLIP(sMainCars[1].blip)
ENDPROC
PROC REMOVE_ALL_OBJECTS(BOOL bForceDelete = FALSE)
REMOVE_OBJECT(objCigarette, bForceDelete)
REMOVE_OBJECT(objShirt, bForceDelete)
REMOVE_OBJECT(objWardrobeDoors[0], bForceDelete)
REMOVE_OBJECT(objWardrobeDoors[1], bForceDelete)
REMOVE_OBJECT(objVaultShutter, bForceDelete)
REMOVE_OBJECT(objFerrisWheel, bForceDelete)
REMOVE_OBJECT(objHealthPack, TRUE)
INT i = 0
REPEAT COUNT_OF(objShowroomGlass) i
REMOVE_OBJECT(objShowroomGlass[i], FALSE)
ENDREPEAT
REPEAT COUNT_OF(objFerrisCars) i
REMOVE_OBJECT(objFerrisCars[i], FALSE)
ENDREPEAT
REPEAT COUNT_OF(objBankGates) i
REMOVE_OBJECT(objBankGates[i], FALSE)
ENDREPEAT
REPEAT COUNT_OF(objBankGateCollision) i
REMOVE_OBJECT(objBankGateCollision[i], FALSE)
ENDREPEAT
ENDPROC
PROC REMOVE_ALL_PEDS(BOOL bForceDelete = FALSE)
REMOVE_PED(sLamar.ped, bForceDelete)
REMOVE_PED(sSimeon.ped, bForceDelete)
REMOVE_PED(sJimmy.ped, bForceDelete)
REMOVE_PED(sSecurityGuard.ped, bForceDelete)
REMOVE_PED(pedCutsceneCops[0], bForceDelete)
REMOVE_PED(pedCutsceneCops[1], bForceDelete)
REMOVE_PED(sSmoker.ped, bForceDelete)
REMOVE_PED(pedCarOwner, bForceDelete)
REMOVE_PED(pedCreditsBoat, bForceDelete)
INT i = 0
REPEAT COUNT_OF(sAliens) i
REMOVE_PED(sAliens[i].ped, bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(sAliensGroup2) i
REMOVE_PED(sAliensGroup2[i].ped, bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(sBirds) i
REMOVE_PED(sBirds[i].ped, bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(sMovieGuards) i
REMOVE_PED(sMovieGuards[i].ped, bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(pedCreditsFerrisWheel) i
REMOVE_PED(pedCreditsFerrisWheel[i], bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(pedCreditsCars) i
REMOVE_PED(pedCreditsCars[i], bForceDelete)
ENDREPEAT
ENDPROC
PROC REMOVE_ALL_VEHICLES(BOOL bForceDelete = FALSE)
REMOVE_VEHICLE(sMainCars[0].veh, bForceDelete)
REMOVE_VEHICLE(sMainCars[1].veh, bForceDelete)
REMOVE_VEHICLE(vehTriggerCar, TRUE)
REMOVE_VEHICLE(vehCutsceneCop, bForceDelete)
REMOVE_VEHICLE(vehTrailer, bForceDelete)
REMOVE_VEHICLE(vehFranklinsCar, bForceDelete)
REMOVE_VEHICLE(vehCameraTest, TRUE)
REMOVE_VEHICLE(vehTransporter, bForceDelete)
REMOVE_VEHICLE(vehTanker, bForceDelete)
REMOVE_VEHICLE(vehFinalCutsceneCar, bForceDelete)
REMOVE_VEHICLE(vehCreditsSailboat, bForceDelete)
REMOVE_VEHICLE(vehCreditsBoat, bForceDelete)
REMOVE_VEHICLE(vehCreditsSportsCar, TRUE)
INT i = 0
REPEAT COUNT_OF(vehShowroomCars) i
REMOVE_VEHICLE(vehShowroomCars[i], bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(vehCarsOutsideShowroom) i
REMOVE_VEHICLE(vehCarsOutsideShowroom[i], bForceDelete)
ENDREPEAT
REPEAT COUNT_OF(vehCreditsCars) i
REMOVE_VEHICLE(vehCreditsCars[i], bForceDelete)
ENDREPEAT
ENDPROC
PROC CLEAR_ALL_RAGE_HELP()
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_RAGEBAR")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_RAGEHOW")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_RAGESTAT")
CLEAR_HELP()
ENDIF
// Clear PC specific help
IF IS_PC_VERSION()
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_RAGEBAR_KM")
CLEAR_HELP()
ENDIF
ENDIF
FLASH_ABILITY_BAR(0)
ENDPROC
FUNC BOOL SETUP_REQ_VAULT_SHUTTER(VECTOR vPos, VECTOR vRot, BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(objVaultShutter)
REQUEST_MODEL(Prop_Vault_Shutter)
IF NOT bJustRequestAssets
IF interiorBank = NULL
interiorBank = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-7.9, -662.2, 34.7>>, "dt1_03_carpark")
ELSE
PIN_INTERIOR_IN_MEMORY(interiorBank)
ENDIF
ENDIF
IF HAS_MODEL_LOADED(Prop_Vault_Shutter)
IF NOT bJustRequestAssets
IF interiorBank != NULL
IF IS_INTERIOR_READY(interiorBank)
objVaultShutter = CREATE_OBJECT_NO_OFFSET(Prop_Vault_Shutter, vPos)
SET_ENTITY_ROTATION(objVaultShutter, vRot)
FREEZE_ENTITY_POSITION(objVaultShutter, TRUE)
FORCE_ROOM_FOR_ENTITY(objVaultShutter, interiorBank, HASH("GtaMloRoom003"))
SET_MODEL_AS_NO_LONGER_NEEDED(Prop_Vault_Shutter)
RETURN TRUE
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
///Used during the cops cutscene to keep the side car park in memory.
FUNC BOOL SET_SIDE_CAR_PARK_INTERIOR_ACTIVE(BOOL bIsActive)
IF bIsActive
IF interiorCarPark2 = NULL
interiorCarPark2 = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<89.7, -694.9, 32.7>>, "dt1_05_carpark")
ELSE
IF IS_INTERIOR_READY(interiorCarPark2)
RETURN TRUE
ELSE
PIN_INTERIOR_IN_MEMORY(interiorCarPark2)
ENDIF
ENDIF
ELSE
IF interiorCarPark2 != NULL
UNPIN_INTERIOR(interiorCarPark2)
interiorCarPark2 = NULL
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC UPDATE_RAGE()
CONST_FLOAT RAGE_ACCEL 1.0
CONST_FLOAT RAGE_DECEL 3.5
CONST_FLOAT MAX_SPEED 55.0
IF NOT sRageData.bHasRaged
IF eMissionStage = STAGE_CHASE
//Fill up the bar as the player progresses through the chase.
IF bAllowSpecialAbilityDuringChase
//Don't force this any more, just use the standard behaviour.
/*IF NOT IS_SPECIAL_ABILITY_ENABLED(PLAYER_ID())
sRageData.fCurrentRage = (fCurrentPlaybackTime / 41500.0)
IF sRageData.fCurrentRage > 1.0
sRageData.fCurrentRage = 1.0
ENDIF
SPECIAL_ABILITY_DEPLETE_METER(PLAYER_ID(), TRUE)
//SPECIAL_ABILITY_RESET(PLAYER_ID())
SPECIAL_ABILITY_CHARGE_NORMALIZED(PLAYER_ID(), sRageData.fCurrentRage, TRUE)
ENDIF*/
ELSE
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrecMain, strCarrec)
FLOAT fTotalDuration = GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iCarrecMain, strCarrec)
sRageData.fCurrentRage = (fCurrentPlaybackTime / fTotalDuration) * 99.0
SPECIAL_ABILITY_DEPLETE_METER(PLAYER_ID(), TRUE)
SPECIAL_ABILITY_CHARGE_NORMALIZED(PLAYER_ID(), sRageData.fCurrentRage / 100.0, TRUE)
ENDIF
ENDIF
ELIF eMissionStage = STAGE_GO_TO_GARAGE
//If the special ability is allowed during the chase don't do anything in the lose cops section.
IF NOT bAllowSpecialAbilityDuringChase
//Fill up the last bit of the bar.
IF NOT sRageData.bHasRaged
sRageData.fCurrentRage = sRageData.fCurrentRage +@ RAGE_ACCEL
IF sRageData.fCurrentRage > 100.0
sRageData.fCurrentRage = 100.0
ENDIF
SPECIAL_ABILITY_DEPLETE_METER(PLAYER_ID(), TRUE)
SPECIAL_ABILITY_CHARGE_NORMALIZED(PLAYER_ID(), sRageData.fCurrentRage / 100.0, TRUE)
ENDIF
ENDIF
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
///Creates a new load scene frustrum and waits until it has finished loading or it times out.
PROC NEW_LOAD_SCENE_FRUSTRUM_WITH_WAIT(VECTOR vPos, VECTOR vDir, FLOAT fDist, 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(vPos, vDir, fDist, controlFlags)
ELIF IS_NEW_LOAD_SCENE_LOADED()
iTimeOut = 0
ENDIF
WAIT(0)
ENDWHILE
NEW_LOAD_SCENE_STOP()
ENDPROC
///Creates an ambient car at a specific point.
PROC CREATE_RANDOM_CAR_AT_POS(MODEL_NAMES model, MODEL_NAMES pedModel, VECTOR vPos, FLOAT fHeading, INT iArrayIndex, FLOAT fSpeed = 15.0, BOOL bCreatePedInside = FALSE)
IF HAS_MODEL_LOADED(pedModel)
AND HAS_MODEL_LOADED(model)
vehCreditsCars[iArrayIndex] = CREATE_VEHICLE(model, vPos, fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(vehCreditsCars[iArrayIndex])
IF bCreatePedInside
pedCreditsCars[iArrayIndex] = CREATE_PED_INSIDE_VEHICLE(vehCreditsCars[iArrayIndex], PEDTYPE_MISSION, pedModel)
TASK_STAND_STILL(pedCreditsCars[iArrayIndex], -1)
//TASK_VEHICLE_MISSION(pedCreditsCars[iArrayIndex], vehCreditsCars[iArrayIndex], NULL, MISSION_CRUISE, fSpeed, DRIVINGMODE_STOPFORCARS, 5.0, 5.0)
//SET_PED_KEEP_TASK(pedCreditsCars[iArrayIndex], TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedCreditsCars[iArrayIndex], TRUE)
ENDIF
IF fSpeed > 0.0
//SET_VEHICLE_FORWARD_SPEED(vehCreditsCars[iArrayIndex], fSpeed)
ENDIF
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] CREATE_RANDOM_CAR_AT_POS: Created car ", iArrayIndex)
ENDIF
ENDPROC
PROC REQUEST_TRAFFIC_IN_ADVANCE(FLOAT fCutoffTime, FLOAT fStartTime = 0.0)
IF fCurrentPlaybackTime < fCutoffTime
INT i = 0
REPEAT COUNT_OF(TrafficCarID) i
IF TrafficCarRecording[i] != 0
IF TrafficCarStartime[i] < fCutoffTime
AND TrafficCarStartime[i] > fStartTime - 10000.0
REQUEST_MODEL(TrafficCarModel[i])
REQUEST_VEHICLE_RECORDING(TrafficCarRecording[i], strCarrec)
ENDIF
ENDIF
ENDREPEAT
REPEAT COUNT_OF(SetPieceCarID) i
IF SetPieceCarRecording[i] != 0
IF SetPieceCarStartime[i] < fCutoffTime
AND SetPieceCarStartime[i] > fStartTime - 10000.0
IF NOT DOES_ENTITY_EXIST(SetPieceCarID[i])
REQUEST_MODEL(SetPieceCarModel[i])
ENDIF
REQUEST_VEHICLE_RECORDING(SetPieceCarRecording[i], strCarrec)
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDPROC
PROC RUBBER_BAND_TEST(FLOAT &fCurrentSpeed, VEHICLE_INDEX vehPlayer, VEHICLE_INDEX vehTrigger)
IF IS_VEHICLE_DRIVEABLE(vehTrigger)
AND IS_VEHICLE_DRIVEABLE(vehPlayer)
FLOAT fDesiredPlaybackSpeed = 1.0
FLOAT fAccel = 0.01
//Default values for any adjustments to the player's speed and the playback accel.
IF IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
fAccel = 0.025
ENDIF
//Special cases: at these points we want the buddy to be further from or nearer to the player than normal
IF fCurrentPlaybackTime < 7500.0
//At start: keep them further apart to avoid U-turn issues.
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, vehPlayer, vehTrigger, 4.5, 10.0, 50.0, 100.0, 30.0, 1.0, 0.7, 0.5, 2.0, TRUE, 15.0, 25.0)
ELIF fCurrentPlaybackTime > 8000.0 AND fCurrentPlaybackTime < 12000.0
//Move forward at first turn
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, vehPlayer, vehTrigger, 4.5, 30.0, 55.0, 100.0, 30.0, 1.0, 0.7, 0.5, 2.0, TRUE, 15.0, 25.0)
ELIF fCurrentPlaybackTime > 26000.0 AND fCurrentPlaybackTime < 30000.0
//At start of dual carriageway: speed up as it's quite easy to overtake
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, vehPlayer, vehTrigger, 4.5, 20.0, 55.0, 100.0, 30.0, 1.0, 0.7, 0.5, 2.0, TRUE, 15.0, 25.0)
ELIF fCurrentPlaybackTime > 40000.0 AND fCurrentPlaybackTime < 45500.0
//Two turns before movie lot
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, vehPlayer, vehTrigger, 4.5, 30.0, 55.0, 100.0, 30.0, 1.0, 0.7, 0.5, 2.0, TRUE, 15.0, 25.0)
ELIF fCurrentPlaybackTime > 46000.0 AND fCurrentPlaybackTime < 51000.0
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, vehPlayer, vehTrigger, 4.5, 45.0, 50.0, 100.0, 30.0, 1.0, 0.7, 0.5, 2.0, TRUE, 15.0, 25.0)
ELIF fCurrentPlaybackTime > 60000.0 AND fCurrentPlaybackTime < 64000.0
//Post-movie lot
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, vehPlayer, vehTrigger, 4.5, 50.0, 60.0, 100.0, 30.0, 1.0, 0.7, 0.5, 2.0, TRUE, 15.0, 25.0)
ELIF fCurrentPlaybackTime > 77500.0 AND fCurrentPlaybackTime < 81500.0
//Just before start of bumpy road
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, vehPlayer, vehTrigger, 4.5, 25.0, 50.0, 100.0, 30.0, 1.0, 0.7, 0.5, 2.0, TRUE, 15.0, 25.0)
ELIF fCurrentPlaybackTime > 83500.0 AND fCurrentPlaybackTime < 87500.0
//Just before splash screen (Lamar gets a little close)
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, vehPlayer, vehTrigger, 4.5, 30.0, 55.0, 100.0, 30.0, 1.0, 0.7, 0.5, 2.0, TRUE, 15.0, 25.0)
ELIF fCurrentPlaybackTime > 87500.0 AND fCurrentPlaybackTime < 98500.0
//After bumps: speed him up, slow down accel a bit as the speed up is obvious.
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, vehPlayer, vehTrigger, 4.5, 40.0, 60.0, 100.0, 30.0, 1.0, 0.7, 0.5, 2.0, TRUE, 15.0, 25.0)
fAccel *= 0.7
ELIF fCurrentPlaybackTime > 108000.0 AND fCurrentPlaybackTime < 113500.0
//Before police station turn
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, vehPlayer, vehTrigger, 4.5, 35.0, 55.0, 100.0, 30.0, 1.0, 0.7, 0.5, 2.0, TRUE, 15.0, 25.0)
ELIF fCurrentPlaybackTime > 119000.0 AND fCurrentPlaybackTime < 121500.0
//Before bus turn
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, vehPlayer, vehTrigger, 4.5, 35.0, 55.0, 100.0, 30.0, 1.0, 0.7, 0.5, 2.0, TRUE, 15.0, 25.0)
ELIF fCurrentPlaybackTime > 122000.0 AND fCurrentPlaybackTime < 125000.0
//Before car park turn: speed him up a bit
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, vehPlayer, vehTrigger, 4.5, 20.0, 50.0, 100.0, 30.0, 1.0, 0.7, 0.5, 2.0, TRUE, 15.0, 25.0)
ELIF fCurrentPlaybackTime > 126000.0 AND fCurrentPlaybackTime < 131500.0
//During car park: stop him getting too far away.
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, vehPlayer, vehTrigger, 4.5, 15.0, 30.0, 60.0, 30.0, 1.0, 0.7, 0.5, 2.0, TRUE, 15.0, 25.0)
ELIF fCurrentPlaybackTime > 131500.0 AND fCurrentPlaybackTime < 137700.0
//Just after car park: speed up a little
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, vehPlayer, vehTrigger, 4.5, 15.0, 50.0, 100.0, 30.0, 1.0, 0.7, 0.5, 2.0, TRUE, 15.0, 25.0)
ELIF fCurrentPlaybackTime > 140900.0 AND fCurrentPlaybackTime < 144600.0
//Final section: speed up Lamar, player can possibly overtake at this bit, but try to keep him close.
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, vehPlayer, vehTrigger, 4.5, 15.0, 30.0, 100.0, 30.0, 1.0, 0.7, 0.5, 2.0, TRUE, 15.0, 25.0)
ELIF fCurrentPlaybackTime > 145600.0 AND fCurrentPlaybackTime < 149400.0
//Slow down just before the cutscene trigger (TODO 274875)
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, vehPlayer, vehTrigger, 4.5, 8.0, 20.0, 80.0, 30.0, 1.0, 0.7, 0.5, 2.0, TRUE, 15.0, 25.0)
ELSE
//Default
CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredPlaybackSpeed, vehPlayer, vehTrigger, 4.5, 10.0, 50.0, 100.0, 30.0, 1.0, 0.7, 0.5, 2.0, TRUE, 15.0, 25.0)
ENDIF
//Special cases where desired speed is forced to a specific value.
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vehPlayer)
fDesiredPlaybackSpeed = 1.0
ENDIF
IF fCurrentPlaybackTime < 19000.0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-2013.521484,-410.929047,10.103262>>, <<-2005.116699,-399.659576,15.681062>>, 14.000000)
IF fDesiredPlaybackSpeed < 1.0
fDesiredPlaybackSpeed = 1.0
ENDIF
ENDIF
ENDIF
//Fix for 504332: if the player tries to take a shortcut down the alley make sure Lamar isn't slowed down.
IF fCurrentPlaybackTime > 65000.0 AND fCurrentPlaybackTime < 78000.0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1327.701172,-648.209534,35.882713>>, <<-1196.130981,-817.147583,13.715324>>, 33.750000)
IF fCurrentPlaybackTime < 75000.0
fDesiredPlaybackSpeed = 1.5
ELSE
fDesiredPlaybackSpeed = 1.2
ENDIF
ENDIF
ENDIF
//Don't do any slowdown after going past the cutscene trigger.
IF fCurrentPlaybackTime > GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iCarrecMain, strCarrec) - 4000.0
IF fDesiredPlaybackSpeed < 1.0
fDesiredPlaybackSpeed = 1.0
ENDIF
ELIF fCurrentPlaybackTime > 137600.0
//Cap the max speed during the final tunnels: this gives the player the chance to overtake.
IF fDesiredPlaybackSpeed > 1.0
fDesiredPlaybackSpeed = 1.0
ENDIF
ENDIF
UPDATE_CURRENT_PLAYBACK_SPEED_WITH_SMOOTHING(fCurrentSpeed, fDesiredPlaybackSpeed, fAccel)
ENDIF
ENDPROC
/// PURPOSE:
/// Calculates a new speed for the trigger vehicle based on it's distance from the player
/// PARAMS:
/// fCurrentSpeed - The current playback speed
/// fDist - The distance (note it will expect this a square of the actual distance)
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 fIdealDist = 10.0
FLOAT fMaxDist = 40.0
FLOAT fSuperMaxDist = 100.0
FLOAT fMaxDistInFront = 30.0
FLOAT fDesiredPlaybackSpeed = 1.0
FLOAT fAccel = 0.0
FLOAT fPlayersSpeedModifier = 0.0
FLOAT fSpeedDiff = GET_ENTITY_SPEED(vehTrigger) - GET_ENTITY_SPEED(vehPlayer)
//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 = -35.0
ELSE
fAccel = 0.01
fPlayersSpeedModifier = -15.0
ENDIF
//Special cases: at these points we want the buddy to be further from or nearer to the player than normal
//At start: keep them further apart to avoid U-turn issues.
IF fCurrentPlaybackTime < 7500.0
fIdealDist = 10.0
fMaxDist = 50.0
ENDIF
//Move forward at first turn
IF fCurrentPlaybackTime > 8000.0 AND fCurrentPlaybackTime < 12000.0
fIdealDist = 30.0
fMaxDist = 55.0
ENDIF
//At start of dual carriageway: speed up as it's quite easy to overtake
IF fCurrentPlaybackTime > 26000.0 AND fCurrentPlaybackTime < 30000.0
fIdealDist = 20.0
fMaxDist = 55.0
ENDIF
//Two turns before movie lot
IF fCurrentPlaybackTime > 40000.0 AND fCurrentPlaybackTime < 45500.0
fIdealDist = 30.0
fMaxDist = 55.0
ENDIF
IF fCurrentPlaybackTime > 46000.0 AND fCurrentPlaybackTime < 51000.0
fIdealDist = 45.0
fMaxDist = 50.0
ENDIF
//Post-movie lot
IF fCurrentPlaybackTime > 60000.0 AND fCurrentPlaybackTime < 64000.0
fIdealDist = 50.0
fMaxDist = 60.0
ENDIF
//Just before start of bumpy road
IF fCurrentPlaybackTime > 77500.0 AND fCurrentPlaybackTime < 81500.0
fIdealDist = 25.0
fMaxDist = 50.0
ENDIF
//Just before splash screen (Lamar gets a little close)
IF fCurrentPlaybackTime > 83500.0 AND fCurrentPlaybackTime < 87500.0
fIdealDist = 30.0
fMaxDist = 55.0
ENDIF
//After bumps: speed him up, slow down accel a bit as the speed up is obvious.
IF fCurrentPlaybackTime > 87500.0 AND fCurrentPlaybackTime < 98500.0
fAccel *= 0.7
fIdealDist = 40.0
fMaxDist = 60.0
ENDIF
//Before police station turn
IF fCurrentPlaybackTime > 108000.0 AND fCurrentPlaybackTime < 113500.0
fIdealDist = 35.0
fMaxDist = 55.0
ENDIF
//Before bus turn
IF fCurrentPlaybackTime > 119000.0 AND fCurrentPlaybackTime < 121500.0
fIdealDist = 35.0
fMaxDist = 55.0
ENDIF
//Before car park turn: speed him up a bit
IF fCurrentPlaybackTime > 122000.0 AND fCurrentPlaybackTime < 125000.0
fIdealDist = 20.0
fMaxDist = 50.0
ENDIF
//During car park: stop him getting too far away.
IF fCurrentPlaybackTime > 126000.0 AND fCurrentPlaybackTime < 131500.0
fIdealDist = 15.0
fMaxDist = 30.0
fSuperMaxDist = 60.0
ENDIF
//Just after car park: speed up a little
IF fCurrentPlaybackTime > 131500.0 AND fCurrentPlaybackTime < 137700.0
fIdealDist = 15.0
fMaxDist = 50.0
ENDIF
//Final section: speed up Lamar, player can possibly overtake at this bit, but try to keep him close.
IF fCurrentPlaybackTime > 140900.0 AND fCurrentPlaybackTime < 144600.0
fIdealDist = 15.0
fMaxDist = 30.0
ENDIF
//Slow down just before the cutscene trigger (TODO 274875)
IF fCurrentPlaybackTime > 145600.0 AND fCurrentPlaybackTime < 149400.0
fIdealDist = 8.0
fMaxDist = 20.0
fSuperMaxDist = 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.5 * fDistRatio) //0.5 - (0.3 * fDistRatio)
ENDIF
fPlayersSpeedModifier *= 0.5
ELIF fDist > fIdealDist
//Player is somewhat behind, slow the trigger car down relative to how far behind the player is.
fDistRatio = ((fDist - fIdealDist) / (fMaxDist - fIdealDist))
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 = (fIdealDist - fDist) / (fIdealDist - 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
//Special cases where desired speed is forced to a specific value.
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vehPlayer)
fDesiredPlaybackSpeed = 1.0
ENDIF
IF fCurrentPlaybackTime < 19000.0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-2013.521484,-410.929047,10.103262>>, <<-2005.116699,-399.659576,15.681062>>, 14.000000)
IF fDesiredPlaybackSpeed < 1.0
fDesiredPlaybackSpeed = 1.0
ENDIF
ENDIF
ENDIF
//Fix for 504332: if the player tries to take a shortcut down the alley make sure Lamar isn't slowed down.
IF fCurrentPlaybackTime > 65000.0 AND fCurrentPlaybackTime < 78000.0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1327.701172,-648.209534,35.882713>>, <<-1196.130981,-817.147583,13.715324>>, 33.750000)
IF fCurrentPlaybackTime < 75000.0
fDesiredPlaybackSpeed = 1.5
ELSE
fDesiredPlaybackSpeed = 1.2
ENDIF
ENDIF
ENDIF
//For the jump section don't allow the car speed to go too low.
IF fCurrentPlaybackTime > 86500.0 AND fCurrentPlaybackTime < 96500.0
IF fDesiredPlaybackSpeed < 0.7
fDesiredPlaybackSpeed = 0.7
ENDIF
ENDIF
//Don't do any slowdown after going past the cutscene trigger.
IF fCurrentPlaybackTime > GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iCarrecMain, strCarrec) - 4000.0
IF fDesiredPlaybackSpeed < 1.0
fDesiredPlaybackSpeed = 1.0
ENDIF
ELIF fCurrentPlaybackTime > 137400.0
//Cap the max speed during the final tunnels: this gives the player the chance to overtake.
IF fDesiredPlaybackSpeed > 1.0
fDesiredPlaybackSpeed = 1.0
ENDIF
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
//Modify the player's speed further based on the desired speed.
IF fDesiredPlaybackSpeed > 1.0
fPlayersSpeedModifier = fPlayersSpeedModifier - ((fDesiredPlaybackSpeed - 1.0) * 10.0)
ENDIF
//Make the speed changes.
MODIFY_VEHICLE_TOP_SPEED(sMainCars[iPlayersCar].veh, fPlayersSpeedModifier)
fCurrentSpeed = fCurrentSpeed +@ (((fDesiredPlaybackSpeed - fCurrentSpeed) * fAccel) * 30.0)
#IF IS_DEBUG_BUILD
IF bDebugShowChaseStats
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
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)
SET_TEXT_DROP_SHADOW()
TEXT_LABEL_63 strDesiredSpeed = "Desired playback speed: "
strDesiredSpeed += GET_STRING_FROM_FLOAT(fDesiredPlaybackSpeed)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.15, "STRING", strDesiredSpeed)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
TEXT_LABEL_63 strSpeed = "Playback speed: "
strSpeed += GET_STRING_FROM_FLOAT(fCurrentSpeed)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.2, "STRING", strSpeed)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
TEXT_LABEL_63 strTime = "Time: "
strTime += GET_STRING_FROM_FLOAT(fCurrentPlaybackTime)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.25, "STRING", strTime)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
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.3, "STRING", strDiff)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
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.35, "STRING", strState)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
TEXT_LABEL_63 strAccel = "Accel: "
strAccel += GET_STRING_FROM_FLOAT(fAccel)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.4, "STRING", strAccel)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
TEXT_LABEL_63 strModifier = "Player speed % modifier: "
strModifier += GET_STRING_FROM_FLOAT(fPlayersSpeedModifier)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.45, "STRING", strModifier)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
TEXT_LABEL_63 strDuration = "Total duration: "
strDuration += GET_STRING_FROM_FLOAT(GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iCarrecMain, strCarrec))
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.5, "STRING", strDuration)
ENDIF
#ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// 1220706 - Same as RUBBER_BAND_CHASE but keeps the trigger car closer to the player.
PROC RUBBER_BAND_CHASE_CLOSE_VERSION(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 fIdealDist = 7.0
FLOAT fMaxDist = 40.0
FLOAT fSuperMaxDist = 100.0
FLOAT fMaxDistInFront = 30.0
FLOAT fDesiredPlaybackSpeed = 1.0
FLOAT fAccel = 0.0
FLOAT fPlayersSpeedModifier = 0.0
FLOAT fSpeedDiff = GET_ENTITY_SPEED(vehTrigger) - GET_ENTITY_SPEED(vehPlayer)
//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 = -35.0
ELSE
fAccel = 0.01
fPlayersSpeedModifier = -15.0
ENDIF
//Special cases: at these points we want the buddy to be further from or nearer to the player than normal
//At start: keep them further apart to avoid U-turn issues.
IF fCurrentPlaybackTime < 7500.0
fIdealDist = 10.0
fMaxDist = 50.0
ENDIF
//Move forward at first turn
IF fCurrentPlaybackTime > 8000.0 AND fCurrentPlaybackTime < 12000.0
fIdealDist = 30.0
fMaxDist = 55.0
ENDIF
//At start of dual carriageway: speed up as it's quite easy to overtake
IF fCurrentPlaybackTime > 26000.0 AND fCurrentPlaybackTime < 30000.0
fIdealDist = 13.0
fMaxDist = 45.0
ENDIF
//Two turns before movie lot
IF fCurrentPlaybackTime > 40000.0 AND fCurrentPlaybackTime < 45500.0
fIdealDist = 15.0
fMaxDist = 45.0
ENDIF
IF fCurrentPlaybackTime > 46000.0 AND fCurrentPlaybackTime < 51000.0
fAccel *= 0.7
fIdealDist = 22.0
fMaxDist = 50.0
ENDIF
//Post-movie lot
IF fCurrentPlaybackTime > 60000.0 AND fCurrentPlaybackTime < 64000.0
fAccel *= 0.7
fIdealDist = 22.0
fMaxDist = 50.0
ENDIF
//In the alley: keep a bit of distance.
IF fCurrentPlaybackTime > 65000.0 AND fCurrentPlaybackTime < 70000.0
fAccel *= 0.7
fIdealDist = 15.0
fMaxDist = 50.0
ENDIF
//Just before start of bumpy road
IF fCurrentPlaybackTime > 77500.0 AND fCurrentPlaybackTime < 81500.0
fIdealDist = 18.0
fMaxDist = 45.0
ENDIF
//Just before splash screen (Lamar gets a little close)
IF fCurrentPlaybackTime > 83500.0 AND fCurrentPlaybackTime < 87500.0
fAccel *= 0.7
fIdealDist = 20.0
fMaxDist = 45.0
ENDIF
//After bumps: speed him up, slow down accel a bit as the speed up is obvious.
IF fCurrentPlaybackTime > 87500.0 AND fCurrentPlaybackTime < 98500.0
fAccel *= 0.7
fIdealDist = 25.0
fMaxDist = 50.0
ENDIF
//Before police station turn
IF fCurrentPlaybackTime > 108000.0 AND fCurrentPlaybackTime < 113500.0
fAccel *= 0.7
fIdealDist = 22.0
fMaxDist = 50.0
ENDIF
//Before bus turn
IF fCurrentPlaybackTime > 119000.0 AND fCurrentPlaybackTime < 121500.0
fIdealDist = 25.0
fMaxDist = 50.0
ENDIF
//Before car park turn: speed him up a bit
IF fCurrentPlaybackTime > 122000.0 AND fCurrentPlaybackTime < 125000.0
fIdealDist = 15.0
fMaxDist = 45.0
ENDIF
//During car park: stop him getting too far away.
IF fCurrentPlaybackTime > 126000.0 AND fCurrentPlaybackTime < 131500.0
fIdealDist = 11.0
fMaxDist = 30.0
fSuperMaxDist = 60.0
ENDIF
//Just after car park: speed up a little
IF fCurrentPlaybackTime > 131500.0 AND fCurrentPlaybackTime < 137700.0
fAccel *= 0.7
fIdealDist = 12.0
fMaxDist = 45.0
ENDIF
//Final section: speed up Lamar, player can possibly overtake at this bit, but try to keep him close.
IF fCurrentPlaybackTime > 140900.0 AND fCurrentPlaybackTime < 144600.0
fIdealDist = 15.0
fMaxDist = 30.0
ENDIF
//Slow down just before the cutscene trigger (TODO 274875)
IF fCurrentPlaybackTime > 145600.0 AND fCurrentPlaybackTime < 149400.0
fIdealDist = 8.0
fMaxDist = 20.0
fSuperMaxDist = 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.5 * fDistRatio) //0.5 - (0.3 * fDistRatio)
ENDIF
fPlayersSpeedModifier *= 0.5
ELIF fDist > fIdealDist
//Player is somewhat behind, slow the trigger car down relative to how far behind the player is.
fDistRatio = ((fDist - fIdealDist) / (fMaxDist - fIdealDist))
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 = (fIdealDist - fDist) / (fIdealDist - 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
//Special cases where desired speed is forced to a specific value.
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vehPlayer)
fDesiredPlaybackSpeed = 1.0
ENDIF
IF fCurrentPlaybackTime < 19000.0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-2013.521484,-410.929047,10.103262>>, <<-2005.116699,-399.659576,15.681062>>, 14.000000)
IF fDesiredPlaybackSpeed < 1.0
fDesiredPlaybackSpeed = 1.0
ENDIF
ENDIF
ENDIF
//Fix for 504332: if the player tries to take a shortcut down the alley make sure Lamar isn't slowed down.
IF fCurrentPlaybackTime > 65000.0 AND fCurrentPlaybackTime < 78000.0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1327.701172,-648.209534,35.882713>>, <<-1196.130981,-817.147583,13.715324>>, 33.750000)
IF fCurrentPlaybackTime < 75000.0
fDesiredPlaybackSpeed = 1.5
ELSE
fDesiredPlaybackSpeed = 1.2
ENDIF
ENDIF
ENDIF
//For the jump section don't allow the car speed to go too low.
IF fCurrentPlaybackTime > 86500.0 AND fCurrentPlaybackTime < 96500.0
IF fDesiredPlaybackSpeed < 0.7
fDesiredPlaybackSpeed = 0.7
ENDIF
ENDIF
//Don't do any slowdown after going past the cutscene trigger.
IF fCurrentPlaybackTime > GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iCarrecMain, strCarrec) - 4000.0
IF fDesiredPlaybackSpeed < 1.0
fDesiredPlaybackSpeed = 1.0
ENDIF
ELIF fCurrentPlaybackTime > 137400.0
//Cap the max speed during the final tunnels: this gives the player the chance to overtake.
IF fDesiredPlaybackSpeed > 1.0
fDesiredPlaybackSpeed = 1.0
ENDIF
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
//Modify the player's speed further based on the desired speed.
IF fDesiredPlaybackSpeed > 1.0
fPlayersSpeedModifier = fPlayersSpeedModifier - ((fDesiredPlaybackSpeed - 1.0) * 10.0)
ENDIF
//Make the speed changes.
MODIFY_VEHICLE_TOP_SPEED(sMainCars[iPlayersCar].veh, fPlayersSpeedModifier)
fCurrentSpeed = fCurrentSpeed +@ (((fDesiredPlaybackSpeed - fCurrentSpeed) * fAccel) * 30.0)
#IF IS_DEBUG_BUILD
IF bDebugShowChaseStats
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
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)
SET_TEXT_DROP_SHADOW()
TEXT_LABEL_63 strDesiredSpeed = "Desired playback speed: "
strDesiredSpeed += GET_STRING_FROM_FLOAT(fDesiredPlaybackSpeed)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.15, "STRING", strDesiredSpeed)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
TEXT_LABEL_63 strSpeed = "Playback speed: "
strSpeed += GET_STRING_FROM_FLOAT(fCurrentSpeed)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.2, "STRING", strSpeed)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
TEXT_LABEL_63 strTime = "Time: "
strTime += GET_STRING_FROM_FLOAT(fCurrentPlaybackTime)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.25, "STRING", strTime)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
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.3, "STRING", strDiff)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
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.35, "STRING", strState)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
TEXT_LABEL_63 strAccel = "Accel: "
strAccel += GET_STRING_FROM_FLOAT(fAccel)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.4, "STRING", strAccel)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
TEXT_LABEL_63 strModifier = "Player speed % modifier: "
strModifier += GET_STRING_FROM_FLOAT(fPlayersSpeedModifier)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.45, "STRING", strModifier)
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_DROP_SHADOW()
TEXT_LABEL_63 strDuration = "Total duration: "
strDuration += GET_STRING_FROM_FLOAT(GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iCarrecMain, strCarrec))
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.5, "STRING", strDuration)
ENDIF
#ENDIF
ENDIF
ENDPROC
//Lamar's vehicle lights are forced on at difficult turns
PROC MANAGE_LAMARS_CAR_LIGHTS(VEHICLE_INDEX &veh, FLOAT fPlaybackTime)
IF IS_VEHICLE_DRIVEABLE(veh)
#IF IS_DEBUG_BUILD
BOOL bBrakesOn = FALSE
BOOL bLeftIndicatorOn = FALSE
BOOL bRightIndicatorOn = FALSE
#ENDIF
//Brake lights
IF (fPlaybackTime > 10000.0 AND fPlaybackTime < 12500.0)
OR (fPlaybackTime > 23000.0 AND fPlaybackTime < 25000.0)
OR (fPlaybackTime > 42500.0 AND fPlaybackTime < 45000.0)
OR (fPlaybackTime > 48000.0 AND fPlaybackTime < 50500.0)
OR (fPlaybackTime > 60500.0 AND fPlaybackTime < 63500.0)
OR (fPlaybackTime > 78750.0 AND fPlaybackTime < 80500.0)
OR (fPlaybackTime > 95750.0 AND fPlaybackTime < 98000.0)
OR (fPlaybackTime > 110750.0 AND fPlaybackTime < 113000.0)
OR (fPlaybackTime > 119000.0 AND fPlaybackTime < 121000.0)
OR (fPlaybackTime > 123750.0 AND fPlaybackTime < 126000.0)
SET_VEHICLE_BRAKE_LIGHTS(veh, TRUE)
#IF IS_DEBUG_BUILD
bBrakesOn = TRUE
#ENDIF
ENDIF
//Right indicator
IF (fPlaybackTime > 10000.0 AND fPlaybackTime < 12500.0)
OR (fPlaybackTime > 42500.0 AND fPlaybackTime < 45000.0)
OR (fPlaybackTime > 48000.0 AND fPlaybackTime < 51000.0)
OR (fPlaybackTime > 71250.0 AND fPlaybackTime < 73200.0)
OR (fPlaybackTime > 74250.0 AND fPlaybackTime < 76000.0)
OR (fPlaybackTime > 110750.0 AND fPlaybackTime < 113500.0)
OR (fPlaybackTime > 119000.0 AND fPlaybackTime < 121250.0)
SET_VEHICLE_INDICATOR_LIGHTS(veh, FALSE, TRUE)
#IF IS_DEBUG_BUILD
bRightIndicatorOn = TRUE
#ENDIF
ELSE
SET_VEHICLE_INDICATOR_LIGHTS(veh, FALSE, FALSE)
ENDIF
//Left indicator
IF (fPlaybackTime > 23000.0 AND fPlaybackTime < 25000.0)
OR (fPlaybackTime > 61000.0 AND fPlaybackTime < 64000.0)
OR (fPlaybackTime > 78500.0 AND fPlaybackTime < 81000.0)
OR (fPlaybackTime > 95750.0 AND fPlaybackTime < 98500.0)
OR (fPlaybackTime > 115000.0 AND fPlaybackTime < 115750.0)
OR (fPlaybackTime > 123500.0 AND fPlaybackTime < 126500.0)
SET_VEHICLE_INDICATOR_LIGHTS(veh, TRUE, TRUE)
#IF IS_DEBUG_BUILD
bLeftIndicatorOn = TRUE
#ENDIF
ELSE
SET_VEHICLE_INDICATOR_LIGHTS(veh, TRUE, FALSE)
ENDIF
#IF IS_DEBUG_BUILD
IF bBrakesOn
DRAW_STRING_TO_DEBUG_DISPLAY("BRAKES ON")
ENDIF
IF bLeftIndicatorOn
DRAW_STRING_TO_DEBUG_DISPLAY("LEFT INDICATOR ON")
ENDIF
IF bRightIndicatorOn
DRAW_STRING_TO_DEBUG_DISPLAY("RIGHT INDICATOR ON")
ENDIF
#ENDIF
ENDIF
ENDPROC
PROC CHANGE_ACTION_CAM_ANGLE(VEHICLE_INDEX vehCamCar, INT iNewCamRec, FLOAT fPlaybackTime)
IF IS_VEHICLE_DRIVEABLE(vehCamCar)
STOP_PLAYBACK_RECORDED_VEHICLE(vehCamCar)
START_PLAYBACK_RECORDED_VEHICLE(vehCamCar, iNewCamRec, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehCamCar, fPlaybackTime)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehCamCar)
ENDIF
ENDPROC
PROC UPDATE_CHASE_CAM(VEHICLE_INDEX &vehCamCar, CAMERA_INDEX &cam, FLOAT fPlaybackTime)
//The cam FOV has to be updated the frame after setting the new recording
IF fNextActionCamFov != 0.0
SET_CAM_FOV(cam, fNextActionCamFov)
fNextActionCamFov = 0.0
ENDIF
SWITCH iCurrentCinematicCam
CASE 0
IF fPlaybackTime > 0.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[4], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 1
IF fPlaybackTime > 8400.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[5], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 2
IF fPlaybackTime > 11500.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[2], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 3
IF fPlaybackTime > 15000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[4], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 4
IF fPlaybackTime > 19000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[5], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 5
IF fPlaybackTime > 24000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[3], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 6
IF fPlaybackTime > 29000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[4], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 7
IF fPlaybackTime > 32000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[5], fPlaybackTime)
fNextActionCamFov = 38.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 8
IF fPlaybackTime > 38000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[4], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 9
IF fPlaybackTime > 41000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[2], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 10
IF fPlaybackTime > 45500.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[4], fPlaybackTime)
fNextActionCamFov = 32.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 11
IF fPlaybackTime > 48000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[5], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 12
IF fPlaybackTime > 50300.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[2], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 13
IF fPlaybackTime > 56000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[4], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 14
IF fPlaybackTime > 62000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[2], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 15
IF fPlaybackTime > 64500.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[0], fPlaybackTime)
fNextActionCamFov = 31.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 16
IF fPlaybackTime > 70000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[5], fPlaybackTime)
fNextActionCamFov = 35.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 17
IF fPlaybackTime > 72500.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[4], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 18
IF fPlaybackTime > 78500.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[5], fPlaybackTime)
fNextActionCamFov = 34.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 19
IF fPlaybackTime > 86100.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[4], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 20
IF fPlaybackTime > 90000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[3], fPlaybackTime)
fNextActionCamFov = 12.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 21
IF fPlaybackTime > 95000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[5], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 22
IF fPlaybackTime > 98700.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[1], fPlaybackTime)
fNextActionCamFov = 30.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 23
IF fPlaybackTime > 101000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[4], fPlaybackTime)
fNextActionCamFov = 27.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 24
IF fPlaybackTime > 104500.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[3], fPlaybackTime)
fNextActionCamFov = 22.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 25
IF fPlaybackTime > 108500.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[5], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 26
IF fPlaybackTime > 114000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[4], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 27
IF fPlaybackTime > 119000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[3], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 28
IF fPlaybackTime > 122000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[4], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 29
IF fPlaybackTime > 125000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[5], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 30
IF fPlaybackTime > 132500.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[4], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 31
IF fPlaybackTime > 143000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[5], fPlaybackTime)
fNextActionCamFov = 45.0
iCurrentCinematicCam++
ENDIF
BREAK
CASE 32
IF fPlaybackTime > 147000.0
CHANGE_ACTION_CAM_ANGLE(vehCamCar, iCamRecs[4], fPlaybackTime)
fNextActionCamFov = 25.0
iCurrentCinematicCam++
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC DO_CHASE_CAM(VEHICLE_INDEX veh1, VEHICLE_INDEX veh2)
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(vehCameraTest)
REQUEST_MODEL(modelCamCar)
REQUEST_CAM_RECORDING(iCamRecs[0], strCarrec)
REQUEST_CAM_RECORDING(iCamRecs[1], strCarrec)
REQUEST_CAM_RECORDING(iCamRecs[2], strCarrec)
REQUEST_CAM_RECORDING(iCamRecs[3], strCarrec)
REQUEST_CAM_RECORDING(iCamRecs[4], strCarrec)
REQUEST_CAM_RECORDING(iCamRecs[5], strCarrec)
REQUEST_CAM_RECORDING(iCamRecs[6], strCarrec)
IF HAS_MODEL_LOADED(modelCamCar)
AND HAS_CAM_RECORDING_LOADED(iCamRecs[0], strCarrec)
AND HAS_CAM_RECORDING_LOADED(iCamRecs[1], strCarrec)
AND HAS_CAM_RECORDING_LOADED(iCamRecs[2], strCarrec)
AND HAS_CAM_RECORDING_LOADED(iCamRecs[3], strCarrec)
AND HAS_CAM_RECORDING_LOADED(iCamRecs[4], strCarrec)
AND HAS_CAM_RECORDING_LOADED(iCamRecs[5], strCarrec)
AND HAS_CAM_RECORDING_LOADED(iCamRecs[6], strCarrec)
AND NOT IS_INTERPOLATING_FROM_SCRIPT_CAMS() //Don't create the cam until the interp to gameplay from the start cutscene is complete.
vehCameraTest = CREATE_VEHICLE(modelCamCar, GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<0.0, 0.0, 5.0>>)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCamCar)
camChase = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
//SHAKE_CAM(camChase, "SKY_DIVING_SHAKE", 0.1)
SHAKE_CAM(camChase, "HAND_SHAKE", 1.0)
SET_CAM_FOV(camChase, 25.0)
//START_CAM_PLAYBACK(camChase, vehCameraTest, strCarrec, iCamRecs[0])
//NEW CAM: attach to a single recording playing in fron of the trigger.
//ATTACH_CAM_TO_ENTITY(camChase, veh1, <<-1.7329, 6.4243, 0.1649>>)
ATTACH_CAM_TO_ENTITY(camChase, vehCameraTest, <<0.0, 0.0, 0.8>>, FALSE)
SET_ENTITY_COLLISION(vehCameraTest, FALSE)
SET_ENTITY_INVINCIBLE(vehCameraTest, TRUE)
SET_ENTITY_VISIBLE(vehCameraTest, FALSE)
START_PLAYBACK_RECORDED_VEHICLE(vehCameraTest, iCamRecs[6], strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehCameraTest, fCurrentPlaybackTime * 1.4286)
SET_PLAYBACK_SPEED(vehCameraTest, fCurrentPlaybackSpeed * 1.4286)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehCameraTest)
fNextActionCamFov = 0.0
iCurrentCinematicCam = 0
ENDIF
ELSE
IF IS_VEHICLE_DRIVEABLE(vehCameraTest)
//NEW CAM: set playback speed.
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehCameraTest)
SET_PLAYBACK_SPEED(vehCameraTest, fCurrentPlaybackSpeed * 1.4286) //Recorded at 0.7
ENDIF
//UPDATE_CHASE_CAM(vehCameraTest, camChase, fCurrentPlaybackTime)
//UPDATE_CAM_PLAYBACK(camChase, vehCameraTest, fCurrentPlaybackSpeed)
ENDIF
//NEW CAM: point at a coord that's between the trigger and the player, so both appear on screen.
VECTOR vPlayerPos = GET_ENTITY_COORDS(veh2)
VECTOR vTriggerPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh1, <<0.0, 2.0, 0.0>>)
VECTOR vPointPos = vTriggerPos + ((vPlayerPos - vTriggerPos) * 0.5)
STOP_CAM_POINTING(camChase)
POINT_CAM_AT_COORD(camChase, vPointPos)
ENDIF
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
AND fCurrentPlaybackTime > 6500.0 //Don't run during the transition from the chase start cutscene, as it can screw up the interp to game cam.
AND NOT IS_INTERPOLATING_FROM_SCRIPT_CAMS()
#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)
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_CAMHELP")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_HINTHELP")
CLEAR_HELP()
ENDIF
VECTOR v_driver_pos = GET_ENTITY_COORDS(veh2)
VECTOR vTriggerPos = GET_ENTITY_COORDS(veh1)
FLOAT fDist = VDIST2(v_driver_pos, vTriggerPos)
IF fDist < 2500.0 //50m
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(vehCameraTest)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehCameraTest)
IF DOES_CAM_EXIST(camChase)
IF NOT IS_CAM_RENDERING(camChase)
//INFORM_MISSION_STATS_SYSTEM_OF_ACTION_CAM_START()
SET_CAM_ACTIVE(camChase, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
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)
//INFORM_MISSION_STATS_SYSTEM_OF_ACTION_CAM_END()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
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)
//INFORM_MISSION_STATS_SYSTEM_OF_ACTION_CAM_END()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDIF
ENDIF
//Clean up chase cam (NOTE: taken from chase_hint_cam.sch, as it needs to be integrated with the action 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
ENDPROC
/// PURPOSE:
/// Handles additional set-pieces that occur during the main chase (e.g. peds walking)
PROC MANAGE_CHASE_SET_PIECES()
BOOL bCreatedAnEntityThisFrame = FALSE
BOOL bRemovedAnEntityThisFrame = FALSE
//SEQUENCE_INDEX seq
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
VECTOR vLamarPos
IF NOT IS_PED_INJURED(sLamar.ped)
vLamarPos = GET_ENTITY_COORDS(sLamar.ped)
ENDIF
//NOTE: instead of cycling through all setpiece cars, keep constants of the particular setpieces we want to modify. This saves time
//but needs maintenance if the setpiece array is changed for some reason.
CONST_INT PACKER_SETPIECE_1 15
CONST_INT VAN_REVERSE_SETPIECE 33
CONST_INT TRAILER_SETPIECE 28
CONST_INT CYCLIST_SETPIECE_1 9
CONST_INT CYCLIST_SETPIECE_2 10
CONST_INT CYCLIST_SETPIECE_3 11
CONST_INT BUS_SETPIECE 32
CONST_INT LIGHT_TRUCK_SETPIECE 14
CONST_INT HELI_TRAFFIC_ID 91
CONST_INT STOCKADE_PARKED_ID 14
//have the cyclists flee if the player crashes into any of them.
IF NOT bCyclistsSetToFlee
BOOL bSpookedACyclist = FALSE
PED_INDEX pedCyclists[3]
IF NOT IS_ENTITY_DEAD(SetPieceCarID[CYCLIST_SETPIECE_1])
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(SetPieceCarID[CYCLIST_SETPIECE_1], PLAYER_PED_ID())
bSpookedACyclist = TRUE
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(SetPieceCarID[CYCLIST_SETPIECE_2])
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(SetPieceCarID[CYCLIST_SETPIECE_2], PLAYER_PED_ID())
bSpookedACyclist = TRUE
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(SetPieceCarID[CYCLIST_SETPIECE_3])
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(SetPieceCarID[CYCLIST_SETPIECE_3], PLAYER_PED_ID())
bSpookedACyclist = TRUE
ENDIF
ENDIF
If bSpookedACyclist
IF NOT IS_ENTITY_DEAD(SetPieceCarID[CYCLIST_SETPIECE_1])
pedCyclists[0] = GET_PED_IN_VEHICLE_SEAT(SetPieceCarID[CYCLIST_SETPIECE_1])
IF NOT IS_PED_INJURED(pedCyclists[0])
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[CYCLIST_SETPIECE_1])
STOP_PLAYBACK_RECORDED_VEHICLE(SetPieceCarID[CYCLIST_SETPIECE_1])
ENDIF
TASK_VEHICLE_MISSION_PED_TARGET(pedCyclists[0], SetPieceCarID[CYCLIST_SETPIECE_1], PLAYER_PED_ID(), MISSION_FLEE, 70.0, DRIVINGMODE_AVOIDCARS_RECKLESS, 300.0, 300.0, TRUE)
SET_PED_KEEP_TASK(pedCyclists[0], TRUE)
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(SetPieceCarID[CYCLIST_SETPIECE_2])
pedCyclists[1] = GET_PED_IN_VEHICLE_SEAT(SetPieceCarID[CYCLIST_SETPIECE_2])
IF NOT IS_PED_INJURED(pedCyclists[1])
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[CYCLIST_SETPIECE_2])
STOP_PLAYBACK_RECORDED_VEHICLE(SetPieceCarID[CYCLIST_SETPIECE_2])
ENDIF
TASK_VEHICLE_MISSION_PED_TARGET(pedCyclists[1], SetPieceCarID[CYCLIST_SETPIECE_2], PLAYER_PED_ID(), MISSION_FLEE, 70.0, DRIVINGMODE_AVOIDCARS_RECKLESS, 300.0, 300.0, TRUE)
SET_PED_KEEP_TASK(pedCyclists[1], TRUE)
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(SetPieceCarID[CYCLIST_SETPIECE_3])
pedCyclists[2] = GET_PED_IN_VEHICLE_SEAT(SetPieceCarID[CYCLIST_SETPIECE_3])
IF NOT IS_PED_INJURED(pedCyclists[2])
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[CYCLIST_SETPIECE_3])
STOP_PLAYBACK_RECORDED_VEHICLE(SetPieceCarID[CYCLIST_SETPIECE_3])
ENDIF
TASK_VEHICLE_MISSION_PED_TARGET(pedCyclists[2], SetPieceCarID[CYCLIST_SETPIECE_3], PLAYER_PED_ID(), MISSION_FLEE, 70.0, DRIVINGMODE_AVOIDCARS_RECKLESS, 300.0, 300.0, TRUE)
SET_PED_KEEP_TASK(pedCyclists[2], TRUE)
ENDIF
ENDIF
bCyclistsSetToFlee = TRUE
ENDIF
ENDIF
//Cyclist rings bell when player drives past.
IF SetPieceCarModel[CYCLIST_SETPIECE_1] = CRUISER
IF NOT IS_ENTITY_DEAD(SetPieceCarID[CYCLIST_SETPIECE_1])
IF NOT bPlayedCyclistBellSound
IF VDIST2(GET_ENTITY_COORDS(SetPieceCarID[CYCLIST_SETPIECE_1]), vPlayerPos) < 100.0
PLAY_SOUND_FROM_ENTITY(-1, "Bike_Bell", SetPieceCarID[CYCLIST_SETPIECE_1], "ARM_1_SOUNDSET")
bPlayedCyclistBellSound = TRUE
ENDIF
ENDIF
ELSE
bPlayedCyclistBellSound = FALSE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("Armenian 1 - Cyclist setpiece has changed ID, please update script to match.")
#ENDIF
ENDIF
//First packer set-piece: just drives by
IF SetPieceCarModel[PACKER_SETPIECE_1] = PACKER
IF SetPieceCarProgress[PACKER_SETPIECE_1] < 99
AND fCurrentPlaybackTime < SetPieceCarStartime[PACKER_SETPIECE_1] + 10000.0
IF fCurrentPlaybackTime > SetPieceCarStartime[PACKER_SETPIECE_1] - 10000.0
AND NOT DOES_ENTITY_EXIST(vehTanker)
REQUEST_MODEL(TANKER)
ENDIF
REQUEST_VEHICLE_RECORDING(CARREC_TRAILER_2, strCarrec)
ENDIF
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[PACKER_SETPIECE_1])
IF NOT DOES_ENTITY_EXIST(vehTanker)
IF fCurrentPlaybackTime < SetPieceCarStartime[PACKER_SETPIECE_1] + 10000.0
REQUEST_MODEL(TANKER)
IF HAS_MODEL_LOADED(TANKER)
AND NOT bCreatedAnEntityThisFrame
vehTanker = CREATE_VEHICLE(TANKER, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(SetPieceCarID[PACKER_SETPIECE_1], <<0.0, -10.0, 0.0>>),
GET_ENTITY_HEADING(SetPieceCarID[PACKER_SETPIECE_1]))
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehTanker, TRUE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(SetPieceCarID[PACKER_SETPIECE_1], TRUE)
ATTACH_VEHICLE_TO_TRAILER(SetPieceCarID[PACKER_SETPIECE_1], vehTanker)
SET_MODEL_AS_NO_LONGER_NEEDED(TANKER)
bCreatedAnEntityThisFrame = TRUE
ENDIF
ENDIF
ELSE
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[PACKER_SETPIECE_1])
//Control trailer playback.
IF NOT IS_ENTITY_DEAD(vehTanker)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehTanker)
REQUEST_VEHICLE_RECORDING(CARREC_TRAILER_2, strCarrec)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_TRAILER_2, strCarrec)
START_PLAYBACK_RECORDED_VEHICLE(vehTanker, CARREC_TRAILER_2, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehTanker, GET_TIME_POSITION_IN_RECORDING(SetPieceCarID[PACKER_SETPIECE_1]))
ENDIF
ELSE
SET_PLAYBACK_SPEED(vehTanker, fCurrentPlaybackSpeed)
ENDIF
ENDIF
//Truck horn: activates when the player gets close
IF NOT bTruckHornActivated
AND (VDIST2(vPlayerPos, GET_ENTITY_COORDS(SetPieceCarID[PACKER_SETPIECE_1])) < 625.0 //25m
OR VDIST2(vLamarPos, GET_ENTITY_COORDS(SetPieceCarID[PACKER_SETPIECE_1])) < 400.0) //20m
START_VEHICLE_HORN(SetPieceCarID[PACKER_SETPIECE_1], 3000, HASH("HELDDOWN"))
bTruckHornActivated = TRUE
ENDIF
ELSE
//Clean up as soon as possible to save memory
IF fCurrentPlaybackTime > SetPieceCarStartime[PACKER_SETPIECE_1] + 10000.0
AND (NOT IS_ENTITY_ON_SCREEN(SetPieceCarID[PACKER_SETPIECE_1]) OR NOT IS_PLAYER_CONTROL_ON(PLAYER_ID()))
REMOVE_VEHICLE(SetPieceCarID[PACKER_SETPIECE_1])
REMOVE_VEHICLE(vehTanker)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(SetPieceCarID[PACKER_SETPIECE_1])
IF DOES_ENTITY_EXIST(vehTanker)
REMOVE_VEHICLE(vehTanker)
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("Armenian 1 - First packer setpiece has changed ID, please update script to match.")
#ENDIF
ENDIF
//Bus horn
IF SetPieceCarModel[BUS_SETPIECE] = BUS
IF NOT IS_ENTITY_DEAD(SetPieceCarID[BUS_SETPIECE])
IF VDIST2(vPlayerPos, GET_ENTITY_COORDS(SetPieceCarID[BUS_SETPIECE])) < 900.0 //30m
IF NOT bBusHornActivated
START_VEHICLE_HORN(SetPieceCarID[BUS_SETPIECE], 3000, HASH("HELDDOWN"))
IF iBusLightsTimer = 0
SET_VEHICLE_LIGHTS(SetPieceCarID[BUS_SETPIECE], FORCE_VEHICLE_LIGHTS_ON)
iBusLightsTimer = GET_GAME_TIMER()
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(2.0, 2.0, REPLAY_IMPORTANCE_NORMAL) //Record footage of the player passing the bus.
bBusHornActivated = TRUE
ENDIF
ENDIF
//Turn the lights off after 2 seconds
IF bBusHornActivated AND iBusLightsTimer != 0
IF GET_GAME_TIMER() - iBusLightsTimer > 2000
SET_VEHICLE_LIGHTS(SetPieceCarID[BUS_SETPIECE], FORCE_VEHICLE_LIGHTS_OFF)
iBusLightsTimer = 0
ENDIF
ENDIF
ELSE
bBusHornActivated = FALSE
iBusLightsTimer = 0
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("Armenian 1 - bus setpiece has changed ID, please update script to match.")
#ENDIF
ENDIF
IF SetPieceCarModel[VAN_REVERSE_SETPIECE] = BURRITO3
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[VAN_REVERSE_SETPIECE])
//NG 1651537 - Override the colour.
IF NOT bOverriddenVanColour
SET_VEHICLE_COLOURS(SetPieceCarID[VAN_REVERSE_SETPIECE], 111, 111)
SET_VEHICLE_EXTRA_COLOURS(SetPieceCarID[VAN_REVERSE_SETPIECE], 111, 111)
bOverriddenVanColour = TRUE
ENDIF
//Van horn
IF VDIST2(vPlayerPos, GET_ENTITY_COORDS(SetPieceCarID[VAN_REVERSE_SETPIECE])) < 100.0
IF NOT bVanHornActivated
START_VEHICLE_HORN(SetPieceCarID[VAN_REVERSE_SETPIECE], 2000, HASH("HELDDOWN"))
bVanHornActivated = TRUE
ENDIF
ENDIF
ELSE
bVanHornActivated = FALSE
bOverriddenVanColour = FALSE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("Armenian 1 - van setpiece has changed ID, please update script to match.")
#ENDIF
ENDIF
//Request: change one of the trucks colours to make it stand out
IF SetPieceCarModel[LIGHT_TRUCK_SETPIECE] = BENSON
IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[LIGHT_TRUCK_SETPIECE])
IF NOT bChangedTruckColour
SET_VEHICLE_COLOURS(SetPieceCarID[LIGHT_TRUCK_SETPIECE], 4, 4)
SET_VEHICLE_EXTRA_COLOURS(SetPieceCarID[LIGHT_TRUCK_SETPIECE], 4, 4)
bChangedTruckColour = TRUE
ENDIF
ELSE
bChangedTruckColour = FALSE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("Armenian 1 - Light truck setpiece has changed ID, please update script to match.")
#ENDIF
ENDIF
//Helicopter: make sure the rotor blades are turning, also force colour (TODO 486984)
IF TrafficCarModel[HELI_TRAFFIC_ID] = MAVERICK
IF IS_VEHICLE_DRIVEABLE(TrafficCarID[HELI_TRAFFIC_ID])
IF NOT bTrafficHeliRotorsOn
SET_VEHICLE_ENGINE_ON(TrafficCarID[HELI_TRAFFIC_ID], TRUE, TRUE)
SET_HELI_BLADES_FULL_SPEED(TrafficCarID[HELI_TRAFFIC_ID])
SET_VEHICLE_COLOURS(TrafficCarID[HELI_TRAFFIC_ID], 128, 0)
SET_VEHICLE_EXTRA_COLOURS(TrafficCarID[HELI_TRAFFIC_ID], 128, 0)
bTrafficHeliRotorsOn = TRUE
ENDIF
ELSE
bTrafficHeliRotorsOn = FALSE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("Armenian 1 - Helicopter traffic has changed ID, please update script to match.")
#ENDIF
ENDIF
//Studio set-piece: Aliens
//For component variations, 0 = alien, 1 = normal.
INT i = 0
BOOL bCheckedTrigger = FALSE
BOOL bTriggerAliens = FALSE
BOOL bPlayAliensDialogue = FALSE
FLOAT fDistFromPlayer = 0.0
VECTOR vInitialOffset
VECTOR vInitialRotation
TEXT_LABEL_63 strLoopAnim
TEXT_LABEL_63 strRunAnim
MODEL_NAMES modelFilmCrew = S_M_M_MOVALIEN_01
IF fCurrentPlaybackTime < 43000.0
REPEAT COUNT_OF(sAliens) i
sAliens[i].iEvent = 0
ENDREPEAT
REPEAT COUNT_OF(sAliensGroup2) i
sAliensGroup2[i].iEvent = 0
ENDREPEAT
ELSE
REPEAT COUNT_OF(sAliens) i
IF i = 0
strRunAnim = "largegroup_flee_r_f_a"
ELIF i = 1
strRunAnim = "largegroup_flee_l_f_b"
ELIF i = 2
strRunAnim = "largegroup_flee_l_m_c"
ELIF i = 3
strRunAnim = "largegroup_flee_r_m_d"
ENDIF
IF sAliens[i].iEvent = 0
IF fCurrentPlaybackTime < 55000.0
REQUEST_MODEL(modelFilmCrew)
REQUEST_ANIM_DICT(strAlienAnims)
IF HAS_MODEL_LOADED(modelFilmCrew)
AND HAS_ANIM_DICT_LOADED(strAlienAnims)
AND NOT bCreatedAnEntityThisFrame //Only create one entity per frame (to fix huge peaks in CPU usage)
IF i = 0
strLoopAnim = "largegroup_loop_f_a"
ELIF i = 1
strLoopAnim = "largegroup_loop_f_b"
ELIF i = 2
strLoopAnim = "largegroup_loop_m_c"
ELIF i = 3
strLoopAnim = "largegroup_loop_m_d"
ENDIF
vInitialOffset = GET_ANIM_INITIAL_OFFSET_POSITION(strAlienAnims, strLoopAnim, <<-1107.37, -504.73, 34.36>>, <<0.000, 0.000, 32.200>>)
vInitialRotation = GET_ANIM_INITIAL_OFFSET_ROTATION(strAlienAnims, strLoopAnim, <<-1107.37, -504.73, 34.36>>, <<0.000, 0.000, 32.200>>)
sAliens[i].ped = CREATE_PED(PEDTYPE_MISSION, modelFilmCrew, vInitialOffset, vInitialRotation.z)
SET_ENTITY_COORDS_NO_OFFSET(sAliens[i].ped, vInitialOffset)
TASK_PLAY_ANIM(sAliens[i].ped, strAlienAnims, strLoopAnim, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
FREEZE_ENTITY_POSITION(sAliens[i].ped, TRUE)
SET_ENTITY_COLLISION(sAliens[i].ped, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sAliens[i].ped, TRUE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sAliens[i].ped, TRUE) // rob - 2117273 - ensure player doesn't fail this stat unfairly
//Add some of them for dialogue
IF i = 2
ADD_PED_FOR_DIALOGUE(sConversationPeds, 2, sAliens[i].ped, "EXTRA1")
ELIF i = 3
SET_MODEL_AS_NO_LONGER_NEEDED(modelFilmCrew)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 3, sAliens[i].ped, "EXTRA2")
ENDIF
//Randomise the outfits so some have alien heads/hands and some don't.
SET_PED_COMPONENT_VARIATION(sAliens[i].ped, PED_COMP_LEG, 0, 0)
SET_PED_COMPONENT_VARIATION(sAliens[i].ped, PED_COMP_TORSO, 0, 0)
IF i % 2 = 0
SET_PED_COMPONENT_VARIATION(sAliens[i].ped, PED_COMP_HEAD, 1, 0)
SET_PED_COMPONENT_VARIATION(sAliens[i].ped, PED_COMP_HAND, 1, 0)
ELSE
SET_PED_COMPONENT_VARIATION(sAliens[i].ped, PED_COMP_HEAD, 0, 0)
SET_PED_COMPONENT_VARIATION(sAliens[i].ped, PED_COMP_HAND, 0, 0)
ENDIF
sAliens[i].iEvent = 1
sAliens[i].iTimer = 0
bCreatedAnEntityThisFrame = TRUE
ENDIF
ENDIF
ELSE
IF NOT IS_PED_INJURED(sAliens[i].ped)
fDistFromPlayer = VDIST2(vPlayerPos, GET_ENTITY_COORDS(sAliens[i].ped))
IF fDistFromPlayer < 1600.0
bPlayAliensDialogue = TRUE
ENDIF
IF sAliens[i].iEvent = 1
FLOAT fTimeForPlayerToReachAliens, fTimeForLamarToReachAliens
IF NOT bCheckedTrigger
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
AND IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
fTimeForPlayerToReachAliens = VDIST(vPlayerPos, GET_ENTITY_COORDS(sAliens[i].ped)) / GET_ENTITY_SPEED(sMainCars[iPlayersCar].veh)
fTimeForLamarToReachAliens = VDIST(vLamarPos, GET_ENTITY_COORDS(sAliens[i].ped)) / GET_ENTITY_SPEED(sMainCars[iBuddiesCar].veh)
IF fTimeForPlayerToReachAliens < 2.0
bTriggerAliens = TRUE
ELIF fTimeForLamarToReachAliens < 3.0
IF fCurrentPlaybackSpeed > 0.7
bTriggerAliens = TRUE
ENDIF
ENDIF
bCheckedTrigger = TRUE
ENDIF
ENDIF
IF bTriggerAliens
FREEZE_ENTITY_POSITION(sAliens[i].ped, FALSE)
SET_ENTITY_COLLISION(sAliens[i].ped, TRUE)
IF i = 0
//Record footage of the player driving into the aliens.
// IF fTimeForPlayerToReachAliens < 3.0
// REPLAY_RECORD_BACK_FOR_TIME(2.5, 2.5, REPLAY_IMPORTANCE_HIGHEST)
// ENDIF
TASK_PLAY_ANIM(sAliens[i].ped, strAlienAnims, strRunAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE, 0.05)
ELIF i = 1
TASK_PLAY_ANIM(sAliens[i].ped, strAlienAnims, strRunAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE, 0.05)
ELIF i = 2
TASK_PLAY_ANIM(sAliens[i].ped, strAlienAnims, strRunAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE, 0.05)
ELIF i = 3
TASK_PLAY_ANIM(sAliens[i].ped, strAlienAnims, strRunAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE, 0.05)
ENDIF
sAliens[i].iEvent++
ENDIF
ELIF sAliens[i].iEvent = 2
IF IS_PED_RAGDOLL(sAliens[i].ped)
sAliens[i].iEvent = 100
ELSE
IF NOT IS_ENTITY_PLAYING_ANIM(sAliens[i].ped, strAlienAnims, strRunAnim)
OR GET_ENTITY_SPEED(sAliens[i].ped) < 0.1
IF VDIST2(GET_ENTITY_COORDS(sAliens[i].ped), vPlayerPos) < 100.0
sAliens[i].iEvent = 100
ENDIF
ENDIF
ENDIF
ELIF sAliens[i].iEvent = 100
IF GET_SCRIPT_TASK_STATUS(sAliens[i].ped, SCRIPT_TASK_SMART_FLEE_PED) != PERFORMING_TASK
TASK_SMART_FLEE_PED(sAliens[i].ped, PLAYER_PED_ID(), 200.0, -1)
SET_PED_KEEP_TASK(sAliens[i].ped, TRUE)
ENDIF
ENDIF
ELSE
IF sConversationPeds.PedInfo[2].Index = sAliens[i].ped
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 2)
ELIF sConversationPeds.PedInfo[3].Index = sAliens[i].ped
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 3)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sAliens[i].ped)
IF (fCurrentPlaybackTime > 64000.0 OR NOT IS_PLAYER_CONTROL_ON(PLAYER_ID()))
AND NOT bRemovedAnEntityThisFrame
IF NOT IS_PED_INJURED(sAliens[i].ped)
TASK_SMART_FLEE_PED(sAliens[i].ped, PLAYER_PED_ID(), 200.0, -1)
SET_PED_KEEP_TASK(sAliens[i].ped, TRUE)
ENDIF
REMOVE_PED(sAliens[i].ped, FALSE)
bRemovedAnEntityThisFrame = TRUE
ENDIF
ELIF i = 0
IF eMissionStage = STAGE_CHASE_MID_POINT
REMOVE_ANIM_DICT(strAlienAnims)
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF bPlayAliensDialogue
AND NOT bHasTextLabelTriggered[ARM1_EXTRAS2]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT IS_PED_INJURED(sConversationPeds.PedInfo[2].Index)
AND NOT IS_PED_INJURED(sConversationPeds.PedInfo[3].Index)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_EXTRAS2", "ARM1_EXTRAS2_1", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(2.5, 4.5, REPLAY_IMPORTANCE_HIGH)
bHasTextLabelTriggered[ARM1_EXTRAS2] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
bCheckedTrigger = FALSE
bTriggerAliens = FALSE
//Another pair of aliens further down.
REPEAT COUNT_OF(sAliensGroup2) i
IF sAliensGroup2[i].iEvent = 0
IF fCurrentPlaybackTime < 55000.0
REQUEST_MODEL(modelFilmCrew)
REQUEST_ANIM_DICT(strAlienAnims)
IF HAS_MODEL_LOADED(modelFilmCrew)
AND HAS_ANIM_DICT_LOADED(strAlienAnims)
AND NOT bCreatedAnEntityThisFrame //Only create one entity per frame (to fix huge peaks in CPU usage)
IF i = 0
strLoopAnim = "smallgroup_loop_f_a"
ELIF i = 1
strLoopAnim = "smallgroup_loop_m_b"
ENDIF
vInitialOffset = GET_ANIM_INITIAL_OFFSET_POSITION(strAlienAnims, strLoopAnim, <<-1139.247, -524.062, 32.021>>, <<0.000, 0.000, 20.000>>)
vInitialRotation = GET_ANIM_INITIAL_OFFSET_ROTATION(strAlienAnims, strLoopAnim, <<-1139.247, -524.062, 32.021>>, <<0.000, 0.000, 20.000>>)
sAliensGroup2[i].ped = CREATE_PED(PEDTYPE_MISSION, modelFilmCrew, vInitialOffset, vInitialRotation.z)
SET_ENTITY_COORDS_NO_OFFSET(sAliensGroup2[i].ped, vInitialOffset)
TASK_PLAY_ANIM(sAliensGroup2[i].ped, strAlienAnims, strLoopAnim, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
FREEZE_ENTITY_POSITION(sAliensGroup2[i].ped, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sAliensGroup2[i].ped, TRUE)
//Add some of them for dialogue
IF i = 1
SET_MODEL_AS_NO_LONGER_NEEDED(modelFilmCrew)
ENDIF
//Randomise the outfits so some have alien heads/hands and some don't.
SET_PED_COMPONENT_VARIATION(sAliensGroup2[i].ped, PED_COMP_LEG, 0, 0)
SET_PED_COMPONENT_VARIATION(sAliensGroup2[i].ped, PED_COMP_TORSO, 0, 0)
IF i % 2 = 0
SET_PED_COMPONENT_VARIATION(sAliensGroup2[i].ped, PED_COMP_HEAD, 1, 0)
SET_PED_COMPONENT_VARIATION(sAliensGroup2[i].ped, PED_COMP_HAND, 1, 0)
ELSE
SET_PED_COMPONENT_VARIATION(sAliensGroup2[i].ped, PED_COMP_HEAD, 0, 0)
SET_PED_COMPONENT_VARIATION(sAliensGroup2[i].ped, PED_COMP_HAND, 0, 0)
ENDIF
sAliensGroup2[i].iEvent = 1
sAliensGroup2[i].iTimer = 0
bCreatedAnEntityThisFrame = TRUE
ENDIF
ENDIF
ELSE
IF NOT IS_PED_INJURED(sAliensGroup2[i].ped)
IF i = 0
strRunAnim = "smallgroup_flee_f_a"
ELIF i = 1
strRunAnim = "smallgroup_flee_m_b"
ENDIF
IF sAliensGroup2[i].iEvent = 1
IF NOT bCheckedTrigger
AND IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
FLOAT fTimeToReachAliens = VDIST(vPlayerPos, GET_ENTITY_COORDS(sAliensGroup2[i].ped)) / GET_ENTITY_SPEED(sMainCars[iPlayersCar].veh)
bTriggerAliens = fTimeToReachAliens < 1.8
bCheckedTrigger = TRUE
ENDIF
IF bTriggerAliens
FREEZE_ENTITY_POSITION(sAliensGroup2[i].ped, FALSE)
TASK_PLAY_ANIM(sAliensGroup2[i].ped, strAlienAnims, strRunAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE, 0.05)
sAliensGroup2[i].iEvent++
ENDIF
ELIF sAliensGroup2[i].iEvent = 2
IF IS_PED_RAGDOLL(sAliensGroup2[i].ped)
sAliensGroup2[i].iEvent = 100
ELSE
IF NOT IS_ENTITY_PLAYING_ANIM(sAliensGroup2[i].ped, strAlienAnims, strRunAnim)
IF VDIST2(GET_ENTITY_COORDS(sAliensGroup2[i].ped), vPlayerPos) < 100.0
sAliens[i].iEvent = 100
ENDIF
ELSE
SET_ENTITY_ANIM_SPEED(sAliensGroup2[i].ped, strAlienAnims, strRunAnim, 0.95)
ENDIF
ENDIF
ELIF sAliens[i].iEvent = 100
IF GET_SCRIPT_TASK_STATUS(sAliensGroup2[i].ped, SCRIPT_TASK_SMART_FLEE_PED) != PERFORMING_TASK
TASK_SMART_FLEE_PED(sAliensGroup2[i].ped, PLAYER_PED_ID(), 200.0, -1)
SET_PED_KEEP_TASK(sAliensGroup2[i].ped, TRUE)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sAliensGroup2[i].ped)
AND (fCurrentPlaybackTime > 64000.0 OR NOT IS_PLAYER_CONTROL_ON(PLAYER_ID()))
AND NOT bRemovedAnEntityThisFrame
IF NOT IS_PED_INJURED(sAliensGroup2[i].ped)
TASK_SMART_FLEE_PED(sAliensGroup2[i].ped, PLAYER_PED_ID(), 200.0, -1)
SET_PED_KEEP_TASK(sAliensGroup2[i].ped, TRUE)
ENDIF
REMOVE_PED(sAliensGroup2[i].ped, FALSE)
bRemovedAnEntityThisFrame = TRUE
ENDIF
ENDIF
ENDREPEAT
ENDIF
//Track stat for hitting any of the alien peds.
INT iUnarmedHits1, iUnarmedHits2, iUnarmedHits3, iUnarmedHitsTotal
STAT_GET_INT(SP0_KILLS, iUnarmedHits1)
STAT_GET_INT(SP1_KILLS, iUnarmedHits2)
STAT_GET_INT(SP2_KILLS, iUnarmedHits3)
iUnarmedHitsTotal = iUnarmedHits1 + iUnarmedHits2 + iUnarmedHits3
IF NOT bAliensStatHasBeenSet
AND sAliens[0].iEvent > 0
IF iUnarmedHitsTotal > iPrevUnarmedHits
PED_INDEX pedNearby[4]
GET_PED_NEARBY_PEDS(PLAYER_PED_ID(), pedNearby)
REPEAT COUNT_OF(pedNearby) i
IF DOES_ENTITY_EXIST(pedNearby[i])
IF GET_ENTITY_MODEL(pedNearby[i]) = modelFilmCrew
IF IS_PED_INJURED(pedNearby[i])
IF VDIST2(GET_ENTITY_COORDS(pedNearby[i], FALSE), GET_ENTITY_COORDS(sMainCars[iPlayersCar].veh, FALSE)) < 100.0
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(ARM1_HIT_ALIENS)
bAliensStatHasBeenSet = TRUE
ENDIF
ELSE
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedNearby[i], PLAYER_PED_ID())
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(ARM1_HIT_ALIENS)
bAliensStatHasBeenSet = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDIF
// Rob - 2117273 - also check damage
INT iEventCount
STRUCT_ENTITY_ID sei
EVENT_NAMES eventType
REPEAT GET_NUMBER_OF_EVENTS(SCRIPT_EVENT_QUEUE_AI) iEventCount
eventType = GET_EVENT_AT_INDEX(SCRIPT_EVENT_QUEUE_AI, iEventCount)
IF eventType = EVENT_ENTITY_DAMAGED
GET_EVENT_DATA(SCRIPT_EVENT_QUEUE_AI, iEventCount, sei, SIZE_OF(STRUCT_ENTITY_ID))
IF DOES_ENTITY_EXIST(sei.EntityId)
IF GET_ENTITY_MODEL(sei.EntityId) = modelFilmCrew
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(ARM1_HIT_ALIENS)
bAliensStatHasBeenSet = TRUE
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDIF
iPrevUnarmedHits = iUnarmedHitsTotal
//Security guards at movie lot
IF fCurrentPlaybackTime < 20000.0
sMovieGuards[0].iEvent = 0 //Chase has been restarted: reset the security guards.
sMovieGuards[1].iEvent = 0 //Chase has been restarted: reset the security guards.
ELIF fCurrentPlaybackTime > 43000.0
VECTOR vStartPos
FLOAT fStartHeading
BOOL bTimeToTrigger
REPEAT COUNT_OF(sMovieGuards) i
SWITCH sMovieGuards[i].iEvent
CASE 0 //Create the peds. 0 = the guard at the front entrance in the chase, 1 = the guard at the rear entrance.
IF i = 0
vStartPos = <<-1048.1337, -476.2388, 35.8050>>
fStartHeading = 316.5925
ELSE
vStartPos = <<-1210.1215, -570.0335, 26.3435>>
fStartHeading = 295.8782
ENDIF
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vStartPos) < 40000.0
REQUEST_MODEL(modelMovieGuards)
IF HAS_MODEL_LOADED(modelMovieGuards)
AND NOT bCreatedAnEntityThisFrame
sMovieGuards[i].ped = CREATE_PED(PEDTYPE_MISSION, modelMovieGuards, vStartPos, fStartHeading)
TASK_LOOK_AT_ENTITY(sMovieGuards[i].ped, PLAYER_PED_ID(), -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sMovieGuards[i].ped, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMovieGuards)
sMovieGuards[i].iEvent++
bCreatedAnEntityThisFrame = TRUE
ENDIF
ENDIF
BREAK
CASE 1 //Put the guards into combat once the player or Lamar go into the studio.
bTimeToTrigger = FALSE
IF NOT IS_PED_INJURED(sMovieGuards[i].ped)
IF i = 0
IF NOT IS_PED_INJURED(sLamar.ped)
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sMovieGuards[i].ped)) < 900.0
OR (VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sLamar.ped)) < 900.0
AND VDIST2(GET_ENTITY_COORDS(sMovieGuards[i].ped), GET_ENTITY_COORDS(sLamar.ped)) < 100.0)
bTimeToTrigger = TRUE
ENDIF
ENDIF
ELSE
bTimeToTrigger = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sMovieGuards[i].ped)) < 6400.0
ENDIF
IF bTimeToTrigger
PLAY_PED_AMBIENT_SPEECH(sMovieGuards[i].ped, "FIGHT", SPEECH_PARAMS_FORCE_NORMAL)
sMovieGuards[i].iEvent++
ENDIF
ENDIF
BREAK
CASE 2 //Check the combat task.
IF NOT IS_PED_INJURED(sMovieGuards[i].ped)
IF NOT IS_PED_IN_COMBAT(sMovieGuards[i].ped)
AND GET_SCRIPT_TASK_STATUS(sMovieGuards[i].ped, SCRIPT_TASK_COMBAT) != PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(sMovieGuards[i].ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
TASK_COMBAT_PED(sMovieGuards[i].ped, PLAYER_PED_ID())
SET_PED_KEEP_TASK(sMovieGuards[i].ped, TRUE)
ENDIF
ENDIF
BREAK
ENDSWITCH
//Clean up if the ped dies or the player drives away.
IF DOES_ENTITY_EXIST(sMovieGuards[i].ped)
IF IS_PED_INJURED(sMovieGuards[i].ped)
REMOVE_PED(sMovieGuards[i].ped)
ELIF fCurrentPlaybackTime > 66000.0
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sMovieGuards[i].ped)) > 10000.0
REMOVE_PED(sMovieGuards[i].ped)
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDIF
//Smoker: delivery guy who stands in the alley smoking
/*IF fCurrentPlaybackTime < 57000.0
sSmoker.iEvent = 0
ELSE
MODEL_NAMES modelSmoker = S_M_M_UPS_01
MODEL_NAMES modelCigarette = PROP_CS_CIGGY_01
STRING strSmokerAnims = "missarmenian1"
IF sSmoker.iEvent = 0
IF fCurrentPlaybackTime < 66000.0
REQUEST_MODEL(modelSmoker)
REQUEST_MODEL(modelCigarette)
REQUEST_ANIM_DICT(strSmokerAnims)
IF HAS_MODEL_LOADED(modelSmoker)
AND HAS_ANIM_DICT_LOADED(strSmokerAnims)
AND NOT bCreatedAnEntityThisFrame
sSmoker.ped = CREATE_PED(PEDTYPE_MISSION, modelSmoker, <<-1249.5641, -677.1760, 24.9935>>, 7.3495)
TASK_PLAY_ANIM(sSmoker.ped, strSmokerAnims, "smoking_loop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_LOOPING)
SET_MODEL_AS_NO_LONGER_NEEDED(modelSmoker)
objCigarette = CREATE_OBJECT(modelCigarette, <<-1249.5641, -677.1760, 25.9935>>)
ATTACH_ENTITY_TO_ENTITY(objCigarette, sSmoker.ped, GET_PED_BONE_INDEX(sSmoker.ped, BONETAG_PH_R_HAND), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCigarette)
sSmoker.iEvent = 1
bCreatedAnEntityThisFrame = TRUE
ENDIF
ENDIF
ELIF DOES_ENTITY_EXIST(sSmoker.ped)
IF NOT bRemovedAnEntityThisFrame
AND (fCurrentPlaybackTime > 80000.0 OR NOT IS_PLAYER_CONTROL_ON(PLAYER_ID()) OR IS_PED_INJURED(sSmoker.ped))
REMOVE_OBJECT(objCigarette)
REMOVE_PED(sSmoker.ped)
bRemovedAnEntityThisFrame = TRUE
ENDIF
ELSE
REMOVE_ANIM_DICT(strSmokerAnims)
ENDIF
ENDIF*/
//Birds: fly away as the cars drive past
IF fCurrentPlaybackTime < 60000.0
REPEAT COUNT_OF(sBirds) i
sBirds[i].iEvent = 0
ENDREPEAT
ELSE
MODEL_NAMES modelBird = A_C_SEAGULL
CONST_FLOAT MAX_BIRD_SPEED 14.0
STRING strBirdAnims = "creatures@gull@move"
VECTOR vBirdPos
REPEAT COUNT_OF(sBirds) i
IF sBirds[i].iEvent = 0
IF fCurrentPlaybackTime < 72000.0
REQUEST_MODEL(modelBird)
REQUEST_ANIM_DICT(strBirdAnims)
IF HAS_MODEL_LOADED(modelBird)
AND HAS_ANIM_DICT_LOADED(strBirdAnims)
AND NOT bCreatedAnEntityThisFrame //Only create one entity per frame (to fix huge peaks in CPU usage)
IF i = 0
sBirds[i].ped = CREATE_PED(PEDTYPE_MISSION, modelBird, <<-1161.1345, -730.0198, 19.3756>> + <<0.0, 0.0, -0.15>>, 278.8218)
ELIF i = 1
sBirds[i].ped = CREATE_PED(PEDTYPE_MISSION, modelBird, <<-1160.7617, -728.6110, 19.4617>> + <<0.0, 0.0, -0.15>>, 322.6699)
ELIF i = 2
sBirds[i].ped = CREATE_PED(PEDTYPE_MISSION, modelBird, <<-1162.7354, -727.3837, 19.5456>> + <<0.0, 0.0, -0.15>>, 32.0168)
ELIF i = 3
sBirds[i].ped = CREATE_PED(PEDTYPE_MISSION, modelBird, <<-1160.6444, -730.7355, 19.3279>> + <<0.0, 0.0, -0.15>>, 152.0615)
ELIF i = 4
sBirds[i].ped = CREATE_PED(PEDTYPE_MISSION, modelBird, <<-1155.0334, -730.3810, 19.4121>> + <<0.0, 0.0, -0.15>>, 352.3865)
ELIF i = 5
sBirds[i].ped = CREATE_PED(PEDTYPE_MISSION, modelBird, <<-1152.8080, -723.8991, 19.7718>> + <<0.0, 0.0, -0.15>>, 25.9012)
SET_MODEL_AS_NO_LONGER_NEEDED(modelBird)
ENDIF
TASK_PLAY_ANIM(sBirds[i].ped, strBirdAnims, "idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_LOOPING)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBirds[i].ped, TRUE)
SET_PED_CAN_RAGDOLL(sBirds[i].ped, FALSE)
SET_ENTITY_INVINCIBLE(sBirds[i].ped, TRUE)
FREEZE_ENTITY_POSITION(sBirds[i].ped, TRUE)
SET_ENTITY_COLLISION(sBirds[i].ped, FALSE)
sBirds[i].iEvent = 1
sBirds[i].fSpeed = 0.0
bCreatedAnEntityThisFrame = TRUE
ENDIF
ENDIF
ELIF DOES_ENTITY_EXIST(sBirds[i].ped)
IF NOT IS_PED_INJURED(sBirds[i].ped)
SWITCH sBirds[i].iEvent
CASE 1
IF REQUEST_SCRIPT_AUDIO_BANK("ARM_1_BIRDS")
vBirdPos = GET_ENTITY_COORDS(sBirds[i].ped)
IF VDIST2(vPlayerPos, vBirdPos) < 900.0
OR (VDIST2(vLamarPos, vBirdPos) < 900.0 AND fCurrentPlaybackSpeed > 0.7)
IF i = 0
PLAY_SOUND_FROM_ENTITY(-1, "Birds", sBirds[i].ped, "ARM_1_SOUNDSET")
//Record footage of the player driving into the birds.
IF VDIST2(vPlayerPos, vBirdPos) < 2500.0
REPLAY_RECORD_BACK_FOR_TIME(2.0, 2.0, REPLAY_IMPORTANCE_HIGH)
ENDIF
ENDIF
sBirds[i].iTimer = GET_GAME_TIMER()
sBirds[i].iEvent++
ENDIF
ENDIF
BREAK
CASE 2
IF GET_GAME_TIMER() - sBirds[i].iTimer > 500
FREEZE_ENTITY_POSITION(sBirds[i].ped, FALSE)
SET_ENTITY_COLLISION(sBirds[i].ped, TRUE)
sBirds[i].vDir = CONVERT_ROTATION_TO_DIRECTION_VECTOR(GET_ENTITY_ROTATION(sBirds[i].ped) + <<45.0, 0.0, 0.0>>)
sBirds[i].fSpeed = sBirds[i].fSpeed + ((MAX_BIRD_SPEED - sBirds[i].fSpeed) * 0.5)
SET_ENTITY_VELOCITY(sBirds[i].ped, sBirds[i].vDir * sBirds[i].fSpeed)
TASK_PLAY_ANIM(sBirds[i].ped, strBirdAnims, "flapping", SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_LOOPING)
sBirds[i].iEvent++
ENDIF
BREAK
CASE 3
sBirds[i].fSpeed = sBirds[i].fSpeed + ((MAX_BIRD_SPEED - sBirds[i].fSpeed) * 0.5)
SET_ENTITY_VELOCITY(sBirds[i].ped, sBirds[i].vDir * sBirds[i].fSpeed)
IF IS_ENTITY_PLAYING_ANIM(sBirds[i].ped, strBirdAnims, "flapping")
SET_ENTITY_ANIM_SPEED(sBirds[i].ped, strBirdAnims, "flapping", 4.0)
sBirds[i].iEvent++
ENDIF
BREAK
CASE 4
sBirds[i].fSpeed = sBirds[i].fSpeed + ((MAX_BIRD_SPEED - sBirds[i].fSpeed) * 0.5)
SET_ENTITY_VELOCITY(sBirds[i].ped, sBirds[i].vDir * sBirds[i].fSpeed)
BREAK
ENDSWITCH
ENDIF
IF (fCurrentPlaybackTime > 82000.0 OR NOT IS_PLAYER_CONTROL_ON(PLAYER_ID()))
AND NOT bRemovedAnEntityThisFrame
REMOVE_PED(sBirds[i].ped)
bRemovedAnEntityThisFrame = TRUE
ENDIF
ELSE
IF i = 0
REMOVE_ANIM_DICT(strBirdAnims)
RELEASE_NAMED_SCRIPT_AUDIO_BANK("ARM_1_BIRDS")
ENDIF
ENDIF
ENDREPEAT
ENDIF
//Security guard standing outside bank
IF fCurrentPlaybackTime < 20000.0
sSecurityGuard.iEvent = 0
ELIF fCurrentPlaybackTime > 120000.0
SWITCH sSecurityGuard.iEvent
CASE 0
REQUEST_MODEL(modelBankSecurity)
IF HAS_MODEL_LOADED(modelBankSecurity)
AND NOT bCreatedAnEntityThisFrame
sSecurityGuard.ped = CREATE_PED(PEDTYPE_MISSION, modelBankSecurity, <<-73.6282, -676.8480, 32.9306>>, 69.2552)
FREEZE_ENTITY_POSITION(sSecurityGuard.ped, TRUE)
TASK_STAND_STILL(sSecurityGuard.ped, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSecurityGuard.ped, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelBankSecurity)
sSecurityGuard.iEvent++
bCreatedAnEntityThisFrame = TRUE
ENDIF
BREAK
CASE 1
IF NOT IS_PED_INJURED(sSecurityGuard.ped)
IF IS_ENTITY_STATIC(sSecurityGuard.ped)
IF VDIST2(GET_ENTITY_COORDS(sSecurityGuard.ped), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 2500.0
FREEZE_ENTITY_POSITION(sSecurityGuard.ped, FALSE)
ENDIF
ELSE
//If the player somehow gets to the guard before Lamar, just have him run off.
IF (fCurrentPlaybackTime < 144600.0 AND VDIST2(GET_ENTITY_COORDS(sSecurityGuard.ped), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 25.0)
OR fCurrentPlaybackTime > 145600.0
sSecurityGuard.iEvent++
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF NOT IS_PED_INJURED(sSecurityGuard.ped)
IF NOT IS_PED_IN_COMBAT(sSecurityGuard.ped)
AND GET_SCRIPT_TASK_STATUS(sSecurityGuard.ped, SCRIPT_TASK_COMBAT) != PERFORMING_TASK
PLAY_PED_AMBIENT_SPEECH(sSecurityGuard.ped, "FIGHT")
TASK_COMBAT_PED(sSecurityGuard.ped, PLAYER_PED_ID())
ENDIF
/*IF VDIST2(GET_ENTITY_COORDS(sSecurityGuard.ped), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 400.0
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
OR (GET_ENTITY_SPEED(PLAYER_PED_ID()) < 1.0 AND bBuddyFinished)
IF NOT HAS_PED_GOT_WEAPON(sSecurityGuard.ped, WEAPONTYPE_PISTOL)
GIVE_WEAPON_TO_PED(sSecurityGuard.ped, WEAPONTYPE_PISTOL, INFINITE_AMMO)
SET_PED_ACCURACY(sSecurityGuard.ped, 100)
ENDIF
ENDIF
ENDIF*/
//If the player starts trying to mess around just have him run off.
/*IF IS_PED_IN_COMBAT(sSecurityGuard.ped)
IF VDIST2(GET_ENTITY_COORDS(sSecurityGuard.ped), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 49.0
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-218.90, -623.75, 33.11>>, PEDMOVE_SPRINT, -1, 1.0)
TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 200.0, -1)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sSecurityGuard.ped, seq)
CLEAR_SEQUENCE_TASK(seq)
sSecurityGuard.iEvent++
ENDIF
ENDIF*/
ENDIF
BREAK
ENDSWITCH
//Clean up if he dies at any point.
IF sSecurityGuard.iEvent > 0
IF IS_PED_INJURED(sSecurityGuard.ped)
REMOVE_PED(sSecurityGuard.ped)
ENDIF
ENDIF
ENDIF
//The stockade in the bank is falling through the interior, so freeze it.
IF ParkedCarModel[STOCKADE_PARKED_ID] = STOCKADE
IF NOT IS_ENTITY_DEAD(ParkedCarID[STOCKADE_PARKED_ID])
IF NOT IS_ENTITY_STATIC(ParkedCarID[STOCKADE_PARKED_ID])
FREEZE_ENTITY_POSITION(ParkedCarID[STOCKADE_PARKED_ID], TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(ParkedCarID[STOCKADE_PARKED_ID], FALSE)
ENDIF
ENDIF
ENDIF
//Create a shutter over the bank vault entrance.
IF NOT DOES_ENTITY_EXIST(objVaultShutter)
IF VDIST2(vPlayerPos, <<-7.1741, -658.6362, 33.8238>>) < 10000.0
SETUP_REQ_VAULT_SHUTTER(<<-7.1741, -658.6362, 33.8238>>, <<0.0000, 0.0000, 4.5837>>)
ENDIF
ENDIF
ENDPROC
FUNC VEHICLE_INDEX GET_CLOSEST_VEHICLE_TO_PLAYER_EXCLUDING_CHASE_CARS()
CONST_INT NUM_CARS_TO_STORE 5
VEHICLE_INDEX vehNearby[NUM_CARS_TO_STORE]
GET_PED_NEARBY_VEHICLES(PLAYER_PED_ID(), vehNearby)
INT i = 0
REPEAT NUM_CARS_TO_STORE i
IF vehNearby[i] != sMainCars[0].veh AND vehNearby[i] != sMainCars[1].veh
AND NOT IS_ENTITY_DEAD(vehNearby[i])
RETURN vehNearby[i]
ENDIF
ENDREPEAT
RETURN NULL
ENDFUNC
PROC DO_CHASE_HORNS(VEHICLE_INDEX vehClosest)
//General horns for all vehicles: get the nearest vehicle and play horn
IF GET_GAME_TIMER() - iTimeSinceLastHorn > 2000
IF vehClosest != sMainCars[iBuddiesCar].veh
IF IS_VEHICLE_DRIVEABLE(vehClosest)
IF VDIST2(GET_ENTITY_COORDS(vehClosest), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 9.0
IF (GET_ENTITY_SPEED(sMainCars[iPlayersCar].veh) - GET_ENTITY_SPEED(vehClosest)) > 3.0
OR ABSF(GET_ENTITY_HEADING(sMainCars[iPlayersCar].veh) - GET_ENTITY_HEADING(vehClosest)) > 60.0 //Cars aren't travelling in same direction.
PED_INDEX pedClosest = GET_PED_IN_VEHICLE_SEAT(vehClosest)
IF NOT IS_PED_INJURED(pedClosest)
START_VEHICLE_HORN(vehClosest, 2000)
#IF IS_DEBUG_BUILD
IF bDebugEnableHornAsserts
SCRIPT_ASSERT("Armenian 1 - Triggered horn")
ENDIF
PRINTSTRING("Armenian 1 - Vehicle horn triggered at ")
PRINTVECTOR(GET_ENTITY_COORDS(vehClosest))
PRINTNL()
#ENDIF
iTimeSinceLastHorn = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Detects if the closest car has just missed Franklin. If so it plays a random line of dialogue.
PROC DO_NEAR_MISS_FRANKLIN_DIALOGUE(VEHICLE_INDEX vehClosest)
IF GET_GAME_TIMER() - iTimeSinceLastNearMissDialogue > 5000
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF vehClosest != sMainCars[iBuddiesCar].veh
IF IS_VEHICLE_DRIVEABLE(vehClosest)
AND IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
IF NOT HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sMainCars[iPlayersCar].veh, vehClosest)
IF GET_ENTITY_SPEED(sMainCars[iPlayersCar].veh) > 15.0
AND GET_ENTITY_SPEED(vehClosest) > 1.0
IF ABSF(GET_ENTITY_HEADING(sMainCars[iPlayersCar].veh) - GET_ENTITY_HEADING(vehClosest)) > 60.0 //Cars aren't travelling in same direction.
VECTOR vOffsetFromPlayer = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(sMainCars[iPlayersCar].veh, GET_ENTITY_COORDS(vehClosest))
IF vOffsetFromPlayer.y < -1.5 //Car has passed the player.
AND vOffsetFromPlayer.y > -5.0
IF ABSF(vOffsetFromPlayer.x) < 4.0 //Car is near to the side of the player.
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_NEAR", CONV_PRIORITY_MEDIUM)
iTimeSinceLastNearMissDialogue = GET_GAME_TIMER()
//Play a gesture.
IF fCurrentPlaybackTime < 144600.0
AND GET_CONVERTIBLE_ROOF_STATE(sMainCars[iPlayersCar].veh) = CRS_LOWERED
AND IS_ENTITY_UPRIGHT(sMainCars[iPlayersCar].veh)
IF HAS_ANIM_DICT_LOADED(strFranklinCarAnimsTaunt)
AND NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), strFranklinCarAnimsTaunt, "learnhowtouseastick")
TASK_PLAY_ANIM(PLAYER_PED_ID(), strFranklinCarAnimsTaunt, "learnhowtouseastick",
NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_SECONDARY)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC BLOCK_SCENARIOS_FOR_CHASE(BOOL bBlock)
IF bBlock
IF sbiMovieStudio = NULL
sbiMovieStudio = ADD_SCENARIO_BLOCKING_AREA(<<-1196.229370,-575.141541,0.879524>>, <<-1035.999268,-474.751373,68.879524>>)
ENDIF
SET_PED_PATHS_IN_AREA(<<-1714.314575,-567.082825,30.834576>>, <<-1680.669922,-557.942688,39.834576>>, FALSE)
SET_PED_PATHS_IN_AREA(<<-373.6247, -835.7380, 30.4071>>, <<-327.3391, -822.5929, 38.0959>>, FALSE)
SET_PED_PATHS_IN_AREA(<<-353.9807, -683.0400, 30.5587>>, <<-316.4468, -669.6537, 37.2847>>, FALSE)
SET_PED_PATHS_IN_AREA(<<-1287.1616, -651.9630, 25.4564>>, <<-1256.6211, -625.6708, 29.6292>>, FALSE)
SET_PED_NON_CREATION_AREA(<<-373.6247, -835.7380, 30.4071>>, <<-327.3391, -822.5929, 38.0959>>)
//IF sbiPastMovieStudio = NULL
// sbiPastMovieStudio = ADD_SCENARIO_BLOCKING_AREA(<<-1337.2729, -687.7573, 0.0>>, <<-1237.6948, -582.6704, 47.9080>>)
//ENDIF
ELSE
IF sbiMovieStudio != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbiMovieStudio)
sbiMovieStudio = NULL
ENDIF
IF sbiPastMovieStudio != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbiPastMovieStudio)
sbiPastMovieStudio = NULL
ENDIF
SET_PED_PATHS_BACK_TO_ORIGINAL(<<-1714.314575,-567.082825,30.834576>>, <<-1680.669922,-557.942688,39.834576>>)
SET_PED_PATHS_BACK_TO_ORIGINAL(<<-373.6247, -835.7380, 30.4071>>, <<-327.3391, -822.5929, 38.0959>>)
SET_PED_PATHS_BACK_TO_ORIGINAL(<<-353.9807, -683.0400, 30.5587>>, <<-316.4468, -669.6537, 37.2847>>)
SET_PED_PATHS_BACK_TO_ORIGINAL(<<-1287.1616, -651.9630, 25.4564>>, <<-1256.6211, -625.6708, 29.6292>>)
CLEAR_PED_NON_CREATION_AREA()
ENDIF
ENDPROC
PROC BLOCK_SCENARIOS_FOR_CUTSCENE(BOOL bBlock)
IF bBlock
IF sbiCutscene = NULL
sbiCutscene = ADD_SCENARIO_BLOCKING_AREA(<<-1862.3032, -607.0848, 12.0363>>, <<-1812.5437, -526.8602, 36.9263>>)
SET_PED_NON_CREATION_AREA(<<-1862.3032, -607.0848, 13.0363>>, <<-1812.5437, -526.8602, 70.9263>>)
SET_PED_PATHS_IN_AREA(<<-1862.3032, -607.0848, 13.0363>>, <<-1812.5437, -526.8602, 70.9263>>, FALSE)
ENDIF
IF iNavmeshBlockCutscene = -1
iNavmeshBlockCutscene = ADD_NAVMESH_BLOCKING_OBJECT(<<-1839.0, -579.4, 15.0>>, <<10.0, 70.0, 10.0>>, DEG_TO_RAD(139.8))
ENDIF
ELSE
IF sbiCutscene != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbiCutscene)
CLEAR_PED_NON_CREATION_AREA()
SET_PED_PATHS_BACK_TO_ORIGINAL(<<-1862.3032, -607.0848, 13.0363>>, <<-1812.5437, -526.8602, 70.9263>>)
sbiCutscene = NULL
ENDIF
IF iNavmeshBlockCutscene != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(iNavmeshBlockCutscene)
iNavmeshBlockCutscene = -1
ENDIF
ENDIF
ENDPROC
FUNC BOOL DO_SHOWROOM_CARS_EXIST()
IF DOES_ENTITY_EXIST(vehShowroomCars[0])
IF DOES_ENTITY_EXIST(vehShowroomCars[1])
IF DOES_ENTITY_EXIST(vehShowroomCars[2])
IF DOES_ENTITY_EXIST(vehShowroomCars[3])
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC SET_CUTSCENE_PED_COMPONENT_VARIATIONS(STRING strCutsceneName)
INT iNameHash = GET_HASH_KEY(strCutsceneName)
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
IF iNameHash = HASH("armenian_1_int")
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", PLAYER_PED_ID())
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_HAIR, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_TORSO, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_LEG, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_HAND, 2, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_SPECIAL2, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_SPECIAL, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_TORSO, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_LEG, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_HAND, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_FEET, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_SPECIAL2, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_SPECIAL, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_JBIB, 0, 0)
PRINTLN("Armenian1.sc - Succesfully set components for armenian_1_int.")
ELIF iNameHash = HASH("armenian_1_mcs_1")
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", PLAYER_PED_ID())
IF NOT IS_PED_INJURED(sLamar.ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Lamar", sLamar.ped)
ENDIF
SET_CUTSCENE_PED_COMPONENT_VARIATION("Siemon", PED_COMP_TORSO, 1, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_TORSO, 4, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_BERD, 1, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_HAIR, 2, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_LEG, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_FEET, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_SPECIAL, 3, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_DECL, 2, 0)
ELIF iNameHash = HASH("armenian_1_mcs_2")
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", PLAYER_PED_ID())
IF NOT IS_PED_INJURED(sLamar.ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Lamar", sLamar.ped)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC BLOCK_VEHICLE_GENS_AT_START_POINT(BOOL bBlock)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-1886.4, -584.1, 5.4>>, <<-1872.8, -575.0, 17.5>>, NOT bBlock)
ENDPROC
PROC BLOCK_VEHICLE_GENS_IN_SHOWROOM(BOOL bBlock)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-44.9779, -1093.9878, 19.4526>>, <<-30.0332, -1074.4330, 39.4526>>, NOT bBlock)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-20.8010, -1084.0568, 20.8603>>, <<-3.4886, -1050.9978, 31.8603>>, NOT bBlock)
IF bBlock
CLEAR_AREA_OF_VEHICLES(<<-37.0, -1087.0, 26.0>>, 5.0)
ENDIF
ENDPROC
PROC BLOCK_SCENARIOS_AT_SHOWROOM()
IF sbiShowroom = NULL
sbiShowroom = ADD_SCENARIO_BLOCKING_AREA(<<-49.411049,-1078.832275,20.473274>>, <<-44.080521,-1071.935669,39.473274>>)
ENDIF
IF sbiShowroomBrowse = NULL
sbiShowroomBrowse = ADD_SCENARIO_BLOCKING_AREA(<<-54.5514, -1111.4725, 22.2924>>, <<-39.9018, -1104.0132, 39.7759>>)
ENDIF
ENDPROC
PROC BLOCK_COPS_SPAWNING_IN_BANK(BOOL bBlock)
IF bBlock
IF iDispatchSpawnBlockBank1 = -1
iDispatchSpawnBlockBank1 = ADD_DISPATCH_SPAWN_ANGLED_BLOCKING_AREA(<<25.406651,-664.524109,30.378651>>, <<10.393962,-690.480042,35.739861>>, 19.250000)
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] Created iDispatchSpawnBlockBank1.")
ENDIF
IF iDispatchSpawnBlockBank2 = -1
iDispatchSpawnBlockBank2 = ADD_DISPATCH_SPAWN_ANGLED_BLOCKING_AREA(<<14.522158,-684.694336,30.088087>>, <<-85.904114,-678.751953,38.473141>>, 52.500000)
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] Created iDispatchSpawnBlockBank2.")
ENDIF
ELSE
IF iDispatchSpawnBlockBank1 != -1
REMOVE_DISPATCH_SPAWN_BLOCKING_AREA(iDispatchSpawnBlockBank1)
iDispatchSpawnBlockBank1 = -1
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] Removed iDispatchSpawnBlockBank1.")
ENDIF
IF iDispatchSpawnBlockBank2 != -1
REMOVE_DISPATCH_SPAWN_BLOCKING_AREA(iDispatchSpawnBlockBank2)
iDispatchSpawnBlockBank2 = -1
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] Removed iDispatchSpawnBlockBank2.")
ENDIF
ENDIF
ENDPROC
PROC DISABLE_CONTROLS_INSIDE_SHOWROOM()
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)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
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)
ENDPROC
//Creates/removes forced objects for the chase.
PROC SET_FORCED_OBJECTS_FOR_CHASE(BOOL bSetActive)
IF bSetActive
IF NOT bForcedObjectsAreActive
CREATE_FORCED_OBJECT(<<-1052.49, -476.15, 36.6>>, 5.0, PROP_SEC_BARRIER_LD_01A, TRUE)
CREATE_FORCED_OBJECT(<<-1207.25, -578.08, 26.17>>, 5.0, PROP_SEC_BARIER_03B, TRUE)
CREATE_FORCED_OBJECT(<<-1208.3219, -579.1413, 26.27>>, 5.0, PROP_SEC_BARIER_BASE_01, TRUE)
bForcedObjectsAreActive = TRUE
#IF IS_DEBUG_BUILD
PRINTLN("Armenian1.sc - Created forced objects for chase.")
#ENDIF
ENDIF
ELSE
IF bForcedObjectsAreActive
REMOVE_FORCED_OBJECT(<<-1052.49, -476.15, 36.6>>, 5.0, PROP_SEC_BARRIER_LD_01A)
REMOVE_FORCED_OBJECT(<<-1207.25, -578.08, 26.17>>, 5.0, PROP_SEC_BARIER_03B)
REMOVE_FORCED_OBJECT(<<-1208.3219, -579.1413, 26.27>>, 5.0, PROP_SEC_BARIER_BASE_01)
bForcedObjectsAreActive = FALSE
#IF IS_DEBUG_BUILD
PRINTLN("Armenian1.sc - Removed forced objects for chase.")
#ENDIF
ENDIF
ENDIF
ENDPROC
PROC MISSION_SETUP()
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
CLEAR_PRINTS()
CLEAR_HELP()
CLEAR_ALL_FLOATING_HELP()
REGISTER_SCRIPT_WITH_AUDIO(TRUE)
REQUEST_ADDITIONAL_TEXT("ARM1", MISSION_TEXT_SLOT)
//groupPlayer = GET_PLAYER_GROUP(PLAYER_ID())
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, PLAYER_PED_ID(), "FRANKLIN")
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_LawWillOnlyAttackIfPlayerIsWanted, TRUE)
//The car nearest the building
sMainCars[0].vStartPos = <<-1878.5793, -579.5922, 10.7770>>//<< -1878.3322, -579.8704, 10.7790 >>
sMainCars[0].fStartHeading = 320.3026
sMainCars[0].iStartCarrec = 1
sMainCars[1].vStartPos = <<-1881.1982, -577.0080, 10.7690>>//<< -1880.2660, -577.8439, 10.7702 >>
sMainCars[1].fStartHeading = 319.7534
sMainCars[1].iStartCarrec = 2
//Cam recordings
iCamRecs[0] = 901
iCamRecs[1] = 902
iCamRecs[2] = 903
iCamRecs[3] = 904
iCamRecs[4] = 905
iCamRecs[5] = 906
iCamRecs[6] = 907
SET_VEHICLE_MODEL_IS_SUPPRESSED(NINEF2, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(RAPIDGT2, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(NINEF, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(RAPIDGT, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN), TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(TOWTRUCK, TRUE)
sbiSecurityGuards = ADD_SCENARIO_BLOCKING_AREA(<<50.2705, -636.6755, 5.3062>>, <<74.2078, -610.5507, 42.6258>>)
SET_ROADS_IN_AREA(<<-112.6669, -1539.6423, 20.2851>>, <<74.2658, -1438.4238, 42.8005>>, FALSE)
BLOCK_VEHICLE_GENS_IN_SHOWROOM(TRUE)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SPECIAL_ABILITY_UNLOCK(GET_PLAYER_PED_MODEL(CHAR_FRANKLIN))
SPECIAL_ABILITY_DEPLETE_METER(PLAYER_ID(), TRUE)
ENABLE_SPECIAL_ABILITY(PLAYER_ID(), FALSE)
SET_DOOR_STATE(DOORNAME_STUDIO_NORTH_GATE_IN, DOORSTATE_LOCKED)
SET_DOOR_STATE(DOORNAME_STUDIO_NORTH_GATE_OUT, DOORSTATE_LOCKED)
SET_DOOR_STATE(DOORNAME_STUDIO_SOUTH_GATE_IN, DOORSTATE_LOCKED)
SET_DOOR_STATE(DOORNAME_STUDIO_SOUTH_GATE_OUT, DOORSTATE_LOCKED)
//INFORM_MISSION_STATS_OF_MISSION_START_ARMENIAN_ONE()
SET_PLAYER_CAN_CHANGE_CLOTHES_ON_MISSION(FALSE)
SET_INTERIOR_DISABLED(INTERIOR_V_PSYCHEOFFICE, FALSE)
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_BANK, BUILDINGSTATE_DESTROYED)
SET_INTERIOR_CAPPED(INTERIOR_DT1_03_CARPARK, FALSE)
SET_WEATHER_TYPE_OVERTIME_PERSIST("clear", 20.0)
iLamarRevSound = GET_SOUND_ID()
g_eArm1PrestreamDenise = ARM1_PD_3_release
#IF IS_DEBUG_BUILD
CREATE_WIDGETS()
sSkipMenu[0].sTxtLabel = "ARMENIAN_1_INT - OPENING_CUTSCENE"
sSkipMenu[1].sTxtLabel = "CHOOSE_CAR"
sSkipMenu[2].sTxtLabel = "START_CHASE_CUTSCENE"
sSkipMenu[3].sTxtLabel = "CHASE"
sSkipMenu[4].sTxtLabel = "CHASE_MID_POINT"
sSkipMenu[5].sTxtLabel = "COPS_ARRIVE_CUTSCENE"
sSkipMenu[6].sTxtLabel = "LOSE_COPS"
sSkipMenu[7].sTxtLabel = "SHOWROOM_INTRO"
sSkipMenu[8].sTxtLabel = "MEET_SIMEON"
sSkipMenu[9].sTxtLabel = "ARMENIAN_1_MCS_1 - SHOWROOM_CUTSCENE"
sSkipMenu[10].sTxtLabel = "GO_TO_HOUSE"
sSkipMenu[11].sTxtLabel = "ARMENIAN_1_MCS_2_concat - HOUSE_CUTSCENE"
//sSkipMenu[12].sTxtLabel = "(debug only) GO_INSIDE_HOUSE"
//sSkipMenu[13].sTxtLabel = "SAVE_TUTORIAL"
#ENDIF
ENDPROC
PROC MISSION_CLEANUP()
SET_AUTOSAVE_IGNORES_ON_MISSION_FLAG(FALSE)
CASCADE_SHADOWS_SET_SCREEN_SIZE_CHECK_ENABLED(TRUE)
CLEAR_HELP()
FLASH_WANTED_DISPLAY(FALSE)
CLEAR_ALL_FLOATING_HELP()
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(1.0)
SET_VEHICLE_POPULATION_BUDGET(3)
SET_PED_POPULATION_BUDGET(3)
SET_MAX_WANTED_LEVEL(5)
STOP_SCRIPT_GLOBAL_SHAKING()
SET_CREATE_RANDOM_COPS(TRUE)
SET_FRONTEND_RADIO_ACTIVE(TRUE)
SET_AGGRESSIVE_HORNS(FALSE)
SET_CINEMATIC_BUTTON_ACTIVE(TRUE)
SET_RADIO_AUTO_UNFREEZE(TRUE)
SET_IGNORE_NO_GPS_FLAG(FALSE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
CLEAR_VEHICLE_GENERATOR_AREA_OF_INTEREST()
RESET_DISPATCH_TIME_BETWEEN_SPAWN_ATTEMPTS(DT_POLICE_AUTOMOBILE)
DISABLE_CELLPHONE(FALSE)
HIDE_ACTIVE_PHONE(FALSE)
DISABLE_VEHICLE_GEN_ON_MISSION(FALSE)
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_DOWN, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
DISABLE_TAXI_HAILING(FALSE)
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE)
NEW_LOAD_SCENE_STOP()
STOP_GAMEPLAY_HINT()
SET_SRL_LONG_JUMP_MODE(FALSE)
SET_NUMBER_OF_PARKED_VEHICLES(-1)
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(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_PED_CURRENT_WEAPON_VISIBLE(PLAYER_PED_ID(), TRUE)
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, TRUE)
ENABLE_SPECIAL_ABILITY(PLAYER_ID(), TRUE)
SET_PED_CAPSULE(PLAYER_PED_ID(), 0.0)
RESET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID())
SET_ALL_RANDOM_PEDS_FLEE(PLAYER_ID(), FALSE)
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
ENDIF
ENDIF
IF NOT HAS_CUTSCENE_FINISHED()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
ENDIF
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
//Bank gates must be closed after this mission.
SET_BUILDING_STATE(BUILDINGNAME_ES_BANK_CAR_PARK_SHUTTERS, BUILDINGSTATE_NORMAL)
BLOCK_SCENARIOS_FOR_CHASE(FALSE)
BLOCK_SCENARIOS_FOR_CUTSCENE(FALSE)
BLOCK_COPS_SPAWNING_IN_BANK(FALSE)
INT i = 0
REPEAT COUNT_OF(iWheelSkidPtfx) i
IF iWheelSkidPtfx[i] != NULL
STOP_PARTICLE_FX_LOOPED(iWheelSkidPtfx[i])
iWheelSkidPtfx[i] = NULL
ENDIF
ENDREPEAT
IF ptfxCreditsBoat[0] != NULL
STOP_PARTICLE_FX_LOOPED(ptfxCreditsBoat[0])
ptfxCreditsBoat[0] = NULL
ENDIF
IF ptfxCreditsBoat[1] != NULL
STOP_PARTICLE_FX_LOOPED(ptfxCreditsBoat[1])
ptfxCreditsBoat[1] = NULL
ENDIF
REMOVE_PTFX_ASSET()
SET_AGGRESSIVE_HORNS(FALSE)
STOP_AUDIO_SCENES()
STOP_STREAM()
RELEASE_SCRIPT_AUDIO_BANK()
IF sbiShowroom != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbiShowroom)
sbiShowroom = NULL
ENDIF
IF sbiShowroomBrowse != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbiShowroomBrowse)
sbiShowroomBrowse = NULL
ENDIF
REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 5)
//REMOVE_PED_FOR_DIALOGUE(sConversationPeds, 6)
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
MODIFY_VEHICLE_TOP_SPEED(sMainCars[iPlayersCar].veh, 0.0)
ENDIF
DESTROY_ALL_CAMS()
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
IF NOT IS_INTERPOLATING_FROM_SCRIPT_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDIF
IF bRequestedCreditsScaleform
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(sfCredits)
bRequestedCreditsScaleform = FALSE
ENDIF
REMOVE_ALL_BLIPS()
REMOVE_ALL_OBJECTS()
REMOVE_ALL_PEDS()
REMOVE_ALL_VEHICLES()
//If we had to force the cam view at any point then make sure it's reset.
IF bForcedFirstPersonView
SET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE, ePrevCarViewMode)
bForcedFirstPersonView = FALSE
ENDIF
IF bShowroomCarsBlocked
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vRoomCorner1, vRoomCorner2, TRUE)
bShowroomCarsBlocked = FALSE
ENDIF
IF bCustomGPSActive
SET_GPS_MULTI_ROUTE_RENDER(FALSE)
CLEAR_GPS_MULTI_ROUTE()
bCustomGPSActive = FALSE
ENDIF
IF interiorShowroom != NULL
UNPIN_INTERIOR(interiorShowroom)
interiorShowroom = NULL
ENDIF
IF interiorFranklinsHouse != NULL
UNPIN_INTERIOR(interiorFranklinsHouse)
interiorFranklinsHouse = NULL
ENDIF
IF interiorShrink != NULL
UNPIN_INTERIOR(interiorShrink)
interiorShrink = NULL
ENDIF
IF interiorBank != NULL
UNPIN_INTERIOR(interiorBank)
interiorBank = NULL
ENDIF
IF interiorCarPark != NULL
UNPIN_INTERIOR(interiorCarPark)
interiorCarPark = NULL
ENDIF
SET_FORCED_OBJECTS_FOR_CHASE(FALSE)
SET_SIDE_CAR_PARK_INTERIOR_ACTIVE(FALSE)
BLOCK_VEHICLE_GENS_AT_START_POINT(FALSE)
REMOVE_MODEL_HIDE(<<-18.3539, -1438.7838, 31.3050>>, 3.0, V_ILEV_FRNKWARDDR1, TRUE)
REMOVE_MODEL_HIDE(<<-18.3594, -1438.1329, 31.3050>>, 3.0, V_ILEV_FRNKWARDDR2, TRUE)
REQUEST_IPL("ferris_finale_Anim")
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
IF iChasePedBlockingArea != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(iChasePedBlockingArea)
iChasePedBlockingArea = -1
ENDIF
IF iChasePedBlockingArea2 != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(iChasePedBlockingArea2)
iChasePedBlockingArea2 = -1
ENDIF
IF iGatePedBlockingArea != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(iGatePedBlockingArea)
iGatePedBlockingArea = -1
ENDIF
IF iShowroomPedBlockingArea != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(iShowroomPedBlockingArea)
iShowroomPedBlockingArea = -1
ENDIF
IF iShowroomPedBlockingArea2 != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(iShowroomPedBlockingArea2)
iShowroomPedBlockingArea2 = -1
ENDIF
SET_DOOR_STATE(DOORNAME_F_HOUSE_SC_B, DOORSTATE_UNLOCKED)
SET_DOOR_STATE(DOORNAME_F_HOUSE_SC_F, DOORSTATE_UNLOCKED)
SET_STATIC_BLIP_HIDDEN_IN_MISSION(STATIC_BLIP_SHOP_HAIRDO_01_BH, FALSE)
SET_STATIC_BLIP_HIDDEN_IN_MISSION(STATIC_BLIP_SHOP_HAIRDO_02_SC, FALSE)
SET_STATIC_BLIP_HIDDEN_IN_MISSION(STATIC_BLIP_SHOP_HAIRDO_03_V, FALSE)
SET_STATIC_BLIP_HIDDEN_IN_MISSION(STATIC_BLIP_SHOP_HAIRDO_04_SS, FALSE)
SET_STATIC_BLIP_HIDDEN_IN_MISSION(STATIC_BLIP_SHOP_HAIRDO_05_MP, FALSE)
SET_STATIC_BLIP_HIDDEN_IN_MISSION(STATIC_BLIP_SHOP_HAIRDO_06_HW, FALSE)
SET_STATIC_BLIP_HIDDEN_IN_MISSION(STATIC_BLIP_SHOP_HAIRDO_07_PB, FALSE)
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
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
KILL_FACE_TO_FACE_CONVERSATION()
SET_PLAYER_CAN_CHANGE_CLOTHES_ON_MISSION(TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(NINEF2, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(RAPIDGT2, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(NINEF, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(RAPIDGT, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN), FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(TOWTRUCK, FALSE)
IF sbiSecurityGuards != NULL
REMOVE_SCENARIO_BLOCKING_AREA(sbiSecurityGuards)
ENDIF
SET_DOOR_STATE(DOORNAME_STUDIO_NORTH_GATE_IN, DOORSTATE_UNLOCKED)
SET_DOOR_STATE(DOORNAME_STUDIO_NORTH_GATE_OUT, DOORSTATE_UNLOCKED)
SET_DOOR_STATE(DOORNAME_STUDIO_SOUTH_GATE_IN, DOORSTATE_UNLOCKED)
SET_DOOR_STATE(DOORNAME_STUDIO_SOUTH_GATE_OUT, DOORSTATE_UNLOCKED)
SET_ROADS_BACK_TO_ORIGINAL(<<-112.6669, -1539.6423, 20.2851>>, <<74.2658, -1438.4238, 42.8005>>)
BLOCK_VEHICLE_GENS_IN_SHOWROOM(FALSE)
CLEAR_PED_NON_CREATION_AREA()
REGISTER_SCRIPT_WITH_AUDIO(FALSE)
SET_INTERIOR_DISABLED_ON_EXIT(INTERIOR_V_PSYCHEOFFICE, TRUE)
SET_BUILDING_STATE(BUILDINGNAME_IPL_BIG_SCORE_BANK, BUILDINGSTATE_NORMAL, TRUE)
SET_INTERIOR_CAPPED_ON_EXIT(INTERIOR_DT1_03_CARPARK, TRUE)
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_LawWillOnlyAttackIfPlayerIsWanted, TRUE)
ENDIF
//2255037 - If we allowed Franklin to unlock Michael's mansion gate then reset.
UNREGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MICHAEL_MANSION_GATE, PLAYER_PED_ID())
RELEASE_SOUND_ID(iLamarRevSound)
CLEAR_WEATHER_TYPE_PERSIST()
TERMINATE_THIS_THREAD()
ELSE
CLEAR_PRINTS()
CLEAR_TRIGGERED_LABELS()
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
SET_SAVEHOUSE_RESPAWN_AVAILABLE(SAVEHOUSE_FRANKLIN_SC, FALSE)
CLEANUP_UBER_PLAYBACK()
g_eArm1PrestreamDenise = ARM1_PD_3_release
TRIGGER_MUSIC_EVENT("ARM1_RADIO_ON")
REMOVE_WAYPOINT_RECORDING(strWaypointStartAlley)
REMOVE_WAYPOINT_RECORDING(strWaypointAroundCar)
REMOVE_VEHICLE_RECORDING(sMainCars[0].iStartCarrec, strCarrec)
REMOVE_VEHICLE_RECORDING(sMainCars[1].iStartCarrec, strCarrec)
REMOVE_ANIM_DICT(strChaseStartAnims)
REMOVE_ANIM_DICT(strChaseEndAnims)
REMOVE_ANIM_DICT("map_objects")
REMOVE_ANIM_DICT(strAlienAnims)
REMOVE_ANIM_DICT(strLamarLeadOutAnims)
REMOVE_ANIM_DICT(strShowroomLeadInOutAnims)
REMOVE_ANIM_DICT(strLamarCarAnimsCrash)
REMOVE_ANIM_DICT(strLamarCarAnimsTaunt)
REMOVE_ANIM_DICT(strFranklinCarAnimsTaunt)
REMOVE_ANIM_DICT(strShowroomCamAnims)
REMOVE_ANIM_DICT(strLamarShowroomAnims)
REMOVE_ANIM_DICT(strLamarAnnoyedAnims)
REMOVE_ANIM_DICT(strFerrisWheelAnims)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCarOwner)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMainCar1)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMainCar2)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCamCar)
SET_MODEL_AS_NO_LONGER_NEEDED(modelBankGate)
SET_MODEL_AS_NO_LONGER_NEEDED(modelBankGateCollision)
SET_MODEL_AS_NO_LONGER_NEEDED(modelBankSecurity)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMovieGuards)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCarOwner)
SET_MODEL_AS_NO_LONGER_NEEDED(modelShirt)
SET_MODEL_AS_NO_LONGER_NEEDED(modelShirt)
SET_MODEL_AS_NO_LONGER_NEEDED(modelWardrobeLeft)
SET_MODEL_AS_NO_LONGER_NEEDED(modelWardrobeRight)
SET_MODEL_AS_NO_LONGER_NEEDED(modelHealthPack)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCreditsBoat)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCreditsSailboat)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCreditsBoatPed)
SET_MODEL_AS_NO_LONGER_NEEDED(modelLamarsPhone)
SET_MODEL_AS_NO_LONGER_NEEDED(modelFerrisWheel)
SET_MODEL_AS_NO_LONGER_NEEDED(modelFerrisCar)
SET_MODEL_AS_NO_LONGER_NEEDED(modelFerrisWheelPed1)
SET_MODEL_AS_NO_LONGER_NEEDED(modelFerrisWheelPed2)
SET_MODEL_AS_NO_LONGER_NEEDED(modelJoggerFemale)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCreditsFemale)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCreditsMale)
SET_NPC_PED_MODEL_AS_NO_LONGER_NEEDED(CHAR_JIMMY)
SET_NPC_PED_MODEL_AS_NO_LONGER_NEEDED(CHAR_SIMEON)
CLEAR_AREA(<<0.0, 0.0, 0.0>>, 10000.0, TRUE)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
CASCADE_SHADOWS_INIT_SESSION()
ENDIF
ENDPROC
PROC MISSION_PASSED(BOOL bIsForcePass = FALSE)
//If we force passed the mission then do some cutscene checks.
IF bIsForcePass
IF NOT HAS_CUTSCENE_FINISHED()
STOP_CUTSCENE()
ENDIF
REMOVE_CUTSCENE()
WHILE IS_CUTSCENE_ACTIVE()
WAIT(0)
ENDWHILE
DO_FADE_IN_WITH_WAIT()
ENDIF
SET_SAVEHOUSE_RESPAWN_AVAILABLE(SAVEHOUSE_FRANKLIN_SC, TRUE)
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_FRANKLIN_SAVEHOUSE_CAR, TRUE)
SPECIAL_ABILITY_UNLOCK(GET_PLAYER_PED_MODEL(CHAR_FRANKLIN))
Execute_Activate_Shop_Barbers()
Set_Mission_Flow_Bitset_Bit_State(FLOWBITSET_FRANKLIN_CHANGED_HAIRCUT, BITS_CHARACTER_REQUEST_ACTIVE, TRUE)
Mission_Flow_Mission_Passed()
MISSION_CLEANUP()
ENDPROC
/// PURPOSE:
/// Begins the mission fail process. Failing the mission will result in either a fail cutscene, phone call, or an immediate termination of the script
/// depending on why and when the mission failed.
/// PARAMS:
/// reason - The reason why the mission failed.
/// bKillMissionImmediately - Forces the script to terminate immediately regardless of fail reason, if FALSE the script will attempt to start a fail cutscene/phone call.
PROC MISSION_FAILED(FAILED_REASON reason)
IF NOT bMissionFailed
CLEAR_PRINTS()
CLEAR_HELP()
REMOVE_ALL_BLIPS()
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
KILL_ANY_CONVERSATION()
SET_SAVEHOUSE_RESPAWN_AVAILABLE(SAVEHOUSE_FRANKLIN_SC, FALSE)
IF bCustomGPSActive
SET_GPS_MULTI_ROUTE_RENDER(FALSE)
CLEAR_GPS_MULTI_ROUTE()
bCustomGPSActive = FALSE
ENDIF
IF NOT IS_ENTITY_DEAD(sMainCars[0].veh)
FREEZE_ENTITY_POSITION(sMainCars[0].veh, FALSE)
ENDIF
IF NOT IS_ENTITY_DEAD(sMainCars[1].veh)
FREEZE_ENTITY_POSITION(sMainCars[1].veh, FALSE)
ENDIF
IF NOT IS_PED_INJURED(sSimeon.ped)
TASK_SMART_FLEE_COORD(sSimeon.ped, GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), 200.0, -1)
SET_PED_KEEP_TASK(sSimeon.ped, TRUE)
ENDIF
IF NOT IS_PED_INJURED(sJimmy.ped)
TASK_SMART_FLEE_COORD(sJimmy.ped, GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), 200.0, -1)
SET_PED_KEEP_TASK(sJimmy.ped, TRUE)
ENDIF
SWITCH reason
CASE FAILED_GENERIC
BREAK
CASE FAILED_DESTROYED_A_CAR
strFailText = "AR1_FAILCAR2"
BREAK
CASE FAILED_DESTROYED_CAR
strFailText = "AR1_FAILCAR"
BREAK
CASE FAILED_DESTROYED_BOTH_CARS
strFailText = "AR1_FAILCARS"
BREAK
CASE FAILED_KILLED_BUDDY
strFailText = "AR1_FAILBUDDY"
BREAK
CASE FAILED_LOST_BUDDY
strFailText = "AR1_FAILLOST"
BREAK
CASE FAILED_ABANDONED_LAMAR
strFailText = "AR1_FAILLEFT"
BREAK
CASE FAILED_DESTROYED_FRANKLINS_CAR
strFailText = "CMN_GENDEST"
BREAK
CASE FAILED_CAR_STUCK
strFailText = "AR1_STUCK"
BREAK
CASE FAILED_FRANKLINS_CAR_STUCK
strFailText = "AR1_FRANSTUCK"
BREAK
CASE FAILED_ALERTED_COPS
strFailText = "AR1_FAILCOPS"
BREAK
CASE FAILED_DAMAGED_CARS_BEFORE_RACE
strFailText = "AR1_FAILDAM"
BREAK
CASE FAILED_DAMAGED_CARS_AFTER_DROPOFF
strFailText = "AR1_FAILDAMAF"
BREAK
CASE FAILED_ABANDONED_CAR
strFailText = "AR1_FAILCARLEF"
BREAK
CASE FAILED_TRASH_SHOWROOM
strFailText = "AR1_FAILSHOW1"
BREAK
CASE FAILED_DROVE_IN_SHOWROOM
strFailText = "AR1_FAILSHOW2"
BREAK
CASE FAILED_BROKEN_INTO_CAR
strFailText = "AR1_FAILSHOW3"
BREAK
CASE FAILED_DISTURBED_SHOWROOM
strFailText = "AR1_FAILSHOW4"
BREAK
CASE FAILED_KILLED_SIMEON
strFailText = "AR1_FAILSIMDEAD"
BREAK
CASE FAILED_KILLED_JIMMY
strFailText = "AR1_FAILJIMDEAD"
BREAK
CASE FAILED_LAMARS_CAR_DAMAGED
strFailText = "AR1_FAILDAM2"
BREAK
CASE FAILED_LED_COPS_TO_SHOWROOM
strFailText = "AR1_FCOPSDEAL"
BREAK
CASE FAILED_DISTURBED_DEAL
strFailText = "AR1_FAILSHOW5"
BREAK
ENDSWITCH
MISSION_FLOW_MISSION_FAILED_WITH_REASON(strFailText)
WHILE NOT GET_MISSION_FLOW_SAFE_TO_CLEANUP()
//Maintain anything that could look weird during fade out (e.g. enemies walking off).
WAIT(0)
ENDWHILE
//Deal with group members and same vehicle cleanup.
IF NOT IS_ENTITY_DEAD(sLamar.ped)
IF IS_PED_GROUP_MEMBER(sLamar.ped, PLAYER_GROUP_ID())
OR ARE_CHARS_IN_SAME_VEHICLE(PLAYER_PED_ID(), sLamar.ped)
REMOVE_PED(sLamar.ped, TRUE)
ENDIF
ENDIF
bMissionFailed = TRUE
// 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_CLEANUP() // must only take 1 frame and terminate the thread
ENDIF
ENDPROC
PROC JUMP_TO_STAGE(MISSION_STAGE stage, BOOL bIsDebugJump = FALSE)
DO_FADE_OUT_WITH_WAIT()
iCurrentEvent = 0
eMissionStage = stage
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
MISSION_CLEANUP()
//Update mission checkpoint in case they skipped the stages where it gets set.
IF bIsDebugJump
IF eMissionStage >= STAGE_GO_TO_HOUSE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_GO_HOME, "GO_TO_HOUSE", TRUE)
ELIF eMissionStage >= STAGE_GO_TO_GARAGE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_LOSE_COPS, "LOSE_COPS")
ELIF eMissionStage >= STAGE_CHASE_MID_POINT
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_MID_CHASE, "CHASE_MID_POINT")
ELSE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "CHOOSE_CAR")
ENDIF
ENDIF
ENDPROC
PROC ROTATE_FERRIS_WHEEL(BOOL bForceRotate = FALSE)
CONST_FLOAT FERRIS_CAR_RADIUS 15.3
CONST_FLOAT ANGLE_BETWEEN_FERRIS_CARS 22.5
VECTOR vCurrentRot = GET_ENTITY_ROTATION(objFerrisWheel)
vCurrentRot.x = vCurrentRot.x -@ 5.0
SET_ENTITY_ROTATION(objFerrisWheel, <<vCurrentRot.x, vCurrentRot.y, vCurrentRot.z>>)
INT i = 0
REPEAT COUNT_OF(objFerrisCars) i
FLOAT fAttachAngle = i * ANGLE_BETWEEN_FERRIS_CARS
VECTOR vPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objFerrisWheel, <<0.0, FERRIS_CAR_RADIUS * COS(fAttachAngle), FERRIS_CAR_RADIUS * SIN(fAttachAngle)>>)
IF bForceRotate
SET_ENTITY_COORDS_NO_OFFSET(objFerrisCars[i], vPos)
ELSE
SLIDE_OBJECT(objFerrisCars[i], vPos, <<1.0, 1.0, 1.0>>, FALSE)
ENDIF
ENDREPEAT
ENDPROC
FUNC INT GET_CLOSEST_FERRIS_CAR_TO_COORDS(VECTOR vPos)
INT iClosest = -1
INT i = 0
FLOAT fClosestDist = 0.0
REPEAT COUNT_OF(objFerrisCars) i
FLOAT fDist = VDIST2(vPos, GET_ENTITY_COORDS(objFerrisCars[i]))
IF fDist < fClosestDist
OR iClosest = -1
fClosestDist = fDist
iClosest = i
ENDIF
ENDREPEAT
RETURN iClosest
ENDFUNC
FUNC BOOL SETUP_REQ_BANK_GATES(BOOL bJustRequestAssets = FALSE, BOOL bOnlyCreateCollision = FALSE)
IF NOT DOES_ENTITY_EXIST(objBankGateCollision[0])
REQUEST_MODEL(modelBankGate)
REQUEST_MODEL(modelBankGateCollision)
IF HAS_MODEL_LOADED(modelBankGate)
AND HAS_MODEL_LOADED(modelBankGateCollision)
IF NOT bJustRequestAssets
IF NOT bOnlyCreateCollision
objBankGates[0] = CREATE_OBJECT(modelBankGate, <<-72.785, -682.290, 32.77>>)
objBankGates[1] = CREATE_OBJECT(modelBankGate, <<25.0, -664.5, 30.76>>)
SET_ENTITY_HEADING(objBankGates[0], 69.743)
SET_ENTITY_HEADING(objBankGates[1], 339.996)
FREEZE_ENTITY_POSITION(objBankGates[0], TRUE)
FREEZE_ENTITY_POSITION(objBankGates[1], TRUE)
SET_ENTITY_LOD_DIST(objBankGates[0], 250)
SET_ENTITY_LOD_DIST(objBankGates[1], 250)
ENDIF
objBankGateCollision[0] = CREATE_OBJECT(modelBankGateCollision, <<-72.785, -682.290, 32.87>>)
objBankGateCollision[1] = CREATE_OBJECT(modelBankGateCollision, <<25.0, -664.5, 30.86>>)
SET_ENTITY_HEADING(objBankGateCollision[0], -110.257)
SET_ENTITY_HEADING(objBankGateCollision[1], 339.996)
FREEZE_ENTITY_POSITION(objBankGateCollision[0], TRUE)
FREEZE_ENTITY_POSITION(objBankGateCollision[1], TRUE)
SET_ENTITY_LOD_DIST(objBankGateCollision[0], 250)
SET_ENTITY_LOD_DIST(objBankGateCollision[1], 250)
SET_MODEL_AS_NO_LONGER_NEEDED(modelBankGate)
SET_MODEL_AS_NO_LONGER_NEEDED(modelBankGateCollision)
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_FERRIS_WHEEL(BOOL bJustRequestAssets = FALSE)
CONST_FLOAT FERRIS_CAR_RADIUS 15.3
CONST_FLOAT ANGLE_BETWEEN_FERRIS_CARS 22.5
IF NOT DOES_ENTITY_EXIST(objFerrisWheel)
REQUEST_MODEL(modelFerrisWheel)
REQUEST_MODEL(modelFerrisCar)
IF HAS_MODEL_LOADED(modelFerrisWheel)
AND HAS_MODEL_LOADED(modelFerrisCar)
IF bJustRequestAssets
RETURN TRUE
ELSE
objFerrisWheel = CREATE_OBJECT_NO_OFFSET(modelFerrisWheel, vFerrisWheelCentre)
SET_ENTITY_LOD_DIST(objFerrisWheel, 500)
FREEZE_ENTITY_POSITION(objFerrisWheel, TRUE)
INT i = 0
REPEAT COUNT_OF(objFerrisCars) i
FLOAT fAttachAngle = i * ANGLE_BETWEEN_FERRIS_CARS
VECTOR vPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objFerrisWheel, <<0.0, FERRIS_CAR_RADIUS * COS(fAttachAngle), FERRIS_CAR_RADIUS * SIN(fAttachAngle)>>)
objFerrisCars[i] = CREATE_OBJECT_NO_OFFSET(modelFerrisCar, vPos)
SET_ENTITY_LOD_DIST(objFerrisCars[i], 500)
FREEZE_ENTITY_POSITION(objFerrisCars[i], TRUE)
ENDREPEAT
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(modelFerrisWheel)
SET_MODEL_AS_NO_LONGER_NEEDED(modelFerrisCar)
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_FERRIS_WHEEL_PEDS(BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(pedCreditsFerrisWheel[0])
REQUEST_MODEL(modelFerrisWheelPed1)
REQUEST_MODEL(modelFerrisWheelPed2)
REQUEST_ANIM_DICT(strFerrisWheelAnims)
IF HAS_MODEL_LOADED(modelFerrisWheelPed1)
AND HAS_MODEL_LOADED(modelFerrisWheelPed2)
AND HAS_ANIM_DICT_LOADED(strFerrisWheelAnims)
IF bJustRequestAssets
RETURN TRUE
ELSE
IF DOES_ENTITY_EXIST(objFerrisWheel)
pedCreditsFerrisWheel[0] = CREATE_PED(PEDTYPE_MISSION, modelFerrisWheelPed1, vFerrisWheelCentre + <<0.0, 0.0, 1.0>>)
pedCreditsFerrisWheel[1] = CREATE_PED(PEDTYPE_MISSION, modelFerrisWheelPed2, vFerrisWheelCentre + <<0.0, 0.0, 2.0>>)
pedCreditsFerrisWheel[2] = CREATE_PED(PEDTYPE_MISSION, modelFerrisWheelPed1, vFerrisWheelCentre + <<0.0, 0.0, 3.0>>)
pedCreditsFerrisWheel[3] = CREATE_PED(PEDTYPE_MISSION, modelFerrisWheelPed1, vFerrisWheelCentre + <<0.0, 0.0, 4.0>>)
pedCreditsFerrisWheel[4] = CREATE_PED(PEDTYPE_MISSION, modelFerrisWheelPed2, vFerrisWheelCentre + <<0.0, 0.0, 5.0>>)
pedCreditsFerrisWheel[5] = CREATE_PED(PEDTYPE_MISSION, modelFerrisWheelPed1, vFerrisWheelCentre + <<0.0, 0.0, 6.0>>)
pedCreditsFerrisWheel[6] = CREATE_PED(PEDTYPE_MISSION, modelFerrisWheelPed1, vFerrisWheelCentre + <<0.0, 0.0, 7.0>>)
pedCreditsFerrisWheel[7] = CREATE_PED(PEDTYPE_MISSION, modelFerrisWheelPed2, vFerrisWheelCentre + <<0.0, 0.0, 8.0>>)
pedCreditsFerrisWheel[8] = CREATE_PED(PEDTYPE_MISSION, modelFerrisWheelPed1, vFerrisWheelCentre + <<0.0, 0.0, 9.0>>)
pedCreditsFerrisWheel[9] = CREATE_PED(PEDTYPE_MISSION, modelFerrisWheelPed2, vFerrisWheelCentre + <<0.0, 0.0, 10.0>>)
INT iFerrisCar
TEXT_LABEL_31 strAnim
VECTOR vSceneRot
INT i = 0
REPEAT COUNT_OF(pedCreditsFerrisWheel) i
IF i = 0
strAnim = "Stand_Idle_1_PEDA"
iFerrisCar = 10
vSceneRot = <<0.0, 0.0, 180.0>>
ELIF i = 1
strAnim = "Stand_Idle_1_PEDB"
iFerrisCar = 10
vSceneRot = <<0.0, 0.0, 180.0>>
ELIF i = 2
strAnim = "Stand_Idle_2_PEDA"
iFerrisCar = 9
vSceneRot = <<0.0, 0.0, 300.0>>
ELIF i = 3
strAnim = "Stand_Idle_2_PEDB"
iFerrisCar = 9
vSceneRot = <<0.0, 0.0, 180.0>>
ELIF i = 4
strAnim = "Stand_Idle_1_PEDA"
iFerrisCar = 7
vSceneRot = <<0.0, 0.0, 240.0>>
ELIF i = 5
strAnim = "Stand_Idle_2_PEDB"
iFerrisCar = 5
vSceneRot = <<0.0, 0.0, 0.0>>
ELIF i = 6
strAnim = "Stand_Idle_1_PEDB"
iFerrisCar = 4
vSceneRot = <<0.0, 0.0, 0.0>>
ELIF i = 7
strAnim = "Stand_Idle_2_PEDB"
iFerrisCar = 0
vSceneRot = <<0.0, 0.0, 0.0>>
ELIF i = 8
strAnim = "Stand_Idle_2_PEDA"
iFerrisCar = 15
vSceneRot = <<0.0, 0.0, 60.0>>
ELIF i = 9
strAnim = "Stand_Idle_1_PEDA"
iFerrisCar = 3
vSceneRot = <<0.0, 0.0, 60.0>>
ENDIF
SET_ENTITY_INVINCIBLE(pedCreditsFerrisWheel[i], TRUE)
iSyncSceneFerrisWheel[i] = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, vSceneRot)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncSceneFerrisWheel[i], objFerrisCars[iFerrisCar], -1)
TASK_SYNCHRONIZED_SCENE(pedCreditsFerrisWheel[i], iSyncSceneFerrisWheel[i], strFerrisWheelAnims, strAnim, INSTANT_BLEND_IN, INSTANT_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT, RBF_FALLING | RBF_IMPACT_OBJECT)
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncSceneFerrisWheel[i], TRUE)
ENDREPEAT
SET_MODEL_AS_NO_LONGER_NEEDED(modelFerrisWheelPed1)
SET_MODEL_AS_NO_LONGER_NEEDED(modelFerrisWheelPed2)
ENDIF
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_REQ_SHRINK_OFFICE_LOADED()
IF interiorShrink = NULL
interiorShrink = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-1906.7858, -573.7576, 19.0773>>, "v_psycheoffice")
ELSE
IF NOT IS_INTERIOR_READY(interiorShrink)
#IF IS_DEBUG_BUILD
PRINTLN("Armenian1.sc - Waiting for shrink interior to load.")
#ENDIF
PIN_INTERIOR_IN_MEMORY(interiorShrink)
ELSE
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_JIMMY(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(sJimmy.ped)
REQUEST_NPC_PED_MODEL(CHAR_JIMMY)
IF HAS_NPC_PED_MODEL_LOADED(CHAR_JIMMY)
IF NOT bJustRequestAssets
IF CREATE_NPC_PED_ON_FOOT(sJimmy.ped, CHAR_JIMMY, vPos, fHeading)
SET_PED_COMPONENT_VARIATION(sJimmy.ped, PED_COMP_TORSO, 4, 0)
SET_PED_COMPONENT_VARIATION(sJimmy.ped, PED_COMP_BERD, 1, 0)
SET_PED_COMPONENT_VARIATION(sJimmy.ped, PED_COMP_HAIR, 2, 0)
SET_PED_COMPONENT_VARIATION(sJimmy.ped, PED_COMP_LEG, 0, 1)
SET_PED_COMPONENT_VARIATION(sJimmy.ped, PED_COMP_FEET, 0, 1)
SET_PED_COMPONENT_VARIATION(sJimmy.ped, PED_COMP_SPECIAL, 3, 0)
SET_PED_COMPONENT_VARIATION(sJimmy.ped, PED_COMP_DECL, 2, 0)
SET_PED_CAN_BE_TARGETTED(sJimmy.ped, FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(sJimmy.ped, RELGROUPHASH_PLAYER)
ENDIF
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_SIMEON(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(sSimeon.ped)
REQUEST_NPC_PED_MODEL(CHAR_SIMEON)
IF HAS_NPC_PED_MODEL_LOADED(CHAR_SIMEON)
IF NOT bJustRequestAssets
IF CREATE_NPC_PED_ON_FOOT(sSimeon.ped, CHAR_SIMEON, vPos, fHeading)
SET_PED_COMPONENT_VARIATION(sSimeon.ped, PED_COMP_TORSO, 1, 0)
SET_PED_CAN_BE_TARGETTED(sSimeon.ped, FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(sSimeon.ped, RELGROUPHASH_PLAYER)
ENDIF
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_LAMAR(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bInitialiseEvenIfAlreadyExists = FALSE)
IF NOT DOES_ENTITY_EXIST(sLamar.ped)
OR bInitialiseEvenIfAlreadyExists
BOOL bLamarExists
IF NOT DOES_ENTITY_EXIST(sLamar.ped)
IF CREATE_NPC_PED_ON_FOOT(sLamar.ped, CHAR_LAMAR, vPos, fHeading)
bLamarExists = TRUE
ENDIF
ELSE
bLamarExists = TRUE
ENDIF
IF bLamarExists
SET_PED_COMPONENT_VARIATION(sLamar.ped, PED_COMP_HAIR, 0, 0)
SET_PED_COMPONENT_VARIATION(sLamar.ped, PED_COMP_TORSO, 0, 0)
SET_PED_COMPONENT_VARIATION(sLamar.ped, PED_COMP_LEG, 0, 0)
SET_PED_COMPONENT_VARIATION(sLamar.ped, PED_COMP_HAND, 2, 0)
SET_PED_COMPONENT_VARIATION(sLamar.ped, PED_COMP_SPECIAL2, 0, 0)
SET_PED_COMPONENT_VARIATION(sLamar.ped, PED_COMP_SPECIAL, 0, 0)
SET_PED_CAN_BE_TARGETTED(sLamar.ped, FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(sLamar.ped, RELGROUPHASH_PLAYER)
SET_PED_CONFIG_FLAG(sLamar.ped, PCF_LawWillOnlyAttackIfPlayerIsWanted, TRUE)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 5, sLamar.ped, "LAMAR")
RETURN TRUE
ENDIF
ELSE
IF sConversationPeds.PedInfo[5].Index != sLamar.ped
ADD_PED_FOR_DIALOGUE(sConversationPeds, 5, sLamar.ped, "LAMAR")
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_NINEF(VECTOR vPos, FLOAT fHeading = 0.0)
IF NOT DOES_ENTITY_EXIST(sMainCars[0].veh)
REQUEST_MODEL(modelMainCar1)
IF HAS_MODEL_LOADED(modelMainCar1)
sMainCars[0].veh = CREATE_VEHICLE(modelMainCar1, vPos, fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(sMainCars[0].veh)
SET_VEHICLE_DIRT_LEVEL(sMainCars[0].veh, 0.0)
SET_VEHICLE_COLOURS(sMainCars[0].veh, 111, 111)
SET_VEHICLE_EXTRA_COLOURS(sMainCars[0].veh, 111, 0)
SET_ENTITY_HEALTH(sMainCars[0].veh, MAX_CAR_HEALTH)
SET_VEHICLE_STRONG(sMainCars[0].veh, TRUE)
SET_VEHICLE_HAS_STRONG_AXLES(sMainCars[0].veh, TRUE)
SET_VEHICLE_TYRES_CAN_BURST(sMainCars[0].veh, FALSE)
SET_VEHICLE_AUTOMATICALLY_ATTACHES(sMainCars[0].veh, FALSE)
SET_VEHICLE_NUMBER_PLATE_TEXT(sMainCars[0].veh, "5912FL34")
SET_VEHICLE_CAN_LEAK_OIL(sMainCars[0].veh, FALSE)
SET_VEHICLE_CAN_LEAK_PETROL(sMainCars[0].veh, FALSE)
SET_CAN_AUTO_VAULT_ON_ENTITY(sMainCars[0].veh, FALSE)
SET_CAN_CLIMB_ON_ENTITY(sMainCars[0].veh, FALSE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(sMainCars[0].veh, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMainCar1)
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_RAPIDGT(VECTOR vPos, FLOAT fHeading = 0.0)
IF NOT DOES_ENTITY_EXIST(sMainCars[1].veh)
REQUEST_MODEL(modelMainCar2)
IF HAS_MODEL_LOADED(modelMainCar2)
sMainCars[1].veh = CREATE_VEHICLE(modelMainCar2, vPos, fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(sMainCars[1].veh)
SET_VEHICLE_DIRT_LEVEL(sMainCars[1].veh, 0.0)
SET_VEHICLE_COLOURS(sMainCars[1].veh, 28, 28)
SET_VEHICLE_EXTRA_COLOURS(sMainCars[1].veh, 23, 0)
SET_VEHICLE_STRONG(sMainCars[1].veh, TRUE)
SET_VEHICLE_HAS_STRONG_AXLES(sMainCars[1].veh, TRUE)
SET_VEHICLE_TYRES_CAN_BURST(sMainCars[1].veh, FALSE)
SET_ENTITY_HEALTH(sMainCars[1].veh, MAX_CAR_HEALTH)
SET_VEHICLE_AUTOMATICALLY_ATTACHES(sMainCars[1].veh, FALSE)
SET_VEHICLE_NUMBER_PLATE_TEXT(sMainCars[1].veh, "2603AM56")
SET_VEHICLE_CAN_LEAK_OIL(sMainCars[1].veh, FALSE)
SET_VEHICLE_CAN_LEAK_PETROL(sMainCars[1].veh, FALSE)
SET_CAN_AUTO_VAULT_ON_ENTITY(sMainCars[1].veh, FALSE)
SET_CAN_CLIMB_ON_ENTITY(sMainCars[1].veh, FALSE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(sMainCars[1].veh, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMainCar2)
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SETUP_FRANKLINS_CAR(VECTOR vPos, FLOAT fHeading = 0.0, BOOL bJustRequestAssets = FALSE)
IF NOT IS_VEHICLE_DRIVEABLE(vehFranklinsCar)
REQUEST_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_CAR)
IF HAS_PLAYER_VEH_MODEL_LOADED(CHAR_FRANKLIN, VEHICLE_TYPE_CAR)
IF bJustRequestAssets
RETURN TRUE
ELIF CREATE_PLAYER_VEHICLE(vehFranklinsCar, CHAR_FRANKLIN, vPos, fHeading, TRUE, VEHICLE_TYPE_CAR)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vehFranklinsCar, SC_DOOR_FRONT_LEFT, FALSE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vehFranklinsCar, SC_DOOR_FRONT_RIGHT, FALSE)
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vehFranklinsCar, FALSE)
SET_VEHICLE_STRONG(vehFranklinsCar, TRUE)
SET_VEHICLE_HAS_STRONG_AXLES(vehFranklinsCar, TRUE)
SET_PLAYER_VEHICLE_ALARM_AUDIO_ACTIVE(vehFranklinsCar, TRUE)
RETURN TRUE
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC SETUP_REQ_CAR_CHOICES()
//If the choice hasn't been made yet, use the saved global to do it (the global defaults to the NINEF)
IF iPlayersCar = iBuddiesCar
iPlayersCar = g_iArmenian1VehicleChoice
IF iPlayersCar = NINEF_INDEX
iBuddiesCar = RAPIDGT_INDEX
ELSE
iBuddiesCar = NINEF_INDEX
ENDIF
ENDIF
ENDPROC
PROC SETUP_REQ_ARRIVAL_RECORDING_CHOICES()
//Initialise recording indices depending on which cars were picked, these are used for streaming cutscenes during and after the chase.
IF iBuddiesCar = RAPIDGT_INDEX
iCarrecBuddyEscape = CARREC_BUDDY_ESCAPE_2
iCarrecBuddyArrive = 313
iCarrecPlayerArrive = 312
ELSE
iCarrecBuddyEscape = CARREC_BUDDY_ESCAPE
iCarrecBuddyArrive = 311
iCarrecPlayerArrive = 310
ENDIF
ENDPROC
PROC SETUP_REQ_PUT_PLAYER_INTO_CHOSEN_CAR()
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sMainCars[iPlayersCar].veh)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sMainCars[iPlayersCar].veh)
ENDIF
ENDIF
ENDPROC
PROC SETUP_REQ_LAMAR_INTO_CHOSEN_CAR()
IF NOT IS_PED_INJURED(sLamar.ped)
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
IF NOT IS_PED_IN_VEHICLE(sLamar.ped, sMainCars[iBuddiesCar].veh)
SET_PED_INTO_VEHICLE(sLamar.ped, sMainCars[iBuddiesCar].veh)
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL SETUP_REQ_LOAD_MAIN_CHASE_RECORDING()
IF iBuddiesCar = RAPIDGT_INDEX
iCarrecMain = CARREC_BUDDY_ALTERNATE //Same recording, shifted for new car
ELSE
iCarrecMain = CARREC_BUDDY
ENDIF
REQUEST_VEHICLE_RECORDING(iCarrecMain, strCarrec)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrecMain, strCarrec)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC SETUP_REQ_FORCE_ROOFS_DOWN_FOR_BOTH_CARS()
IF IS_VEHICLE_DRIVEABLE(sMainCars[0].veh)
AND IS_VEHICLE_DRIVEABLE(sMainCars[1].veh)
LOWER_CONVERTIBLE_ROOF(sMainCars[0].veh, TRUE)
LOWER_CONVERTIBLE_ROOF(sMainCars[1].veh, TRUE)
ENDIF
ENDPROC
PROC SETUP_REQ_LAMARS_CHOSEN_CAR_IN_GARAGE()
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
SET_ENTITY_HEADING(sMainCars[iBuddiesCar].veh, fLamarsCarShowroomHeading)
SET_ENTITY_COORDS(sMainCars[iBuddiesCar].veh, vLamarsCarInShowroom)
FREEZE_ENTITY_POSITION(sMainCars[iBuddiesCar].veh, TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sMainCars[iBuddiesCar].veh, FALSE)
ENDIF
ENDPROC
FUNC BOOL SETUP_SHOWROOM_CARS(BOOL bJustRequestAssets = FALSE)
IF NOT bShowroomCarsBlocked
VECTOR vRoomCentre
vRoomCentre = vRoomCorner1 + <<vRoomCorner2.x - vRoomCorner1.x, vRoomCorner2.y - vRoomCorner2.y, vRoomCorner2.z - vRoomCorner2.z>>
CLEAR_AREA_OF_VEHICLES(vRoomCentre, 30.0)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vRoomCorner1, vRoomCorner2, FALSE)
bShowroomCarsBlocked = TRUE
ENDIF
REQUEST_MODEL(BJXL)
REQUEST_MODEL(NINEF)
IF HAS_MODEL_LOADED(BJXL)
AND HAS_MODEL_LOADED(NINEF)
IF NOT bJustRequestAssets
IF NOT DOES_ENTITY_EXIST(vehShowroomCars[0])
vehShowroomCars[0] = CREATE_VEHICLE(NINEF, <<-49.9, -1094.7, 26.1366>>, 96.8607) //Right of Jimmy's car
SET_VEHICLE_COLOURS(vehShowroomCars[0], 31, 0)
SET_VEHICLE_EXTRA_COLOURS(vehShowroomCars[0], 42, 0)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehShowroomCars[0], TRUE)
//SET_ENTITY_COORDS_NO_OFFSET(vehShowroomCars[0], <<-49.9, -1094.7, 26.1>>)
vehShowroomCars[1] = CREATE_VEHICLE(BJXL, <<-46.5, -1097.5, 26.35>>, 108.8107) //Jimmy's car
SET_VEHICLE_COLOURS(vehShowroomCars[1], 126, 126)
SET_VEHICLE_EXTRA_COLOURS(vehShowroomCars[1], 126, 0)
SET_VEHICLE_NUMBER_PLATE_TEXT(vehShowroomCars[1], "57EIG117")
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehShowroomCars[1], TRUE)
//SET_ENTITY_COORDS_NO_OFFSET(vehShowroomCars[1], <<-46.5, -1097.5, 26.4>>)
vehShowroomCars[2] = CREATE_VEHICLE(NINEF, <<-41.7, -1099.5, 26.0304>>, 137.6117) //Left of Jimmy's car
SET_VEHICLE_COLOURS(vehShowroomCars[2], 1, 1)
SET_VEHICLE_EXTRA_COLOURS(vehShowroomCars[2], 15, 0)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehShowroomCars[2], TRUE)
//SET_ENTITY_COORDS_NO_OFFSET(vehShowroomCars[2], <<-41.7, -1099.5, 26.1>>)
vehShowroomCars[3] = CREATE_VEHICLE(BJXL, <<-36.8, -1101.2, 26.0912>>, 151.7322)
SET_VEHICLE_COLOURS(vehShowroomCars[3], 1, 111)
SET_VEHICLE_EXTRA_COLOURS(vehShowroomCars[3], 4, 0)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehShowroomCars[3], TRUE)
//SET_ENTITY_COORDS_NO_OFFSET(vehShowroomCars[3], <<-36.8, -1101.2, 26.1>>)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(BJXL)
SET_MODEL_AS_NO_LONGER_NEEDED(NINEF)
INT i = 0
REPEAT COUNT_OF(vehShowroomCars) i
IF IS_VEHICLE_DRIVEABLE(vehShowroomCars[i])
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehShowroomCars[i], FALSE)
//FREEZE_ENTITY_POSITION(vehShowroomCars[i], TRUE)
ENDIF
ENDREPEAT
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC SETUP_REQ_ABILITY_BAR_NEARLY_FULL()
sRageData.fCurrentRage = 99.0
SPECIAL_ABILITY_CHARGE_NORMALIZED(PLAYER_ID(), sRageData.fCurrentRage / 100.0, TRUE)
ENDPROC
PROC SETUP_REQ_REMOVE_BANK_SHUTTERS()
REMOVE_IPL("DT1_03_Shutter")
SET_BUILDING_STATE(BUILDINGNAME_ES_BANK_CAR_PARK_SHUTTERS, BUILDINGSTATE_DESTROYED)
ENDPROC
FUNC BOOL SETUP_CARS_OUTSIDE_SHOWROOM(BOOL bJustRequestAssets = FALSE)
IF NOT DOES_ENTITY_EXIST(vehCarsOutsideShowroom[0])
REQUEST_MODEL(BLISTA)
IF HAS_MODEL_LOADED(BLISTA)
IF NOT bJustRequestAssets
CLEAR_AREA(<<-11.6041, -1080.8674, 25.6721>>, 20.0, TRUE)
vehCarsOutsideShowroom[0] = CREATE_VEHICLE(BLISTA, <<-8.6907, -1082.0977, 25.6721>>, 128.8319)
SET_MODEL_AS_NO_LONGER_NEEDED(BLISTA)
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC CHECK_SHOWROOM_FAIL()
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<-51.4, -1097.6, 26.4>>) < 10000.0
//Fail if the player drives a car into the showroom.
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)
IF IS_ENTITY_IN_ANGLED_AREA(veh, <<-31.383488,-1108.248535,25.425732>>, <<-34.108696,-1115.328735,28.922327>>, 5.500000)
OR IS_ENTITY_IN_ANGLED_AREA(veh, <<-33.779842,-1107.204712,25.445511>>, <<-57.514992,-1098.495728,29.823339>>, 6.000000)
OR IS_ENTITY_IN_ANGLED_AREA(veh, <<-59.338482,-1090.887573,25.003147>>, <<-26.987392,-1103.201172,28.922327>>, 10.250000)
IF NOT bCurrentVehicleIsOutsideShowroom
MISSION_FAILED(FAILED_BROKEN_INTO_CAR)
ELSE
MISSION_FAILED(FAILED_DROVE_IN_SHOWROOM)
ENDIF
bCurrentVehicleIsOutsideShowroom = FALSE
ELSE
bCurrentVehicleIsOutsideShowroom = TRUE
ENDIF
ELSE
bCurrentVehicleIsOutsideShowroom = FALSE
ENDIF
ENDIF
//Fail if the player fires bullets inside the showroom.
IF HAS_BULLET_IMPACTED_IN_AREA(<<-39.627991,-1099.240112,25.252590>>, 26.5)
OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, <<-39.627991,-1099.240112,25.252590>>, 26.5)
MISSION_FAILED(FAILED_DISTURBED_SHOWROOM)
ENDIF
/*INT i = 0
REPEAT COUNT_OF(objShowroomGlass) i
IF NOT DOES_ENTITY_EXIST(objShowroomGlass[i])
//PRINTLN("Window ", i, " doesn't exist")
IF i = 0
objShowroomGlass[i] = GET_CLOSEST_OBJECT_OF_TYPE(<<-59.8589, -1088.6685, 25.6516>>, 50.0, Prop_Showroom_Glass_1, TRUE)
ELIF i = 1
objShowroomGlass[i] = GET_CLOSEST_OBJECT_OF_TYPE(<<-50.2792, -1104.6271, 25.4362>>, 50.0, Prop_Showroom_Glass_2, TRUE)
ELIF i = 2
objShowroomGlass[i] = GET_CLOSEST_OBJECT_OF_TYPE(<<-45.5477, -1106.2428, 25.4362>>, 50.0, Prop_Showroom_Glass_2, TRUE)
ELIF i = 3
objShowroomGlass[i] = GET_CLOSEST_OBJECT_OF_TYPE(<<-36.3472, -1111.9200, 25.4362>>, 50.0, Prop_Showroom_Glass_2, TRUE)
ELIF i = 4
objShowroomGlass[i] = GET_CLOSEST_OBJECT_OF_TYPE(<<-47.1, -1105.7, 26.4>>, 50.0, Prop_Showroom_Glass_3, TRUE)
ELIF i = 5
objShowroomGlass[i] = GET_CLOSEST_OBJECT_OF_TYPE(<<-47.1, -1105.7, 26.4>>, 50.0, Prop_Showroom_Glass_4, TRUE)
ELIF i = 6
objShowroomGlass[i] = GET_CLOSEST_OBJECT_OF_TYPE(<<-47.1, -1105.7, 26.4>>, 50.0, Prop_Showroom_Glass_5, TRUE)
ELIF i = 7
objShowroomGlass[i] = GET_CLOSEST_OBJECT_OF_TYPE(<<-47.1, -1105.7, 26.4>>, 50.0, Prop_Showroom_Glass_6, TRUE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(objShowroomGlass[i])
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(objShowroomGlass[i], PLAYER_PED_ID())
MISSION_FAILED(FAILED_TRASH_SHOWROOM)
ENDIF
ENDIF
ENDREPEAT*/
//Fail if the player fires bullets into the showroom.
IF IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, <<-31.383488,-1108.248535,25.425732>>, <<-34.108696,-1115.328735,28.922327>>, 5.500000)
OR IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, <<-33.779842,-1107.204712,25.445511>>, <<-57.514992,-1098.495728,29.823339>>, 6.000000)
OR IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, <<-59.338482,-1090.887573,25.003147>>, <<-26.987392,-1103.201172,28.922327>>, 10.250000)
MISSION_FAILED(FAILED_TRASH_SHOWROOM)
ENDIF
ENDIF
ENDPROC
PROC SCALEFORM_SETUP_SINGLE_LINE(STRING strName, FLOAT fFadeInDuration, FLOAT fFadeOutDuration, FLOAT fXAlign, FLOAT fYAlign, STRING strAlign)
BEGIN_SCALEFORM_MOVIE_METHOD(sfCredits, "SETUP_SINGLE_LINE")
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strName)
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fFadeInDuration)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fFadeOutDuration)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fXAlign)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fYAlign)
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strAlign)
END_TEXT_COMMAND_SCALEFORM_STRING()
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SCALEFORM_ADD_TEXT_TO_SINGLE_LINE(STRING strName, STRING strSingleLine, STRING strFont, STRING strHudColour, BOOL bUseLiteralString = TRUE) //, STRING strLanguage = "en", FLOAT fYOffset = 0.0)
BEGIN_SCALEFORM_MOVIE_METHOD(sfCredits, "ADD_TEXT_TO_SINGLE_LINE")
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strName)
END_TEXT_COMMAND_SCALEFORM_STRING()
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strSingleLine)
END_TEXT_COMMAND_SCALEFORM_STRING()
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strFont)
END_TEXT_COMMAND_SCALEFORM_STRING()
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strHudColour)
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bUseLiteralString)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SCALEFORM_SHOW_SINGLE_LINE(STRING strName, FLOAT fStepDuration) //, STRING strAnimInStyle, FLOAT fAnimInValue)
BEGIN_SCALEFORM_MOVIE_METHOD(sfCredits, "SHOW_SINGLE_LINE")
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strName)
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fStepDuration)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SCALEFORM_HIDE_SINGLE_LINE(STRING strName, FLOAT fStepDuration) //, STRING strAnimOutStyle, FLOAT fAnimOutValue)
BEGIN_SCALEFORM_MOVIE_METHOD(sfCredits, "HIDE")
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strName)
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fStepDuration)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SCALEFORM_REMOVE_ALL_SINGLE_LINES()
BEGIN_SCALEFORM_MOVIE_METHOD(sfCredits, "REMOVE_ALL")
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SCALEFORM_SETUP_CREDIT_BLOCK(STRING strName, FLOAT fX, FLOAT fY, STRING strAlign, FLOAT fFadeInDuration, FLOAT fFadeOutDuration)
BEGIN_SCALEFORM_MOVIE_METHOD(sfCredits, "SETUP_CREDIT_BLOCK")
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strName)
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fX)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fY)
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strAlign)
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fFadeInDuration)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fFadeOutDuration)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK(STRING strName, STRING strRole, FLOAT fXOffset, STRING strColour, BOOL bUseLiteralString = TRUE)
BEGIN_SCALEFORM_MOVIE_METHOD(sfCredits, "ADD_ROLE_TO_CREDIT_BLOCK")
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strName)
END_TEXT_COMMAND_SCALEFORM_STRING()
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strRole)
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fXOffset)
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strColour)
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bUseLiteralString)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK(STRING strName, STRING strNames, FLOAT fXOffset, STRING strDelimiter, BOOL bUseLiteralString = TRUE)
BEGIN_SCALEFORM_MOVIE_METHOD(sfCredits, "ADD_NAMES_TO_CREDIT_BLOCK")
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strName)
END_TEXT_COMMAND_SCALEFORM_STRING()
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strNames)
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fXOffset)
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strDelimiter)
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bUseLiteralString)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SCALEFORM_SHOW_CREDIT_BLOCK(STRING strName, FLOAT fStepDuration)
BEGIN_SCALEFORM_MOVIE_METHOD(sfCredits, "SHOW_CREDIT_BLOCK")
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strName)
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fStepDuration)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SCALEFORM_HIDE_CREDIT_BLOCK(STRING strName, FLOAT fStepDuration)
BEGIN_SCALEFORM_MOVIE_METHOD(sfCredits, "HIDE")
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strName)
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fStepDuration)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SCALEFORM_REMOVE_CREDIT_BLOCK(STRING strName)
BEGIN_SCALEFORM_MOVIE_METHOD(sfCredits, "REMOVE")
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strName)
END_TEXT_COMMAND_SCALEFORM_STRING()
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SCALEFORM_REMOVE_ALL_CREDIT_BLOCKS()
BEGIN_SCALEFORM_MOVIE_METHOD(sfCredits, "REMOVE_ALL")
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SCALEFORM_SHOW_LOGO(STRING strName, FLOAT fFadeInDuration, FLOAT fFadeOutDuration, FLOAT fLogoFadeInDuration, FLOAT fLogoFadeOutDuration,
FLOAT fLogoFadeInDelay, FLOAT fLogoFadeOutDelay, FLOAT fLogoScaleDuration)
BEGIN_SCALEFORM_MOVIE_METHOD(sfCredits, "SHOW_LOGO")
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strName)
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fFadeInDuration)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fFadeOutDuration)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fLogoFadeInDuration)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fLogoFadeOutDuration)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fLogoFadeInDelay)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fLogoFadeOutDelay)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fLogoScaleDuration)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SCALEFORM_HIDE_LOGO(STRING strName)
BEGIN_SCALEFORM_MOVIE_METHOD(sfCredits, "HIDE_LOGO")
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(strName)
END_TEXT_COMMAND_SCALEFORM_STRING()
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC UPDATE_TEXT_FOR_CREDITS_SEQUENCE()
INT iCutsceneTime = 0
IF IS_CUTSCENE_PLAYING()
iCutsceneTime = GET_CUTSCENE_TIME()
ENDIF
IF NOT bRequestedCreditsScaleform
sfCredits = REQUEST_SCALEFORM_MOVIE("OPENING_CREDITS")
bRequestedCreditsScaleform = TRUE
ENDIF
#IF IS_DEBUG_BUILD
IF bDebugDisplayCreditsText
STRING strAlign = GET_CONTENTS_OF_TEXT_WIDGET(textWidgetCreditsAlign)
STRING strRole1 = GET_CONTENTS_OF_TEXT_WIDGET(textWidgetRole1)
STRING strRole2 = GET_CONTENTS_OF_TEXT_WIDGET(textWidgetRole2)
STRING strRole3 = GET_CONTENTS_OF_TEXT_WIDGET(textWidgetRole3)
STRING strNames1 = GET_CONTENTS_OF_TEXT_WIDGET(textWidgetNames1)
STRING strNames2 = GET_CONTENTS_OF_TEXT_WIDGET(textWidgetNames2)
STRING strNames3 = GET_CONTENTS_OF_TEXT_WIDGET(textWidgetNames3)
STRING strColour = GET_CONTENTS_OF_TEXT_WIDGET(textWidgetCreditsColour)
TEXT_LABEL strName = iDebugCreditsIndex
SCALEFORM_SETUP_CREDIT_BLOCK(strName, fDebugCreditsBlockX, fDebugCreditsBlockY, strAlign, 0.5, 0.5)
IF NOT IS_STRING_NULL_OR_EMPTY(strRole1)
AND NOT ARE_STRINGS_EQUAL(strRole1, "New text widget")
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK(strName, strRole1, fDebugRole1XOffset, strColour)
ENDIF
IF NOT IS_STRING_NULL_OR_EMPTY(strNames1)
AND NOT ARE_STRINGS_EQUAL(strNames1, "New text widget")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK(strName, strNames1, fDebugNames1XOffset, ",")
ENDIF
IF NOT IS_STRING_NULL_OR_EMPTY(strRole2)
AND NOT ARE_STRINGS_EQUAL(strRole2, "New text widget")
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK(strName, strRole2, fDebugRole2XOffset, strColour)
ENDIF
IF NOT IS_STRING_NULL_OR_EMPTY(strNames2)
AND NOT ARE_STRINGS_EQUAL(strNames2, "New text widget")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK(strName, strNames2, fDebugNames2XOffset, ",")
ENDIF
IF NOT IS_STRING_NULL_OR_EMPTY(strRole3)
AND NOT ARE_STRINGS_EQUAL(strRole3, "New text widget")
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK(strName, strRole3, fDebugRole3XOffset, strColour)
ENDIF
IF NOT IS_STRING_NULL_OR_EMPTY(strNames3)
AND NOT ARE_STRINGS_EQUAL(strNames3, "New text widget")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK(strName, strNames3, fDebugNames3XOffset, ",")
ENDIF
SCALEFORM_SHOW_CREDIT_BLOCK(strName, 0.1666)
iDebugCreditsIndex++
bDebugDisplayCreditsText = FALSE
ENDIF
IF bDebugTestCreditsSingleLine
STRING strAlign = GET_CONTENTS_OF_TEXT_WIDGET(textWidgetCreditsAlign)
STRING strRole1 = GET_CONTENTS_OF_TEXT_WIDGET(textWidgetRole1)
STRING strColour = GET_CONTENTS_OF_TEXT_WIDGET(textWidgetCreditsColour)
TEXT_LABEL strName = iDebugCreditsIndex
SCALEFORM_SETUP_SINGLE_LINE(strName, 0.5, 0.5, fDebugCreditsBlockX, fDebugCreditsBlockY, strAlign)
SCALEFORM_ADD_TEXT_TO_SINGLE_LINE(strName, strRole1, "$font5", strColour)
SCALEFORM_SHOW_SINGLE_LINE(strName, 0.0)
iDebugCreditsIndex++
bDebugTestCreditsSingleLine = FALSE
ENDIF
IF bDebugTestCreditsLogo
SCALEFORM_SHOW_LOGO("TITLE", 4.0, 1.0, 1.5, 1.0, 4.5, 1.5, 15.0)
bDebugTestCreditsLogo = FALSE
ENDIF
IF bDebugTestCreditsLogoHide
SCALEFORM_HIDE_LOGO("TITLE")
bDebugTestCreditsLogoHide = FALSE
ENDIF
IF bDebugClearCreditsText
SCALEFORM_HIDE_CREDIT_BLOCK("debug", 0.1666)
bDebugClearCreditsText = FALSE
ENDIF
#ENDIF
//COMMON OFFSET VALUES:
//Indent names to the right of job title: give them a +60 x offset.
//Left align with space = 150 x offset
//Align just to right of centre = 580 x offset
IF HAS_SCALEFORM_MOVIE_LOADED(sfCredits)
AND NOT bHideCredits
SWITCH iCreditsTextEvent
CASE 0
IF iCutsceneTime >= 5533
SCALEFORM_SETUP_CREDIT_BLOCK("art", 105.0, 115.0, "right", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("art", "Art Director", 0.0, "HUD_COLOUR_FRANKLIN")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("art", "AARON GARBUT", 50.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("art", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 1
IF iCutsceneTime >= 9266
SCALEFORM_HIDE_CREDIT_BLOCK("art", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 2
IF iCutsceneTime >= 10700
SCALEFORM_SETUP_CREDIT_BLOCK("techdir", 120.0, 450.0, "right", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("techdir", "Technical Director", 0.0, "HUD_COLOUR_TREVOR")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("techdir", "ADAM FOWLER", 110.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("techdir", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 3
IF iCutsceneTime >= 14400
SCALEFORM_HIDE_CREDIT_BLOCK("techdir", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 4
IF iCutsceneTime >= 17900
SCALEFORM_SETUP_CREDIT_BLOCK("gamedes", 85.0, 225.0, "right", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("gamedes", "Game Design", 0.0, "HUD_COLOUR_FREEMODE")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("gamedes", "LESLIE BENZIES,IMRAN SARWAR", 50.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("gamedes", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 5
IF iCutsceneTime >= 21633
SCALEFORM_HIDE_CREDIT_BLOCK("gamedes", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 6
IF iCutsceneTime >= 26133
IF ARE_WIDESCREEN_BORDERS_ACTIVE()
SCALEFORM_SETUP_CREDIT_BLOCK("written", 0.0, 50.0, "left", 0.333, 0.333)
ELSE
SCALEFORM_SETUP_CREDIT_BLOCK("written", 0.0, 40.0, "left", 0.333, 0.333)
ENDIF
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("written", "Written By", 80.0, "HUD_COLOUR_MICHAEL")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("written", "DAN HOUSER,RUPERT HUMPHRIES,MICHAEL UNSWORTH", 145.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("written", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 7
IF iCutsceneTime >= 30500 //30666
AND HAS_CUTSCENE_CUT_THIS_FRAME()
SCALEFORM_REMOVE_CREDIT_BLOCK("written")
iCreditsTextEvent++
ENDIF
BREAK
CASE 8
IF iCutsceneTime >= 36533
SCALEFORM_SETUP_CREDIT_BLOCK("assocart", 85.0, 430.0, "right", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("assocart", "Associate Art Directors", 0.0, "HUD_COLOUR_FRANKLIN")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("assocart", "ADAM COCHRANE,MICHAEL KANE", 75.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("assocart", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 9
IF iCutsceneTime >= 40233
SCALEFORM_HIDE_CREDIT_BLOCK("assocart", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 10
IF iCutsceneTime >= 42700
SCALEFORM_SETUP_CREDIT_BLOCK("assisart", 0.0, 440.0, "left", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("assisart", "Assistant Art Director", 105.0, "HUD_COLOUR_TREVOR")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("assisart", "IAN McQUE", 265.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("assisart", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 11
IF iCutsceneTime >= 46436
SCALEFORM_HIDE_CREDIT_BLOCK("assisart", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 12
IF iCutsceneTime >= 49633
SCALEFORM_SETUP_CREDIT_BLOCK("globart", 90.0, 390.0, "right", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("globart", "Global Lead Technical Artist", 0.0, "HUD_COLOUR_FREEMODE")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("globart", "RICK STIRLING", 125.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("globart", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 13
IF iCutsceneTime >= 53000 //53233
AND HAS_CUTSCENE_CUT_THIS_FRAME()
SCALEFORM_REMOVE_CREDIT_BLOCK("globart")
iCreditsTextEvent++
ENDIF
BREAK
CASE 14
IF iCutsceneTime >= 58133
SCALEFORM_SETUP_CREDIT_BLOCK("leadcut", 0.0, 395.0, "left", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("leadcut", "Lead Cutscene Animation", 100.0, "HUD_COLOUR_MICHAEL")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("leadcut", "DERMOT BAILIE,FELIPE BUSQUETS", 248.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("leadcut", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 15
IF iCutsceneTime >= 61800
SCALEFORM_HIDE_CREDIT_BLOCK("leadcut", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 16
IF iCutsceneTime >= 65266
SCALEFORM_SETUP_CREDIT_BLOCK("ingame", 95.0, 320.0, "right", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("ingame", "Lead Ingame Animation", 0.0, "HUD_COLOUR_FRANKLIN")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("ingame", "JIM JAGGER,MARK TENNANT", 115.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("ingame", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 17
IF iCutsceneTime >= 69366
SCALEFORM_HIDE_CREDIT_BLOCK("ingame", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 18
IF iCutsceneTime >= 80133
SCALEFORM_SETUP_CREDIT_BLOCK("animdir", 0.0, 410.0, "left", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("animdir", "Animation Director", 190.0, "HUD_COLOUR_TREVOR")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("animdir", "ROB NELSON", 295.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("animdir", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 19
IF iCutsceneTime >= 83833
SCALEFORM_HIDE_CREDIT_BLOCK("animdir", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 20
IF iCutsceneTime >= 90166
SCALEFORM_SETUP_CREDIT_BLOCK("cutdir", 0.0, 335.0, "left", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("cutdir", "Cutscene Director", 115.0, "HUD_COLOUR_FREEMODE")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("cutdir", "ROD EDGE", 195.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("cutdir", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 21
IF iCutsceneTime >= 93933
SCALEFORM_HIDE_CREDIT_BLOCK("cutdir", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 22
IF iCutsceneTime >= 95600
SCALEFORM_SETUP_CREDIT_BLOCK("leadenv", 90.0, 410.0, "right", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("leadenv", "Principal Lead Environment Artist", 0.0, "HUD_COLOUR_MICHAEL")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("leadenv", "WAYLAND STANDING", 110.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("leadenv", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 23
IF iCutsceneTime >= 99200
SCALEFORM_HIDE_CREDIT_BLOCK("leadenv", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 24
IF iCutsceneTime >= 106766
SCALEFORM_SETUP_CREDIT_BLOCK("envart", 85.0, 315.0, "right", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("envart", "Lead Environment Artists", 0.0, "HUD_COLOUR_FRANKLIN")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("envart", "MICHAEL PIRSO,ABHISHEK AGRAWAL,JODY PILESKI", 60.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("envart", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 25
IF iCutsceneTime >= 110566
SCALEFORM_HIDE_CREDIT_BLOCK("envart", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 26
IF iCutsceneTime >= 114866
SCALEFORM_SETUP_CREDIT_BLOCK("vehart", 0.0, 180.0, "left", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("vehart", "Lead Vehicle Artist", 110.0, "HUD_COLOUR_TREVOR")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("vehart", "JOLYON ORME", 170.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("vehart", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 27
IF iCutsceneTime >= 117300 //117566
AND HAS_CUTSCENE_CUT_THIS_FRAME()
SCALEFORM_REMOVE_CREDIT_BLOCK("vehart")
iCreditsTextEvent++
ENDIF
BREAK
CASE 28
IF iCutsceneTime >= 124866
SCALEFORM_SETUP_CREDIT_BLOCK("princart", 0.0, 370.0, "left", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("princart", "Principal Artists", 105.0, "HUD_COLOUR_FREEMODE")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("princart", "DAVE COOPER,IAIN McNAUGHTON", 195.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("princart", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 29
IF iCutsceneTime >= 127400
SCALEFORM_HIDE_CREDIT_BLOCK("princart", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 30
IF iCutsceneTime >= 133733
SCALEFORM_SETUP_CREDIT_BLOCK("princlight", 100.0, 75.0, "right", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("princlight", "Principal Lighting Artist", 0.0, "HUD_COLOUR_MICHAEL")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("princlight", "OWEN SHEPHERD", 90.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("princlight", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 31
IF iCutsceneTime >= 136366
SCALEFORM_HIDE_CREDIT_BLOCK("princlight", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 32
IF iCutsceneTime >= 139166
IF GET_IS_HIDEF()
AND NOT ARE_WIDESCREEN_BORDERS_ACTIVE()
SCALEFORM_SETUP_CREDIT_BLOCK("outsource", 175.0, 15.0, "right", 0.333, 0.333)
ELSE
SCALEFORM_SETUP_CREDIT_BLOCK("outsource", 175.0, 50.0, "right", 0.333, 0.333)
ENDIF
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("outsource", "Outsource Manager", 0.0, "HUD_COLOUR_FRANKLIN")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("outsource", "SCOTT WILSON", 75.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("outsource", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 33
IF iCutsceneTime >= 141500 //141833
AND HAS_CUTSCENE_CUT_THIS_FRAME()
SCALEFORM_REMOVE_CREDIT_BLOCK("outsource")
iCreditsTextEvent++
ENDIF
BREAK
CASE 34
IF iCutsceneTime >= 144500
SCALEFORM_SETUP_CREDIT_BLOCK("2D", 0.0, 85.0, "left", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("2D", "2D/UI Director", 110.0, "HUD_COLOUR_TREVOR")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("2D", "STUART PETRI", 135.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("2D", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 35
IF iCutsceneTime >= 147500 //147866
AND HAS_CUTSCENE_CUT_THIS_FRAME()
SCALEFORM_REMOVE_CREDIT_BLOCK("2D")
iCreditsTextEvent++
ENDIF
BREAK
CASE 36
IF iCutsceneTime >= 152633
SCALEFORM_SETUP_CREDIT_BLOCK("Music", 110.0, 405.0, "right", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("Music", "Music Director", 0.0, "HUD_COLOUR_FREEMODE")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("Music", "CRAIG CONNER", 30.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("Music", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 37
IF iCutsceneTime >= 156100
SCALEFORM_HIDE_CREDIT_BLOCK("Music", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 38
IF iCutsceneTime >= 156700
SCALEFORM_SETUP_CREDIT_BLOCK("Musicpro", 250.0, 380.0, "right", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("Musicpro", "Music Producer", 0.0, "HUD_COLOUR_MICHAEL")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("Musicpro", "IVAN PAVLOVICH", 45.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("Musicpro", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 39
IF iCutsceneTime >= 159600
SCALEFORM_HIDE_CREDIT_BLOCK("Musicpro", 0.0)
iCreditsTextEvent++
ENDIF
BREAK
CASE 40
IF iCutsceneTime >= 161900
SCALEFORM_SETUP_CREDIT_BLOCK("audiodir", 0.0, 405.0, "left", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("audiodir", "Audio Director", 180.0, "HUD_COLOUR_FRANKLIN")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("audiodir", "MATTHEW SMITH", 215.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("audiodir", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 41
IF iCutsceneTime >= 165566
SCALEFORM_HIDE_CREDIT_BLOCK("audiodir", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 42
IF iCutsceneTime >= 166366
IF GET_IS_HIDEF()
AND NOT ARE_WIDESCREEN_BORDERS_ACTIVE()
SCALEFORM_SETUP_CREDIT_BLOCK("leadaud", 40.0, 25.0, "right", 0.333, 0.333)
ELSE
SCALEFORM_SETUP_CREDIT_BLOCK("leadaud", 40.0, 48.0, "right", 0.333, 0.333)
ENDIF
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("leadaud", "Lead Audio Programmer", 0.0, "HUD_COLOUR_MICHAEL")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("leadaud", "ALASTAIR MACGREGOR", 55.0, ",")
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("leadaud", "Lead Sound Designers", 30.0, "HUD_COLOUR_MICHAEL")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("leadaud", "JEFFREY WHITCHER,STEVE DONOHOE", 85.0, ",")
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("leadaud", "Dialogue Supervisor", 60.0, "HUD_COLOUR_MICHAEL")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("leadaud", "WILL MORTON", 115.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("leadaud", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 43
IF iCutsceneTime >= 168833
SCALEFORM_HIDE_CREDIT_BLOCK("leadaud", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 44
IF iCutsceneTime >= 170133
SCALEFORM_SETUP_CREDIT_BLOCK("score", 0.0, 325.0, "left", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("score", "Original Score", 80.0, "HUD_COLOUR_TREVOR")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("score", "TANGERINE DREAM,WOODY JACKSON,ALCHEMIST & OH NO", 165.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("score", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 45
IF iCutsceneTime >= 173033
SCALEFORM_HIDE_CREDIT_BLOCK("score", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 46
IF iCutsceneTime >= 175066
SCALEFORM_SETUP_CREDIT_BLOCK("assotech", 80.0, 365.0, "right", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("assotech", "Associate Technical Directors", 0.0, "HUD_COLOUR_FREEMODE")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("assotech", "PHIL HOOKER,KLAAS SCHILSTRA", 125.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("assotech", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 47
IF iCutsceneTime >= 178700
SCALEFORM_HIDE_CREDIT_BLOCK("assotech", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 48
IF iCutsceneTime >= 180500
IF GET_IS_HIDEF()
SCALEFORM_SETUP_CREDIT_BLOCK("assitech", 0.0, 325.0, "left", 0.333, 0.333)
ELSE
SCALEFORM_SETUP_CREDIT_BLOCK("assitech", 0.0, 305.0, "left", 0.333, 0.333)
ENDIF
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("assitech", "Assistant Technical Directors", 190.0, "HUD_COLOUR_FRANKLIN")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("assitech", "HUGUES ST-PIERRE,TOM SHEPHERD,BRETT LAMING,KEVIN HOARE", 245.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("assitech", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 49
IF iCutsceneTime >= 183800
SCALEFORM_HIDE_CREDIT_BLOCK("assitech", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 50
IF iCutsceneTime >= 185066
IF GET_IS_HIDEF()
SCALEFORM_SETUP_CREDIT_BLOCK("proglead", 0.0, 280.0, "left", 0.333, 0.333)
ELSE
SCALEFORM_SETUP_CREDIT_BLOCK("proglead", 0.0, 260.0, "left", 0.333, 0.333)
ENDIF
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("proglead", "Programming Leads", 125.0, "HUD_COLOUR_MICHAEL")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("proglead", "ALEX HADJADJ,BEN LYONS,CHRIS SWINHOE,COLIN ENTWISTLE,DAVID HYND", 215.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("proglead", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 51
IF iCutsceneTime >= 188100
SCALEFORM_HIDE_CREDIT_BLOCK("proglead", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 52
IF iCutsceneTime >= 189066
IF GET_IS_HIDEF()
SCALEFORM_SETUP_CREDIT_BLOCK("proglead2", 0.0, 280.0, "left", 0.333, 0.333)
ELSE
SCALEFORM_SETUP_CREDIT_BLOCK("proglead2", 0.0, 260.0, "left", 0.333, 0.333)
ENDIF
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("proglead2", "Programming Leads", 125.0, "HUD_COLOUR_MICHAEL")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("proglead2", "DANIEL YELLAND,JOHN WHYTE,JONATHON ASHCROFT,MICHAEL KREHAN", 215.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("proglead2", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 53
IF iCutsceneTime >= 192066
SCALEFORM_HIDE_CREDIT_BLOCK("proglead2", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 54
IF iCutsceneTime >= 193266
IF GET_IS_HIDEF()
SCALEFORM_SETUP_CREDIT_BLOCK("toollead", 125.0, 395.0, "right", 0.333, 0.333)
ELSE
SCALEFORM_SETUP_CREDIT_BLOCK("toollead", 125.0, 355.0, "right", 0.333, 0.333)
ENDIF
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("toollead", "Lead Tools Programmers", 0.0, "HUD_COLOUR_TREVOR")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("toollead", "DAVID MUIR,LUKE OPENSHAW", 75.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("toollead", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 55
IF iCutsceneTime >= 195833
SCALEFORM_HIDE_CREDIT_BLOCK("toollead", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 56
IF iCutsceneTime >= 196733
SCALEFORM_SETUP_CREDIT_BLOCK("scripter", 0.0, 355.0, "left", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("scripter", "Lead Scripters", 120.0, "HUD_COLOUR_FRANKLIN")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("scripter", "BENJAMIN ROLLINSON,KENNETH ROSS,MATTHEW BOOTON", 185.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("scripter", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 57
IF iCutsceneTime >= 200033
SCALEFORM_HIDE_CREDIT_BLOCK("scripter", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 58
IF iCutsceneTime >= 200666
SCALEFORM_SETUP_CREDIT_BLOCK("scripter2", 0.0, 355.0, "left", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("scripter2", "Lead Scripters", 120.0, "HUD_COLOUR_FRANKLIN")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("scripter2", "ROBERT BRAY,ROSS WALLACE", 185.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("scripter2", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 59
IF iCutsceneTime >= 203966
SCALEFORM_HIDE_CREDIT_BLOCK("scripter2", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 60
IF iCutsceneTime >= 207166
SCALEFORM_SETUP_CREDIT_BLOCK("studio", 90.0, 345.0, "right", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("studio", "Studio Director", 0.0, "HUD_COLOUR_TREVOR")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("studio", "ANDREW SEMPLE", 35.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("studio", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 61
IF iCutsceneTime >= 210500 //210800
AND HAS_CUTSCENE_CUT_THIS_FRAME()
SCALEFORM_REMOVE_CREDIT_BLOCK("studio")
iCreditsTextEvent++
ENDIF
BREAK
CASE 62
IF iCutsceneTime >= 212500
SCALEFORM_SETUP_CREDIT_BLOCK("assispro", 0.0, 420.0, "left", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("assispro", "Assistant Producer", 90.0, "HUD_COLOUR_FREEMODE")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("assispro", "WILLIAM MILLS", 125.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("assispro", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 63
IF iCutsceneTime >= 216036
SCALEFORM_HIDE_CREDIT_BLOCK("assispro", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 64
IF iCutsceneTime >= 219400
SCALEFORM_SETUP_CREDIT_BLOCK("copro", 105.0, 320.0, "right", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("copro", "Co-Producer", 0.0, "HUD_COLOUR_MICHAEL")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("copro", "IMRAN SARWAR", 35.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("copro", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 65
IF iCutsceneTime >= 222866
SCALEFORM_HIDE_CREDIT_BLOCK("copro", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 66
IF iCutsceneTime > 225566
SCALEFORM_SETUP_CREDIT_BLOCK("pro", 0.0, 125.0, "left", 0.333, 0.333)
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("pro", "Producer", 120.0, "HUD_COLOUR_FRANKLIN")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("pro", "LESLIE BENZIES", 165.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("pro", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 67
IF iCutsceneTime > 228500 //228900 is the exact time
AND HAS_CUTSCENE_CUT_THIS_FRAME()
SCALEFORM_REMOVE_CREDIT_BLOCK("pro")
iCreditsTextEvent++
ENDIF
BREAK
CASE 68
IF iCutsceneTime > 230666
IF ARE_WIDESCREEN_BORDERS_ACTIVE()
SCALEFORM_SETUP_CREDIT_BLOCK("execpro", 215.0, 50.0, "right", 0.333, 0.333)
ELSE
SCALEFORM_SETUP_CREDIT_BLOCK("execpro", 215.0, 45.0, "right", 0.333, 0.333)
ENDIF
SCALEFORM_ADD_ROLE_TO_CREDIT_BLOCK("execpro", "Executive Producer", 0.0, "HUD_COLOUR_TREVOR")
SCALEFORM_ADD_NAMES_TO_CREDIT_BLOCK("execpro", "SAM HOUSER", 95.0, ",")
SCALEFORM_SHOW_CREDIT_BLOCK("execpro", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
CASE 69
IF iCutsceneTime > 235333
SCALEFORM_HIDE_CREDIT_BLOCK("execpro", 0.1666)
iCreditsTextEvent++
ENDIF
BREAK
ENDSWITCH
DRAW_SCALEFORM_MOVIE_FULLSCREEN(sfCredits, 255, 255, 255, 255)
ENDIF
ENDPROC
/*PROC DO_NEW_LOAD_SCENE_FOR_CREDITS_SHOT(CREDITS_STAGE eStage, FLOAT fFarClip)
VECTOR vNextCamPos, vNextCamRot, vNextCamDir
GET_CREDITS_SHOT_CAM_POS_AND_ROT(eStage, vNextCamPos, vNextCamRot)
vNextCamDir = CONVERT_ROTATION_TO_DIRECTION_VECTOR(vNextCamRot)
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_START(vNextCamPos - vNextCamDir * 10.0, vNextCamDir, fFarClip, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
ENDIF
ENDPROC*/
PROC UPDATE_CREDITS_CARS_MOVEMENT(BOOL bCarMustHaveDriver = FALSE)
INT i = 0
FLOAT fSpeed = 15.0
REPEAT COUNT_OF(vehCreditsCars) i
IF NOT IS_ENTITY_DEAD(vehCreditsCars[i])
AND (NOT IS_VEHICLE_SEAT_FREE(vehCreditsCars[i], VS_DRIVER) OR NOT bCarMustHaveDriver)
IF i = 1 OR i = 4 OR i = 7 OR i = 9 OR i = 10 OR i = 14 OR i = 18
fSpeed = 17.5
ELIF i = 6 OR i = 8 OR i = 11 OR i = 12 OR i = 13 OR i = 15 OR i = 16 OR i = 19
fSpeed = 20.0
ENDIF
SET_VEHICLE_FORWARD_SPEED(vehCreditsCars[i], fSpeed)
ENDIF
ENDREPEAT
ENDPROC
PROC REQUEST_CREDITS_PED_ANIMS()
REQUEST_ANIM_DICT("move_f@jogger")
REQUEST_ANIM_DICT("amb@world_human_stand_mobile@female@text@base")
REQUEST_ANIM_DICT("amb@world_human_tourist_mobile@female@base")
REQUEST_ANIM_DICT("amb@world_human_hang_out_street@male_b@base")
REQUEST_ANIM_DICT("amb@world_human_hang_out_street@male_a@base")
REQUEST_ANIM_DICT("amb@world_human_smoking@female@base")
REQUEST_ANIM_DICT("amb@world_human_hang_out_street@female_arms_crossed@base")
ENDPROC
FUNC BOOL HAVE_CREDITS_PED_ANIMS_LOADED()
IF HAS_ANIM_DICT_LOADED("move_f@jogger")
AND HAS_ANIM_DICT_LOADED("amb@world_human_stand_mobile@female@text@base")
AND HAS_ANIM_DICT_LOADED("amb@world_human_tourist_mobile@female@base")
AND HAS_ANIM_DICT_LOADED("amb@world_human_hang_out_street@male_b@base")
AND HAS_ANIM_DICT_LOADED("amb@world_human_hang_out_street@male_a@base")
AND HAS_ANIM_DICT_LOADED("amb@world_human_smoking@female@base")
AND HAS_ANIM_DICT_LOADED("amb@world_human_hang_out_street@female_arms_crossed@base")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC REMOVE_CREDITS_PED_ANIMS()
REMOVE_ANIM_DICT("move_f@jogger")
REMOVE_ANIM_DICT("amb@world_human_stand_mobile@female@text@base")
REMOVE_ANIM_DICT("amb@world_human_tourist_mobile@female@base")
REMOVE_ANIM_DICT("amb@world_human_hang_out_street@male_b@base")
REMOVE_ANIM_DICT("amb@world_human_hang_out_street@male_a@base")
REMOVE_ANIM_DICT("amb@world_human_smoking@female@base")
REMOVE_ANIM_DICT("amb@world_human_hang_out_street@female_arms_crossed@base")
ENDPROC
///Warps a ped and plays the given anims on them instantly. Intended use is for the credits, where a pool of peds are being warped around for each shot to fill out the background.
PROC WARP_PED_FOR_CREDITS_SHOT(PED_INDEX ped, VECTOR vPos, FLOAT fHeading, STRING strAnimDict, STRING strAnimName, BOOL bChangeAppearance = TRUE)
IF NOT IS_PED_INJURED(ped)
IF bChangeAppearance
SET_PED_RANDOM_COMPONENT_VARIATION(ped)
ENDIF
FREEZE_ENTITY_POSITION(ped, FALSE)
SET_ENTITY_VISIBLE(ped, TRUE)
SET_ENTITY_COORDS(ped, vPos)
SET_ENTITY_HEADING(ped, fHeading)
TASK_PLAY_ANIM(ped, strAnimDict, strAnimName, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_LOOPING)
FORCE_PED_AI_AND_ANIMATION_UPDATE(ped)
ENDIF
ENDPROC
///Warps a ped underground, used during the credits to hide peds when they're not needed for a particular shot.
PROC WARP_PED_UNDERGROUND(PED_INDEX ped)
IF NOT IS_PED_INJURED(ped)
VECTOR vPos = GET_ENTITY_COORDS(ped)
SET_ENTITY_COORDS(ped, <<vPos.x, vPos.y, -10.0>>)
FREEZE_ENTITY_POSITION(ped, TRUE)
SET_ENTITY_VISIBLE(ped, FALSE)
ENDIF
ENDPROC
PROC UPDATE_CREDITS_EVENTS()
INT iCutsceneTime = 0
INT i = 0
BOOL bCameraJustCut = FALSE
//VECTOR vCamPos = GET_FINAL_RENDERED_CAM_COORD()
IF IS_CUTSCENE_PLAYING()
iCutsceneTime = GET_CUTSCENE_TIME()
ENDIF
IF HAS_CUTSCENE_CUT_THIS_FRAME()
bCameraJustCut = TRUE
ENDIF
//Force the stage if we're before the credits sequence.
IF iCutsceneTime < 107000
eCreditsStage = CREDITS_STAGE_0_SHRINK
ENDIF
SWITCH eCreditsStage
CASE CREDITS_STAGE_0_SHRINK
IF iCutsceneTime > 107000
IF NOT IS_AUDIO_SCENE_ACTIVE("ARM_1_MONTAGE_MUTES")
START_AUDIO_SCENE("ARM_1_MONTAGE_MUTES")
ENDIF
SET_VEHICLE_POPULATION_BUDGET(3)
SET_PED_POPULATION_BUDGET(1)
iRandomCarCreationEvent = 0
eCreditsStage = CREDITS_STAGE_1_LEAVE_SHRINK
ENDIF
IF iCutsceneTime > 102000
REQUEST_MODEL(CAVALCADE)
REQUEST_MODEL(ALPHA)
REQUEST_MODEL(modelCreditsMale)
ENDIF
BREAK
CASE CREDITS_STAGE_1_LEAVE_SHRINK
REQUEST_MODEL(CAVALCADE)
REQUEST_MODEL(ALPHA)
REQUEST_MODEL(modelCreditsMale)
IF iCutsceneTime > 110000
//NG Request: Have lots more cars. Don't stick any drivers in most of them to help with streaming/execution time.
IF iRandomCarCreationEvent < COUNT_OF(vehCreditsCars)
IF iRandomCarCreationEvent = 0
CLEAR_ANGLED_AREA_OF_VEHICLES(<<-1975.175293,-466.151398,8.161919>>, <<-1753.042358,-647.606628,15.556465>>, 40.250000)
CREATE_RANDOM_CAR_AT_POS(CAVALCADE, modelCreditsMale, <<-1964.729688,-495.260382,11.494138>>, -129.5, iRandomCarCreationEvent, 15.0, TRUE)
ELIF iRandomCarCreationEvent = 1
CREATE_RANDOM_CAR_AT_POS(ALPHA, modelCreditsMale, <<-1938.364746,-509.801208,10.946412>>, -129.5, iRandomCarCreationEvent, 17.5, TRUE)
ELIF iRandomCarCreationEvent = 2
CREATE_RANDOM_CAR_AT_POS(CAVALCADE, modelCreditsMale, <<-1862.437012,-538.817749,11.623542>>, 50.7, iRandomCarCreationEvent, 15.0, TRUE)
ELIF iRandomCarCreationEvent = 3
CREATE_RANDOM_CAR_AT_POS(ALPHA, modelCreditsMale, <<-1814.225171,-577.825586,11.201730>>, 50.7, iRandomCarCreationEvent, 15.0)
ELIF iRandomCarCreationEvent = 4
CREATE_RANDOM_CAR_AT_POS(ALPHA, modelCreditsMale, <<-1889.468872,-523.005249,11.196733>>, 50.7, iRandomCarCreationEvent, 17.5)
ELIF iRandomCarCreationEvent = 5
CREATE_RANDOM_CAR_AT_POS(CAVALCADE, modelCreditsMale, <<-1896.674072,-509.762024,11.152614>>, 50.7, iRandomCarCreationEvent, 15.0)
ELIF iRandomCarCreationEvent = 6
CREATE_RANDOM_CAR_AT_POS(ALPHA, modelCreditsMale, <<-1872.837036,-544.377747,11.216076>>, 50.7, iRandomCarCreationEvent, 20.0)
ELIF iRandomCarCreationEvent = 7
CREATE_RANDOM_CAR_AT_POS(CAVALCADE, modelCreditsMale, <<-1902.065308,-539.558533,11.041574>>, -129.5, iRandomCarCreationEvent, 17.5)
ELIF iRandomCarCreationEvent = 8
CREATE_RANDOM_CAR_AT_POS(ALPHA, modelCreditsMale, <<-1939.535156,-500.975464,11.265397>>, -129.5, iRandomCarCreationEvent, 20.0)
ELIF iRandomCarCreationEvent = 9
CREATE_RANDOM_CAR_AT_POS(CAVALCADE, modelCreditsMale, <<-1883.366943,-554.134827,10.846096>>, -129.5, iRandomCarCreationEvent, 17.5)
ELIF iRandomCarCreationEvent = 10
CREATE_RANDOM_CAR_AT_POS(CAVALCADE, modelCreditsMale, <<-1953.545044,-496.880798,12.011486>>, -129.5, iRandomCarCreationEvent, 17.5)
ELIF iRandomCarCreationEvent = 11
CREATE_RANDOM_CAR_AT_POS(CAVALCADE, modelCreditsMale, <<-1971.761841,-474.743469,11.883854>>, -129.5, iRandomCarCreationEvent, 20.0)
ELIF iRandomCarCreationEvent = 12
CREATE_RANDOM_CAR_AT_POS(CAVALCADE, modelCreditsMale, <<-1915.927734,-520.575684,11.618545>>, -129.5, iRandomCarCreationEvent, 20.0)
ELIF iRandomCarCreationEvent = 13
CREATE_RANDOM_CAR_AT_POS(CAVALCADE, modelCreditsMale, <<-1895.090332,-537.958374,12.235410>>, -129.5, iRandomCarCreationEvent, 20.0)
ELIF iRandomCarCreationEvent = 14
CREATE_RANDOM_CAR_AT_POS(CAVALCADE, modelCreditsMale, <<-1788.681519,-605.775452,10.994529>>, 50.7, iRandomCarCreationEvent, 17.5)
ELIF iRandomCarCreationEvent = 15
CREATE_RANDOM_CAR_AT_POS(CAVALCADE, modelCreditsMale, <<-1796.478638,-606.588684,10.792778>>, 50.7, iRandomCarCreationEvent, 20.0)
ELIF iRandomCarCreationEvent = 16
CREATE_RANDOM_CAR_AT_POS(CAVALCADE, modelCreditsMale, <<-1830.822388,-578.447571,11.585022>>, 50.7, iRandomCarCreationEvent, 20.0)
ELIF iRandomCarCreationEvent = 17
CREATE_RANDOM_CAR_AT_POS(CAVALCADE, modelCreditsMale, <<-1829.729980,-565.703979,11.653636>>, 50.7, iRandomCarCreationEvent, 15.0)
ELIF iRandomCarCreationEvent = 18
CREATE_RANDOM_CAR_AT_POS(CAVALCADE, modelCreditsMale, <<-1848.125977,-557.549011,11.957444>>, 50.7, iRandomCarCreationEvent, 17.5)
ELIF iRandomCarCreationEvent = 19
CREATE_RANDOM_CAR_AT_POS(CAVALCADE, modelCreditsMale, <<-1908.515503,-515.021973,12.003843>>, 50.7, iRandomCarCreationEvent, 20.0)
ENDIF
iRandomCarCreationEvent++
ENDIF
ENDIF
IF bCameraJustCut
SET_MODEL_AS_NO_LONGER_NEEDED(CAVALCADE)
SET_MODEL_AS_NO_LONGER_NEEDED(ALPHA)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCreditsMale)
UPDATE_CREDITS_CARS_MOVEMENT()
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] UPDATE_CREDITS_EVENTS: Managed to create ", iRandomCarCreationEvent, " cars, cutscene time = ", iCutsceneTime)
eCreditsStage = CREDITS_STAGE_2_OVERHEAD
ENDIF
BREAK
CASE CREDITS_STAGE_2_OVERHEAD
UPDATE_CREDITS_CARS_MOVEMENT()
IF bCameraJustCut
eCreditsStage = CREDITS_STAGE_3_SPORTS_CAR
ENDIF
BREAK
CASE CREDITS_STAGE_3_SPORTS_CAR
//1755215 - Stop vehicles spawning on camera during this shot.
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
UPDATE_CREDITS_CARS_MOVEMENT()
IF bCameraJustCut
//Warp some of the cars created in the overhead shot so we get to see them in this shot. Delete the rest to save memory.
IF NOT IS_ENTITY_DEAD(vehCreditsCars[0])
SET_ENTITY_COORDS(vehCreditsCars[0], <<-1742.428711,-681.913696,10.033356>>)
SET_ENTITY_HEADING(vehCreditsCars[0], -132.316299)
SET_VEHICLE_ON_GROUND_PROPERLY(vehCreditsCars[0])
SET_VEHICLE_FORWARD_SPEED(vehCreditsCars[0], 15.0)
IF NOT IS_PED_INJURED(pedCreditsCars[0])
TASK_VEHICLE_MISSION(pedCreditsCars[0], vehCreditsCars[0], NULL, MISSION_CRUISE, 15.0, DRIVINGMODE_STOPFORCARS, 5.0, 5.0)
SET_PED_KEEP_TASK(pedCreditsCars[0], TRUE)
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(vehCreditsCars[1])
SET_ENTITY_COORDS(vehCreditsCars[1], <<-1744.738281,-688.366455,9.544968>>)
SET_ENTITY_HEADING(vehCreditsCars[1], -130.699753)
SET_VEHICLE_ON_GROUND_PROPERLY(vehCreditsCars[1])
SET_VEHICLE_FORWARD_SPEED(vehCreditsCars[1], 15.0)
IF NOT IS_PED_INJURED(pedCreditsCars[1])
TASK_VEHICLE_MISSION(pedCreditsCars[1], vehCreditsCars[1], NULL, MISSION_CRUISE, 15.0, DRIVINGMODE_STOPFORCARS, 5.0, 5.0)
SET_PED_KEEP_TASK(pedCreditsCars[1], TRUE)
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(vehCreditsCars[2])
SET_ENTITY_COORDS(vehCreditsCars[2], <<-1759.989868,-666.778870,9.905796>>)
SET_ENTITY_HEADING(vehCreditsCars[2], -133.360596)
SET_VEHICLE_ON_GROUND_PROPERLY(vehCreditsCars[2])
SET_VEHICLE_FORWARD_SPEED(vehCreditsCars[2], 15.0)
IF NOT IS_PED_INJURED(pedCreditsCars[2])
TASK_VEHICLE_MISSION(pedCreditsCars[2], vehCreditsCars[2], NULL, MISSION_CRUISE, 15.0, DRIVINGMODE_STOPFORCARS, 5.0, 5.0)
SET_PED_KEEP_TASK(pedCreditsCars[2], TRUE)
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(vehCreditsCars[3])
SET_ENTITY_COORDS(vehCreditsCars[3], <<-1734.6860, -734.4443, 9.4153>>)
SET_ENTITY_HEADING(vehCreditsCars[3], 139.5574)
SET_VEHICLE_ON_GROUND_PROPERLY(vehCreditsCars[3])
SET_VEHICLE_FORWARD_SPEED(vehCreditsCars[3], 0.0)
REMOVE_PED(pedCreditsCars[3], TRUE)
ENDIF
REPEAT COUNT_OF(pedCreditsCars) i
IF i > 3
REMOVE_PED(pedCreditsCars[i], TRUE)
ENDIF
ENDREPEAT
REPEAT COUNT_OF(vehCreditsCars) i
IF i > 3
REMOVE_VEHICLE(vehCreditsCars[i], TRUE)
ENDIF
ENDREPEAT
eCreditsStage = CREDITS_STAGE_4_SPORTS_CAR_PARK
ENDIF
BREAK
CASE CREDITS_STAGE_4_SPORTS_CAR_PARK
SETUP_REQ_FERRIS_WHEEL(TRUE)
UPDATE_CREDITS_CARS_MOVEMENT(TRUE)
IF bCameraJustCut
SET_VEHICLE_POPULATION_BUDGET(0)
//Make sure any cars created by the script are deleted by this point.
REPEAT COUNT_OF(pedCreditsCars) i
REMOVE_PED(pedCreditsCars[i], TRUE)
ENDREPEAT
REPEAT COUNT_OF(vehCreditsCars) i
REMOVE_VEHICLE(vehCreditsCars[i], TRUE)
ENDREPEAT
eCreditsStage = CREDITS_STAGE_5_YOGA
ENDIF
BREAK
CASE CREDITS_STAGE_5_YOGA
REQUEST_MODEL(modelCreditsBoat)
REQUEST_MODEL(modelCreditsBoatPed)
REQUEST_VEHICLE_RECORDING(CARREC_CREDITS_BOAT_1, strCarrec)
REQUEST_PTFX_ASSET()
SETUP_REQ_FERRIS_WHEEL(TRUE)
IF bCameraJustCut
IF iCutsceneTime < 129500 //Don't set if the events have gone out of sync with the cutscene timings (e.g. due to debug or cutscene changes).
SETUP_REQ_FERRIS_WHEEL()
REMOVE_IPL("ferris_finale_Anim")
ENDIF
eCreditsStage = CREDITS_STAGE_6_FERRIS_FLAG
ENDIF
BREAK
CASE CREDITS_STAGE_6_FERRIS_FLAG
IF DOES_ENTITY_EXIST(objFerrisWheel)
ROTATE_FERRIS_WHEEL()
ENDIF
REQUEST_MODEL(modelCreditsBoat)
REQUEST_MODEL(modelCreditsBoatPed)
REQUEST_VEHICLE_RECORDING(CARREC_CREDITS_BOAT_1, strCarrec)
REQUEST_PTFX_ASSET()
IF bCameraJustCut
IF iCutsceneTime < 132000 //Don't set if the events have gone out of sync with the cutscene timings (e.g. due to debug or cutscene changes).
//Create the boat and start playback synched with water
IF HAS_MODEL_LOADED(modelCreditsBoat)
AND HAS_MODEL_LOADED(modelCreditsBoatPed)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CREDITS_BOAT_1, strCarrec)
vehCreditsBoat = CREATE_VEHICLE(modelCreditsBoat, <<-1657.1, -1174.0, 0.5>>, 91.6)
pedCreditsBoat = CREATE_PED_INSIDE_VEHICLE(vehCreditsBoat, PEDTYPE_MISSION, modelCreditsBoatPed)
SET_VEHICLE_LOD_MULTIPLIER(vehCreditsBoat, 5.0)
SET_ENTITY_LOAD_COLLISION_FLAG(vehCreditsBoat, TRUE)
SET_VEHICLE_COLOURS(vehCreditsBoat, 0, 111)
SET_VEHICLE_EXTRA_COLOURS(vehCreditsBoat, 3, 0)
SET_VEHICLE_ENGINE_ON(vehCreditsBoat, TRUE, TRUE)
START_PLAYBACK_RECORDED_VEHICLE(vehCreditsBoat, CARREC_CREDITS_BOAT_1, strCarrec, FALSE)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehCreditsBoat, 2450.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehCreditsBoat, FALSE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehCreditsBoat, TRUE)
IF HAS_PTFX_ASSET_LOADED()
ptfxCreditsBoat[0] = START_PARTICLE_FX_LOOPED_ON_ENTITY("cs_water_boat_prop", vehCreditsBoat, <<0.0, -4.6, -1.0>>, <<0.0, 0.0, 0.0>>)
ptfxCreditsBoat[1] = START_PARTICLE_FX_LOOPED_ON_ENTITY("cs_water_boat_Jetmax_bow", vehCreditsBoat, <<0.0, 4.2, -0.5>>, <<0.0, 0.0, 180.0>>)
SET_PARTICLE_FX_LOOPED_EVOLUTION(ptfxCreditsBoat[0], "forward", 1.0)
SET_PARTICLE_FX_LOOPED_EVOLUTION(ptfxCreditsBoat[1], "speed", 1.0)
ENDIF
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedCreditsBoat, TRUE)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(modelCreditsBoat)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCreditsBoatPed)
ENDIF
//Request: force time on the pier shots.
SET_CLOCK_TIME(9, 30, 0)
iCreditsEvent = 0
eCreditsStage = CREDITS_STAGE_7_FERRIS_OVERHEAD
ENDIF
BREAK
CASE CREDITS_STAGE_7_FERRIS_OVERHEAD
IF DOES_ENTITY_EXIST(objFerrisWheel)
ROTATE_FERRIS_WHEEL()
ENDIF
IF NOT IS_ENTITY_DEAD(vehCreditsBoat)
AND NOT IS_PED_INJURED(pedCreditsBoat)
IF iCreditsEvent = 0
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehCreditsBoat)
IF GET_TIME_POSITION_IN_RECORDING(vehCreditsBoat) > 2850.0
iCreditsEvent++
ENDIF
ENDIF
ENDIF
ENDIF
REQUEST_VEHICLE_RECORDING(CARREC_CREDITS_BOAT_2, strCarrec)
IF bCameraJustCut
REPEAT COUNT_OF(pedCreditsFerrisWheel) i
REMOVE_PED(pedCreditsFerrisWheel[i], TRUE)
ENDREPEAT
REPEAT COUNT_OF(objFerrisCars) i
REMOVE_OBJECT(objFerrisCars[i], TRUE)
ENDREPEAT
REMOVE_OBJECT(objFerrisWheel, TRUE)
REMOVE_ANIM_DICT(strFerrisWheelAnims)
REQUEST_IPL("ferris_finale_Anim")
IF NOT IS_ENTITY_DEAD(vehCreditsBoat)
IF IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(vehCreditsBoat)
OR IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehCreditsBoat)
STOP_PLAYBACK_RECORDED_VEHICLE(vehCreditsBoat)
ENDIF
REMOVE_VEHICLE_RECORDING(CARREC_CREDITS_BOAT_1, strCarrec)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_CREDITS_BOAT_2, strCarrec)
START_PLAYBACK_RECORDED_VEHICLE(vehCreditsBoat, CARREC_CREDITS_BOAT_2, strCarrec, FALSE)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehCreditsBoat, 6250.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehCreditsBoat, FALSE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehCreditsBoat, TRUE)
ENDIF
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(modelCreditsSailboat) //Too late to create the sailboat if it wasn't created already.
//Request: gradually set the clock time back to default.
SET_CLOCK_TIME(9, 0, 0)
iCreditsEvent = 0
eCreditsStage = CREDITS_STAGE_8_COUPLE_PIER
ENDIF
BREAK
CASE CREDITS_STAGE_8_COUPLE_PIER
IF iCreditsEvent = 0
IF NOT IS_ENTITY_DEAD(vehCreditsBoat)
AND NOT IS_PED_INJURED(pedCreditsBoat)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehCreditsBoat)
IF GET_TIME_POSITION_IN_RECORDING(vehCreditsBoat) > 6350.0
STOP_PLAYBACK_RECORDED_VEHICLE(vehCreditsBoat)
TASK_VEHICLE_DRIVE_TO_COORD(pedCreditsBoat, vehCreditsBoat, <<-1852.052124,-1318.397461,0.496157>>, 40.0, DRIVINGSTYLE_STRAIGHTLINE,
modelCreditsBoat, DF_DontSteerAroundPlayerPed | DF_ForceStraightLine, 1.0, 100.0)
iCreditsEvent++
ENDIF
ENDIF
ENDIF
ENDIF
IF bCameraJustCut
REMOVE_PED(pedCreditsBoat, TRUE)
REMOVE_VEHICLE(vehCreditsBoat, TRUE)
REMOVE_VEHICLE(vehCreditsSailboat, TRUE)
IF ptfxCreditsBoat[0] != NULL
STOP_PARTICLE_FX_LOOPED(ptfxCreditsBoat[0])
ptfxCreditsBoat[0] = NULL
ENDIF
IF ptfxCreditsBoat[1] != NULL
STOP_PARTICLE_FX_LOOPED(ptfxCreditsBoat[1])
ptfxCreditsBoat[1] = NULL
ENDIF
REMOVE_VEHICLE_RECORDING(CARREC_CREDITS_BOAT_1, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_CREDITS_BOAT_2, strCarrec)
REMOVE_PTFX_ASSET()
//Request: reset the clock change from the previous shot.
SET_CLOCK_TIME(8, 0, 0)
eCreditsStage = CREDITS_STAGE_9_MAD_CYCLIST
ENDIF
BREAK
CASE CREDITS_STAGE_9_MAD_CYCLIST
IF bCameraJustCut
bGrabbedMapObjectsForCredits = FALSE
eCreditsStage = CREDITS_STAGE_10_GYM
ENDIF
BREAK
CASE CREDITS_STAGE_10_GYM
//The next shot is pretty bare: take some props from around the area and place them in the shot.
OBJECT_INDEX objBoard1, objBoard2, objBoard3, objBox, objBag, objBag2, objParasol, objLilo, objBall
//The parasol object pops if grabbed on the same frame as the camera cut, so try to grab it earlier.
IF NOT bGrabbedMapObjectsForCredits
IF bCameraJustCut
OR iCutsceneTime > 141400
objParasol = GET_CLOSEST_OBJECT_OF_TYPE(<<-1801.2965, -883.5159, 3.5508>>, 3.0, prop_beach_parasol_03, FALSE)
IF DOES_ENTITY_EXIST(objParasol)
AND DOES_ENTITY_HAVE_DRAWABLE(objParasol)
AND IS_ENTITY_VISIBLE(objParasol)
//The parasol is currently popping so we might need to leave it where it is.
//SET_ENTITY_COORDS_NO_OFFSET(objParasol, <<-1805.7079, -869.5021, 4.6517>>)
//SET_ENTITY_ROTATION(objParasol, <<-39.9600, -39.2255, -59.3607>>)
//FREEZE_ENTITY_POSITION(objParasol, TRUE)
ENDIF
bGrabbedMapObjectsForCredits = TRUE
ENDIF
ENDIF
IF bCameraJustCut
//First batch of objects: surf board gear.
objBoard1 = GET_CLOSEST_OBJECT_OF_TYPE(<<-1816.1573, -905.8969, 2.0968>>, 3.0, prop_surf_board_04, FALSE)
objBoard2 = GET_CLOSEST_OBJECT_OF_TYPE(<<-1816.1573, -905.8969, 2.0968>>, 3.0, prop_surf_board_ldn_02, FALSE)
objBoard3 = GET_CLOSEST_OBJECT_OF_TYPE(<<-1816.1573, -905.8969, 2.0968>>, 3.0, prop_surf_board_ldn_04, FALSE)
objBox = GET_CLOSEST_OBJECT_OF_TYPE(<<-1816.1573, -905.8969, 2.0968>>, 3.0, prop_coolbox_01, FALSE)
objBag = GET_CLOSEST_OBJECT_OF_TYPE(<<-1816.1573, -905.8969, 2.0968>>, 3.0, prop_beach_bag_01b, FALSE)
objLilo = GET_CLOSEST_OBJECT_OF_TYPE(<<-1790.4347, -881.3105, 5.3852>>, 3.0, prop_beach_lilo_01, FALSE)
objBag2 = GET_CLOSEST_OBJECT_OF_TYPE(<<-1801.2965, -883.5159, 3.5508>>, 3.0, prop_beach_bag_01b, FALSE)
objBall = GET_CLOSEST_OBJECT_OF_TYPE(<<-1801.2965, -883.5159, 3.5508>>, 3.0, prop_beachball_01, FALSE)
//First batch (surfing gear): it's only safe to move these if they've all streamed in.
IF (DOES_ENTITY_EXIST(objBoard1) AND DOES_ENTITY_HAVE_DRAWABLE(objBoard1) AND IS_ENTITY_VISIBLE(objBoard1))
AND (DOES_ENTITY_EXIST(objBoard2) AND DOES_ENTITY_HAVE_DRAWABLE(objBoard2) AND IS_ENTITY_VISIBLE(objBoard2))
AND (DOES_ENTITY_EXIST(objBoard3) AND DOES_ENTITY_HAVE_DRAWABLE(objBoard3) AND IS_ENTITY_VISIBLE(objBoard3))
AND (DOES_ENTITY_EXIST(objBox) AND DOES_ENTITY_HAVE_DRAWABLE(objBox) AND IS_ENTITY_VISIBLE(objBox))
AND (DOES_ENTITY_EXIST(objBag) AND DOES_ENTITY_HAVE_DRAWABLE(objBag) AND IS_ENTITY_VISIBLE(objBag))
SET_ENTITY_COORDS_NO_OFFSET(objBoard1, <<-1808.0835, -855.4938, 6.3014>>)
SET_ENTITY_ROTATION(objBoard1, <<0.0000, -2.5000, 140.0400>>)
FREEZE_ENTITY_POSITION(objBoard1, TRUE)
SET_ENTITY_COORDS_NO_OFFSET(objBoard2, <<-1807.4043, -854.8961, 5.7159>>)
SET_ENTITY_ROTATION(objBoard2, <<-79.9200, 77.4000, -62.6400>>)
FREEZE_ENTITY_POSITION(objBoard2, TRUE)
SET_ENTITY_COORDS_NO_OFFSET(objBoard3, <<-1806.4600, -856.6586, 5.8052>>)
SET_ENTITY_ROTATION(objBoard3, <<79.9200, 87.4800, 92.5200>>)
FREEZE_ENTITY_POSITION(objBoard3, TRUE)
SET_ENTITY_COORDS_NO_OFFSET(objBox, <<-1807.9530, -855.9752, 5.5244>>)
SET_ENTITY_ROTATION(objBox, <<0.0000, -0.0000, 102.6000>>)
FREEZE_ENTITY_POSITION(objBox, TRUE)
SET_ENTITY_COORDS_NO_OFFSET(objBag, <<-1808.0911, -856.6115, 5.5709>>)
SET_ENTITY_ROTATION(objBag, <<0.9658, 8.5644, -142.5600>>)
FREEZE_ENTITY_POSITION(objBag, TRUE)
ENDIF
//Second batch of objects: sunbathing gear. NOTE: this includes the parasol but that has to be grabbed earlier to prevent pops.
//The parasol seems to always be grabbed so it should be safe to have any combination of objects here.
IF DOES_ENTITY_EXIST(objLilo)
AND DOES_ENTITY_HAVE_DRAWABLE(objLilo)
AND IS_ENTITY_VISIBLE(objLilo)
SET_ENTITY_COORDS_NO_OFFSET(objLilo, <<-1805.2048, -868.6416, 4.8800>>)
SET_ENTITY_ROTATION(objLilo, <<10.0800, 2.5200, -44.8016>>)
FREEZE_ENTITY_POSITION(objLilo, TRUE)
ENDIF
IF DOES_ENTITY_EXIST(objBag2)
AND DOES_ENTITY_HAVE_DRAWABLE(objBag2)
AND IS_ENTITY_VISIBLE(objBag2)
SET_ENTITY_COORDS_NO_OFFSET(objBag2, <<-1806.2352, -867.9008, 4.8612>>)
SET_ENTITY_ROTATION(objBag2, <<-2.5200, 15.1200, -115.3976>>)
FREEZE_ENTITY_POSITION(objBag2, TRUE)
ENDIF
IF DOES_ENTITY_EXIST(objBall)
AND DOES_ENTITY_HAVE_DRAWABLE(objBall)
AND IS_ENTITY_VISIBLE(objBall)
SET_ENTITY_COORDS_NO_OFFSET(objBall, <<-1806.3030, -868.5082, 4.9113>>)
SET_ENTITY_ROTATION(objBall, <<0.0000, 0.0000, -44.9999>>)
FREEZE_ENTITY_POSITION(objBall, TRUE)
ENDIF
eCreditsStage = CREDITS_STAGE_11_SUNBATHERS
ENDIF
BREAK
CASE CREDITS_STAGE_11_SUNBATHERS
IF bCameraJustCut
eCreditsStage = CREDITS_STAGE_12_SUNBATHER_DOG
ENDIF
BREAK
CASE CREDITS_STAGE_12_SUNBATHER_DOG
REQUEST_MODEL(modelCreditsFemale)
REQUEST_MODEL(modelCreditsMale)
REQUEST_MODEL(modelJoggerFemale)
REQUEST_CREDITS_PED_ANIMS()
IF iCutsceneTime < 147500
AND HAVE_CREDITS_PED_ANIMS_LOADED()
IF NOT DOES_ENTITY_EXIST(pedCreditsCars[CREDITS_FEMALE_1]) //WORLD_HUMAN_SMOKING
IF HAS_MODEL_LOADED(modelCreditsFemale)
pedCreditsCars[CREDITS_FEMALE_1] = CREATE_PED(PEDTYPE_MISSION, modelCreditsFemale, <<-1773.271851,-707.433777,9.775657>>, 143.8)
TASK_PLAY_ANIM(pedCreditsCars[CREDITS_FEMALE_1], "amb@world_human_smoking@female@base", "base", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_LOOPING)
ENDIF
ELIF NOT DOES_ENTITY_EXIST(pedCreditsCars[CREDITS_FEMALE_2]) //WORLD_HUMAN_STAND_MOBILE
IF HAS_MODEL_LOADED(modelCreditsFemale)
pedCreditsCars[CREDITS_FEMALE_2] = CREATE_PED(PEDTYPE_MISSION, modelCreditsFemale, <<-1780.794800,-707.496765,9.633821>>, 127.3)
TASK_PLAY_ANIM(pedCreditsCars[CREDITS_FEMALE_2], "amb@world_human_stand_mobile@female@text@base", "base", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_LOOPING)
ENDIF
ELIF NOT DOES_ENTITY_EXIST(pedCreditsCars[CREDITS_MALE_1]) //WORLD_HUMAN_DRINKING
IF HAS_MODEL_LOADED(modelCreditsMale)
pedCreditsCars[CREDITS_MALE_1] = CREATE_PED(PEDTYPE_MISSION, modelCreditsMale, <<-1809.9529, -683.1652, 9.4015>>, 203.0419)
TASK_PLAY_ANIM(pedCreditsCars[CREDITS_MALE_1], "amb@world_human_hang_out_street@male_b@base", "base", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_LOOPING)
ENDIF
ELIF NOT DOES_ENTITY_EXIST(pedCreditsCars[CREDITS_FEMALE_3]) //WORLD_HUMAN_TOURIST_MOBILE
IF HAS_MODEL_LOADED(modelCreditsFemale)
pedCreditsCars[CREDITS_FEMALE_3] = CREATE_PED(PEDTYPE_MISSION, modelCreditsFemale, <<-1799.859741,-690.161316,9.609697>>, 145.5)
TASK_PLAY_ANIM(pedCreditsCars[CREDITS_FEMALE_3], "amb@world_human_tourist_mobile@female@base", "base", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_LOOPING)
ENDIF
ELIF NOT DOES_ENTITY_EXIST(pedCreditsCars[CREDITS_MALE_2]) //WORLD_HUMAN_HANG_OUT_STREET
IF HAS_MODEL_LOADED(modelCreditsMale)
pedCreditsCars[CREDITS_MALE_2] = CREATE_PED(PEDTYPE_MISSION, modelCreditsMale, <<-1827.309204,-660.842224,9.916418>>, -157.6)
TASK_PLAY_ANIM(pedCreditsCars[CREDITS_MALE_2], "amb@world_human_hang_out_street@male_b@base", "base", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_LOOPING)
ENDIF
ELIF NOT DOES_ENTITY_EXIST(pedCreditsCars[CREDITS_MALE_3]) //WORLD_HUMAN_HANG_OUT_STREET
IF HAS_MODEL_LOADED(modelCreditsMale)
pedCreditsCars[CREDITS_MALE_3] = CREATE_PED(PEDTYPE_MISSION, modelCreditsMale, <<-1826.733276,-661.967346,9.725348>>, 20.3)
TASK_PLAY_ANIM(pedCreditsCars[CREDITS_MALE_3], "amb@world_human_hang_out_street@male_a@base", "base", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_LOOPING)
ENDIF
ELIF NOT DOES_ENTITY_EXIST(pedCreditsCars[CREDITS_MALE_4]) //WORLD_HUMAN_STAND_MOBILE
IF HAS_MODEL_LOADED(modelCreditsMale)
pedCreditsCars[CREDITS_MALE_4] = CREATE_PED(PEDTYPE_MISSION, modelCreditsMale, <<-1809.3574, -684.6357, 9.4120>>, 21.1289)
TASK_PLAY_ANIM(pedCreditsCars[CREDITS_MALE_4], "amb@world_human_hang_out_street@male_a@base", "base", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_LOOPING)
ENDIF
ELIF NOT DOES_ENTITY_EXIST(pedCreditsCars[CREDITS_JOGGER_1]) //WORLD_HUMAN_JOG
IF HAS_MODEL_LOADED(modelJoggerFemale)
pedCreditsCars[CREDITS_JOGGER_1] = CREATE_PED(PEDTYPE_MISSION, modelJoggerFemale, <<-1817.0607, -682.0644, 9.4120>>, 230.3514)
TASK_PLAY_ANIM(pedCreditsCars[CREDITS_JOGGER_1], "move_f@jogger", "run", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_LOOPING)
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedCreditsCars[CREDITS_JOGGER_1])
ENDIF
ENDIF
ENDIF
IF bCameraJustCut
AND iCutsceneTime > 146000
SET_MODEL_AS_NO_LONGER_NEEDED(modelCreditsFemale)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCreditsMale)
SET_MODEL_AS_NO_LONGER_NEEDED(modelJoggerFemale)
eCreditsStage = CREDITS_STAGE_14_HOUSES
ENDIF
BREAK
//This stage is now gone.
/*CASE CREDITS_STAGE_13_SUNBATHER_DOG_2
IF bCameraJustCut
eCreditsStage = CREDITS_STAGE_14_HOUSES
ENDIF
BREAK*/
CASE CREDITS_STAGE_14_HOUSES
IF bCameraJustCut
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_FEMALE_1], <<-1868.0334, -625.9962, 10.2611>>, 336.5973, "amb@world_human_smoking@female@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_FEMALE_2], <<-1881.9839, -618.1794, 10.4857>>, 150.3923, "amb@world_human_stand_mobile@female@text@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_FEMALE_3], <<-1893.5, -602.4, 10.8224>>, 151.6628, "amb@world_human_hang_out_street@female_arms_crossed@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_1], <<-1867.4463, -624.8217, 10.3410>>, 124.0036, "amb@world_human_hang_out_street@male_b@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_2], <<-1868.4, -625.2, 10.2360>>, -116.2, "amb@world_human_hang_out_street@male_a@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_3], <<-1830.2104, -664.5304, 9.3778>>, 299.2157, "amb@world_human_hang_out_street@male_b@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_4], <<-1829.2007, -663.9257, 9.3505>>, 119.4014, "amb@world_human_hang_out_street@male_a@base", "base")
WARP_PED_UNDERGROUND(pedCreditsCars[CREDITS_JOGGER_1])
eCreditsStage = CREDITS_STAGE_15_MICHAEL_JOGGERS
ENDIF
BREAK
CASE CREDITS_STAGE_15_MICHAEL_JOGGERS
IF bCameraJustCut
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_FEMALE_1], <<-1983.5428, -529.3809, 10.6952>>, 230.9089, "move_f@jogger", "run")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_FEMALE_2], <<-1919.4448, -588.8778, 10.6731>>, 170.8960, "amb@world_human_stand_mobile@female@text@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_1], <<-1918.5061, -581.2005, 10.8527>>, 202.4282, "amb@world_human_hang_out_street@male_b@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_2], <<-1917.5505, -582.8298, 10.7776>>, 35.8903, "amb@world_human_hang_out_street@male_a@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_3], <<-1932.9749, -569.0629, 10.8524>>, 135.6026, "amb@world_human_hang_out_street@male_b@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_JOGGER_1], <<-1906.1226, -602.3423, 10.6828>>, 50.9085, "move_f@jogger", "run")
WARP_PED_UNDERGROUND(pedCreditsCars[CREDITS_FEMALE_3])
WARP_PED_UNDERGROUND(pedCreditsCars[CREDITS_MALE_4])
eCreditsStage = CREDITS_STAGE_16_MICHAEL_JOGGERS_2
ENDIF
BREAK
CASE CREDITS_STAGE_16_MICHAEL_JOGGERS_2
IF bCameraJustCut
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_FEMALE_1], <<-1891.1615, -712.9316, 6.5149>>, 191.8786, "amb@world_human_tourist_mobile@female@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_1], <<-1878.5149, -696.8825, 8.3940>>, 32.4760, "amb@world_human_hang_out_street@male_b@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_2], <<-1879.1495, -695.0729, 8.4385>>, 205.4313, "amb@world_human_hang_out_street@male_a@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_3], <<-1893.1689, -631.4039, 10.1937>>, 155.5788, "amb@world_human_hang_out_street@male_b@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_FEMALE_2], <<-1893.8379, -632.8634, 10.0878>>, 325.8723, "amb@world_human_hang_out_street@female_arms_crossed@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_JOGGER_1], <<-1883.5461, -725.7193, 6.3307>>, 225.0816, "move_f@jogger", "run")
WARP_PED_UNDERGROUND(pedCreditsCars[CREDITS_MALE_4])
WARP_PED_UNDERGROUND(pedCreditsCars[CREDITS_FEMALE_3])
SET_CLOCK_TIME(8, 0, 0)
SET_WEATHER_TYPE_NOW_PERSIST("clear")
SET_PED_POPULATION_BUDGET(3)
eCreditsStage = CREDITS_STAGE_17_BUM
ENDIF
BREAK
CASE CREDITS_STAGE_17_BUM
IF bCameraJustCut
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_FEMALE_1], <<-1912.0662, -602.6298, 10.5848>>, 294.1278, "amb@world_human_smoking@female@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_FEMALE_2], <<-1898.8030, -603.1610, 10.6174>>, 207.0302, "amb@world_human_hang_out_street@female_arms_crossed@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_1], <<-1897.5013, -604.7260, 10.6416>>, 66.1810, "amb@world_human_hang_out_street@male_b@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_2], <<-1899.6445, -603.7774, 10.6646>>, 256.1585, "amb@world_human_hang_out_street@male_a@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_JOGGER_1], <<-1906.1023, -604.9014, 10.6828>>, 229.4289, "move_f@jogger", "run")
WARP_PED_UNDERGROUND(pedCreditsCars[CREDITS_FEMALE_3])
WARP_PED_UNDERGROUND(pedCreditsCars[CREDITS_MALE_3])
WARP_PED_UNDERGROUND(pedCreditsCars[CREDITS_MALE_4])
CLEAR_AREA_OF_PEDS(<<-1849.9, -592.3, 18.3>>, 35.0)
eCreditsStage = CREDITS_STAGE_18_MICHAEL_BUM
ENDIF
BREAK
CASE CREDITS_STAGE_18_MICHAEL_BUM
IF bCameraJustCut
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_FEMALE_1], <<-1881.9484, -607.5357, 14.4512>>, 129.3375, "amb@world_human_smoking@female@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_FEMALE_2], <<-1904.5576, -593.6984, 10.8258>>, 37.8397, "amb@world_human_hang_out_street@female_arms_crossed@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_1], <<-1889.8230, -605.4258, 10.8539>>, 170.2484, "amb@world_human_hang_out_street@male_b@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_2], <<-1889.4088, -606.6351, 10.8001>>, 30.0624, "amb@world_human_hang_out_street@male_a@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_3], <<-1905.2600, -592.3629, 10.8546>>, 177.2372, "amb@world_human_hang_out_street@male_b@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_4], <<-1905.2896, -593.6451, 10.7538>>, 343.4001, "amb@world_human_hang_out_street@male_a@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_JOGGER_1], <<-1964.4635, -554.6491, 10.6827>>, 230.4146, "move_f@jogger", "run")
WARP_PED_UNDERGROUND(pedCreditsCars[CREDITS_FEMALE_3])
CLEAR_AREA_OF_PEDS(<<-1849.9, -592.3, 18.3>>, 35.0)
eCreditsStage = CREDITS_STAGE_19_MICHAEL_SIT
ENDIF
BREAK
CASE CREDITS_STAGE_19_MICHAEL_SIT
IF bCameraJustCut
IF IS_AUDIO_SCENE_ACTIVE("ARM_1_MONTAGE_MUTES")
STOP_AUDIO_SCENE("ARM_1_MONTAGE_MUTES")
ENDIF
CLEAR_AREA_OF_PEDS(<<-1849.9, -592.3, 18.3>>, 35.0)
eCreditsStage = CREDITS_STAGE_20_FRANKLIN_ARRIVES
ENDIF
BREAK
CASE CREDITS_STAGE_20_FRANKLIN_ARRIVES
IF bCameraJustCut
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_FEMALE_2], <<-1868.5097, -641.6480, 10.0853>>, 182.5072, "amb@world_human_hang_out_street@female_arms_crossed@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_FEMALE_3], <<-1857.7383, -634.5464, 10.0832>>, 150.5682, "amb@world_human_stand_mobile@female@text@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_1], <<-1867.7147, -642.4875, 10.1098>>, 78.5870, "amb@world_human_hang_out_street@male_b@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_2], <<-1868.9943, -642.2708, 10.1240>>, 275.0369, "amb@world_human_hang_out_street@male_a@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_3], <<-1869.9099, -632.1488, 10.1310>>, 224.8968, "amb@world_human_hang_out_street@male_b@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_MALE_4], <<-1869.0247, -633.5297, 10.1163>>, 36.4653, "amb@world_human_hang_out_street@male_a@base", "base")
WARP_PED_FOR_CREDITS_SHOT(pedCreditsCars[CREDITS_JOGGER_1], <<-1880.8080, -626.5896, 10.3331>>, 229.4668, "move_f@jogger", "run")
CLEAR_AREA_OF_PEDS(<<-1849.9, -592.3, 18.3>>, 35.0)
eCreditsStage = CREDITS_STAGE_21_LAMAR_ASKS_MICHAEL
ENDIF
BREAK
CASE CREDITS_STAGE_21_LAMAR_ASKS_MICHAEL
IF bCameraJustCut
eCreditsStage = CREDITS_STAGE_22_END
ENDIF
BREAK
CASE CREDITS_STAGE_22_END
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
IF bDebugDisplayCreditsInfo
PRINTLN("Armenian1.sc - credits stage = ", ENUM_TO_INT(eCreditsStage), " Time = ", iCutsceneTime)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
REPEAT COUNT_OF(pedCreditsCars) i
IF NOT IS_PED_INJURED(pedCreditsCars[i])
TEXT_LABEL strText = i
DRAW_DEBUG_TEXT_ABOVE_ENTITY(pedCreditsCars[i], strText, 1.0)
ENDIF
ENDREPEAT
ENDIF
#ENDIF
ENDPROC
/// PURPOSE:
/// Placeholder stage for mocap
PROC OPENING_CUTSCENE()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
#IF FEATURE_GEN9_STANDALONE
//url:bugstar:7481277 - Ensure late autosave requests don't run during this cutscene.
CPRINTLN(DEBUG_FLOW, "Clearing autosave requests at the start of the Armenain1 intro cutscene.")
CLEAR_AUTOSAVE_REQUESTS()
#ENDIF
DO_FADE_OUT_WITH_WAIT()
SETTIMERA(0)
//Reduce budgets during the cutscene (no vehicles required, peds will likely be scripted or done in the cutscene).
SET_VEHICLE_POPULATION_BUDGET(0)
SET_PED_POPULATION_BUDGET(0)
bRequestedCreditsScaleform = FALSE
//Guarantee that the player is Franklin.
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
WHILE NOT SET_CURRENT_SELECTOR_PED(SELECTOR_PED_FRANKLIN)
WAIT(0)
ENDWHILE
ENDIF
//Warp the player over to the cutscene start area.
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-1907.3496, -577.2352, 19.1223>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 136.9707)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_WEATHER_TYPE_NOW_PERSIST("clear")
//Begin streaming all of the required assets.
REQUEST_CUTSCENE(strStartCutscene)
SET_SRL_READAHEAD_TIMES(9, 9, 9, 9)
WHILE TIMERA() < 10000
IF SETUP_REQ_SHRINK_OFFICE_LOADED()
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_START_SPHERE(<<-1907.4, -577.8, 18.8>>, 10.0)
ELSE
IF IS_NEW_LOAD_SCENE_LOADED()
#IF IS_DEBUG_BUILD
PRINTLN("Armenian1.sc - Finished loading shrink scene after ", TIMERA(), "ms")
#ENDIF
SETTIMERA(100000)
ENDIF
ENDIF
ENDIF
SET_CUTSCENE_PED_COMPONENT_VARIATIONS(strStartCutscene)
WAIT(0)
ENDWHILE
//There's a chance on next gen builds that a single frame exists where the components wouldn't be set.
SET_CUTSCENE_PED_COMPONENT_VARIATIONS(strStartCutscene)
//The cutscene and Lamar have to be guaranteed to be loaded before progressing.
WHILE NOT HAS_CUTSCENE_LOADED()
SET_CUTSCENE_PED_COMPONENT_VARIATIONS(strStartCutscene)
WAIT(0)
ENDWHILE
#IF IS_DEBUG_BUILD
PRINTLN("Armenian1.sc - Finished loading cutscene assets after ", TIMERA(), "ms")
#ENDIF
WHILE NOT IS_BIT_SET(g_savedGlobals.sFlowCustom.spInitBitset, SP_INIT_TITLE_SEQUENCE_DISPLAYED)
AND NOT IS_REPEAT_PLAY_ACTIVE()
AND NOT IS_REPLAY_IN_PROGRESS()
WAIT(0)
ENDWHILE
#IF IS_DEBUG_BUILD
PRINTLN("Armenian1.sc - Finished waiting for Title screen.")
#ENDIF
//All assets are ready, start the cutscene.
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
// Undo the changes made to the player's state for the transition from prologue mission
IF NOT IS_REPLAY_IN_PROGRESS()
AND NOT IS_REPEAT_PLAY_ACTIVE()
CPRINTLN(DEBUG_MISSION, "Armenian1 cleaning up the Prologue transition stuff.")
REPLAY_RESET_PLAYER_STATE()
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(sLamar.ped, "Lamar", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_NPC_PED_MODEL(CHAR_LAMAR))
//REGISTER_ENTITY_FOR_CUTSCENE(vehCreditsSportsCar, "carbonizzare", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, CARBONIZZARE)
NEW_LOAD_SCENE_STOP()
CLEAR_AREA(<<0.0, 0.0, 0.0>>, 10000.0, TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(TRUE)
BLOCK_SCENARIOS_FOR_CUTSCENE(TRUE)
START_CUTSCENE()
SET_SRL_FORCE_PRESTREAM(SRL_PRESTREAM_FORCE_ON)
WAIT(50)
//1769677 - Michael's outfit isn't getting set correctly, just override it manually on the cutscene ped when it starts.
PED_INDEX pedNearest
GET_CLOSEST_PED(<<-1907.4, -577.5, 19.2>>, 5.0, FALSE, TRUE, pedNearest, TRUE, TRUE)
IF NOT IS_PED_INJURED(pedNearest)
SET_PED_COMPONENT_VARIATION(pedNearest, PED_COMP_TORSO, 0, 0)
SET_PED_COMPONENT_VARIATION(pedNearest, PED_COMP_LEG, 0, 0)
SET_PED_COMPONENT_VARIATION(pedNearest, PED_COMP_HAND, 0, 0)
SET_PED_COMPONENT_VARIATION(pedNearest, PED_COMP_FEET, 0, 0)
SET_PED_COMPONENT_VARIATION(pedNearest, PED_COMP_SPECIAL2, 0, 0)
SET_PED_COMPONENT_VARIATION(pedNearest, PED_COMP_SPECIAL, 0, 0)
SET_PED_COMPONENT_VARIATION(pedNearest, PED_COMP_JBIB, 0, 0)
#IF IS_DEBUG_BUILD
PRINTLN("armenian1.sc - Overwriting Michael variations.")
#ENDIF
ENDIF
SHUTDOWN_LOADING_SCREEN()
CASCADE_SHADOWS_SET_SCREEN_SIZE_CHECK_ENABLED(FALSE)
DO_FADE_IN_WITH_WAIT()
eCreditsStage = CREDITS_STAGE_0_SHRINK
iCreditsTextEvent = 0
bCutsceneSkipped = FALSE
bGrabbedCreditsSportsCar = FALSE
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
bCutsceneSkipped = TRUE
eSectionStage = SECTION_STAGE_SKIP
ENDIF
UPDATE_TEXT_FOR_CREDITS_SEQUENCE()
UPDATE_CREDITS_EVENTS()
IF NOT IS_CUTSCENE_ACTIVE()
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
IF NOT DOES_ENTITY_EXIST(vehCreditsSportsCar)
IF NOT bGrabbedCreditsSportsCar
IF GET_CUTSCENE_TIME() > 109000
IF DOES_CUTSCENE_ENTITY_EXIST("carbonizzare")
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_CUTSCENE_ENTITY("carbonizzare"))
vehCreditsSportsCar = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_CUTSCENE_ENTITY("carbonizzare"))
IF NOT IS_ENTITY_DEAD(vehCreditsSportsCar)
LOWER_CONVERTIBLE_ROOF(vehCreditsSportsCar, TRUE)
SET_VEHICLE_COLOURS(vehCreditsSportsCar, 28, 0)
SET_VEHICLE_EXTRA_COLOURS(vehCreditsSportsCar, 0, 156)
bGrabbedCreditsSportsCar = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
//Remove the car once it's not needed
IF GET_CUTSCENE_TIME() > 125000
REMOVE_VEHICLE(vehCreditsSportsCar, FALSE)
ENDIF
ENDIF
SWITCH iCurrentEvent
CASE 0 //Remove the interior once Michael leaves.
IF GET_CUTSCENE_TIME() > 105000
IF interiorShrink != NULL
UNPIN_INTERIOR(interiorShrink)
interiorShrink = NULL
ENDIF
iCurrentEvent++
ENDIF
BREAK
CASE 1 //Turn on vehicles once reaching the end.
IF GET_CUTSCENE_TIME() > 210000
SET_VEHICLE_POPULATION_BUDGET(3)
iCurrentEvent++
ENDIF
BREAK
ENDSWITCH
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-41.0 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ENDIF
//Fetch Lamar from the cutscene and set up his default behaviour.
IF NOT DOES_ENTITY_EXIST(sLamar.ped)
IF GET_CUTSCENE_TIME() > 207200
ENTITY_INDEX entityLamar = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Lamar")
IF DOES_ENTITY_EXIST(entityLamar)
sLamar.ped = GET_PED_INDEX_FROM_ENTITY_INDEX(entityLamar)
IF NOT IS_PED_INJURED(sLamar.ped)
SETUP_LAMAR(<<0.0, 0.0, 0.0>>, 0.0, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF GET_CUTSCENE_TIME() > 210000
SETUP_NINEF(sMainCars[0].vStartPos, sMainCars[0].fStartHeading)
SETUP_RAPIDGT(sMainCars[1].vStartPos, sMainCars[1].fStartHeading)
REQUEST_ANIM_DICT(strLamarLeadOutAnims)
IF NOT IS_PED_INJURED(sLamar.ped)
AND HAS_ANIM_DICT_LOADED(strLamarLeadOutAnims)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lamar")
IF NOT bCutsceneSkipped
AND NOT IS_ENTITY_PLAYING_ANIM(sLamar.ped, strLamarLeadOutAnims, "arm1_int_leadout_gatewalk_lam")
TASK_PLAY_ANIM_ADVANCED(sLamar.ped, strLamarLeadOutAnims, "arm1_int_leadout_gatewalk_lam", <<-1900.330, -595.638, 12.233>>, <<0.000, 0.000, 48.0>>,
INSTANT_BLEND_IN, WALK_BLEND_OUT, -1,
AF_USE_KINEMATIC_PHYSICS | AF_HOLD_LAST_FRAME | AF_EXTRACT_INITIAL_OFFSET | AF_USE_MOVER_EXTRACTION, 0.526) //0.462
TASK_PLAY_ANIM(sLamar.ped, strLamarLeadOutAnims, "ARM1_INT_leadout_gatewalk_lam_facial", 2.0, SLOW_BLEND_OUT, -1, AF_SECONDARY, 0.526)
SET_RAGDOLL_BLOCKING_FLAGS(sLamar.ped, RBF_PLAYER_IMPACT | RBF_MELEE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sLamar.ped)
SET_VEHICLE_POPULATION_BUDGET(3)
//Open the hidden gate as the collision can affect Lamar's anim.
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<-1901.1627, -594.9855, 11.6781>>, 2.0, PROP_BURTO_GATE_01)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(PROP_BURTO_GATE_01, <<-1901.1627, -594.9855, 11.6781>>, TRUE, 1.0)
ENDIF
ENDIF
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sLamar.ped, TRUE)
sLamar.iEvent = 0
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
IF NOT bCutsceneSkipped
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 2000, -39.7, FALSE)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<-1901.1627, -594.9855, 11.6781>>, 2.0, PROP_BURTO_GATE_01)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(PROP_BURTO_GATE_01, <<-1901.1627, -594.9855, 11.6781>>, TRUE, 0.0)
ENDIF
//Record the sneak and just after
REPLAY_RECORD_BACK_FOR_TIME(10.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
IF interiorShrink != NULL
UNPIN_INTERIOR(interiorShrink)
interiorShrink = NULL
ENDIF
REMOVE_PED(pedCreditsBoat, TRUE)
INT i = 0
REPEAT COUNT_OF(pedCreditsFerrisWheel) i
REMOVE_PED(pedCreditsFerrisWheel[i], TRUE)
ENDREPEAT
REPEAT COUNT_OF(objFerrisCars) i
REMOVE_OBJECT(objFerrisCars[i], TRUE)
ENDREPEAT
REPEAT COUNT_OF(pedCreditsCars) i
//Set the cutscne peds to wander around after the cutscene: only do this if we don't skip and the ped is in a safe position to wander.
IF IS_SCREEN_FADED_OUT()
OR (NOT IS_PED_INJURED(pedCreditsCars[i]) AND IS_PED_IN_ANY_VEHICLE(pedCreditsCars[i]))
OR i = CREDITS_FEMALE_1
OR (NOT IS_PED_INJURED(pedCreditsCars[i]) AND NOT IS_ENTITY_VISIBLE_TO_SCRIPT(pedCreditsCars[i]))
REMOVE_PED(pedCreditsCars[i], TRUE)
ELSE
IF NOT IS_PED_INJURED(pedCreditsCars[i])
TASK_WANDER_STANDARD(pedCreditsCars[i], DEFAULT)
SET_PED_KEEP_TASK(pedCreditsCars[i], TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedCreditsCars[i], FALSE)
REMOVE_PED(pedCreditsCars[i], FALSE)
ENDIF
ENDIF
ENDREPEAT
REPEAT COUNT_OF(vehCreditsCars) i
REMOVE_VEHICLE(vehCreditsCars[i], TRUE)
ENDREPEAT
REMOVE_OBJECT(objFerrisWheel, TRUE)
REMOVE_VEHICLE(vehCreditsBoat, TRUE)
REMOVE_VEHICLE(vehCreditsSailboat, TRUE)
IF bGrabbedCreditsSportsCar
REMOVE_VEHICLE(vehCreditsSportsCar, FALSE)
ENDIF
IF ptfxCreditsBoat[0] != NULL
STOP_PARTICLE_FX_LOOPED(ptfxCreditsBoat[0])
ptfxCreditsBoat[0] = NULL
ENDIF
IF ptfxCreditsBoat[1] != NULL
STOP_PARTICLE_FX_LOOPED(ptfxCreditsBoat[1])
ptfxCreditsBoat[1] = NULL
ENDIF
CASCADE_SHADOWS_SET_SCREEN_SIZE_CHECK_ENABLED(TRUE)
REMOVE_CREDITS_PED_ANIMS()
SET_MODEL_AS_NO_LONGER_NEEDED(modelCreditsBoat)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCreditsBoatPed)
SET_MODEL_AS_NO_LONGER_NEEDED(modelFerrisCar)
SET_MODEL_AS_NO_LONGER_NEEDED(modelFerrisWheel)
SET_MODEL_AS_NO_LONGER_NEEDED(modelFerrisWheelPed1)
SET_MODEL_AS_NO_LONGER_NEEDED(modelFerrisWheelPed2)
SET_MODEL_AS_NO_LONGER_NEEDED(CAVALCADE)
SET_MODEL_AS_NO_LONGER_NEEDED(ALPHA)
SET_MODEL_AS_NO_LONGER_NEEDED(modelJoggerFemale)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCreditsFemale)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCreditsMale)
REMOVE_VEHICLE_RECORDING(CARREC_CREDITS_BOAT_1, strCarrec)
REMOVE_ANIM_DICT(strFerrisWheelAnims)
REMOVE_PTFX_ASSET()
REQUEST_IPL("ferris_finale_Anim")
SET_VEHICLE_POPULATION_BUDGET(3)
SET_PED_POPULATION_BUDGET(3)
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
ENDIF
//If we skipped make sure the time and weather are set correctly.
IF IS_SCREEN_FADED_OUT()
NEW_LOAD_SCENE_STOP()
SET_CLOCK_TIME(8, 0, 0)
SET_WEATHER_TYPE_NOW_PERSIST("clear")
ENDIF
/*IF NOT IS_PED_INJURED(sLamar.ped)
AND HAS_ANIM_DICT_LOADED(strLamarLeadOutAnims)
AND IS_ENTITY_PLAYING_ANIM(sLamar.ped, strLamarLeadOutAnims, "arm1_int_leadout_gatewalk_lam")
FLOAT fAnimTime = GET_ENTITY_ANIM_CURRENT_TIME(sLamar.ped, strLamarLeadOutAnims, "arm1_int_leadout_gatewalk_lam")
TASK_PLAY_ANIM_ADVANCED(sLamar.ped, strLamarLeadOutAnims, "arm1_int_leadout_gatewalk_lam", <<-1900.330, -595.638, 12.233>>, <<0.000, 0.000, 48.0>>,
INSTANT_BLEND_IN, WALK_BLEND_OUT, -1,
AF_USE_KINEMATIC_PHYSICS | AF_HOLD_LAST_FRAME | AF_EXTRACT_INITIAL_OFFSET | AF_USE_MOVER_EXTRACTION, fAnimTime)
TASK_PLAY_ANIM(sLamar.ped, strLamarLeadOutAnims, "ARM1_INT_leadout_gatewalk_lam_facial", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_SECONDARY, fAnimTime)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sLamar.ped)
SET_RAGDOLL_BLOCKING_FLAGS(sLamar.ped, RBF_PLAYER_IMPACT | RBF_MELEE)
ENDIF*/
IF bRequestedCreditsScaleform
SCALEFORM_REMOVE_ALL_CREDIT_BLOCKS()
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(sfCredits)
bRequestedCreditsScaleform = FALSE
ENDIF
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE)
BLOCK_SCENARIOS_FOR_CUTSCENE(FALSE)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_CHOOSE_CAR
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
DO_FADE_OUT_WITH_WAIT()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
IF IS_CUTSCENE_PLAYING()
STOP_CUTSCENE()
ENDIF
WHILE IS_CUTSCENE_ACTIVE()
IF NOT DOES_ENTITY_EXIST(sLamar.ped)
ENTITY_INDEX entityLamar = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Lamar")
IF DOES_ENTITY_EXIST(entityLamar)
sLamar.ped = GET_PED_INDEX_FROM_ENTITY_INDEX(entityLamar)
IF NOT IS_PED_INJURED(sLamar.ped)
SETUP_LAMAR(<<0.0, 0.0, 0.0>>, 0.0, TRUE)
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(vehCreditsSportsCar)
ENTITY_INDEX entityCar = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("carbonizzare")
IF DOES_ENTITY_EXIST(entityCar)
vehCreditsSportsCar = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(entityCar)
bGrabbedCreditsSportsCar = TRUE
ENDIF
ENDIF
WAIT(0)
ENDWHILE
eCreditsStage = CREDITS_STAGE_22_END
bCutsceneSkipped = TRUE
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDPROC
PROC CHOOSE_CAR()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
IF bUsedACheckpoint
START_REPLAY_SETUP(vFranklinLeadOutPos, fFranklinLeadOutHeading, FALSE)
iCurrentEvent = 99
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), vFranklinLeadOutPos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fFranklinLeadOutHeading)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
//1914149 - The old-style load scene is causing loading issues.
NEW_LOAD_SCENE_FRUSTRUM_WITH_WAIT(<<-1902.5677, -598.1853, 12.7282>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-3.0000, -0.0000, -43.2776>>), 130.0)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ELSE
IF SETUP_LAMAR(vLamarLeadOutPos, fLamarLeadOutHeading)
AND SETUP_NINEF(sMainCars[0].vStartPos, sMainCars[0].fStartHeading)
AND SETUP_RAPIDGT(sMainCars[1].vStartPos, sMainCars[1].fStartHeading)
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
CLEAR_AREA(sMainCars[0].vStartPos, 100.0, TRUE)
SET_SCENARIO_PEDS_SPAWN_IN_SPHERE_AREA(<<-1889.1, -586.0, 12.5>>, 3.0, 3)
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
iGatePedBlockingArea = ADD_NAVMESH_BLOCKING_OBJECT(<<-1900.7888, -595.2253, 11.0273>>, <<2.0, 2.0, 3.0>>, 139.6549)
IF NOT IS_AUDIO_SCENE_ACTIVE("ARM_1_CHOOSE_CAR")
START_AUDIO_SCENE("ARM_1_CHOOSE_CAR")
ENDIF
//If we skipped here (either Z-skip or skipping the cutscene) do some extra prep.
IF IS_SCREEN_FADED_OUT()
//Don't do a load scene if we skipped here from checkpoint/debug.
IF iCurrentEvent != 99
//1914149 - The old-style load scene shouldn't be called when skipping the cutscene, do a smaller new load scene.
SET_ENTITY_COORDS(PLAYER_PED_ID(), vFranklinLeadOutPos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fFranklinLeadOutHeading)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
NEW_LOAD_SCENE_FRUSTRUM_WITH_WAIT(<<-1902.5677, -598.1853, 12.7282>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-3.0000, -0.0000, -43.2776>>), 130.0)
ENDIF
WAIT(0)
WHILE NOT SETUP_NINEF(sMainCars[0].vStartPos, sMainCars[0].fStartHeading)
OR NOT SETUP_RAPIDGT(sMainCars[1].vStartPos, sMainCars[1].fStartHeading)
OR NOT SETUP_LAMAR(<<-1883.5654, -575.7982, 10.7861>>, 251.8757)
WAIT(0)
ENDWHILE
IF IS_VEHICLE_DRIVEABLE(sMainCars[NINEF_INDEX].veh)
SET_ENTITY_COORDS(sMainCars[NINEF_INDEX].veh, sMainCars[NINEF_INDEX].vStartPos)
SET_ENTITY_HEADING(sMainCars[NINEF_INDEX].veh, sMainCars[NINEF_INDEX].fStartHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(sMainCars[NINEF_INDEX].veh)
ENDIF
REQUEST_ANIM_DICT(strLamarLeadOutAnims)
WHILE NOT HAS_ANIM_DICT_LOADED(strLamarLeadOutAnims)
WAIT(0)
ENDWHILE
IF NOT IS_PED_INJURED(sLamar.ped)
AND NOT IS_ENTITY_PLAYING_ANIM(sLamar.ped, strLamarLeadOutAnims, "arm1_int_leadout_gatewalk_lam")
SET_ENTITY_COORDS(sLamar.ped, vLamarLeadOutPos)
SET_ENTITY_HEADING(sLamar.ped, fLamarLeadOutHeading)
SET_PED_PATH_CAN_USE_CLIMBOVERS(sLamar.ped, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sLamar.ped, TRUE)
TASK_PLAY_ANIM_ADVANCED(sLamar.ped, strLamarLeadOutAnims, "arm1_int_leadout_gatewalk_lam", <<-1900.330, -595.638, 12.233>>, <<0.000, 0.000, 48.0>>,
INSTANT_BLEND_IN, WALK_BLEND_OUT, -1,
AF_USE_KINEMATIC_PHYSICS | AF_HOLD_LAST_FRAME | AF_EXTRACT_INITIAL_OFFSET | AF_USE_MOVER_EXTRACTION, 0.462)
TASK_PLAY_ANIM(sLamar.ped, strLamarLeadOutAnims, "ARM1_INT_leadout_gatewalk_lam_facial", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_SECONDARY, 0.462)
SET_RAGDOLL_BLOCKING_FLAGS(sLamar.ped, RBF_PLAYER_IMPACT | RBF_MELEE)
sLamar.iEvent = 0
ENDIF
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<-1901.1627, -594.9855, 11.6781>>, 2.0, PROP_BURTO_GATE_01)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(PROP_BURTO_GATE_01, <<-1901.1627, -594.9855, 11.6781>>, TRUE, 0.0)
ENDIF
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_ENTITY_COORDS(PLAYER_PED_ID(), vFranklinLeadOutPos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fFranklinLeadOutHeading)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
WAIT(0)
ENDIF
//2071893 - The old non-creation area around the alley was blocking the cat scenario respawning on retries.
//SET_PED_NON_CREATION_AREA(<<-1914.638916,-598.726135,0.271984>>, <<-1861.191284,-570.867065,21.271984>>)
SET_PED_NON_CREATION_AREA(<<-1894.9843, -583.5402, 0.0000>>, <<-1865.4764, -563.2835, 18.1544>>)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 0, PLAYER_PED_ID(), "FRANKLIN")
BLOCK_VEHICLE_GENS_AT_START_POINT(TRUE)
DO_FADE_IN_WITH_WAIT()
IF IS_VEHICLE_DRIVEABLE(sMainCars[NINEF_INDEX].veh)
FREEZE_ENTITY_POSITION(sMainCars[NINEF_INDEX].veh, TRUE)
ENDIF
//The Rapidgt is being set in a slightly different position to the regular position for this sequence (1407775)
IF IS_VEHICLE_DRIVEABLE(sMainCars[RAPIDGT_INDEX].veh)
SET_ENTITY_COORDS(sMainCars[RAPIDGT_INDEX].veh, <<-1880.7510, -577.1409, 10.7690>>)
SET_ENTITY_HEADING(sMainCars[RAPIDGT_INDEX].veh, sMainCars[RAPIDGT_INDEX].fStartHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(sMainCars[RAPIDGT_INDEX].veh)
FREEZE_ENTITY_POSITION(sMainCars[RAPIDGT_INDEX].veh, TRUE)
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SPECIAL_ABILITY_DEPLETE_METER(PLAYER_ID(), TRUE)
ENABLE_SPECIAL_ABILITY(PLAYER_ID(), FALSE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE) //For B*468045
SET_INITIAL_PLAYER_STATION("RADIO_03_HIPHOP_NEW")
FREEZE_RADIO_STATION("RADIO_03_HIPHOP_NEW")
SET_RADIO_AUTO_UNFREEZE(FALSE)
SET_RADIO_TRACK("RADIO_03_HIPHOP_NEW", "ARM1_RADIO_STARTS")
DISABLE_TAXI_HAILING(TRUE)
//1768520 - Reset the in-car cam from the previous view.
//NOTE: This isn't going to work well with first-person cam, as we'll get the reverse issue (cam will pop from first-person to third-person before the cutscene).
//SET_FOLLOW_VEHICLE_CAM_ZOOM_LEVEL(VEHICLE_ZOOM_LEVEL_MEDIUM)
iHurryDialogueTimer = GET_GAME_TIMER()
iNumTimesPlayedHurryDialogue = 0
iCarHelpTimer = 0
IF NOT IS_PED_INJURED(sLamar.ped)
SET_PED_CONFIG_FLAG(sLamar.ped, PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(sLamar.ped, PCF_DisableExplosionReactions, TRUE)
SET_PED_CONFIG_FLAG(sLamar.ped, PCF_UseKinematicModeWhenStationary, TRUE)
ENDIF
iStartFailUnarmedCounter = 0
iLamarWalkToCarTimer = 0
bLamarAlreadyGotIntoCar = FALSE
bLamarGivenWalkToCarTask = FALSE
bAlleyAssistedRouteActive = FALSE
bPlayerControlTurnedOffByMission = FALSE
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
REQUEST_WAYPOINT_RECORDING(strWaypointStartAlley)
REQUEST_WAYPOINT_RECORDING(strWaypointAroundCar)
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
//DISABLE_CINEMATIC_BONNET_CAMERA_THIS_UPDATE()
IF NOT bHasTextLabelTriggered[AR1_CHOOSE]
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1900.440796,-595.769775,10.646699>>, <<-1884.650391,-576.980774,13.571643>>, 7.50000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1886.852417,-594.809937,10.663315>>, <<-1895.973022,-587.258118,13.386953>>, 18.750000)
//DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
ENDIF
ENDIF
//2001702 - Disable running if in first-person view.
IF GET_CAM_ACTIVE_VIEW_MODE_CONTEXT() = CAM_VIEW_MODE_CONTEXT_ON_FOOT
AND GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1877.904419,-574.581177,10.633959>>, <<-1897.585449,-598.019836,14.406877>>, 12.000000)
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
ENDIF
ENDIF
//There are issues if trying to enter cars behind the cactus plant, so disable it.
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1873.636841,-578.743713,10.627910>>, <<-1877.221802,-582.763306,20.099403>>, 2.500000)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
ENDIF
IF NOT bAlleyAssistedRouteActive
AND GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointStartAlley)
USE_WAYPOINT_RECORDING_AS_ASSISTED_MOVEMENT_ROUTE(strWaypointStartAlley, TRUE)
bAlleyAssistedRouteActive = TRUE
ENDIF
//2002800 - Display help for first-person mode.
IF NOT bHasTextLabelTriggered[CMN_FPSHELP]
IF NOT GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_PLAYER_HAS_USED_FP_VIEW)
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
PRINT_HELP("CMN_FPSHELP", DEFAULT_HELP_TEXT_TIME)
bHasTextLabelTriggered[CMN_FPSHELP] = TRUE
ENDIF
ELSE
bHasTextLabelTriggered[CMN_FPSHELP] = TRUE
ENDIF
ELSE
//Clear once they use first-person.
IF GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_PLAYER_HAS_USED_FP_VIEW)
AND IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CMN_FPSHELP")
CLEAR_HELP()
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sMainCars[0].veh)
AND IS_VEHICLE_DRIVEABLE(sMainCars[1].veh)
//Handle objectives.
SWITCH iCurrentEvent
CASE 0 //Follow Lamar.
IF NOT bHasTextLabelTriggered[AR1_CHASE]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
//PRINT_NOW("AR1_CHASE", DEFAULT_GOD_TEXT_TIME, 0)
bHasTextLabelTriggered[AR1_CHASE] = TRUE
ENDIF
ENDIF
IF NOT DOES_BLIP_EXIST(sLamar.blip)
REMOVE_ALL_BLIPS()
sLamar.blip = CREATE_BLIP_FOR_ENTITY(sLamar.ped)
ENDIF
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sLamar.ped)) > 900.0
IF NOT bHasTextLabelTriggered[AR1_WAIT]
PRINT_NOW("AR1_WAIT", DEFAULT_GOD_TEXT_TIME, 0)
bHasTextLabelTriggered[AR1_WAIT] = TRUE
ENDIF
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1885.959473,-578.539978,10.848052>>, <<-1886.864990,-579.678467,13.601677>>, 4.500000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1882.453613,-580.295898,16.118715>>, <<-1878.337524,-575.303833,5.633518>>, 11.500000)
iCurrentEvent++
ENDIF
BREAK
CASE 1 //Choose a car.
IF NOT bHasTextLabelTriggered[AR1_CHOOSE]
IF bHasTextLabelTriggered[ARM1_PICK]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_NOW("AR1_CHOOSE", DEFAULT_GOD_TEXT_TIME, 0)
iCarHelpTimer = GET_GAME_TIMER()
bHasTextLabelTriggered[AR1_CHOOSE] = TRUE
ENDIF
ENDIF
ELIF NOT bHasTextLabelTriggered[AR1_CARHELP]
IF GET_GAME_TIMER() - iCarHelpTimer > 5000
PRINT_HELP("AR1_CARHELP")
bHasTextLabelTriggered[AR1_CARHELP] = TRUE
ENDIF
ENDIF
//Handle the player leaving Lamar behind.
IF NOT IS_PED_INJURED(sLamar.ped)
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sLamar.ped)) > 1600.0
IF NOT DOES_BLIP_EXIST(sLamar.blip)
REMOVE_ALL_BLIPS()
sLamar.blip = CREATE_BLIP_FOR_ENTITY(sLamar.ped)
ENDIF
IF NOT bHasTextLabelTriggered[AR1_WAIT]
PRINT_NOW("AR1_WAIT", DEFAULT_GOD_TEXT_TIME, 0)
bHasTextLabelTriggered[AR1_WAIT] = TRUE
ENDIF
ELSE
IF NOT DOES_BLIP_EXIST(sMainCars[0].blip)
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("AR1_CHOOSE")
AND bHasTextLabelTriggered[AR1_CHOOSE]
CLEAR_PRINTS()
ENDIF
REMOVE_ALL_BLIPS()
sMainCars[0].blip = CREATE_BLIP_FOR_VEHICLE(sMainCars[0].veh)
ENDIF
IF NOT DOES_BLIP_EXIST(sMainCars[1].blip)
IF NOT IS_PED_IN_VEHICLE(sLamar.ped, sMainCars[1].veh)
sMainCars[1].blip = CREATE_BLIP_FOR_VEHICLE(sMainCars[1].veh)
ENDIF
ELSE
IF IS_PED_IN_VEHICLE(sLamar.ped, sMainCars[1].veh)
REMOVE_BLIP(sMainCars[1].blip)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
//Once the player gets into one of the cars progress the mission.
VEHICLE_INDEX vehTemp = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())
IF vehTemp = sMainCars[NINEF_INDEX].veh OR vehTemp = sMainCars[RAPIDGT_INDEX].veh
IF NOT IS_ENTITY_DEAD(vehTemp)
IF IS_ENTITY_STATIC(vehTemp)
FREEZE_ENTITY_POSITION(vehTemp, FALSE)
ENDIF
ENDIF
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_CARHELP")
CLEAR_HELP()
ENDIF
IF vehTemp = sMainCars[NINEF_INDEX].veh
iPlayersCar = NINEF_INDEX
iBuddiesCar = RAPIDGT_INDEX
IF GET_VEHICLE_DOOR_ANGLE_RATIO(vehTemp, SC_DOOR_FRONT_LEFT) > 0.1
OR GET_VEHICLE_DOOR_ANGLE_RATIO(vehTemp, SC_DOOR_FRONT_RIGHT) > 0.1
OR IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vehTemp)
LOAD_STREAM("ARM_1_IG_1_LAMAR_DRIVES_OFF")
IF NOT IS_SCRIPTED_CONVERSATION_ONGOING()
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDIF
ELIF vehTemp = sMainCars[RAPIDGT_INDEX].veh
iPlayersCar = RAPIDGT_INDEX
iBuddiesCar = NINEF_INDEX
IF GET_VEHICLE_DOOR_ANGLE_RATIO(vehTemp, SC_DOOR_FRONT_LEFT) > 0.1
OR GET_VEHICLE_DOOR_ANGLE_RATIO(vehTemp, SC_DOOR_FRONT_RIGHT) > 0.1
OR IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vehTemp)
LOAD_STREAM("ARM_1_IG_2_LAMAR_DRIVES_OFF_ALT")
IF NOT IS_SCRIPTED_CONVERSATION_ONGOING()
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDIF
ENDIF
ENDIF
//If player control was turned off yet somehow they're not getting the car, turn player control back on
IF NOT IS_PLAYER_CONTROL_ON(PLAYER_ID())
AND bPlayerControlTurnedOffByMission
IF (GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK AND NOT (vehTemp = sMainCars[0].veh OR vehTemp = sMainCars[1].veh))
OR VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<-1877.3, -582.2, 11.4>>) < 1.7
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<-1877.3, -582.2, 11.4>>) < 1.7
AND vehTemp != NULL
CLEAR_PED_TASKS(PLAYER_PED_ID())
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
bPlayerControlTurnedOffByMission = FALSE
ENDIF
ENDIF
IF (vehTemp = sMainCars[0].veh OR vehTemp = sMainCars[1].veh)
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<-1877.5, -582.0, 11.3>>) > 2.0
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON | SPC_ALLOW_PLAYER_DAMAGE)
bPlayerControlTurnedOffByMission = TRUE
ENDIF
//Handle Lamar behaviour: he waits for the player to choose a car, then enters the other car.
IF NOT IS_PED_INJURED(sLamar.ped)
REQUEST_ANIM_DICT(strLamarLeadOutAnims)
REQUEST_ANIM_DICT(strLamarAnnoyedAnims)
FLOAT fDistBetweenPlayerAndLamar = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sLamar.ped))
IF NOT bLamarGivenWalkToCarTask
IF vehTemp = sMainCars[0].veh OR vehTemp = sMainCars[1].veh
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(vehTemp)) < 4.0
AND NOT bLamarAlreadyGotIntoCar
IF iLamarWalkToCarTimer = 0
iLamarWalkToCarTimer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - iLamarWalkToCarTimer > 200
IF NOT IS_SCRIPTED_CONVERSATION_ONGOING()
IF vehTemp = sMainCars[RAPIDGT_INDEX].veh
IF GET_IS_WAYPOINT_RECORDING_LOADED(strWaypointAroundCar)
INT iNumNodes
WAYPOINT_RECORDING_GET_NUM_POINTS(strWaypointAroundCar, iNumNodes)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(NULL, strWaypointAroundCar, 0, EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT, iNumNodes - 2)
TASK_ENTER_VEHICLE(NULL, sMainCars[NINEF_INDEX].veh, -1, VS_DRIVER, PEDMOVE_WALK)
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-1884.2018, -577.8268, 10.8243>>, PEDMOVE_WALK, -1, DEFAULT, ENAV_NO_STOPPING | ENAV_SUPPRESS_EXACT_STOP)
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-1881.6919, -580.1697, 10.8284>>, PEDMOVE_WALK, -1)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sLamar.ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ELSE
FREEZE_ENTITY_POSITION(sMainCars[RAPIDGT_INDEX].veh, FALSE)
IF NOT IS_PED_IN_ANY_VEHICLE(sLamar.ped)
TASK_ENTER_VEHICLE(sLamar.ped, sMainCars[RAPIDGT_INDEX].veh, -1, VS_DRIVER, PEDMOVE_WALK)
ENDIF
ENDIF
bLamarGivenWalkToCarTask = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//1261710 - If the player goes over to the Ninef then Lamar gets into the RapidGT straight away.
IF NOT bLamarAlreadyGotIntoCar
IF vehTemp = NULL
AND sLamar.iEvent > 0
AND NOT bLamarGivenWalkToCarTask
AND NOT IS_SCRIPTED_CONVERSATION_ONGOING()
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1878.788574,-577.908142,10.753211>>, <<-1879.882324,-579.340576,12.554530>>, 1.000000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1876.007446,-577.841553,10.665591>>, <<-1879.743042,-582.368835,12.604184>>, 2.000000)
FREEZE_ENTITY_POSITION(sMainCars[RAPIDGT_INDEX].veh, FALSE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sMainCars[RAPIDGT_INDEX].veh, FALSE)
TASK_ENTER_VEHICLE(sLamar.ped, sMainCars[RAPIDGT_INDEX].veh, -1, VS_DRIVER, PEDMOVE_WALK)
LOAD_STREAM("ARM_1_IG_1_LAMAR_DRIVES_OFF")
bLamarAlreadyGotIntoCar = TRUE
ENDIF
ENDIF
ELSE
IF NOT bHasTextLabelTriggered[AR1_CHOICE]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_CHOICE", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[AR1_CHOICE] = TRUE
ENDIF
ENDIF
ENDIF
SWITCH sLamar.iEvent
CASE 0 //Lamar walks to the start position.
//Have Lamar look at the cars once he gets near.
IF fDistBetweenPlayerAndLamar < 400.0
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_GOTD", CONV_PRIORITY_MEDIUM)
IF NOT bHasTextLabelTriggered[ARM1_INTP6_1]
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_INTP6", "ARM1_INTP6_1", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_INTP6_1] = TRUE
ENDIF
ELIF NOT bHasTextLabelTriggered[ARM1_GOTD]
IF IS_ENTITY_IN_ANGLED_AREA(sLamar.ped, <<-1885.658569,-577.950867,10.846542>>, <<-1887.837280,-580.549438,14.104136>>, 4.750000)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_INTP6", "ARM1_INTP6_3", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_GOTD] = TRUE
ENDIF
ENDIF
ELIF NOT bHasTextLabelTriggered[ARM1_GOTD2]
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_INTP6", "ARM1_INTP6_4", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_GOTD2] = TRUE
ENDIF
ENDIF
ENDIF
IF (IS_ENTITY_PLAYING_ANIM(sLamar.ped, strLamarLeadOutAnims, "arm1_int_leadout_gatewalk_lam")
AND GET_ENTITY_ANIM_CURRENT_TIME(sLamar.ped, strLamarLeadOutAnims, "arm1_int_leadout_gatewalk_lam") >= 0.99)
OR NOT IS_ENTITY_PLAYING_ANIM(sLamar.ped, strLamarLeadOutAnims, "arm1_int_leadout_gatewalk_lam")
sLamar.iEvent++
ENDIF
BREAK
CASE 1 //Lamar waits for the player to get in a car.
//Play the "which one do you want?" line when the player arrives.
IF iCurrentEvent > 0
AND NOT bLamarAlreadyGotIntoCar
AND NOT bHasTextLabelTriggered[ARM1_PICK]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
AND NOT (vehTemp = sMainCars[0].veh OR vehTemp = sMainCars[1].veh)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_INTP6", "ARM1_INTP6_5", CONV_PRIORITY_MEDIUM)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
TASK_PLAY_ANIM(NULL, strLamarLeadOutAnims, "arm1_int_leadout_action_lam", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
TASK_PLAY_ANIM(NULL, strLamarLeadOutAnims, "arm1_int_leadout_loop_2_lam", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
TASK_PLAY_ANIM(NULL, strLamarLeadOutAnims, "arm1_int_leadout_loop_lam", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_LOOPING)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sLamar.ped, seq)
CLEAR_SEQUENCE_TASK(seq)
bHasTextLabelTriggered[ARM1_PICK] = TRUE
iNumTimesPlayedHurryDialogue = 0
iHurryDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
IF vehTemp != sMainCars[0].veh AND vehTemp != sMainCars[1].veh
//Play some dialogue from Lamar if the player hangs around
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
AND bHasTextLabelTriggered[ARM1_PICK]
AND iNumTimesPlayedHurryDialogue < 4
AND NOT bLamarAlreadyGotIntoCar
AND GET_GAME_TIMER() - iHurryDialogueTimer > 15000
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sLamar.ped)) < 400.0
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_HURRY", CONV_PRIORITY_MEDIUM)
TASK_LOOK_AT_ENTITY(sLamar.ped, PLAYER_PED_ID(), 3000, SLF_SLOW_TURN_RATE | SLF_EXTEND_PITCH_LIMIT | SLF_EXTEND_YAW_LIMIT)
//Play an appropriate anim if the player is in the right place.
IF HAS_ANIM_DICT_LOADED(strLamarAnnoyedAnims)
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1883.812378,-577.266602,10.823965>>, <<-1899.143433,-595.466125,13.873234>>, 5.000000)
INT iRandom
iRandom = GET_RANDOM_INT_IN_RANGE(0, 3)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
IF iRandom = 0
TASK_PLAY_ANIM(NULL, strLamarAnnoyedAnims, "lamar_idle_01", WALK_BLEND_IN, WALK_BLEND_IN, -1, AF_USE_KINEMATIC_PHYSICS)
ELIF iRandom = 1
TASK_PLAY_ANIM(NULL, strLamarAnnoyedAnims, "lamar_idle_02", WALK_BLEND_IN, WALK_BLEND_IN, -1, AF_USE_KINEMATIC_PHYSICS)
ELSE
TASK_PLAY_ANIM(NULL, strLamarAnnoyedAnims, "lamar_idle_03", WALK_BLEND_IN, WALK_BLEND_IN, -1, AF_USE_KINEMATIC_PHYSICS)
ENDIF
TASK_PLAY_ANIM(NULL, strLamarLeadOutAnims, "arm1_int_leadout_loop_lam", WALK_BLEND_IN, WALK_BLEND_IN, -1, AF_USE_KINEMATIC_PHYSICS | AF_LOOPING)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sLamar.ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
iNumTimesPlayedHurryDialogue++
iHurryDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(0, 3000)
ENDIF
ENDIF
//Make sure Lamar stays at his start position.
IF NOT bLamarGivenWalkToCarTask
AND NOT bLamarAlreadyGotIntoCar
IF VDIST2(GET_ENTITY_COORDS(sLamar.ped), vLamarByStartCarPos) > 3.0
IF GET_SCRIPT_TASK_STATUS(sLamar.ped, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) != PERFORMING_TASK
AND NOT IS_POSITION_OCCUPIED(vLamarByStartCarPos, 0.5, FALSE, TRUE, FALSE, FALSE, FALSE, sMainCars[RAPIDGT_INDEX].veh)
TASK_FOLLOW_NAV_MESH_TO_COORD(sLamar.ped, vLamarByStartCarPos, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, 0.5, ENAV_DEFAULT, fLamarByStartCarHeading)
ENDIF
ELSE
IF HAS_ANIM_DICT_LOADED(strLamarLeadOutAnims)
AND HAS_ANIM_DICT_LOADED(strLamarAnnoyedAnims)
IF NOT IS_PED_WALKING(sLamar.ped)
AND NOT IS_PED_RAGDOLL(sLamar.ped)
AND NOT IS_ENTITY_PLAYING_ANIM(sLamar.ped, strLamarLeadOutAnims, "arm1_int_leadout_loop_lam")
AND NOT IS_ENTITY_PLAYING_ANIM(sLamar.ped, strLamarLeadOutAnims, "arm1_int_leadout_action_lam")
AND NOT IS_ENTITY_PLAYING_ANIM(sLamar.ped, strLamarLeadOutAnims, "arm1_int_leadout_loop_2_lam")
AND NOT IS_ENTITY_PLAYING_ANIM(sLamar.ped, strLamarAnnoyedAnims, "lamar_idle_01")
AND NOT IS_ENTITY_PLAYING_ANIM(sLamar.ped, strLamarAnnoyedAnims, "lamar_idle_02")
AND NOT IS_ENTITY_PLAYING_ANIM(sLamar.ped, strLamarAnnoyedAnims, "lamar_idle_03")
TASK_PLAY_ANIM(sLamar.ped, strLamarLeadOutAnims, "arm1_int_leadout_loop_lam", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_LOOPING)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
//Fail for abandoning Lamar if the player drives too far away
IF VDIST2(GET_ENTITY_COORDS(sLamar.ped), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 4900.0
MISSION_FAILED(FAILED_ABANDONED_LAMAR)
ENDIF
ENDIF
//Request next section assets in advance.
REQUEST_VEHICLE_RECORDING(sMainCars[0].iStartCarrec, strCarrec)
REQUEST_VEHICLE_RECORDING(sMainCars[1].iStartCarrec, strCarrec)
REQUEST_ANIM_DICT(strChaseStartAnims)
REQUEST_MODEL(modelCarOwner)
//If the player damages the cars before the race starts then fail.
IF iStartFailTimer = 0
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sMainCars[NINEF_INDEX].veh, WEAPONTYPE_UNARMED)
OR HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sMainCars[RAPIDGT_INDEX].veh, WEAPONTYPE_UNARMED)
iStartFailUnarmedCounter++
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sMainCars[NINEF_INDEX].veh)
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sMainCars[RAPIDGT_INDEX].veh)
ENDIF
IF (HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sMainCars[NINEF_INDEX].veh, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
AND NOT HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sMainCars[NINEF_INDEX].veh, WEAPONTYPE_UNARMED))
OR (HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sMainCars[RAPIDGT_INDEX].veh, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
AND NOT HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sMainCars[RAPIDGT_INDEX].veh, WEAPONTYPE_UNARMED))
OR HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE(sMainCars[NINEF_INDEX].veh)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE(sMainCars[RAPIDGT_INDEX].veh)
OR iStartFailUnarmedCounter > 3
iStartFailTimer = GET_GAME_TIMER()
ENDIF
ELIF GET_GAME_TIMER() - iStartFailTimer > 750
MISSION_FAILED(FAILED_DAMAGED_CARS_BEFORE_RACE)
ENDIF
//Fail the mission if the player gets a wanted level.
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
MISSION_FAILED(FAILED_ALERTED_COPS)
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
//Record the player getting into his chosen car
REPLAY_RECORD_BACK_FOR_TIME(3.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON | SPC_ALLOW_PLAYER_DAMAGE)
g_iArmenian1VehicleChoice = iPlayersCar
IF iPlayersCar = NINEF_INDEX
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(ARM1_CAR_CHOSEN)
ENDIF
IF NOT IS_PED_INJURED(sLamar.ped)
SET_PED_CONFIG_FLAG(sLamar.ped, PCF_RunFromFiresAndExplosions, TRUE)
SET_PED_CONFIG_FLAG(sLamar.ped, PCF_DisableExplosionReactions, FALSE)
SET_PED_CONFIG_FLAG(sLamar.ped, PCF_UseKinematicModeWhenStationary, FALSE)
CLEAR_RAGDOLL_BLOCKING_FLAGS(sLamar.ped, RBF_PLAYER_IMPACT | RBF_MELEE)
TASK_CLEAR_LOOK_AT(sLamar.ped)
ENDIF
REMOVE_ANIM_DICT(strLamarLeadOutAnims)
REMOVE_WAYPOINT_RECORDING(strWaypointStartAlley)
REMOVE_WAYPOINT_RECORDING(strWaypointAroundCar)
IF iGatePedBlockingArea != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(iGatePedBlockingArea)
iGatePedBlockingArea = -1
ENDIF
CLEAR_TRIGGERED_LABELS()
DISABLE_TAXI_HAILING(FALSE)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_START_CHASE_CUTSCENE
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
IF IS_VEHICLE_DRIVEABLE(sMainCars[0].veh)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sMainCars[0].veh)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sMainCars[0].veh)
ENDIF
ENDIF
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDPROC
PROC CHASE_START_CUTSCENE_ANIMATED_CAMS()
CONST_FLOAT UBER_SKIP_TIME 2000.0
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_FranklinAndLamar")
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
IF bUsedACheckpoint
START_REPLAY_SETUP(vFranklinLeadOutPos, fFranklinLeadOutHeading, FALSE)
iCurrentEvent = 99
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), vFranklinLeadOutPos)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(vFranklinLeadOutPos)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ELSE
IF SETUP_LAMAR(vLamarLeadOutPos)
AND SETUP_NINEF(sMainCars[0].vStartPos, sMainCars[0].fStartHeading)
AND SETUP_RAPIDGT(sMainCars[1].vStartPos, sMainCars[1].fStartHeading)
SETUP_REQ_CAR_CHOICES()
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
SETUP_REQ_PUT_PLAYER_INTO_CHOSEN_CAR()
BLOCK_VEHICLE_GENS_AT_START_POINT(TRUE)
SPECIAL_ABILITY_DEPLETE_METER(PLAYER_ID(), TRUE)
bLamarGivenWalkToCarTask = FALSE
bLamarAlreadyGotIntoCar = FALSE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_VEHICLE_RECORDING(sMainCars[0].iStartCarrec, strCarrec)
REQUEST_VEHICLE_RECORDING(sMainCars[1].iStartCarrec, strCarrec)
REQUEST_ANIM_DICT(strChaseStartAnims)
REQUEST_MODEL(modelCarOwner)
IF SETUP_REQ_LOAD_MAIN_CHASE_RECORDING()
AND ((iPlayersCar = NINEF_INDEX AND LOAD_STREAM("ARM_1_IG_1_LAMAR_DRIVES_OFF")) OR (iPlayersCar = RAPIDGT_INDEX AND LOAD_STREAM("ARM_1_IG_2_LAMAR_DRIVES_OFF_ALT")))
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(sMainCars[0].iStartCarrec, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(sMainCars[1].iStartCarrec, strCarrec)
AND HAS_ANIM_DICT_LOADED(strChaseStartAnims)
AND HAS_MODEL_LOADED(modelCarOwner)
CLEAR_PRINTS()
CLEAR_HELP()
REMOVE_ALL_BLIPS()
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SPECIAL_ABILITY_RESET(PLAYER_ID())
//Initialise playback now, so we can pre-stream assets
INITIALISE_UBER_PLAYBACK(strCarrec, iCarrecMain, FALSE)
LOAD_CHASE_UBER_DATA()
fCurrentPlaybackTime = 0.0
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02)
switch_SetPieceCar_to_ai_on_collision = TRUE
allow_veh_to_stop_on_any_veh_impact = TRUE
fUberPlaybackDensitySwitchOffRange = 200.0
iDontSwitchThisSetpieceRecordingToAI = SetPieceCarRecording[SETPIECE_PACKER_INDEX]
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
//Create the owner and hide him for now, he turns up later.
pedCarOwner = CREATE_PED(PEDTYPE_MISSION, modelCarOwner, <<-1886.8330, -579.0045, 10.8163>>, 315.0557)
SET_PED_COMPONENT_VARIATION(pedCarOwner, PED_COMP_HEAD, 0, 0)
SET_PED_COMPONENT_VARIATION(pedCarOwner, PED_COMP_TORSO, 0, 0)
SET_PED_COMPONENT_VARIATION(pedCarOwner, PED_COMP_LEG, 0, 1)
SET_PED_COMPONENT_VARIATION(pedCarOwner, PED_COMP_SPECIAL, 1, 0)
SET_ENTITY_VISIBLE(pedCarOwner, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCarOwner)
TEXT_LABEL_63 strCamAnim = ""
bSafeToPlayCamAnim = FALSE
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
SET_VEHICLE_HAS_UNBREAKABLE_LIGHTS(sMainCars[iPlayersCar].veh, TRUE)
ENDIF
WAIT(0)
//Set up the synchronised scenes
IF iBuddiesCar = NINEF_INDEX
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
AND NOT IS_PED_INJURED(sLamar.ped)
SET_PED_PATH_CAN_USE_CLIMBOVERS(sLamar.ped, TRUE) //Reset from previous stage.
iSyncSceneCar = CREATE_SYNCHRONIZED_SCENE(<<-1883.150, -579.600, 10.850>>, <<1.000, -0.000, 139.040>>)
FREEZE_ENTITY_POSITION(sMainCars[iBuddiesCar].veh, FALSE)
PLAY_SYNCHRONIZED_ENTITY_ANIM(sMainCars[iBuddiesCar].veh, iSyncSceneCar, "carrace_walktocar_ninef2_car_ninef2", strChaseStartAnims, INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
sLamar.iSyncedScene = CREATE_SYNCHRONIZED_SCENE(<<-1883.150, -579.600, 10.850>>, <<1.000, -0.000, 139.040>>)
CLEAR_PED_TASKS_IMMEDIATELY(sLamar.ped)
TASK_SYNCHRONIZED_SCENE(sLamar.ped, sLamar.iSyncedScene, strChaseStartAnims, "carrace_walktocar_ninef2_lamar", INSTANT_BLEND_IN, INSTANT_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT)
FLOAT fStartDistFromCar = VDIST2(<<-1883.3, -576.7, 11.2>>, GET_ENTITY_COORDS(sMainCars[iBuddiesCar].veh))
FLOAT fDistFromCar = VDIST2(GET_ENTITY_COORDS(sLamar.ped), GET_ENTITY_COORDS(sMainCars[iBuddiesCar].veh))
IF fStartDistFromCar - fDistFromCar < 4.0
SET_SYNCHRONIZED_SCENE_PHASE(sLamar.iSyncedScene, 0.02)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneCar, 0.02)
/*IF NOT IS_ENTITY_ON_SCREEN(sLamar.ped)
//If Lamar is off-screen skip his anim forward a bit to avoid the pop in B*1778864.
SET_SYNCHRONIZED_SCENE_PHASE(sLamar.iSyncedScene, 0.06)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneCar, 0.06)
ELSE
SET_SYNCHRONIZED_SCENE_PHASE(sLamar.iSyncedScene, 0.02)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneCar, 0.02)
ENDIF*/
ELIF fStartDistFromCar - fDistFromCar < 9.0
SET_SYNCHRONIZED_SCENE_PHASE(sLamar.iSyncedScene, 0.07)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneCar, 0.07)
ELIF fStartDistFromCar - fDistFromCar < 16.0
SET_SYNCHRONIZED_SCENE_PHASE(sLamar.iSyncedScene, 0.09)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneCar, 0.09)
ELIF fStartDistFromCar - fDistFromCar < 25.0
SET_SYNCHRONIZED_SCENE_PHASE(sLamar.iSyncedScene, 0.11)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneCar, 0.11)
ELSE
SET_SYNCHRONIZED_SCENE_PHASE(sLamar.iSyncedScene, 0.13)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneCar, 0.13)
ENDIF
FORCE_PED_AI_AND_ANIMATION_UPDATE(sLamar.ped)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(sMainCars[iBuddiesCar].veh)
strCamAnim = "carrace_walktocar_ninef2_cam"
ENDIF
ELIF iBuddiesCar = RAPIDGT_INDEX
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
AND NOT IS_PED_INJURED(sLamar.ped)
iSyncSceneCar = CREATE_SYNCHRONIZED_SCENE(<<-1883.150, -579.600, 10.850>>, <<1.000, -0.000, 139.040>>)
FREEZE_ENTITY_POSITION(sMainCars[iBuddiesCar].veh, FALSE)
PLAY_SYNCHRONIZED_ENTITY_ANIM(sMainCars[iBuddiesCar].veh, iSyncSceneCar, "carrace_walktocar_rapidgt_car_rapidgt2", strChaseStartAnims, INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
BOOL bLamarWasAlreadyInCar = IS_PED_IN_VEHICLE(sLamar.ped, sMainCars[RAPIDGT_INDEX].veh)
BOOL bSkippedPlayerEntry = FALSE
CLEAR_PED_TASKS_IMMEDIATELY(sLamar.ped)
sLamar.iSyncedScene = CREATE_SYNCHRONIZED_SCENE(<<-1883.150, -579.600, 10.850>>, <<1.000, -0.000, 139.040>>)
TASK_SYNCHRONIZED_SCENE(sLamar.ped, sLamar.iSyncedScene, strChaseStartAnims, "carrace_walktocar_rapidgt_lamar", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT)
IF bLamarAlreadyGotIntoCar
OR bLamarWasAlreadyInCar
IF GET_VEHICLE_DOOR_ANGLE_RATIO(sMainCars[RAPIDGT_INDEX].veh, SC_DOOR_FRONT_LEFT) > 0.3
SET_SYNCHRONIZED_SCENE_PHASE(sLamar.iSyncedScene, 0.14)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneCar, 0.14)
ELSE
IF bLamarWasAlreadyInCar
SET_SYNCHRONIZED_SCENE_PHASE(sLamar.iSyncedScene, 0.25)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneCar, 0.25)
ELSE
SET_SYNCHRONIZED_SCENE_PHASE(sLamar.iSyncedScene, 0.14)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneCar, 0.14)
ENDIF
ENDIF
bSkippedPlayerEntry = TRUE
ELSE
IF GET_VEHICLE_DOOR_ANGLE_RATIO(sMainCars[RAPIDGT_INDEX].veh, SC_DOOR_FRONT_LEFT) > 0.0
SET_SYNCHRONIZED_SCENE_PHASE(sLamar.iSyncedScene, 0.14)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneCar, 0.14)
bSkippedPlayerEntry = TRUE
ELSE
IF bLamarGivenWalkToCarTask
SET_SYNCHRONIZED_SCENE_PHASE(sLamar.iSyncedScene, 0.08)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneCar, 0.08)
ELSE
SET_SYNCHRONIZED_SCENE_PHASE(sLamar.iSyncedScene, 0.03)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneCar, 0.03)
ENDIF
ENDIF
ENDIF
IF bSkippedPlayerEntry
//Shut the doors on the player's car immediately as there isn't enough time to close them normally.
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sMainCars[iPlayersCar].veh)
SET_VEHICLE_DOOR_SHUT(sMainCars[iPlayersCar].veh, SC_DOOR_FRONT_LEFT, TRUE)
SET_VEHICLE_DOOR_SHUT(sMainCars[iPlayersCar].veh, SC_DOOR_FRONT_RIGHT, TRUE)
ENDIF
ENDIF
FORCE_PED_AI_AND_ANIMATION_UPDATE(sLamar.ped)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(sMainCars[iBuddiesCar].veh)
strCamAnim = "carrace_walktocar_rapidgt_cam"
ENDIF
ENDIF
camCutscene = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", TRUE)
IF iPlayersCar = NINEF_INDEX
iCameraSyncScene = CREATE_SYNCHRONIZED_SCENE(<<-1883.150, -579.600, 10.850>>, <<1.000, -0.000, 139.040>>)
ELSE
iCameraSyncScene = CREATE_SYNCHRONIZED_SCENE(<<-1883.150, -579.600, 10.850>>, <<1.000, -0.000, 139.040>>)
ENDIF
PLAY_SYNCHRONIZED_CAM_ANIM(camCutscene, iCameraSyncScene, strCamAnim, strChaseStartAnims)
SET_SYNCHRONIZED_SCENE_PHASE(iCameraSyncScene, GET_SYNCHRONIZED_SCENE_PHASE(sLamar.iSyncedScene))
//Initialising uber playback switches off all the roads, we need them on for the first part of the cutscene.
SWITCH_ALL_RANDOM_CARS_ON()
CLEAR_AREA_OF_OBJECTS(<<-1878.6208, -577.6438, 10.7868>>, 100.0)
CLEAR_AREA_OF_PEDS(<<-1878.6208, -577.6438, 10.7868>>, 100.0)
CLEAR_AREA_OF_PROJECTILES(<<-1878.6208, -577.6438, 10.7868>>, 100.0)
CLEAR_ANGLED_AREA_OF_VEHICLES(<<-1886.993652,-585.902039,6.540985>>, <<-1852.676758,-542.452393,20.403040>>, 22.250000)
CLEAR_ANGLED_AREA_OF_VEHICLES(<<-1865.273438,-558.103577,10.637986>>, <<-1879.192505,-575.103149,15.430193>>, 16.750000)
SET_VEHICLE_GENERATOR_AREA_OF_INTEREST(<<-1910.6, -531.3, 11.2>>, 30.0)
//Have to stop playback for vehicle anims to work correctly
IF IS_VEHICLE_DRIVEABLE(sMainCars[NINEF_INDEX].veh)
SET_ENTITY_HEADING(sMainCars[NINEF_INDEX].veh, sMainCars[NINEF_INDEX].fStartHeading)
SET_ENTITY_COORDS(sMainCars[NINEF_INDEX].veh, sMainCars[NINEF_INDEX].vStartPos)
IF iPlayersCar = NINEF_INDEX
SET_VEHICLE_ENGINE_ON(sMainCars[NINEF_INDEX].veh, FALSE, FALSE)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sMainCars[RAPIDGT_INDEX].veh)
SET_ENTITY_HEADING(sMainCars[RAPIDGT_INDEX].veh, sMainCars[RAPIDGT_INDEX].fStartHeading)
SET_ENTITY_COORDS(sMainCars[RAPIDGT_INDEX].veh, sMainCars[RAPIDGT_INDEX].vStartPos)
IF iPlayersCar = RAPIDGT_INDEX
SET_VEHICLE_ENGINE_ON(sMainCars[RAPIDGT_INDEX].veh, FALSE, FALSE)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
SET_VEHICLE_RADIO_ENABLED(sMainCars[iBuddiesCar].veh, FALSE)
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("ARM_1_CHOOSE_CAR")
STOP_AUDIO_SCENE("ARM_1_CHOOSE_CAR")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("ARM_1_GET_IN_CAR_SCENE")
START_AUDIO_SCENE("ARM_1_GET_IN_CAR_SCENE")
ENDIF
IF NOT IS_PED_INJURED(sLamar.ped)
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sLamar.ped, -1, SLF_WHILE_NOT_IN_FOV)
ENDIF
CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(0.35)
CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(FALSE)
REMOVE_ANIM_DICT(strLamarAnnoyedAnims)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
SETTIMERB(0)
DO_FADE_IN_WITH_WAIT()
IF iBuddiesCar = NINEF_INDEX
CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_CHOICE2", CONV_PRIORITY_MEDIUM)
ELSE
IF NOT bLamarAlreadyGotIntoCar
CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_CHOICE", CONV_PRIORITY_MEDIUM)
ENDIF
ENDIF
//Record the cutscene where they take off in the cars.
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
bHasFirstPersonFlashTriggered = FALSE
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
REQUEST_TRAFFIC_IN_ADVANCE(5000.0)
REQUEST_SCRIPT_AUDIO_BANK("CAR_CRASHES_01")
REQUEST_SCRIPT_AUDIO_BANK("CAR_CRASHES_MED_01")
FLOAT fScenePhase = 0.0
IF IS_SYNCHRONIZED_SCENE_RUNNING(iCameraSyncScene)
fScenePhase = GET_SYNCHRONIZED_SCENE_PHASE(iCameraSyncScene)
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(fScenePhase)
#ENDIF
//Sometimes the player's door doesn't shut, so shut it here.
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
IF (iBuddiesCar = RAPIDGT_INDEX AND fScenePhase > 0.19 AND fScenePhase < 0.39)
OR (iBuddiesCar = NINEF_INDEX AND fScenePhase > 0.09 AND fScenePhase < 0.3)
IF GET_VEHICLE_DOOR_ANGLE_RATIO(sMainCars[iPlayersCar].veh, SC_DOOR_FRONT_LEFT) < 0.01
SET_VEHICLE_DOOR_SHUT(sMainCars[iPlayersCar].veh, SC_DOOR_FRONT_LEFT, TRUE)
ELSE
SET_VEHICLE_DOOR_CONTROL(sMainCars[iPlayersCar].veh, SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, GET_VEHICLE_DOOR_ANGLE_RATIO(sMainCars[iPlayersCar].veh, SC_DOOR_FRONT_LEFT) * 0.9)
ENDIF
IF GET_VEHICLE_DOOR_ANGLE_RATIO(sMainCars[iPlayersCar].veh, SC_DOOR_FRONT_RIGHT) < 0.01
SET_VEHICLE_DOOR_SHUT(sMainCars[iPlayersCar].veh, SC_DOOR_FRONT_RIGHT, TRUE)
ELSE
SET_VEHICLE_DOOR_CONTROL(sMainCars[iPlayersCar].veh, SC_DOOR_FRONT_RIGHT, DT_DOOR_INTACT, GET_VEHICLE_DOOR_ANGLE_RATIO(sMainCars[iPlayersCar].veh, SC_DOOR_FRONT_RIGHT) * 0.9)
ENDIF
ENDIF
ENDIF
SWITCH iCurrentEvent
CASE 0 //Start Franklin's synced scene off-camera.
IF iPlayersCar = NINEF_INDEX
LOAD_STREAM("ARM_1_IG_1_LAMAR_DRIVES_OFF")
ELSE
LOAD_STREAM("ARM_1_IG_2_LAMAR_DRIVES_OFF_ALT")
ENDIF
IF (iBuddiesCar = NINEF_INDEX AND fScenePhase > 0.23)
OR (iBuddiesCar = RAPIDGT_INDEX AND fScenePhase > 0.25)
iPlayerSyncScene = CREATE_SYNCHRONIZED_SCENE(<<-1883.150, -579.600, 10.850>>, <<1.000, -0.000, 139.040>>)
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
IF iBuddiesCar = NINEF_INDEX
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iPlayerSyncScene, strChaseStartAnims, "carrace_walktocar_ninef2_franklin", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(sMainCars[iPlayersCar].veh, iSyncSceneCar, "carrace_walktocar_ninef2_car_rapidgt2", strChaseStartAnims, INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
ELIF iBuddiesCar = RAPIDGT_INDEX
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iPlayerSyncScene, strChaseStartAnims, "carrace_walktocar_rapidgt_franklin", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(sMainCars[iPlayersCar].veh, iSyncSceneCar, "carrace_walktocar_rapidgt_car_ninef2", strChaseStartAnims, INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
ROLL_DOWN_WINDOWS(sMainCars[iPlayersCar].veh)
ENDIF
PLAY_STREAM_FRONTEND()
SET_SYNCHRONIZED_SCENE_PHASE(iPlayerSyncScene, fScenePhase)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 1 //Start Franklin's roof.
IF (iBuddiesCar = NINEF_INDEX AND fScenePhase > 0.25)
OR (iBuddiesCar = RAPIDGT_INDEX AND fScenePhase > 0.24)
LOWER_CONVERTIBLE_ROOF(sMainCars[iPlayersCar].veh)
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 2 //Lower Lamar's roof: note this needs to be done at a good spot as it stops the synced scene.
IF (iBuddiesCar = NINEF_INDEX AND fScenePhase > 0.272)
OR (iBuddiesCar = RAPIDGT_INDEX AND fScenePhase > 0.24)
IF NOT bHasTextLabelTriggered[ARM1_RACE_PRELOAD]
IF (iBuddiesCar = NINEF_INDEX AND PRELOAD_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_RACE2", CONV_PRIORITY_MEDIUM))
OR (iBuddiesCar = RAPIDGT_INDEX AND PRELOAD_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_RACE", CONV_PRIORITY_MEDIUM))
bHasTextLabelTriggered[ARM1_RACE_PRELOAD] = TRUE
ELSE
KILL_FACE_TO_FACE_CONVERSATION() //In case the first part of the conversation streamed late, we want to get rid of it in case it delays the second part.
ENDIF
ENDIF
ENDIF
IF (iBuddiesCar = NINEF_INDEX AND fScenePhase > 0.32)
OR (iBuddiesCar = RAPIDGT_INDEX AND fScenePhase > 0.3)
IF iBuddiesCar = NINEF_INDEX
LOWER_CONVERTIBLE_ROOF(sMainCars[iBuddiesCar].veh)
ENDIF
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 3 //Start the main dialogue.
IF (iBuddiesCar = NINEF_INDEX AND fScenePhase > 0.33)
OR (iBuddiesCar = RAPIDGT_INDEX AND fScenePhase > 0.34)
IF (iBuddiesCar = NINEF_INDEX AND CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_RACE2", CONV_PRIORITY_MEDIUM))
OR (iBuddiesCar = RAPIDGT_INDEX AND CREATE_CONVERSATION_FROM_SPECIFIC_LINE(sConversationPeds, "ARM1AUD", "ARM1_RACE", "ARM1_RACE_3", CONV_PRIORITY_MEDIUM))
bHasTextLabelTriggered[ARM1_RACE] = TRUE
SETTIMERB(0)
iCurrentEvent++
ELSE
KILL_FACE_TO_FACE_CONVERSATION() //In case the first part of the conversation streamed late, we want to get rid of it as soon as possible.
ENDIF
ENDIF
BREAK
CASE 4 //Clear the area.
IF (iBuddiesCar = NINEF_INDEX AND fScenePhase > 0.39)
OR (iBuddiesCar = RAPIDGT_INDEX AND fScenePhase > 0.39)
CLEAR_ANGLED_AREA_OF_VEHICLES(<<-1865.273438,-558.103577,10.637986>>, <<-1879.192505,-575.103149,15.430193>>, 16.750000)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF iBuddiesCar = RAPIDGT_INDEX
LOWER_CONVERTIBLE_ROOF(sMainCars[iBuddiesCar].veh)
ENDIF
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 5 //Restart Lamar's car synced scene: this seems to keep the roof going too.
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF NOT bHasTextLabelTriggered[AR1_CONVHELP]
IF TIMERB() > 1500
PRINT_HELP("AR1_CONVHELP", 9000)
bHasTextLabelTriggered[AR1_CONVHELP] = TRUE
ENDIF
ENDIF
IF (iBuddiesCar = NINEF_INDEX AND fScenePhase > 0.65)
OR (iBuddiesCar = RAPIDGT_INDEX AND fScenePhase > 0.65)
IF iBuddiesCar = NINEF_INDEX
iSyncSceneCar = CREATE_SYNCHRONIZED_SCENE(<<-1883.150, -579.600, 10.850>>, <<1.000, -0.000, 139.040>>)
PLAY_SYNCHRONIZED_ENTITY_ANIM(sMainCars[iBuddiesCar].veh, iSyncSceneCar, "carrace_walktocar_ninef2_car_ninef2", strChaseStartAnims, INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneCar, fScenePhase)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(sMainCars[iBuddiesCar].veh)
ELSE
iSyncSceneCar = CREATE_SYNCHRONIZED_SCENE(<<-1883.150, -579.600, 10.800>>, <<1.000, -0.000, 139.040>>)
PLAY_SYNCHRONIZED_ENTITY_ANIM(sMainCars[iBuddiesCar].veh, iSyncSceneCar, "carrace_walktocar_rapidgt_car_rapidgt2", strChaseStartAnims, INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneCar, fScenePhase)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(sMainCars[iBuddiesCar].veh)
ENDIF
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 6 //Prepare Franklin's car for driving off.
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF NOT bHasTextLabelTriggered[AR1_CONVHELP]
PRINT_HELP("AR1_CONVHELP", 9000)
bHasTextLabelTriggered[AR1_CONVHELP] = TRUE
ENDIF
IF (iBuddiesCar = NINEF_INDEX AND fScenePhase > 0.87)
OR (iBuddiesCar = RAPIDGT_INDEX AND fScenePhase > 0.95)
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
SET_VEHICLE_ENGINE_ON(sMainCars[iPlayersCar].veh, TRUE, TRUE)
ENDIF
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 7 //Cut back to gameplay.
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] CHASE_START_CUTSCENE_ANIMATED_CAMS: fScenePhase = ", fScenePhase, " TIMERB = ", TIMERB())
IF NOT bHasFirstPersonFlashTriggered
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 (iBuddiesCar = NINEF_INDEX AND TIMERB() > 2560)
OR (iBuddiesCar = RAPIDGT_INDEX AND TIMERB() > 350)
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] Triggering flash: fScenePhase = ", fScenePhase, " TIMERB = ", TIMERB())
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bHasFirstPersonFlashTriggered = TRUE
ENDIF
ENDIF
ENDIF
IF (iBuddiesCar = NINEF_INDEX AND fScenePhase > 0.99)
OR (iBuddiesCar = RAPIDGT_INDEX AND fScenePhase > 0.99)
//If Lamar's roof hasn't lowered yet then do it now: needs a frame to wait.
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
LOWER_CONVERTIBLE_ROOF(sMainCars[iBuddiesCar].veh, TRUE)
IF NOT IS_PED_INJURED(sLamar.ped)
STOP_SYNCHRONIZED_ENTITY_ANIM(sLamar.ped, NORMAL_BLEND_OUT, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(sLamar.ped)
SET_PED_INTO_VEHICLE(sLamar.ped, sMainCars[iBuddiesCar].veh, VS_DRIVER)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sLamar.ped)
ENDIF
WAIT(0)
ENDIF
//Start the buddies recording (trigger car for the uber chase)
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
//Guarantee that the roof is down for the buddy at this point.
STOP_SYNCHRONIZED_ENTITY_ANIM(sMainCars[iBuddiesCar].veh, INSTANT_BLEND_OUT, TRUE)
LOWER_CONVERTIBLE_ROOF(sMainCars[iBuddiesCar].veh, TRUE)
SET_VEHICLE_FIXED(sMainCars[iBuddiesCar].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sMainCars[iBuddiesCar].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sMainCars[iBuddiesCar].veh)
REMOVE_VEHICLE_RECORDING(sMainCars[iBuddiesCar].iStartCarrec, strCarrec)
ENDIF
START_PLAYBACK_RECORDED_VEHICLE(sMainCars[iBuddiesCar].veh, iCarrecMain, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sMainCars[iBuddiesCar].veh, UBER_SKIP_TIME)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sMainCars[iBuddiesCar].veh)
ENDIF
//Stop player's custom anims
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sMainCars[iPlayersCar].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh)
ENDIF
SET_VEHICLE_DOORS_SHUT(sMainCars[iPlayersCar].veh, TRUE)
IF iPlayersCar = RAPIDGT_INDEX
SET_ENTITY_HEADING(sMainCars[iPlayersCar].veh, 321.0557)
SET_ENTITY_COORDS(sMainCars[iPlayersCar].veh, <<-1880.0450, -577.4576, 10.7658>>)
ELSE
SET_ENTITY_HEADING(sMainCars[iPlayersCar].veh, 320.1515)
SET_ENTITY_COORDS(sMainCars[iPlayersCar].veh, <<-1878.4385, -579.7686, 10.7883>>)
ENDIF
STOP_SYNCHRONIZED_ENTITY_ANIM(sMainCars[iPlayersCar].veh, INSTANT_BLEND_OUT, TRUE)
STOP_SYNCHRONIZED_ENTITY_ANIM(PLAYER_PED_ID(), INSTANT_BLEND_OUT, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sMainCars[iPlayersCar].veh, VS_DRIVER)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
ENDIF
//Car owner runs out (currently disabled as we're trying out having him run later).
IF NOT IS_PED_INJURED(pedCarOwner)
SET_ENTITY_VISIBLE(pedCarOwner, TRUE)
TASK_LOOK_AT_ENTITY(pedCarOwner, PLAYER_PED_ID(), -1)
//TASK_COMBAT_PED(pedCarOwner, PLAYER_PED_ID())
ENDIF
SWITCH_ALL_RANDOM_CARS_OFF()
CLEAR_AREA_OF_VEHICLES(<<-1883.704956,-578.825195,11.330235>>, 500.0)
CREATE_ALL_WAITING_UBER_CARS()
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
UPDATE_UBER_PLAYBACK(sMainCars[iBuddiesCar].veh, 1.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
// //Stop recording cutscene.
// REPLAY_STOP_EVENT()
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
BREAK
ENDSWITCH
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
eSectionStage = SECTION_STAGE_SKIP
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
KILL_FACE_TO_FACE_CONVERSATION()
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
IF NOT IS_PED_INJURED(sLamar.ped)
TASK_CLEAR_LOOK_AT(sLamar.ped)
ENDIF
REMOVE_ANIM_DICT(strChaseStartAnims)
CLEAR_VEHICLE_GENERATOR_AREA_OF_INTEREST()
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
SET_WIDESCREEN_BORDERS(FALSE, 0)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
CASCADE_SHADOWS_INIT_SESSION()
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_CHASE
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_CHASE, TRUE)
ENDIF
ENDPROC
BOOL bHackStopRecordingFlag = FALSE
INT iTimeToStopRecording
PROC CHASE_BUDDY()
FLOAT fUberJumpTime = 1250.0
IF eMissionStage = STAGE_CHASE_MID_POINT
fUberJumpTime = 83500.0
ENDIF
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
VECTOR vPlayerWarpPos = sMainCars[0].vStartPos
FLOAT fPlayerWarpHeading = fFranklinLeadOutHeading
IF eMissionStage = STAGE_CHASE_MID_POINT
vPlayerWarpPos = <<-1155.1976, -873.2174, 10.6185>>
fPlayerWarpHeading = -150.0
ENDIF
IF bUsedACheckpoint
START_REPLAY_SETUP(vPlayerWarpPos, fPlayerWarpHeading, FALSE)
iCurrentEvent = 99
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), vPlayerWarpPos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fPlayerWarpHeading)
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
SETUP_REQ_CAR_CHOICES()
REQUEST_MODEL(modelCarOwner)
WHILE NOT SETUP_REQ_LOAD_MAIN_CHASE_RECORDING()
OR NOT DOES_ENTITY_EXIST(sLamar.ped)
OR NOT DOES_ENTITY_EXIST(sMainCars[0].veh)
OR NOT DOES_ENTITY_EXIST(sMainCars[1].veh)
OR NOT HAS_MODEL_LOADED(modelCarOwner)
SETUP_LAMAR(vLamarLeadOutPos)
SETUP_NINEF(sMainCars[0].vStartPos, sMainCars[0].fStartHeading)
SETUP_RAPIDGT(sMainCars[1].vStartPos, sMainCars[1].fStartHeading)
REQUEST_MODEL(modelCarOwner)
REQUEST_SCRIPT_AUDIO_BANK("CAR_CRASHES_01")
REQUEST_SCRIPT_AUDIO_BANK("CAR_CRASHES_MED_01")
WAIT(0)
ENDWHILE
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
SETUP_REQ_PUT_PLAYER_INTO_CHOSEN_CAR()
SETUP_REQ_LAMAR_INTO_CHOSEN_CAR()
SETUP_REQ_FORCE_ROOFS_DOWN_FOR_BOTH_CARS()
BLOCK_VEHICLE_GENS_AT_START_POINT(TRUE)
SPECIAL_ABILITY_RESET(PLAYER_ID())
IF eMissionStage = STAGE_CHASE
pedCarOwner = CREATE_PED(PEDTYPE_MISSION, modelCarOwner, <<-1886.8330, -579.0045, 10.8163>>, 315.0557)
SET_PED_COMPONENT_VARIATION(pedCarOwner, PED_COMP_HEAD, 0, 0)
SET_PED_COMPONENT_VARIATION(pedCarOwner, PED_COMP_TORSO, 0, 0)
SET_PED_COMPONENT_VARIATION(pedCarOwner, PED_COMP_LEG, 0, 1)
SET_PED_COMPONENT_VARIATION(pedCarOwner, PED_COMP_SPECIAL, 1, 0)
TASK_LOOK_AT_ENTITY(pedCarOwner, PLAYER_PED_ID(), -1)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(modelCarOwner)
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
IF eMissionStage = STAGE_CHASE_MID_POINT
SET_ENTITY_COORDS(sMainCars[iPlayersCar].veh, <<-1153.1976, -875.2174, 10.6185>>)
SET_ENTITY_HEADING(sMainCars[iPlayersCar].veh, -150.0)
ENDIF
SET_VEHICLE_ENGINE_ON(sMainCars[iPlayersCar].veh, TRUE, TRUE)
ENDIF
SET_INITIAL_PLAYER_STATION("RADIO_03_HIPHOP_NEW")
FREEZE_RADIO_STATION("RADIO_03_HIPHOP_NEW")
SET_RADIO_AUTO_UNFREEZE(FALSE)
SET_RADIO_TRACK("RADIO_03_HIPHOP_NEW", "ARM1_RADIO_STARTS")
//Start buddy recording
INITIALISE_UBER_PLAYBACK(strCarrec, iCarrecMain)
LOAD_CHASE_UBER_DATA()
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02)
switch_SetPieceCar_to_ai_on_collision = TRUE
allow_veh_to_stop_on_any_veh_impact = TRUE
fUberPlaybackDensitySwitchOffRange = 200.0
iDontSwitchThisSetpieceRecordingToAI = SetPieceCarRecording[SETPIECE_PACKER_INDEX]
REQUEST_TRAFFIC_IN_ADVANCE(fUberJumpTime + 4000.0, fUberJumpTime - 5000.0)
WAIT(500)
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
AND IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
START_PLAYBACK_RECORDED_VEHICLE(sMainCars[iBuddiesCar].veh, iCarrecMain, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sMainCars[iBuddiesCar].veh, fUberJumpTime)
SET_UBER_PLAYBACK_TO_TIME_NOW(sMainCars[iBuddiesCar].veh, fUberJumpTime)
IF eMissionStage = STAGE_CHASE
//START_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh, sMainCars[iPlayersCar].iStartCarrec, strCarrec)
//SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh, 2000.0)
SPECIAL_ABILITY_DEPLETE_METER(PLAYER_ID(), TRUE)
ENABLE_SPECIAL_ABILITY(PLAYER_ID(), FALSE)
ELSE
SET_ENTITY_HEADING(sMainCars[iPlayersCar].veh, 210.9189)
SET_ENTITY_COORDS(sMainCars[iPlayersCar].veh, <<-1153.1976, -875.2174, 10.6185>>)
SET_VEHICLE_ON_GROUND_PROPERLY(sMainCars[iPlayersCar].veh)
ENABLE_SPECIAL_ABILITY(PLAYER_ID(), TRUE)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
WAIT(100)
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
SETUP_REQ_ARRIVAL_RECORDING_CHOICES()
SET_WANTED_LEVEL_MULTIPLIER(0.0)
SET_VEHICLE_POPULATION_BUDGET(1)
SET_PED_POPULATION_BUDGET(2)
bTruckHornActivated = FALSE
bBusHornActivated = FALSE
bVanHornActivated = FALSE
bBuddyFinished = FALSE
bLamarJustTeasedFranklin = FALSE
bLamarJustInstructedFranklin = FALSE
bAliensStatHasBeenSet = FALSE
bMovieBarrierSmashed = FALSE
bCyclistsSetToFlee = FALSE
bOverriddenVanColour = FALSE
fCurrentPlaybackSpeed = 1.0
iTimeSinceLastHorn = 0
sRageData.bHasRaged = FALSE
sRageData.fCurrentRage = 0.0
CLEAR_TRIGGERED_LABELS()
DISABLE_VEHICLE_GEN_ON_MISSION(TRUE) //Stops vehicle gen controller from requesting assets during the chase.
SET_FORCED_OBJECTS_FOR_CHASE(TRUE)
BLOCK_SCENARIOS_FOR_CHASE(TRUE)
DISABLE_TAXI_HAILING(TRUE)
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ARM1_CAR_DAMAGED, FALSE)
SET_ALL_RANDOM_PEDS_FLEE(PLAYER_ID(), TRUE)
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, FALSE)
UNFREEZE_RADIO_STATION("RADIO_03_HIPHOP_NEW")
SET_RADIO_AUTO_UNFREEZE(TRUE)
//SET_AGGRESSIVE_HORNS(TRUE)
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(sMainCars[iPlayersCar].veh)
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(sMainCars[iPlayersCar].veh)
SETTIMERA(0)
SETTIMERB(0)
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
SET_VEHICLE_HAS_UNBREAKABLE_LIGHTS(sMainCars[iPlayersCar].veh, TRUE)
iPlayersHealthBeforeRace = GET_ENTITY_HEALTH(sMainCars[iPlayersCar].veh)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
ACTIVATE_PHYSICS(sMainCars[iBuddiesCar].veh)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(sMainCars[iBuddiesCar].veh, TRUE)
SET_VEHICLE_ACT_AS_IF_HIGH_SPEED_FOR_FRAG_SMASHING(sMainCars[iBuddiesCar].veh, TRUE)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(sMainCars[iBuddiesCar].veh, "ARM_1_LAMARS_CAR")
iLamarsHealthBeforeRace = GET_ENTITY_HEALTH(sMainCars[iBuddiesCar].veh)
ENDIF
IF NOT IS_PED_INJURED(sLamar.ped)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sLamar.ped, TRUE)
SET_PED_CONFIG_FLAG(sLamar.ped, PCF_GetOutBurningVehicle, FALSE)
SET_PED_CONFIG_FLAG(sLamar.ped, PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(sLamar.ped, PCF_DisableExplosionReactions, TRUE)
SET_PED_LOD_MULTIPLIER(sLamar.ped, 2.0) //Prevents LOD issues at the end of the chase if the player stands by Lamar without triggering the cutscene.
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("ARM_1_GET_IN_CAR_SCENE")
STOP_AUDIO_SCENE("ARM_1_GET_IN_CAR_SCENE")
ENDIF
//STOP_STREAM() //This stops the custom stream for the chase start cutscene. Shouldn't need to be stopped by script?
IF eMissionStage = STAGE_CHASE
IF NOT IS_AUDIO_SCENE_ACTIVE("ARM_1_DRIVE_START")
START_AUDIO_SCENE("ARM_1_DRIVE_START")
ENDIF
ENABLE_SPECIAL_ABILITY(PLAYER_ID(), FALSE)
ELSE
//If we're jumping to half-way through the chase make sure anything that takes place beforehand doesn't trigger.
ENABLE_SPECIAL_ABILITY(PLAYER_ID(), TRUE)
bHasTextLabelTriggered[AR1_CHASE] = TRUE
bHasTextLabelTriggered[AR1_CAMHELP] = TRUE
bHasTextLabelTriggered[AR1_BRAKE] = TRUE
bHasTextLabelTriggered[ARM1_CYCL] = TRUE
bHasTextLabelTriggered[ARM1_ALIEN] = TRUE
bHasTextLabelTriggered[ARM1_TOW] = TRUE
IF bAllowSpecialAbilityDuringChase
bHasTextLabelTriggered[AR1_RAGEBAR] = TRUE
bHasTextLabelTriggered[AR1_RAGEHOW] = TRUE
bHasTextLabelTriggered[AR1_RAGESTAT] = TRUE
sRageData.bHasRaged = TRUE
bSkippedSpecialAbilityTutorial = TRUE
ENDIF
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_MID_CHASE, "CHASE_MID_POINT")
ENDIF
iChasePedBlockingArea = ADD_NAVMESH_BLOCKING_OBJECT(<<-334.181854,-673.711304,33.338654>>, <<28.250000,3.000000,3.000000>>, 175.8)
iChasePedBlockingArea2 = ADD_NAVMESH_BLOCKING_OBJECT(<<-1138.2, -723.6, 20.0>>, <<10.0000,10.000000,3.000000>>, 91.3)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_DRIVING)
IF IS_SCREEN_FADED_OUT()
SETTIMERB(0)
//Spend a small bit of time getting the chase going before fading in.
WHILE TIMERB() < 500
REQUEST_TRAFFIC_IN_ADVANCE(fUberJumpTime + 5000.0, fUberJumpTime - 5000.0)
CREATE_ALL_WAITING_UBER_CARS()
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
UPDATE_UBER_PLAYBACK(sMainCars[iBuddiesCar].veh, 1.0)
WAIT(0)
ENDWHILE
IF eMissionStage = STAGE_CHASE_MID_POINT
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
SET_VEHICLE_FORWARD_SPEED(sMainCars[iPlayersCar].veh, 20.0)
ENDIF
ENDIF
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
WHILE NOT IS_SCREEN_FADED_IN()
REQUEST_TRAFFIC_IN_ADVANCE(fUberJumpTime + 5000.0, fUberJumpTime - 5000.0)
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
UPDATE_UBER_PLAYBACK(sMainCars[iBuddiesCar].veh, 1.0)
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
WAIT(0)
ENDWHILE
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
SET_VEHICLE_HAS_UNBREAKABLE_LIGHTS(sMainCars[iPlayersCar].veh, TRUE)
ENDIF
IF eMissionStage = STAGE_CHASE
SPECIAL_ABILITY_FILL_METER(PLAYER_ID(), TRUE)
ENDIF
//REPLAY_RECORD_BACK_FOR_TIME(0.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
iTimeToStopRecording = GET_GAME_TIMER()
SETUP_REQ_REMOVE_BANK_SHUTTERS()
iAudioSceneEventDialPhone = 0
iAudioSceneEventMovieStudio = 0
iAudioSceneEventBumps = 0
iAudioSceneEventCarPark = 0
iRageHelpTimer = 0
bCarOwnerActive = FALSE
iHintCamHelpTimer = 0
bCarCollisionIsDisabled = FALSE
bDialToneTriggered = FALSE
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
DISABLE_CELLPHONE_THIS_FRAME_ONLY() //Don't allow phone during chase, due to being on a fake phone call with Lamar while driving.
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
//Have the car owner attack the player if he hangs around, and remove the ped once the player drives off.
IF NOT IS_PED_INJURED(pedCarOwner)
IF NOT bCarOwnerActive
IF fCurrentPlaybackTime > 15000.0
OR (IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh) AND GET_ENTITY_SPEED(sMainCars[iPlayersCar].veh) > 1.0)
OR IS_SPHERE_VISIBLE(<<-1885.0, -577.6, 12.1>>, 1.0)
bCarOwnerActive = TRUE
ENDIF
ELSE
IF NOT IS_PED_IN_COMBAT(pedCarOwner)
AND GET_SCRIPT_TASK_STATUS(pedCarOwner, SCRIPT_TASK_COMBAT) != PERFORMING_TASK
TASK_COMBAT_PED(pedCarOwner, PLAYER_PED_ID())
ENDIF
ENDIF
IF VDIST2(vPlayerPos, GET_ENTITY_COORDS(pedCarOwner)) > 2500.0
IF NOT IS_ENTITY_ON_SCREEN(pedCarOwner)
REMOVE_PED(pedCarOwner, FALSE)
ENDIF
ENDIF
ENDIF
IF bHackStopRecordingFlag = FALSE
AND GET_GAME_TIMER() - iTimeToStopRecording > 10000
//Stop recording cutscene.
REPLAY_STOP_EVENT()
bHackStopRecordingFlag = TRUE
ENDIF
REQUEST_ANIM_DICT(strLamarCarAnimsCrash)
REQUEST_ANIM_DICT(strLamarCarAnimsTaunt)
REQUEST_ANIM_DICT(strFranklinCarAnimsTaunt)
REQUEST_SCRIPT_AUDIO_BANK("CAR_CRASHES_01")
REQUEST_SCRIPT_AUDIO_BANK("CAR_CRASHES_MED_01")
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
AND IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
//Deal with carrying over the chase start recording from the cutscene.
IF iCurrentEvent = 0
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sMainCars[iPlayersCar].veh)
FLOAT fTransitionPlaybackTime = GET_TIME_POSITION_IN_RECORDING(sMainCars[iPlayersCar].veh)
IF GET_VEHICLE_DOOR_LOCK_STATUS(sMainCars[iPlayersCar].veh) != VEHICLELOCK_LOCKED_PLAYER_INSIDE
SET_VEHICLE_DOORS_LOCKED(sMainCars[iPlayersCar].veh, VEHICLELOCK_LOCKED_PLAYER_INSIDE)
ENDIF
IF (iPlayersCar = RAPIDGT_INDEX AND fTransitionPlaybackTime > 3900.0)
OR (iPlayersCar = NINEF_INDEX AND fTransitionPlaybackTime > 3600.0)
STOP_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh)
REMOVE_VEHICLE_RECORDING(sMainCars[iPlayersCar].iStartCarrec, strCarrec)
ENDIF
ELSE
IF GET_VEHICLE_DOOR_LOCK_STATUS(sMainCars[iPlayersCar].veh) != VEHICLELOCK_UNLOCKED
SET_VEHICLE_DOORS_LOCKED(sMainCars[iPlayersCar].veh, VEHICLELOCK_UNLOCKED)
ENDIF
ENDIF
ENDIF
FLOAT fDistBetweenCars = VDIST2(vPlayerPos, GET_ENTITY_COORDS(sMainCars[iBuddiesCar].veh))
//Get the closest vehicle to the player periodically: this is used to check dialogue and horn triggers elsewhere.
VEHICLE_INDEX vehClosest = GET_CLOSEST_VEHICLE(vPlayerPos, 10.0, DUMMY_MODEL_FOR_SCRIPT, GET_TRAFFIC_VEHICLE_SEARCH_FLAGS()) //GET_CLOSEST_VEHICLE_TO_PLAYER_EXCLUDING_CHASE_CARS()
//Update the uber chase.
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sMainCars[iBuddiesCar].veh)
fCurrentPlaybackTime = GET_TIME_POSITION_IN_RECORDING(sMainCars[iBuddiesCar].veh)
//PRELOAD_ALL_CHASE_RECORDINGS(fCurrentPlaybackTime)
IF bUseNewRubberBanding
RUBBER_BAND_TEST(fCurrentPlaybackSpeed, sMainCars[iPlayersCar].veh, sMainCars[iBuddiesCar].veh)
ELSE
//RUBBER_BAND_CHASE(fCurrentPlaybackSpeed, sMainCars[iPlayersCar].veh, sMainCars[iBuddiesCar].veh)
RUBBER_BAND_CHASE_CLOSE_VERSION(fCurrentPlaybackSpeed, sMainCars[iPlayersCar].veh, sMainCars[iBuddiesCar].veh)
ENDIF
fUberMinTimeBeforePlaybackStartToCreate = 7000.0
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
UPDATE_UBER_PLAYBACK(sMainCars[iBuddiesCar].veh, fCurrentPlaybackSpeed)
SET_PLAYBACK_SPEED(sMainCars[iBuddiesCar].veh, fCurrentPlaybackSpeed)
MANAGE_CHASE_SET_PIECES()
MANAGE_LAMARS_CAR_LIGHTS(sMainCars[iBuddiesCar].veh, fCurrentPlaybackTime)
//TEMP: There's a new traffic light that the car passes through (v209), turn off collision around there.
//50700.0 - 50900.0
IF NOT bCarCollisionIsDisabled
//IF VDIST2(GET_ENTITY_COORDS(sMainCars[iBuddiesCar].veh), <<-980.11, -435.25, 36.99>>) < 9.0
IF fCurrentPlaybackTime > 50500.0 AND fCurrentPlaybackTime < 51100.0
SET_ENTITY_COLLISION(sMainCars[iBuddiesCar].veh, FALSE)
bCarCollisionIsDisabled = TRUE
ENDIF
ELSE
//IF VDIST2(GET_ENTITY_COORDS(sMainCars[iBuddiesCar].veh), <<-980.11, -435.25, 36.99>>) > 9.0
IF fCurrentPlaybackTime > 51100.0
SET_ENTITY_COLLISION(sMainCars[iBuddiesCar].veh, TRUE)
bCarCollisionIsDisabled = FALSE
ENDIF
ENDIF
//Once the buddy finishes clean up playback.
IF NOT bBuddyFinished
IF fCurrentPlaybackTime > GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iCarrecMain, strCarrec) - 4000.0
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sMainCars[iBuddiesCar].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sMainCars[iBuddiesCar].veh)
ENDIF
CLEANUP_UBER_PLAYBACK()
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sMainCars[iBuddiesCar].veh)
bCloseFinish = FALSE
bBuddyFinished = TRUE
ENDIF
ENDIF
IF NOT bMovieBarrierSmashed
IF iBuddiesCar = NINEF_INDEX
AND fCurrentPlaybackTime >= 54635.0
OBJECT_INDEX objBarrier = GET_CLOSEST_OBJECT_OF_TYPE(<<-1052.49, -476.15, 36.66>>, 5.0, PROP_SEC_BARRIER_LD_01A, FALSE)
IF DOES_ENTITY_EXIST(objBarrier)
SET_ENTITY_INVINCIBLE(sMainCars[iBuddiesCar].veh, TRUE)
//ADD_EXPLOSION(<<-1052.9, -475.1, 36.9>>, EXP_TAG_GRENADE, 0.5, FALSE, TRUE, 0.0)
//APPLY_FORCE_TO_ENTITY(objBarrier, APPLY_TYPE_EXTERNAL_IMPULSE, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<0.0, 0.0, 121.7>>) * 5.0, <<0.0, 0.0, 0.0>>, 0, FALSE, TRUE, TRUE)
BREAK_OBJECT_FRAGMENT_CHILD(objBarrier, 1, FALSE)
BREAK_OBJECT_FRAGMENT_CHILD(objBarrier, 2, FALSE)
ENDIF
bMovieBarrierSmashed = TRUE
ENDIF
ELSE
IF fCurrentPlaybackTime > 56000.0
AND fCurrentPlaybackTime < 56500.0
SET_ENTITY_INVINCIBLE(sMainCars[iBuddiesCar].veh, FALSE)
ENDIF
ENDIF
ENDIF
//Add a checkpoint when the player reaches half-way
IF eMissionStage = STAGE_CHASE
IF fCurrentPlaybackTime > 83000.0
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
AND IS_ENTITY_ON_SCREEN(sMainCars[iBuddiesCar].veh)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_MID_CHASE, "CHASE_MID_POINT")
eMissionStage = STAGE_CHASE_MID_POINT
ENDIF
ENDIF
ENDIF
//Fix for B*530782 - Clear the secondary taunt anims if the player tries to leave the car.
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_VEH_EXIT)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sMainCars[iPlayersCar].veh)
CLEAR_PED_SECONDARY_TASK(PLAYER_PED_ID())
ENDIF
ENDIF
//Set the fail distance to different values depending on different parts of the chase. This distance is used for fail conditions + blip control.
FLOAT fCurrentFailDistance
IF fCurrentPlaybackTime < 28500.0
//Fix for 279573 - Make the fail check less harsh at the start where Lamar doubles back on himself.
fCurrentFailDistance = 160000.0
ELSE
fCurrentFailDistance = 60000.0
ENDIF
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sMainCars[iPlayersCar].veh)
DO_CHASE_HORNS(vehClosest)
DO_NEAR_MISS_FRANKLIN_DIALOGUE(vehClosest)
IF IS_THIS_PRINT_BEING_DISPLAYED("CMN_GENGETBCK")
CLEAR_PRINTS()
ENDIF
//Keep track of when Franklin gets in front.
IF NOT bPlayerIsAheadOfChase
iTimeWhenFranklinGotInFront = GET_GAME_TIMER()
ENDIF
//Handle use of special ability during chase.
IF bAllowSpecialAbilityDuringChase
//Do help text.
IF NOT bHasTextLabelTriggered[AR1_RAGEBAR] //Explain the rage bar as soon as the first god text has finished printing.
IF bHasTextLabelTriggered[AR1_CHASE]
AND (bHasTextLabelTriggered[AR1_CAMHELP] OR NOT SAFE_TO_PRINT_CHASE_HINT_CAM_HELP())
AND NOT IS_THIS_PRINT_BEING_DISPLAYED("AR1_CHASE")
AND fCurrentPlaybackTime > 17200.0
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
IF iRageHelpTimer = 0
iRageHelpTimer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - iRageHelpTimer > 2500
// Steve R - Different help for PC keyboard and mouse controls as we use only one input instead of two to activate special ability.
// This command only returns TRUE if it's a PC build and you're using keyboard and mouse.
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
PRINT_HELP("AR1_RAGEBAR_KM", DEFAULT_HELP_TEXT_TIME + 7000)
ELSE
PRINT_HELP("AR1_RAGEBAR", DEFAULT_HELP_TEXT_TIME + 7000)
ENDIF
bHasTextLabelTriggered[AR1_RAGEBAR] = TRUE
iRageHelpTimer = 0
ENABLE_SPECIAL_ABILITY(PLAYER_ID(), TRUE)
FLASH_ABILITY_BAR(DEFAULT_HELP_TEXT_TIME)
ENDIF
ENDIF
ENDIF
ELIF NOT bHasTextLabelTriggered[AR1_RAGEHOW] //Explain how to fill up the rage bar.
IF iRageHelpTimer = 0
IF IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
iRageHelpTimer = GET_GAME_TIMER()
ENDIF
ELIF GET_GAME_TIMER() - iRageHelpTimer > 2000
PRINT_HELP("AR1_RAGEHOW", DEFAULT_HELP_TEXT_TIME + 3000)
bHasTextLabelTriggered[AR1_RAGEHOW] = TRUE
iRageHelpTimer = GET_GAME_TIMER()
FLASH_ABILITY_BAR(0)
ENDIF
ELIF NOT bHasTextLabelTriggered[AR1_RAGESTAT] //Explain how the stat works.
IF GET_GAME_TIMER() - iRageHelpTimer > 10000
AND NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
PRINT_HELP("AR1_RAGESTAT", DEFAULT_HELP_TEXT_TIME + 3000)
bHasTextLabelTriggered[AR1_RAGESTAT] = TRUE
iRageHelpTimer = GET_GAME_TIMER()
FLASH_ABILITY_BAR(0)
ENDIF
ELIF NOT bHasTextLabelTriggered[AR1_RAGEDEACT] //Explain how to deactivate.
IF NOT IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
iRageHelpTimer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - iRageHelpTimer > 500
AND NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
// Steve R - Different help for PC keyboard and mouse controls as we use only one input instead of two to activate special ability.
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
PRINT_HELP("AR1_RAGEDEACT_KM", DEFAULT_HELP_TEXT_TIME + 3000)
ELSE
PRINT_HELP("AR1_RAGEDEACT", DEFAULT_HELP_TEXT_TIME + 3000)
ENDIF
bHasTextLabelTriggered[AR1_RAGEDEACT] = TRUE
iRageHelpTimer = GET_GAME_TIMER()
ENDIF
ENDIF
IF NOT sRageData.bHasRaged
IF IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
CLEAR_ALL_RAGE_HELP()
sRageData.bHasRaged = TRUE
ENDIF
ENDIF
ENDIF
//Once the first god text has printed we're ready to print all other help and dialogue.
IF bHasTextLabelTriggered[AR1_CHASE]
//Hint cam help (formerly action cam help, that cam has been removed).
IF NOT bHasTextLabelTriggered[AR1_CAMHELP]
IF iHintCamHelpTimer = 0
iHintCamHelpTimer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - iHintCamHelpTimer > 5000
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
AND SAFE_TO_PRINT_CHASE_HINT_CAM_HELP()
AND NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
//IF fDistBetweenCars < 2500.0 //50m
//PRINT_HELP("AR1_CAMHELP")
bHasTextLabelTriggered[AR1_CAMHELP] = TRUE
iHintCamHelpTimer = GET_GAME_TIMER()
//bFloatingHelpPrintedThisFrame = TRUE
//ENDIF
ENDIF
ENDIF
ELIF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_CAMHELP")
IF GET_GAME_TIMER() - iHintCamHelpTimer > 6000
CLEAR_HELP(FALSE)
iHintCamHelpTimer = GET_GAME_TIMER()
ENDIF
ENDIF
//Help text
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
//BOOL bFloatingHelpPrintedThisFrame = FALSE
//Handbrake turn help
IF fCurrentPlaybackTime > 60000.0
AND NOT bHasTextLabelTriggered[AR1_BRAKE]
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1210.675781,-578.628662,25.423279>>, <<-1272.774536,-627.656921,37.727161>>, 25.000000)
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
PRINT_HELP("AR1_BRAKE", DEFAULT_HELP_TEXT_TIME + 3000)
bHasTextLabelTriggered[AR1_BRAKE] = TRUE
//bFloatingHelpPrintedThisFrame = TRUE
ENDIF
//Headlight help: triggers when player reaches tunnels near end.
IF fCurrentPlaybackTime > 100000.0
INT iLightsOn, iFullBeam
GET_VEHICLE_LIGHTS_STATE(sMainCars[iPlayersCar].veh, iLightsOn, iFullBeam)
IF NOT bHasTextLabelTriggered[AR1_HEADHELP]
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-349.818268,-716.851257,37.136703>>, <<-351.937622,-819.926147,29.768631>>, 16.500000)
//IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-230.399643,-625.088013,32.474281>>, <<-119.145233,-665.343506,38.499069>>, 15.250000)
//OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-84.001968,-670.068848,34.660595>>, <<-89.270409,-684.364075,38.400967>>, 15.250000)
//OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<31.517536,-666.219299,30.780993>>, <<19.212603,-661.313110,35.018368>>, 15.250000)
IF iLightsOn = 0
PRINT_HELP("AR1_HEADHELP", DEFAULT_HELP_TEXT_TIME + 3000)
bHasTextLabelTriggered[AR1_HEADHELP] = TRUE
//bFloatingHelpPrintedThisFrame = TRUE
ELSE
bHasTextLabelTriggered[AR1_HEADHELP] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//Vehicle air help: triggers on the bumpy road.
IF fCurrentPlaybackTime > 70000.0
IF NOT bHasTextLabelTriggered[AR1_JUMPHELP]
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1134.825024,-900.860559,30.001677>>, <<-1002.170532,-1127.489868,-2.783524>>, 27.500000)
PRINT_HELP("AR1_JUMPHELP", DEFAULT_HELP_TEXT_TIME + 3000)
bHasTextLabelTriggered[AR1_JUMPHELP] = TRUE
//bFloatingHelpPrintedThisFrame = TRUE
ENDIF
ENDIF
ENDIF
//1796889 - Vehicle cam view help: Triggers after the bumpy road stretch.
IF fCurrentPlaybackTime > 100500.0 AND fCurrentPlaybackTime < 106500.0
IF NOT bHasTextLabelTriggered[AR1_VEHCAMH]
PRINT_HELP("AR1_VEHCAMH", DEFAULT_HELP_TEXT_TIME + 3000)
bHasTextLabelTriggered[AR1_VEHCAMH] = TRUE
ENDIF
ENDIF
//Vehicle air stat help: triggers when approaching the final jump by the bank.
IF fCurrentPlaybackTime > 125000.0
IF NOT bHasTextLabelTriggered[AR1_JUMPHELP2]
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-150.192795,-653.960266,38.701393>>, <<-69.535858,-683.460449,31.171165>>, 16.500000)
PRINT_HELP("AR1_JUMPHELP2", DEFAULT_HELP_TEXT_TIME + 3000)
bHasTextLabelTriggered[AR1_JUMPHELP2] = TRUE
//bFloatingHelpPrintedThisFrame = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//1796889 - Vehicle cam view help: clear once the player presses the change view button.
IF bHasTextLabelTriggered[AR1_VEHCAMH]
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_VEHCAMH")
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
CLEAR_HELP()
ENDIF
ENDIF
ENDIF
//B*547550 - Disable the phone while the headlights help is displayed.
//IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_HEADHELP")
// DISABLE_CELLPHONE_THIS_FRAME_ONLY()
//ENDIF
//Have Lamar beep his horn if he ploughs through Franklin while he's in front.
IF GET_GAME_TIMER() - iInFrontHornTimer > 10000
IF GET_GAME_TIMER() - iTimeWhenFranklinGotInFront > 0
IF IS_ENTITY_IN_ANGLED_AREA(sMainCars[iPlayersCar].veh,
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sMainCars[iBuddiesCar].veh, <<0.0, 1.0, -2.0>>),
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sMainCars[iBuddiesCar].veh, <<0.0, 8.0, 2.0>>), 4.0)
START_VEHICLE_HORN(sMainCars[iBuddiesCar].veh, 1500)
iInFrontHornTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
//Dialogue: triggers when the player gets close to Lamar (or crashes into him)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
//Dialogue if Franklin crashes into Lamar
IF iCrashTimer = 0 OR GET_GAME_TIMER() - iCrashTimer > 20000
AND fCurrentPlaybackTime < 144600.0
IF IS_ENTITY_TOUCHING_ENTITY(sMainCars[0].veh, sMainCars[1].veh)
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_CRASH", CONV_PRIORITY_MEDIUM)
TEXT_LABEL_23 strSpecificLine = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL()
TEXT_LABEL_23 strSpecificAnim
IF ARE_STRINGS_EQUAL(strSpecificLine, "ARM1_CRASH_01")
strSpecificAnim = "thatscominoutourchecks"
ELIF ARE_STRINGS_EQUAL(strSpecificLine, "ARM1_CRASH_02")
strSpecificAnim = "stoprubbinup"
ELIF ARE_STRINGS_EQUAL(strSpecificLine, "ARM1_CRASH_03")
strSpecificAnim = "imabouttotake"
ELIF ARE_STRINGS_EQUAL(strSpecificLine, "ARM1_CRASH_04")
strSpecificAnim = "imgonnatell"
ELIF ARE_STRINGS_EQUAL(strSpecificLine, "ARM1_CRASH_05")
strSpecificAnim = "ayyofrank"
ELSE
strSpecificAnim = "stoprubbinup"
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN("Armenian1.sc - playing crash anim: ", strSpecificAnim)
#ENDIF
IF HAS_ANIM_DICT_LOADED(strLamarCarAnimsCrash)
TASK_PLAY_ANIM(sLamar.ped, strLamarCarAnimsCrash, strSpecificAnim, NORMAL_BLEND_IN,
NORMAL_BLEND_OUT, -1, AF_SECONDARY)
ENDIF
iCrashTimer = GET_GAME_TIMER()
//Cancel any responses if this dialogue cuts in.
bLamarJustTeasedFranklin = FALSE
bLamarJustInstructedFranklin = FALSE
ENDIF
ENDIF
ENDIF
//Dialogue for Lamar teasing Franklin
IF GET_GAME_TIMER() - iCloseTimer > 16000
AND NOT bLamarJustInstructedFranklin
IF NOT bLamarJustTeasedFranklin
//Don't play at the start, end or during the film studio, as there's a lot of other dialogue that needs to play.
IF fCurrentPlaybackTime > 20000.0
AND fCurrentPlaybackTime < 144600.0
AND (fCurrentPlaybackTime < 55000.0 OR fCurrentPlaybackTime > 60500.0)
IF fDistBetweenCars < 400.0 //20m
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_TEASE", CONV_PRIORITY_MEDIUM)
TEXT_LABEL_23 strSpecificLine = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL()
TEXT_LABEL_23 strSpecificAnim
IF ARE_STRINGS_EQUAL(strSpecificLine, "ARM1_TEASE_01")
strSpecificAnim = "hahahakeepup"
ELIF ARE_STRINGS_EQUAL(strSpecificLine, "ARM1_TEASE_02")
strSpecificAnim = "manthisismeanttobe"
ELIF ARE_STRINGS_EQUAL(strSpecificLine, "ARM1_TEASE_03")
strSpecificAnim = "rememberthis"
ELIF ARE_STRINGS_EQUAL(strSpecificLine, "ARM1_TEASE_04")
strSpecificAnim = "cmonfrank"
ELIF ARE_STRINGS_EQUAL(strSpecificLine, "ARM1_TEASE_05")
strSpecificAnim = "youaintfuckin"
ELIF ARE_STRINGS_EQUAL(strSpecificLine, "ARM1_TEASE_06")
strSpecificAnim = "skoolinyoass"
ELIF ARE_STRINGS_EQUAL(strSpecificLine, "ARM1_TEASE_07")
strSpecificAnim = "keeppoping"
ELSE
strSpecificAnim = "cmonmynigga"
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN("Armenian1.sc - playing taunt anim: ", strSpecificAnim)
#ENDIF
IF HAS_ANIM_DICT_LOADED(strLamarCarAnimsTaunt)
TASK_PLAY_ANIM(sLamar.ped, strLamarCarAnimsTaunt, strSpecificAnim, NORMAL_BLEND_IN,
NORMAL_BLEND_OUT, -1, AF_SECONDARY)
ENDIF
bLamarJustTeasedFranklin = TRUE
ENDIF
ENDIF
ENDIF
ELSE
//Play a response from Franklin
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_RESP", CONV_PRIORITY_MEDIUM)
iCloseTimer = GET_GAME_TIMER()
bLamarJustTeasedFranklin = FALSE
ENDIF
ENDIF
ENDIF
//On some turns Lamar indicates where he's going to go
IF NOT bLamarJustInstructedFranklin
IF NOT bLamarJustTeasedFranklin
//Play the first line in all cases: if this line comes first it needs to be preceded by a ringtone sound.
IF NOT bHasTextLabelTriggered[ARM1_RINGINDIC]
IF fCurrentPlaybackTime > 8000.0 AND fCurrentPlaybackTime < 15000.0
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_RING", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_RINGINDIC] = TRUE
bDialToneTriggered = TRUE
ENDIF
ENDIF
ELSE
IF NOT bHasTextLabelTriggered[ARM1_INDIC]
//If the ringtone occurred then play the first line.
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_INDIC", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_INDIC] = TRUE
bLamarJustInstructedFranklin = TRUE
ENDIF
ENDIF
ENDIF
IF fDistBetweenCars < 2500.0 //50m
IF fCurrentPlaybackTime > 42000.0 AND fCurrentPlaybackTime < 43000.0
bLamarJustInstructedFranklin = CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_RIGHT", CONV_PRIORITY_MEDIUM)
ENDIF
IF fCurrentPlaybackTime > 48000.0 AND fCurrentPlaybackTime < 49000.0
bLamarJustInstructedFranklin = CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_RIGHT", CONV_PRIORITY_MEDIUM)
ENDIF
IF fCurrentPlaybackTime > 49000.0 AND fCurrentPlaybackTime < 52000.0
IF NOT bHasTextLabelTriggered[ARM1_STDIO]
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_STDIO", CONV_PRIORITY_MEDIUM)
bLamarJustInstructedFranklin = FALSE
bLamarJustTeasedFranklin = FALSE
bHasTextLabelTriggered[ARM1_STDIO] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_STDIO2", CONV_PRIORITY_MEDIUM)
bLamarJustInstructedFranklin = FALSE
bLamarJustTeasedFranklin = FALSE
bHasTextLabelTriggered[ARM1_STDIO] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF fCurrentPlaybackTime > 61000.0 AND fCurrentPlaybackTime < 62000.0
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
bLamarJustInstructedFranklin = CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_ALLEY", CONV_PRIORITY_MEDIUM)
ELSE
bLamarJustInstructedFranklin = CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_ALLEY2", CONV_PRIORITY_MEDIUM)
ENDIF
ENDIF
IF fCurrentPlaybackTime > 78000.0 AND fCurrentPlaybackTime < 79000.0
bLamarJustInstructedFranklin = CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_LEFT", CONV_PRIORITY_MEDIUM)
ENDIF
IF fCurrentPlaybackTime > 95500.0 AND fCurrentPlaybackTime < 96500.0
bLamarJustInstructedFranklin = CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_LEFT", CONV_PRIORITY_MEDIUM)
ENDIF
IF fCurrentPlaybackTime > 119300.0 AND fCurrentPlaybackTime < 120300.0
bLamarJustInstructedFranklin = CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_RIGHT", CONV_PRIORITY_MEDIUM)
ENDIF
IF fCurrentPlaybackTime > 123500.0 AND fCurrentPlaybackTime < 124500.0
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
bLamarJustInstructedFranklin = CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_PARK", CONV_PRIORITY_MEDIUM)
ELSE
bLamarJustInstructedFranklin = CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_PARK3", CONV_PRIORITY_MEDIUM)
ENDIF
ENDIF
/*IF fCurrentPlaybackTime > 124500.0 AND fCurrentPlaybackTime < 127500.0
IF NOT bHasTextLabelTriggered[ARM1_PARK2]
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_PARK2", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_PARK2] = TRUE
ENDIF
ENDIF
ENDIF*/
ENDIF
ENDIF
ELSE
//Play a response from Franklin
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_OKAY", CONV_PRIORITY_MEDIUM)
bLamarJustInstructedFranklin = FALSE
bLamarJustTeasedFranklin = FALSE
ENDIF
ENDIF
//Don't play any of the dialogue below if we're waiting for a response from Franklin to being instructed/insulted.
IF NOT bLamarJustTeasedFranklin AND NOT bLamarJustInstructedFranklin
//Bank dialogue
IF fCurrentPlaybackTime > 141500.0 AND fCurrentPlaybackTime < 142500.0
IF NOT bHasTextLabelTriggered[ARM1_BANK]
IF fDistBetweenCars < 2500.0
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_BANK", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_BANK] = TRUE
bLamarJustInstructedFranklin = FALSE
bLamarJustTeasedFranklin = FALSE
ENDIF
ELSE
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_BANK2", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_BANK] = TRUE
bLamarJustInstructedFranklin = FALSE
bLamarJustTeasedFranklin = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//NOTE: this dialogue was never recorded so remove.
//Dialogue when Franklin passes the cyclists.
/*IF IS_VEHICLE_DRIVEABLE(SetPieceCarID[21])
IF NOT bHasTextLabelTriggered[ARM1_CYCL]
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetPieceCarID[21])
AND VDIST2(vPlayerPos, GET_ENTITY_COORDS(SetPieceCarID[21])) < 225.0
AND fDistBetweenCars < 1600.0
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_CYCL", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_CYCL] = TRUE
bLamarJustInstructedFranklin = FALSE
bLamarJustTeasedFranklin = FALSE
IF HAS_ANIM_DICT_LOADED(strFranklinCarAnimsTaunt)
AND NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), strFranklinCarAnimsTaunt, "slowassshit")
IF GET_CONVERTIBLE_ROOF_STATE(sMainCars[iPlayersCar].veh) = CRS_LOWERED
AND IS_ENTITY_UPRIGHT(sMainCars[iPlayersCar].veh)
TASK_PLAY_ANIM(PLAYER_PED_ID(), strFranklinCarAnimsTaunt, "slowassshit",
NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_SECONDARY)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF*/
//Dialogue when Franklin passes the aliens.
IF fCurrentPlaybackTime > 50000.0
IF NOT bHasTextLabelTriggered[ARM1_ALIEN]
IF bHasTextLabelTriggered[ARM1_EXTRAS2]
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1055.956543,-480.538177,42.981922>>, <<-1169.247681,-545.516846,27.537090>>, 24.000000)
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_ALIEN", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_ALIEN] = TRUE
bLamarJustInstructedFranklin = FALSE
bLamarJustTeasedFranklin = FALSE
ENDIF
ELSE
//Player already left the area, so don't play the line.
bHasTextLabelTriggered[ARM1_ALIEN] = TRUE
bLamarJustInstructedFranklin = FALSE
bLamarJustTeasedFranklin = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
//Dialogue when Lamar goes over the first jump.
IF fCurrentPlaybackTime > 87150.0 AND fCurrentPlaybackTime < 88150.0
IF NOT bHasTextLabelTriggered[ARM1_HILL]
IF fDistBetweenCars < 2500.0
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_HILL", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_HILL] = TRUE
bLamarJustInstructedFranklin = FALSE
bLamarJustTeasedFranklin = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
//Dialogue if Franklin falls too far behind: one as an insult and one if Franklin is getting close to failing.
IF fCurrentPlaybackTime > 20000.0
AND fDistBetweenCars > 6400.0
IF NOT bBuddyFinished
IF NOT bHasTextLabelTriggered[ARM1_WRONG]
IF GET_GAME_TIMER() - iLostDialogueTimer > 10000
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_WRONG", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_WRONG] = TRUE
bLamarJustInstructedFranklin = FALSE
bLamarJustTeasedFranklin = FALSE
iNumTimesPlayedLostDialogue++
iLostDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
//Do a warning after 100m.
IF NOT bHasTextLabelTriggered[ARM1_WARN1]
IF GET_GAME_TIMER() - iWarnDialogueTimer > 10000
AND GET_GAME_TIMER() - iLostDialogueTimer > 4000
IF fDistBetweenCars > 10000.0
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_WARN", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_WARN1] = TRUE
bLamarJustInstructedFranklin = FALSE
bLamarJustTeasedFranklin = FALSE
iNumTimesPlayedFailWarnDialogue++
iWarnDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
//Do another warning if getting close to failing.
IF NOT bHasTextLabelTriggered[ARM1_WARN2]
IF GET_GAME_TIMER() - iWarnDialogueTimer2 > 10000
AND GET_GAME_TIMER() - iWarnDialogueTimer > 4000
IF fDistBetweenCars > 22500.0
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_WARN", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_WARN2] = TRUE
bLamarJustInstructedFranklin = FALSE
bLamarJustTeasedFranklin = FALSE
iNumTimesPlayedFailWarnDialogue++
iWarnDialogueTimer2 = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
//Once the player gets close enough again flag the dialogue so it can be triggered later.
IF iNumTimesPlayedLostDialogue < 4
bHasTextLabelTriggered[ARM1_WRONG] = TRUE
ENDIF
IF iNumTimesPlayedFailWarnDialogue < 5
bHasTextLabelTriggered[ARM1_WARN1] = TRUE
bHasTextLabelTriggered[ARM1_WARN2] = TRUE
ENDIF
ENDIF
//Dialogue if Franklin gets ahead
IF fCurrentPlaybackTime > 25000.0 AND fCurrentPlaybackTime < 144600.0
AND GET_GAME_TIMER() - iInFrontChatTimer > 15000
AND GET_GAME_TIMER() - iTimeWhenFranklinGotInFront > 0
//If Franklin just snuck in front, play some shouts.
IF GET_GAME_TIMER() - iTimeWhenFranklinGotInFront < 1000
AND fDistBetweenCars < 400.0
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_FRONT4", CONV_PRIORITY_MEDIUM)
bLamarJustInstructedFranklin = FALSE
bLamarJustTeasedFranklin = FALSE
iInFrontChatTimer = GET_GAME_TIMER()
ENDIF
ENDIF
//If Franklin is a long distance in front then play a confused lamar line.
IF GET_GAME_TIMER() - iTimeWhenFranklinGotInFront > 2000
AND fDistBetweenCars < 3600.0
AND fDistBetweenCars > 400.0
IF NOT bHasTextLabelTriggered[ARM1_FRONT1]
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_FRONT1", CONV_PRIORITY_MEDIUM)
bLamarJustInstructedFranklin = FALSE
bLamarJustTeasedFranklin = FALSE
bHasTextLabelTriggered[ARM1_FRONT1] = TRUE
iInFrontChatTimer = GET_GAME_TIMER()
ENDIF
ELIF NOT bHasTextLabelTriggered[ARM1_FRONT2]
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_FRONT2", CONV_PRIORITY_MEDIUM)
bLamarJustInstructedFranklin = FALSE
bLamarJustTeasedFranklin = FALSE
bHasTextLabelTriggered[ARM1_FRONT2] = TRUE
iInFrontChatTimer = GET_GAME_TIMER()
ENDIF
ELIF NOT bHasTextLabelTriggered[ARM1_FRONT3]
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_FRONT3", CONV_PRIORITY_MEDIUM)
bLamarJustInstructedFranklin = FALSE
bLamarJustTeasedFranklin = FALSE
bHasTextLabelTriggered[ARM1_FRONT3] = TRUE
iInFrontChatTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
//Random chat for any quiet sections.
IF GET_GAME_TIMER() - iRaceChatTimer > 10000
IF fDistBetweenCars < 2500.0
//Street race line
/*IF fCurrentPlaybackTime > 69000.0 AND fCurrentPlaybackTime < 76000.0
IF NOT bHasTextLabelTriggered[ARM1_STREET]
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_STREET", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_STREET] = TRUE
iRaceChatTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF*/
IF fCurrentPlaybackTime > 17000.0 AND fCurrentPlaybackTime < 25000.0
OR fCurrentPlaybackTime > 32000.0 AND fCurrentPlaybackTime < 39500.0
OR fCurrentPlaybackTime > 102000.0 AND fCurrentPlaybackTime < 108000.0
INT iRandomBlock = GET_RANDOM_INT_IN_RANGE(0, 6)
STRING strLabel
TRIGGERED_TEXT_LABEL eLabel
IF iRandomBlock = 0
strLabel = "ARM1_CHAT1"
eLabel = ARM1_CHAT1
ELIF iRandomBlock = 1
strLabel = "ARM1_CHAT2"
eLabel = ARM1_CHAT2
ELIF iRandomBlock = 2
strLabel = "ARM1_CHAT3"
eLabel = ARM1_CHAT3
ELIF iRandomBlock = 3
strLabel = "ARM1_CHAT4"
eLabel = ARM1_CHAT4
ELIF iRandomBlock = 4
strLabel = "ARM1_CHAT6"
eLabel = ARM1_CHAT6
ELSE
strLabel = "ARM1_CHAT7"
eLabel = ARM1_CHAT7
ENDIF
//Need to guarantee that the tow truck line is played, also if it's the first line to be played it needs to be preceded by a ringtone.
IF NOT bHasTextLabelTriggered[ARM1_TOW]
AND NOT bHasTextLabelTriggered[ARM1_TOW2]
IF NOT bHasTextLabelTriggered[ARM1_RINGTOW]
IF NOT bHasTextLabelTriggered[ARM1_RINGINDIC]
strLabel = "ARM1_RING"
eLabel = ARM1_RING
ELSE
//The ring tone was already played in an earlier line, so just progress straight to the towing line.
bHasTextLabelTriggered[ARM1_RINGTOW] = TRUE
ENDIF
ENDIF
IF bHasTextLabelTriggered[ARM1_RINGTOW]
IF GET_FAILS_COUNT_WITHOUT_PROGRESS_FOR_THIS_MISSION_SCRIPT() = 0
strLabel = "ARM1_TOW2"
eLabel = ARM1_TOW2
ELSE
strLabel = "ARM1_TOW2"
eLabel = ARM1_TOW2
ENDIF
ENDIF
ENDIF
IF NOT bHasTextLabelTriggered[eLabel]
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", strLabel, CONV_PRIORITY_MEDIUM)
IF ARE_STRINGS_EQUAL(strLabel, "ARM1_RING")
bHasTextLabelTriggered[ARM1_RINGTOW] = TRUE
bDialToneTriggered = TRUE
ELSE
bLamarJustInstructedFranklin = FALSE
bLamarJustTeasedFranklin = FALSE
bHasTextLabelTriggered[eLabel] = TRUE
iRaceChatTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Peds say random dialogue if you drive near them: the ped's car must be moving, close by, and not going in the same direction as the player.
//Also trigger the dialogue if the player crashes into them.
IF fCurrentPlaybackTime > 10000.0
//There are a few set-pieces that need to have dialogue played every time
CONST_INT SETPIECE_ID_1 0
CONST_INT SETPIECE_ID_2 1
CONST_INT SETPIECE_ID_3 6
CONST_INT TRAFFIC_ID_1 114
BOOL bForceDialogue = FALSE
IF vehClosest = SetPieceCarID[SETPIECE_ID_1]
OR vehClosest = SetPieceCarID[SETPIECE_ID_2]
OR vehClosest = SetPieceCarID[SETPIECE_ID_3]
OR vehClosest = TrafficCarID[TRAFFIC_ID_1]
bForceDialogue = TRUE
ENDIF
IF GET_GAME_TIMER() - iAmbientDialogueTimer > 3000
OR (bForceDialogue AND GET_GAME_TIMER() - iAmbientDialogueTimer > 1000)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ENTITY_DEAD(vehClosest) AND vehClosest != sMainCars[iBuddiesCar].veh
BOOL bCrashed = FALSE
BOOL bNearMiss = FALSE
IF bForceDialogue
bNearMiss = TRUE
ELIF IS_ENTITY_TOUCHING_ENTITY(vehClosest, sMainCars[iPlayersCar].veh)
bCrashed = TRUE
ELIF ABSF(GET_ENTITY_SPEED(vehClosest)) > 2.0
IF ABSF(GET_ENTITY_HEADING(vehClosest) - GET_ENTITY_HEADING(sMainCars[iPlayersCar].veh)) > 60.0
bNearMiss = TRUE
ENDIF
ENDIF
IF bCrashed OR bNearMiss
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
iAmbientDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Chase end checks
IF NOT bBuddyFinished
//First god text
IF NOT DOES_BLIP_EXIST(sMainCars[iBuddiesCar].blip)
REMOVE_ALL_BLIPS()
sMainCars[iBuddiesCar].blip = CREATE_BLIP_FOR_ENTITY(sMainCars[iBuddiesCar].veh, FALSE)
ENDIF
UPDATE_CHASE_BLIP(sMainCars[iBuddiesCar].blip, sMainCars[iBuddiesCar].veh, SQRT(fCurrentFailDistance), 0.8)
//Play the car owner line as soon as the player activates him.
IF NOT bHasTextLabelTriggered[ARM1_BABY]
IF NOT IS_PED_INJURED(pedCarOwner)
IF bCarOwnerActive
ADD_PED_FOR_DIALOGUE(sConversationPeds, 7, pedCarOwner, "BABYDICK")
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedCarOwner, "ARM1_CUAA", "BABYDICK", SPEECH_PARAMS_FORCE_NORMAL)
bHasTextLabelTriggered[ARM1_BABY] = TRUE
ENDIF
ELSE
bHasTextLabelTriggered[ARM1_BABY] = TRUE
ENDIF
ENDIF
IF NOT bHasTextLabelTriggered[AR1_CHASE]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_NOW("AR1_CHASE", 6000, 0)
bHasTextLabelTriggered[AR1_CHASE] = TRUE
ENDIF
ENDIF
//Total chase time = 157500.0 (new one is 155700.0)
IF (fCurrentPlaybackTime > GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iCarrecMain, strCarrec) - 6000.0 AND fDistBetweenCars < 400.0)
OR (fCurrentPlaybackTime > 135000.0 AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<13.991759,-675.822205,31.484550>>, <<20.466270,-688.156616,34.484550>>, 4.000000))
bCloseFinish = TRUE
bPlayFirstPartOfCopsCutscene = TRUE
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ELSE
vNextToBuddy = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sMainCars[iBuddiesCar].veh, <<-6.0, 0.0, 0.0>>)
//Tell player to park next to their buddy
IF NOT DOES_BLIP_EXIST(blipCurrentDestination)
REMOVE_ALL_BLIPS()
blipCurrentDestination = CREATE_BLIP_FOR_COORD(vNextToBuddy, FALSE)
ENDIF
//Use a second fake blip to get the GPS to go the right way (we don't want it to go around the back of the bank).
IF NOT DOES_BLIP_EXIST(blipFakeGPS)
blipFakeGPS = CREATE_BLIP_FOR_COORD(<<-88.1825, -675.9736, 34.2665>>, TRUE)
SET_BLIP_ALPHA(blipFakeGPS, 0)
ENDIF
IF NOT bHasTextLabelTriggered[AR1_PARK]
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_NOW("AR1_PARK", DEFAULT_GOD_TEXT_TIME, 0)
bHasTextLabelTriggered[AR1_PARK] = TRUE
ENDIF
//If the player parks next to Lamar trigger a version of the next cutscene where the first part is skipped.
IF VDIST2(GET_ENTITY_COORDS(sMainCars[iPlayersCar].veh), vNextToBuddy) < 25.0
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
bCloseFinish = FALSE
bPlayFirstPartOfCopsCutscene = FALSE
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
//If the player passes through the correct route we can still trigger the normal version of the cutscene, but with Lamar already parked.
IF IS_ENTITY_IN_ANGLED_AREA(sMainCars[iPlayersCar].veh, <<25.320662,-664.571045,30.627426>>, <<13.766054,-690.208740,36.027962>>, 12.750000)
bCloseFinish = FALSE
bPlayFirstPartOfCopsCutscene = TRUE
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDIF
//Request cutscene assets in advance: recordings take a longer time than models.
IF fCurrentPlaybackTime > GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iCarrecMain, strCarrec) - 55000.0
REQUEST_VEHICLE_RECORDING(iCarrecBuddyEscape, strCarrec)
REQUEST_VEHICLE_RECORDING(iCarrecBuddyArrive, strCarrec)
REQUEST_VEHICLE_RECORDING(iCarrecPlayerArrive, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_COP_ESCAPE, strCarrec)
IF fCurrentPlaybackTime > GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iCarrecMain, strCarrec) - 20000.0
REQUEST_MODEL(POLICE3)
REQUEST_MODEL(S_M_Y_COP_01)
SETUP_REQ_BANK_GATES(TRUE)
REQUEST_ANIM_DICT("map_objects")
REQUEST_ANIM_DICT(strChaseEndAnims)
ENDIF
ENDIF
ELSE //Player not in main car.
//Blip the vehicle and tell the player to get back in.
IF NOT DOES_BLIP_EXIST(sMainCars[iPlayersCar].blip)
REMOVE_ALL_BLIPS()
sMainCars[iPlayersCar].blip = CREATE_BLIP_FOR_VEHICLE(sMainCars[iPlayersCar].veh)
ENDIF
IF IS_THIS_PRINT_BEING_DISPLAYED("AR1_PARK")
CLEAR_PRINTS()
ENDIF
IF NOT bHasTextLabelTriggered[CMN_GENGETBCK]
PRINT_NOW("CMN_GENGETBCK", DEFAULT_GOD_TEXT_TIME, 0)
bHasTextLabelTriggered[CMN_GENGETBCK] = TRUE
ENDIF
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_CAMHELP")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_HEADHELP")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_HINTHELP")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_BRAKE")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_VEHCAMH")
CLEAR_HELP()
ENDIF
CLEAR_ALL_RAGE_HELP()
bLamarJustInstructedFranklin = FALSE
bLamarJustTeasedFranklin = FALSE
//Fail if the player gets too far away from the car
IF VDIST2(vPlayerPos, GET_ENTITY_COORDS(sMainCars[iPlayersCar].veh)) > 40000.0
MISSION_FAILED(FAILED_ABANDONED_CAR)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sLamar.ped)
//Fail if the player loses Lamar during the chase
IF fDistBetweenCars > fCurrentFailDistance
MISSION_FAILED(FAILED_LOST_BUDDY)
ENDIF
//1483960 - Kill Lamar if the player sets him on fire.
IF IS_ENTITY_ON_FIRE(sLamar.ped)
IF GET_GAME_TIMER() - iLamarFireTimer > 1000
SET_ENTITY_HEALTH(sLamar.ped, 0)
ENDIF
ELSE
iLamarFireTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
//Fail if the player damages Lamar's car further at this stage.
IF NOT IS_ENTITY_DEAD(sMainCars[iBuddiesCar].veh)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sMainCars[iBuddiesCar].veh)
IF TIMERA() > 10000
//Freeze buddy's car to stop player knocking it
FREEZE_ENTITY_POSITION(sMainCars[iBuddiesCar].veh, TRUE)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sMainCars[iBuddiesCar].veh, PLAYER_PED_ID())
INT iNumPartsDamaged = GET_VEHICLE_NUM_OF_BROKEN_OFF_PARTS(sMainCars[iBuddiesCar].veh) + GET_VEHICLE_NUM_OF_BROKEN_LOOSEN_PARTS(sMainCars[iBuddiesCar].veh)
IF GET_VEHICLE_PETROL_TANK_HEALTH(sMainCars[iBuddiesCar].veh) < 200.0
OR GET_VEHICLE_ENGINE_HEALTH(sMainCars[iBuddiesCar].veh) < 200.0
OR iNumPartsDamaged > 2
MISSION_FAILED(FAILED_LAMARS_CAR_DAMAGED)
ENDIF
IF GET_GAME_TIMER() - iLamarDamageDialogueTimer > 0
PLAY_PED_AMBIENT_SPEECH(sLamar.ped, "GENERIC_INSULT_HIGH", SPEECH_PARAMS_FORCE)
TASK_LOOK_AT_ENTITY(sLamar.ped, PLAYER_PED_ID(), 1000, SLF_WHILE_NOT_IN_FOV)
iLamarDamageDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 7000)
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sMainCars[iBuddiesCar].veh)
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_ON_FIRE(sMainCars[iBuddiesCar].veh)
MISSION_FAILED(FAILED_LAMARS_CAR_DAMAGED)
ENDIF
ENDIF
IF eMissionStage = STAGE_CHASE
CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, sMainCars[iBuddiesCar].veh, "AR1_CAMHELP")
ELSE
CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, sMainCars[iBuddiesCar].veh, "AR1_CAMHELP", DEFAULT, DEFAULT, FALSE)
ENDIF
IF IS_GAMEPLAY_HINT_ACTIVE()
AND NOT IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
IF GET_GAME_TIMER() - iChaseCamTimer > 5000
AND NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
IF NOT bHasTextLabelTriggered[AR1_CAMHELP2]
PRINT_HELP("AR1_CAMHELP2")
bHasTextLabelTriggered[AR1_CAMHELP2] = TRUE
ENDIF
ENDIF
ELSE
IF NOT IS_GAMEPLAY_HINT_ACTIVE()
AND IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_CAMHELP2")
CLEAR_HELP()
ENDIF
iChaseCamTimer = GET_GAME_TIMER()
ENDIF
//Audio Scene: Lamar calls Franklin (don't do this if we skipped to the middle of the chase).
IF eMissionStage = STAGE_CHASE
SWITCH iAudioSceneEventDialPhone
CASE 0 //Start when the dial tone is activated.
IF bDialToneTriggered
IF IS_AUDIO_SCENE_ACTIVE("ARM_1_DRIVE_START")
STOP_AUDIO_SCENE("ARM_1_DRIVE_START")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("ARM_1_DRIVE_PHONE_LAMAR")
START_AUDIO_SCENE("ARM_1_DRIVE_PHONE_LAMAR")
ENDIF
iAudioSceneEventDialPhone++
ENDIF
BREAK
CASE 1 //Stop after the relevant block of dialogue finished.
BOOL bProgressAudioScene
TEXT_LABEL_23 strCurrentLabel
strCurrentLabel = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF bHasTextLabelTriggered[ARM1_RINGINDIC]
//Dial tone occurred on the "right up here" line.
IF bHasTextLabelTriggered[ARM1_INDIC]
IF NOT ARE_STRINGS_EQUAL("ARM1_INDIC", strCurrentLabel)
bProgressAudioScene = TRUE
ENDIF
ENDIF
ELSE
//Dial tone occurred on the "tow truck" line.
IF bHasTextLabelTriggered[ARM1_TOW]
OR bHasTextLabelTriggered[ARM1_TOW2]
IF NOT ARE_STRINGS_EQUAL("ARM1_TOW", strCurrentLabel)
AND NOT ARE_STRINGS_EQUAL("ARM1_TOW2", strCurrentLabel)
bProgressAudioScene = TRUE
ENDIF
ENDIF
ENDIF
IF bProgressAudioScene
IF IS_AUDIO_SCENE_ACTIVE("ARM_1_DRIVE_PHONE_LAMAR")
STOP_AUDIO_SCENE("ARM_1_DRIVE_PHONE_LAMAR")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("ARM_1_DRIVE_FOLLOW_LAMAR")
START_AUDIO_SCENE("ARM_1_DRIVE_FOLLOW_LAMAR")
ENDIF
iAudioSceneEventDialPhone++
ENDIF
BREAK
ENDSWITCH
//Audio scene: Movie studio
SWITCH iAudioSceneEventMovieStudio
CASE 0 //Enter studio
IF fCurrentPlaybackTime > 51500.0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1048.170410,-473.170898,43.599838>>, <<-1062.491577,-486.313873,30.664543>>, 26.250000)
IF IS_AUDIO_SCENE_ACTIVE("ARM_1_DRIVE_FOLLOW_LAMAR")
STOP_AUDIO_SCENE("ARM_1_DRIVE_FOLLOW_LAMAR")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("ARM_1_DRIVE_THROUGH_STUDIO")
START_AUDIO_SCENE("ARM_1_DRIVE_THROUGH_STUDIO")
ENDIF
iAudioSceneEventMovieStudio++
ENDIF
ENDIF
BREAK
CASE 1 //Leave studio (either exit).
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1214.699463,-582.267456,34.075935>>, <<-1209.030273,-578.965210,21.306465>>, 26.250000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1048.202881,-472.566864,43.385071>>, <<-1046.013672,-466.920593,30.802151>>, 45.750000)
IF IS_AUDIO_SCENE_ACTIVE("ARM_1_DRIVE_THROUGH_STUDIO")
STOP_AUDIO_SCENE("ARM_1_DRIVE_THROUGH_STUDIO")
ENDIF
iAudioSceneEventMovieStudio++
ENDIF
BREAK
CASE 2 //Trigger next audio event after leaving.
IF NOT IS_AUDIO_SCENE_ACTIVE("ARM_1_DRIVE_TO_CANALS")
START_AUDIO_SCENE("ARM_1_DRIVE_TO_CANALS")
ENDIF
iAudioSceneEventMovieStudio++
BREAK
ENDSWITCH
ENDIF
//Audio scene: bumpy road.
SWITCH iAudioSceneEventBumps
CASE 0 //Arrive at the bumpy road, stop any other audio scenes first.
IF fCurrentPlaybackTime > 80000.0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1169.195557,-849.998596,21.094818>>, <<-961.985901,-1197.100952,-1.209268>>, 136.500000)
IF IS_AUDIO_SCENE_ACTIVE("ARM_1_DRIVE_TO_CANALS")
STOP_AUDIO_SCENE("ARM_1_DRIVE_TO_CANALS")
ENDIF
iAudioSceneEventBumps++
ENDIF
ENDIF
BREAK
CASE 1 //Start the bumps audio scene.
IF NOT IS_AUDIO_SCENE_ACTIVE("ARM_1_DRIVE_OVER_BRIDGES")
START_AUDIO_SCENE("ARM_1_DRIVE_OVER_BRIDGES")
ENDIF
iAudioSceneEventBumps++
BREAK
ENDSWITCH
//Audio scene: car park.
SWITCH iAudioSceneEventCarPark
CASE 0 //Arrive at the car park, stop any other audio scenes first.
IF fCurrentPlaybackTime > 120000.0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-313.167847,-834.345215,40.871441>>, <<-288.544739,-647.531250,27.050526>>, 115.500000)
IF IS_AUDIO_SCENE_ACTIVE("ARM_1_DRIVE_OVER_BRIDGES")
STOP_AUDIO_SCENE("ARM_1_DRIVE_OVER_BRIDGES")
ENDIF
iAudioSceneEventCarPark++
ENDIF
ENDIF
BREAK
CASE 1
IF NOT IS_AUDIO_SCENE_ACTIVE("ARM_1_DRIVE_THROUGH_GARAGE")
START_AUDIO_SCENE("ARM_1_DRIVE_THROUGH_GARAGE")
ENDIF
iAudioSceneEventCarPark++
BREAK
ENDSWITCH
//Audio scene: hint cam.
IF IS_GAMEPLAY_HINT_ACTIVE()
IF NOT IS_AUDIO_SCENE_ACTIVE("ARM_1_LAMAR_FOCUS_CAM")
START_AUDIO_SCENE("ARM_1_LAMAR_FOCUS_CAM")
ENDIF
ELSE
IF IS_AUDIO_SCENE_ACTIVE("ARM_1_LAMAR_FOCUS_CAM")
STOP_AUDIO_SCENE("ARM_1_LAMAR_FOCUS_CAM")
ENDIF
ENDIF
//Disable the rage mode during the chase by blocking one of the buttons.
IF NOT bAllowSpecialAbilityDuringChase
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY)
ENDIF
//Pin the car park interior to help streaming.
IF VDIST2(vPlayerPos, <<-202.4, -638.9, 33.7>>) < 22500.0
IF interiorCarPark = NULL
interiorCarPark = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-202.4, -638.9, 33.7>>, "dt1_02_carpark")
ELIF NOT IS_INTERIOR_READY(interiorCarPark)
PIN_INTERIOR_IN_MEMORY(interiorCarPark)
ENDIF
ELIF VDIST2(vPlayerPos, <<-202.4, -638.9, 33.7>>) > 40000.0
IF interiorCarPark != NULL
UNPIN_INTERIOR(interiorCarPark)
interiorCarPark = NULL
ENDIF
ENDIF
//Pre-stream the area where the chase ends.
IF fCurrentPlaybackTime > 100000.0
IF VDIST2(vPlayerPos, <<34.0, -638.5, 31.6>>) < 22500.0
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_START(<<46.6, -624.3, 32.1>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-1.1, 0.0, 137.4>>), 100.0)
ENDIF
ELIF VDIST2(vPlayerPos, <<34.0, -638.5, 31.6>>) > 40000.0
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
ENDIF
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
CLEAR_PRINTS()
CLEAR_HELP()
REMOVE_ALL_BLIPS()
DISABLE_VEHICLE_GEN_ON_MISSION(FALSE)
BLOCK_SCENARIOS_FOR_CHASE(FALSE)
DISABLE_TAXI_HAILING(FALSE)
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
//This cleanup should no longer be needed.
//#IF IS_DEBUG_BUILD SCRIPT_ASSERT("PRIVATE_StopChaseHintCam") #ENDIF
//PRIVATE_StopChaseHintCam()
//SET_CINEMATIC_BUTTON_ACTIVE(TRUE)
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
IF interiorCarPark != NULL
UNPIN_INTERIOR(interiorCarPark)
interiorCarPark = NULL
ENDIF
UPDATE_RAGE() //In case of j-skip, this should make sure the latest playback values are used
bFranklinsCarTrashed = FALSE
bLamarsCarTrashed = FALSE
//Check the final state of the cars
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
AND IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
SET_VEHICLE_ACT_AS_IF_HIGH_SPEED_FOR_FRAG_SMASHING(sMainCars[iBuddiesCar].veh, FALSE)
SET_VEHICLE_HAS_UNBREAKABLE_LIGHTS(sMainCars[iPlayersCar].veh, FALSE)
//PRINTLN(iPlayersHealthBeforeRace - GET_ENTITY_HEALTH(sMainCars[iPlayersCar].veh), " ", iLamarsHealthBeforeRace - GET_ENTITY_HEALTH(sMainCars[iBuddiesCar].veh))
IF bCarCollisionIsDisabled
SET_ENTITY_COLLISION(sMainCars[iBuddiesCar].veh, TRUE)
bCarCollisionIsDisabled = FALSE
ENDIF
IF iPlayersHealthBeforeRace - GET_ENTITY_HEALTH(sMainCars[iPlayersCar].veh) > 250
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ARM1_CAR_DAMAGED, TRUE)
bFranklinsCarTrashed = TRUE
ENDIF
IF iLamarsHealthBeforeRace - GET_ENTITY_HEALTH(sMainCars[iBuddiesCar].veh) > 250
bLamarsCarTrashed = TRUE
ENDIF
//Reset any changes to the player's top speed.
MODIFY_VEHICLE_TOP_SPEED(sMainCars[iPlayersCar].veh, 0.0)
ENDIF
STOP_CAM_PLAYBACK(vehCameraTest)
REMOVE_VEHICLE(vehCameraTest, TRUE)
IF iChasePedBlockingArea != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(iChasePedBlockingArea)
iChasePedBlockingArea = -1
ENDIF
IF iChasePedBlockingArea2 != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(iChasePedBlockingArea2)
iChasePedBlockingArea2 = -1
ENDIF
REMOVE_ANIM_DICT(strAlienAnims)
REMOVE_ANIM_DICT(strLamarCarAnimsCrash)
REMOVE_ANIM_DICT(strLamarCarAnimsTaunt)
REMOVE_ANIM_DICT(strFranklinCarAnimsTaunt)
SET_ALL_RANDOM_PEDS_FLEE(PLAYER_ID(), FALSE)
SET_AGGRESSIVE_HORNS(FALSE)
SETTIMERB(0)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
SET_PED_POPULATION_BUDGET(3)
SET_FORCED_OBJECTS_FOR_CHASE(FALSE)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_COPS_ARRIVE_CUTSCENE
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_COPS_ARRIVE_CUTSCENE, TRUE)
ENDIF
ENDPROC
PROC COPS_ARRIVE_CUTSCENE()
VECTOR vPlayerStartPos = <<39.0428, -638.7694, 30.6267>>
FLOAT fPlayerStartHeading = 335.0152
IF iBuddiesCar = NINEF_INDEX
vPlayerStartPos = <<39.3644, -638.0751, 30.6267>>
fPlayerStartHeading = 335.0097
ENDIF
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
IF bUsedACheckpoint
START_REPLAY_SETUP(vPlayerStartPos, fPlayerStartHeading, FALSE)
iCurrentEvent = 99
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), vPlayerStartPos)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(vPlayerStartPos)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ELSE
SETUP_REQ_CAR_CHOICES()
IF SETUP_LAMAR(vPlayerStartPos + <<0.0, 1.0, 3.0>>)
AND SETUP_NINEF(vPlayerStartPos)
AND SETUP_RAPIDGT(vPlayerStartPos + <<0.0, 3.0, 0.0>>)
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
SETUP_REQ_PUT_PLAYER_INTO_CHOSEN_CAR()
SETUP_REQ_LAMAR_INTO_CHOSEN_CAR()
SETUP_REQ_FORCE_ROOFS_DOWN_FOR_BOTH_CARS()
SETUP_REQ_ARRIVAL_RECORDING_CHOICES()
SETUP_REQ_ABILITY_BAR_NEARLY_FULL()
SETUP_REQ_REMOVE_BANK_SHUTTERS()
SPECIAL_ABILITY_RESET(PLAYER_ID())
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(sMainCars[iBuddiesCar].veh, "ARM_1_LAMARS_CAR")
ENDIF
bPlayFirstPartOfCopsCutscene = TRUE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_VEHICLE_RECORDING(iCarrecBuddyEscape, strCarrec)
REQUEST_VEHICLE_RECORDING(iCarrecBuddyArrive, strCarrec)
REQUEST_VEHICLE_RECORDING(iCarrecPlayerArrive, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_COP_ESCAPE, strCarrec)
REQUEST_MODEL(POLICE3)
REQUEST_MODEL(S_M_Y_COP_01)
REQUEST_ANIM_DICT("map_objects")
REQUEST_ANIM_DICT(strChaseEndAnims)
IF SETUP_REQ_BANK_GATES(TRUE)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrecBuddyEscape, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrecBuddyArrive, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrecPlayerArrive, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COP_ESCAPE, strCarrec)
AND HAS_MODEL_LOADED(POLICE3)
AND HAS_MODEL_LOADED(S_M_Y_COP_01)
AND HAS_ANIM_DICT_LOADED("map_objects")
AND HAS_ANIM_DICT_LOADED(strChaseEndAnims)
AND (bPlayFirstPartOfCopsCutscene OR (NOT bPlayFirstPartOfCopsCutscene AND TIMERB() > 1000)) //Timer is set in previous section if you park next to Lamar.
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
FREEZE_ENTITY_POSITION(sMainCars[iBuddiesCar].veh, FALSE)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sMainCars[iBuddiesCar].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sMainCars[iBuddiesCar].veh)
ENDIF
IF iBuddiesCar = RAPIDGT_INDEX
REMOVE_VEHICLE_RECORDING(CARREC_BUDDY_ALTERNATE, strCarrec)
ELSE
REMOVE_VEHICLE_RECORDING(CARREC_BUDDY, strCarrec)
ENDIF
SET_VEHICLE_INDICATOR_LIGHTS(sMainCars[iBuddiesCar].veh, FALSE, FALSE)
SET_VEHICLE_INDICATOR_LIGHTS(sMainCars[iBuddiesCar].veh, TRUE, FALSE)
ENDIF
CLEANUP_UBER_PLAYBACK()
REMOVE_ALL_CHASE_RECORDINGS()
REMOVE_VEHICLE(vehTrailer)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED)
REMOVE_OBJECT(objVaultShutter)
REMOVE_PED(sSecurityGuard.ped, TRUE)
IF interiorBank != NULL
UNPIN_INTERIOR(interiorBank)
interiorBank = NULL
ENDIF
IF NOT IS_PED_INJURED(sLamar.ped)
CLEAR_PED_SECONDARY_TASK(sLamar.ped)
CLEAR_PED_SECONDARY_TASK(PLAYER_PED_ID())
SET_PED_CAN_PLAY_AMBIENT_ANIMS(sLamar.ped, FALSE)
SET_PED_CAN_PLAY_AMBIENT_BASE_ANIMS(sLamar.ped, FALSE)
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sLamar.ped, 20000, SLF_WIDEST_PITCH_LIMIT | SLF_WIDEST_YAW_LIMIT | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
TASK_LOOK_AT_ENTITY(sLamar.ped, PLAYER_PED_ID(), 20000, SLF_WIDEST_PITCH_LIMIT | SLF_WIDEST_YAW_LIMIT | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
ENDIF
SETUP_REQ_BANK_GATES()
PLAY_ENTITY_ANIM(objBankGates[1], "p_sec_gate_01_s_close", "map_objects", 4.0, FALSE, TRUE)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objBankGates[1])
SET_ENTITY_VISIBLE(objBankGates[1], FALSE)
SET_ENTITY_COLLISION(objBankGateCollision[0], FALSE)
SET_ENTITY_COLLISION(objBankGateCollision[1], FALSE)
CLEAR_PRINTS()
CLEAR_HELP()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SET_CREATE_RANDOM_COPS(FALSE)
CLEAR_AREA(<<44.494202, -634.840820, 34.558254>>, 200.0, TRUE)
//Create police car in advance for later
vehCutsceneCop = CREATE_VEHICLE(POLICE3, <<7.5420, -578.0831, 36.6983>>, 336.2658)
SET_VEHICLE_ENGINE_ON(vehCutsceneCop, TRUE, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(POLICE3)
pedCutsceneCops[0] = CREATE_PED_INSIDE_VEHICLE(vehCutsceneCop, PEDTYPE_COP, S_M_Y_COP_01, VS_DRIVER)
GIVE_WEAPON_TO_PED(pedCutsceneCops[0], WEAPONTYPE_PISTOL, INFINITE_AMMO)
SET_PED_COMBAT_ATTRIBUTES(pedCutsceneCops[0], CA_DO_DRIVEBYS, FALSE)
pedCutsceneCops[1] = CREATE_PED_INSIDE_VEHICLE(vehCutsceneCop, PEDTYPE_COP, S_M_Y_COP_01, VS_FRONT_RIGHT)
GIVE_WEAPON_TO_PED(pedCutsceneCops[1], WEAPONTYPE_PISTOL, INFINITE_AMMO)
SET_PED_COMBAT_ATTRIBUTES(pedCutsceneCops[1], CA_DO_DRIVEBYS, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(S_M_Y_COP_01)
SET_FRONTEND_RADIO_ACTIVE(FALSE)
//If the doors are open close them for the cutscene.
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
SET_VEHICLE_DOORS_SHUT(sMainCars[iPlayersCar].veh)
//Roll down the windows in case the player put the roof back up.
ROLL_DOWN_WINDOWS(sMainCars[iPlayersCar].veh)
LOWER_CONVERTIBLE_ROOF(sMainCars[iPlayersCar].veh, TRUE)
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sMainCars[iPlayersCar].veh)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sMainCars[iPlayersCar].veh)
ENDIF
ENDIF
STOP_AUDIO_SCENES()
RELEASE_NAMED_SCRIPT_AUDIO_BANK("CAR_CRASHES_01")
RELEASE_NAMED_SCRIPT_AUDIO_BANK("CAR_CRASHES_MED_01")
//If the player already parked next to Lamar then don't play the first shot.
IF bPlayFirstPartOfCopsCutscene
FLOAT fClosestTime = GET_CLOSEST_TIME_POSITION_IN_RECORDING_TO_POINT(GET_ENTITY_COORDS(sMainCars[iPlayersCar].veh), iCarrecPlayerArrive, strCarrec, 20)
FLOAT fClosestBuddyTime = GET_CLOSEST_TIME_POSITION_IN_RECORDING_TO_POINT(GET_ENTITY_COORDS(sMainCars[iBuddiesCar].veh), iCarrecBuddyArrive, strCarrec, 20)
IF fClosestTime < 1000.0
fClosestTime = 1000.0
ENDIF
IF fClosestBuddyTime < 1000.0
fClosestBuddyTime = 1000.0
ENDIF
IF ABSF(fClosestBuddyTime - fClosestTime) < 750.0
IF fClosestBuddyTime - fClosestTime > 0.0
fClosestBuddyTime += 500.0
ELSE
fClosestTime += 500.0
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN("Franklin start time: ", fClosestTime, " Lamar start time: ", fClosestBuddyTime)
#ENDIF
//Play variations depending on if it was a close finish or not
IF bCloseFinish
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
START_PLAYBACK_RECORDED_VEHICLE(sMainCars[iBuddiesCar].veh, iCarrecBuddyArrive, strCarrec)
IF IS_SCREEN_FADED_OUT()
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sMainCars[iBuddiesCar].veh, 2500.0)
ELSE
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sMainCars[iBuddiesCar].veh, fClosestBuddyTime)
ENDIF
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sMainCars[iBuddiesCar].veh)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(sMainCars[iBuddiesCar].veh, TRUE)
PLAY_SOUND_FROM_ENTITY(-1, "Lamar_Throttle_Blip", sMainCars[iBuddiesCar].veh)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
START_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh, iCarrecPlayerArrive, strCarrec)
IF IS_SCREEN_FADED_OUT()
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh, 1500.0)
ELSE
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh, fClosestTime)
ENDIF
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sMainCars[iPlayersCar].veh)
PLAY_SOUND_FROM_ENTITY(-1, "Franklin_Throttle_Blip", sMainCars[iPlayersCar].veh)
ENDIF
ELSE
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
START_PLAYBACK_RECORDED_VEHICLE(sMainCars[iBuddiesCar].veh, iCarrecBuddyArrive, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sMainCars[iBuddiesCar].veh, GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iCarrecBuddyArrive, strCarrec) - 200.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sMainCars[iBuddiesCar].veh)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(sMainCars[iBuddiesCar].veh, TRUE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
START_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh, iCarrecPlayerArrive, strCarrec)
IF IS_SCREEN_FADED_OUT()
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh, 1500.0)
ELSE
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh, fClosestTime)
ENDIF
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sMainCars[iPlayersCar].veh)
PLAY_SOUND_FROM_ENTITY(-1, "Franklin_Throttle_Blip", sMainCars[iPlayersCar].veh)
ENDIF
//Have Lamar look in his rear-view mirror for a few seconds.
IF NOT IS_PED_INJURED(sLamar.ped)
TASK_LOOK_AT_COORD(sLamar.ped, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(sMainCars[iBuddiesCar].veh, <<-2.5729, 0.4432, 0.4889>>), 20000,
SLF_WIDEST_PITCH_LIMIT | SLF_WIDEST_YAW_LIMIT | SLF_WHILE_NOT_IN_FOV,
SLF_LOOKAT_VERY_HIGH)
ENDIF
ENDIF
camCutscene = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
IF bPlayLamarRearViewCam
SET_CAM_PARAMS(camCutscene, <<43.507690,-636.952881,31.885925>>,<<-5.839731,-0.072286,141.028076>>,28.425701, 0)
SET_CAM_PARAMS(camCutscene, <<43.448174,-636.904785,31.886021>>,<<-5.839731,-0.072286,141.028076>>,28.425701, 6500, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
ELSE
SET_CAM_PARAMS(camCutscene, <<44.494202, -634.840820, 34.558254>>, <<-9.333186, 0.007438, 141.694916>>, 34.999981, 0)
SET_CAM_PARAMS(camCutscene, <<45.339893,-634.409973,31.496740>>,<<-1.446978,-0.011956,131.289749>>,34.999981, 4500, GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
ENDIF
SHAKE_CAM(camCutscene, "HAND_SHAKE", 0.05)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
SET_ENTITY_CAN_BE_DAMAGED(sMainCars[iPlayersCar].veh, FALSE)
SET_ENTITY_INVINCIBLE(sMainCars[iPlayersCar].veh, TRUE)
SET_VEHICLE_HAS_UNBREAKABLE_LIGHTS(sMainCars[iPlayersCar].veh, TRUE)
//If the player is closer to the end point than Lamar then consider that a victory in the race.
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
IF VDIST2(GET_ENTITY_COORDS(sMainCars[iBuddiesCar].veh), <<40.409893,-635.809973,31.096740>>) > VDIST2(GET_ENTITY_COORDS(sMainCars[iPlayersCar].veh), <<40.409893,-635.809973,31.096740>>)
//Only if a segment wasn't shitskipped
//AND not g_bShitskipAccepted
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(ARM1_WINNER)
#IF IS_DEBUG_BUILD
PRINTLN("armenian1.sc - Player won the race.")
#ENDIF
ENDIF
ENDIF
ENDIF
SPECIAL_ABILITY_DEACTIVATE(PLAYER_ID())
START_AUDIO_SCENE("ARM_1_COPS_ARRIVE")
DO_FADE_IN_WITH_WAIT()
SETTIMERB(0)
SETTIMERA(0)
sLamar.iEvent = 0
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
iCameraSyncScene = -1
bSafeToPlayCamAnim = FALSE
bHasFirstPersonFlashTriggered = FALSE
//bAlreadyPlayedCarTrashedDialogue = FALSE
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
SET_SIDE_CAR_PARK_INTERIOR_ACTIVE(TRUE)
FLOAT f_anim_phase
IF IS_SYNCHRONIZED_SCENE_RUNNING(iCameraSyncScene)
f_anim_phase = GET_SYNCHRONIZED_SCENE_PHASE(iCameraSyncScene)
#IF IS_DEBUG_BUILD
PRINTLN(f_anim_phase)
#ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(sMainCars[iBuddiesCar].veh)
SET_FORCE_HD_VEHICLE(sMainCars[iBuddiesCar].veh, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(sMainCars[iPlayersCar].veh)
SET_FORCE_HD_VEHICLE(sMainCars[iPlayersCar].veh, TRUE)
ENDIF
IF NOT IS_ENTITY_VISIBLE(objBankGates[1])
IF TIMERB() > 10
SET_ENTITY_VISIBLE(objBankGates[1], TRUE)
ENDIF
ENDIF
SWITCH iCurrentEvent
CASE 0
//Preload the first part of the conversation: different variations based on the race outcome.
IF NOT bHasTextLabelTriggered[ARM1_DISS_PRELOADED]
IF bFranklinsCarTrashed
IF bLamarsCarTrashed
IF PRELOAD_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_DISS4", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_DISS_PRELOADED] = TRUE
ENDIF
ELSE
IF PRELOAD_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_DISS3", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_DISS_PRELOADED] = TRUE
ENDIF
ENDIF
ELSE
IF bCloseFinish
IF PRELOAD_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_DISS1", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_DISS_PRELOADED] = TRUE
ENDIF
ELSE
IF PRELOAD_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_DISS2", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_DISS_PRELOADED] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//TEMP: There's an issue with the cars sliding a bit after the recording ends, so just freeze the recordings for now.
IF bPlayFirstPartOfCopsCutscene
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sMainCars[iBuddiesCar].veh)
IF GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iCarrecBuddyArrive, strCarrec) - GET_TIME_POSITION_IN_RECORDING(sMainCars[iBuddiesCar].veh) < 200.0
SET_PLAYBACK_SPEED(sMainCars[iBuddiesCar].veh, 0.0)
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sMainCars[iPlayersCar].veh)
IF GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(iCarrecPlayerArrive, strCarrec) - GET_TIME_POSITION_IN_RECORDING(sMainCars[iPlayersCar].veh) < 200.0
SET_PLAYBACK_SPEED(sMainCars[iPlayersCar].veh, 0.0)
ENDIF
ENDIF
ENDIF
ENDIF
REQUEST_MODEL(POLICE3)
REQUEST_MODEL(S_M_Y_COP_01)
REQUEST_ANIM_DICT(strChaseEndAnims)
IF (TIMERB() > 4500 OR NOT bPlayFirstPartOfCopsCutscene)
AND HAS_MODEL_LOADED(POLICE3)
AND HAS_MODEL_LOADED(S_M_Y_COP_01)
AND HAS_ANIM_DICT_LOADED(strChaseEndAnims)
AND bHasTextLabelTriggered[ARM1_DISS_PRELOADED]
//Freeze the vehicles into their start positions
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
AND IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
AND NOT IS_PED_INJURED(sLamar.ped)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sMainCars[iBuddiesCar].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sMainCars[iBuddiesCar].veh)
ENDIF
REMOVE_VEHICLE_RECORDING(iCarrecBuddyArrive, strCarrec)
FREEZE_ENTITY_POSITION(sMainCars[iBuddiesCar].veh, FALSE)
START_PLAYBACK_RECORDED_VEHICLE(sMainCars[iBuddiesCar].veh, iCarrecBuddyEscape, strCarrec, FALSE)
//SET_VEHICLE_ACTIVE_DURING_PLAYBACK(sMainCars[iBuddiesCar].veh, TRUE)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sMainCars[iBuddiesCar].veh, FALSE)
SET_PLAYBACK_SPEED(sMainCars[iBuddiesCar].veh, 0.0)
PLAY_SOUND_FROM_ENTITY(iLamarRevSound, "Idling_Throttle_Blip_Loop", sMainCars[iBuddiesCar].veh, "ARM_1_SOUNDSET")
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sMainCars[iPlayersCar].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh)
ENDIF
REMOVE_VEHICLE_RECORDING(iCarrecPlayerArrive, strCarrec)
SET_ENTITY_COORDS(sMainCars[iPlayersCar].veh, vPlayerStartPos)
SET_ENTITY_HEADING(sMainCars[iPlayersCar].veh, fPlayerStartHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(sMainCars[iPlayersCar].veh)
FREEZE_ENTITY_POSITION(sMainCars[iPlayersCar].veh, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(sLamar.ped)
TASK_CLEAR_LOOK_AT(sLamar.ped)
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
sLamar.iSyncedScene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
iPlayerSyncScene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
IF iPlayersCar = NINEF_INDEX
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iPlayerSyncScene, sMainCars[NINEF_INDEX].veh, GET_ENTITY_BONE_INDEX_BY_NAME(sMainCars[NINEF_INDEX].veh, "seat_dside_f"))
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(sLamar.iSyncedScene, sMainCars[RAPIDGT_INDEX].veh, GET_ENTITY_BONE_INDEX_BY_NAME(sMainCars[RAPIDGT_INDEX].veh, "seat_dside_f"))
ELSE
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iPlayerSyncScene, sMainCars[RAPIDGT_INDEX].veh, GET_ENTITY_BONE_INDEX_BY_NAME(sMainCars[RAPIDGT_INDEX].veh, "seat_dside_f"))
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(sLamar.iSyncedScene, sMainCars[NINEF_INDEX].veh, GET_ENTITY_BONE_INDEX_BY_NAME(sMainCars[NINEF_INDEX].veh, "seat_dside_f"))
ENDIF
//Play different mocaps depending on the result of the race.
IF bFranklinsCarTrashed
IF bLamarsCarTrashed
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iPlayerSyncScene, strChaseEndAnims, "CarRace_Banter_bothtrashed_FRANKLIN", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
TASK_SYNCHRONIZED_SCENE(sLamar.ped, sLamar.iSyncedScene, strChaseEndAnims, "CarRace_Banter_bothtrashed_LAMAR", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
bSafeToPlayCamAnim = TRUE
ELSE
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iPlayerSyncScene, strChaseEndAnims, "CarRace_Banter_thatbucket_FRANKLIN", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
TASK_SYNCHRONIZED_SCENE(sLamar.ped, sLamar.iSyncedScene, strChaseEndAnims, "CarRace_Banter_thatbucket_LAMAR", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
bSafeToPlayCamAnim = TRUE
ENDIF
//bAlreadyPlayedCarTrashedDialogue = TRUE
ELSE
IF bCloseFinish
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iPlayerSyncScene, strChaseEndAnims, "CarRace_Banter_FlowThrough_FRANKLIN", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
TASK_SYNCHRONIZED_SCENE(sLamar.ped, sLamar.iSyncedScene, strChaseEndAnims, "CarRace_Banter_FlowThrough_LAMAR", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
bSafeToPlayCamAnim = TRUE
ELSE
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iPlayerSyncScene, strChaseEndAnims, "CarRace_Banter_MoveSome_FRANKLIN", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
TASK_SYNCHRONIZED_SCENE(sLamar.ped, sLamar.iSyncedScene, strChaseEndAnims, "CarRace_Banter_MoveSome_LAMAR", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
bSafeToPlayCamAnim = TRUE
ENDIF
ENDIF
ENDIF
DESTROY_ALL_CAMS()
NEW_LOAD_SCENE_STOP() //In case the area was getting pre-streamed during the chase.
//bSafeToPlayCamAnim = FALSE //TEMP
//Start streaming in the shutter gates.
IF bSafeToPlayCamAnim
camCutscene = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", TRUE)
iCameraSyncScene = CREATE_SYNCHRONIZED_SCENE(<<40.715, -638.31, 30.675>>, <<0.0, 0.0, 66.0>>)
IF bFranklinsCarTrashed
IF bLamarsCarTrashed
PLAY_SYNCHRONIZED_CAM_ANIM(camCutscene, iCameraSyncScene, "CarRace_Banter_bothtrashed_cam", strChaseEndAnims)
ELSE
PLAY_SYNCHRONIZED_CAM_ANIM(camCutscene, iCameraSyncScene, "CarRace_Banter_thatbucket_cam", strChaseEndAnims)
ENDIF
ELSE
IF bCloseFinish
PLAY_SYNCHRONIZED_CAM_ANIM(camCutscene, iCameraSyncScene, "carrace_banter_flowthrough_cam", strChaseEndAnims)
ELSE
PLAY_SYNCHRONIZED_CAM_ANIM(camCutscene, iCameraSyncScene, "carrace_banter_movesome_cam", strChaseEndAnims)
ENDIF
ENDIF
ELSE
camCutscene = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
IF iBuddiesCar = RAPIDGT_INDEX
SET_CAM_PARAMS(camCutscene, <<36.597473,-637.170654,31.809887>>,<<-3.324733,-0.009855,-122.254189>>,21.896662, 0)
SET_CAM_PARAMS(camCutscene, <<36.595215,-637.169373,31.764223>>,<<-3.324733,-0.009855,-122.254189>>,21.896662, 15000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
ELSE
SET_CAM_PARAMS(camCutscene, <<36.913578,-636.766541,31.839243>>,<<-3.589668,-0.002839,-124.835060>>,21.708742, 0)
SET_CAM_PARAMS(camCutscene, <<36.911545,-636.766296,31.800074>>,<<-3.589668,-0.002839,-124.835060>>,21.708742, 15000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
ENDIF
ENDIF
IF NOT bPlayFirstPartOfCopsCutscene
SHAKE_CAM(camCutscene, "HAND_SHAKE", 0.05)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
SET_WIDESCREEN_BORDERS(TRUE, 0)
ENDIF
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 1
//Play dialogue variations based on how the race went.
IF NOT bHasTextLabelTriggered[ARM1_DISS_FINISHED]
BEGIN_PRELOADED_CONVERSATION()
bHasTextLabelTriggered[ARM1_DISS_FINISHED] = TRUE
ELSE
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
OR TIMERB() > 20000 //In case something goes wrong with the conversation preloading.
IF IS_VEHICLE_DRIVEABLE(vehCutsceneCop)
IF NOT IS_PED_INJURED(pedCutsceneCops[0])
AND NOT IS_PED_SITTING_IN_VEHICLE(pedCutsceneCops[0], vehCutsceneCop)
SET_PED_INTO_VEHICLE(pedCutsceneCops[0], vehCutsceneCop)
ENDIF
SET_VEHICLE_ENGINE_ON(vehCutsceneCop, TRUE, TRUE)
SET_VEHICLE_SIREN(vehCutsceneCop, TRUE)
SET_VEHICLE_LIGHTS(vehCutsceneCop, FORCE_VEHICLE_LIGHTS_ON)
SET_SIREN_WITH_NO_DRIVER(vehCutsceneCop, TRUE)
//SHAKE_CAM(camCutscene, "HAND_SHAKE", 0.1)
//SET_CAM_PARAMS(camCutscene, <<5.463886,-571.515808,40.060337>>,<<-9.003131,-0.014244,-156.997849>>,20.389755, 0)
//SET_CAM_PARAMS(camCutscene, <<5.362803,-571.279663,38.419109>>,<<-8.901178,-0.039444,-156.941574>>,20.389755, 7500, GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
//ADD_PED_FOR_DIALOGUE(sConversationPeds, 7, NULL, "CopDispatch")
//ADD_PED_FOR_DIALOGUE(sConversationPeds, 8, pedCutsceneCops[0], "COPDRIVER")
SETTIMERB(0)
iCurrentEvent++
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
REQUEST_VEHICLE_RECORDING(CARREC_COP_ESCAPE, strCarrec)
IF (TIMERB() > 1000 OR f_anim_phase > 0.99)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COP_ESCAPE, strCarrec)
IF IS_VEHICLE_DRIVEABLE(vehCutsceneCop)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehCutsceneCop)
STOP_PLAYBACK_RECORDED_VEHICLE(vehCutsceneCop)
ENDIF
REMOVE_VEHICLE_RECORDING(CARREC_COP_ESCAPE_START, strCarrec)
START_PLAYBACK_RECORDED_VEHICLE_WITH_FLAGS(vehCutsceneCop, CARREC_COP_ESCAPE, strCarrec, ENUM_TO_INT(SWITCH_ON_PLAYER_VEHICLE_IMPACT))
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehCutsceneCop, 500.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehCutsceneCop)
SET_PLAYBACK_SPEED(vehCutsceneCop, 0.1)
ENDIF
IF NOT IS_PED_INJURED(sLamar.ped)
sLamar.iSyncedScene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
iPlayerSyncScene = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
IF iPlayersCar = NINEF_INDEX
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iPlayerSyncScene, sMainCars[NINEF_INDEX].veh, GET_ENTITY_BONE_INDEX_BY_NAME(sMainCars[NINEF_INDEX].veh, "seat_dside_f"))
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(sLamar.iSyncedScene, sMainCars[RAPIDGT_INDEX].veh, GET_ENTITY_BONE_INDEX_BY_NAME(sMainCars[RAPIDGT_INDEX].veh, "seat_dside_f"))
ELSE
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iPlayerSyncScene, sMainCars[RAPIDGT_INDEX].veh, GET_ENTITY_BONE_INDEX_BY_NAME(sMainCars[RAPIDGT_INDEX].veh, "seat_dside_f"))
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(sLamar.iSyncedScene, sMainCars[NINEF_INDEX].veh, GET_ENTITY_BONE_INDEX_BY_NAME(sMainCars[NINEF_INDEX].veh, "seat_dside_f"))
ENDIF
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iPlayerSyncScene, strChaseEndAnims, "CarRace_Banter_cops_FRANKLIN", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
SET_SYNCHRONIZED_SCENE_PHASE(iPlayerSyncScene, 0.1)
TASK_SYNCHRONIZED_SCENE(sLamar.ped, sLamar.iSyncedScene, strChaseEndAnims, "CarRace_Banter_cops_LAMAR", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
ENDIF
IF bSafeToPlayCamAnim
DESTROY_ALL_CAMS()
camCutscene = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", TRUE)
iCameraSyncScene = CREATE_SYNCHRONIZED_SCENE(<<40.715, -638.31, 30.675>>, <<0.0, 0.0, 66.0>>)
PLAY_SYNCHRONIZED_CAM_ANIM(camCutscene, iCameraSyncScene, "CarRace_Banter_cops_cam", strChaseEndAnims)
ELSE
SHAKE_CAM(camCutscene, "HAND_SHAKE", 0.05)
SET_CAM_PARAMS(camCutscene, <<46.842010,-636.445923,31.563919>>, <<-0.180864,0.105875,110.352585>>, 30.892385, 0)
SET_CAM_PARAMS(camCutscene, <<46.881973,-636.563721,31.602829>>, <<-0.098123,0.105875,105.779968>>, 30.892385, 16000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
ENDIF
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 3
IF NOT bHasTextLabelTriggered[ARM1_COPS_3]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_COPS", CONV_PRIORITY_MEDIUM)
ENDIF
TEXT_LABEL strCurrentLabel
strCurrentLabel = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL()
IF ARE_STRINGS_EQUAL(strCurrentLabel, "ARM1_COPS_3")
SETTIMERB(0)
bHasTextLabelTriggered[ARM1_COPS_3] = TRUE
ENDIF
ENDIF
IF TIMERB() > 3000
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
SET_PLAYBACK_SPEED(sMainCars[iBuddiesCar].veh, 1.0)
IF NOT HAS_SOUND_FINISHED(iLamarRevSound)
STOP_SOUND(iLamarRevSound)
ENDIF
SETTIMERB(0)
iCurrentEvent++
ENDIF
ENDIF
BREAK
CASE 4
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] COPS_ARRIVE_CUTSCENE: f_anim_phase = ", f_anim_phase, " TIMERB = ", TIMERB())
IF NOT bHasFirstPersonFlashTriggered
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 TIMERB() > 2200
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] Triggering flash: f_anim_phase = ", f_anim_phase, " TIMERB = ", TIMERB())
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bHasFirstPersonFlashTriggered = TRUE
ENDIF
ENDIF
ENDIF
IF TIMERB() > 2500
OR f_anim_phase > 0.99
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
BREAK
ENDSWITCH
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
eSectionStage = SECTION_STAGE_SKIP
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REPLAY_STOP_EVENT()
REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0)
CLEAR_HELP()
SET_MODEL_AS_NO_LONGER_NEEDED(POLICE3)
SET_MODEL_AS_NO_LONGER_NEEDED(S_M_Y_COP_01)
SET_SIDE_CAR_PARK_INTERIOR_ACTIVE(FALSE)
SET_ENTITY_COLLISION(objBankGateCollision[0], TRUE)
SET_ENTITY_COLLISION(objBankGateCollision[1], TRUE)
//Stop any anims on the player, stick him back in the car
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
STOP_SYNCHRONIZED_ENTITY_ANIM(PLAYER_PED_ID(), NORMAL_BLEND_OUT, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sMainCars[iPlayersCar].veh, VS_DRIVER)
SET_VEHICLE_BRAKE_LIGHTS(sMainCars[iPlayersCar].veh, FALSE) //Fudge fix for lights turning on when player is warped in
ENDIF
IF NOT IS_PED_INJURED(sLamar.ped)
STOP_SYNCHRONIZED_ENTITY_ANIM(sLamar.ped, NORMAL_BLEND_OUT, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(sLamar.ped)
TASK_CLEAR_LOOK_AT(sLamar.ped)
SET_ENTITY_COORDS(sLamar.ped, <<-32.9120, -1086.3040, 29.2035>>)
FREEZE_ENTITY_POSITION(sLamar.ped, TRUE)
SET_ENTITY_COLLISION(sLamar.ped, FALSE)
SET_ENTITY_VISIBLE(sLamar.ped, FALSE)
ENDIF
//Cleanup recordings if they haven't been cleaned up already
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sMainCars[iPlayersCar].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh)
ENDIF
REMOVE_VEHICLE_RECORDING(iCarrecPlayerArrive, strCarrec)
FREEZE_ENTITY_POSITION(sMainCars[iPlayersCar].veh, FALSE)
//Fix for TODO 271924: moved player further back at the end of the cutscene so exit is clearer.
IF iPlayersCar = NINEF_INDEX
SET_ENTITY_HEADING(sMainCars[iPlayersCar].veh, 337.9254)
SET_ENTITY_COORDS(sMainCars[iPlayersCar].veh, <<35.9457, -646.1738, 30.6258>>)
ELSE
SET_ENTITY_HEADING(sMainCars[iPlayersCar].veh, 335.0150)
SET_ENTITY_COORDS(sMainCars[iPlayersCar].veh, <<35.2234, -646.9493, 30.6292>>)
ENDIF
//SET_VEHICLE_ON_GROUND_PROPERLY(sMainCars[iPlayersCar].veh)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sMainCars[iBuddiesCar].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sMainCars[iBuddiesCar].veh)
ENDIF
REMOVE_VEHICLE_RECORDING(iCarrecBuddyArrive, strCarrec)
REMOVE_VEHICLE_RECORDING(iCarrecBuddyEscape, strCarrec)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(sMainCars[iBuddiesCar].veh)
SETUP_REQ_LAMARS_CHOSEN_CAR_IN_GARAGE()
ENDIF
//If we skipped the cutscene then do a load scene here.
IF IS_SCREEN_FADED_OUT()
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(<<35.9457, -646.1738, 30.6258>>, 200.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION, 5000)
ENDIF
//Setup the cutscene cop to transition into gameplay
IF IS_VEHICLE_DRIVEABLE(vehCutsceneCop)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehCutsceneCop)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehCutsceneCop, 10500.0)
SET_PLAYBACK_SPEED(vehCutsceneCop, 1.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehCutsceneCop)
ENDIF
IF NOT IS_PED_INJURED(pedCutsceneCops[0])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedCutsceneCops[0], FALSE)
ENDIF
IF NOT IS_PED_INJURED(pedCutsceneCops[1])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedCutsceneCops[1], FALSE)
ENDIF
ENDIF
CLEAR_AREA_OF_VEHICLES(<<81.9, -600.2, 32.5>>, 30.0)
IF DOES_CAM_EXIST(camCutscene)
AND GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) != CAM_VIEW_MODE_FIRST_PERSON
AND GET_FOLLOW_VEHICLE_CAM_ZOOM_LEVEL() != VEHICLE_ZOOM_LEVEL_BONNET
DESTROY_CAM(camCutscene)
IF iPlayersCar = NINEF_INDEX
camCutscene = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<34.023193,-647.578369,31.919437>>,<<-1.429148,0.000000,-47.809055>>,50.027916, TRUE)
ELSE
camCutscene = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<33.332428,-648.706055,31.861574>>,<<-0.377383,0.000000,-47.843166>>,50.027916, TRUE)
ENDIF
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] Creating camera for scripted transition to gameplay.")
WAIT(0)
ENDIF
REMOVE_ANIM_DICT(strChaseEndAnims)
SET_FRONTEND_RADIO_ACTIVE(TRUE)
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
SET_WIDESCREEN_BORDERS(FALSE, 0)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
STOP_AUDIO_SCENE("ARM_1_COPS_ARRIVE")
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-50.5 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
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
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ELSE
STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP()
ENDIF
NEW_LOAD_SCENE_STOP()
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_GO_TO_GARAGE
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
WHILE NOT IS_SCREEN_FADED_OUT()
IF NOT IS_ENTITY_DEAD(sMainCars[iBuddiesCar].veh)
SET_FORCE_HD_VEHICLE(sMainCars[iBuddiesCar].veh, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(sMainCars[iPlayersCar].veh)
SET_FORCE_HD_VEHICLE(sMainCars[iPlayersCar].veh, TRUE)
ENDIF
WAIT(0)
ENDWHILE
ENDIF
CLEAR_PRINTS()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
IF IS_VEHICLE_DRIVEABLE(vehCutsceneCop)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehCutsceneCop)
STOP_PLAYBACK_RECORDED_VEHICLE(vehCutsceneCop)
ENDIF
SET_VEHICLE_SIREN(vehCutsceneCop, TRUE)
SET_VEHICLE_LIGHTS(vehCutsceneCop, FORCE_VEHICLE_LIGHTS_ON)
SET_SIREN_WITH_NO_DRIVER(vehCutsceneCop, TRUE)
REMOVE_VEHICLE_RECORDING(CARREC_COP_ESCAPE_START, strCarrec)
START_PLAYBACK_RECORDED_VEHICLE(vehCutsceneCop, CARREC_COP_ESCAPE, strCarrec)
ENDIF
IF NOT HAS_SOUND_FINISHED(iLamarRevSound)
STOP_SOUND(iLamarRevSound)
ENDIF
IF DOES_ENTITY_EXIST(objBankGates[1])
IF IS_ENTITY_PLAYING_ANIM(objBankGates[1], "map_objects", "p_sec_gate_01_s_close")
SET_ENTITY_ANIM_CURRENT_TIME(objBankGates[1], "map_objects", "p_sec_gate_01_s_close", 0.99)
ENDIF
ENDIF
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDPROC
PROC GO_TO_GARAGE()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF bUsedACheckpoint
START_REPLAY_SETUP(<<35.2234, -646.9493, 30.6292>>, 335.0142, FALSE)
iCurrentEvent = 99
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<35.2234, -646.9493, 30.6292>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(<<35.2234, -646.9493, 30.6292>>)
WAIT(0)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
SETUP_REQ_CAR_CHOICES()
SET_BUILDING_STATE(BUILDINGNAME_ES_BANK_CAR_PARK_SHUTTERS, BUILDINGSTATE_NORMAL)
//Need to create the cutscene cops if jumping straight to this stage
REQUEST_MODEL(POLICE3)
REQUEST_MODEL(S_M_Y_COP_01)
REQUEST_VEHICLE_RECORDING(CARREC_COP_ESCAPE, strCarrec)
WHILE NOT DOES_ENTITY_EXIST(sLamar.ped)
OR NOT DOES_ENTITY_EXIST(sMainCars[0].veh)
OR NOT DOES_ENTITY_EXIST(sMainCars[1].veh)
OR NOT HAS_MODEL_LOADED(POLICE3)
OR NOT HAS_MODEL_LOADED(S_M_Y_COP_01)
OR NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_COP_ESCAPE, strCarrec)
SETUP_LAMAR(<<-25.3560, -1086.3054, 25.5721>>, 52.8017)
SETUP_NINEF(<<34.0424, -638.7692, 30.6252>>)
SETUP_RAPIDGT(<<44.0424, -638.7692, 30.6252>>)
REQUEST_MODEL(POLICE3)
REQUEST_MODEL(S_M_Y_COP_01)
REQUEST_VEHICLE_RECORDING(CARREC_COP_ESCAPE, strCarrec)
WAIT(0)
ENDWHILE
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
SETUP_REQ_PUT_PLAYER_INTO_CHOSEN_CAR()
SETUP_REQ_LAMARS_CHOSEN_CAR_IN_GARAGE()
SETUP_REQ_FORCE_ROOFS_DOWN_FOR_BOTH_CARS()
SETUP_REQ_ABILITY_BAR_NEARLY_FULL()
SPECIAL_ABILITY_RESET(PLAYER_ID())
CLEAR_PED_WETNESS(PLAYER_PED_ID())
SET_CREATE_RANDOM_COPS(FALSE)
CLEAR_AREA_OF_COPS(<<44.494202, -634.840820, 34.558254>>, 400.0)
vehCutsceneCop = CREATE_VEHICLE(POLICE3, <<87.5619, -588.9714, 30.5990>>, 160.1988)
SET_VEHICLE_ENGINE_ON(vehCutsceneCop, TRUE, TRUE)
SET_VEHICLE_SIREN(vehCutsceneCop, TRUE)
START_PLAYBACK_RECORDED_VEHICLE_WITH_FLAGS(vehCutsceneCop, CARREC_COP_ESCAPE, strCarrec, ENUM_TO_INT(SWITCH_ON_PLAYER_VEHICLE_IMPACT))
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehCutsceneCop, 10500.0)
SET_MODEL_AS_NO_LONGER_NEEDED(POLICE3)
pedCutsceneCops[0] = CREATE_PED_INSIDE_VEHICLE(vehCutsceneCop, PEDTYPE_COP, S_M_Y_COP_01, VS_DRIVER)
GIVE_WEAPON_TO_PED(pedCutsceneCops[0], WEAPONTYPE_PISTOL, INFINITE_AMMO)
SET_PED_COMBAT_ATTRIBUTES(pedCutsceneCops[0], CA_DO_DRIVEBYS, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedCutsceneCops[0], FALSE)
pedCutsceneCops[1] = CREATE_PED_INSIDE_VEHICLE(vehCutsceneCop, PEDTYPE_COP, S_M_Y_COP_01, VS_FRONT_RIGHT)
GIVE_WEAPON_TO_PED(pedCutsceneCops[1], WEAPONTYPE_PISTOL, INFINITE_AMMO)
SET_PED_COMBAT_ATTRIBUTES(pedCutsceneCops[1], CA_DO_DRIVEBYS, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedCutsceneCops[1], FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(S_M_Y_COP_01)
IF NOT IS_PED_INJURED(sLamar.ped)
SET_ENTITY_COORDS(sLamar.ped, <<-32.9120, -1086.3040, 29.2035>>)
FREEZE_ENTITY_POSITION(sLamar.ped, TRUE)
SET_ENTITY_COLLISION(sLamar.ped, FALSE)
SET_ENTITY_VISIBLE(sLamar.ped, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
SET_VEHICLE_ENGINE_ON(sMainCars[iPlayersCar].veh, TRUE, TRUE)
IF iPlayersCar = NINEF_INDEX
SET_ENTITY_HEADING(sMainCars[iPlayersCar].veh, 337.9254)
SET_ENTITY_COORDS(sMainCars[iPlayersCar].veh, <<35.9457, -646.1738, 30.6258>>)
ELSE
SET_ENTITY_HEADING(sMainCars[iPlayersCar].veh, 335.0150)
SET_ENTITY_COORDS(sMainCars[iPlayersCar].veh, <<35.2234, -646.9493, 30.6292>>)
ENDIF
ENDIF
SET_BUILDING_STATE(BUILDINGNAME_ES_BANK_CAR_PARK_SHUTTERS, BUILDINGSTATE_NORMAL)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-50.5 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
WAIT(500) //This hides some vehicle sliding issues when restarting this section.
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 2)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SET_MAX_WANTED_LEVEL(2)
UPDATE_WANTED_POSITION_THIS_FRAME(PLAYER_ID())
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(1.0)
SET_VEHICLE_POPULATION_BUDGET(3)
SET_PED_POPULATION_BUDGET(3)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENABLE_SPECIAL_ABILITY(PLAYER_ID(), TRUE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE) //May have been disabled earlier in the mission.
SET_CREATE_RANDOM_COPS(FALSE)
CLEAR_AREA_OF_COPS(GET_ENTITY_COORDS(PLAYER_PED_ID()), 200.0)
DISABLE_TAXI_HAILING(TRUE)
//SET_IGNORE_NO_GPS_FLAG(TRUE) //Enables the GPS at the back of the showroom.
bBypassedShowroomCutLocates = FALSE
bTriggeredShowroomCutFromLeft = FALSE
bLostWantedLevelForFirstTime = FALSE
//SET_DISPATCH_IDEAL_SPAWN_DISTANCE(1.0)
//SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0.15)
//SET_DISPATCH_TIME_BETWEEN_SPAWN_ATTEMPTS(DT_POLICE_AUTOMOBILE, 0.01)
//If the player shit-skipped the first part of the chase then we'll need to display the rage help here.
IF bSkippedSpecialAbilityTutorial
sRageData.bHasRaged = FALSE
ENDIF
//if the player hasn't used their special ability yet then we'll print the help text again in this section.
IF NOT sRageData.bHasRaged
bHasTextLabelTriggered[AR1_RAGEBAR] = FALSE
ENDIF
//951590 - There's a scenario at the back of the showroom that's possibly causing issues.
BLOCK_SCENARIOS_AT_SHOWROOM()
BLOCK_VEHICLE_GENS_IN_SHOWROOM(TRUE)
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_DOWN, TRUE)
BLOCK_COPS_SPAWNING_IN_BANK(TRUE)
//Lock Franklin's house.
SET_DOOR_STATE(DOORNAME_F_HOUSE_SC_B, DOORSTATE_LOCKED)
SET_DOOR_STATE(DOORNAME_F_HOUSE_SC_F, DOORSTATE_LOCKED)
IF NOT IS_AUDIO_SCENE_ACTIVE("ARM_1_LOSE_COPS")
START_AUDIO_SCENE("ARM_1_LOSE_COPS")
ENDIF
IF IS_SCREEN_FADED_OUT()
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100.0)
ENDIF
DO_FADE_IN_WITH_WAIT()
//Should now be safe to enable damage on the player's car again.
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
SET_ENTITY_CAN_BE_DAMAGED(sMainCars[iPlayersCar].veh, TRUE)
SET_ENTITY_INVINCIBLE(sMainCars[iPlayersCar].veh, FALSE)
SET_VEHICLE_HAS_UNBREAKABLE_LIGHTS(sMainCars[iPlayersCar].veh, FALSE)
ENDIF
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(ARM1_LOSE_WANTED_LVL)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
REPLAY_RECORD_BACK_FOR_TIME(0.0, 15.0)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_LOSE_COPS, "LOSE_COPS")
SETTIMERA(0)
bPlayedPoliceReport = FALSE
iCopsAITimer = 0
iLoseCopsTimer = GET_GAME_TIMER()
iAudioSceneEventLoseCops = 0
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
//1958200 - The cops are able to drive into the bank, so make sure the collision remains there.
SETUP_REQ_BANK_GATES(FALSE, TRUE)
IF GET_GAME_TIMER() - iLoseCopsTimer < 7000
UPDATE_WANTED_POSITION_THIS_FRAME(PLAYER_ID())
SUPPRESS_LOSING_WANTED_LEVEL_IF_HIDDEN_THIS_FRAME(PLAYER_ID())
SET_PLAYER_WANTED_CENTRE_POSITION(PLAYER_ID(), GET_ENTITY_COORDS(PLAYER_PED_ID()))
REPORT_POLICE_SPOTTED_PLAYER(PLAYER_ID())
ENDIF
//Remove the cop car after it finishes the recording.
IF IS_VEHICLE_DRIVEABLE(vehCutsceneCop)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehCutsceneCop)
IF iCopsAITimer = 0
IF NOT IS_PED_INJURED(pedCutsceneCops[0])
TASK_ARREST_PED(pedCutsceneCops[0], PLAYER_PED_ID())
ENDIF
IF NOT IS_PED_INJURED(pedCutsceneCops[1])
TASK_ARREST_PED(pedCutsceneCops[1], PLAYER_PED_ID())
ENDIF
iCopsAITimer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - iCopsAITimer > 2000
REMOVE_PED(pedCutsceneCops[0], FALSE)
REMOVE_PED(pedCutsceneCops[1], FALSE)
REMOVE_VEHICLE(vehCutsceneCop, FALSE)
ENDIF
ENDIF
ENDIF
SWITCH iCurrentEvent
CASE 0
IF GET_GAME_TIMER() - iLoseCopsTimer > 120000
OR NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
SET_CREATE_RANDOM_COPS(TRUE)
iCurrentEvent++
ENDIF
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
DONT_DO_J_SKIP(sLocatesData)
#ENDIF
IF NOT bHasTextLabelTriggered[ARM1_LOSE]
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_ARMENIAN_1_02")
bHasTextLabelTriggered[ARM1_LOSE] = TRUE
ENDIF
ENDIF
IF IS_PLAYER_AT_LOCATION_IN_VEHICLE(sLocatesData, vOutsideGarage, <<0.001, 0.001, LOCATE_SIZE_HEIGHT>>,
TRUE, sMainCars[iPlayersCar].veh, "AR1_GOGARAGE", "", "CMN_GENGETBCK", TRUE)
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
IF NOT bPlayedPoliceReport
IF NOT IS_SCRIPTED_CONVERSATION_ONGOING()
PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_ARMENIAN_1_01")
bPlayedPoliceReport = TRUE
ENDIF
ENDIF
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
//Request next assets in advance
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vOutsideGarage) < 10000.0
REQUEST_VEHICLE_RECORDING(CARREC_SHOWROOM_NINEF_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_SHOWROOM_NINEF_2, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_SHOWROOM_RAPIDGT_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_SHOWROOM_RAPIDGT_2, strCarrec)
PED_VEH_DATA_STRUCT sVehData
GET_PLAYER_VEH_DATA(CHAR_FRANKLIN, sVehData)
REQUEST_MODEL(sVehData.model)
ENDIF
BOOL bEnteredLeftLocate = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-58.523495,-1072.446289,25.512421>>, <<-47.367687,-1076.728027,28.776825>>, 14.750000)
BOOL bEnteredRightLocate = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-11.135968,-1091.418945,25.422077>>, <<-24.348146,-1126.346069,29.784176>>, 13.000000)
IF bEnteredLeftLocate OR bEnteredRightLocate
bTriggeredShowroomCutFromLeft = bEnteredLeftLocate
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
//Locates inside garage: in case the player bypasses the normal locates.
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-26.301994,-1092.126343,25.433983>>, <<-34.196312,-1089.121704,28.434271>>, 3.000000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-32.192822,-1086.231201,25.434008>>, <<-35.282406,-1094.512451,28.434353>>, 1.500000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-26.855288,-1088.089111,25.433941>>, <<-28.949333,-1094.194946,28.434189>>, 1.500000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-21.093651,-1085.448242,25.606892>>, <<-32.265572,-1081.161133,28.401917>>, 7.750000)
bBypassedShowroomCutLocates = TRUE
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDIF
//Hide Lamar during this bit
IF NOT IS_SCRIPTED_CONVERSATION_ONGOING()
REMOVE_PED(sLamar.ped, TRUE)
ENDIF
/*IF NOT IS_PED_INJURED(sLamar.ped)
IF IS_ENTITY_VISIBLE(sLamar.ped)
SET_ENTITY_COORDS(sLamar.ped, <<-40.7011, -1089.3977, 25.4344>>)
SET_ENTITY_VISIBLE(sLamar.ped, FALSE)
SET_ENTITY_INVINCIBLE(sLamar.ped, TRUE)
SET_ENTITY_COLLISION(sLamar.ped, FALSE)
FREEZE_ENTITY_POSITION(sLamar.ped, TRUE)
ENDIF
ENDIF*/
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
//Cops help
IF (IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sMainCars[iPlayersCar].veh)) //Only do help if player is in the car
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
IF TIMERA() > 3000
IF NOT bHasTextLabelTriggered[AR1_COPHELP1]
PRINT_HELP("AR1_COPHELP1", DEFAULT_HELP_TEXT_TIME + 3000)
bHasTextLabelTriggered[AR1_COPHELP1] = TRUE
FLASH_WANTED_DISPLAY(TRUE)
ELIF NOT bHasTextLabelTriggered[AR1_COPHELP2]
FLASH_WANTED_DISPLAY(FALSE)
PRINT_HELP("AR1_COPHELP2", DEFAULT_HELP_TEXT_TIME + 3000)
bHasTextLabelTriggered[AR1_COPHELP2] = TRUE
ELIF NOT bHasTextLabelTriggered[AR1_COPHELP2B]
#IF IS_DEBUG_BUILD
PRINTLN("Armenian1.sc - COPSHELP2B printed.") //Getting issues with this help text not printing (1033426).
#ENDIF
PRINT_HELP("AR1_COPHELP2B", DEFAULT_HELP_TEXT_TIME + 3000)
bHasTextLabelTriggered[AR1_COPHELP2B] = TRUE
ELIF NOT bHasTextLabelTriggered[AR1_COPHELP3]
PRINT_HELP("AR1_COPHELP3", DEFAULT_HELP_TEXT_TIME + 3000)
bHasTextLabelTriggered[AR1_COPHELP3] = TRUE
ELIF NOT bHasTextLabelTriggered[AR1_DUCKHELP]
PRINT_HELP("AR1_DUCKHELP", DEFAULT_HELP_TEXT_TIME + 3000)
bHasTextLabelTriggered[AR1_DUCKHELP] = TRUE
ENDIF
ENDIF
ENDIF
//Play some ambient speech while losing the cops.
IF NOT bHasTextLabelTriggered[AR1_COPAMB]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_DO_ALL_CHECKS)
PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "GENERIC_CURSE_MED", SPEECH_PARAMS_FORCE_FRONTEND)
bHasTextLabelTriggered[AR1_COPAMB] = TRUE
ENDIF
ENDIF
ENDIF
//Fail if the player drives to the back of the showroom.
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-21.093651,-1085.448242,25.606892>>, <<-32.265572,-1081.161133,28.401917>>, 7.750000)
MISSION_FAILED(FAILED_LED_COPS_TO_SHOWROOM)
ENDIF
ELSE
/*IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_COPHELP1")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_COPHELP2")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_COPHELP2B")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_COPHELP3")
CLEAR_HELP()
ENDIF*/
//Display the duck help if it wasn't displayed when losing the wanted level.
IF NOT bHasTextLabelTriggered[AR1_DUCKHELP]
AND NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
PRINT_HELP("AR1_DUCKHELP", DEFAULT_HELP_TEXT_TIME + 3000)
bHasTextLabelTriggered[AR1_DUCKHELP] = TRUE
ENDIF
IF NOT bLostWantedLevelForFirstTime
FLASH_WANTED_DISPLAY(FALSE)
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED()
bLostWantedLevelForFirstTime = TRUE
ENDIF
ENDIF
//Clear the duck help if the player presses the vehicle duck button.
IF bHasTextLabelTriggered[AR1_DUCKHELP]
AND IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_DUCKHELP")
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_DUCK)
IF GET_GAME_TIMER() - iDuckHelpTimer > 500
CLEAR_HELP()
ENDIF
ELSE
iDuckHelpTimer = GET_GAME_TIMER()
ENDIF
ENDIF
//Rage help: triggers if the player didn't activate ability during the chase (after the cops help).
IF NOT DOES_BLIP_EXIST(sLocatesData.vehicleBlip)
IF NOT sRageData.bHasRaged
IF bHasTextLabelTriggered[AR1_DUCKHELP]
OR NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF NOT bHasTextLabelTriggered[AR1_RAGEBAR] //Help text on how to start the special ability.
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
// Display keyboard and mouse help if PC version and m&kb
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
PRINT_HELP("AR1_RAGEBAR_KM", DEFAULT_HELP_TEXT_TIME + 3000)
ELSE
PRINT_HELP("AR1_RAGEBAR", DEFAULT_HELP_TEXT_TIME + 3000)
ENDIF
bHasTextLabelTriggered[AR1_RAGEBAR] = TRUE
FLASH_ABILITY_BAR(DEFAULT_HELP_TEXT_TIME)
ENDIF
ENDIF
ENDIF
IF IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
CLEAR_ALL_RAGE_HELP()
sRageData.bHasRaged = TRUE
ENDIF
ENDIF
ELSE
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_RAGEBAR")
CLEAR_ALL_RAGE_HELP()
ENDIF
// Clear PC specific help
IF IS_PC_VERSION()
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_RAGEBAR_KM")
CLEAR_ALL_RAGE_HELP()
ENDIF
ENDIF
ENDIF
//Create the showroom cars in script
IF interiorShowroom = NULL
interiorShowroom = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-38.62, -1099.01, 27.31>>, "v_carshowroom")
ENDIF
BOOL b_far_enough_to_delete = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<-38.62, -1099.01, 27.31>>) > 62500.0
BOOL b_close_enough_to_create = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<-38.62, -1099.01, 27.31>>) < 40000.0
IF b_close_enough_to_create
//Create Franklin's car in advance.
SETUP_FRANKLINS_CAR(vFranklinsCarStartPos, fFranklinsCarStartHeading)
REQUEST_ANIM_DICT(strShowroomCamAnims)
IF IS_INTERIOR_READY(interiorShowroom)
IF NOT DO_SHOWROOM_CARS_EXIST()
SETUP_SHOWROOM_CARS()
ENDIF
ELSE
PIN_INTERIOR_IN_MEMORY(interiorShowroom)
ENDIF
ELIF b_far_enough_to_delete
SETUP_SHOWROOM_CARS(TRUE)
REMOVE_VEHICLE(vehShowroomCars[0], TRUE)
REMOVE_VEHICLE(vehShowroomCars[1], TRUE)
REMOVE_VEHICLE(vehShowroomCars[2], TRUE)
REMOVE_VEHICLE(vehShowroomCars[3], TRUE)
IF DOES_ENTITY_EXIST(vehFranklinsCar)
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(vehFranklinsCar)) > 40000.0
REMOVE_VEHICLE(vehFranklinsCar, TRUE)
ENDIF
ENDIF
REMOVE_ANIM_DICT(strShowroomCamAnims)
IF IS_INTERIOR_READY(interiorShowroom)
UNPIN_INTERIOR(interiorShowroom)
ENDIF
ENDIF
//Fail if the player abandons the car
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sMainCars[iPlayersCar].veh)) > 40000.0
MISSION_FAILED(FAILED_ABANDONED_CAR)
ENDIF
ENDIF
//Do a streaming volume when getting close to the showroom.
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<-26.27152, -1083.75146, 25.43581>>) < 40000.0
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_START_SPHERE(<<-46.174908,-1105.760620,26.165388>>, 35.0)
//NEW_LOAD_SCENE_START(<<-77.4, -1128.3, 27.1>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<0.3, 0.0, -51.5>>), 90.0)
ENDIF
ELIF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<-26.27152, -1083.75146, 25.43581>>) > 62500.0
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
ENDIF
ENDIF
SWITCH iAudioSceneEventLoseCops
CASE 0
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF IS_AUDIO_SCENE_ACTIVE("ARM_1_LOSE_COPS")
STOP_AUDIO_SCENE("ARM_1_LOSE_COPS")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("ARM_1_DRIVE_TO_DEALERSHIP")
START_AUDIO_SCENE("ARM_1_DRIVE_TO_DEALERSHIP")
ENDIF
iAudioSceneEventLoseCops++
ENDIF
BREAK
ENDSWITCH
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
//SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
//Replace the bank gates with the map version.
INT i = 0
REPEAT COUNT_OF(objBankGates) i
REMOVE_OBJECT(objBankGates[i], FALSE)
ENDREPEAT
REPEAT COUNT_OF(objBankGateCollision) i
REMOVE_OBJECT(objBankGateCollision[i], FALSE)
ENDREPEAT
REMOVE_ANIM_DICT("map_objects")
DISABLE_TAXI_HAILING(FALSE)
SET_BUILDING_STATE(BUILDINGNAME_ES_BANK_CAR_PARK_SHUTTERS, BUILDINGSTATE_NORMAL)
FLASH_WANTED_DISPLAY(FALSE)
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_DOWN, FALSE)
KILL_FACE_TO_FACE_CONVERSATION()
SETTIMERA(0) //This is to delay the cutscene start
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_SHOWROOM_INTRO_CUTSCENE
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
JUMP_TO_STAGE(STAGE_SHOWROOM_INTRO_CUTSCENE, TRUE)
ENDIF
ENDPROC
PROC SHOWROOM_INTRO_CUTSCENE()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
OVERRIDE_LODSCALE_THIS_FRAME(1.0)
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
IF bUsedACheckpoint
START_REPLAY_SETUP(vFranklinsCarStartPos, 335.0142, FALSE)
iCurrentEvent = 99
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), vFranklinsCarStartPos)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(vFranklinsCarStartPos)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ELSE
IF interiorShowroom = NULL
interiorShowroom = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-38.62, -1099.01, 27.31>>, "v_carshowroom")
ENDIF
PIN_INTERIOR_IN_MEMORY(interiorShowroom)
SETUP_REQ_CAR_CHOICES()
IF SETUP_LAMAR(<<-37.5420, -1084.8704, 25.4344>>, 246.4778)
AND SETUP_NINEF(<<34.0424, -638.7692, 30.6252>>)
AND SETUP_RAPIDGT(<<44.0424, -638.7692, 30.6252>>)
AND SETUP_FRANKLINS_CAR(vFranklinsCarStartPos, fFranklinsCarStartHeading)
AND IS_INTERIOR_READY(interiorShowroom)
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
SETUP_REQ_PUT_PLAYER_INTO_CHOSEN_CAR()
SETUP_REQ_LAMARS_CHOSEN_CAR_IN_GARAGE()
SETUP_REQ_FORCE_ROOFS_DOWN_FOR_BOTH_CARS()
BLOCK_SCENARIOS_AT_SHOWROOM()
BLOCK_VEHICLE_GENS_IN_SHOWROOM(TRUE)
bSafeToDoSeamlessCarTasks = FALSE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
REQUEST_VEHICLE_RECORDING(CARREC_SHOWROOM_NINEF_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_SHOWROOM_NINEF_2, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_SHOWROOM_RAPIDGT_1, strCarrec)
REQUEST_VEHICLE_RECORDING(CARREC_SHOWROOM_RAPIDGT_2, strCarrec)
REQUEST_ANIM_DICT(strShowroomCamAnims)
IF SETUP_SHOWROOM_CARS(TRUE)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_SHOWROOM_NINEF_1, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_SHOWROOM_NINEF_2, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_SHOWROOM_RAPIDGT_1, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_SHOWROOM_RAPIDGT_2, strCarrec)
AND (HAS_ANIM_DICT_LOADED(strShowroomCamAnims) OR NOT bForceAnimatedCamsOn)
CLEAR_PRINTS()
CLEAR_HELP()
REMOVE_ALL_BLIPS()
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
STOP_REPLAY_RECORDING() //B* 2546603
IF IS_VEHICLE_DRIVEABLE(vehFranklinsCar)
SET_ENTITY_COORDS(vehFranklinsCar, vFranklinsCarStartPos)
SET_ENTITY_HEADING(vehFranklinsCar, fFranklinsCarStartHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(vehFranklinsCar)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
SET_VEHICLE_ENGINE_ON(sMainCars[iBuddiesCar].veh, FALSE, FALSE)
SET_VEHICLE_DOORS_LOCKED(sMainCars[iBuddiesCar].veh, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
ENDIF
//Remake the showroom cars, in case they were moved before the cutscene triggered.
REMOVE_VEHICLE(vehShowroomCars[0], TRUE)
REMOVE_VEHICLE(vehShowroomCars[1], TRUE)
REMOVE_VEHICLE(vehShowroomCars[2], TRUE)
REMOVE_VEHICLE(vehShowroomCars[3], TRUE)
SET_NUMBER_OF_PARKED_VEHICLES(0)
CLEAR_AREA(<<-42.8436, -1111.7252, 25.4355>>, 100.0, TRUE) //removes anything in the showroom
SETUP_SHOWROOM_CARS()
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-66.2173, -1121.9542, 14.8642>>, <<-41.2857, -1111.1638, 34.8642>>, FALSE)
IF IS_AUDIO_SCENE_ACTIVE("ARM_1_DRIVE_TO_DEALERSHIP")
STOP_AUDIO_SCENE("ARM_1_DRIVE_TO_DEALERSHIP")
ENDIF
INT i = 0
REPEAT COUNT_OF(vehShowroomCars) i
IF i = 0
SET_ENTITY_COORDS_NO_OFFSET(vehShowroomCars[0], <<-49.9, -1094.7, 26.0416>>)
ELIF i = 1
SET_ENTITY_COORDS_NO_OFFSET(vehShowroomCars[1], <<-46.5, -1097.5, 26.35>>)
ELIF i = 2
SET_ENTITY_COORDS_NO_OFFSET(vehShowroomCars[2], <<-41.7, -1099.5, 26.0304>>)
ELIF i = 3
SET_ENTITY_COORDS_NO_OFFSET(vehShowroomCars[3], <<-36.8, -1101.2, 26.3321>>)
ENDIF
FREEZE_ENTITY_POSITION(vehShowroomCars[i], TRUE)
ENDREPEAT
//Bring Lamar back from hiding
IF NOT IS_PED_INJURED(sLamar.ped)
SET_ENTITY_VISIBLE(sLamar.ped, TRUE)
SET_ENTITY_INVINCIBLE(sLamar.ped, FALSE)
SET_ENTITY_COLLISION(sLamar.ped, TRUE)
FREEZE_ENTITY_POSITION(sLamar.ped, FALSE)
ENDIF
CLEAR_AREA(GET_ENTITY_COORDS(sMainCars[iPlayersCar].veh), 10.0, TRUE) //Removes any cars blocking Franklin's car
CLEAR_AREA_OF_COPS(GET_ENTITY_COORDS(sMainCars[iPlayersCar].veh), 200.0)
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
SET_VEHICLE_DOORS_SHUT(sMainCars[iPlayersCar].veh)
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), sMainCars[iPlayersCar].veh)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sMainCars[iPlayersCar].veh)
ENDIF
IF GET_ENTITY_SPEED(sMainCars[iPlayersCar].veh) < 30.0
VECTOR vCarRot = GET_ENTITY_ROTATION(sMainCars[iPlayersCar].veh)
IF ABSF(vCarRot.y) < 30.0
AND ABSF(vCarRot.x) < 45.0
bSafeToDoSeamlessCarTasks = TRUE
ENDIF
ENDIF
ENDIF
IF bSafeToDoSeamlessCarTasks
IF NOT bBypassedShowroomCutLocates
SET_ROADS_IN_AREA(<<-89.0913, -1133.1434, 0.8860>>, <<13.5596, -1053.2734, 53.8860>>, TRUE)
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
TASK_VEHICLE_DRIVE_TO_COORD(PLAYER_PED_ID(), sMainCars[iPlayersCar].veh, <<-27.3, -1082.0, 26.2>>, 15.0, DRIVINGSTYLE_NORMAL,
GET_ENTITY_MODEL(sMainCars[iPlayersCar].veh), DRIVINGMODE_PLOUGHTHROUGH | DF_PreferNavmeshRoute, 2.0, 5.0)
ENDIF
ENDIF
ELSE
//Start recording of player's car (use different recordings depending on car and direction of entry).
//NOTE: only play the recording if the player didn't find a way to bypass the locates.
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
IF NOT bBypassedShowroomCutLocates
IF iPlayersCar = NINEF_INDEX
IF bTriggeredShowroomCutFromLeft
START_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh, CARREC_SHOWROOM_NINEF_1, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh, 4535.0)
ELSE
START_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh, CARREC_SHOWROOM_NINEF_2, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh, 2200.0)
ENDIF
ELSE
IF bTriggeredShowroomCutFromLeft
START_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh, CARREC_SHOWROOM_RAPIDGT_1, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh, 4435.0)
ELSE
START_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh, CARREC_SHOWROOM_RAPIDGT_2, strCarrec)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh, 3000.0)
ENDIF
ENDIF
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(sMainCars[iPlayersCar].veh)
ENDIF
ENDIF
ENDIF
DESTROY_ALL_CAMS()
IF bForceAnimatedCamsOn
camCutscene = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", TRUE)
IF bTriggeredShowroomCutFromLeft
iCameraSyncScene = CREATE_SYNCHRONIZED_SCENE(<<-58.096, -1099.135, 25.565>>, <<0.000, 0.000, -20.00>>)
PLAY_SYNCHRONIZED_CAM_ANIM(camCutscene, iCameraSyncScene, "car_dealership_int_ltr_cam", strShowroomCamAnims)
SET_SYNCHRONIZED_SCENE_PHASE(iCameraSyncScene, 0.0)
ELSE
iCameraSyncScene = CREATE_SYNCHRONIZED_SCENE(<<-58.096, -1101.335, 25.565>>, <<0.000, 0.000, -20.000>>)
PLAY_SYNCHRONIZED_CAM_ANIM(camCutscene, iCameraSyncScene, "car_dealership_int_rtl_cam", strShowroomCamAnims)
SET_SYNCHRONIZED_SCENE_PHASE(iCameraSyncScene, 0.0)
ENDIF
ELSE
camCutscene = CREATE_CAM("DEFAULT_SPLINE_CAMERA")
SET_CAM_SPLINE_SMOOTHING_STYLE(camCutscene, CAM_SPLINE_SLOW_OUT_SMOOTH)
IF bBypassedShowroomCutLocates
ADD_CAM_SPLINE_NODE_USING_CAMERA(camCutscene, CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<-77.549858,-1116.585327,27.788509>>,<<0.939515,-0.028141,-58.806252>>,35.070702, TRUE), 0)
ELSE
IF bTriggeredShowroomCutFromLeft
ADD_CAM_SPLINE_NODE_USING_CAMERA(camCutscene, CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<-77.712585,-1116.481323,27.742264>>,<<0.890156,-0.013359,-38.183346>>,35.070702, TRUE), 0)
ELSE
ADD_CAM_SPLINE_NODE_USING_CAMERA(camCutscene, CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<-77.880249,-1116.143921,27.742174>>,<<0.890156,-0.013359,-94.544067>>,35.070702, TRUE), 0)
ENDIF
ENDIF
ADD_CAM_SPLINE_NODE_USING_CAMERA(camCutscene, CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<-77.582253,-1116.546021,27.783735>>,<<0.890799,-0.014147,-60.930740>>,35.070702, TRUE),
5000, CAM_SPLINE_NODE_SMOOTH_ROT)
ADD_CAM_SPLINE_NODE_USING_CAMERA(camCutscene, CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<-77.099556,-1117.414307,27.783968>>,<<0.890799,-0.014147,-60.930740>>,35.070702, TRUE),
6700, CAM_SPLINE_NODE_SMOOTH_ROT)
//ADD_CAM_SPLINE_NODE_USING_CAMERA(camCutscene, CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<-37.8949, -1109.4103, 26.8269>>, <<-1.8127, 0.0000, -60.1200>>, 28.4800, TRUE), 7800, CAM_SPLINE_NODE_SMOOTH_ROT)
//ADD_CAM_SPLINE_NODE_USING_CAMERA(camCutscene, CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<-42.785152,-1098.559692,27.029728>>, <<-9.731533,-0.000122,103.760231>>, 36.192162, TRUE), 4400, CAM_SPLINE_NODE_SMOOTH_ROT)
ENDIF
SET_CAM_ACTIVE(camCutscene, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
//SET_FOCUS_POS_AND_VEL(<<-77.4, -1128.3, 27.1>>, <<0.0, 0.0, 0.0>>)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
TRIGGER_MUSIC_EVENT("ARM1_RADIO_OFF")
IF bBypassedShowroomCutLocates
SETTIMERB(1500)
ELSE
SETTIMERB(0)
ENDIF
//Record just arriving at the dealership, the whole scripted scene and a little after that.
REPLAY_RECORD_BACK_FOR_TIME(4.0, 12.0, REPLAY_IMPORTANCE_HIGHEST)
DO_FADE_IN_WITH_WAIT()
bWarpedCarEarlyForShowroomScene = FALSE
bCutsceneSkipped = FALSE
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
SET_CONTROL_SHAKE(PLAYER_CONTROL, 0, 0)
SETUP_LAMAR(<<-37.5420, -1084.8704, 25.4344>>, 246.4778)
SWITCH iCurrentEvent
CASE 0
IF TIMERB() > 4500
AND NOT bWarpedCarEarlyForShowroomScene
SET_ENTITY_COLLISION(sMainCars[iPlayersCar].veh, FALSE)
//1927392 - Stop the player from falling through the map.
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sMainCars[iPlayersCar].veh)
FREEZE_ENTITY_POSITION(sMainCars[iPlayersCar].veh, TRUE)
ENDIF
ENDIF
REQUEST_ANIM_DICT(strShowroomLeadInOutAnims)
REQUEST_ANIM_DICT(strLamarShowroomAnims)
VECTOR vJimmyPos, vSimeonPos
IF bTriggeredShowroomCutFromLeft
vJimmyPos = vJimmyStartPos
vSimeonPos = vSimeonStartPos
ELSE
vJimmyPos = <<-51.6, -1091.9, 25.9>>
vSimeonPos = <<-51.0, -1090.1, 25.7>>
ENDIF
IF SETUP_JIMMY(vJimmyPos, fJimmyStartHeading)
AND SETUP_SIMEON(vSimeonPos, fSimeonStartHeading)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 6, sJimmy.ped, "JIMMY")
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, sSimeon.ped, "SIMEON")
PRELOAD_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_MCS1LI", CONV_PRIORITY_MEDIUM)
IF HAS_ANIM_DICT_LOADED(strShowroomLeadInOutAnims)
AND TIMERB() > 8500
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDIF
//Help text explaining showroom as a location to get missions.
IF NOT bHasTextLabelTriggered[AR1_SHOWROOM]
IF TIMERB() > 2500
PRINT_HELP("AR1_SHOWROOM", DEFAULT_HELP_TEXT_TIME + 3000)
bHasTextLabelTriggered[AR1_SHOWROOM] = TRUE
ENDIF
ENDIF
//2006896 - If the player is using different view modes for walking and driving then we need to get them out of the car early to prevent a pop.
IF NOT bForcedFirstPersonView
IF TIMERB() > 8300
CAM_VIEW_MODE eOnFootViewMode, eInCarViewMode
eOnFootViewMode = GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT)
eInCarViewMode = GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE)
IF (eOnFootViewMode = CAM_VIEW_MODE_FIRST_PERSON AND eInCarViewMode != CAM_VIEW_MODE_FIRST_PERSON AND GET_FOLLOW_VEHICLE_CAM_ZOOM_LEVEL() != VEHICLE_ZOOM_LEVEL_BONNET)
OR (eOnFootViewMode != CAM_VIEW_MODE_FIRST_PERSON AND (eInCarViewMode = CAM_VIEW_MODE_FIRST_PERSON OR GET_FOLLOW_VEHICLE_CAM_ZOOM_LEVEL() = VEHICLE_ZOOM_LEVEL_BONNET))
ePrevCarViewMode = eInCarViewMode
SET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE, eOnFootViewMode)
bForcedFirstPersonView = TRUE
/*IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sMainCars[iPlayersCar].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh)
ENDIF
SET_ENTITY_COLLISION(sMainCars[iPlayersCar].veh, TRUE)
FREEZE_ENTITY_POSITION(sMainCars[iPlayersCar].veh, FALSE)
SET_ENTITY_HEADING(sMainCars[iPlayersCar].veh, fPlayersCarShowroomHeading)
SET_ENTITY_COORDS(sMainCars[iPlayersCar].veh, vPlayersCarInShowroom)
SET_VEHICLE_ENGINE_ON(sMainCars[iPlayersCar].veh, FALSE, FALSE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sMainCars[iPlayersCar].veh, FALSE)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sMainCars[iPlayersCar].veh)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sMainCars[iPlayersCar].veh, VS_DRIVER)
ENDIF
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID(), 0)
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE)
SET_ENTITY_VISIBLE(sMainCars[iPlayersCar].veh, FALSE)
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] On-foot and in-vehicle view modes don't match, warping car early.")
bWarpedCarEarlyForShowroomScene = TRUE*/
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
IF GET_IS_VEHICLE_ENGINE_RUNNING(sMainCars[iPlayersCar].veh)
IF TIMERB() > 8000
SET_VEHICLE_ENGINE_ON(sMainCars[iPlayersCar].veh, FALSE, FALSE)
ENDIF
ENDIF
ENDIF
//1927394 - Force the HD models early so when the cutscene ends they should be ready.
IF TIMERB() > 5000
IF NOT IS_ENTITY_DEAD(sMainCars[0].veh)
SET_FORCE_HD_VEHICLE(sMainCars[0].veh, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(sMainCars[1].veh)
SET_FORCE_HD_VEHICLE(sMainCars[1].veh, TRUE)
ENDIF
ENDIF
BREAK
ENDSWITCH
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
bCutsceneSkipped = TRUE
eSectionStage = SECTION_STAGE_SKIP
ENDIF
SETUP_CARS_OUTSIDE_SHOWROOM()
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REMOVE_VEHICLE_RECORDING(CARREC_SHOWROOM_NINEF_1, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_SHOWROOM_NINEF_2, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_SHOWROOM_RAPIDGT_1, strCarrec)
REMOVE_VEHICLE_RECORDING(CARREC_SHOWROOM_RAPIDGT_2, strCarrec)
SET_NUMBER_OF_PARKED_VEHICLES(-1)
SET_ROADS_BACK_TO_ORIGINAL(<<-89.0913, -1133.1434, 0.8860>>, <<13.5596, -1053.2734, 53.8860>>)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_MEET_SIMEON
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
WHILE NOT IS_SCREEN_FADED_OUT()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
WAIT(0)
ENDWHILE
ENDIF
IF IS_VEHICLE_DRIVEABLE(vehFranklinsCar)
SET_ENTITY_COORDS(vehFranklinsCar, vFranklinsCarStartPos)
SET_ENTITY_HEADING(vehFranklinsCar, fFranklinsCarStartHeading)
ENDIF
bWarpedCarEarlyForShowroomScene = FALSE
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDPROC
PROC MEET_SIMEON()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
//Need the interior in order to position the cars inside the showroom correctly.
IF interiorShowroom = NULL
interiorShowroom = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-38.62, -1099.01, 27.31>>, "v_carshowroom")
ENDIF
SET_ENTITY_COORDS(PLAYER_PED_ID(), vFranklinByCarPos)
PIN_INTERIOR_IN_MEMORY(interiorShowroom)
IF IS_INTERIOR_READY(interiorShowroom)
IF bUsedACheckpoint
START_REPLAY_SETUP(vFranklinByCarPos, 335.0142, FALSE)
iCurrentEvent = 99
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), vFranklinByCarPos)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(vFranklinByCarPos)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ENDIF
ELSE
SETUP_REQ_CAR_CHOICES()
IF SETUP_LAMAR(vLamarByCarPos, fLamarByCarHeading)
AND SETUP_NINEF(<<34.0424, -638.7692, 30.6252>>)
AND SETUP_RAPIDGT(<<44.0424, -638.7692, 30.6252>>)
AND SETUP_FRANKLINS_CAR(vFranklinsCarStartPos, fFranklinsCarStartHeading)
AND SETUP_CARS_OUTSIDE_SHOWROOM()
AND SETUP_SHOWROOM_CARS()
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
SETUP_REQ_LAMARS_CHOSEN_CAR_IN_GARAGE()
SETUP_REQ_FORCE_ROOFS_DOWN_FOR_BOTH_CARS()
BLOCK_SCENARIOS_AT_SHOWROOM()
bRequestedFranklinsCarAsset = TRUE
bWarpedCarEarlyForShowroomScene = FALSE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_ANIM_DICT(strShowroomLeadInOutAnims)
REQUEST_ANIM_DICT(strLamarShowroomAnims)
REQUEST_MODEL(modelLamarsPhone)
IF SETUP_JIMMY(vJimmyStartPos, fJimmyStartHeading)
AND SETUP_SIMEON(vSimeonStartPos, fSimeonStartHeading)
AND SETUP_LAMAR(<<-37.5420, -1084.8704, 25.4344>>, 246.4778)
AND HAS_ANIM_DICT_LOADED(strShowroomLeadInOutAnims)
AND HAS_ANIM_DICT_LOADED(strLamarShowroomAnims)
AND HAS_MODEL_LOADED(modelLamarsPhone)
AND (NOT IS_PED_INJURED(sLamar.ped) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(sLamar.ped))
NEW_LOAD_SCENE_STOP()
//If skipped: make sure interior is loaded in and cars outside showroom have been created.
IF IS_SCREEN_FADED_OUT()
ADD_PED_FOR_DIALOGUE(sConversationPeds, 6, sJimmy.ped, "JIMMY")
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, sSimeon.ped, "SIMEON")
PRELOAD_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_MCS1LI", CONV_PRIORITY_MEDIUM)
WHILE NOT SETUP_CARS_OUTSIDE_SHOWROOM()
WAIT(0)
ENDWHILE
IF iCurrentEvent != 99
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(vPlayersCarInShowroom, 300.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
IF NOT bWarpedCarEarlyForShowroomScene
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sMainCars[iPlayersCar].veh)
STOP_PLAYBACK_RECORDED_VEHICLE(sMainCars[iPlayersCar].veh)
ENDIF
SET_ENTITY_COLLISION(sMainCars[iPlayersCar].veh, TRUE)
FREEZE_ENTITY_POSITION(sMainCars[iPlayersCar].veh, FALSE)
SET_ENTITY_HEADING(sMainCars[iPlayersCar].veh, fPlayersCarShowroomHeading)
SET_ENTITY_COORDS(sMainCars[iPlayersCar].veh, vPlayersCarInShowroom)
SET_VEHICLE_ENGINE_ON(sMainCars[iPlayersCar].veh, FALSE, FALSE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sMainCars[iPlayersCar].veh, FALSE)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sMainCars[iPlayersCar].veh)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sMainCars[iPlayersCar].veh, VS_DRIVER)
ENDIF
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
//If we skipped the showroom intro then we might get bug 2006896 while fading in, so make sure there's some delay to hide the pop.
IF IS_SCREEN_FADED_OUT()
AND GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID(), 0)
WAIT(100)
ELSE
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID(), 100)
ENDIF
ELSE
//In certain view modes the car gets warped early, just make sure they're no longer hidden when we cut back.
SET_ENTITY_VISIBLE(sMainCars[iPlayersCar].veh, TRUE)
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sMainCars[iBuddiesCar].veh)
FREEZE_ENTITY_POSITION(sMainCars[iBuddiesCar].veh, FALSE)
SET_VEHICLE_ENGINE_ON(sMainCars[iBuddiesCar].veh, FALSE, FALSE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sMainCars[iBuddiesCar].veh, FALSE)
SET_ENTITY_HEADING(sMainCars[iBuddiesCar].veh, fLamarsCarShowroomHeading)
SET_ENTITY_COORDS(sMainCars[iBuddiesCar].veh, vLamarsCarInShowroom)
ENDIF
BOOL bPlayedIdleDuringFade = FALSE
IF NOT IS_PED_INJURED(sLamar.ped)
CLEAR_PED_TASKS_IMMEDIATELY(sLamar.ped)
sLamar.iSyncedScene = CREATE_SYNCHRONIZED_SCENE(<<-30.995, -1094.700, 25.423>>, <<-0.000, 0.000, -18.720>>)
IF IS_SCREEN_FADED_OUT()
TASK_SYNCHRONIZED_SCENE(sLamar.ped, sLamar.iSyncedScene, strLamarShowroomAnims, "leadin_loop", INSTANT_BLEND_IN, SLOW_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS, RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT | RBF_MELEE)
SET_SYNCHRONIZED_SCENE_RATE(sLamar.iSyncedScene, 1.0)
SET_SYNCHRONIZED_SCENE_LOOPED(sLamar.iSyncedScene, TRUE)
bPlayedIdleDuringFade = TRUE
ELSE
TASK_SYNCHRONIZED_SCENE(sLamar.ped, sLamar.iSyncedScene, strLamarShowroomAnims, "leadin_action", INSTANT_BLEND_IN, SLOW_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS, RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT | RBF_MELEE)
SET_SYNCHRONIZED_SCENE_RATE(sLamar.iSyncedScene, 0.98)
SET_SYNCHRONIZED_SCENE_LOOPED(sLamar.iSyncedScene, FALSE)
ENDIF
TASK_LOOK_AT_ENTITY(sLamar.ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
objLamarsPhone = CREATE_OBJECT(modelLamarsPhone, <<-30.990, -1094.082, 25.423>>)
ATTACH_ENTITY_TO_ENTITY(objLamarsPhone, sLamar.ped, GET_PED_BONE_INDEX(sLamar.ped, BONETAG_PH_R_HAND), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
SET_MODEL_AS_NO_LONGER_NEEDED(modelLamarsPhone)
ENDIF
CLEAR_HELP()
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-66.2173, -1121.9542, 14.8642>>, <<-41.2857, -1111.1638, 34.8642>>, TRUE)
REMOVE_ANIM_DICT(strShowroomCamAnims)
BLOCK_VEHICLE_GENS_IN_SHOWROOM(TRUE)
CLEAR_TRIGGERED_LABELS()
TRIGGER_MUSIC_EVENT("ARM1_RADIO_ON")
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(sMainCars[0].veh)
SET_FORCE_HD_VEHICLE(sMainCars[0].veh, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(sMainCars[1].veh)
SET_FORCE_HD_VEHICLE(sMainCars[1].veh, TRUE)
ENDIF
WAIT(0)
ENDWHILE
ENDIF
IF bPlayedIdleDuringFade
AND NOT IS_PED_INJURED(sLamar.ped)
sLamar.iSyncedScene = CREATE_SYNCHRONIZED_SCENE(<<-30.995, -1094.700, 25.423>>, <<-0.000, 0.000, -18.720>>)
TASK_SYNCHRONIZED_SCENE(sLamar.ped, sLamar.iSyncedScene, strLamarShowroomAnims, "leadin_action", NORMAL_BLEND_IN, SLOW_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS, RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT | RBF_MELEE)
SET_SYNCHRONIZED_SCENE_PHASE(sLamar.iSyncedScene, 0.0)
SET_SYNCHRONIZED_SCENE_RATE(sLamar.iSyncedScene, 0.97)
SET_SYNCHRONIZED_SCENE_LOOPED(sLamar.iSyncedScene, FALSE)
ENDIF
//Do this after the fade so it syncs with the dialogue
IF NOT IS_PED_INJURED(sJimmy.ped)
AND NOT IS_PED_INJURED(sSimeon.ped)
iSyncSceneJimmySimeon = CREATE_SYNCHRONIZED_SCENE(<<-39.546, -1092.790, 25.422>>, <<0.0, 0.0, 0.0>>)
TASK_SYNCHRONIZED_SCENE(sSimeon.ped, iSyncSceneJimmySimeon, strShowroomLeadInOutAnims, "_leadin_simeon", INSTANT_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT)
TASK_SYNCHRONIZED_SCENE(sJimmy.ped, iSyncSceneJimmySimeon, strShowroomLeadInOutAnims, "_leadin_jimmy", INSTANT_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneJimmySimeon, 0.35)
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
DISABLE_CONTROLS_INSIDE_SHOWROOM()
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVEBLENDRATIO_WALK)
SETTIMERA(0)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
DISABLE_CONTROLS_INSIDE_SHOWROOM()
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVEBLENDRATIO_WALK)
#IF IS_DEBUG_BUILD
DONT_DO_J_SKIP(sLocatesData)
#ENDIF
IF NOT bHasTextLabelTriggered[ARM1_MCS1LI]
AND NOT IS_PED_INJURED(sSimeon.ped)
AND NOT IS_PED_INJURED(sJimmy.ped)
BEGIN_PRELOADED_CONVERSATION()
bHasTextLabelTriggered[ARM1_MCS1LI] = TRUE
//IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(sConversationPeds, "ARM1AUD", "ARM1_MCS1LI", "ARM1_MCS1LI_3", CONV_PRIORITY_MEDIUM)
// bHasTextLabelTriggered[ARM1_MCS1LI] = TRUE
//ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(sMainCars[0].veh)
SET_FORCE_HD_VEHICLE(sMainCars[0].veh, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(sMainCars[1].veh)
SET_FORCE_HD_VEHICLE(sMainCars[1].veh, TRUE)
ENDIF
//2006896 - If we forced the cam view earlier then make sure it's reset once the player gets out the car. Also make sure they can't change the view themselves.
IF bForcedFirstPersonView
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
SET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE, ePrevCarViewMode)
bForcedFirstPersonView = FALSE
ELSE
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
ENDIF
ENDIF
SWITCH iCurrentEvent
CASE 0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-34.079700,-1094.802368,25.172342>>, <<-35.014748,-1097.344482,27.672344>>, 9.500000)
SET_GAMEPLAY_COORD_HINT(GET_ENTITY_COORDS(vehShowroomCars[1], FALSE), -1, 2500)
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(0.6)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(0.015)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(0.05)
SET_GAMEPLAY_HINT_FOV(30.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(), <<-39.6, -1097.0, 25.6>>, PEDMOVE_WALK, -1, 0.25, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
IF NOT IS_PED_INJURED(sSimeon.ped)
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sSimeon.ped, -1, SLF_WHILE_NOT_IN_FOV)
ENDIF
iCurrentEvent++
ENDIF
BREAK
ENDSWITCH
IF NOT IS_PED_INJURED(sSimeon.ped)
AND NOT IS_PED_INJURED(sJimmy.ped)
AND NOT IS_PED_INJURED(sLamar.ped)
IF NOT DOES_BLIP_EXIST(sSimeon.blip)
sSimeon.blip = CREATE_BLIP_FOR_ENTITY(sSimeon.ped)
ENDIF
SET_PED_MOVE_RATE_OVERRIDE(PLAYER_PED_ID(), 0.87)
//No longer needed: the focus push deals with player control.
//IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sJimmy.ped)) < 25.0
// SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
//ENDIF
IF IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneJimmySimeon) AND GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneJimmySimeon) >= 0.9
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(objLamarsPhone)
IF HAS_ANIM_EVENT_FIRED(sLamar.ped, HASH("Phone_Disappear"))
REMOVE_OBJECT(objLamarsPhone, TRUE)
ENDIF
ENDIF
//Progress if any of the following conditions are met:
// - The player hits the locate and the current conversation line is killed.
// - Simeon and Jimmy's scene plays out fully.
// - The player tries to leave the area.
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-38.590809,-1095.906860,25.422304>>, <<-51.048512,-1100.539063,27.422304>>, 10.500000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-26.404922,-1086.267212,25.573242>>, <<-31.385181,-1084.527832,27.573242>>, 2.250000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-37.614616,-1108.703613,25.455927>>, <<-38.443035,-1110.918457,27.436029>>, 2.250000)
OR IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneJimmySimeon) AND GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneJimmySimeon) >= 0.99
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDIF
//Request the garage cutscene in advance.
REQUEST_CUTSCENE(strGarageCutscene)
SET_CUTSCENE_PED_COMPONENT_VARIATIONS(strGarageCutscene)
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REMOVE_ALL_BLIPS()
KILL_FACE_TO_FACE_CONVERSATION()
REMOVE_OBJECT(objLamarsPhone, TRUE)
SETTIMERA(0)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_SHOWROOM_CUTSCENE
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDPROC
PROC SHOWROOM_CUTSCENE()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
//Need the interior in order to position the cars inside the showroom correctly.
IF interiorShowroom = NULL
interiorShowroom = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-38.62, -1099.01, 27.31>>, "v_carshowroom")
ENDIF
SET_ENTITY_COORDS(PLAYER_PED_ID(), vJimmyStartPos)
PIN_INTERIOR_IN_MEMORY(interiorShowroom)
IF IS_INTERIOR_READY(interiorShowroom)
IF bUsedACheckpoint
START_REPLAY_SETUP(vJimmyStartPos, 335.0142, FALSE)
iCurrentEvent = 99
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), vJimmyStartPos)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(vJimmyStartPos)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ENDIF
ELSE
REQUEST_ANIM_DICT(strShowroomLeadInOutAnims)
SETUP_REQ_CAR_CHOICES()
IF SETUP_LAMAR(vLamarByCarPos, fLamarByCarHeading)
AND SETUP_NINEF(<<34.0424, -638.7692, 30.6252>>)
AND SETUP_RAPIDGT(<<44.0424, -638.7692, 30.6252>>)
AND SETUP_FRANKLINS_CAR(vFranklinsCarStartPos, fFranklinsCarStartHeading)
AND SETUP_JIMMY(vJimmyStartPos, fJimmyStartHeading)
AND SETUP_SIMEON(vSimeonStartPos, fSimeonStartHeading)
AND SETUP_CARS_OUTSIDE_SHOWROOM()
AND SETUP_SHOWROOM_CARS()
AND HAS_ANIM_DICT_LOADED(strShowroomLeadInOutAnims)
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
SETUP_REQ_LAMARS_CHOSEN_CAR_IN_GARAGE()
SETUP_REQ_FORCE_ROOFS_DOWN_FOR_BOTH_CARS()
SET_ENTITY_COORDS(PLAYER_PED_ID(), vFranklinByCarPos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fFranklinByCarHeading)
BLOCK_SCENARIOS_AT_SHOWROOM()
bRequestedFranklinsCarAsset = TRUE
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(strGarageCutscene)
SET_CUTSCENE_PED_COMPONENT_VARIATIONS(strGarageCutscene)
IF NOT IS_ENTITY_DEAD(sMainCars[0].veh)
SET_FORCE_HD_VEHICLE(sMainCars[0].veh, TRUE)
ENDIF
IF NOT IS_ENTITY_DEAD(sMainCars[1].veh)
SET_FORCE_HD_VEHICLE(sMainCars[1].veh, TRUE)
ENDIF
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
AND (NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF) OR TIMERA() > 5000) //If dialogue starts late this may look odd.
IF NOT IS_PED_INJURED(sLamar.ped)
TASK_CLEAR_LOOK_AT(sLamar.ped)
REGISTER_ENTITY_FOR_CUTSCENE(sLamar.ped, "Lamar", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sJimmy.ped)
REGISTER_ENTITY_FOR_CUTSCENE(sJimmy.ped, "Jimmy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(sSimeon.ped)
REGISTER_ENTITY_FOR_CUTSCENE(sSimeon.ped, "Siemon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vehShowroomCars[0])
//REGISTER_ENTITY_FOR_CUTSCENE(vehShowroomCars[0], "Dealership_Car_2", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
REGISTER_ENTITY_FOR_CUTSCENE(vehShowroomCars[0], "ninef^1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vehShowroomCars[1])
REGISTER_ENTITY_FOR_CUTSCENE(vehShowroomCars[1], "Jimmys_Car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vehShowroomCars[2])
REGISTER_ENTITY_FOR_CUTSCENE(vehShowroomCars[2], "Franklin_stealcar", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vehShowroomCars[3])
//REGISTER_ENTITY_FOR_CUTSCENE(vehShowroomCars[3], "Dealership_Car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
REGISTER_ENTITY_FOR_CUTSCENE(vehShowroomCars[3], "bjxl^1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
START_CUTSCENE()
//Lamar sometimes walks the wrong way on his exit state, so add a navmesh block.
//iShowroomPedBlockingArea = ADD_NAVMESH_BLOCKING_OBJECT(<<-59.5004, -1094.0771, 25.4223>>, <<4.0, 4.0, 3.0>>, 72.3459)
iShowroomPedBlockingArea = ADD_NAVMESH_BLOCKING_OBJECT(<<-59.0, -1095.8, 25.4223>>, <<10.0, 4.0, 3.0>>, DEG_TO_RAD(-67.2459))
iShowroomPedBlockingArea2 = ADD_NAVMESH_BLOCKING_OBJECT(<<-37.4137, -1108.5670, 25.4223>>, <<4.0, 4.0, 3.0>>, DEG_TO_RAD(72.3459))
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
SETTIMERB(0)
SETTIMERA(0)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
SWITCH iCurrentEvent
CASE 0 //Reposition the stolen cars to their final spots.
IF IS_CUTSCENE_PLAYING()
CLEAR_PRINTS()
CLEAR_HELP()
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
SET_ENTITY_COLLISION(sMainCars[iPlayersCar].veh, TRUE)
SET_ENTITY_COORDS(sMainCars[iPlayersCar].veh, vPlayersCarInShowroom)
SET_ENTITY_HEADING(sMainCars[iPlayersCar].veh, fPlayersCarShowroomHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(sMainCars[iPlayersCar].veh)
FREEZE_ENTITY_POSITION(sMainCars[iPlayersCar].veh, TRUE)
SET_VEHICLE_DOORS_LOCKED(sMainCars[iPlayersCar].veh, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
SET_VEHICLE_ENGINE_ON(sMainCars[iPlayersCar].veh, FALSE, FALSE)
ENDIF
STOP_GAMEPLAY_HINT(TRUE)
REMOVE_ANIM_DICT(strLamarShowroomAnims)
REMOVE_ANIM_DICT(strShowroomLeadInOutAnims)
DO_FADE_IN_WITH_WAIT()
iCurrentEvent++
ENDIF
BREAK
ENDSWITCH
//IF IS_CUTSCENE_PLAYING()
// SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
// SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
//ENDIF
SETUP_FRANKLINS_CAR(vFranklinsCarStartPos, fFranklinsCarStartHeading)
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
bCutsceneSkipped = TRUE
ENDIF
IF NOT IS_CUTSCENE_ACTIVE()
eSectionStage = SECTION_STAGE_CLEANUP
ELSE
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("Franklin", GET_ENTITY_MODEL(PLAYER_PED_ID()))
//SET_ENTITY_COORDS(PLAYER_PED_ID(), vFranklinByCarPos)
//SET_ENTITY_HEADING(PLAYER_PED_ID(), fFranklinByCarHeading)
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 2000, fFranklinByCarHeading, FALSE)
//FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
ENDIF
IF NOT IS_PED_INJURED(sLamar.ped)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lamar", GET_ENTITY_MODEL(sLamar.ped))
SET_ENTITY_COORDS(sLamar.ped, vLamarByCarPos)
SET_ENTITY_HEADING(sLamar.ped, fLamarByCarHeading)
IF IS_VEHICLE_DRIVEABLE(vehFranklinsCar)
TASK_ENTER_VEHICLE(sLamar.ped, vehFranklinsCar, 40000, VS_FRONT_RIGHT, PEDMOVE_WALK)
FORCE_PED_MOTION_STATE(sLamar.ped, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
ENDIF
ENDIF
ENDIF
ENDIF
REQUEST_ANIM_DICT(strShowroomLeadInOutAnims)
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REPLAY_STOP_EVENT()
REMOVE_ALL_BLIPS()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
SETTIMERA(0)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_GO_TO_HOUSE
AWARD_ACHIEVEMENT_FOR_MISSION(ACH00) // Welcome To Los Santos
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
DO_FADE_OUT_WITH_WAIT()
REPLAY_STOP_EVENT()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
IF IS_CUTSCENE_PLAYING()
STOP_CUTSCENE()
ENDIF
REMOVE_CUTSCENE()
WHILE IS_CUTSCENE_ACTIVE()
OR NOT SETUP_FRANKLINS_CAR(vFranklinsCarStartPos, fFranklinsCarStartHeading)
WAIT(0)
ENDWHILE
IF IS_VEHICLE_DRIVEABLE(vehFranklinsCar)
SET_ENTITY_COORDS(vehFranklinsCar, vFranklinsCarStartPos)
SET_ENTITY_HEADING(vehFranklinsCar, fFranklinsCarStartHeading)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
SET_ENTITY_COLLISION(sMainCars[iPlayersCar].veh, TRUE)
SET_ENTITY_HEADING(sMainCars[iPlayersCar].veh, fPlayersCarShowroomHeading)
SET_ENTITY_COORDS(sMainCars[iPlayersCar].veh, vPlayersCarInShowroom)
SET_VEHICLE_ON_GROUND_PROPERLY(sMainCars[iPlayersCar].veh)
FREEZE_ENTITY_POSITION(sMainCars[iPlayersCar].veh, TRUE)
SET_VEHICLE_DOORS_LOCKED(sMainCars[iPlayersCar].veh, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
SET_VEHICLE_ENGINE_ON(sMainCars[iPlayersCar].veh, FALSE, FALSE)
ENDIF
IF NOT IS_PED_INJURED(sLamar.ped)
SET_ENTITY_COORDS(sLamar.ped, vLamarByCarPos)
SET_ENTITY_HEADING(sLamar.ped, fLamarByCarHeading)
ENDIF
SET_ENTITY_COORDS(PLAYER_PED_ID(), vFranklinByCarPos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fFranklinByCarHeading)
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDPROC
PROC GO_TO_HOUSE()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
//Need the interior in order to position the cars inside the showroom correctly.
IF interiorShowroom = NULL
interiorShowroom = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-38.62, -1099.01, 27.31>>, "v_carshowroom")
ENDIF
SET_ENTITY_COORDS(PLAYER_PED_ID(), vFranklinByCarPos)
PIN_INTERIOR_IN_MEMORY(interiorShowroom)
IF bUsedACheckpoint
START_REPLAY_SETUP(vFranklinByCarPos, fFranklinByCarHeading, FALSE)
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), vFranklinByCarPos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fFranklinByCarHeading)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(vFranklinByCarPos)
WAIT(0)
ENDIF
SETUP_REQ_CAR_CHOICES()
WHILE NOT IS_INTERIOR_READY(interiorShowroom)
OR NOT SETUP_CARS_OUTSIDE_SHOWROOM()
OR NOT SETUP_SHOWROOM_CARS()
OR NOT DOES_ENTITY_EXIST(sLamar.ped)
OR NOT DOES_ENTITY_EXIST(sMainCars[0].veh)
OR NOT DOES_ENTITY_EXIST(sMainCars[1].veh)
OR NOT DOES_ENTITY_EXIST(vehFranklinsCar)
OR NOT DOES_ENTITY_EXIST(sJimmy.ped)
OR NOT DOES_ENTITY_EXIST(sSimeon.ped)
OR NOT HAS_VEHICLE_ASSET_LOADED(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_CAR))
OR NOT HAS_ANIM_DICT_LOADED(strShowroomLeadInOutAnims)
REQUEST_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_CAR))
REQUEST_ANIM_DICT(strShowroomLeadInOutAnims)
PIN_INTERIOR_IN_MEMORY(interiorShowroom)
SETUP_LAMAR(vLamarByCarPos, fLamarByCarHeading)
SETUP_NINEF(<<34.0424, -638.7692, 30.6252>>)
SETUP_RAPIDGT(<<44.0424, -638.7692, 30.6252>>)
SETUP_FRANKLINS_CAR(vFranklinsCarStartPos, fFranklinsCarStartHeading)
SETUP_JIMMY(vJimmyStartPos, fJimmyStartHeading)
SETUP_SIMEON(vSimeonStartPos, fSimeonStartHeading)
WAIT(0)
ENDWHILE
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SETUP_REQ_LAMARS_CHOSEN_CAR_IN_GARAGE()
SETUP_REQ_FORCE_ROOFS_DOWN_FOR_BOTH_CARS()
SET_ENTITY_COORDS(PLAYER_PED_ID(), vFranklinByCarPos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fFranklinByCarHeading)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
SET_ENTITY_COORDS(sMainCars[iPlayersCar].veh, <<-30.5774, -1090.5625, 25.4222>>)
SET_ENTITY_HEADING(sMainCars[iPlayersCar].veh, 159.6013)
FREEZE_ENTITY_POSITION(sMainCars[iPlayersCar].veh, TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sMainCars[iPlayersCar].veh, FALSE)
ENDIF
iShowroomPedBlockingArea = ADD_NAVMESH_BLOCKING_OBJECT(<<-59.0, -1095.8, 25.4223>>, <<10.0, 4.0, 3.0>>, DEG_TO_RAD(-67.2459))
iShowroomPedBlockingArea2 = ADD_NAVMESH_BLOCKING_OBJECT(<<-37.4137, -1108.5670, 25.4223>>, <<4.0, 4.0, 3.0>>, 72.3459)
BLOCK_SCENARIOS_AT_SHOWROOM()
iCurrentEvent = 99
bRequestedFranklinsCarAsset = TRUE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF eSectionStage = SECTION_STAGE_SETUP
//Interior is no longer needed
IF interiorShowroom != NULL
IF IS_INTERIOR_READY(interiorShowroom)
UNPIN_INTERIOR(interiorShowroom)
interiorShowroom = NULL
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(sMainCars[0].veh)
SET_VEHICLE_ENGINE_ON(sMainCars[0].veh, FALSE, FALSE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sMainCars[0].veh, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(sMainCars[1].veh)
SET_VEHICLE_ENGINE_ON(sMainCars[1].veh, FALSE, FALSE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(sMainCars[1].veh, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vehFranklinsCar)
SET_VEHICLE_FIXED(vehFranklinsCar)
ENDIF
//If skipped: make sure interior is loaded in and cars outside showroom have been created.
IF IS_SCREEN_FADED_OUT()
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-38.0770, -1096.4669, 25.4223>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 296.6170)
IF NOT IS_PED_INJURED(sLamar.ped)
SET_ENTITY_COORDS(sLamar.ped, vLamarByCarPos)
SET_ENTITY_HEADING(sLamar.ped, fLamarByCarHeading)
ENDIF
WHILE NOT SETUP_CARS_OUTSIDE_SHOWROOM()
WAIT(0)
ENDWHILE
IF iCurrentEvent != 99
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(vFranklinByCarPos, 100.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION, 5000)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vehFranklinsCar)
AND NOT IS_PED_INJURED(sLamar.ped)
TASK_ENTER_VEHICLE(sLamar.ped, vehFranklinsCar, 40000, VS_FRONT_RIGHT, PEDMOVE_WALK)
ENDIF
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 2000, 296.6170, FALSE)
WAIT(500)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ENDIF
BLOCK_VEHICLE_GENS_IN_SHOWROOM(TRUE)
IF NOT IS_AUDIO_SCENE_ACTIVE("ARM_1_GO_HOME")
START_AUDIO_SCENE("ARM_1_GO_HOME")
ENDIF
IF NOT IS_PED_INJURED(sJimmy.ped)
AND NOT IS_PED_INJURED(sSimeon.ped)
IF HAS_ANIM_DICT_LOADED(strShowroomLeadInOutAnims)
iSyncSceneJimmySimeon = CREATE_SYNCHRONIZED_SCENE(<<-39.546, -1092.790, 25.422>>, <<0.0, 0.0, 0.0>>)
TASK_SYNCHRONIZED_SCENE(sSimeon.ped, iSyncSceneJimmySimeon, strShowroomLeadInOutAnims, "_leadout_simeon", INSTANT_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT)
TASK_SYNCHRONIZED_SCENE(sJimmy.ped, iSyncSceneJimmySimeon, strShowroomLeadInOutAnims, "_leadout_jimmy", INSTANT_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT)
SET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneJimmySimeon, 0.0)
ENDIF
TASK_LOOK_AT_ENTITY(sSimeon.ped, sJimmy.ped, -1, SLF_WHILE_NOT_IN_FOV)
ENDIF
DO_FADE_IN_WITH_WAIT()
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_MAX_WANTED_LEVEL(5)
//Unfreeze the cars at this point.
IF NOT IS_ENTITY_DEAD(sMainCars[0].veh)
FREEZE_ENTITY_POSITION(sMainCars[0].veh, FALSE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sMainCars[0].veh, TRUE)
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sMainCars[0].veh)
ENDIF
IF NOT IS_ENTITY_DEAD(sMainCars[1].veh)
FREEZE_ENTITY_POSITION(sMainCars[1].veh, FALSE)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sMainCars[1].veh, TRUE)
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sMainCars[1].veh)
ENDIF
//Set the cars outside the showroom as no longer needed.
REMOVE_VEHICLE(vehCarsOutsideShowroom[0])
//SET_SAVEHOUSE_RESPAWN_AVAILABLE(SAVEHOUSE_FRANKLIN_SC, TRUE)
CLEAR_TRIGGERED_LABELS()
SET_DOOR_STATE(DOORNAME_F_HOUSE_SC_B, DOORSTATE_LOCKED)
SET_DOOR_STATE(DOORNAME_F_HOUSE_SC_F, DOORSTATE_LOCKED)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CHECKPOINT_GO_HOME, "GO_TO_HOUSE", TRUE)
SETTIMERA(0)
sSimeon.iEvent = 0
iStatsHelpTextTimer = 0
iMeleeDialogueTimer = 0
iCurrentEvent = 0
bPlayerHasBeenInCar = FALSE
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
#IF IS_DEBUG_BUILD
DONT_DO_J_SKIP(sLocatesData)
#ENDIF
SET_DOOR_STATE(DOORNAME_F_HOUSE_SC_G, DOORSTATE_FORCE_UNLOCKED_THIS_FRAME)
//2186588 - Disable replay camera movement just after the cutscene, as some peds pop in and out of view.
IF TIMERA() < 3000
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
ENDIF
//1000197 - Have Lamar walk to the car.
IF NOT IS_PED_INJURED(sLamar.ped)
IF NOT bPlayerHasBeenInCar
SET_BIT(sLocatesData.iLocatesBitSet, BS_BUDDIES_WILL_WALK_TO_SPECIFIC_VEHICLE)
SET_PED_MAX_MOVE_BLEND_RATIO(sLamar.ped, PEDMOVE_WALK)
IF NOT IS_ENTITY_DEAD(vehFranklinsCar)
AND IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vehFranklinsCar)
CLEAR_BIT(sLocatesData.iLocatesBitSet, BS_BUDDIES_WILL_WALK_TO_SPECIFIC_VEHICLE)
IF NOT IS_PED_IN_VEHICLE(sLamar.ped, vehFranklinsCar)
TASK_ENTER_VEHICLE(sLamar.ped, vehFranklinsCar, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT, PEDMOVE_RUN)
ENDIF
bPlayerHasBeenInCar = TRUE
ENDIF
ENDIF
ENDIF
SWITCH iCurrentEvent
CASE 0 //Play Jimmy convo first, then Lamar's line.
IF NOT DOES_BLIP_EXIST(blipCurrentDestination)
IF IS_VEHICLE_DRIVEABLE(vehFranklinsCar)
blipCurrentDestination = CREATE_BLIP_FOR_ENTITY(vehFranklinsCar)
ENDIF
ENDIF
IF NOT bHasTextLabelTriggered[ARM1_MCS1LO]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
ADD_PED_FOR_DIALOGUE(sConversationPeds, 6, sJimmy.ped, "JIMMY")
ADD_PED_FOR_DIALOGUE(sConversationPeds, 4, sSimeon.ped, "SIMEON")
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_GETINJ", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_MCS1LO] = TRUE
ENDIF
ENDIF
ELSE
/*IF NOT bAlreadyPlayedCarTrashedDialogue
AND NOT IS_ENTITY_DEAD(sMainCars[iPlayersCar].veh)
AND iPlayersHealthBeforeRace - GET_ENTITY_HEALTH(sMainCars[iPlayersCar].veh) > 250
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ARM1_CAR_DAMAGED, TRUE)
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_BEATUP", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_LEAVEG] = TRUE
iCurrentEvent++
ENDIF
ELSE
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_LEAVEG", "ARM1_LEAVEG_1", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_LEAVEG] = TRUE
iCurrentEvent++
ENDIF
ENDIF*/
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_LEAVEG", "ARM1_LEAVEG_1", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_LEAVEG] = TRUE
iCurrentEvent++
ENDIF
ENDIF
BREAK
CASE 1
IF DOES_BLIP_EXIST(blipCurrentDestination)
REMOVE_BLIP(blipCurrentDestination)
ENDIF
IF IS_PLAYER_AT_LOCATION_WITH_BUDDY_IN_VEHICLE(sLocatesData, vFranklinsHouse, <<0.001, 0.001, LOCATE_SIZE_HEIGHT>>, TRUE, sLamar.ped, vehFranklinsCar,
"AR1_HOME", "AR1_WAIT", "CMN_GENGETINY", "CMN_GENGETBCKY", FALSE, TRUE)
//Fake locate size: just using for the blips, god text, etc.
iCurrentEvent++
ELSE
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
//Help text on how to view stats.
IF NOT bHasTextLabelTriggered[AR1_VIEWSTATS]
IF iStatsHelpTextTimer = 0
iStatsHelpTextTimer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - iStatsHelpTextTimer > 7000
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
//B*1032162 - Clear the print before the standard god text time.
IF IS_THIS_PRINT_BEING_DISPLAYED("AR1_HOME")
CLEAR_PRINTS()
ENDIF
PRINT_HELP("AR1_VIEWSTATS", DEFAULT_HELP_TEXT_TIME + 5000)
bHasTextLabelTriggered[AR1_VIEWSTATS] = TRUE
iStatsHelpTextTimer = 0
ENDIF
ENDIF
ELIF NOT bHasTextLabelTriggered[AR1_VIEWSTATS2]
IF NOT IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_CHARACTER_WHEEL)
iStatsHelpTextTimer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - iStatsHelpTextTimer > 250
AND IS_SELECTOR_ONSCREEN()
PRINT_HELP("AR1_VIEWSTATS2", DEFAULT_HELP_TEXT_TIME + 5000)
bHasTextLabelTriggered[AR1_VIEWSTATS2] = TRUE
ENDIF
ENDIF
IF bRequestedFranklinsCarAsset
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_CAR))
bRequestedFranklinsCarAsset = FALSE
ENDIF
//B*1045971 - Change the locate size based on how fast the player is going.
FLOAT fLocateWidth, fMaxSpeed, fCurrentSpeed
fMaxSpeed = 12.0
fCurrentSpeed = GET_ENTITY_SPEED(vehFranklinsCar)
IF fCurrentSpeed < 3.0
fCurrentSpeed = 3.0
ELIF fCurrentSpeed > fMaxSpeed
fCurrentSpeed = fMaxSpeed
ENDIF
fLocateWidth = 2.0 + (((fCurrentSpeed - 3.0) / (fMaxSpeed - 3.0)) * 8.5)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-27.677097,-1427.279419,29.669218>>, <<-23.049107,-1427.299805,32.159901>>, fLocateWidth)
AND CAN_PLAYER_START_CUTSCENE(TRUE, TRUE)
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
SET_WANTED_LEVEL_MULTIPLIER(0.0)
fSpeedWhenHitFinalLocate = fCurrentSpeed
iCurrentEvent++
ELSE
//Dialogue
IF TIMERA() > 1000
AND ARE_CHARS_SITTING_IN_SAME_VEHICLE(PLAYER_PED_ID(), sLamar.ped)
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
ENDIF
IF NOT bHasTextLabelTriggered[ARM1_DRIV]
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_DRIV2A", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_DRIV] = TRUE
ENDIF
ENDIF
ELIF NOT bHasTextLabelTriggered[ARM1_ATHOME]
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-16.964743,-1462.946655,29.157858>>, <<-17.416340,-1431.480103,36.682789>>, 22.250000)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_ATHOME", CONV_PRIORITY_MEDIUM)
bHasTextLabelTriggered[ARM1_ATHOME] = TRUE
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF bHasTextLabelTriggered[ARM1_DRIV]
OR bHasTextLabelTriggered[ARM1_ATHOME]
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
VEHICLE_INDEX vehFinalCar
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
vehFinalCar = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
ENDIF
BOOl bHasStopped
IF IS_VEHICLE_DRIVEABLE(vehFinalCar)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_PHONE)
FLOAT fStopDistance
IF fSpeedWhenHitFinalLocate > 3.0 AND fSpeedWhenHitFinalLocate < 12.0
fStopDistance = 2.0
ELSE
fStopDistance = 3.5
ENDIF
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vehFinalCar, fStopDistance, 1)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON | SPC_ALLOW_PLAYER_DAMAGE)
bHasStopped = TRUE
ENDIF
ELSE
bHasStopped = TRUE
ENDIF
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
ENDIF
IF NOT bHasTextLabelTriggered[ARM1_ATHOME]
IF IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
KILL_FACE_TO_FACE_CONVERSATION()
ELIF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_ATHOME", CONV_PRIORITY_MEDIUM)
//PAUSE_FACE_TO_FACE_CONVERSATION(FALSE) //just in case the conversation during the drive was paused (if it's paused the cutscene will never load).
bHasTextLabelTriggered[ARM1_ATHOME] = TRUE
ENDIF
ELSE
IF bHasStopped
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON | SPC_ALLOW_PLAYER_DAMAGE)
eSectionStage = SECTION_STAGE_CLEANUP
ENDIF
ENDIF
BREAK
ENDSWITCH
//Request the house cutscene in advance (the PC version has streaming issues so make it smaller).
IF IS_PC_VERSION()
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vFranklinsHouse) < (20.0 * 20.0)
REQUEST_CUTSCENE(strHouseCutscene)
SET_CUTSCENE_PED_COMPONENT_VARIATIONS(strHouseCutscene)
ELIF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vFranklinsHouse) > (30.0 * 30.0)
IF IS_CUTSCENE_ACTIVE()
REMOVE_CUTSCENE()
ENDIF
ENDIF
ELSE
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vFranklinsHouse) < (DEFAULT_CUTSCENE_LOAD_DIST * DEFAULT_CUTSCENE_LOAD_DIST)
REQUEST_CUTSCENE(strHouseCutscene)
SET_CUTSCENE_PED_COMPONENT_VARIATIONS(strHouseCutscene)
ELIF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vFranklinsHouse) > (DEFAULT_CUTSCENE_UNLOAD_DIST * DEFAULT_CUTSCENE_UNLOAD_DIST)
IF IS_CUTSCENE_ACTIVE()
REMOVE_CUTSCENE()
ENDIF
ENDIF
ENDIF
//Garage help
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF NOT bHasTextLabelTriggered[AR1_GARHELP1]
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-24.229092,-1451.200806,29.760489>>, <<-23.506229,-1430.866455,32.157558>>, 7.000000)
PRINT_HELP("AR1_GARHELP1", DEFAULT_HELP_TEXT_TIME + 5000)
bHasTextLabelTriggered[AR1_GARHELP1] = TRUE
ENDIF
ENDIF
ENDIF
//Unique vehicle help and mod apps.
IF NOT bHasTextLabelTriggered[AR1_UNIQUE]
IF IS_VEHICLE_DRIVEABLE(vehFranklinsCar)
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(vehFranklinsCar)) < 225.0
AND IS_ENTITY_ON_SCREEN(vehFranklinsCar)
PRINT_HELP("AR1_UNIQUE", DEFAULT_HELP_TEXT_TIME + 5000)
bHasTextLabelTriggered[AR1_UNIQUE] = TRUE
ENDIF
ENDIF
ELIF NOT bHasTextLabelTriggered[AR1_APPHELP]
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
#IF NOT FEATURE_GEN9_STANDALONE PRINT_HELP("AR1_APPHELP", DEFAULT_HELP_TEXT_TIME + 5000) #ENDIF
bHasTextLabelTriggered[AR1_APPHELP] = TRUE
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sSimeon.ped)
AND NOT IS_PED_INJURED(sJimmy.ped)
VEHICLE_INDEX vehClosest[1]
SWITCH sSimeon.iEvent
CASE 0
IF (IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneJimmySimeon) AND GET_SYNCHRONIZED_SCENE_PHASE(iSyncSceneJimmySimeon) > 0.0)
OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneJimmySimeon)
GET_PED_NEARBY_VEHICLES(sSimeon.ped, vehClosest)
IF IS_VEHICLE_DRIVEABLE(vehClosest[0])
TASK_ENTER_VEHICLE(sJimmy.ped, vehClosest[0], DEFAULT_TIME_BEFORE_WARP, VS_DRIVER, PEDMOVE_WALK)
TASK_ENTER_VEHICLE(sSimeon.ped, vehClosest[0], DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT, PEDMOVE_WALK)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sJimmy.ped, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSimeon.ped, TRUE)
iNumJimmySimeonConversationsPlayed = 0
iNumTimesPlayedSimeonDialogue = 0
sSimeon.iEvent++
ENDIF
ENDIF
BREAK
CASE 1
//Play ambient lines if the car is damaged by the player.
IF IS_PED_SITTING_IN_ANY_VEHICLE(sJimmy.ped)
vehClosest[0] = GET_VEHICLE_PED_IS_IN(sJimmy.ped)
IF NOT IS_ENTITY_DEAD(vehClosest[0])
FLOAT fDistFromPlayer
fDistFromPlayer = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(vehClosest[0]))
//Handle random dialogue if the player sticks around by the car.
IF fDistFromPlayer < 225.0
IF GET_GAME_TIMER() - iJimmySimeonDialogueTimer > 0
INTERIOR_INSTANCE_INDEX interiorPlayer
interiorPlayer = GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID())
IF interiorPlayer != NULL //Don't play if the player is outside.
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT bHasTextLabelTriggered[ARM1_RADIO1]
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_RADIO1", CONV_PRIORITY_MEDIUM)
SET_VEHICLE_ENGINE_ON(vehClosest[0], TRUE, TRUE)
SET_VEHICLE_RADIO_LOUD(vehClosest[0], TRUE)
SET_VEH_RADIO_STATION(vehClosest[0], "RADIO_01_CLASS_ROCK")
bHasTextLabelTriggered[ARM1_RADIO1] = TRUE
iJimmySimeonDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(8000, 13000)
ENDIF
ELIF iNumJimmySimeonConversationsPlayed < 5
TEXT_LABEL strLabel
IF iNumJimmySimeonConversationsPlayed = 0
strLabel = "ARM1_GETINJ2"
ELIF iNumJimmySimeonConversationsPlayed = 1
strLabel = "ARM1_GETINJ3"
ELIF iNumJimmySimeonConversationsPlayed = 2
strLabel = "ARM1_GETINJ4"
ELIF iNumJimmySimeonConversationsPlayed = 3
strLabel = "ARM1_GETINJ5"
ELIF iNumJimmySimeonConversationsPlayed = 4
strLabel = "ARM1_GETINJ6"
ENDIF
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", strLabel, CONV_PRIORITY_MEDIUM)
iNumJimmySimeonConversationsPlayed++
iJimmySimeonDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(8000, 13000)
ENDIF
ELIF NOT bHasTextLabelTriggered[ARM1_FNKLEV1]
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_FNKLEV1", CONV_PRIORITY_MEDIUM)
TASK_LOOK_AT_ENTITY(sSimeon.ped, PLAYER_PED_ID(), 2000, SLF_WHILE_NOT_IN_FOV)
bHasTextLabelTriggered[ARM1_FNKLEV1] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Kill The first Jimmy/Simeon conversation once the player leaves.
TEXT_LABEL strLabel
strLabel = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF ARE_STRINGS_EQUAL(strLabel, "ARM1_GETINJ")
IF fDistFromPlayer > 400.0
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
//Handle the car getting damaged by Franklin.
IF GET_GAME_TIMER() - iMeleeDialogueTimer > 0
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vehClosest[0], PLAYER_PED_ID())
MISSION_FAILED(FAILED_DISTURBED_DEAL)
//Do we still need any of this?
INT iRandom, iRandom2
iRandom = GET_RANDOM_INT_IN_RANGE(0, 2)
iRandom2 = GET_RANDOM_INT_IN_RANGE(0, 2)
IF iRandom = 0
IF iRandom2 = 0
PLAY_PED_AMBIENT_SPEECH(sJimmy.ped, "GENERIC_INSULT_MED", SPEECH_PARAMS_FORCE)
ELSE
PLAY_PED_AMBIENT_SPEECH(sJimmy.ped, "GENERIC_CURSE_MED", SPEECH_PARAMS_FORCE)
ENDIF
iMeleeDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 7000)
ELSE
IF iNumTimesPlayedSimeonDialogue < 3
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sConversationPeds, "ARM1AUD", "ARM1_FNKLEV2", CONV_PRIORITY_MEDIUM)
iMeleeDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 7000)
iNumTimesPlayedSimeonDialogue++
ENDIF
ENDIF
ELSE
IF iRandom2 = 0
PLAY_PED_AMBIENT_SPEECH(sJimmy.ped, "GENERIC_INSULT_HIGH", SPEECH_PARAMS_FORCE)
ELSE
PLAY_PED_AMBIENT_SPEECH(sJimmy.ped, "GENERIC_CURSE_HIGH", SPEECH_PARAMS_FORCE)
ENDIF
iMeleeDialogueTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 7000)
ENDIF
ENDIF
ENDIF
ENDIF
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(vehClosest[0])
INT i
REPEAT COUNT_OF(vehShowroomCars) i
IF vehShowroomCars[i] != vehClosest[0]
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vehShowroomCars[i], PLAYER_PED_ID())
MISSION_FAILED(FAILED_DISTURBED_DEAL)
ENDIF
ENDIF
ENDREPEAT
IF NOT IS_VEHICLE_DRIVEABLE(vehClosest[0])
MISSION_FAILED(FAILED_TRASH_SHOWROOM)
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
FLOAT fDistFromShowroom = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<-20.2493, -1082.7458, 25.6579>>)
//Unpin the interior once the player moves away
IF interiorShowroom != NULL
IF fDistFromShowroom > 1600.0
IF IS_INTERIOR_READY(interiorShowroom)
UNPIN_INTERIOR(interiorShowroom)
interiorShowroom = NULL
ENDIF
ENDIF
ENDIF
//Remove Simeon, Jimmy and the showroom cars.
IF fDistFromShowroom > 10000.0
IF DOES_ENTITY_EXIST(sJimmy.ped)
REMOVE_PED(sJimmy.ped, TRUE)
REMOVE_PED(sSimeon.ped, TRUE)
REMOVE_ANIM_DICT(strShowroomLeadInOutAnims)
//B* 2023813:Set a null entity to be tracked for damage - prevents reporting fake damage from deleting the vehicle
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL)
REMOVE_VEHICLE(sMainCars[0].veh)
REMOVE_VEHICLE(sMainCars[1].veh)
//If the scripted showroom cars are still there, set them as no longer needed.
IF bShowroomCarsBlocked
REMOVE_VEHICLE(vehShowroomCars[0])
REMOVE_VEHICLE(vehShowroomCars[1])
REMOVE_VEHICLE(vehShowroomCars[2])
REMOVE_VEHICLE(vehShowroomCars[3])
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vRoomCorner1, vRoomCorner2, TRUE)
bShowroomCarsBlocked = FALSE
ENDIF
ENDIF
ENDIF
//Remove the stolen cars.
IF DOES_ENTITY_EXIST(sMainCars[0].veh)
IF fDistFromShowroom > 22500.0
REMOVE_VEHICLE(sMainCars[0].veh)
REMOVE_VEHICLE(sMainCars[1].veh)
ENDIF
ENDIF
//Fail for abandoning Lamar/car if the player goes too far away.
IF NOT IS_PED_INJURED(sLamar.ped)
AND IS_VEHICLE_DRIVEABLE(vehFranklinsCar)
IF VDIST2(GET_ENTITY_COORDS(sLamar.ped), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 90000.0
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehFranklinsCar)
MISSION_FAILED(FAILED_ABANDONED_LAMAR)
ENDIF
IF VDIST2(GET_ENTITY_COORDS(vehFranklinsCar), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 90000.0
MISSION_FAILED(FAILED_ABANDONED_CAR)
ENDIF
ENDIF
//Fail for damaging the cars further
IF IS_VEHICLE_DRIVEABLE(sMainCars[NINEF_INDEX].veh)
AND IS_VEHICLE_DRIVEABLE(sMainCars[RAPIDGT_INDEX].veh)
IF (HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sMainCars[NINEF_INDEX].veh, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
AND NOT HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sMainCars[NINEF_INDEX].veh, WEAPONTYPE_UNARMED))
OR (HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sMainCars[RAPIDGT_INDEX].veh, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
AND NOT HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sMainCars[RAPIDGT_INDEX].veh, WEAPONTYPE_UNARMED))
OR HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE(sMainCars[NINEF_INDEX].veh)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE(sMainCars[RAPIDGT_INDEX].veh)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sMainCars[NINEF_INDEX].veh, PLAYER_PED_ID())
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sMainCars[RAPIDGT_INDEX].veh, PLAYER_PED_ID())
MISSION_FAILED(FAILED_DAMAGED_CARS_AFTER_DROPOFF)
ENDIF
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REMOVE_ALL_BLIPS()
//PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
//KILL_FACE_TO_FACE_CONVERSATION()
REMOVE_VEHICLE(sMainCars[iPlayersCar].veh, TRUE)
REMOVE_VEHICLE(sMainCars[iBuddiesCar].veh, TRUE)
REMOVE_PED(sJimmy.ped, TRUE)
REMOVE_PED(sSimeon.ped, TRUE)
REMOVE_ANIM_DICT(strShowroomLeadInOutAnims)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
IF iShowroomPedBlockingArea != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(iShowroomPedBlockingArea)
iShowroomPedBlockingArea = -1
ENDIF
IF iShowroomPedBlockingArea2 != -1
REMOVE_NAVMESH_BLOCKING_OBJECT(iShowroomPedBlockingArea2)
iShowroomPedBlockingArea2 = -1
ENDIF
INT i = 0
REPEAT COUNT_OF(objShowroomGlass) i
REMOVE_OBJECT(objShowroomGlass[i], FALSE)
ENDREPEAT
SETTIMERA(0)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_SETUP
eMissionStage = STAGE_HOUSE_CUTSCENE
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
IF IS_VEHICLE_DRIVEABLE(vehFranklinsCar)
IF NOT IS_PED_INJURED(sLamar.ped)
IF NOT IS_PED_IN_VEHICLE(sLamar.ped, vehFranklinsCar)
SET_PED_INTO_VEHICLE(sLamar.ped, vehFranklinsCar, VS_FRONT_RIGHT)
ENDIF
ENDIF
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehFranklinsCar)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehFranklinsCar, VS_DRIVER)
ENDIF
SET_ENTITY_COORDS(vehFranklinsCar, vFranklinsHouse)
ENDIF
LOAD_SCENE(vFranklinsHouse)
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDPROC
PROC HOUSE_CUTSCENE_COMBINED_VERSION()
IF eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
IF iCurrentEvent != 99
IF bUsedACheckpoint
START_REPLAY_SETUP(<<-13.9541, -1446.6563, 30.5515>>, 335.0142, FALSE)
iCurrentEvent = 99
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-13.9541, -1446.6563, 30.5515>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
LOAD_SCENE(<<-13.9541, -1446.6563, 30.5515>>)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
iCurrentEvent = 99
ENDIF
ELSE
IF SETUP_LAMAR(<<-17.8292, -1458.0117, 29.4598>>)
AND SETUP_FRANKLINS_CAR(vFranklinsCarFinalPos, fFranklinsCarFinalHeading)
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE)
IF IS_VEHICLE_DRIVEABLE(vehFranklinsCar)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehFranklinsCar)
IF NOT IS_PED_INJURED(sLamar.ped)
SET_PED_INTO_VEHICLE(sLamar.ped, vehFranklinsCar, VS_FRONT_RIGHT)
ENDIF
ENDIF
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 | SPC_ALLOW_PLAYER_DAMAGE)
ENDIF
REQUEST_CUTSCENE(strHouseCutscene)
REQUEST_MODEL(modelShirt)
REQUEST_MODEL(modelWardrobeLeft)
REQUEST_MODEL(modelWardrobeRight)
REQUEST_MODEL(modelHealthPack)
SET_CUTSCENE_PED_COMPONENT_VARIATIONS(strHouseCutscene)
IF HAS_MODEL_LOADED(modelShirt)
AND HAS_MODEL_LOADED(modelWardrobeLeft)
AND HAS_MODEL_LOADED(modelWardrobeRight)
AND HAS_MODEL_LOADED(modelHealthPack)
AND TIMERA() > 1000
AND (NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR IS_FACE_TO_FACE_CONVERSATION_PAUSED())
BOOL bCutsceneLoaded = FALSE
IF IS_PC_VERSION()
bCutsceneLoaded = HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
ELSE
bCutsceneLoaded = HAS_CUTSCENE_LOADED()
ENDIF
IF bCutsceneLoaded
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED)
SET_FRONTEND_RADIO_ACTIVE(FALSE)
IF IS_AUDIO_SCENE_ACTIVE("ARM_1_GO_HOME")
STOP_AUDIO_SCENE("ARM_1_GO_HOME")
ENDIF
objShirt = CREATE_OBJECT(modelShirt, <<-11.700, -1439.255, 30.099>>)
objHealthPack = CREATE_OBJECT_NO_OFFSET(modelHealthPack, <<-17.9200, -1436.34, 30.2033>>)
SET_ENTITY_HEADING(objHealthPack, -158.75)
FREEZE_ENTITY_POSITION(objHealthPack, TRUE)
objWardrobeDoors[0] = CREATE_OBJECT(modelWardrobeLeft, <<-12.700, -1439.255, 20.099>>)
objWardrobeDoors[1] = CREATE_OBJECT(modelWardrobeRight, <<-10.700, -1439.255, 20.099>>)
SET_MODEL_AS_NO_LONGER_NEEDED(modelShirt)
SET_MODEL_AS_NO_LONGER_NEEDED(modelHealthPack)
SET_MODEL_AS_NO_LONGER_NEEDED(modelWardrobeLeft)
SET_MODEL_AS_NO_LONGER_NEEDED(modelWardrobeRight)
REGISTER_ENTITY_FOR_CUTSCENE(objShirt, "Franklins_shirt", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
REGISTER_ENTITY_FOR_CUTSCENE(objWardrobeDoors[0], "Closet_Door_L", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
REGISTER_ENTITY_FOR_CUTSCENE(objWardrobeDoors[1], "Closet_Door_R", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
CREATE_MODEL_HIDE(<<-18.3539, -1438.7838, 31.3050>>, 3.0, V_ILEV_FRNKWARDDR1, FALSE)
CREATE_MODEL_HIDE(<<-18.3594, -1438.1329, 31.3050>>, 3.0, V_ILEV_FRNKWARDDR2, FALSE)
SET_DOOR_STATE(DOORNAME_F_HOUSE_SC_B, DOORSTATE_UNLOCKED)
SET_DOOR_STATE(DOORNAME_F_HOUSE_SC_F, DOORSTATE_UNLOCKED)
//SET_SAVEHOUSE_RESPAWN_AVAILABLE(SAVEHOUSE_FRANKLIN_SC, TRUE)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_FA_ROOMDOOR, <<-15.989, -1436.03, 31.199>>, TRUE, 0.0, 0.0, -1.0)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
REPLAY_RECORD_BACK_FOR_TIME(5.0, 0.0)
START_CUTSCENE(CUTSCENE_NO_WIDESCREEN_BORDERS)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
IF NOT IS_REPEAT_PLAY_ACTIVE()
g_eArm1PrestreamDenise = ARM1_PD_1_mission_requested_prestream
ENDIF
iCurrentEvent = 0
bCutsceneSkipped = FALSE
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
bCutsceneSkipped = TRUE
eSectionStage = SECTION_STAGE_SKIP
ENDIF
IF interiorFranklinsHouse = NULL
interiorFranklinsHouse = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-14.6461, -1437.3323, 31.1160>>, "v_franklins")
ELIF NOT IS_INTERIOR_READY(interiorFranklinsHouse)
PIN_INTERIOR_IN_MEMORY(interiorFranklinsHouse)
ENDIF
VECTOR vCamRot = GET_FINAL_RENDERED_CAM_ROT()
//Load assets for tutorial scene in advance
IF NOT DOES_ENTITY_EXIST(objShirt)
REQUEST_MODEL(modelShirt)
IF HAS_MODEL_LOADED(modelShirt)
objShirt = CREATE_OBJECT_NO_OFFSET(modelShirt, <<-19.126, -1438.7911, 31.6833>>)
SET_ENTITY_ROTATION(objShirt, <<-3.744568,-0.022376,14.537273>>)
FREEZE_ENTITY_POSITION(objShirt, TRUE)
SET_ENTITY_VISIBLE(objShirt, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelShirt)
ENDIF
ENDIF
SWITCH iCurrentEvent
CASE 0 //Store car and delete any no longer needed assets.
IF IS_CUTSCENE_PLAYING()
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
CLEAR_PRINTS()
CLEAR_HELP()
IF IS_VEHICLE_DRIVEABLE(vehFranklinsCar)
SET_ENTITY_COORDS(vehFranklinsCar, <<-25.1690, -1427.9659, 29.6567>>)
SET_ENTITY_HEADING(vehFranklinsCar, 0.9548)
SET_VEHICLE_ENGINE_ON(vehFranklinsCar, FALSE, FALSE)
SET_VEHICLE_FIXED(vehFranklinsCar)
ENDIF
REMOVE_PED(sLamar.ped, TRUE)
CLEAR_AREA(<<-17.8292, -1458.0117, 29.4598>>, 100.0, TRUE)
DO_FADE_IN_WITH_WAIT() //Do this here instead of the setup stage, otherwise you see a frame where the cutscene hasn't started playing yet.
iCurrentEvent++
ENDIF
BREAK
CASE 1
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_WEAPON_ICON)
IF GET_CUTSCENE_TIME() > 21500
PRINT_HELP("AR1_BARBERS", 7000)
iCurrentEvent++
ENDIF
BREAK
CASE 2 //Start of tutorial.
IF GET_CUTSCENE_TIME() > 26700
IF IS_THIS_TV_AVAILABLE_FOR_USE(TV_LOC_FRANKLIN_LIVING)
START_AMBIENT_TV_PLAYBACK(TV_LOC_FRANKLIN_LIVING)
ELSE
#IF IS_DEBUG_BUILD
PRINTLN("armenian1.sc - TV failed to load in time: TV_LOC_FRANKLIN_LIVING")
#ENDIF
ENDIF
SET_STATIC_BLIP_HIDDEN_IN_MISSION(STATIC_BLIP_SHOP_HAIRDO_01_BH, TRUE)
SET_STATIC_BLIP_HIDDEN_IN_MISSION(STATIC_BLIP_SHOP_HAIRDO_02_SC, TRUE)
SET_STATIC_BLIP_HIDDEN_IN_MISSION(STATIC_BLIP_SHOP_HAIRDO_03_V, TRUE)
SET_STATIC_BLIP_HIDDEN_IN_MISSION(STATIC_BLIP_SHOP_HAIRDO_04_SS, TRUE)
SET_STATIC_BLIP_HIDDEN_IN_MISSION(STATIC_BLIP_SHOP_HAIRDO_05_MP, TRUE)
SET_STATIC_BLIP_HIDDEN_IN_MISSION(STATIC_BLIP_SHOP_HAIRDO_06_HW, TRUE)
SET_STATIC_BLIP_HIDDEN_IN_MISSION(STATIC_BLIP_SHOP_HAIRDO_07_PB, TRUE)
/*IF DOES_PICKUP_EXIST(pickupHouse)
REMOVE_PICKUP(pickupHouse)
ENDIF
CLEAR_AREA(<<-17.920, -1436.34, 30.2033>>, 2.0, TRUE)
INT iPlacementFlags
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_LOCAL_ONLY))
pickupHouse = CREATE_PICKUP_ROTATE(PICKUP_HEALTH_STANDARD, <<-17.920, -1436.34, 30.2033>>, <<0.0000, 0.0000, -158.75>>, iPlacementFlags)*/
SETTIMERA(0)
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 3 //Display savehouse help.
SET_GAMEPLAY_CAM_RELATIVE_HEADING(vCamRot.z - GET_ENTITY_HEADING(PLAYER_PED_ID()))
IF TIMERA() > 3000
PRINT_HELP("AR1_SAVE1")
DISPLAY_RADAR(TRUE)
SET_CAN_DISPLAY_MINIMAP_DURING_CUTSCENE_THIS_UPDATE()
IF NOT DOES_BLIP_EXIST(blipCurrentDestination)
blipCurrentDestination = CREATE_BLIP_FOR_COORD(<<-14.3803, -1438.5143, 30.1015>>)
SET_BLIP_SPRITE(blipCurrentDestination, RADAR_TRACE_SAFEHOUSE)
SET_BLIP_FLASHES(blipCurrentDestination, TRUE)
ENDIF
SETTIMERB(0)
bClearedHelp = FALSE
iCurrentEvent++
ENDIF
BREAK
CASE 4 //Clear savehouse help.
SET_GAMEPLAY_CAM_RELATIVE_HEADING(vCamRot.z - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_CAN_DISPLAY_MINIMAP_DURING_CUTSCENE_THIS_UPDATE()
IF TIMERB() > 5000
//Force the front door shut.
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<-14.8691, -1441.1586, 31.1932>>, 3.0, v_ilev_fa_frontdoor)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(v_ilev_fa_frontdoor, <<-14.8691, -1441.1586, 31.1932>>, TRUE, 0.0)
ENDIF
DISPLAY_RADAR(FALSE)
SETTIMERB(0)
bClearedHelp = FALSE
iCurrentEvent++
ENDIF
BREAK
CASE 5 //Display TV help
IF NOT bClearedHelp
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_SAVE1")
IF TIMERA() > 8750
CLEAR_HELP(FALSE)
bClearedHelp = TRUE
ENDIF
ENDIF
ENDIF
IF TIMERA() > 9500
PRINT_HELP("AR1_TVHELP")
SETTIMERB(0)
bClearedHelp = FALSE
iCurrentEvent++
ENDIF
BREAK
CASE 6 //Clear TV help.
IF TIMERB() > 5000
//CLEAR_HELP(FALSE)
bClearedHelp = FALSE
iCurrentEvent++
ENDIF
BREAK
CASE 7 //Display medipack help.
IF NOT bClearedHelp
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_TVHELP")
IF TIMERA() > 15000
CLEAR_HELP(FALSE)
bClearedHelp = TRUE
ENDIF
ENDIF
ENDIF
IF TIMERA() > 16000
PRINT_HELP("AR1_MEDIHELP")
SETTIMERB(0)
bClearedHelp = FALSE
iCurrentEvent++
ENDIF
BREAK
CASE 8 //Clear medipack help.
IF TIMERB() > 5000
//CLEAR_HELP(FALSE)
bClearedHelp = FALSE
iCurrentEvent++
ENDIF
BREAK
CASE 9 //Display bed help.
IF NOT bClearedHelp
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_MEDIHELP")
IF TIMERA() > 22500
CLEAR_HELP(FALSE)
bClearedHelp = TRUE
ENDIF
ENDIF
ENDIF
IF TIMERA() > 23500
//Unlock the bathroom door.
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_FA_ROOMDOOR, <<-15.989, -1436.03, 31.199>>, FALSE, 0.0, 0.0, 0.0)
PRINT_HELP("AR1_SAVE2")
SETTIMERB(0)
bClearedHelp = FALSE
iCurrentEvent++
ENDIF
BREAK
CASE 10 //Display phone help.
IF TIMERB() > 5000
PRINT_HELP("AR1_SAVE2B")
SETTIMERB(0)
bClearedHelp = FALSE
iCurrentEvent++
ENDIF
BREAK
CASE 11 //Clear phone help.
IF TIMERB() > 5000
//CLEAR_HELP(FALSE)
SETTIMERB(0)
bClearedHelp = FALSE
iCurrentEvent++
ENDIF
BREAK
CASE 12 //Display wardrobe help.
IF NOT bClearedHelp
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AR1_SAVE2B")
IF TIMERA() > 35000
CLEAR_HELP(FALSE)
bClearedHelp = TRUE
ENDIF
ENDIF
ENDIF
IF TIMERA() > 36000
PRINT_HELP("AR1_SAVE3")
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 13 //Clear wardrobe help.
IF TIMERB() > 7000
CLEAR_HELP(FALSE)
iCurrentEvent++
ENDIF
BREAK
ENDSWITCH
IF DOES_ENTITY_EXIST(objShirt)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklins_shirt")
FREEZE_ENTITY_POSITION(objShirt, TRUE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(objWardrobeDoors[0])
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Closet_Door_L")
FREEZE_ENTITY_POSITION(objWardrobeDoors[0], TRUE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(objWardrobeDoors[1])
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Closet_Door_R")
FREEZE_ENTITY_POSITION(objWardrobeDoors[1], TRUE)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
IF DOES_ENTITY_EXIST(objShirt)
SET_ENTITY_VISIBLE(objShirt, TRUE)
ENDIF
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
ENDIF
IF eSectionStage = SECTION_STAGE_CLEANUP
REMOVE_PED(sLamar.ped, TRUE)
CLEAR_HELP()
REPLAY_STOP_EVENT()
IF bCutsceneSkipped
AND IS_SCREEN_FADED_OUT()
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
NEW_LOAD_SCENE_SPHERE_WITH_WAIT(GET_ENTITY_COORDS(PLAYER_PED_ID()), 20.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
ENDIF
Execute_Activate_Shop_Barbers()
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(V_ILEV_FA_ROOMDOOR, <<-15.989, -1436.03, 31.199>>, FALSE, 0.0, 0.0, 0.0)
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<-14.8691, -1441.1586, 31.1932>>, 3.0, v_ilev_fa_frontdoor)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(v_ilev_fa_frontdoor, <<-14.8691, -1441.1586, 31.1932>>, TRUE, 0.0)
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
SET_FRONTEND_RADIO_ACTIVE(TRUE)
DO_FADE_IN_WITH_WAIT()
MISSION_PASSED()
ENDIF
IF eSectionStage = SECTION_STAGE_SKIP
DO_FADE_OUT_WITH_WAIT()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
STOP_CUTSCENE()
bCutsceneSkipped = TRUE
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDPROC
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Records the trigger car (which will be invisible) and all of the traffic
PROC RECORD_CHASE_GHOST_AND_TRAFFIC()
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(1.0)
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_MODEL(modelMainCar1)
IF HAS_MODEL_LOADED(modelMainCar1)
sMainCars[0].veh = CREATE_VEHICLE(modelMainCar1, sMainCars[0].vStartPos, sMainCars[0].fStartHeading)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMainCar1)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sMainCars[0].veh)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sMainCars[0].veh)
ENDIF
INIT_UBER_RECORDING(strCarrec)
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
UPDATE_UBER_RECORDING()
IF bDebugAutoPlayTrigger
REQUEST_MODEL(intruder) //intruder)
REQUEST_MODEL(manana) //emperor)
IF IS_VEHICLE_DRIVEABLE(sMainCars[0].veh)
IF IS_RECORDING_GOING_ON_FOR_VEHICLE(sMainCars[0].veh)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(sMainCars[0].veh)
REQUEST_VEHICLE_RECORDING(CARREC_BUDDY, strCarrec)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_BUDDY, strCarrec)
START_PLAYBACK_RECORDED_VEHICLE(sMainCars[0].veh, CARREC_BUDDY, strCarrec)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Plays back the trigger car and traffic, records setpieces.
PROC RECORD_CHASE_SET_PIECES()
INT iCarrec = CARREC_BUDDY
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_MODEL(modelMainCar1)
IF HAS_MODEL_LOADED(modelMainCar1)
REMOVE_ALL_BLIPS()
vehTriggerCar = CREATE_VEHICLE(modelMainCar1, sMainCars[0].vStartPos, sMainCars[0].fStartHeading)
SET_ENTITY_COLLISION(vehTriggerCar, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMainCar1)
//SET_ENTITY_COORDS(PLAYER_PED_ID(), sMainCars[0].vStartPos + <<-2.0, -2.0, 0.0>>)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehTriggerCar)
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
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(vehTriggerCar)
IF iCurrentEvent = 0
INITIALISE_UBER_PLAYBACK(strCarrec, iCarrec)
LOAD_CHASE_UBER_DATA()
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02)
fUberPlaybackDensitySwitchOffRange = 200.0
//LOAD_UBER_DATA_2()
iCurrentEvent++
ELIF iCurrentEvent = 1
REQUEST_VEHICLE_RECORDING(iCarrec, strCarrec)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrec, strCarrec)
IF SET_CAR_AT_PLAYBACK_POSITION(vehTriggerCar, iCarrec, 0.0, TRUE, FALSE)
iCurrentEvent++
ENDIF
ENDIF
ELIF iCurrentEvent = 2
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehTriggerCar)
FLOAT fTime = GET_TIME_POSITION_IN_RECORDING(vehTriggerCar)
bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE
CREATE_ALL_WAITING_UBER_CARS()
PRELOAD_ALL_CHASE_RECORDINGS(fTime)
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
UPDATE_UBER_PLAYBACK(vehTriggerCar, 1.0)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
VECTOR vPos1 = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(iCarrec, fTime + 500.0, strCarrec)
VECTOR vPos2 = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(iCarrec, fTime + 1000.0, strCarrec)
VECTOR vPos3 = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehTriggerCar, <<-1.7329, 6.4243, 0.1649>>)
VECTOR vPos4 = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehTriggerCar, <<-1.7329, 12.4243, 0.1649>>)
DRAW_DEBUG_SPHERE(vPos1, 0.5, 0, 255, 0, 128)
DRAW_DEBUG_SPHERE(vPos2, 0.5, 0, 255, 0, 128)
DRAW_DEBUG_SPHERE(vPos3, 1.0, 0, 0, 255, 128)
DRAW_DEBUG_SPHERE(vPos4, 1.0, 0, 0, 255, 128)
ELSE
iCurrentEvent = 1
CLEANUP_UBER_PLAYBACK(TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Plays back the current trigger recording as a ghost, to allow a close re-recording.
/// NOTE: doesn't include traffic or set-piece cars
PROC REDO_TRIGGER_RECORDING()
VECTOR vStartPos = <<-1880.2660, -577.8439, 10.7702>>
FLOAT fStartHeading = 319.7534
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_MODEL(modelMainCar1)
REQUEST_MODEL(modelMainCar2)
IF HAS_MODEL_LOADED(modelMainCar1)
AND HAS_MODEL_LOADED(modelMainCar2)
REMOVE_ALL_BLIPS()
vehTriggerCar = CREATE_VEHICLE(modelMainCar1, sMainCars[0].vStartPos, sMainCars[0].fStartHeading)
SET_ENTITY_COLLISION(vehTriggerCar, FALSE)
SET_ENTITY_VISIBLE(vehTriggerCar, FALSE)
FREEZE_ENTITY_POSITION(vehTriggerCar, TRUE)
sMainCars[0].veh = CREATE_VEHICLE(modelMainCar1, vStartPos, fStartHeading) //New start location
SET_ENTITY_COLLISION(sMainCars[0].veh, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMainCar1)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMainCar2)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sMainCars[0].veh)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
IF IS_VEHICLE_DRIVEABLE(vehTriggerCar)
AND IS_VEHICLE_DRIVEABLE(sMainCars[0].veh)
IF iCurrentEvent = 0
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
iCurrentEvent++
ELIF iCurrentEvent = 1
REQUEST_VEHICLE_RECORDING(CARREC_BUDDY, strCarrec)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(CARREC_BUDDY, strCarrec)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LB)
START_RECORDING_VEHICLE(sMainCars[0].veh, 999, strCarrec, TRUE)
FREEZE_ENTITY_POSITION(vehTriggerCar, FALSE)
START_PLAYBACK_RECORDED_VEHICLE(vehTriggerCar, CARREC_BUDDY, strCarrec)
iCurrentEvent++
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "RECORDING STARTED", DEFAULT_GOD_TEXT_TIME, 0)
ENDIF
ENDIF
ELIF iCurrentEvent = 2
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehTriggerCar)
DISPLAY_PLAYBACK_RECORDED_VEHICLE(vehTriggerCar, RDM_WHOLELINE)
ENDIF
IF bDebugEnhanceDriving
APPLY_FORCE_TO_ENTITY(sMainCars[0].veh, APPLY_TYPE_FORCE, <<0.0, 0.0, -10.0>>, <<0.0, 0.0, 0.0>>, 0, TRUE, TRUE, TRUE)
ENDIF
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LB)
STOP_RECORDING_VEHICLE(sMainCars[0].veh)
SET_ENTITY_COORDS(sMainCars[0].veh, vStartPos)
SET_ENTITY_HEADING(sMainCars[0].veh, fStartHeading)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehTriggerCar)
STOP_PLAYBACK_RECORDED_VEHICLE(vehTriggerCar)
ENDIF
SET_ENTITY_COORDS(vehTriggerCar, sMainCars[0].vStartPos + <<0.0, 0.0, 0.01>>)
FREEZE_ENTITY_POSITION(vehTriggerCar, TRUE)
iCurrentEvent = 0
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_BUTTON_JUST_PRESSED(PAD1, DPADDOWN)
bDebugEnhanceDriving = NOT bDebugEnhanceDriving
ENDIF
IF IS_VEHICLE_DRIVEABLE(vehTriggerCar)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
DRAW_DEBUG_SPHERE(GET_ENTITY_COORDS(vehTriggerCar), 0.5, 255, 0, 0, 20)
ENDIF
ENDPROC
PROC RECORD_CAMERA()
INT iCarrec = CARREC_BUDDY
INT iCamCarrec = CARREC_BUDDY
INT iRecordCarrec = 999
FLOAT fStartTime = 200.0
VECTOR vOffset = <<0.0, 0.0, 0.1>>
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_MODEL(modelMainCar1)
IF HAS_MODEL_LOADED(modelMainCar1)
REMOVE_ALL_BLIPS()
vehTriggerCar = CREATE_VEHICLE(modelMainCar1, sMainCars[0].vStartPos, sMainCars[0].fStartHeading)
vehDebugCamCar = CREATE_VEHICLE(modelMainCar1, sMainCars[1].vStartPos, sMainCars[1].fStartHeading)
vehDebug[0] = CREATE_VEHICLE(modelMainCar1, sMainCars[1].vStartPos + <<5.0, 0.0, 0.0>>, sMainCars[1].fStartHeading)
vehDebugFov = CREATE_VEHICLE(modelMainCar1, sMainCars[1].vStartPos + <<10.0, 0.0, 0.0>>, sMainCars[1].fStartHeading)
SET_ENTITY_COLLISION(vehTriggerCar, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMainCar1)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehTriggerCar)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
IF IS_VEHICLE_DRIVEABLE(vehTriggerCar)
IF iCurrentEvent = 0
INITIALISE_UBER_PLAYBACK(strCarrec, iCarrec)
LOAD_CHASE_UBER_DATA()
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02)
fUberPlaybackDensitySwitchOffRange = 200.0
iCurrentEvent++
ELIF iCurrentEvent = 1
REQUEST_VEHICLE_RECORDING(iCarrec, strCarrec)
REQUEST_VEHICLE_RECORDING(iCamCarrec, strCarrec)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrec, strCarrec)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(iCamCarrec, strCarrec)
SET_ENTITY_VISIBLE(vehDebugFov, FALSE)
SET_CAR_AT_PLAYBACK_POSITION(vehTriggerCar, iCarrec, 0.0, TRUE, FALSE)
IF bDebugFreeModeCamera
START_CAM_RECORDING(sCamData, vehDebug[0], GET_ENTITY_COORDS(PLAYER_PED_ID()), <<0.0, 0.0, 0.0>>, 25.0, strCarrec, iRecordCarrec, TRUE)
ELSE
IF IS_VEHICLE_DRIVEABLE(vehDebugCamCar)
START_PLAYBACK_RECORDED_VEHICLE(vehDebugCamCar, iCamCarrec, strCarrec)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehDebugCamCar, fStartTime)
SET_ENTITY_COLLISION(vehDebugCamCar, FALSE)
ENDIF
START_CAM_RECORDING_RELATIVE_TO_ENTITY(sCamData, vehDebugCamCar, vehDebug[0], vOffset, <<0.0, 0.0, 0.0>>, 30.0, strCarrec, iRecordCarrec,
TRUE, TRUE, FALSE, TRUE)
ENDIF
iCurrentEvent++
ENDIF
ELIF iCurrentEvent = 2
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehTriggerCar)
bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE
CREATE_ALL_WAITING_UBER_CARS()
FLOAT fPlaybackTime = GET_TIME_POSITION_IN_RECORDING(vehTriggerCar)
IF bDebugFreeModeCamera
//Currently using the free camera as an offset from the recording in a future/past position
VECTOR vRecOffset = GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(iCarrec, fPlaybackTime - 1000.0, strCarrec)
VECTOR vTriggerPos = GET_ENTITY_COORDS(vehTriggerCar)
VECTOR vTriggerOffset = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehTriggerCar, <<1.0, 0.0, 5.0>>)
vRecOffset += (vTriggerOffset - vTriggerPos)
sCamData.v_current_pos = vRecOffset
sCamData.v_desired_pos = vRecOffset
ENDIF
PRELOAD_ALL_CHASE_RECORDINGS(fPlaybackTime)
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
UPDATE_UBER_PLAYBACK(vehTriggerCar, 1.0)
UPDATE_CAM_RECORDING(sCamData)
IF IS_VEHICLE_DRIVEABLE(vehDebugCamCar)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehDebugCamCar)
SET_PLAYBACK_SPEED(vehDebugCamCar, 1.66666) //Set-piece was recorded at 0.6 for the uber
ENDIF
ENDIF
ENDIF
IF IS_BUTTON_JUST_PRESSED(PAD1, DPADDOWN)
STOP_CAM_RECORDING(sCamData)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC PLAYBACK_CAMERA()
INT iCarrec = CARREC_BUDDY
INT i = 0
INT iCamRecMixdown
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
//INT i_fov_rec = 999
//Try recording on bikes to squeeze into spots
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_MODEL(modelMainCar1)
IF HAS_MODEL_LOADED(modelMainCar1)
REMOVE_ALL_BLIPS()
vehTriggerCar = CREATE_VEHICLE(modelMainCar1, sMainCars[0].vStartPos, sMainCars[0].fStartHeading)
IF NOT bDebugPlayMixdown
REPEAT COUNT_OF(iCamRecs) i
IF iCamRecs[i] != 0
vehDebug[i] = CREATE_VEHICLE(modelMainCar1, sMainCars[1].vStartPos + <<3.0 * i, 0.0, 0.0>>, sMainCars[1].fStartHeading)
ENDIF
ENDREPEAT
IF bDebugRecordEdit
vehDebugCamCar = CREATE_VEHICLE(modelMainCar1, sMainCars[1].vStartPos + <<3.0, 0.0, 5.0>>, sMainCars[1].fStartHeading)
ENDIF
ELSE
vehDebugCamCar = CREATE_VEHICLE(modelMainCar1, sMainCars[1].vStartPos + <<3.0, 0.0, 0.0>>, sMainCars[1].fStartHeading)
ENDIF
//SET_ENTITY_COLLISION(vehTriggerCar, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMainCar1)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehTriggerCar)
iCurrentEvent = 0
eSectionStage = SECTION_STAGE_RUNNING
ENDIF
ENDIF
IF eSectionStage = SECTION_STAGE_RUNNING
//SET_USE_HI_DOF()
IF IS_VEHICLE_DRIVEABLE(vehTriggerCar)
IF iCurrentEvent = 0
INITIALISE_UBER_PLAYBACK(strCarrec, iCarrec)
SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE)
SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(A_M_M_BEVHILLS_02)
fUberPlaybackDensitySwitchOffRange = 200.0
IF bDebugPlayMixdown
LOAD_CHASE_UBER_DATA()
ENDIF
iCurrentEvent++
ELIF iCurrentEvent = 1
REQUEST_VEHICLE_RECORDING(iCarrec, strCarrec)
REQUEST_CAM_RECORDING(iCamRecs[0], strCarrec)
REQUEST_CAM_RECORDING(iCamRecs[1], strCarrec)
REQUEST_CAM_RECORDING(iCamRecs[2], strCarrec)
REQUEST_CAM_RECORDING(iCamRecs[3], strCarrec)
REQUEST_CAM_RECORDING(iCamRecs[4], strCarrec)
REQUEST_CAM_RECORDING(iCamRecs[5], strCarrec)
BOOL bRecsLoaded = FALSE
IF HAS_CAM_RECORDING_LOADED(iCamRecs[0], strCarrec)
AND HAS_CAM_RECORDING_LOADED(iCamRecs[1], strCarrec)
AND HAS_CAM_RECORDING_LOADED(iCamRecs[2], strCarrec)
AND HAS_CAM_RECORDING_LOADED(iCamRecs[3], strCarrec)
AND HAS_CAM_RECORDING_LOADED(iCamRecs[4], strCarrec)
AND HAS_CAM_RECORDING_LOADED(iCamRecs[5], strCarrec)
bRecsLoaded = TRUE
ENDIF
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrec, strCarrec)
AND bRecsLoaded
SET_CAR_AT_PLAYBACK_POSITION(vehTriggerCar, iCarrec, 0.0, TRUE, FALSE)
camCutscene = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
SHAKE_CAM(camCutscene, "SKY_DIVING_SHAKE", 0.15)
SET_CAM_MOTION_BLUR_STRENGTH(camCutscene, 0.01)
SET_CAM_FAR_DOF(camCutscene, 100.0)
SET_CAM_NEAR_DOF(camCutscene, 2.0)
SET_CAM_FOV(camCutscene, 25.0)
IF NOT bDebugPlayMixdown
REPEAT COUNT_OF(iCamRecs) i
IF iCamRecs[i] != 0
START_CAM_PLAYBACK(camCutscene, vehDebug[i], strCarrec, iCamRecs[i])
ENDIF
ENDREPEAT
IF bDebugRecordEdit
START_CAM_RECORDING(sCamData, vehDebugCamCar, GET_ENTITY_COORDS(vehDebug[0]), GET_ENTITY_ROTATION(vehDebug[0]),
25.0, strCarrec, iCamRecMixdown, TRUE)
ENDIF
ELSE
START_CAM_PLAYBACK(camCutscene, vehDebugCamCar, strCarrec, iCamRecs[0])
iDebugCurrentCam = 0
iCurrentCinematicCam = 0
fNextActionCamFov = 0.0
ENDIF
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_RADAR(FALSE)
iCurrentEvent++
ENDIF
ELIF iCurrentEvent = 2
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehTriggerCar)
FLOAT fPlaybackTime = GET_TIME_POSITION_IN_RECORDING(vehTriggerCar)
bPlayTrafficRecordingEvenIfPlayerIsAheadOfChase = TRUE
CREATE_ALL_WAITING_UBER_CARS()
PRELOAD_ALL_CHASE_RECORDINGS(GET_TIME_POSITION_IN_RECORDING(vehTriggerCar))
DONT_PROCESS_UBER_PLAYBACK_HORNS_AND_LIGHTS()
UPDATE_UBER_PLAYBACK(vehTriggerCar, 1.0)
IF bDebugPlayEdit OR bDebugRecordEdit
//CAM 0 (901, car is just offset) good spots:
//5000.0 - 15000.0
//16000.0 - 26000.0 (basic, but looks okay over jump)
//55000.0 - 61000.0 (basic, but guaranteed to miss props)
//65000.0 - 72000.0
//117000.0 - 122000.0
//
//CAM 3 (904, same as cam 2 but more stable)
//18000.0 - 22500.0 (fov out)
//29000.0 - 41000.0
//47500.0 - 53000.0
//62000.0 - 65000.0
//82000.0 - 88000.0
//99000.0 - 109000.0
//123000.0 - 126500.0
//130000.0 - 132500.0
//137000.0 - 141000.0
//145000.0 - 151000.0 (fov out)
//
//CAM 4 (905, car in front)
//2500.0 - 9000.0
//15000.0 - 25000.0 (fov in)
//41000.0 - 46000.0 (fov in)
//50000.0 - 52000.0*
//56000.0 - 62000.0
//72000.0 - 81000.0 (fov in)
//97500.0 - 120000.0
//126000.0 - 132000.0
//136000.0 - 151000.0 (includes pillars bit)
//
//CAM 5 (helicopter slightly ahead)
//6000.0 - 12000.0
//16000.0 - 22000.0
//47000.0 - 55000.0
//60000.0 - 63000.0 (backup)
//66000.0 - 72000.0 (backup)
//
//CAM 6 (chopper low)
//32000.0 - 35500.0
//89000.0 - 98000.0* (nice jumps, fov in)
//104500.0 - 107500.0 (nice intersection jump)
//Some good backup after this on windy bits
//
//
//CAM 7 (908, left side)
//5400.0 - 8400.0
//15000.0 - 24500.0 (especially near end, does a nice pan)
//28000.0 - 32000.0 - 40000.0 - 44000.0
//46000.0 - 48000.0 (fov out)
//53000.0 - 62500.0 (nice film studio pan)
//74000.0 - 78500.0
//84500.0 - 89000.0 (good jump)
//94000.0 - 97000.0 (jump)
//99000.0 - 100000.0 - 108000.0
//108000.0 - 113500.0
//114000.0 - 119000.0 (nice shot of weaving)
//122000.0 - 125000.0 (nice bus shot)
//135000.0 - 139000.0 (nice pillars through turn)
//140000.0 - 145500.0 (pillars and jump, pillars a bit off, may be able to cut).
//152000.0 - end (best end shot so far)
//
//CAM 8 (909, right side)
//6000.0 - 11500.0 (nice weaving)
//15000.0 - 29000.0 (nice angle, also best version of jump near end)
//32000.0 - 38000.0 (fov out a bit)
//38000.0 - 43000.0
//48000.0 - 50000.0
//69000.0 - 72500.0 (fov out)
//80000.0 - 84000.0 (may need fov out)
//89000.0 - 93000.0 (may need fov out)
//95000.0 - 98000.0
//101500.0 - 114000.0 (nice intersection jump)
//116500.0 - 120000.0
//129000.0 - 132000.0
//143500.0 - 146500.0 (might be good jump if fov out)
IF fPlaybackTime < 8400.0
iDebugCurrentCam = 4
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 11500.0
iDebugCurrentCam = 5
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 15000.0
iDebugCurrentCam = 2
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 19000.0
iDebugCurrentCam = 4
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 24000.0
iDebugCurrentCam = 5
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 29000.0
iDebugCurrentCam = 3
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 32000.0
iDebugCurrentCam = 4
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 38000.0
iDebugCurrentCam = 5
SET_CAM_FOV(camCutscene, 38.0)
ELIF fPlaybackTime < 41000.0
iDebugCurrentCam = 4
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 45500.0
iDebugCurrentCam = 2
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 48000.0
iDebugCurrentCam = 4
SET_CAM_FOV(camCutscene, 32.0)
ELIF fPlaybackTime < 50300.0
iDebugCurrentCam = 5
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 56000.0
iDebugCurrentCam = 2
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 62000.0
iDebugCurrentCam = 4
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 64500.0
iDebugCurrentCam = 2
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 70000.0
iDebugCurrentCam = 0
SET_CAM_FOV(camCutscene, 31.0)
ELIF fPlaybackTime < 72500.0
iDebugCurrentCam = 5
SET_CAM_FOV(camCutscene, 35.0)
ELIF fPlaybackTime < 78500.0
iDebugCurrentCam = 4
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 86100.0
iDebugCurrentCam = 5
SET_CAM_FOV(camCutscene, 34.0)
ELIF fPlaybackTime < 90000.0
iDebugCurrentCam = 4
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 95000.0
iDebugCurrentCam = 3
SET_CAM_FOV(camCutscene, 12.0)
ELIF fPlaybackTime < 98700.0
iDebugCurrentCam = 5
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 101000.0
iDebugCurrentCam = 1
SET_CAM_FOV(camCutscene, 30.0)
ELIF fPlaybackTime < 104500.0
iDebugCurrentCam = 4
SET_CAM_FOV(camCutscene, 27.0)
ELIF fPlaybackTime < 108500.0
iDebugCurrentCam = 3
SET_CAM_FOV(camCutscene, 22.0)
ELIF fPlaybackTime < 114000.0
iDebugCurrentCam = 8
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 119000.0
iDebugCurrentCam = 4
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 122000.0
iDebugCurrentCam = 3
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 125000.0
iDebugCurrentCam = 4 //Can't use 7 to enter the car park, so needs to end earlier
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 132500.0
iDebugCurrentCam = 5
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 143000.0
iDebugCurrentCam = 4
SET_CAM_FOV(camCutscene, 25.0)
ELIF fPlaybackTime < 147000.0
iDebugCurrentCam = 5
SET_CAM_FOV(camCutscene, 45.0)
ELSE
iDebugCurrentCam = 4
SET_CAM_FOV(camCutscene, 25.0)
ENDIF
ELIF bDebugPlayMixdown
UPDATE_CHASE_CAM(vehDebugCamCar, camCutscene, fPlaybackTime)
ELSE
IF IS_BUTTON_JUST_PRESSED(PAD1, DPADDOWN)
iDebugCurrentCam++
IF iCamRecs[iDebugCurrentCam] = 0
iDebugCurrentCam = 2
ENDIF
ENDIF
ENDIF
IF bDebugPlayMixdown
UPDATE_CAM_PLAYBACK(camCutscene, vehDebugCamCar, 1.0)
ELSE
UPDATE_CAM_PLAYBACK(camCutscene, vehDebug[iDebugCurrentCam], 1.0)
ENDIF
//DISPLAY_CAM_PLAYBACK(vehDebug)
IF bDebugRecordEdit
sCamData.v_current_pos = GET_ENTITY_COORDS(vehDebug[iDebugCurrentCam])
sCamData.v_desired_pos = GET_ENTITY_COORDS(vehDebug[iDebugCurrentCam])
sCamData.v_current_rot = GET_ENTITY_ROTATION(vehDebug[iDebugCurrentCam])
UPDATE_CAM_RECORDING(sCamData, FALSE)
IF IS_BUTTON_JUST_PRESSED(PAD1, DPADDOWN)
STOP_CAM_RECORDING(sCamData)
ENDIF
ENDIF
SET_TEXT_SCALE(0.5, 0.5)
TEXT_LABEL_63 strTime = "Time: "
strTime += GET_STRING_FROM_FLOAT(fPlaybackTime)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.1, "STRING", strTime)
SET_TEXT_SCALE(0.5, 0.5)
TEXT_LABEL_23 str_cam = "Cam: "
str_cam += iDebugCurrentCam
DISPLAY_TEXT_WITH_LITERAL_STRING(0.1, 0.15, "STRING", str_cam)
ELSE
iCurrentEvent = 1
CLEANUP_UBER_PLAYBACK(TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC RECORD_TRUCK_AND_TRAILER()
VECTOR vTruckPos = <<-1138.3113, -811.2895, 15.7751>>//<<-194.5744, -883.5518, 28.3464>>
FLOAT fTruckHeading = 307.1786 //72.8531
MODEL_NAMES modelTruck = PACKER
MODEL_NAMES modelTrailer = TANKER //TR2
CONST_INT CARREC_TRUCK 992//990
CONST_INT CARREC_TRUCK_REAR 993//991
/*SetPieceCarPos[6] = <<-1138.3113, -811.2895, 15.7751>>
SetPieceCarQuatX[6] = 0.0298
SetPieceCarQuatY[6] = -0.0129
SetPieceCarQuatZ[6] = -0.4436
SetPieceCarQuatW[6] = 0.8956
SetPieceCarRecording[6] = 14
SetPieceCarStartime[6] = 68000.0000
SetPieceCarRecordingSpeed[6] = 1.0000
SetPieceCarModel[6] = packer*/
FLOAT fQuatX, fQuatY, fQuatZ, fQuatW
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SWITCH iCurrentEvent
CASE 0
CLEAR_AREA(vTruckPos, 200.0, TRUE)
IF NOT IS_VEHICLE_DRIVEABLE(vehDebug[0])
REQUEST_MODEL(modelTruck)
REQUEST_MODEL(modelTrailer)
IF HAS_MODEL_LOADED(modelTruck)
AND HAS_MODEL_LOADED(modelTrailer)
vehDebug[0] = CREATE_VEHICLE(modelTruck, vTruckPos, fTruckHeading)
vehTransporter = CREATE_VEHICLE(modelTrailer, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehDebug[0], <<0.0, -10.0, 0.0>>), GET_ENTITY_HEADING(vehDebug[0]))
SET_MODEL_AS_NO_LONGER_NEEDED(modelTruck)
SET_MODEL_AS_NO_LONGER_NEEDED(modelTrailer)
ENDIF
ELSE
SET_ENTITY_COORDS(vehDebug[0], vTruckPos)
SET_ENTITY_HEADING(vehDebug[0], fTruckHeading)
IF NOT IS_ENTITY_DEAD(vehTransporter)
SET_ENTITY_COORDS(vehTransporter, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehDebug[0], <<0.0, -10.0, 0.0>>))
SET_ENTITY_HEADING(vehTransporter, GET_ENTITY_HEADING(vehDebug[0]))
ATTACH_VEHICLE_TO_TRAILER(vehDebug[0], vehTransporter)
DISABLE_TRAILER_BREAKING_FROM_VEHICLE(vehTransporter, TRUE)
ENDIF
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehDebug[0])
iCurrentEvent++
ENDIF
BREAK
CASE 1
IF IS_VEHICLE_DRIVEABLE(vehDebug[0])
AND NOT IS_ENTITY_DEAD(vehTransporter)
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
START_RECORDING_VEHICLE(vehDebug[0], CARREC_TRUCK, strCarrec, TRUE)
START_RECORDING_VEHICLE(vehTransporter, CARREC_TRUCK_REAR, strCarrec, TRUE)
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "RECORDING STARTED", DEFAULT_GOD_TEXT_TIME, 0)
GET_ENTITY_QUATERNION(vehDebug[0], fQuatX, fQuatY, fQuatZ, fQuatW)
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_FLOAT_TO_DEBUG_FILE(fQuatX)
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_FLOAT_TO_DEBUG_FILE(fQuatY)
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_FLOAT_TO_DEBUG_FILE(fQuatZ)
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_FLOAT_TO_DEBUG_FILE(fQuatW)
SAVE_NEWLINE_TO_DEBUG_FILE()
iCurrentEvent++
ENDIF
ENDIF
BREAK
CASE 2
IF IS_VEHICLE_DRIVEABLE(vehDebug[0])
AND NOT IS_ENTITY_DEAD(vehTransporter)
IF IS_BUTTON_PRESSED(PAD1, LEFTSHOULDER1)
IF NOT IS_VEHICLE_ATTACHED_TO_TRAILER(vehDebug[0])
APPLY_FORCE_TO_ENTITY(vehTransporter, APPLY_TYPE_FORCE, <<-10.0, 0.0, 0.0>>, <<0.0, 0.0, 5.0>>, 0, FALSE, TRUE, TRUE)
ELSE
APPLY_FORCE_TO_ENTITY(vehTransporter, APPLY_TYPE_FORCE, <<-10.0, 0.0, 1.0>>, <<0.0, -20.0, 0.0>>, 0, TRUE, TRUE, TRUE)
ENDIF
ENDIF
IF IS_BUTTON_JUST_PRESSED(PAD1, CIRCLE)
DETACH_VEHICLE_FROM_TRAILER(vehDebug[0])
ENDIF
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
STOP_RECORDING_VEHICLE(vehDebug[0])
STOP_RECORDING_VEHICLE(vehTransporter)
iCurrentEvent = 0
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC TEST_RESPAWN_CUTSCENE()
SWITCH iCurrentEvent
CASE 0
//DO_FADE_OUT_WITH_WAIT()
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<342.6215, -1397.4391, 31.507>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 50.9027)
//LOAD_SCENE(<<342.6215, -1397.4391, 31.507>>)
camCutscene = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<270.321259,-1387.484253,36.111080>>,<<14.247233,0.000000,-102.191833>>,53.342339, TRUE)
SET_CAM_PARAMS(camCutscene, <<270.513092,-1387.525757,35.338066>>,<<14.247233,0.000000,-102.191833>>,53.342339, 5000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SETTIMERB(0)
//DO_FADE_IN_WITH_WAIT()
iCurrentEvent++
BREAK
CASE 1
IF TIMERB() > 3000
SET_CAM_PARAMS(camCutscene,<<336.940125,-1395.949097,35.062832>>,<<6.609568,-0.000528,-113.654175>>,50.000000)
SET_CAM_PARAMS(camCutscene,<<338.378937,-1396.828003,32.938160>>,<<-0.780622,-0.000000,-9.172981>>,50.000000, 4000)
TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), <<338.7186, -1394.0708, 31.5032>>, PEDMOVE_WALK, -1)
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 2
IF TIMERB() > 2500
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
RENDER_SCRIPT_CAMS(FALSE, TRUE, 2000, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
SETTIMERB(0)
iCurrentEvent++
ENDIF
BREAK
CASE 3
IF TIMERB() > 1000
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
iCurrentEvent++
ENDIF
BREAK
ENDSWITCH
ENDPROC
//Used after re-recording a chase route: compares the positions of the recordings at different times so set-pieces can be easily adjusted to match
//the new timings.
PROC COMPARE_TRIGGER_RECORDINGS(MODEL_NAMES modelCar, INT iCarrecOld, INT iCarrecNew, STRING strCarrecName)
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF eSectionStage = SECTION_STAGE_SETUP
REQUEST_MODEL(modelCar)
IF HAS_MODEL_LOADED(modelCar)
REMOVE_ALL_BLIPS()
vehDebug[0] = CREATE_VEHICLE(modelCar, sMainCars[0].vStartPos, sMainCars[0].fStartHeading)
SET_ENTITY_COLLISION(vehDebug[0], FALSE)
vehDebug[1] = CREATE_VEHICLE(modelCar, sMainCars[1].vStartPos, sMainCars[1].fStartHeading)
SET_ENTITY_COLLISION(vehDebug[1], FALSE)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehDebug[0])
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(PLAYER_PED_ID(), KNOCKOFFVEHICLE_NEVER)
SET_MODEL_AS_NO_LONGER_NEEDED(modelCar)
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(vehDebug[0])
AND IS_VEHICLE_DRIVEABLE(vehDebug[1])
IF iCurrentEvent = 0
REQUEST_VEHICLE_RECORDING(iCarrecOld, strCarrecName)
REQUEST_VEHICLE_RECORDING(iCarrecNew, strCarrecName)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrecOld, strCarrecName)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(iCarrecNew, strCarrecName)
START_PLAYBACK_RECORDED_VEHICLE(vehDebug[0], iCarrecOld, strCarrecName)
START_PLAYBACK_RECORDED_VEHICLE(vehDebug[1], iCarrecNew, strCarrecName)
iCurrentEvent++
ENDIF
ELIF iCurrentEvent = 1
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehDebug[0])
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehDebug[1])
SET_PLAYBACK_SPEED(vehDebug[0], 0.0)
SET_PLAYBACK_SPEED(vehDebug[1], 0.0)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehDebug[0], fDebugOldTriggerTime)
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehDebug[1], fDebugNewTriggerTime)
ELSE
iCurrentEvent--
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC UPDATE_WIDGETS()
IF bDebugRecordTraffic
IF eMissionStage = STAGE_CHOOSE_CAR
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
MISSION_CLEANUP()
eMissionStage = STAGE_RECORD_TRAFFIC
bDebugRecordTraffic = FALSE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
IF bDebugRecordSetpieces
IF eMissionStage = STAGE_CHOOSE_CAR
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
MISSION_CLEANUP()
eMissionStage = STAGE_RECORD_SET_PIECES
bDebugRecordSetpieces = FALSE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
IF bDebugRedoTrigger
IF eMissionStage = STAGE_CHOOSE_CAR
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
MISSION_CLEANUP()
eMissionStage = STAGE_REDO_TRIGGER_RECORDING
bDebugRedoTrigger = FALSE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
IF bDebugPlaybackCamera
IF eMissionStage = STAGE_CHOOSE_CAR
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
MISSION_CLEANUP()
eMissionStage = STAGE_PLAYBACK_CAMERA
bDebugPlaybackCamera = FALSE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
IF bDebugRecordCamera
IF eMissionStage = STAGE_CHOOSE_CAR
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
MISSION_CLEANUP()
eMissionStage = STAGE_RECORD_CAMERA
bDebugRecordCamera = FALSE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
IF bDebugRecordTrailer
IF eMissionStage = STAGE_CHOOSE_CAR
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
MISSION_CLEANUP()
eMissionStage = STAGE_DEBUG_RECORD_TRAILER
bDebugRecordTrailer = FALSE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
ENDIF
IF bDebugTestRespawnCutscene
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
MISSION_CLEANUP()
eMissionStage = STAGE_DEBUG_RESPAWN_CAM_TEST
bDebugTestRespawnCutscene = FALSE
eSectionStage = SECTION_STAGE_RUNNING
iCurrentEvent = 0
ENDIF
vDebugVectorResult = vDebugVectorA + vDebugVectorB
IF bDebugUseNewAbilityButton
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)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SPECIAL_ABILITY_FRANKLIN)
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_HORN)
OR IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_HORN)
fDebugTimeSinceLeftStickPressed += GET_FRAME_TIME()
ELSE
fDebugTimeSinceLeftStickPressed = 0.0
ENDIF
IF fDebugTimeSinceLeftStickPressed < 1.0
//DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HORN)
ENDIF
IF bDebugSticksReleased
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_LS)
AND IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RS)
IF IS_SPECIAL_ABILITY_ENABLED(PLAYER_ID())
IF IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
SPECIAL_ABILITY_DEACTIVATE(PLAYER_ID())
ELSE
SPECIAL_ABILITY_ACTIVATE(PLAYER_ID())
ENDIF
ENDIF
bDebugSticksReleased = FALSE
ENDIF
ELSE
IF NOT IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_LS)
AND NOT IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RS)
bDebugSticksReleased = TRUE
ENDIF
ENDIF
ENDIF
IF bDebugCompareTriggerRecordings
eSectionStage = SECTION_STAGE_JUMPING_TO_STAGE
MISSION_CLEANUP()
eMissionStage = STAGE_DEBUG_COMPARE_RECORDINGS
bDebugCompareTriggerRecordings = FALSE
eSectionStage = SECTION_STAGE_SETUP
ENDIF
IF bDebugLoadHorizonCloud
LOAD_CLOUD_HAT("horizon")
PRINT_NOW("horizon", DEFAULT_GOD_TEXT_TIME, 0)
bDebugLoadHorizonCloud = FALSE
ELIF bDebugLoadWispyCloud
LOAD_CLOUD_HAT("wispy")
PRINT_NOW("wispy", DEFAULT_GOD_TEXT_TIME, 0)
bDebugLoadWispyCloud = FALSE
ELIF bDebugLoadContrailsCloud
LOAD_CLOUD_HAT("contrails")
PRINT_NOW("contrails", DEFAULT_GOD_TEXT_TIME, 0)
bDebugLoadContrailsCloud = FALSE
ELIF bDebugLoadPuffsCloud
LOAD_CLOUD_HAT("puffs")
PRINT_NOW("puffs", DEFAULT_GOD_TEXT_TIME, 0)
bDebugLoadPuffsCloud = FALSE
ELIF bDebugLoadAltoCloud
LOAD_CLOUD_HAT("altostratus")
PRINT_NOW("altostratus", DEFAULT_GOD_TEXT_TIME, 0)
bDebugLoadAltoCloud = FALSE
ELIF bDebugLoadStormyCloud
LOAD_CLOUD_HAT("stormy 01")
PRINT_NOW("stormy 01", DEFAULT_GOD_TEXT_TIME, 0)
bDebugLoadStormyCloud = FALSE
ENDIF
IF bDebugUnloadCloudHats
UNLOAD_ALL_CLOUD_HATS()
bDebugUnloadCloudHats = FALSE
ENDIF
IF bDebugFerrisWheelTest
//Scene rotations: (180.0, 250.0) (300.0, 210.0)
IF NOT DOES_ENTITY_EXIST(pedCreditsFerrisWheel[0])
REQUEST_MODEL(A_F_Y_BEACH_01)
REQUEST_ANIM_DICT(strFerrisWheelAnims)
IF HAS_MODEL_LOADED(A_F_Y_BEACH_01)
AND SETUP_REQ_FERRIS_WHEEL()
AND HAS_ANIM_DICT_LOADED(strFerrisWheelAnims)
REMOVE_IPL("ferris_finale_Anim")
pedCreditsFerrisWheel[0] = CREATE_PED(PEDTYPE_MISSION, A_F_Y_BEACH_01, <<-1664.9, -1148.1, 26.3>>)
SET_ENTITY_INVINCIBLE(pedCreditsFerrisWheel[0], TRUE)
iSyncSceneFerrisWheel[0] = CREATE_SYNCHRONIZED_SCENE(<<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncSceneFerrisWheel[0], objFerrisCars[0], 0)
TASK_SYNCHRONIZED_SCENE(pedCreditsFerrisWheel[0], iSyncSceneFerrisWheel[0], strFerrisWheelAnims, "Stand_Idle_1_PEDA", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT)
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncSceneFerrisWheel[0], TRUE)
ENDIF
ELSE
IF NOT IS_PED_INJURED(pedCreditsFerrisWheel[0])
IF bDebugFerrisWheelReattach
INT iClosestCar = GET_CLOSEST_FERRIS_CAR_TO_COORDS(GET_FINAL_RENDERED_CAM_COORD())
CLEAR_PED_TASKS_IMMEDIATELY(pedCreditsFerrisWheel[0])
iSyncSceneFerrisWheel[0] = CREATE_SYNCHRONIZED_SCENE(vDebugFerrisWheelOffset, vDebugFerrisWheelRot)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncSceneFerrisWheel[0], objFerrisCars[iClosestCar], 0)
IF iDebugWheelAnim = 0
TASK_SYNCHRONIZED_SCENE(pedCreditsFerrisWheel[0], iSyncSceneFerrisWheel[0], strFerrisWheelAnims, "Stand_Idle_1_PEDA", INSTANT_BLEND_IN, INSTANT_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT, RBF_FALLING | RBF_IMPACT_OBJECT)
ELIF iDebugWheelAnim = 1
TASK_SYNCHRONIZED_SCENE(pedCreditsFerrisWheel[0], iSyncSceneFerrisWheel[0], strFerrisWheelAnims, "Stand_Idle_1_PEDB", INSTANT_BLEND_IN, INSTANT_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT, RBF_FALLING | RBF_IMPACT_OBJECT)
ELIF iDebugWheelAnim = 2
TASK_SYNCHRONIZED_SCENE(pedCreditsFerrisWheel[0], iSyncSceneFerrisWheel[0], strFerrisWheelAnims, "Stand_Idle_2_PEDA", INSTANT_BLEND_IN, INSTANT_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT, RBF_FALLING | RBF_IMPACT_OBJECT)
ELIF iDebugWheelAnim = 3
TASK_SYNCHRONIZED_SCENE(pedCreditsFerrisWheel[0], iSyncSceneFerrisWheel[0], strFerrisWheelAnims, "Stand_Idle_2_PEDB", INSTANT_BLEND_IN, INSTANT_BLEND_OUT,
SYNCED_SCENE_DONT_INTERRUPT, RBF_FALLING | RBF_IMPACT_OBJECT)
ENDIF
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncSceneFerrisWheel[0], TRUE)
bDebugFerrisWheelReattach = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
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
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
PRINTLN("armenian1.sc - Player used an S-pass.")
MISSION_PASSED(TRUE)
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)
MISSION_FAILED(FAILED_GENERIC)
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
PRINTLN("Armenian1.sc - Used J-skip")
eSectionStage = SECTION_STAGE_SKIP
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
INT iCurrentStage = ENUM_TO_INT(eMissionStage)
IF iCurrentStage > 0
PRINTLN("Armenian1.sc - Used P-skip: ", iCurrentStage)
MISSION_STAGE eStage = INT_TO_ENUM(MISSION_STAGE, iCurrentStage - 1)
JUMP_TO_STAGE(eStage, TRUE)
ENDIF
ENDIF
IF LAUNCH_MISSION_STAGE_MENU(sSkipMenu, iDebugJumpStage)
PRINTLN("Armenian1.sc - Used Z-skip: ", iDebugJumpStage)
MISSION_STAGE eStage = INT_TO_ENUM(MISSION_STAGE, iDebugJumpStage)
JUMP_TO_STAGE(eStage, TRUE)
ENDIF
iDebugNumPrintsThisFrame = 0
ENDIF
ENDPROC
#ENDIF
SCRIPT
SET_MISSION_FLAG(TRUE)
IF HAS_FORCE_CLEANUP_OCCURRED()
SET_FADE_IN_AFTER_DEATH_ARREST(FALSE)
Mission_Flow_Mission_Force_Cleanup()
eSectionStage = SECTION_STAGE_RUNNING //If the mission is in the middle of a skip cleanup (e.g. waiting for a cutscene to finish) Force cleanup could break.
g_eArm1PrestreamDenise = ARM1_PD_3_release
MISSION_CLEANUP()
ENDIF
MISSION_SETUP()
//TODO 547497: Set the clock and date for the start of the game.
SET_CLOCK_TIME(8, 0, 0)
SET_CLOCK_DATE(6, JUNE, 2009)
IF Is_Replay_In_Progress()
INT iStage = Get_Replay_Mid_Mission_Stage()
IF g_bShitskipAccepted
iStage++
ENDIF
IF iStage = 0
CLEAR_SCENARIO_SPAWN_HISTORY() //2071893 - This ensures the cat scenario is there on a retry.
JUMP_TO_STAGE(STAGE_CHOOSE_CAR)
ELIF iStage = CHECKPOINT_MID_CHASE
JUMP_TO_STAGE(STAGE_CHASE_MID_POINT)
ELIF iStage = CHECKPOINT_LOSE_COPS
IF g_bShitskipAccepted
JUMP_TO_STAGE(STAGE_COPS_ARRIVE_CUTSCENE)
ELSE
JUMP_TO_STAGE(STAGE_GO_TO_GARAGE)
ENDIF
ELIF iStage = CHECKPOINT_GO_HOME
IF g_bShitskipAccepted
JUMP_TO_STAGE(STAGE_SHOWROOM_CUTSCENE)
ELSE
JUMP_TO_STAGE(STAGE_GO_TO_HOUSE)
ENDIF
ELIF iStage > CHECKPOINT_GO_HOME
IF g_bShitskipAccepted
JUMP_TO_STAGE(STAGE_HOUSE_CUTSCENE)
ELSE
JUMP_TO_STAGE(STAGE_HOUSE_CUTSCENE)
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN("armenian1.sc - Player used a replay to stage: ", iStage)
#ENDIF
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
bUsedACheckpoint = TRUE
ELSE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "OPENING_CUTSCENE")
ENDIF
WHILE (TRUE)
WAIT(0)
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_FranklinAndLamar")
//Reset the checkpoint flag once the mission is running again. This flag is used to determine if we jumped using a checkpoint or via Z-skip,
//as some bits of setup are only done when debug skipping.
IF bUsedACheckpoint
IF eSectionStage = SECTION_STAGE_RUNNING
bUsedACheckpoint = FALSE
ENDIF
ENDIF
//Check if the player has used first-person mode yet.
IF NOT GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_PLAYER_HAS_USED_FP_VIEW)
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON
OR GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_PLAYER_HAS_USED_FP_VIEW, TRUE)
ENDIF
ENDIF
IF eMissionStage < STAGE_HOUSE_CUTSCENE
IF DOES_ENTITY_EXIST(sMainCars[0].veh)
IF NOT IS_VEHICLE_DRIVEABLE(sMainCars[0].veh)
IF NOT IS_VEHICLE_DRIVEABLE(sMainCars[1].veh)
MISSION_FAILED(FAILED_DESTROYED_BOTH_CARS)
ELSE
MISSION_FAILED(FAILED_DESTROYED_A_CAR)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sMainCars[1].veh)
IF NOT IS_VEHICLE_DRIVEABLE(sMainCars[1].veh)
IF NOT IS_VEHICLE_DRIVEABLE(sMainCars[0].veh)
MISSION_FAILED(FAILED_DESTROYED_BOTH_CARS)
ELSE
MISSION_FAILED(FAILED_DESTROYED_A_CAR)
ENDIF
ENDIF
ENDIF
ELSE
IF DOES_ENTITY_EXIST(sMainCars[iPlayersCar].veh)
IF NOT IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
MISSION_FAILED(FAILED_DESTROYED_CAR)
ENDIF
ENDIF
ENDIF
//Stuck check for player's car
IF eMissionStage > STAGE_START_CHASE_CUTSCENE
IF DOES_ENTITY_EXIST(sMainCars[iPlayersCar].veh)
IF IS_VEHICLE_DRIVEABLE(sMainCars[iPlayersCar].veh)
IF IS_VEHICLE_PERMANENTLY_STUCK(sMainCars[iPlayersCar].veh)
MISSION_FAILED(FAILED_CAR_STUCK)
ENDIF
ENDIF
ENDIF
ENDIF
//Fail for destroying Franklin's car.
IF eMissionStage < STAGE_HOUSE_CUTSCENE
IF DOES_ENTITY_EXIST(vehFranklinsCar)
IF IS_VEHICLE_DRIVEABLE(vehFranklinsCar)
IF eMissionStage > STAGE_SHOWROOM_CUTSCENE
IF IS_VEHICLE_PERMANENTLY_STUCK(vehFranklinsCar)
MISSION_FAILED(FAILED_FRANKLINS_CAR_STUCK)
ENDIF
ENDIF
ELSE
MISSION_FAILED(FAILED_DESTROYED_FRANKLINS_CAR)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sLamar.ped)
IF IS_PED_INJURED(sLamar.ped)
MISSION_FAILED(FAILED_KILLED_BUDDY)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sSimeon.ped)
IF IS_PED_INJURED(sSimeon.ped)
MISSION_FAILED(FAILED_KILLED_SIMEON)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sJimmy.ped)
IF IS_PED_INJURED(sJimmy.ped)
MISSION_FAILED(FAILED_KILLED_JIMMY)
ENDIF
ENDIF
IF eMissionStage > STAGE_COPS_ARRIVE_CUTSCENE
CHECK_SHOWROOM_FAIL()
ENDIF
//When the player reaches the garage unlock the stats screen: use a fake selector ped call.
IF eMissionStage >= STAGE_GO_TO_HOUSE
UPDATE_SELECTOR_HUD(sDummySelectorPeds)
ENDIF
//2255037 - If we've reached the lose cops stage then allow Franklin to unlock Michael's safehouse door.
IF NOT bUnlockedMichaelsMansion
IF eMissionStage >= STAGE_GO_TO_GARAGE
CDEBUG1LN(DEBUG_MISSION, "[", GET_THIS_SCRIPT_NAME(), ".sc] Registering Franklin for AUTODOOR_MICHAEL_MANSION_GATE")
REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MICHAEL_MANSION_GATE, PLAYER_PED_ID())
bUnlockedMichaelsMansion = TRUE
ENDIF
ENDIF
SWITCH eMissionStage
CASE STAGE_OPENING_CUTSCENE
OPENING_CUTSCENE()
BREAK
CASE STAGE_CHOOSE_CAR
CHOOSE_CAR()
BREAK
CASE STAGE_START_CHASE_CUTSCENE
//CHASE_START_CUTSCENE_2()
CHASE_START_CUTSCENE_ANIMATED_CAMS()
BREAK
CASE STAGE_CHASE
CASE STAGE_CHASE_MID_POINT
CHASE_BUDDY()
BREAK
CASE STAGE_COPS_ARRIVE_CUTSCENE
COPS_ARRIVE_CUTSCENE()
BREAK
CASE STAGE_GO_TO_GARAGE
GO_TO_GARAGE()
BREAK
CASE STAGE_SHOWROOM_INTRO_CUTSCENE
SHOWROOM_INTRO_CUTSCENE()
BREAK
CASE STAGE_MEET_SIMEON
MEET_SIMEON()
BREAK
CASE STAGE_SHOWROOM_CUTSCENE
SHOWROOM_CUTSCENE()
BREAK
CASE STAGE_GO_TO_HOUSE
GO_TO_HOUSE()
BREAK
CASE STAGE_HOUSE_CUTSCENE
HOUSE_CUTSCENE_COMBINED_VERSION()
BREAK
CASE STAGE_RECORD_TRAFFIC
#IF IS_DEBUG_BUILD
RECORD_CHASE_GHOST_AND_TRAFFIC()
#ENDIF
BREAK
CASE STAGE_RECORD_SET_PIECES
#IF IS_DEBUG_BUILD
RECORD_CHASE_SET_PIECES()
#ENDIF
BREAK
CASE STAGE_REDO_TRIGGER_RECORDING
#IF IS_DEBUG_BUILD
REDO_TRIGGER_RECORDING()
#ENDIF
BREAK
CASE STAGE_RECORD_CAMERA
#IF IS_DEBUG_BUILD
RECORD_CAMERA()
#ENDIF
BREAK
CASE STAGE_PLAYBACK_CAMERA
#IF IS_DEBUG_BUILD
PLAYBACK_CAMERA()
#ENDIF
BREAK
CASE STAGE_DEBUG_RECORD_TRAILER
#IF IS_DEBUG_BUILD
RECORD_TRUCK_AND_TRAILER()
#ENDIF
BREAK
CASE STAGE_DEBUG_RESPAWN_CAM_TEST
#IF IS_DEBUG_BUILD
TEST_RESPAWN_CUTSCENE()
#ENDIF
BREAK
CASE STAGE_DEBUG_COMPARE_RECORDINGS
#IF IS_DEBUG_BUILD
COMPARE_TRIGGER_RECORDINGS(POLICE, 54, 108, "bb_chase")
#ENDIF
BREAK
ENDSWITCH
UPDATE_RAGE()
#IF IS_DEBUG_BUILD
DO_DEBUG()
#ENDIF
ENDWHILE
ENDSCRIPT