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

27961 lines
1015 KiB
Python
Executable File

//|=======================================================================================|
//| Author: Lukasz Bogaj / David Gentles Date: 15/11/2011 |
//|=======================================================================================|
//| FRANKLIN1.sc |
//| GHETTO SAFARI |
//| |
//|=======================================================================================|
//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
//|==================================== INCLUDE FILES ====================================|
USING "rage_builtins.sch"
USING "globals.sch"
//Commands headers
USING "commands_misc.sch"
USING "commands_pad.sch"
USING "commands_script.sch"
USING "commands_player.sch"
USING "commands_streaming.sch"
USING "commands_vehicle.sch"
USING "commands_camera.sch"
USING "commands_path.sch"
USING "commands_fire.sch"
USING "commands_graphics.sch"
USING "commands_object.sch"
USING "commands_entity.sch"
USING "commands_cutscene.sch"
USING "commands_event.sch"
USING "commands_itemsets.sch"
USING "commands_audio.sch"
USING "commands_recording.sch"
//Script headers
USING "script_player.sch"
USING "script_blips.sch"
USING "script_ped.sch"
USING "script_buttons.sch"
USING "script_misc.sch"
//Public headers
USING "selector_public.sch"
USING "dialogue_public.sch"
USING "player_ped_public.sch"
USING "locates_public.sch"
USING "replay_public.sch"
USING "cutscene_public.sch"
USING "mission_stat_public.sch"
USING "CompletionPercentage_public.sch"
USING "chop_cam_public.sch"
USING "chop_van_public.sch"
USING "streamed_scripts.sch"
USING "model_enums.sch"
USING "flow_public_core_override.sch"
USING "social_public.sch"
USING "taxi_functions.sch"
USING "finance_control_public.sch"
USING "carsteal_public.sch"
USING "building_control_public.sch"
USING "clearMissionArea.sch"
USING "emergency_call.sch"
USING "cheat_controller_public.sch"
USING "stripclub_public.sch"
//================================ UBER PLAYBACK CONSTANTS ===============================|
//Replace the default uber playback values stored in "traffic_default_values.sch"
//total should not exceed 225
CONST_INT TOTAL_NUMBER_OF_TRAFFIC_CARS 1
CONST_INT TOTAL_NUMBER_OF_PARKED_CARS 1
CONST_INT TOTAL_NUMBER_OF_SET_PIECE_CARS 5
//total should not exceed 12
CONST_INT MAX_NUMBER_OF_TRAFFIC_CARS_PLAYING_BACK 1
CONST_INT MAX_NUMBER_OF_SET_PIECE_CARS_PLAYING_BACK 5
//this should be fine
CONST_INT MAX_NUMBER_OF_PARKED_CARS_PLAYING_BACK 1
//============================== END UBER PLAYBACK CONSTANTS =============================|
USING "traffic.sch"
//Debug headers
#IF IS_DEBUG_BUILD
USING "script_debug.sch"
USING "select_mission_stage.sch"
#ENDIF
//===================================== ENUMS & STRUCTS ==================================|
/// PURPOSE: Specifies stages of the mission.
ENUM MISSION_STAGES
MISSION_STAGE_CUTSCENE_INTRO = 0, //Intro cutscene
MISSION_STAGE_DRIVE_TO_DEAL = 1, //Franklin, Trevor, Lamar and Chop drive to Grove Street for the drug deal
MISSION_STAGE_CUTSCENE_DEAL = 2, //Cutscene of the drug deal in Grove Street
MISSION_STAGE_GROVE_STREET_SHOOTOUT = 3, //Franklin, Trevor, Lamar and Chop fight through a shootout in Grove Street
MISSION_STAGE_RUN_TO_SPEEDOPHILES = 4, //Franklin, Trevor, Lamar run from Grove Street to the storm drain and steal seasharks
MISSION_STAGE_SPEEDOPHILE_RIDE = 5, //Franklin, Trevor and Lamar drive seasharks
MISSION_STAGE_LOSE_COPS = 6, //Franklin, Trevor and Lamar have to lose the cops
MISSION_STAGE_CUTSCENE_DROPOFF_LAMAR = 7,
MISSION_STAGE_CUTSCENE_DROPOFF_TREVOR = 8,
MISSION_STAGE_CUTSCENE_DROPOFF_FRANKLIN = 9,
MISSION_STAGE_END = 10, //End
#IF IS_DEBUG_BUILD
MISSION_STAGE_DEBUG_PLAYBACK_CHASE = 11,
MISSION_STAGE_DEBUG_RECORD_CHASE = 12,
#ENDIF
MISSION_STAGE_PASSED, //Mission passed
MISSION_STAGE_FAILED //Mission failed
ENDENUM
/// PURPOSE: Specifies mission fail reasons.
ENUM MISSION_FAILS
MISSION_FAIL_EMPTY = 0, //Generic fail
MISSION_FAIL_DEAL_BLOWN, //Deal is blown
MISSION_FAIL_CAR_DEAD, //Mission car destroyed
MISSION_FAIL_CAR_UNDRIVABLE, //Mission car undrivable
MISSION_FAIL_BUDDIES_LEFT_BEHIND, //Player abandoned buddies
MISSION_FAIL_BUDDIES_LOST, //Player lost buddies
MISSION_FAIL_LAMAR_DEAD, //Lamar killed
MISSION_FAIL_LAMAR_LEFT_BEHIND, //Lamar left behind when player loses cops with Lamar
MISSION_FAIL_TREVOR_DEAD, //Trevor killed
MISSION_FAIL_TREVOR_LEFT_BEHIND, //Trevor left behind in lose cops stage when player loses cops with Trevor
MISSION_FAIL_FRANKLIN_DEAD, //Franklin killed
MISSION_FAIL_FRANKLIN_LEFT_BEHIND, //Franklin left behind in lose cops stage when plaeyr
MISSION_FAIL_CHOP_DEAD, //Chop the dog killed
MISSION_FAIL_CHOP_DROWNED, //Chop the dog drowned in the van
MISSION_FAIL_SPEEDOPHILE_DEAD, //Speedophile destroyed
MISSION_FAIL_SPEEDOPHILE_UNDRIVABLE, //Speedophile undrivable
MISSION_FAIL_FORCE_FAIL, //Debug forced fail
MAX_MISSION_FAILS
ENDENUM
/// PURPOSE: Specifies mid-mission checkpoints for mission retry.
ENUM MID_MISSION_STAGES
MID_MISSION_STAGE_DRIVE_TO_DEAL = 0, //Checkpoint at MISSION_STAGE_DRIVE_TO_DEAL
MID_MISSION_STAGE_GROVE_STREET_SHOOTOUT = 1, //Checkpoint at MISSION_STAGE_GROVE_STREET_SHOOTOUT
MID_MISSION_STAGE_RUN_TO_SPEEDOPHILES = 2, //Checkpoint at MISSION_STAGE_RUN_TO_SPEEDOPHILES
MID_MISSION_STAGE_SPEEDOPHILE_RIDE = 3, //Checkpoint at MISSION_STAGE_SPEEDOPHILE_RIDE
MID_MISSION_STAGE_LOSE_COPS = 4 //Checkpoint at MISSION_STAGE_LOSE_COPS
ENDENUM
/// PURPOSE: Specifies film crew peds indexes
ENUM FILM_CREW_PEDS
FCP_JACKEDGIRL = 0,
FCP_GIRL = 1,
FCP_CLAY = 2,
FCP_CAMERAMAN = 3,
FCP_BOOMMAN = 4,
MAX_FILM_CREW_PEDS
ENDENUM
/// PURPOSE: Specifies events that happen in the shootout
ENUM SHOOTOUT_EVENTS
EVENT_SHOOTOUT_STARTED = 0,
EVENT_SHOOTOUT_ENDED,
EVENT_ENEMY_WAVE_1_SPAWNED,
EVENT_ENEMY_WAVE_2_SPAWNED,
EVENT_ENEMY_WAVE_CARINTERSECTION_SPAWNED,
EVENT_ENEMY_WAVE_3_SPAWNED,
EVENT_ENEMY_WAVE_4_SPAWNED,
EVENT_ENEMY_WAVE_5_SPAWNED,
EVENT_ENEMY_WAVE_6_SPAWNED,
EVENT_ENEMY_WAVE_7_SPAWNED,
EVENT_COPS_SPAWNED,
EVENT_COPS_ARRIVE,
EVENT_COPS_REINFORCEMENTS_SPAWNED,
EVENT_ENEMIES_GROUP1_KILLED,
EVENT_ENEMIES_GROUP2_KILLED,
EVENT_ENEMIES_GROUP3_KILLED,
EVENT_ENEMIES_GROUP4_KILLED,
EVENT_ENEMIES_GROUP5_KILLED,
EVENT_ENEMIES_GROUP6_KILLED,
EVENT_ENEMIES_GROUP7_KILLED,
EVENT_ENEMIES_GROUP8_KILLED,
EVENT_ENEMIES_GROUP9_KILLED,
EVENT_ENEMIES_DOG1_KILLED,
EVENT_ENEMIES_DOG2_KILLED,
EVENT_ENEMIES_CARCULDESACLEFT_KILLED,
EVENT_ENEMIES_CARCULDESACRIGHT_KILLED,
EVENT_ENEMIES_CARINTERSECTION1LEFT_KILLED,
EVENT_ENEMIES_CARINTERSECTION1RIGHT_KILLED,
EVENT_ENEMIES_CARINTERSECTION2LEFT_KILLED,
EVENT_ENEMIES_CARINTERSECTION2RIGHT_KILLED,
EVENT_ENEMIES_CARSTREETLEFT_KILLED,
EVENT_ENEMIES_CARSTREETRIGHT_KILLED,
EVENT_ENEMIES_CARPARKED_KILLED,
EVENT_ENEMIES_HOUSE_KILLED,
EVENT_BUDDIES_WAITING_FOR_PLAYER,
EVENT_PLAYER_ENTERED_RIVER_ENTRANCE_LOCATE,
//total number of events
EVENT_MAX_EVENTS
ENDENUM
ENUM PED_STATES
PED_STATE_IDLE = 0,
PED_STATE_PLAYING_BEGIN_ANIM,
PED_STATE_PLAYING_REACTION_ANIM,
PED_STATE_PLAYING_END_ANIM,
PED_STATE_FLEEING,
PED_STATE_COMBAT_ON_FOOT,
PED_STATE_COMBAT_FROM_VEHICLE,
PED_STATE_RUNNING_TO_ALLEY,
PED_STATE_WAITING_IN_ALLEY,
PED_STATE_RUNNING_TO_RIVER,
PED_STATE_WAITING_FOR_PLAYER,
PED_STATE_RUNNING_TO_VEHICLE,
PED_STATE_WAITING_AT_VEHICLE,
PED_STATE_ENTERING_VEHICLE,
PED_STATE_SITTING_IN_VEHICLE,
PED_STATE_EXITING_VEHICLE,
PED_STATE_STARTING_RECORDING_PLAYBACK,
PED_STATE_RECORDING_PLAYBACK,
PED_STATE_ENDING_RECORDING_PLAYBACK,
PED_STATE_CATCHING_UP_WITH_RECORDING,
PED_STATE_FLEE_COPS_ON_FOOT,
PED_STATE_FOLLOWING_PLAYER,
PED_STATE_PLAYER_CONTROL_ENABLED,
PED_STATE_PLAYER_CONTROL_DISABLED,
PED_STATE_WAITING_FOR_TASK_AFTER_SWITCH
ENDENUM
ENUM PED_CLEANUP_REASONS
PED_CLEANUP_NO_CLEANUP = 0,
PED_CLEANUP_KILLED_BY_PLAYER_AS_FRANKLIN = 1,
PED_CLEANUP_KILLED_BY_PLAYER_AS_TREVOR = 2,
PED_CLEANUP_KILLED_BY_FRANKLIN = 3,
PED_CLEANUP_KILLED_BY_TREVOR = 4,
PED_CLEANUP_KILLED_BY_LAMAR = 5,
PED_CLEANUP_KILLED_BY_CHOP = 6,
PED_CLEANUP_NONE = 7
ENDENUM
ENUM PLAYER_BUDDIES
PLAYER_BUDDY_NONE = 0,
PLAYER_BUDDY_FRANKLIN = 1,
PLAYER_BUDDY_TREVOR = 2,
PLAYER_BUDDY_LAMAR = 3
ENDENUM
ENUM PED_SPEEDOPHILE
SPEEDOPHILE_1 = 0,
SPEEDOPHILE_2 = 1,
SPEEDOPHILE_3 = 2,
MAX_SPEEDOPHILES = 3
ENDENUM
/// PURPOSE: Specifies details of mission peds.
STRUCT PED_STRUCT
PED_INDEX PedIndex //Ped Index
BLIP_INDEX BlipIndex //Ped's Blip Index
ITEMSET_INDEX ItemsetIndex //Ped's Itemset Index
VECTOR vPosition //Ped's start location
FLOAT fHeading //Ped's start heading
MODEL_NAMES ModelName //Ped's model
INT iTimer //Ped's timer
INT iPedConversationTimer
INT iHealthConversationTimer
INT iHealthConversationCounter
INT iProgress //Ped's progress used for controlling scripted behaviour
FLOAT fDistanceToTargetPed
FLOAT fDistanceToCoord
BOOL bHasTask
BOOL bWaitingForPlayer
BOOL bWaitingToAdvance //
BOOL bFleeing
BOOL bBehindPlayer
BOOL bDefensiveAreaTaken
BOOL bInPosition
BOOL bCleanupConversationTriggered
BOOL bIgnoreProgress
BOOL bHasSwitchTask
BOOL bVehicleReached
PED_STATES eState
PED_CLEANUP_REASONS eCleanupReason
PED_SPEEDOPHILE ePedVehicle
#IF IS_DEBUG_BUILD
TEXT_LABEL_31 sDebugName
#ENDIF
ENDSTRUCT
/// PURPOSE: Specifies details of mission enemies.
STRUCT ENEMY_STRUCT
PED_INDEX PedIndex //Enemy Ped Index
BLIP_INDEX BlipIndex //Enemy Blip Index
AI_BLIP_STRUCT EnemyBlipData //Enemy Blip Data
ITEMSET_INDEX ItemsetIndex //Enemy Itemset Index, used for preferred cover points //IS THIS STILL NEEDED?
BOOL bCreated //Indicates if this enemy has been created
INT iProgress //Specifies enemy ped behaviour progress, used for set pieces, dead ped swapping etc.
INT iTimer //Enemy Ped timer
FLOAT fDistanceToTarget
BOOL bHasTask
INT iCleanupAttempts
PED_CLEANUP_REASONS eCleanupReason
#IF IS_DEBUG_BUILD
TEXT_LABEL_31 sDebugName
#ENDIF
ENDSTRUCT
/// PURPOSE: Specifies details of mission vehicles.
STRUCT VEH_STRUCT
VEHICLE_INDEX VehicleIndex //Vehicle index
BLIP_INDEX BlipIndex //Vehicle blip
VECTOR vPosition //Vehicle postion
FLOAT fHeading //Vehicle heading
MODEL_NAMES ModelName //Vehicle model
INT iRecordingNumber //Vehicle recording number
FLOAT fPlaybackSpeed //Vehicle recording playback speed
FLOAT fPlaybackTime
BOOL bDriverDead //Vehicle's driver is dead
INT iProgress //Progress counter used for set pieces and flow control
BOOL bAutoDrive
ENDSTRUCT
/// PURPOSE: Specifies details of mission trains.
STRUCT TRAIN_STRUCT
VEHICLE_INDEX VehicleIndex
INT iConfiguration
VECTOR vPosition
MODEL_NAMES ModelName1
MODEL_NAMES ModelName2
MODEL_NAMES ModelName3
INT iProgress
ENDSTRUCT
/// PURPOSE: Specifies details of mission objects.
STRUCT OBJECT_STRUCT
OBJECT_INDEX ObjectIndex //Object index
MODEL_NAMES ModelName //Object model
VECTOR vPosition //Object position
VECTOR vRotation //Object rotation
ENDSTRUCT
/// PURPOSE: Specifies details of script created coverpoints to use for scripted buddy peds in combat.
STRUCT COVERPOINT_STRUCT
COVERPOINT_INDEX CoverpointIndex //CoverpointIndex
VECTOR vPosition //Coverpoint position
FLOAT fHeading //Coverpoint heading
COVERPOINT_USAGE CoverpointUsage //Coverpoint usage
COVERPOINT_HEIGHT CoverpointHeight //Coverpoint height
COVERPOINT_ARC CoverpointArc //Coverpoint arc
FLOAT fDistance //Coverpoint distance from the start of the street
BOOL bActive //Indicates if this coverpoint should be considered when searching for nearest coverpoint
BOOL bStationary //Indicates if this coverpoint is meant for stationary combat or cover combat
BOOL bPlayerPriority
ENDSTRUCT
STRUCT DEFENSIVEAREA_STRUCT
VECTOR vPosition
VECTOR vPosition2
FLOAT fWidth
BOOL bSphere
ENDSTRUCT
STRUCT SPAWNPOINT_STRUCT
VECTOR vPosition
FLOAT fHeading
ENEMY_STRUCT sEnemy
DEFENSIVEAREA_STRUCT sDefensiveArea
BOOL bActive
BOOL bTaken
BOOL bHasTask
INT iTimer
INT iIntervalTime
INT iKillCount
ENDSTRUCT
// use this as trigger box variables
STRUCT ANGLED_AREA_STRUCT
VECTOR vStart
VECTOR vEnd
FLOAT fWidth
#IF IS_DEBUG_BUILD
TEXT_LABEL_15 sDebugName
#ENDIF
ENDSTRUCT
//|======================================= CONSTANTS =====================================|
CONST_INT FADE_TIME 800 // time in seconds for the fades in & out of cutscenes
CONST_INT FADE_TIME_SHORT 250 // short time in seconds for the fades in & out of cutscenes
CONST_INT FADE_TIME_LONG 2500 // long time in seconds for the fades in & out of cutscenes
CONST_INT MAX_MODELS 12
CONST_INT MAX_CAR_RECORDINGS 13
CONST_INT MAX_ANIMATIONS 2
CONST_INT MAX_BUDDY_PED_HEALTH 600
CONST_INT SPEEDOPHILE_RECORDING_FRONT 72
CONST_INT SPEEDOPHILE_RECORDING_LEFT 82
CONST_INT SPEEDOPHILE_RECORDING_RIGHT 63
CONST_INT BALLA1SPEAKERID 4
CONST_INT BALLA2SPEAKERID 5
CONST_INT BALLA3SPEAKERID 6
CONST_INT BALLA4SPEAKERID 4
CONST_INT BALLA5SPEAKERID 5
CONST_INT BALLA6SPEAKERID 6
CONST_INT BALLA7SPEAKERID 7
CONST_INT CAR_CULDESAC 0
CONST_INT CAR_INTERSECTION1 1
CONST_INT CAR_INTERSECTION2 2
CONST_INT CAR_STREET 3
CONST_INT CAR_DRIVEWAY 4
CONST_INT COPCAR_STREET_1 0
CONST_INT COPCAR_STREET_2 1
CONST_INT COPCAR_STREET_3 2
CONST_INT COPCAR_STREET_4 3
CONST_INT COPCAR_STREET_5 4
STRING BALLA1VOICENAME = "BALLA1"
STRING BALLA2VOICENAME = "BALLA2"
STRING BALLA3VOICENAME = "BALLA3"
STRING BALLA4VOICENAME = "BALLA4"
STRING BALLA5VOICENAME = "BALLA5"
STRING BALLA6VOICENAME = "BALLA6"
STRING BALLA7VOICENAME = "BALLA7"
STRING sVehicleRecordingsFile = "fraone"
TEXT_LABEL sLabelFLAMAR = "FRA1_FLAMAR"
TEXT_LABEL sLabelGTLAMH = "FRA1_GTLAMH"
TEXT_LABEL sLabelGTTREH = "FRA1_GTTREH"
TEXT_LABEL sLabelGTFRAH = "FRA1_GTFRAH"
MODEL_NAMES mnBalla = G_M_Y_BALLAORIG_01
MODEL_NAMES mnCop = S_M_Y_COP_01
VECTOR vGroveStreet = << 96.973, -1946.51, 19.75 >>
VECTOR vGroveStreetStart = << 102.61, -1956.37, 19.73 >>
VECTOR vGroveStreetEnd = << -34.22, -1822.98, 25.23 >>
VECTOR vAlleyEntrance = << -25.93, -1848.77, 24.59 >>
VECTOR vLamarsLeadInPosition = << 86.163, -1958.071, 19.96 >>
VECTOR vLamarsLeadInRotation = << 0.0, 0.0, -8.28 >>
VECTOR vTrevorsLeadInPosition = << 85.213, -1958.021, 19.96 >>
VECTOR vTrevorsLeadInRotation = << 0.0, 0.0, 39.240 >>
VECTOR vLamarsDropOffPosition = << -56.96, -1463.14, 31.10 >>
VECTOR vFranklinsDropOffPosition = <<-12.5528, -1460.2130, 29.5590>>
VECTOR vTrevorsDropOffPosition = <<135.3672, -1308.8488, 27.9842>>
VECTOR vGroup1EnemyAimCoords = <<84.1950, -1946.6494, 20.1688>>
VECTOR vGroup1Enemy0Position = << 78.1228, -1942.1620, 19.8513 >>
FLOAT fGroup1Enemy0Heading = 299.8389
FLOAT fChaseHeliSpawnTime = 22000.0
FLOAT fChaseAlliesCanFire = 15500.0
VECTOR vFilmCrewBeginAnimPosition = << -125.891, -1857.574, 0.455 >>
VECTOR vFilmCrewBeginAnimRotation = << -0.000, 0.000, 60.0 >>
//used for debug car tyre popping
#IF IS_DEBUG_BUILD VECTOR vFrontLeftOffset = << -0.9, 1.5, -0.4 >> #ENDIF
VECTOR vFrontRightOffset = << 0.9, 1.5, -0.4 >>
#IF IS_DEBUG_BUILD VECTOR vRearLeftOffset = << -0.9, -1.5, -0.4 >> #ENDIF
VECTOR vRearRightOffset = << 0.9, -1.5, -0.4 >>
#IF IS_DEBUG_BUILD VECTOR vFrontLeftDamageOffset = << -0.9, 1.05, 0.2 >> #ENDIF
VECTOR vFrontRightDamageOffset = << 0.9, 1.1, 0.2 >>
#IF IS_DEBUG_BUILD VECTOR vRearLeftDamageOffset = << -0.9, -1.6, 0.2 >> #ENDIF
VECTOR vRearRightDamageOffset = << 0.9, -1.5, 0.2 >>
///used for reading bits from INT g_iFranklin1VehicleChoice from gta5/script/dev/singleplayer/include/globals/mission_globals.sch
///used for storing and reading vehicle choices when using speedophiles for mission retry
CONST_INT LAMAR_USED_SPEEDOPHILE_1 0
CONST_INT LAMAR_USED_SPEEDOPHILE_2 1
CONST_INT LAMAR_USED_SPEEDOPHILE_3 2
CONST_INT FRANKLIN_USED_SPEEDOPHILE_1 3
CONST_INT FRANKLIN_USED_SPEEDOPHILE_2 4
CONST_INT FRANKLIN_USED_SPEEDOPHILE_3 5
CONST_INT TREVOR_USED_SPEEDOPHILE_1 6
CONST_INT TREVOR_USED_SPEEDOPHILE_2 7
CONST_INT TREVOR_USED_SPEEDOPHILE_3 8
//water overrides
TWEAK_FLOAT fOceanWaveAmplitude 0.300
TWEAK_FLOAT fOceanWaveMinAmplitude 0.250
TWEAK_FLOAT fOceanWaveMaxAmplitude 0.350
TWEAK_FLOAT fOceanNoiseMinAmplitude 0.350
TWEAK_FLOAT fShoreWaveamplitude 0.400
TWEAK_FLOAT fShoreWaveMinamplitude 0.250
TWEAK_FLOAT fShoreWaveMaxamplitude 0.550
TWEAK_FLOAT fRippleDisturb 0.050
TWEAK_FLOAT fRippleBumpiness 0.420
TWEAK_FLOAT fRippleMinBumpiness 0.250
TWEAK_FLOAT fRippleMaxBumpiness 0.500
TWEAK_FLOAT fOverrideStrength 0.650
TWEAK_FLOAT fFranklinEntryFlashPhase 0.925
TWEAK_FLOAT fTrevorEntryFlashPhase 0.910
TWEAK_INT iLamarEntryFlashTime 6700
//|======================================= VARIABLES =====================================|
MISSION_STAGES eMissionStage = MISSION_STAGE_CUTSCENE_INTRO
MISSION_FAILS eMissionFail = MISSION_FAIL_EMPTY
PLAYER_BUDDIES ePlayerBuddy = PLAYER_BUDDY_NONE
CHOP_BEHAVIOUR_ENUM eChopBehaviour = CHOP_BEHAVIOUR_MEDIUM
CHOP_LEAN_IN_VAN_STATE_ENUM eChopInVanState
WEAPON_TYPE eFranklinsFailWeapon = WEAPONTYPE_INVALID
WEAPON_TYPE eTrevorsFailWeapon = WEAPONTYPE_INVALID
//relationship groups
REL_GROUP_HASH rgDog
REL_GROUP_HASH rgBmxCrew
REL_GROUP_HASH rgEnemies
REL_GROUP_HASH rgFilmCrew
//mission peds
PED_STRUCT psLamar
PED_STRUCT psTrevor
PED_STRUCT psFranklin
PED_STRUCT psChop
//mission vehicles
VEH_STRUCT vsVan
VEH_STRUCT vsEnemyLeftChaseCar
TRAIN_STRUCT sMissionTrain
OBJECT_STRUCT osBag
OBJECT_STRUCT osLight
OBJECT_STRUCT osTrowel
OBJECT_STRUCT osCamera
OBJECT_STRUCT osBoombox
OBJECT_STRUCT osCokeBlock
OBJECT_STRUCT osMicrophone
OBJECT_STRUCT osFranklinsDoorDummy
OBJECT_STRUCT osStripClubDoorDummy
//structs and variables for hot swap and Chop swap
SELECTOR_PED_STRUCT sSelectorPeds
SELECTOR_CAM_STRUCT sCamDetails
BOOL bAllowHotSwap
BOOL bSplitUpConversationFinished
//locates header data
LOCATES_HEADER_DATA sLocatesData
//conversation struct
structPedsForConversation sFranklin1Conversation
INT iConversationProgress
INT iConversationTimer
TEXT_LABEL_23 lConversationLabel = ""
BOOL bConversationPaused
BOOL bRandomConversationAllowed
INT iLoseCopsReminderTime
INT iLoseCopsReminderCount
INT iLamarEnterSeasharkDelayTimer
INT iEnemyConversationTimer
INT iEnemyRandomConversationDelay
INT iDumpstersProgress
INT iParkedVehiclesProgress
INT iShootoutCleanupProgress
//progress counters and flags for loading, skipping and replays
INT iStageSetupProgress
INT iMissionStageProgress
BOOL bSkipFlag
BOOL bReplayFlag
BOOL bLoadingFlag
//various mission flags
BOOL bPlayerArrivedAtGroveStreet
BOOL bCutsceneSkipped
BOOL bEnterVehicleTaskInterrupted
BOOL bLamarsOutfitSet
BOOL bLamarsBagEquipped
BOOL bOtherPedAtStationaryCoverpoint
BOOL bPlayerInCombatWhenChopCamActive
BOOL bGameplayCameraSet
INT iSniperRifleConversationsCounter
BOOL bLastEnemyKilledWithSniperRifle
// once the cop reinforcements spawn eventually the allies will stop waiting at the alley
// and just run down the hill. which CAN trigger fail
// per Sergei and Ian @BSW (personally I'm not sure if this is the best idea or not..?)
BOOL bShouldAlliesWaitForPlayer = TRUE
// cop reinforcements spawn after X cops are dead OR iCopReinforcementTimer expires @BSW
INT iCopReinforcementTimer
BOOL bBMXHornUsed
INT iPhotoShootSoundID
BOOL bFirstEnemyGroupInCombat
BOOL bFirstEnemyGroupInitialised
BOOL bRenderEnemyBlips = TRUE
ANGLED_AREA_STRUCT tbWave2
ANGLED_AREA_STRUCT tbIntersection
ANGLED_AREA_STRUCT tbWave3
ANGLED_AREA_STRUCT tbWave4
ANGLED_AREA_STRUCT tbWave5
ANGLED_AREA_STRUCT tbParkedCar
ANGLED_AREA_STRUCT tbAlliesToRiver
//asset request counters
INT iModelsRequested
INT iRecordingsRequested
INT iAnimationsRequested
//bmx crew playback speeds
FLOAT fBMX0PlabackSpeed
FLOAT fBMX1PlabackSpeed
FLOAT fBMX2PlabackSpeed
//bmx crew playback start times
FLOAT fBMX0StartTime
FLOAT fBMX1StartTime
FLOAT fBMX2StartTime
DEFENSIVEAREA_STRUCT sLamarsDefensiveArea
DEFENSIVEAREA_STRUCT sTrevorsDefensiveArea
INT iPlayerFranklinKills
INT iPlayerTrevorKills
INT iBuddyFranklinKills
INT iBuddyTrevorKills
INT iBuddyLamarKills
INT iBuddyChopKills
//music
BOOL bMusicScorePlaying
BOOL bMusicEventHustlerTriggered
BOOL bMusicEventWaterArriveTriggered
BOOL bCopConversationsAllowed
INT iCopConversationCounter
INT iCopConversationTimer
CAMERA_INDEX ScriptedCamera
SCENARIO_BLOCKING_INDEX ScenarioBlockingArea1
SCENARIO_BLOCKING_INDEX ScenarioBlockingArea2
SCENARIO_BLOCKING_INDEX ScenarioBlockingArea3
SCENARIO_BLOCKING_INDEX ScenarioBlockingArea4
SCENARIO_BLOCKING_INDEX ScenarioBlockingArea5
SCENARIO_BLOCKING_INDEX ScenarioBlockingArea6
SCENARIO_BLOCKING_INDEX ScenarioBlockingArea7
//lose the cops stage
INT iGetawayCarsProgress
INT iNeedCarBuddyReminders
BOOL bBuddyDroppedOff
BOOL bCopsChaseFinished
INT iJackedGirlAmbientSpeechDelay
BOOL bJackedGirlConversationFinished
INT iNextChopAnimTime
INT iNextBarkTime
FLOAT fCachedVanSpeed
INT iArea1, iArea2
VEHICLE_COMBAT_AVOIDANCE_AREA_INDEX iVehCombatArea1
VEHICLE_COMBAT_AVOIDANCE_AREA_INDEX iVehCombatArea2
INT iChopInVanProgress
INT iVanEnterSceneID = -1
INT iVanExitSceneID = -1
INT iTrevorEntrySceneID = -1
INT iFranklinEntrySceneID = -1
INT iEnemiesInCutsceneProgress
OBJECT_INDEX FranklinsWeapon, TrevorsWeapon
BOOL bDisplayBuddyBlips = TRUE
BOOL bCopWaveSpawned
BOOL bLeadInTriggered
BOOL bLeadInLocateReached
BOOL bCustomRouteActive
BOOL bShouldUseDefaultRoute
BOOL bDropOffConversationFinished
BOOL bCoverpointsCreated
BOOL bEndCoverPointCreated
COVERPOINT_INDEX EndCoverPointIndex
BOOL bBuddyPinnedDown
BOOL bBuddyPinnedDownSwitched
INT iSearchLightChangeTimer
INT iEnterVehicleTimer
BOOL bFirstPersonFlashPlayed
BOOL bWarpTrevorToResetCapsule
INT iReplayCameraWarpTimer //Fix for bug 2229916
//|========================================= ARRAYS ======================================|
BOOL FailFlags[MAX_MISSION_FAILS]
//asset arrays
MODEL_NAMES MissionModels[MAX_MODELS]
INT MissionRecordings[MAX_CAR_RECORDINGS]
STRING MissionAnimations[MAX_ANIMATIONS]
VEH_STRUCT vsSpeedophiles[MAX_SPEEDOPHILES]
VEH_STRUCT vsGhosts[MAX_SPEEDOPHILES]
VEH_STRUCT vsGetawayCars[6]
//enemies
ENEMY_STRUCT esGroup1[3]
ENEMY_STRUCT esGroup2[1]
ENEMY_STRUCT esGroup3[3]
ENEMY_STRUCT esGroup4[2]
ENEMY_STRUCT esGroup5[1]
ENEMY_STRUCT esGroup6[2]
ENEMY_STRUCT esGroup7[4]
ENEMY_STRUCT esGroup8[2]
ENEMY_STRUCT esGroup9[6]
ENEMY_STRUCT esCarCuldeSacLeft[1]
ENEMY_STRUCT esCarCuldeSacRight[1]
ENEMY_STRUCT esCarIntersection1Left[1]
ENEMY_STRUCT esCarIntersection1Right[1]
ENEMY_STRUCT esCarIntersection2Left[2]
ENEMY_STRUCT esCarStreetLeft[1]//2
ENEMY_STRUCT esCarStreetRight[1]
ENEMY_STRUCT esCarDriveway[2]
ENEMY_STRUCT esHouseEnemies[1]
ENEMY_STRUCT esPorchEnemies[1]
ENEMY_STRUCT esLeftChaseEnemies[2]
ENEMY_STRUCT esSidelineEnemies[6]
//enemy cars and parked cars
VEH_STRUCT vsEnemyCars[5]
VEH_STRUCT vsParkedVehicles[4]
//police
ENEMY_STRUCT esPoliceCarEndReinforcements[4]
PED_STRUCT psBoatCops[2]
PED_STRUCT psRiverCopCar0Cops[2]
PED_STRUCT psRiverCopCar1Cops[2]
PED_STRUCT psRiverCopCar2Cops[2]
PED_STRUCT psRiverCopCar3Cops[2]
PED_STRUCT psRiverCopCar4Cops[2]
PED_STRUCT psStreetCopCar1Cops[2]
PED_STRUCT psStreetCopCar2Cops[2]
PED_STRUCT psStreetCopCar3Cops[2]
PED_STRUCT psHillCopCar0Cops[2]
VEH_STRUCT vsCopBoat
VEH_STRUCT vsStreetCopCars[5]
VEH_STRUCT vsRiverCopCars[5]
VEH_STRUCT vsHillCopCars[1]
SPAWNPOINT_STRUCT EnemySpawnpoints[2]
SPAWNPOINT_STRUCT EnemySidekickSpawnpoints[2] // hacky way to double up the spawnpoint system and spawn 2 guys per spawn attempt @BSW
//mission objects
OBJECT_STRUCT osDumpsters[9]
//coverpoints for buddies to use in shootout
COVERPOINT_STRUCT csCoverpoints[63]
VECTOR LamarShootoutPositions[13]
BOOL Events[EVENT_MAX_EVENTS]
//bmx crew
PED_STRUCT psBmxCrew[3]
VEH_STRUCT vsBmxBikes[3]
//film crew
PED_STRUCT psFilmCrew[MAX_FILM_CREW_PEDS]
//swat peds
PED_STRUCT psSwat[3]
VEH_STRUCT vsPoliceHeli
//text printing
INT iTriggeredTextHashes[30]
INT iNumTextHashesStored
BOOL bFilmCrewAttacked
INT iGroveStreetSetup
//Recording stuff
BOOL bCutsceneRecordingStarted = FALSE
//|========================= MISCELLANEOUS PROCEDURES & FUNCTIONS ========================|
/// PURPOSE:
/// Resets all mission flags and progress counters to their default values.
PROC RESET_MISSION_FLAGS()
//reset setup progress to 1, so that iSetupProgress = 0 only runs once, on initial mission load.
iStageSetupProgress = 1
iMissionStageProgress = 0
iConversationProgress = 0
psLamar.iProgress = 0
psLamar.iTimer = 0
psLamar.bWaitingForPlayer = FALSE
psLamar.bWaitingToAdvance = FALSE
psLamar.bFleeing = FALSE
psLamar.bHasTask = FALSE
psLamar.bDefensiveAreaTaken = FALSE
psLamar.bInPosition = FALSE
psTrevor.iHealthConversationTimer = 0
psTrevor.iHealthConversationCounter = 0
psTrevor.iProgress = 0
psTrevor.iTimer = 0
psTrevor.bWaitingForPlayer = FALSE
psTrevor.bWaitingToAdvance = FALSE
psTrevor.bDefensiveAreaTaken = FALSE
psTrevor.bFleeing = FALSE
psTrevor.bHasTask = FALSE
psTrevor.iHealthConversationTimer = 0
psTrevor.iHealthConversationCounter = 0
psFranklin.iProgress = 0
psFranklin.iTimer = 0
psFranklin.bWaitingForPlayer = FALSE
psFranklin.bWaitingToAdvance = FALSE
psFranklin.bFleeing = FALSE
psFranklin.bHasTask = FALSE
psFranklin.iHealthConversationTimer = 0
psFranklin.iHealthConversationCounter = 0
iDumpstersProgress = 0
iParkedVehiclesProgress = 0
iShootoutCleanupProgress = 0
psChop.iTimer = 0
psChop.iProgress = 0
iConversationTimer = 0
// iChopShouts = 0
iLoseCopsReminderTime = 0
iLoseCopsReminderCount = 0
bConversationPaused = FALSE
bRandomConversationAllowed = FALSE
iEnemyConversationTimer = 0
iEnemyRandomConversationDelay = 0
vsParkedVehicles[0].iProgress = 0
vsEnemyCars[CAR_DRIVEWAY].iProgress = 0
psFilmCrew[FCP_CLAY].iProgress = 0
psFilmCrew[FCP_JACKEDGIRL].iProgress= 0
bEnterVehicleTaskInterrupted = FALSE
bOtherPedAtStationaryCoverpoint = FALSE
bPlayerInCombatWhenChopCamActive = FALSE
bShouldAlliesWaitForPlayer = TRUE
bPlayerArrivedAtGroveStreet = FALSE
bCutsceneSkipped = FALSE
//bmx crew progress
psBmxCrew[0].iProgress = 0
bBMXHornUsed = FALSE
bRenderEnemyBlips = TRUE
sMissionTrain.iProgress = 0
bSplitUpConversationFinished = FALSE
bFilmCrewAttacked = FALSE
bMusicScorePlaying = FALSE
bMusicEventHustlerTriggered = FALSE
bMusicEventWaterArriveTriggered = FALSE
bCopConversationsAllowed = FALSE
iCopConversationTimer = 0
iCopConversationCounter = 0
iGetawayCarsProgress = 0
iNeedCarBuddyReminders = 0
bBuddyDroppedOff = FALSE
bCopsChaseFinished = FALSE
iJackedGirlAmbientSpeechDelay = 0
bJackedGirlConversationFinished = FALSE
iGroveStreetSetup = 0
iChopInVanProgress = 0
iEnemiesInCutsceneProgress = 0
sLabelGTLAMH = "FRA1_GTLAMH"
sLabelGTTREH = "FRA1_GTTREH"
sLabelGTFRAH = "FRA1_GTFRAH"
bDisplayBuddyBlips = TRUE
bCopWaveSpawned = FALSE
bLeadInTriggered = FALSE
bLeadInLocateReached = FALSE
bCustomRouteActive = FALSE
bShouldUseDefaultRoute = FALSE
bDropOffConversationFinished = FALSE
bBuddyPinnedDown = FALSE
bBuddyPinnedDownSwitched = FALSE
iSniperRifleConversationsCounter = 0
bLastEnemyKilledWithSniperRifle = FALSE
iLamarEnterSeasharkDelayTimer = 0
iSearchLightChangeTimer = 0
iEnterVehicleTimer = 0
bFirstPersonFlashPlayed = FALSE
bWarpTrevorToResetCapsule = FALSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission flags and progress counters are reset.")
#ENDIF
ENDPROC
PROC INITIALISE_UBER_ARRAY()
SetPieceCarPos[0] = <<-64.0012, -1884.2284, 9.2153>>
SetPieceCarQuatX[0] = -0.0079
SetPieceCarQuatY[0] = 0.0266
SetPieceCarQuatZ[0] = 0.8865
SetPieceCarQuatW[0] = -0.4619
SetPieceCarRecording[0] = 58
SetPieceCarStartime[0] = 7000.0000
SetPieceCarRecordingSpeed[0] = 1.0000
SetPieceCarModel[0] = oracle
// SetPieceCarPos[0] = <<-35.8119, -1900.4089, 10.7125>>
// SetPieceCarQuatX[0] = 0.0000
// SetPieceCarQuatY[0] = 0.0000
// SetPieceCarQuatZ[0] = 0.4815
// SetPieceCarQuatW[0] = 0.8765
// SetPieceCarRecording[0] = 58
// SetPieceCarStartime[0] = 0.0000
// SetPieceCarRecordingSpeed[0] = 1.0000
// SetPieceCarModel[0] = oracle
SetPieceCarPos[1] = <<-48.2820, -2279.3416, 30.8690>>
SetPieceCarQuatX[1] = -0.0207
SetPieceCarQuatY[1] = 0.0265
SetPieceCarQuatZ[1] = -0.6639
SetPieceCarQuatW[1] = 0.7470
SetPieceCarRecording[1] = 91
SetPieceCarStartime[1] = 22000.0//24000.0000
SetPieceCarRecordingSpeed[1] = 1.0000
SetPieceCarModel[1] = polmav
SetPieceCarPos[2] = <<-158.5204, -1847.9163, -0.0089>>
SetPieceCarQuatX[2] = -0.0108
SetPieceCarQuatY[2] = 0.0256
SetPieceCarQuatZ[2] = 0.9214
SetPieceCarQuatW[2] = -0.3877
SetPieceCarRecording[2] = 63
SetPieceCarStartime[2] = 0.0000
SetPieceCarRecordingSpeed[2] = 1.0000
SetPieceCarModel[2] = seashark
SetPieceCarPos[3] = <<-164.9134, -1842.2776, -0.0113>>
SetPieceCarQuatX[3] = -0.0116
SetPieceCarQuatY[3] = 0.0251
SetPieceCarQuatZ[3] = 0.9078
SetPieceCarQuatW[3] = -0.4185
SetPieceCarRecording[3] = 82
SetPieceCarStartime[3] = 0.0000
SetPieceCarRecordingSpeed[3] = 1.0000
SetPieceCarModel[3] = seashark
ENDPROC
PROC SET_SPEEDOPHILE_POSITIONS_IN_INT(INT &iGlobalValue, PED_SPEEDOPHILE eLamar, PED_SPEEDOPHILE eFranklin, PED_SPEEDOPHILE eTrevor)
iGlobalValue = 0 //reset all flags
SWITCH eLamar //store flag for Lamar's speedophile
CASE SPEEDOPHILE_1
SET_BIT(iGlobalValue, LAMAR_USED_SPEEDOPHILE_1)
BREAK
CASE SPEEDOPHILE_2
SET_BIT(iGlobalValue, LAMAR_USED_SPEEDOPHILE_2)
BREAK
CASE SPEEDOPHILE_3
SET_BIT(iGlobalValue, LAMAR_USED_SPEEDOPHILE_3)
BREAK
ENDSWITCH
SWITCH eFranklin //store flag for Franklin's speedophile
CASE SPEEDOPHILE_1
SET_BIT(iGlobalValue, FRANKLIN_USED_SPEEDOPHILE_1)
BREAK
CASE SPEEDOPHILE_2
SET_BIT(iGlobalValue, FRANKLIN_USED_SPEEDOPHILE_2)
BREAK
CASE SPEEDOPHILE_3
SET_BIT(iGlobalValue, FRANKLIN_USED_SPEEDOPHILE_3)
BREAK
ENDSWITCH
SWITCH eTrevor //store flag for Trevor's speedophile
CASE SPEEDOPHILE_1
SET_BIT(iGlobalValue, TREVOR_USED_SPEEDOPHILE_1)
BREAK
CASE SPEEDOPHILE_2
SET_BIT(iGlobalValue, TREVOR_USED_SPEEDOPHILE_2)
BREAK
CASE SPEEDOPHILE_3
SET_BIT(iGlobalValue, TREVOR_USED_SPEEDOPHILE_3)
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": *********************** SET_SPEEDOPHILE_POSITIONS_IN_INT *************************")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Storing Lamar's speedophile as: ", ENUM_TO_INT(eLamar), " in global variable.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Storing Franklin's speedophile as: ", ENUM_TO_INT(eFranklin), " in global variable.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Storing Trevor's speedophile as: ", ENUM_TO_INT(eTrevor), " in global variable.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": **********************************************************************************")
//SCRIPT_ASSERT("SET_SPEEDOPHILE_POSITIONS_IN_INT triggered.")
#ENDIF
ENDPROC
PROC GET_SPEEDOPHILE_POSITIONS_FROM_INT(INT iGlobalValue, PED_SPEEDOPHILE &eLamar, PED_SPEEDOPHILE &eFranklin, PED_SPEEDOPHILE &eTrevor)
IF IS_BIT_SET(iGlobalValue, LAMAR_USED_SPEEDOPHILE_1)
eLamar = SPEEDOPHILE_1
ELIF IS_BIT_SET(iGlobalValue, LAMAR_USED_SPEEDOPHILE_2)
eLamar = SPEEDOPHILE_2
ELIF IS_BIT_SET(iGlobalValue, LAMAR_USED_SPEEDOPHILE_3)
eLamar = SPEEDOPHILE_3
ENDIF
IF IS_BIT_SET(iGlobalValue, FRANKLIN_USED_SPEEDOPHILE_1)
eFranklin = SPEEDOPHILE_1
ELIF IS_BIT_SET(iGlobalValue, FRANKLIN_USED_SPEEDOPHILE_2)
eFranklin = SPEEDOPHILE_2
ELIF IS_BIT_SET(iGlobalValue, FRANKLIN_USED_SPEEDOPHILE_3)
eFranklin = SPEEDOPHILE_3
ENDIF
IF IS_BIT_SET(iGlobalValue, TREVOR_USED_SPEEDOPHILE_1)
eTrevor = SPEEDOPHILE_1
ELIF IS_BIT_SET(iGlobalValue, TREVOR_USED_SPEEDOPHILE_2)
eTrevor = SPEEDOPHILE_2
ELIF IS_BIT_SET(iGlobalValue, TREVOR_USED_SPEEDOPHILE_3)
eTrevor = SPEEDOPHILE_3
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": *********************** GET_SPEEDOPHILE_POSITIONS_FROM_INT ***********************")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Getting Lamar's speedophile as: ", ENUM_TO_INT(eLamar), " from global variable.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Getting Franklin's speedophile as: ", ENUM_TO_INT(eFranklin), " from global variable.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Getting Trevor's speedophile as: ", ENUM_TO_INT(eTrevor), " from global variable.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": **********************************************************************************")
//SCRIPT_ASSERT("GET_SPEEDOPHILE_POSITIONS_FROM_INT triggered.")
#ENDIF
ENDPROC
FUNC SCENARIO_BLOCKING_INDEX CREATE_SCENARIO_BLOCKING_AREA(VECTOR vPosition, VECTOR vSize)
RETURN ADD_SCENARIO_BLOCKING_AREA(<< vPosition.x - vSize.x, vPosition.y - vSize.y, vPosition.z - vSize.z >>,
<< vPosition.x + vSize.x, vPosition.y + vSize.y, vPosition.z + vSize.z >>)
ENDFUNC
PROC SETUP_ROADS_IN_GROVE_STREET(BOOL bInstant, INT &iCounter)
IF ( bInstant = TRUE )
//Grove Street main road
SET_ROADS_IN_ANGLED_AREA(<<104.158325,-1939.768677,19.301186>>, <<-117.924530,-1754.341431,36.951656>>, 16.0, FALSE, FALSE)
//Grove Street area roads
SET_ROADS_IN_ANGLED_AREA(<<53.754932,-1911.988159,20.231783>>, <<93.245361,-1864.880615,31.306746>>, 16.0, FALSE, FALSE)
SET_ROADS_IN_ANGLED_AREA(<<-39.534374,-1825.756104,24.614100>>, <<2.099868,-1775.209961,36.116295>>, 16.0, FALSE, FALSE)
SET_ROADS_IN_ANGLED_AREA(<<111.198059,-1814.178833,23.501926>>, <<79.269058,-1854.317749,33.797722>>, 16.0, FALSE, FALSE)
SET_ROADS_IN_ANGLED_AREA(<<-49.493370,-1730.557861,22.286551>>, <<94.720413,-1853.355347,33.617447>>, 20.0, FALSE, FALSE)
SET_ROADS_IN_ANGLED_AREA(<<-92.358604,-1788.428223,25.833918>>, <<-56.557934,-1744.573242,38.326439>>, 28.0, FALSE, FALSE)
SET_ROADS_IN_ANGLED_AREA(<<-104.422813,-1758.286255,26.666639>>, <<-88.434166,-1738.211182,38.377785>>, 8.0, FALSE, FALSE)
SET_ROADS_IN_ANGLED_AREA(<<-109.608795,-1737.845825,28.215425>>, <<-84.359512,-1727.573364,36.346596>>, 6.0, FALSE, FALSE)
SET_ROADS_IN_ANGLED_AREA(<<-152.738892,-1781.890747,27.658955>>, <<-103.498375,-1751.495117,36.638084>>, 16.0, FALSE, FALSE)
SET_PED_PATHS_IN_AREA(<<-131.0, -1958.0, -8.0>>, << 204.0, -1734.0, 55.0>>, FALSE)
IF ( ScenarioBlockingArea1 = NULL )
ScenarioBlockingArea1 = CREATE_SCENARIO_BLOCKING_AREA(<< 54.70, -1914.70, 21.18 >>, << 1.0, 1.0, 1.0 >>)
ENDIF
IF ( ScenarioBlockingArea2 = NULL )
ScenarioBlockingArea2 = CREATE_SCENARIO_BLOCKING_AREA(<< 91.42, -1951.30, 21.74 >>, << 7.0, 7.0, 3.0>>) //cutscene porch
ENDIF
IF ( ScenarioBlockingArea3 = NULL )
ScenarioBlockingArea3 = CREATE_SCENARIO_BLOCKING_AREA(<< 123.1, -1932.93, 20.27 >>, << 1.0, 1.0, 1.0 >>)
ENDIF
IF ( ScenarioBlockingArea4 = NULL )
ScenarioBlockingArea4 = CREATE_SCENARIO_BLOCKING_AREA(<< 89.37, -2255.94, 3.08 >>, << 20.0, 4.0, 6.0>>) //pier
ENDIF
IF ( ScenarioBlockingArea7 = NULL )
ScenarioBlockingArea7 = CREATE_SCENARIO_BLOCKING_AREA(<<100.239532,-1945.018921,21.303852>>, << 8.0, 6.0, 2.0 >>) //driveway in front of deal
ENDIF
CLEAR_AREA(vGroveStreet, 450.0, TRUE)
CLEAR_AREA_OF_VEHICLES(vGroveStreet, 450.0)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-109.0, -1973.0, 7.0>>, << 114.0, -1749.0, 39.0>>, FALSE)
REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(<<-109.0, -1973.0, 7.0>>, << 114.0, -1749.0, 39.0>>)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<122.0, -1943.8, 18.7>>, << 130.0, -1935.9, 26.8>>, FALSE)
REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(<<122.0, -1943.8, 18.7>>, << 130.0, -1935.9, 26.8>>)
ELSE
SWITCH iCounter
CASE 0
SET_ROADS_IN_ANGLED_AREA(<<104.158325,-1939.768677,19.301186>>, <<-117.924530,-1754.341431,36.951656>>, 16.0, FALSE, FALSE)
iCounter++
BREAK
CASE 1
SET_ROADS_IN_ANGLED_AREA(<<53.754932,-1911.988159,20.231783>>, <<93.245361,-1864.880615,31.306746>>, 16.0, FALSE, FALSE)
iCounter++
BREAK
CASE 2
SET_ROADS_IN_ANGLED_AREA(<<-39.534374,-1825.756104,24.614100>>, <<2.099868,-1775.209961,36.116295>>, 16.0, FALSE, FALSE)
iCounter++
BREAK
CASE 3
SET_ROADS_IN_ANGLED_AREA(<<111.198059,-1814.178833,23.501926>>, <<79.269058,-1854.317749,33.797722>>, 16.0, FALSE, FALSE)
iCounter++
BREAK
CASE 4
SET_ROADS_IN_ANGLED_AREA(<<-49.493370,-1730.557861,22.286551>>, <<94.720413,-1853.355347,33.617447>>, 20.0, FALSE, FALSE)
iCounter++
BREAK
CASE 5
SET_ROADS_IN_ANGLED_AREA(<<-92.358604,-1788.428223,25.833918>>, <<-56.557934,-1744.573242,38.326439>>, 28.0, FALSE, FALSE)
iCounter++
BREAK
CASE 6
SET_ROADS_IN_ANGLED_AREA(<<-104.422813,-1758.286255,26.666639>>, <<-88.434166,-1738.211182,38.377785>>, 8.0, FALSE, FALSE)
iCounter++
BREAK
CASE 7
SET_ROADS_IN_ANGLED_AREA(<<-109.608795,-1737.845825,28.215425>>, <<-84.359512,-1727.573364,36.346596>>, 6.0, FALSE, FALSE)
iCounter++
BREAK
CASE 8
SET_ROADS_IN_ANGLED_AREA(<<-152.738892,-1781.890747,27.658955>>, <<-103.498375,-1751.495117,36.638084>>, 16.0, FALSE, FALSE)
iCounter++
BREAK
CASE 9
SET_PED_PATHS_IN_AREA(<<-131.0, -1958.0, -8.0>>, << 204.0, -1734.0, 55.0>>, FALSE)
iCounter++
BREAK
CASE 10
IF ( ScenarioBlockingArea1 = NULL )
ScenarioBlockingArea1 = CREATE_SCENARIO_BLOCKING_AREA(<< 54.88, -1914.98, 21.18 >>, << 1.0, 1.0, 1.0 >>)
ENDIF
iCounter++
BREAK
CASE 11
IF ( ScenarioBlockingArea2 = NULL )
ScenarioBlockingArea2 = CREATE_SCENARIO_BLOCKING_AREA(<< 86.39, -1955.41, 20.24 >>, << 1.5, 1.5, 1.0 >>)
ENDIF
iCounter++
BREAK
CASE 12
IF ( ScenarioBlockingArea3 = NULL )
ScenarioBlockingArea3 = CREATE_SCENARIO_BLOCKING_AREA(<< 122.1, -1932.93, 20.27 >>, << 1.0, 1.0, 1.0 >>)
ENDIF
iCounter++
BREAK
CASE 13
IF ( ScenarioBlockingArea4 = NULL )
ScenarioBlockingArea4 = CREATE_SCENARIO_BLOCKING_AREA(<< 89.37, -2255.94, 3.08 >>, << 20.0, 4.0, 6.0>>)
ENDIF
iCounter++
BREAK
CASE 14
IF ( ScenarioBlockingArea7 = NULL )
ScenarioBlockingArea7 = CREATE_SCENARIO_BLOCKING_AREA(<<100.239532,-1945.018921,21.303852>>, << 8.0, 6.0, 2.0 >>) //driveway in front of deal
ENDIF
iCounter++
BREAK
CASE 15
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-109.0, -1973.0, 7.0>>, << 114.0, -1749.0, 39.0>>, FALSE)
iCounter++
BREAK
CASE 16
REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(<<-109.0, -1973.0, 7.0>>, << 114.0, -1749.0, 39.0>>)
iCounter++
BREAK
CASE 17
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<122.0, -1943.8, 18.7>>, << 130.0, -1935.9, 26.8>>, FALSE)
iCounter++
BREAK
CASE 18
REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(<<122.0, -1943.8, 18.7>>, << 130.0, -1935.9, 26.8>>)
iCounter++
BREAK
CASE 19
CLEAR_AREA(vGroveStreet, 450.0, TRUE)
iCounter++
BREAK
CASE 20
CLEAR_AREA_OF_VEHICLES(vGroveStreet, 450.0)
iCounter++
BREAK
CASE 21
//check if peds are removed???
BREAK
ENDSWITCH
ENDIF
ENDPROC
/// PURPOSE:
/// Sets all fail flags to specified boolean value.
/// PARAMS:
/// bNewBool - Boolean value to set all flags to TRUE or FALSE.
PROC SET_FAIL_FLAGS(BOOL bNewBool)
INT i = 0
FOR i = 0 TO ( COUNT_OF(FailFlags) - 1 )
FailFlags[i] = bNewBool
ENDFOR
ENDPROC
/// PURPOSE:
/// Sets all event flags to specified boolean value.
/// PARAMS:
/// bTurnOn - Boolean value to set all flags to TRUE or FALSE.
PROC SET_ALL_EVENT_FLAGS(BOOL &sArray[], BOOL bTurnOn)
INT i = 0
FOR i = 0 TO ( COUNT_OF(sArray) - 1 )
sArray[i] = bTurnOn
ENDFOR
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": All event flags set to ", bTurnOn, ".")
#ENDIF
ENDPROC
FUNC BOOL IS_THIS_CONVERSATION_PLAYING(STRING sRoot)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
TEXT_LABEL txtRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF ARE_STRINGS_EQUAL(sRoot, txtRoot)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC REMOVE_LABEL_ARRAY_SPACES()
INT iArrayLength = COUNT_OF(iTriggeredTextHashes)
INT i = 0
REPEAT (iArrayLength - 1) i
IF iTriggeredTextHashes[i] = 0
IF iTriggeredTextHashes[i+1] != 0
iTriggeredTextHashes[i] = iTriggeredTextHashes[i+1]
iTriggeredTextHashes[i+1] = 0
ENDIF
ENDIF
ENDREPEAT
ENDPROC
FUNC INT GET_LABEL_INDEX(INT iLabelHash)
INT i = 0
REPEAT iNumTextHashesStored i
IF iTriggeredTextHashes[i] = iLabelHash
RETURN i
ENDIF
ENDREPEAT
RETURN -1
ENDFUNC
FUNC BOOL HAS_LABEL_BEEN_TRIGGERED(STRING strLabel)
INT iHash = GET_HASH_KEY(strLabel)
IF GET_LABEL_INDEX(iHash) != -1
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC SET_LABEL_AS_TRIGGERED(STRING strLabel, BOOL bTrigger)
INT iHash = GET_HASH_KEY(strLabel)
IF bTrigger
IF NOT HAS_LABEL_BEEN_TRIGGERED(strLabel)
INT iArraySize = COUNT_OF(iTriggeredTextHashes)
IF iNumTextHashesStored < iArraySize
iTriggeredTextHashes[iNumTextHashesStored] = iHash
iNumTextHashesStored++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": SET_LABEL_AS_TRIGGERED(): ", strLabel, " TRUE.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": SET_LABEL_AS_TRIGGERED(): ", iNumTextHashesStored, "/", COUNT_OF(iTriggeredTextHashes), ".")
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("SET_LABEL_AS_TRIGGERED: Label array is full.")
#ENDIF
ENDIF
ENDIF
ELSE
INT iIndex = GET_LABEL_INDEX(iHash)
IF iIndex != -1
iTriggeredTextHashes[iIndex] = 0
REMOVE_LABEL_ARRAY_SPACES()
iNumTextHashesStored--
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": SET_LABEL_AS_TRIGGERED(): ", strLabel, " TRUE.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": SET_LABEL_AS_TRIGGERED(): ", iNumTextHashesStored, "/", COUNT_OF(iTriggeredTextHashes), ".")
#ENDIF
ENDIF
ENDIF
ENDPROC
PROC CLEAR_TRIGGERED_LABELS()
INT iArraySize = COUNT_OF(iTriggeredTextHashes)
INT i = 0
REPEAT iArraySize i
iTriggeredTextHashes[i] = 0
ENDREPEAT
iNumTextHashesStored = 0
ENDPROC
PROC UPDATE_TRIGGERED_LABEL(TEXT_LABEL &sLabel)
IF NOT IS_STRING_NULL_OR_EMPTY(sLabel) //if the label is not empty, which means not yet printed by locates header
IF NOT HAS_LABEL_BEEN_TRIGGERED(sLabel) //if it was not set as triggered by script
IF IS_THIS_PRINT_BEING_DISPLAYED(sLabel) //if the label was displayed on screen
SET_LABEL_AS_TRIGGERED(sLabel, TRUE) //mark it as triggered
ENDIF
ELSE //if the label was set as triggered by script,
//which means it was printed by locates header
IF NOT IS_THIS_PRINT_BEING_DISPLAYED(sLabel) //but is not currently being printed, cleared off screen or timed out
sLabel = "" //mark is as empty
ENDIF
ENDIF
ENDIF
ENDPROC
PROC PRINT_GOD_TEXT_ADVANCED(STRING sLabel, INT iDuration = DEFAULT_GOD_TEXT_TIME, BOOL bOnce = TRUE)
IF NOT HAS_LABEL_BEEN_TRIGGERED(sLabel)
PRINT(sLabel, iDuration, 1)
SET_LABEL_AS_TRIGGERED(sLabel, bOnce)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Printing god text ", sLabel, ".")
#ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Warps specified ped to new coordinates and sets specified ped's new heading.
/// PARAMS:
/// ped - PED_INDEX to warp.
/// vNewPosition - VECTOR coordinates specifying new ped's position.
/// fNewHeading - FLOAT specifying new ped's heading.
/// bKeepVehicle - Specifies if ped should keep vehicle they are currently in.
/// bResetGameplayCamera - Specifies if gameplay camera should be positioned behind player's back. Works only for PLAYER_PED_ID().
/// bLoadScene - Specifies if scene at new provided coordinates should be loaded. Works only for PLAYER_PED_ID().
PROC WARP_PED(PED_INDEX ped, VECTOR vNewPosition, FLOAT fNewHeading, BOOL bKeepVehicle, BOOL bResetGameplayCamera, BOOL bLoadScene)
IF NOT IS_PED_INJURED(ped)
IF ( bKeepVehicle = TRUE )
SET_PED_COORDS_KEEP_VEHICLE(ped, vNewPosition)
ELIF ( bKeepVehicle = FALSE )
SET_ENTITY_COORDS(ped, vNewPosition)
ENDIF
SET_ENTITY_HEADING(ped, fNewHeading)
IF ( ped = PLAYER_PED_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Warping player ped to coordinates ", vNewPosition, " and heading ", fNewHeading, ".")
#ENDIF
IF ( bResetGameplayCamera = TRUE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
ENDIF
IF ( bLoadScene = TRUE )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling LOAD_SCENE() at coordinates ", vNewPosition, ". This might take a while to load.")
#ENDIF
LOAD_SCENE(vNewPosition)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC OVERRIDE_WATER_SETTINGS(BOOL bUseOverride, FLOAT fFadeTime = 1.0, FLOAT fStrength = 0.75)
IF bUseOverride
WATER_OVERRIDE_FADE_IN(fFadeTime)
WATER_OVERRIDE_SET_OCEANWAVEAMPLITUDE(fOceanWaveAmplitude)
WATER_OVERRIDE_SET_OCEANWAVEMINAMPLITUDE(fOceanWaveMinAmplitude)
WATER_OVERRIDE_SET_OCEANWAVEMAXAMPLITUDE(fOceanWaveMaxAmplitude)
WATER_OVERRIDE_SET_OCEANNOISEMINAMPLITUDE(fOceanNoiseMinAmplitude)
WATER_OVERRIDE_SET_SHOREWAVEAMPLITUDE(fShoreWaveAmplitude)
WATER_OVERRIDE_SET_SHOREWAVEMINAMPLITUDE(fShoreWaveMinAmplitude)
WATER_OVERRIDE_SET_SHOREWAVEMAXAMPLITUDE(fShoreWaveMaxAmplitude)
WATER_OVERRIDE_SET_RIPPLEDISTURB(fRippleDisturb)
WATER_OVERRIDE_SET_RIPPLEBUMPINESS(fRippleBumpiness)
WATER_OVERRIDE_SET_RIPPLEMINBUMPINESS(fRippleMinBumpiness)
WATER_OVERRIDE_SET_RIPPLEMAXBUMPINESS(fRippleMaxBumpiness)
WATER_OVERRIDE_SET_STRENGTH(fStrength)
ELSE
WATER_OVERRIDE_FADE_OUT(fFadeTime)
ENDIF
ENDPROC
FUNC FLOAT GET_PED_HEALTH_RATIO(PED_INDEX PedIndex)
IF DOES_ENTITY_EXIST(PedIndex)
IF NOT IS_ENTITY_DEAD(PedIndex)
RETURN ( TO_FLOAT(GET_ENTITY_HEALTH(PedIndex)) - 100.0 ) / ( TO_FLOAT(GET_ENTITY_MAX_HEALTH(PedIndex)) - 100.0 )
ENDIF
ENDIF
RETURN 1.0
ENDFUNC
/// PURPOSE:
/// Returns PED_INDEX for specified player ped character from enumCharacterList.
/// PARAMS:
/// CHAR_TYPE - Character to get ped index for. For example CHAR_FRANKLIN, CHAR_TREVOR or CHAR_MICHAEL.
/// RETURNS:
/// PED_INDEX for the specified player ped character.
FUNC PED_INDEX GET_PED_INDEX(enumCharacterList CHAR_TYPE)
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TYPE )
RETURN PLAYER_PED_ID()
ELSE
RETURN sSelectorPeds.pedID[GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(CHAR_TYPE)]
ENDIF
ENDFUNC
FUNC BOOL IS_ENTITY_IN_LOCATE(ENTITY_INDEX EntityIndex, VECTOR vPosition, VECTOR vSize #IF IS_DEBUG_BUILD, STRING sDisplayName = NULL #ENDIF)
//display debug locate name first
#IF IS_DEBUG_BUILD
IF NOT IS_STRING_NULL_OR_EMPTY(sDisplayName)
DRAW_DEBUG_TEXT(sDisplayName, vPosition)
ENDIF
#ENDIF
IF DOES_ENTITY_EXIST(EntityIndex)
IF NOT IS_ENTITY_DEAD(EntityIndex)
IF IS_ENTITY_AT_COORD(EntityIndex, vPosition, vSize)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_ENTITY_IN_ANGLED_AREA_LOCATE(ENTITY_INDEX EntityIndex, VECTOR vPosition1, VECTOR vPosition2, FLOAT fWidth #IF IS_DEBUG_BUILD, STRING sDisplayName = NULL #ENDIF)
//display debug locate name first
#IF IS_DEBUG_BUILD
IF NOT IS_STRING_NULL_OR_EMPTY(sDisplayName)
DRAW_DEBUG_TEXT(sDisplayName, vPosition1)
ENDIF
#ENDIF
IF DOES_ENTITY_EXIST(EntityIndex)
IF NOT IS_ENTITY_DEAD(EntityIndex)
IF IS_ENTITY_IN_ANGLED_AREA(EntityIndex, vPosition1, vPosition2, fWidth)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// !! be careful using this !! @BSW
// in case an AI manages to get through an angled area and then the player switches to him
FUNC BOOL IS_PLAYER_IN_ANGLED_AREA_LOCATE(ANGLED_AREA_STRUCT thisArea)
//display debug locate name first
#IF IS_DEBUG_BUILD
IF NOT IS_STRING_NULL_OR_EMPTY(thisArea.sDebugName)
DRAW_DEBUG_TEXT(thisArea.sDebugName, thisArea.vStart, 0, 255)
DRAW_DEBUG_TEXT(thisArea.sDebugName, thisArea.vEnd, 0, 255)
DRAW_DEBUG_LINE(thisArea.vStart, thisArea.vEnd, 0, 255)
ENDIF
#ENDIF
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), thisArea.vStart, thisArea.vEnd, thisArea.fWidth)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_ANY_PED_IN_LOCATE(PED_INDEX PedIndex1, PED_INDEX PedIndex2, PED_INDEX PedIndex3, VECTOR vPosition, VECTOR vSize
#IF IS_DEBUG_BUILD, STRING sDisplayName = NULL #ENDIF)
//display debug locate name first
#IF IS_DEBUG_BUILD
IF NOT IS_STRING_NULL_OR_EMPTY(sDisplayName)
DRAW_DEBUG_TEXT(sDisplayName, vPosition)
ENDIF
#ENDIF
IF DOES_ENTITY_EXIST(PedIndex1)
IF NOT IS_ENTITY_DEAD(PedIndex1)
IF IS_ENTITY_AT_COORD(PedIndex1, vPosition, vSize)
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(PedIndex2)
IF NOT IS_ENTITY_DEAD(PedIndex2)
IF IS_ENTITY_AT_COORD(PedIndex2, vPosition, vSize)
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(PedIndex3)
IF NOT IS_ENTITY_DEAD(PedIndex3)
IF IS_ENTITY_AT_COORD(PedIndex3, vPosition, vSize)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL ARE_ALL_PEDS_IN_LOCATE(PED_INDEX PedIndex1, PED_INDEX PedIndex2, PED_INDEX PedIndex3, VECTOR vPosition, VECTOR vSize
#IF IS_DEBUG_BUILD, STRING sDisplayName = NULL #ENDIF)
//display debug locate name first
#IF IS_DEBUG_BUILD
IF NOT IS_STRING_NULL_OR_EMPTY(sDisplayName)
DRAW_DEBUG_TEXT(sDisplayName, vPosition)
ENDIF
#ENDIF
IF DOES_ENTITY_EXIST(PedIndex1)
AND DOES_ENTITY_EXIST(PedIndex2)
AND DOES_ENTITY_EXIST(PedIndex3)
IF NOT IS_ENTITY_DEAD(PedIndex1)
AND NOT IS_ENTITY_DEAD(PedIndex2)
AND NOT IS_ENTITY_DEAD(PedIndex3)
IF IS_ENTITY_AT_COORD(PedIndex1, vPosition, vSize)
AND IS_ENTITY_AT_COORD(PedIndex2, vPosition, vSize)
AND IS_ENTITY_AT_COORD(PedIndex3, vPosition, vSize)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_ANY_FRIENDLY_IN_ANGLED_AREA_LOCATE(ANGLED_AREA_STRUCT aArea)
//display debug locate name first
#IF IS_DEBUG_BUILD
IF NOT IS_STRING_NULL_OR_EMPTY(aArea.sDebugName)
DRAW_DEBUG_TEXT(aArea.sDebugName, aArea.vStart, 0, 255)
DRAW_DEBUG_TEXT(aArea.sDebugName, aArea.vEnd, 0, 255)
DRAW_DEBUG_LINE(aArea.vStart, aArea.vEnd, 0, 255)
ENDIF
#ENDIF
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_FRANKLIN))
IF NOT IS_ENTITY_DEAD(GET_PED_INDEX(CHAR_FRANKLIN))
IF IS_ENTITY_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_FRANKLIN), aArea.vStart, aArea.vEnd, aArea.fWidth)
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_TREVOR))
IF NOT IS_ENTITY_DEAD(GET_PED_INDEX(CHAR_TREVOR))
IF IS_ENTITY_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_TREVOR), aArea.vStart, aArea.vEnd, aArea.fWidth)
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psLamar.PedIndex)
IF NOT IS_ENTITY_DEAD(psLamar.PedIndex)
IF IS_ENTITY_IN_ANGLED_AREA(psLamar.PedIndex, aArea.vStart, aArea.vEnd, aArea.fWidth)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_ANY_PED_IN_ANGLED_AREA_LOCATE(PED_INDEX PedIndex1, PED_INDEX PedIndex2, PED_INDEX PedIndex3, VECTOR vPosition1, VECTOR vPosition2,
FLOAT fWidth #IF IS_DEBUG_BUILD, STRING sDisplayName = NULL #ENDIF)
//display debug locate name first
#IF IS_DEBUG_BUILD
IF NOT IS_STRING_NULL_OR_EMPTY(sDisplayName)
DRAW_DEBUG_TEXT(sDisplayName, vPosition1)
ENDIF
#ENDIF
IF DOES_ENTITY_EXIST(PedIndex1)
IF NOT IS_ENTITY_DEAD(PedIndex1)
IF IS_ENTITY_IN_ANGLED_AREA(PedIndex1, vPosition1, vPosition2, fWidth)
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(PedIndex2)
IF NOT IS_ENTITY_DEAD(PedIndex2)
IF IS_ENTITY_IN_ANGLED_AREA(PedIndex2, vPosition1, vPosition2, fWidth)
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(PedIndex3)
IF NOT IS_ENTITY_DEAD(PedIndex3)
IF IS_ENTITY_IN_ANGLED_AREA(PedIndex3, vPosition1, vPosition2, fWidth)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL ARE_ALL_PEDS_IN_ANGLED_AREA_LOCATE(PED_INDEX PedIndex1, PED_INDEX PedIndex2, PED_INDEX PedIndex3, VECTOR vPosition1, VECTOR vPosition2,
FLOAT fWidth #IF IS_DEBUG_BUILD, STRING sDisplayName = NULL #ENDIF)
//display debug locate name first
#IF IS_DEBUG_BUILD
IF NOT IS_STRING_NULL_OR_EMPTY(sDisplayName)
DRAW_DEBUG_TEXT(sDisplayName, vPosition1)
ENDIF
#ENDIF
IF DOES_ENTITY_EXIST(PedIndex1)
AND DOES_ENTITY_EXIST(PedIndex2)
AND DOES_ENTITY_EXIST(PedIndex3)
IF NOT IS_ENTITY_DEAD(PedIndex1)
AND NOT IS_ENTITY_DEAD(PedIndex2)
AND NOT IS_ENTITY_DEAD(PedIndex3)
IF IS_ENTITY_IN_ANGLED_AREA(PedIndex1, vPosition1, vPosition2, fWidth)
AND IS_ENTITY_IN_ANGLED_AREA(PedIndex2, vPosition1, vPosition2, fWidth)
AND IS_ENTITY_IN_ANGLED_AREA(PedIndex3, vPosition1, vPosition2, fWidth)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL HAS_ENTITY_DAMAGED_VEHICLES(ENTITY_INDEX EntityIndex, VEH_STRUCT &vsArray[])
BOOL bReturn
IF DOES_ENTITY_EXIST(EntityIndex)
IF NOT IS_ENTITY_DEAD(EntityIndex)
INT i = 0
FOR i = 0 TO ( COUNT_OF(vsArray) - 1 )
IF DOES_ENTITY_EXIST(vsArray[i].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsArray[i].VehicleIndex)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vsArray[i].VehicleIndex, EntityIndex, TRUE)
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(vsArray[i].VehicleIndex)
bReturn = TRUE
ENDIF
ENDIF
ENDIF
ENDFOR
ENDIF
ENDIF
RETURN bReturn
ENDFUNC
FUNC BOOL HAS_ENTITY_DAMAGED_PEDS(ENTITY_INDEX EntityIndex, PED_STRUCT &psArray[])
BOOL bReturn
IF DOES_ENTITY_EXIST(EntityIndex)
IF NOT IS_ENTITY_DEAD(EntityIndex)
INT i = 0
FOR i = 0 TO ( COUNT_OF(psArray) - 1 )
IF DOES_ENTITY_EXIST(psArray[i].PedIndex)
IF NOT IS_ENTITY_DEAD(psArray[i].PedIndex)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(psArray[i].PedIndex, EntityIndex, TRUE)
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(psArray[i].PedIndex)
bReturn = TRUE
ENDIF
ENDIF
ENDIF
ENDFOR
ENDIF
ENDIF
RETURN bReturn
ENDFUNC
FUNC BOOL HAS_PED_BEEN_DAMAGED_OR_SHOT_AT(PED_INDEX PedIndex, FLOAT fBulletCheckRadius = 5.0)
IF DOES_ENTITY_EXIST(PedIndex)
IF NOT IS_ENTITY_DEAD(PedIndex)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(PedIndex)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE(PedIndex)
OR HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(PedIndex, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(PedIndex)
CLEAR_ENTITY_LAST_WEAPON_DAMAGE(PedIndex)
RETURN TRUE
ENDIF
IF HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_EXPLOSION)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_SHOCKING_EXPLOSION)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_SHOT_FIRED)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_SHOT_FIRED_WHIZZED_BY)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_SHOT_FIRED_BULLET_IMPACT)
RETURN TRUE
ENDIF
IF IS_BULLET_IN_AREA(GET_ENTITY_COORDS(PedIndex), fBulletCheckRadius, TRUE)
OR IS_BULLET_IN_AREA(GET_ENTITY_COORDS(PedIndex), fBulletCheckRadius, FALSE)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_PED_SHOOTING_AT_AREA(PED_INDEX PedIndex, BOOL bIsPlayer, VECTOR vPosition, FLOAT fRadius #IF IS_DEBUG_BUILD, BOOL bDrawDebugSphere = TRUE,
INT iRed = 255, INT iGreen = 0, INT iBlue = 0, INT iAlpha = 128 #ENDIF)
IF NOT IS_PED_INJURED(PedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugSphere = TRUE )
DRAW_DEBUG_SPHERE(vPosition, fRadius, iRed, iGreen, iBlue, iAlpha)
ENDIF
#ENDIF
IF IS_PED_SHOOTING(PedIndex)
RETURN IS_BULLET_IN_AREA(vPosition, fRadius, bIsPlayer)
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_PED_SHOOTING_AT_ENTITY(PED_INDEX PedIndex, ENTITY_INDEX EntityIndex)
IF NOT IS_PED_INJURED(PedIndex)
IF DOES_ENTITY_EXIST(EntityIndex)
IF NOT IS_ENTITY_DEAD(EntityIndex)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(EntityIndex, PedIndex, FALSE)
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(EntityIndex, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_PED_SHOOTING_AT_VEHICLES(PED_INDEX PedIndex, VEH_STRUCT &vsArray[])
INT i = 0
BOOL bReturn = FALSE
FOR i = 0 TO ( COUNT_OF(vsArray) - 1 )
IF IS_PED_SHOOTING_AT_ENTITY(PedIndex, vsArray[i].VehicleIndex)
bReturn = TRUE
ENDIF
ENDFOR
RETURN bReturn
ENDFUNC
FUNC BOOL IS_PED_SHOOTING_AT_ENEMIES(PED_INDEX PedIndex, ENEMY_STRUCT &esArray[])
INT i = 0
BOOL bReturn = FALSE
FOR i = 0 TO ( COUNT_OF(esArray) - 1 )
IF IS_PED_SHOOTING_AT_ENTITY(PedIndex, esArray[i].PedIndex)
bReturn = TRUE
ENDIF
ENDFOR
RETURN bReturn
ENDFUNC
FUNC BOOL IS_PED_SHOOTING_AT_PEDS(PED_INDEX PedIndex, PED_STRUCT &psArray[])
INT i = 0
BOOL bReturn = FALSE
FOR i = 0 TO ( COUNT_OF(psArray) - 1 )
IF IS_PED_SHOOTING_AT_ENTITY(PedIndex, psArray[i].PedIndex)
bReturn = TRUE
ENDIF
ENDFOR
RETURN bReturn
ENDFUNC
FUNC BOOL IS_PED_IN_COMBAT_WITH_ANY_PED_FROM_RELATIONSHIP_GROUP_IN_AREA(PED_INDEX PedIndex, REL_GROUP_HASH RelGroup, VECTOR vPosition, FLOAT fRadius)
INT i
PED_INDEX pedArray[16]
IF NOT IS_PED_INJURED(PedIndex)
GET_PED_NEARBY_PEDS(PedIndex, pedArray, PEDTYPE_ANIMAL)
FOR i = 0 TO ( COUNT_OF(pedArray) - 1 )
IF DOES_ENTITY_EXIST(pedArray[i])
IF NOT IS_PED_INJURED(pedArray[i])
IF ( GET_PED_RELATIONSHIP_GROUP_HASH(pedArray[i]) = RelGroup )
IF IS_PED_IN_COMBAT(pedArray[i], PedIndex)
IF ( GET_DISTANCE_BETWEEN_COORDS(vPosition, GET_ENTITY_COORDS(pedArray[i])) <= fRadius )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": IS_PED_IN_COMBAT_WITH_ANY_PED_FROM_RELATIONSHIP_GROUP_IN_AREA() returned true.")
#ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
ENDIF
RETURN FALSE
ENDFUNC
PROC SET_MISSION_PED_PROPERTIES(PED_INDEX PedIndex, REL_GROUP_HASH relGroupHash, BOOL bCanFlyThroughWindscreen, BOOL bKeepRelGroupOnCleanup,
BOOL bCanBeTargetted, BOOL bIsEnemy)
IF DOES_ENTITY_EXIST(PedIndex)
IF NOT IS_PED_INJURED(PedIndex)
SET_PED_AS_ENEMY(PedIndex, bIsEnemy)
SET_PED_CAN_BE_TARGETTED(PedIndex, bCanBeTargetted)
SET_PED_RELATIONSHIP_GROUP_HASH(PedIndex, relGroupHash)
IF ( bCanBeTargetted = FALSE )
SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_MELEE)
SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_BULLET_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_IMPACT)
ENDIF
SET_PED_CONFIG_FLAG(PedIndex, PCF_WillFlyThroughWindscreen, bCanFlyThroughWindscreen)
SET_PED_CONFIG_FLAG(PedIndex, PCF_KeepRelationshipGroupAfterCleanUp, bKeepRelGroupOnCleanup)
SET_PED_CONFIG_FLAG(PedIndex, PCF_LawWillOnlyAttackIfPlayerIsWanted, NOT bCanBeTargetted)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, TRUE)
SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(PedIndex, TRUE)
ENDIF
ENDIF
ENDPROC
PROC SET_PED_SHOOTING_PROPERTIES(PED_INDEX PedIndex, INT iAccuracy, INT iShootRate, FIRING_PATTERN_HASH eFiringPattern = FIRING_PATTERN_BURST_FIRE)
IF NOT IS_PED_INJURED(PedIndex)
SET_PED_ACCURACY(PedIndex, iAccuracy)
SET_PED_SHOOT_RATE(PedIndex, iShootRate)
SET_PED_FIRING_PATTERN(PedIndex, eFiringPattern)
ENDIF
ENDPROC
PROC SET_ENEMY_GROUP_SHOOTING_PROPERTIES(ENEMY_STRUCT &esGroup[], INT iAccuracy, INT iShootRate)
INT iter
REPEAT COUNT_OF(esGroup) iter
IF DOES_ENTITY_EXIST(esGroup[iter].PedIndex)
IF NOT IS_ENTITY_DEAD(esGroup[iter].PedIndex)
SET_PED_SHOOTING_PROPERTIES(esGroup[iter].PedIndex, iAccuracy, iShootRate)
ENDIF
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Creates a ped or player ped to be used by player and returns TRUE if such pad was created successfully.
/// PARAMS:
/// psPed - PED_STRUCT containg ped details, like PED_INDEX, blip, coordinates, heading, model etc.
/// bPlayerPed - Boolean indicating if a player ped or NPC ped should be created.
/// relGroupHash - Relationship group hash for the created ped.
/// bCreateBlip - Boolean indicating if a blip for this ped should be created.
/// eCharacter - Enum specifying character from story characters list. Use NO_CHARACTER for characters not stored in that list and provide a MODEL_NAMES in PED_STRUCT.
/// bCanFlyThroughWindscreen - Sets if ped can fly through windscreen when car crashes.
/// bCanBeTargetted - Sets if ped can be targetted by player.
/// bIsEnemy - Sets if ped is considered an enemy.
/// VehicleIndex - Specify a vehicle index if ped should be created inside a vehicle. IF not use NULL.
/// eVehicleSeat - Vehicle seat enum for peds created in vehicles.
/// RETURNS:
/// TRUE if ped was created successfully, FALSE if otherwise.
FUNC BOOL HAS_MISSION_PED_BEEN_CREATED(PED_STRUCT &psPed, BOOL bPlayerPed, REL_GROUP_HASH relGroupHash, BOOL bCreateBlip, enumCharacterList eCharacter,
BOOL bCanFlyThroughWindscreen = FALSE, BOOL bCanBeTargetted = FALSE, BOOL bIsEnemy = FALSE, VEHICLE_INDEX VehicleIndex = NULL,
VEHICLE_SEAT eVehicleSeat = VS_DRIVER, BOOL bKeepRelGroupOnCleanup = TRUE #IF IS_DEBUG_BUILD, STRING sDebugName = NULL #ENDIF)
IF ( bPlayerPed = FALSE ) //create non player ped
IF NOT DOES_ENTITY_EXIST(psPed.PedIndex)
REQUEST_MODEL(psPed.ModelName)
IF HAS_MODEL_LOADED(psPed.ModelName)
IF ( VehicleIndex = NULL ) //create ped outside of vehicle
IF ( eCharacter = NO_CHARACTER ) //use MODEL_NAMES stored in the PED_STRUCT if no character was specified
psPed.PedIndex = CREATE_PED(PEDTYPE_MISSION, psPed.ModelName, psPed.vPosition, psPed.fHeading)
SET_MODEL_AS_NO_LONGER_NEEDED(psPed.ModelName)
ELSE //use character name to define the ped MODEL_NAMES
IF CREATE_NPC_PED_ON_FOOT(psPed.PedIndex, eCharacter, psPed.vPosition, psPed.fHeading)
SET_MODEL_AS_NO_LONGER_NEEDED(psPed.ModelName)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(psPed.PedIndex)
SET_MISSION_PED_PROPERTIES(psPed.PedIndex, relGroupHash, bCanFlyThroughWindscreen, bKeepRelGroupOnCleanup,
bCanBeTargetted, bIsEnemy)
IF ( bCreateBlip = TRUE )
psPed.BlipIndex = CREATE_BLIP_FOR_ENTITY(psPed.PedIndex, FALSE)
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
IF NOT Is_String_Null_Or_Empty(sDebugName)
SET_PED_NAME_DEBUG(psPed.PedIndex, sDebugName)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created mission ped ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " at coordinates ", psPed.vPosition, ".")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created mission ped with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " at coordinates ", psPed.vPosition, ".")
ENDIF
#ENDIF
RETURN TRUE
ELIF ( VehicleIndex != NULL ) //create ped in a vehicle
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
IF ( eCharacter = NO_CHARACTER ) //use MODEL_NAMES stored in the PED_STRUCT
psPed.PedIndex = CREATE_PED_INSIDE_VEHICLE(VehicleIndex, PEDTYPE_MISSION, psPed.ModelName, eVehicleSeat)
SET_MODEL_AS_NO_LONGER_NEEDED(psPed.ModelName)
ELSE //use character name to define the ped MODEL_NAMES
IF CREATE_NPC_PED_INSIDE_VEHICLE(psPed.PedIndex, eCharacter, VehicleIndex, eVehicleSeat)
SET_MODEL_AS_NO_LONGER_NEEDED(psPed.ModelName)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(psPed.PedIndex)
SET_MISSION_PED_PROPERTIES(psPed.PedIndex, relGroupHash, bCanFlyThroughWindscreen, bKeepRelGroupOnCleanup,
bCanBeTargetted, bIsEnemy)
IF ( bCreateBlip = TRUE )
psPed.BlipIndex = CREATE_BLIP_FOR_ENTITY(psPed.PedIndex, FALSE)
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
IF NOT Is_String_Null_Or_Empty(sDebugName)
SET_PED_NAME_DEBUG(psPed.PedIndex, sDebugName)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created mission ped ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " in vehicle.")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created mission ped with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " in vehicle.")
ENDIF
#ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ELSE
//if the ped already exists return true
RETURN TRUE
ENDIF
ELIF ( bPlayerPed = TRUE ) //create player ped, for example a ped that player can hotswap to and take control of
IF NOT DOES_ENTITY_EXIST(psPed.PedIndex)
IF ( VehicleIndex = NULL ) //create player ped outside of vehicle
IF CREATE_PLAYER_PED_ON_FOOT(psPed.PedIndex, eCharacter, psPed.vPosition, psPed.fHeading, TRUE)
SET_MISSION_PED_PROPERTIES(psPed.PedIndex, relGroupHash, bCanFlyThroughWindscreen, bKeepRelGroupOnCleanup,
bCanBeTargetted, bIsEnemy)
IF ( bCreateBlip = TRUE )
psPed.BlipIndex = CREATE_BLIP_FOR_ENTITY(psPed.PedIndex, FALSE)
ENDIF
#IF IS_DEBUG_BUILD
IF NOT Is_String_Null_Or_Empty(sDebugName)
SET_PED_NAME_DEBUG(psPed.PedIndex, sDebugName)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player ped ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " at coordinates ", psPed.vPosition, ".")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player ped with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " at coordinates ", psPed.vPosition, ".")
ENDIF
#ENDIF
RETURN TRUE
ENDIF
ELIF ( VehicleIndex != NULL ) //create player ped in a vehicle
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
IF CREATE_PLAYER_PED_INSIDE_VEHICLE(psPed.PedIndex, eCharacter, VehicleIndex, eVehicleSeat, TRUE)
SET_MISSION_PED_PROPERTIES(psPed.PedIndex, relGroupHash, bCanFlyThroughWindscreen, bKeepRelGroupOnCleanup,
bCanBeTargetted, bIsEnemy)
IF ( bCreateBlip = TRUE )
psPed.BlipIndex = CREATE_BLIP_FOR_ENTITY(psPed.PedIndex, FALSE)
ENDIF
#IF IS_DEBUG_BUILD
IF NOT Is_String_Null_Or_Empty(sDebugName)
SET_PED_NAME_DEBUG(psPed.PedIndex, sDebugName)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player ped ", sDebugName, " in vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), ".")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player ped in vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), ".")
ENDIF
#ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ELSE
//if the ped already exists, return true
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL HAS_CHOP_BEEN_CREATED(PED_STRUCT &psPed, REL_GROUP_HASH relGroupHash, BOOL bCreateBlip, BOOL bCanFlyThroughWindscreen = FALSE, BOOL bCanBeTargetted = FALSE,
BOOL bIsEnemy = FALSE, BOOL bKeepRelGroupOnCleanup = TRUE #IF IS_DEBUG_BUILD, STRING sDebugName = NULL #ENDIF)
IF NOT DOES_ENTITY_EXIST(psPed.PedIndex)
REQUEST_MODEL(psPed.ModelName)
IF HAS_MODEL_LOADED(psPed.ModelName)
IF CREATE_CHOP(psPed.PedIndex, psPed.vPosition, psPed.fHeading)
IF NOT IS_PED_INJURED(psPed.PedIndex)
SET_MISSION_PED_PROPERTIES(psPed.PedIndex, relGroupHash, bCanFlyThroughWindscreen, bKeepRelGroupOnCleanup, bCanBeTargetted, bIsEnemy)
SET_PED_CAN_RAGDOLL(psPed.PedIndex, TRUE)
SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(psPed.PedIndex, TRUE)
IF ( bCreateBlip = TRUE )
psPed.BlipIndex = CREATE_BLIP_FOR_ENTITY(psPed.PedIndex, FALSE)
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
IF NOT Is_String_Null_Or_Empty(sDebugName)
SET_PED_NAME_DEBUG(psPed.PedIndex, sDebugName)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created Chop ped ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " at coordinates ", psPed.vPosition, ".")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created Chop ped with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " at coordinates ", psPed.vPosition, ".")
ENDIF
#ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(psPed.ModelName)
RETURN TRUE
ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Creates vehicle to be used on a mission by player and returns TRUE if such vehicle was created successfully.
/// PARAMS:
/// vsVehicle - VEH_STRUCT containing model, position and heading of the vehicle.
/// bPlayerVehicle - If set to TRUE will create player specific vehicles using CREATE_PLAYER_VEHICLE()
/// bCarStealVehicle - If set to TRUE will create car steal strand vehicle with a specific command. Works when bPlayerVehicle is FALSE.
/// eCharacter - Character enum indicating which character specific vehicle to create.
/// bMissionCritical - Sets the vehicle to be unable to leak oil/petrol and break off doors. Set to TRUE to stop these damage types to vehicle.
/// iColourCombination - Colour combination of the vehicle.
/// iColour1 - Colour 1 of the vehicle.
/// iColour2 - Colour 2 of the vehicle.
/// RETURNS:
/// TRUE if vehicle was created, FALSE if otherwise.
FUNC BOOL HAS_MISSION_VEHICLE_BEEN_CREATED(VEH_STRUCT &vsVehicle, BOOL bPlayerVehicle = FALSE, BOOL bCarStealVehicle = FALSE, enumCharacterList eCharacter = CHAR_MICHAEL,
BOOL bMissionCritical = TRUE, INT iColourCombination = -1, INT iColour1 = -1, INT iColour2 = -1,
INT iColour3 = 0, INT iColour4 = 0 #IF IS_DEBUG_BUILD, STRING sDebugName = NULL #ENDIF)
//create any vehicle that can be used on a mission by player
IF ( bPlayerVehicle = FALSE )
IF NOT DOES_ENTITY_EXIST(vsVehicle.VehicleIndex)
REQUEST_MODEL(vsVehicle.ModelName)
IF HAS_MODEL_LOADED(vsVehicle.ModelName)
IF( bCarStealVehicle = TRUE )
vsVehicle.VehicleIndex = CREATE_CAR_STEAL_STRAND_CAR(vsVehicle.ModelName, vsVehicle.vPosition, vsVehicle.fHeading)
SET_MODEL_AS_NO_LONGER_NEEDED(vsVehicle.ModelName)
ELSE
IF ( eCharacter = NO_CHARACTER )
vsVehicle.VehicleIndex = CREATE_VEHICLE(vsVehicle.ModelName, vsVehicle.vPosition, vsVehicle.fHeading)
SET_MODEL_AS_NO_LONGER_NEEDED(vsVehicle.ModelName)
ELSE //create npc vehicle based on the character enum specified
IF CREATE_NPC_VEHICLE(vsVehicle.VehicleIndex, eCharacter, vsVehicle.vPosition, vsVehicle.fHeading)
SET_MODEL_AS_NO_LONGER_NEEDED(vsVehicle.ModelName)
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsVehicle.VehicleIndex)
//set vehicle colours, if they are provided
IF ( iColour1 != -1)
AND ( iColour2 != -1 )
SET_VEHICLE_COLOURS(vsVehicle.VehicleIndex, iColour1, iColour2)
ENDIF
//set vehicle colour combination, if it is provided
IF ( iColourCombination != -1 )
SET_VEHICLE_COLOUR_COMBINATION(vsVehicle.VehicleIndex, iColourCombination)
ENDIF
SET_VEHICLE_EXTRA_COLOURS(vsVehicle.VehicleIndex, iColour3, iColour4)
SET_VEHICLE_HAS_STRONG_AXLES(vsVehicle.VehicleIndex, bMissionCritical)
//limit damage that can be done to the vehicle
SET_VEHICLE_CAN_LEAK_OIL(vsVehicle.VehicleIndex, NOT bMissionCritical)
SET_VEHICLE_CAN_LEAK_PETROL(vsVehicle.VehicleIndex, NOT bMissionCritical)
//make the vehicle not attach to tow truck if mission critical
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vsVehicle.VehicleIndex, NOT bMissionCritical)
IF IS_THIS_MODEL_A_CAR(vsVehicle.ModelName)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVehicle.VehicleIndex, SC_DOOR_FRONT_LEFT, NOT bMissionCritical)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVehicle.VehicleIndex, SC_DOOR_FRONT_RIGHT, NOT bMissionCritical)
ENDIF
SET_VEHICLE_ON_GROUND_PROPERLY(vsVehicle.VehicleIndex)
ENDIF
#IF IS_DEBUG_BUILD
IF NOT Is_String_Null_Or_Empty(sDebugName)
SET_VEHICLE_NAME_DEBUG(vsVehicle.VehicleIndex, sDebugName)
IF ( bCarStealVehicle = TRUE )
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created car steal strand vehicle ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created vehicle ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
ENDIF
ELSE
IF ( bCarStealVehicle = TRUE )
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created car steal strand vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
ENDIF
ENDIF
#ENDIF
RETURN TRUE
ENDIF
ELSE //if the vehicle exists, return true
RETURN TRUE
ENDIF
//create player specific vehicle
ELIF ( bPlayerVehicle = TRUE )
IF NOT DOES_ENTITY_EXIST(vsVehicle.VehicleIndex)
//call the player vehicle creation until it returns true
IF CREATE_PLAYER_VEHICLE(vsVehicle.VehicleIndex, eCharacter, vsVehicle.vPosition, vsVehicle.fHeading, TRUE)
SET_VEHICLE_HAS_STRONG_AXLES(vsVehicle.VehicleIndex, bMissionCritical)
//limit damage that can be done to the vehicle
SET_VEHICLE_CAN_LEAK_OIL(vsVehicle.VehicleIndex, NOT bMissionCritical)
SET_VEHICLE_CAN_LEAK_PETROL(vsVehicle.VehicleIndex, NOT bMissionCritical)
//make the vehicle not attach to tow truck if mission critical
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vsVehicle.VehicleIndex, NOT bMissionCritical)
IF IS_THIS_MODEL_A_CAR(vsVehicle.ModelName)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVehicle.VehicleIndex, SC_DOOR_FRONT_LEFT, NOT bMissionCritical)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVehicle.VehicleIndex, SC_DOOR_FRONT_RIGHT, NOT bMissionCritical)
ENDIF
#IF IS_DEBUG_BUILD
IF NOT Is_String_Null_Or_Empty(sDebugName)
SET_VEHICLE_NAME_DEBUG(vsVehicle.VehicleIndex, sDebugName)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player vehicle ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
ENDIF
#ENDIF
RETURN TRUE
ENDIF
ELSE //if the vehicle exists, return true
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL HAS_MISSION_TRAIN_BEEN_CREATED(TRAIN_STRUCT &train, FLOAT fSpeed, BOOL bDirectionFlag = FALSE)
IF NOT DOES_ENTITY_EXIST(train.VehicleIndex)
REQUEST_MODEL(train.ModelName1)
REQUEST_MODEL(train.ModelName2)
REQUEST_MODEL(train.ModelName3)
IF HAS_MODEL_LOADED(train.ModelName1)
AND HAS_MODEL_LOADED(train.ModelName2)
AND HAS_MODEL_LOADED(train.ModelName3)
train.VehicleIndex = CREATE_MISSION_TRAIN(train.iConfiguration, train.vPosition, bDirectionFlag)
SET_TRAIN_SPEED(train.VehicleIndex, fSpeed)
SET_TRAIN_CRUISE_SPEED(train.VehicleIndex, fSpeed)
SET_CAN_AUTO_VAULT_ON_ENTITY(train.VehicleIndex, FALSE)
SET_CAN_CLIMB_ON_ENTITY(train.VehicleIndex, FALSE)
INT i
FOR i = 0 TO 12
VEHICLE_INDEX CarriageVehicleIndex
CarriageVehicleIndex = GET_TRAIN_CARRIAGE(train.VehicleIndex, i)
IF DOES_ENTITY_EXIST(CarriageVehicleIndex)
IF NOT IS_ENTITY_DEAD(CarriageVehicleIndex)
SET_CAN_AUTO_VAULT_ON_ENTITY(CarriageVehicleIndex, FALSE)
SET_CAN_CLIMB_ON_ENTITY(CarriageVehicleIndex, FALSE)
ENDIF
ENDIF
ENDFOR
SET_MODEL_AS_NO_LONGER_NEEDED(train.ModelName1)
SET_MODEL_AS_NO_LONGER_NEEDED(train.ModelName2)
SET_MODEL_AS_NO_LONGER_NEEDED(train.ModelName3)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created mission train with configuration ", train.iConfiguration, " at coordinates ", train.vPosition, ".")
#ENDIF
RETURN TRUE
ENDIF
ELSE
IF IS_VEHICLE_DRIVEABLE(train.VehicleIndex)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC CREATE_PARKED_VEHICLES(INT &iProgress)
SWITCH iProgress
CASE 0
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vGroveStreet) < 400.0
iProgress++
ENDIF
BREAK
CASE 1
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsParkedVehicles[0], FALSE, FALSE, NO_CHARACTER, FALSE)
SET_ENTITY_HEALTH(vsParkedVehicles[0].VehicleIndex, 2000)
SET_VEHICLE_ENGINE_HEALTH(vsParkedVehicles[0].VehicleIndex, 2000)
SET_VEHICLE_PETROL_TANK_HEALTH(vsParkedVehicles[0].VehicleIndex, 2000)
ACTIVATE_PHYSICS(vsParkedVehicles[0].VehicleIndex)
SET_VEHICLE_DOORS_LOCKED(vsParkedVehicles[0].VehicleIndex, VEHICLELOCK_LOCKED)
iProgress++
ENDIF
BREAK
CASE 2
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsParkedVehicles[1], FALSE, FALSE, NO_CHARACTER, FALSE)
SET_ENTITY_HEALTH(vsParkedVehicles[1].VehicleIndex, 2000)
SET_VEHICLE_ENGINE_HEALTH(vsParkedVehicles[1].VehicleIndex, 2000)
SET_VEHICLE_PETROL_TANK_HEALTH(vsParkedVehicles[1].VehicleIndex, 2000)
ACTIVATE_PHYSICS(vsParkedVehicles[1].VehicleIndex)
SET_VEHICLE_DOORS_LOCKED(vsParkedVehicles[1].VehicleIndex, VEHICLELOCK_LOCKED)
iProgress++
ENDIF
BREAK
CASE 3
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsParkedVehicles[2], FALSE, FALSE, NO_CHARACTER, FALSE)
SET_ENTITY_HEALTH(vsParkedVehicles[2].VehicleIndex, 2000)
SET_VEHICLE_ENGINE_HEALTH(vsParkedVehicles[2].VehicleIndex, 2000)
SET_VEHICLE_PETROL_TANK_HEALTH(vsParkedVehicles[2].VehicleIndex, 2000)
ACTIVATE_PHYSICS(vsParkedVehicles[2].VehicleIndex)
SET_VEHICLE_DOORS_LOCKED(vsParkedVehicles[2].VehicleIndex, VEHICLELOCK_LOCKED)
iProgress++
ENDIF
BREAK
CASE 4
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsParkedVehicles[3], FALSE, FALSE, NO_CHARACTER, FALSE)
SET_ENTITY_HEALTH(vsParkedVehicles[3].VehicleIndex, 2000)
SET_VEHICLE_ENGINE_HEALTH(vsParkedVehicles[3].VehicleIndex, 2000)
SET_VEHICLE_PETROL_TANK_HEALTH(vsParkedVehicles[3].VehicleIndex, 2000)
ACTIVATE_PHYSICS(vsParkedVehicles[3].VehicleIndex)
SET_VEHICLE_DOORS_LOCKED(vsParkedVehicles[3].VehicleIndex, VEHICLELOCK_LOCKED)
iProgress++
ENDIF
BREAK
ENDSWITCH
ENDPROC
FUNC PED_INDEX CREATE_ENEMY_PED(MODEL_NAMES modelName, VECTOR vPosition, FLOAT fHeading, REL_GROUP_HASH group,
WEAPON_TYPE eWeaponType = WEAPONTYPE_UNARMED, INT iHealth = 200, BOOL bTrackHeadShot = TRUE)
PED_INDEX PedIndex = CREATE_PED(PEDTYPE_MISSION, modelName, vPosition, fHeading) //create ped
SET_PED_MAX_HEALTH(PedIndex, iHealth) //ped health
SET_ENTITY_HEALTH(PedIndex, iHealth)
SET_PED_DIES_WHEN_INJURED(PedIndex, TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(PedIndex, group) //ped relationship group hash
GIVE_WEAPON_TO_PED(PedIndex, eWeaponType, INFINITE_AMMO, TRUE) //ped weapon
SET_CURRENT_PED_WEAPON(PedIndex, eWeaponType, TRUE)
SET_PED_INFINITE_AMMO(PedIndex, TRUE, eWeaponType)
SET_PED_AS_ENEMY(PedIndex, TRUE) //make ped an enemy
SET_PED_TARGET_LOSS_RESPONSE(PedIndex, TLR_NEVER_LOSE_TARGET) //make ped never lose target
SET_PED_PATH_CAN_USE_CLIMBOVERS(PedIndex, FALSE) //make ped not use climbovers
SET_PED_CONFIG_FLAG(PedIndex, PCF_DisableHurt, TRUE) //ped config flags
SET_PED_CONFIG_FLAG(PedIndex, PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_KeepRelationshipGroupAfterCleanUp, TRUE)
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_USE_VEHICLE, FALSE) //ped combat attributes
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
SET_COMBAT_FLOAT(PedIndex, CCF_TIME_TO_INVALIDATE_INJURED_TARGET, 30.0) //ped combat float
IF ( bTrackHeadShot = TRUE )
INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(PedIndex) //make ped tracked by headshot stat
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created enemy ped with model ", GET_MODEL_NAME_FOR_DEBUG(modelName), " at coordinates ", vPosition, ".")
#ENDIF
iReplayCameraWarpTimer = GET_GAME_TIMER() + 1000 //Fix for bug 2229916
RETURN PedIndex
ENDFUNC
FUNC PED_INDEX CREATE_ENEMY_PED_IN_VEHICLE(MODEL_NAMES modelName, VEHICLE_INDEX vehicleIndex, VEHICLE_SEAT eSeat, REL_GROUP_HASH group,
WEAPON_TYPE eWeaponType = WEAPONTYPE_UNARMED, INT iHealth = 200)
PED_INDEX ped
IF IS_VEHICLE_DRIVEABLE(vehicleIndex)
ped = CREATE_ENEMY_PED(modelName, GET_ENTITY_COORDS(vehicleIndex) + <<0.0, 0.0, 3.0>>, 0.0, group, eWeaponType, iHealth)
SET_PED_INTO_VEHICLE(ped, vehicleIndex, eSeat)
ENDIF
RETURN ped
ENDFUNC
FUNC VEHICLE_INDEX CREATE_ENEMY_VEHICLE(VEH_STRUCT &sVehicle, INT iHealth = 1000, BOOL bConsideredByPlayer = FALSE, LOCK_STATE eLockState = VEHICLELOCK_UNLOCKED,
INT iColour1 = -1, INT iColour2 = -1 #IF IS_DEBUG_BUILD, STRING sDebugName = NULL #ENDIF)
VEHICLE_INDEX vehicleIndex = CREATE_VEHICLE(sVehicle.ModelName, sVehicle.vPosition, sVehicle.fHeading)
SET_ENTITY_HEALTH(vehicleIndex, iHealth)
SET_VEHICLE_ENGINE_HEALTH(vehicleIndex, TO_FLOAT(iHealth))
SET_VEHICLE_PETROL_TANK_HEALTH(vehicleIndex, TO_FLOAT(iHealth))
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehicleIndex, bConsideredByPlayer)
SET_VEHICLE_DOORS_LOCKED(vehicleIndex, eLockState)
IF ( iColour1 != -1)
AND ( iColour2 != -1 )
SET_VEHICLE_COLOURS(vehicleIndex, iColour1, iColour2)
SET_VEHICLE_EXTRA_COLOURS(vehicleIndex, 0, 0) //make sure only normal colours are set, no extras
ENDIF
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(vehicleIndex, TRUE)
#IF IS_DEBUG_BUILD
IF NOT Is_String_Null_Or_Empty(sDebugName)
SET_VEHICLE_NAME_DEBUG(vehicleIndex, sDebugName)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created enemy vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(sVehicle.ModelName), " and debug name ", sDebugName, " and health ", GET_ENTITY_HEALTH(vehicleIndex), ".")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created enemy vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(sVehicle.ModelName), ".")
ENDIF
#ENDIF
RETURN vehicleIndex
ENDFUNC
FUNC BOOL HAS_MISSION_OBJECT_BEEN_CREATED(OBJECT_STRUCT &osObject, BOOL bFreezeObject = FALSE)
IF NOT DOES_ENTITY_EXIST(osObject.ObjectIndex)
REQUEST_MODEL(osObject.ModelName)
IF HAS_MODEL_LOADED(osObject.ModelName)
osObject.ObjectIndex = CREATE_OBJECT(osObject.ModelName, osObject.vPosition)
SET_ENTITY_COORDS_NO_OFFSET(osObject.ObjectIndex, osObject.vPosition)
SET_ENTITY_ROTATION(osObject.ObjectIndex, osObject.vRotation)
FREEZE_ENTITY_POSITION(osObject.ObjectIndex, bFreezeObject)
SET_CAN_CLIMB_ON_ENTITY(osObject.ObjectIndex, FALSE)
SET_CAN_AUTO_VAULT_ON_ENTITY(osObject.ObjectIndex, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(osObject.ModelName)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created object with model ", GET_MODEL_NAME_FOR_DEBUG(osObject.ModelName), " at coordinates ", osObject.vPosition, ".")
#ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL HAVE_MISSION_OBJECTS_BEEN_CREATED(OBJECT_STRUCT &osArray[])
INT i = 0
BOOL bReturn
FOR i = 0 TO ( COUNT_OF(osArray) - 1 )
IF HAS_MISSION_OBJECT_BEEN_CREATED(osArray[i])
bReturn = TRUE
ENDIF
ENDFOR
RETURN bReturn
ENDFUNC
PROC CREATE_DUMPSTERS(INT &iProgress)
SWITCH iProgress
CASE 0
IF HAS_MISSION_OBJECT_BEEN_CREATED(osDumpsters[0])
iProgress++
ENDIF
BREAK
CASE 1
IF HAS_MISSION_OBJECT_BEEN_CREATED(osDumpsters[1])
iProgress++
ENDIF
BREAK
CASE 2
IF HAS_MISSION_OBJECT_BEEN_CREATED(osDumpsters[2])
iProgress++
ENDIF
BREAK
CASE 3
IF HAS_MISSION_OBJECT_BEEN_CREATED(osDumpsters[3])
iProgress++
ENDIF
BREAK
CASE 4
IF HAS_MISSION_OBJECT_BEEN_CREATED(osDumpsters[4])
iProgress++
ENDIF
BREAK
CASE 5
IF HAS_MISSION_OBJECT_BEEN_CREATED(osDumpsters[5])
iProgress++
ENDIF
BREAK
CASE 6
IF HAS_MISSION_OBJECT_BEEN_CREATED(osDumpsters[6])
iProgress++
ENDIF
BREAK
CASE 7
IF HAS_MISSION_OBJECT_BEEN_CREATED(osDumpsters[7])
iProgress++
ENDIF
BREAK
CASE 8
IF HAS_MISSION_OBJECT_BEEN_CREATED(osDumpsters[8])
iProgress++
ENDIF
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL IS_VEHICLE_AT_COORD(VEHICLE_INDEX vehIndex, VECTOR coords, VECTOR coordDimensions)
IF IS_VEHICLE_DRIVEABLE(vehIndex)
IF IS_ENTITY_AT_COORD(vehIndex, coords, coordDimensions)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_SPEEDOPHILE_STUCK(VEHICLE_INDEX VehicleIndex)
IF DOES_ENTITY_EXIST(VehicleIndex)
IF NOT IS_ENTITY_DEAD(VehicleIndex)
IF NOT IS_ENTITY_IN_WATER(VehicleIndex)
IF ( GET_ENTITY_SPEED(VehicleIndex) = 0 )
IF IS_VEHICLE_PERMANENTLY_STUCK(VehicleIndex)
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Checks if the specified mocap cutscene has loaded.
/// Removes any other loaded mocap cutscene and requests the specified cutscene until it is loaded.
/// PARAMS:
/// sSceneName - Mocap cutscene name to check for being loaded.
/// CutsceneSection - Cutscene section specifying at what section to start the cutscene. Use CS_SECTION_1 to play from start.
/// RETURNS:
/// TRUE if the specified cutscene has loaded, FALSE if otherwise.
FUNC BOOL HAS_REQUESTED_CUTSCENE_LOADED(STRING sSceneName, CUTSCENE_SECTION CutsceneSection = CS_SECTION_1)
//check if the specified cutscene has loaded first
IF HAS_THIS_CUTSCENE_LOADED_WITH_FAILSAFE(sSceneName)
RETURN TRUE
ELSE
//if the expected reuqested cutscene has not loaded, but there already is a loaded cutscene
//then remove it and keep requesting specified mocap cutscene
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
REMOVE_CUTSCENE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": HAS_REQUESTED_CUTSCENE_LOADED() Removing cutscene from memory, because cutscene ", sSceneName, " was expected to be loaded.")
#ENDIF
ENDIF
IF ( CutsceneSection = CS_SECTION_1)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Cutscene ", sSceneName, " is loading.")
#ENDIF
//if the cutscene is not loaded, keep requesting it
REQUEST_CUTSCENE(sSceneName)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requesting ", sSceneName, ".")
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Cutscene ", sSceneName, " is loading with playback list.")
#ENDIF
//if the cutscene is not loaded, keep requesting it
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST(sSceneName, CutsceneSection)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requesting ", sSceneName, " cutscene with playback list.")
#ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Returns the next mission stage after the specified mission stage.
/// PARAMS:
/// eStage - Mission stage to get the next mission stage.
/// RETURNS:
/// Mission stage that is next after the specified mission stage.
FUNC MISSION_STAGES GET_NEXT_MISSION_STAGE_FOR_SHITSKIP(MISSION_STAGES eStage)
SWITCH eStage
CASE MISSION_STAGE_LOSE_COPS
CASE MISSION_STAGE_CUTSCENE_DROPOFF_LAMAR
CASE MISSION_STAGE_CUTSCENE_DROPOFF_TREVOR
CASE MISSION_STAGE_CUTSCENE_DROPOFF_FRANKLIN
CASE MISSION_STAGE_END
RETURN MISSION_STAGE_END
BREAK
ENDSWITCH
MISSION_STAGES eNextStage
INT iNextStage = ENUM_TO_INT(eStage) + 1
eNextStage = INT_TO_ENUM(MISSION_STAGES, iNextStage)
RETURN eNextStage
ENDFUNC
/// PURPOSE:
/// Check is the specified time has passed using specified timer.
/// PARAMS:
/// iTimeAmount - Time to check.
/// iTimer - Timer to use.
/// RETURNS:
/// True is the specified amount of time has passed for the specified timer.
FUNC BOOL HAS_TIME_PASSED(INT iTimeAmount, INT iTimer)
INT iCurrentTime
INT iTimeDifference
iCurrentTime = GET_GAME_TIMER()
iTimeDifference = iCurrentTime - iTimeAmount
IF iTimeDifference > iTimer
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Returns PED_INDEX of player ped currently not controlled by the player.
/// RETURNS:
/// Trevor's PED_INDEX if player is controlling Franklin. Franklin's PED_INDEX if player is controlling Trevor.
FUNC PED_INDEX GET_OTHER_PLAYER_PED_INDEX()
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
RETURN sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
BREAK
CASE CHAR_TREVOR
RETURN sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]
BREAK
ENDSWITCH
RETURN NULL
ENDFUNC
FUNC PED_CLEANUP_REASONS GET_PED_CLEANUP_REASON(PED_INDEX PedIndex #IF IS_DEBUG_BUILD, STRING sDebugName #ENDIF)
IF DOES_ENTITY_EXIST(PedIndex)
IF IS_ENTITY_DEAD(PedIndex)
ENTITY_INDEX SourceOfDeathEntity
SourceOfDeathEntity = GET_PED_SOURCE_OF_DEATH(PedIndex)
IF IS_ENTITY_A_PED(SourceOfDeathEntity)
PED_INDEX SourceOfDeathPed
SourceOfDeathPed = GET_PED_INDEX_FROM_ENTITY_INDEX(SourceOfDeathEntity)
IF ( SourceOfDeathPed = GET_PED_INDEX(CHAR_FRANKLIN) )
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF GET_PED_CAUSE_OF_DEATH(PedIndex) = WEAPONTYPE_SNIPERRIFLE
OR GET_PED_CAUSE_OF_DEATH(PedIndex) = WEAPONTYPE_ADVANCEDRIFLE
bLastEnemyKilledWithSniperRifle = TRUE
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", sDebugName, " cleaned up with reason PED_CLEANUP_KILLED_BY_PLAYER_AS_FRANKLIN.")
#ENDIF
RETURN PED_CLEANUP_KILLED_BY_PLAYER_AS_FRANKLIN
BREAK
CASE CHAR_TREVOR
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", sDebugName, " cleaned up with reason PED_CLEANUP_KILLED_BY_FRANKLIN.")
#ENDIF
RETURN PED_CLEANUP_KILLED_BY_FRANKLIN
BREAK
ENDSWITCH
ELIF ( SourceOfDeathPed = GET_PED_INDEX(CHAR_TREVOR) )
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", sDebugName, " cleaned up with reason PED_CLEANUP_KILLED_BY_TREVOR.")
#ENDIF
RETURN PED_CLEANUP_KILLED_BY_TREVOR
BREAK
CASE CHAR_TREVOR
IF GET_PED_CAUSE_OF_DEATH(PedIndex) = WEAPONTYPE_SNIPERRIFLE
OR GET_PED_CAUSE_OF_DEATH(PedIndex) = WEAPONTYPE_ADVANCEDRIFLE
bLastEnemyKilledWithSniperRifle = TRUE
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", sDebugName, " cleaned up with reason PED_CLEANUP_KILLED_BY_PLAYER_AS_TREVOR.")
#ENDIF
RETURN PED_CLEANUP_KILLED_BY_PLAYER_AS_TREVOR
BREAK
ENDSWITCH
ELIF ( SourceOfDeathPed = psLamar.PedIndex )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", sDebugName, " cleaned up with reason PED_CLEANUP_KILLED_BY_LAMAR.")
#ENDIF
RETURN PED_CLEANUP_KILLED_BY_LAMAR
ELIF ( SourceOfDeathPed = psChop.PedIndex )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", sDebugName, " cleaned up with reason PED_CLEANUP_KILLED_BY_CHOP.")
#ENDIF
RETURN PED_CLEANUP_KILLED_BY_CHOP
ENDIF
ENDIF
ENDIF
ENDIF
RETURN PED_CLEANUP_NO_CLEANUP
ENDFUNC
PROC CLEANUP_MISSION_OBJECT(OBJECT_STRUCT &osObject, BOOL bDelete = FALSE)
IF DOES_ENTITY_EXIST(osObject.ObjectIndex)
IF IS_ENTITY_ATTACHED(osObject.ObjectIndex)
DETACH_ENTITY(osObject.ObjectIndex)
ENDIF
IF ( bDelete = TRUE )
DELETE_OBJECT(osObject.ObjectIndex)
ELSE
SET_OBJECT_AS_NO_LONGER_NEEDED(osObject.ObjectIndex)
ENDIF
ENDIF
ENDPROC
PROC CLEANUP_MISSION_OBJECT_GROUP(OBJECT_STRUCT &osArray[], BOOL bDelete = FALSE)
INT i = 0
FOR i = 0 TO ( COUNT_OF(osArray) - 1 )
CLEANUP_MISSION_OBJECT(osArray[i], bDelete)
ENDFOR
ENDPROC
PROC UPDATE_PLAYER_AND_BUDDY_KILL_COUNTERS(PED_CLEANUP_REASONS eCleanupReason, INT &iPlayerKillsFranklin, INT &iPlayerKillsTrevor,
INT &iBuddyKillsFranklin, INT &iBuddyKillsTrevor, INT &iBuddyKillsLamar, INT &iBuddyKillsChop)
SWITCH eCleanupReason
CASE PED_CLEANUP_KILLED_BY_PLAYER_AS_FRANKLIN
iPlayerKillsFranklin++
INFORM_MISSION_STATS_OF_INCREMENT(FRA1_FRANKLIN_KILLS)
INFORM_MISSION_STATS_OF_INCREMENT(FRA1_KILLS)
BREAK
CASE PED_CLEANUP_KILLED_BY_PLAYER_AS_TREVOR
iPlayerKillsTrevor++
INFORM_MISSION_STATS_OF_INCREMENT(FRA1_TREVOR_KILLS)
INFORM_MISSION_STATS_OF_INCREMENT(FRA1_KILLS)
BREAK
CASE PED_CLEANUP_KILLED_BY_FRANKLIN
iBuddyKillsFranklin++
BREAK
CASE PED_CLEANUP_KILLED_BY_TREVOR
iBuddyKillsTrevor++
BREAK
CASE PED_CLEANUP_KILLED_BY_LAMAR
iBuddyKillsLamar++
BREAK
CASE PED_CLEANUP_KILLED_BY_CHOP
iBuddyKillsChop++
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": *********************** UPDATE_PLAYER_AND_BUDDY_KILL_COUNTERS *************************")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player kills as Franklin: ", iPlayerKillsFranklin, ". Player kills as Trevor: ", iPlayerKillsTrevor, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Buddy kills Franklin: ", iBuddyKillsFranklin, ". Buddy kills Trevor: ", iBuddyKillsTrevor, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Buddy kills Lamar: ", iBuddyKillsLamar, ". Buddy kills Chop: ", iBuddyKillsChop, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": ***************************************************************************************")
#ENDIF
ENDPROC
PROC CLEANUP_ENEMY_PED(ENEMY_STRUCT &enemy, BOOL bDelete = FALSE, BOOL bDeathOnly = TRUE,
BOOL bRenderBlip = TRUE, BOOL bKeepTask = TRUE, BOOL bRunKillCounter = FALSE)
IF ( bDelete = FALSE )
IF DOES_ENTITY_EXIST(enemy.PedIndex)
IF ( bDeathOnly = TRUE )
IF IS_PED_INJURED(enemy.PedIndex)
IF ( enemy.eCleanupReason = PED_CLEANUP_NO_CLEANUP )
IF IS_ENTITY_DEAD(enemy.PedIndex)
REMOVE_PED_DEFENSIVE_AREA(enemy.PedIndex)
ENDIF
IF DOES_BLIP_EXIST(enemy.BlipIndex)
REMOVE_BLIP(enemy.BlipIndex)
ENDIF
IF IS_ITEMSET_VALID(enemy.ItemsetIndex)
DESTROY_ITEMSET(enemy.ItemsetIndex)
ENDIF
enemy.eCleanupReason = GET_PED_CLEANUP_REASON(enemy.PedIndex #IF IS_DEBUG_BUILD, enemy.sDebugName #ENDIF)
enemy.iCleanupAttempts++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", enemy.sDebugName, " had ", enemy.iCleanupAttempts, " cleanup attempts .")
#ENDIF
IF ( enemy.iCleanupAttempts = 10 )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", enemy.sDebugName, " cleaned up with reason PED_CLEANUP_NONE due to cleanup attempts running out.")
#ENDIF
enemy.eCleanupReason = PED_CLEANUP_NONE
ENDIF
ELSE
IF ( bRunKillCounter = TRUE )
UPDATE_PLAYER_AND_BUDDY_KILL_COUNTERS(enemy.eCleanupReason, iPlayerFranklinKills, iPlayerTrevorKills,
iBuddyFranklinKills, iBuddyTrevorKills, iBuddyLamarKills, iBuddyChopKills)
ENDIF
SET_PED_AS_NO_LONGER_NEEDED(enemy.PedIndex)
ENDIF
ELSE
IF ( bRenderBlip = FALSE )
IF DOES_BLIP_EXIST(enemy.BlipIndex)
REMOVE_BLIP(enemy.BlipIndex)
ENDIF
ELSE
IF NOT DOES_BLIP_EXIST(enemy.BlipIndex)
enemy.BlipIndex = CREATE_BLIP_FOR_ENTITY(enemy.PedIndex, TRUE)
ENDIF
ENDIF
ENDIF
ELIF ( bDeathOnly = FALSE )
IF NOT IS_PED_INJURED(enemy.PedIndex)
SET_PED_KEEP_TASK(enemy.PedIndex, bKeepTask)
SET_PED_AS_NO_LONGER_NEEDED(enemy.PedIndex)
IF DOES_BLIP_EXIST(enemy.BlipIndex)
REMOVE_BLIP(enemy.BlipIndex)
ENDIF
ENDIF
IF IS_ITEMSET_VALID(enemy.ItemsetIndex)
DESTROY_ITEMSET(enemy.ItemsetIndex)
ENDIF
ENDIF
ENDIF
ELIF ( bDelete = TRUE )
IF DOES_ENTITY_EXIST(enemy.PedIndex)
IF IS_PED_INJURED(enemy.PedIndex)
OR NOT IS_PED_INJURED(enemy.PedIndex)
IF IS_ENTITY_DEAD(enemy.PedIndex)
OR NOT IS_ENTITY_DEAD(enemy.PedIndex)
REMOVE_PED_DEFENSIVE_AREA(enemy.PedIndex)
ENDIF
DELETE_PED(enemy.PedIndex)
IF DOES_BLIP_EXIST(enemy.BlipIndex)
REMOVE_BLIP(enemy.BlipIndex)
ENDIF
ENDIF
ENDIF
IF IS_ITEMSET_VALID(enemy.ItemsetIndex)
DESTROY_ITEMSET(enemy.ItemsetIndex)
ENDIF
enemy.bCreated = FALSE
enemy.bHasTask = FALSE
enemy.fDistanceToTarget = 0.0
enemy.iTimer = 0
enemy.iProgress = 0
enemy.iCleanupAttempts = 0
enemy.eCleanupReason = PED_CLEANUP_NO_CLEANUP
ENDIF
ENDPROC
PROC CLEANUP_ENEMY_GROUP(ENEMY_STRUCT &array[], BOOL bDelete = FALSE, BOOL bDeathOnly = TRUE,
BOOL bRenderBlip = TRUE, BOOL bKeepTask = TRUE, BOOL bRunKillCounter = TRUE)
INT i = 0
FOR i = 0 TO ( COUNT_OF(array) - 1 )
CLEANUP_ENEMY_PED(array[i], bDelete, bDeathOnly, bRenderBlip, bKeepTask, bRunKillCounter)
IF ( bDelete = FALSE AND bDeathOnly = FALSE )
OR ( bDelete = TRUE )
CLEANUP_AI_PED_BLIP(array[i].EnemyBlipData)
ENDIF
ENDFOR
ENDPROC
PROC CLEANUP_VEHICLE(VEH_STRUCT &vehicle, BOOL bDelete = FALSE, BOOL bDeathOnly = TRUE)
IF ( bDelete = FALSE )
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF ( bDeathOnly = TRUE )
IF NOT IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
OR IS_ENTITY_DEAD(vehicle.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
ENDIF
ELIF ( bDeathOnly = FALSE )
IF NOT IS_ENTITY_DEAD(vehicle.VehicleIndex)
//cleanup here
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
ENDIF
ENDIF
ENDIF
ELIF ( bDelete = TRUE )
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
//IF IS_ENTITY_A_MISSION_ENTITY(vehicle.VehicleIndex)
DELETE_VEHICLE(vehicle.VehicleIndex)
//ENDIF
ENDIF
vehicle.iProgress = 0
vehicle.bAutoDrive = FALSE
vehicle.bDriverDead = FALSE
vehicle.fPlaybackSpeed = 0.0
vehicle.fPlaybackTime = 0.0
ENDIF
ENDPROC
/// PURPOSE:
/// Handles removing dead enemy vehicles from a specified vehicle struct array by setting them as no longer needed.
/// Deletes the vehicles no matter of their health state if bDelete is set to TRUE.
/// PARAMS:
/// vsArray - Array of instances of vehicle_struct.
/// bDelete - If set to TRUE this will delete the vehicles no matter if they are dead or alive.
/// bDeathOnly - IF set to TRUE this will set vehicles as no longer needed, when bDelete is FALSE. Use for mission cleanup.
PROC CLEANUP_VEHICLE_GROUP(VEH_STRUCT &vsArray[], BOOL bDelete = FALSE, BOOL bDeathOnly = TRUE)
INT i = 0
FOR i = 0 TO ( COUNT_OF(vsArray) - 1 )
CLEANUP_VEHICLE(vsArray[i], bDelete, bDeathOnly)
ENDFOR
ENDPROC
PROC CLEANUP_PED(PED_STRUCT &ped, BOOL bDelete = FALSE, BOOL bDeathOnly = TRUE, BOOL bKeepTask = TRUE)
IF ( bDelete = FALSE )
IF DOES_ENTITY_EXIST(ped.PedIndex)
IF ( bDeathOnly = TRUE )
IF IS_PED_INJURED(ped.PedIndex)
ped.eCleanupReason = GET_PED_CLEANUP_REASON(ped.PedIndex #IF IS_DEBUG_BUILD, ped.sDebugName #ENDIF)
IF IS_ENTITY_DEAD(ped.PedIndex)
REMOVE_PED_DEFENSIVE_AREA(ped.PedIndex)
ENDIF
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
IF IS_ITEMSET_VALID(ped.ItemsetIndex)
DESTROY_ITEMSET(ped.ItemsetIndex)
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting ped ", ped.sDebugName, " as no longer due to ped death.")
#ENDIF
ENDIF
ELIF ( bDeathOnly = FALSE )
IF NOT IS_PED_INJURED(ped.PedIndex)
IF IS_PED_GROUP_MEMBER(ped.PedIndex, PLAYER_GROUP_ID())
REMOVE_PED_FROM_GROUP(ped.PedIndex)
ENDIF
SET_PED_KEEP_TASK(ped.PedIndex, bKeepTask)
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
IF IS_ITEMSET_VALID(ped.ItemsetIndex)
DESTROY_ITEMSET(ped.ItemsetIndex)
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting ped ", ped.sDebugName, " as no longer needed.")
#ENDIF
ENDIF
ENDIF
ENDIF
ELIF ( bDelete = TRUE )
IF DOES_ENTITY_EXIST(ped.PedIndex)
IF NOT IS_PED_INJURED(ped.PedIndex)
IF IS_PED_GROUP_MEMBER(ped.PedIndex, PLAYER_GROUP_ID())
REMOVE_PED_FROM_GROUP(ped.PedIndex)
ENDIF
ENDIF
IF IS_ENTITY_DEAD(ped.PedIndex)
OR NOT IS_ENTITY_DEAD(ped.PedIndex)
REMOVE_PED_DEFENSIVE_AREA(ped.PedIndex)
ENDIF
DELETE_PED(ped.PedIndex)
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
IF IS_ITEMSET_VALID(ped.ItemsetIndex)
DESTROY_ITEMSET(ped.ItemsetIndex)
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Deleting ped ", ped.sDebugName, ".")
#ENDIF
ENDIF
ped.iTimer = 0
ped.iProgress = 0
ped.fDistanceToTargetPed = 0
ped.bHasTask = FALSE
ped.bCleanupConversationTriggered = FALSE
ped.bVehicleReached = FALSE
ped.eCleanupReason = PED_CLEANUP_NO_CLEANUP
ped.ePedVehicle = MAX_SPEEDOPHILES
ped.eState = PED_STATE_IDLE
ENDIF
ENDPROC
PROC CLEANUP_PED_GROUP(PED_STRUCT &array[], BOOL bDelete = FALSE, BOOL bDeathOnly = TRUE, BOOL bKeepTask = TRUE)
INT i = 0
FOR i = 0 TO ( COUNT_OF(array) - 1 )
CLEANUP_PED(array[i], bDelete, bDeathOnly, bKeepTask)
ENDFOR
ENDPROC
PROC INITIALISE_SPAWNPOINTS(SPAWNPOINT_STRUCT &array[], INT iCurrentWave)
IF iCurrentWave = 4
array[0].vPosition = <<12.8661, -1836.1624, 23.6954>>
array[0].fHeading = 64.4611
array[0].sDefensiveArea.vPosition = <<21.6126, -1844.2938, 23.6066>>
array[0].sDefensiveArea.fWidth = 15.0
array[0].sDefensiveArea.bSphere = TRUE
array[0].iIntervalTime = 8000
array[1].vPosition = <<-16.6636, -1859.8578, 23.7950>>
array[1].fHeading = 47.6587
array[1].sDefensiveArea.vPosition = <<-16.6636, -1859.8578, 23.7950>>
array[1].sDefensiveArea.fWidth = 15.0
array[1].sDefensiveArea.bSphere = TRUE
array[1].iIntervalTime = 12000
ELSE
array[0].vPosition = << 27.3783, -1816.6031, 24.1608 >>
array[0].fHeading = 64.4611
array[0].sDefensiveArea.vPosition = <<1.3957, -1837.1431, 23.7967>>
array[0].sDefensiveArea.fWidth = 4.0
array[0].sDefensiveArea.bSphere = TRUE
array[0].iIntervalTime = 8000
array[1].vPosition = << 2.2555, -1808.7224, 24.3374 >>
array[1].fHeading = 47.6587
array[1].sDefensiveArea.vPosition = << -17.9626, -1821.1476, 24.8344 >>
array[1].sDefensiveArea.fWidth = 1.0
array[1].sDefensiveArea.bSphere = TRUE
array[1].iIntervalTime = 12000
ENDIF
//create coverpoints
INT i = 0
FOR i = 0 TO ( COUNT_OF(array) - 1 )
array[i].bActive = TRUE
array[i].bTaken = FALSE
array[i].bHasTask = FALSE
array[i].iKillCount = 0
ENDFOR
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Initialised enemy spawnpoints.")
#ENDIF
ENDPROC
PROC CLEANUP_SPAWNPOINTS(SPAWNPOINT_STRUCT &array[], BOOL bDelete = FALSE)
INT i
FOR i = 0 TO ( COUNT_OF(array) - 1 )
CLEANUP_ENEMY_PED(array[i].sEnemy, bDelete, FALSE, FALSE)
array[i].bActive = FALSE
ENDFOR
ENDPROC
/// PURPOSE:
/// Creates scripted coverpoints for peds to use in the shootout
/// PARAMS:
/// sArray - Array of coverpoint_struct instances, where all coverpoint details are stored.
PROC CREATE_COVERPOINTS(COVERPOINT_STRUCT &sArray[])
//Lamar's shootout path positions
LamarShootoutPositions[0] = << 86.69, -1945.90, 19.75 >>
LamarShootoutPositions[1] = << 92.33, -1931.13, 19.80 >> //<< 91.12, -1933.29, 19.76 >>
LamarShootoutPositions[2] = << 91.67, -1926.59, 19.77 >>
LamarShootoutPositions[3] = << 85.91, -1913.31, 19.89 >>
LamarShootoutPositions[4] = << 68.19, -1894.92, 20.66 >>
LamarShootoutPositions[5] = << 46.99, -1878.41, 21.23 >>
LamarShootoutPositions[6] = << 37.10, -1873.07, 21.66 >>
LamarShootoutPositions[7] = << 39.30, -1870.39, 21.71 >>
LamarShootoutPositions[8] = << 30.68, -1864.43, 22.12 >>
LamarShootoutPositions[9] = << 21.19, -1856.01, 22.65 >>
LamarShootoutPositions[10] = << 9.48, -1846.80, 23.27 >>
LamarShootoutPositions[11] = << -22.67, -1846.52, 24.27 >>
LamarShootoutPositions[12] = << -31.95, -1857.39, 24.72 >>
//cover points
//Franklin's shootout start coverpoint
sArray[0].vPosition = <<82.7797, -1949.6857, 19.79 >>//<< 82.898, -1949.781, 19.79 >>
sArray[0].fHeading = 49.6199//62.5883
sArray[0].CoverpointUsage = COVUSE_WALLTOBOTH
sArray[0].CoverpointHeight = COVHEIGHT_LOW
sArray[0].CoverpointArc = COVARC_180
sArray[0].bActive = TRUE
sArray[0].bStationary = FALSE
//Lamar's shootout start coverpoint
sArray[1].vPosition = << 83.7215, -1948.4117, 19.6708 >>
sArray[1].fHeading = 49.6199
sArray[1].CoverpointUsage = COVUSE_WALLTOBOTH
sArray[1].CoverpointHeight = COVHEIGHT_LOW
sArray[1].CoverpointArc = COVARC_180
sArray[1].bActive = TRUE
sArray[1].bStationary = FALSE
//Trevor's shootout start coverpoint
sArray[2].vPosition = << 85.02, -1946.93, 19.78 >>
sArray[2].fHeading = 49.6199//53.5876
sArray[2].CoverpointUsage = COVUSE_WALLTOBOTH
sArray[2].CoverpointHeight = COVHEIGHT_LOW
sArray[2].CoverpointArc = COVARC_180
sArray[2].bActive = TRUE
sArray[2].bStationary = FALSE
sArray[3].vPosition = << 72.4060, -1927.5352, 19.9848 >>
sArray[3].fHeading = 45.0
sArray[3].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[3].CoverpointHeight = COVHEIGHT_LOW
sArray[3].CoverpointArc = COVARC_120
sArray[3].bActive = TRUE
sArray[3].bStationary = FALSE
sArray[4].vPosition = << 53.0566, -1912.4000, 20.6508 >>
sArray[4].fHeading = 55.6465
sArray[4].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[4].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[4].CoverpointArc = COVARC_120
sArray[4].bActive = TRUE
sArray[4].bStationary = FALSE
sArray[5].vPosition = << 31.2626, -1894.4664, 21.2817 >>
sArray[5].fHeading = 57.1599
sArray[5].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[5].CoverpointHeight = COVHEIGHT_HIGH
sArray[5].CoverpointArc = COVARC_120
sArray[5].bActive = TRUE
sArray[5].bStationary = FALSE
sArray[6].vPosition = << 7.9293, -1875.0332, 22.6954 >>
sArray[6].fHeading = 55.7332
sArray[6].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[6].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[6].CoverpointArc = COVARC_120
sArray[6].bActive = TRUE
sArray[6].bStationary = FALSE
sArray[7].vPosition = << -22.6238, -1849.2922, 24.1939 >>
sArray[7].fHeading = 51.7058
sArray[7].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[7].CoverpointHeight = COVHEIGHT_LOW
sArray[7].CoverpointArc = COVARC_180
sArray[7].bActive = TRUE
sArray[7].bStationary = FALSE
sArray[8].vPosition = << 4.0673, -1872.0771, 22.7360 >>
sArray[8].fHeading = 53.2814
sArray[8].CoverpointUsage = COVUSE_WALLTONEITHER
sArray[8].CoverpointHeight = COVHEIGHT_LOW
sArray[8].CoverpointArc = COVARC_180
sArray[8].bActive = TRUE
sArray[8].bStationary = FALSE
sArray[9].vPosition = << -5.9057, -1858.8632, 23.4581 >>
sArray[9].fHeading = 48.0057
sArray[9].CoverpointUsage = COVUSE_WALLTONEITHER
sArray[9].CoverpointHeight = COVHEIGHT_HIGH
sArray[9].CoverpointArc = COVARC_180
sArray[9].bActive = TRUE
sArray[9].bStationary = TRUE
sArray[10].vPosition = << 36.8745, -1900.4598, 21.0387 >>
sArray[10].fHeading = 53.6668
sArray[10].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[10].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[10].CoverpointArc = COVARC_120
sArray[10].bActive = TRUE
sArray[10].bStationary = FALSE
sArray[11].vPosition = << 63.0260, -1919.9938, 20.5881 >>
sArray[11].fHeading = 49.4401
sArray[11].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[11].CoverpointHeight = COVHEIGHT_LOW
sArray[11].CoverpointArc = COVARC_120
sArray[11].bActive = TRUE
sArray[11].bStationary = FALSE
sArray[12].vPosition = << 57.8073, -1909.1831, 20.4670 >>
sArray[12].fHeading = 88.5275
sArray[12].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[12].CoverpointHeight = COVHEIGHT_LOW
sArray[12].CoverpointArc = COVARC_120
sArray[12].bActive = TRUE
sArray[12].bStationary = TRUE
//stationary positions
sArray[13].vPosition = << 58.0236, -1901.5468, 20.6670 >>
sArray[13].fHeading = 64.9632
sArray[13].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[13].CoverpointHeight = COVHEIGHT_LOW
sArray[13].CoverpointArc = COVARC_120
sArray[13].bActive = TRUE
sArray[13].bStationary = TRUE
sArray[14].vPosition = << 60.5177, -1913.5453, 20.6350 >>
sArray[14].fHeading = 44.8179
sArray[14].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[14].CoverpointHeight = COVHEIGHT_LOW
sArray[14].CoverpointArc = COVARC_120
sArray[14].bActive = TRUE
sArray[14].bStationary = TRUE
sArray[15].vPosition = << 85.9292, -1932.2690, 19.5994 >>
sArray[15].fHeading = 3.0663
sArray[15].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[15].CoverpointHeight = COVHEIGHT_LOW
sArray[15].CoverpointArc = COVARC_120
sArray[15].bActive = TRUE
sArray[15].bStationary = TRUE
sArray[16].vPosition = << 67.4052, -1922.5353, 20.3300 >>
sArray[16].fHeading = 41.2396
sArray[16].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[16].CoverpointHeight = COVHEIGHT_LOW
sArray[16].CoverpointArc = COVARC_120
sArray[16].bActive = TRUE
sArray[16].bStationary = TRUE
sArray[17].vPosition = << 66.5032, -1908.5879, 20.6566 >>
sArray[17].fHeading = 24.7455
sArray[17].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[17].CoverpointHeight = COVHEIGHT_LOW
sArray[17].CoverpointArc = COVARC_120
sArray[17].bActive = TRUE
sArray[17].bStationary = TRUE
sArray[18].vPosition = << 43.5720, -1904.9318, 20.7482 >>//<< 43.4798, -1904.7393, 20.7661 >> //causes assert because coverpoint is blocked by geometry
sArray[18].fHeading = 21.7481
sArray[18].CoverpointUsage = COVUSE_WALLTONEITHER
sArray[18].CoverpointHeight = COVHEIGHT_LOW
sArray[18].CoverpointArc = COVARC_120
sArray[18].bActive = TRUE
sArray[18].bStationary = FALSE
sArray[19].vPosition = <<44.3755, -1898.6537, 20.7424>>
sArray[19].fHeading = 78.5593
sArray[19].CoverpointUsage = COVUSE_WALLTONEITHER
sArray[19].CoverpointHeight = COVHEIGHT_LOW
sArray[19].CoverpointArc = COVARC_90
sArray[19].bActive = TRUE
sArray[19].bStationary = FALSE
sArray[20].vPosition = <<29.9750, -1887.2792, 21.5489>>
sArray[20].fHeading = 44.9622
sArray[20].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[20].CoverpointHeight = COVHEIGHT_LOW
sArray[20].CoverpointArc = COVARC_120
sArray[20].bActive = TRUE
sArray[20].bStationary = TRUE
sArray[21].vPosition = << 28.7632, -1881.1276, 21.6479 >>
sArray[21].fHeading = 44.4764
sArray[21].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[21].CoverpointHeight = COVHEIGHT_LOW
sArray[21].CoverpointArc = COVARC_120
sArray[21].bActive = TRUE
sArray[21].bStationary = TRUE
sArray[22].vPosition = << 15.4082, -1878.6786, 22.1955 >>
sArray[22].fHeading = 26.2613
sArray[22].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[22].CoverpointHeight = COVHEIGHT_LOW
sArray[22].CoverpointArc = COVARC_120
sArray[22].bActive = TRUE
sArray[22].bStationary = TRUE
sArray[23].vPosition = << 18.7292, -1869.3192, 22.3698 >>
sArray[23].fHeading = 30.3013
sArray[23].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[23].CoverpointHeight = COVHEIGHT_LOW
sArray[23].CoverpointArc = COVARC_120
sArray[23].bActive = TRUE
sArray[23].bStationary = TRUE
sArray[24].vPosition = << 5.0254, -1867.1619, 22.7755 >>
sArray[24].fHeading = 47.2275
sArray[24].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[24].CoverpointHeight = COVHEIGHT_LOW
sArray[24].CoverpointArc = COVARC_120
sArray[24].bActive = TRUE
sArray[24].bStationary = TRUE
sArray[25].vPosition = << 4.9790, -1853.9192, 23.2154 >>
sArray[25].fHeading = 40.7702
sArray[25].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[25].CoverpointHeight = COVHEIGHT_LOW
sArray[25].CoverpointArc = COVARC_120
sArray[25].bActive = TRUE
sArray[25].bStationary = TRUE
//at the very end of shootout near the escape house
sArray[26].vPosition = << -26.0429, -1846.3679, 24.4320 >>
sArray[26].fHeading = 53.8431
sArray[26].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[26].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[26].CoverpointArc = COVARC_120
sArray[26].bActive = TRUE
sArray[26].bStationary = FALSE
//coverpoints for enemies or Lamar, bActive = FALSE for player peds
sArray[27].vPosition = << 84.0040, -1906.8210, 20.2583 >>
sArray[27].fHeading = 226.8502
sArray[27].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[27].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[27].CoverpointArc = COVARC_180
sArray[27].bActive = FALSE
sArray[27].bStationary = FALSE
sArray[28].vPosition = << 46.0988, -1875.1759, 21.4052 >>
sArray[28].fHeading = 48.7171
sArray[28].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[28].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[28].CoverpointArc = COVARC_180
sArray[28].bActive = FALSE
sArray[28].bStationary = FALSE
sArray[29].vPosition = << 41.3668, -1867.1228, 21.8246 >> //<< 41.1951, -1866.8962, 21.9586 >>
sArray[29].fHeading = 76.3672
sArray[29].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[29].CoverpointHeight = COVHEIGHT_LOW
sArray[29].CoverpointArc = COVARC_180
sArray[29].bActive = FALSE
sArray[29].bStationary = FALSE
sArray[30].vPosition = <<30.4106, -1861.7249, 22.2593>> //<< 30.1875, -1861.4191, 22.2291 >> //<< 30.0710, -1861.5137, 22.2467 >>
sArray[30].fHeading = 42.8982
sArray[30].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[30].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[30].CoverpointArc = COVARC_180
sArray[30].bActive = FALSE
sArray[30].bStationary = FALSE
sArray[31].vPosition = << -4.2944, -1839.1528, 23.8936 >>
sArray[31].fHeading = 46.5391
sArray[31].CoverpointUsage = COVUSE_WALLTONEITHER
sArray[31].CoverpointHeight = COVHEIGHT_HIGH
sArray[31].CoverpointArc = COVARC_180
sArray[31].bActive = FALSE
sArray[31].bStationary = FALSE
sArray[32].vPosition = << 60.0972, -1886.5510, 20.6859 >>
sArray[32].fHeading = 54.8452
sArray[32].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[32].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[32].CoverpointArc = COVARC_180
sArray[32].bActive = FALSE
sArray[32].bStationary = FALSE
sArray[33].vPosition = << 83.9598, -1907.9832, 20.1624 >>
sArray[33].fHeading = 222.3723
sArray[33].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[33].CoverpointHeight = COVHEIGHT_LOW
sArray[33].CoverpointArc = COVARC_180
sArray[33].bActive = FALSE
sArray[33].bStationary = FALSE
sArray[34].vPosition = << 20.4283, -1853.3781, 22.7687 >>
sArray[34].fHeading = 23.7767
sArray[34].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[34].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[34].CoverpointArc = COVARC_180
sArray[34].bActive = FALSE
sArray[34].bStationary = FALSE
sArray[35].vPosition = << 85.7919, -1909.5291, 20.0351 >>
sArray[35].fHeading = 23.7767
sArray[35].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[35].CoverpointHeight = COVHEIGHT_LOW
sArray[35].CoverpointArc = COVARC_180
sArray[35].bActive = FALSE
sArray[35].bStationary = FALSE
sArray[36].vPosition = <<55.8396, -1889.8090, 20.6355>>
sArray[36].fHeading = 231.9477
sArray[36].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[36].CoverpointHeight = COVHEIGHT_LOW
sArray[36].CoverpointArc = COVARC_180
sArray[36].bActive = FALSE
sArray[36].bStationary = FALSE
sArray[37].vPosition = << 53.5040, -1881.0540, 21.0802 >>
sArray[37].fHeading = 230.8292
sArray[37].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[37].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[37].CoverpointArc = COVARC_180
sArray[37].bActive = FALSE
sArray[37].bStationary = FALSE
sArray[38].vPosition = << 30.4574, -1894.1149, 21.3552 >>
sArray[38].fHeading = 227.7727
sArray[38].CoverpointUsage = COVUSE_WALLTOBOTH
sArray[38].CoverpointHeight = COVHEIGHT_LOW
sArray[38].CoverpointArc = COVARC_180
sArray[38].bActive = FALSE
sArray[38].bStationary = FALSE
sArray[39].vPosition = << 0.1045, -1825.9236, 24.3300 >>
sArray[39].fHeading = 129.9000
sArray[39].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[39].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[39].CoverpointArc = COVARC_300TO0
sArray[39].bActive = FALSE
sArray[39].bStationary = FALSE
sArray[40].vPosition = << -19.5798, -1851.4104, 24.0494 >>
sArray[40].fHeading = 237.4822
sArray[40].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[40].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[40].CoverpointArc = COVARC_180
sArray[40].bActive = FALSE
sArray[40].bStationary = FALSE
sArray[41].vPosition = <<95.2370, -1950.6820, 19.7926>>
sArray[41].fHeading = 148.0664
sArray[41].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[41].CoverpointHeight = COVHEIGHT_LOW
sArray[41].CoverpointArc = COVARC_180
sArray[41].bActive = FALSE
sArray[41].bStationary = FALSE
sArray[42].vPosition = << 61.1097, -1918.4448, 20.6104 >>
sArray[42].fHeading = 245.9129
sArray[42].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[42].CoverpointHeight = COVHEIGHT_LOW
sArray[42].CoverpointArc = COVARC_180
sArray[42].bActive = FALSE
sArray[42].bStationary = FALSE
sArray[43].vPosition = << 79.0345, -1900.6619, 20.7645 >>
sArray[43].fHeading = 234.2608
sArray[43].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[43].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[43].CoverpointArc = COVARC_180
sArray[43].bActive = FALSE
sArray[43].bStationary = FALSE
sArray[44].vPosition = << 52.2746, -1911.7401, 20.6309 >>
sArray[44].fHeading = 238.6767
sArray[44].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[44].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[44].CoverpointArc = COVARC_180
sArray[44].bActive = FALSE
sArray[44].bStationary = FALSE
sArray[45].vPosition = << 74.7971, -1896.5819, 20.7474 >>
sArray[45].fHeading = 221.3824
sArray[45].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[45].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[45].CoverpointArc = COVARC_180
sArray[45].bActive = FALSE
sArray[45].bStationary = FALSE
sArray[46].vPosition = << 77.6239, -1945.4353, 19.8055 >>
sArray[46].fHeading = 236.8190
sArray[46].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[46].CoverpointHeight = COVHEIGHT_LOW
sArray[46].CoverpointArc = COVARC_180
sArray[46].bActive = FALSE
sArray[46].bStationary = FALSE
sArray[47].vPosition = << 87.0147, -1919.0001, 19.6727 >>
sArray[47].fHeading = 241.6554
sArray[47].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[47].CoverpointHeight = COVHEIGHT_LOW
sArray[47].CoverpointArc = COVARC_180
sArray[47].bActive = FALSE
sArray[47].bStationary = FALSE
sArray[48].vPosition = << 45.4957, -1874.5175, 21.4749 >>
sArray[48].fHeading = 226.5895
sArray[48].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[48].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[48].CoverpointArc = COVARC_180
sArray[48].bActive = FALSE
sArray[48].bStationary = FALSE
sArray[49].vPosition = << 41.1759, -1878.1239, 21.4395 >> //GROUP7 guy uses this
sArray[49].fHeading = 240.7377
sArray[49].CoverpointUsage = COVUSE_WALLTONEITHER
sArray[49].CoverpointHeight = COVHEIGHT_LOW
sArray[49].CoverpointArc = COVARC_180
sArray[49].bActive = FALSE
sArray[49].bStationary = FALSE
sArray[50].vPosition = << 38.9290, -1891.4150, 20.9758 >> //group8 guy uses this
sArray[50].fHeading = 241.1702
sArray[50].CoverpointUsage = COVUSE_WALLTONEITHER
sArray[50].CoverpointHeight = COVHEIGHT_LOW
sArray[50].CoverpointArc = COVARC_180
sArray[50].bActive = FALSE
sArray[50].bStationary = FALSE
sArray[51].vPosition = << 20.6281, -1885.5229, 21.9471 >>
sArray[51].fHeading = 236.1646
sArray[51].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[51].CoverpointHeight = COVHEIGHT_LOW
sArray[51].CoverpointArc = COVARC_180
sArray[51].bActive = FALSE
sArray[51].bStationary = FALSE
sArray[52].vPosition = << 7.1729, -1874.4525, 22.5758 >>
sArray[52].fHeading = 225.0603
sArray[52].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[52].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[52].CoverpointArc = COVARC_180
sArray[52].bActive = FALSE
sArray[52].bStationary = FALSE
sArray[53].vPosition = << 37.7745, -1866.7610, 21.9016 >>
sArray[53].fHeading = 242.3961
sArray[53].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[53].CoverpointHeight = COVHEIGHT_LOW
sArray[53].CoverpointArc = COVARC_180
sArray[53].bActive = FALSE
sArray[53].bStationary = FALSE
sArray[54].vPosition = << 21.4830, -1859.0441, 22.5513 >>
sArray[54].fHeading = 202.8038
sArray[54].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[54].CoverpointHeight = COVHEIGHT_LOW
sArray[54].CoverpointArc = COVARC_180
sArray[54].bActive = FALSE
sArray[54].bStationary = FALSE
sArray[55].vPosition = << 12.1190, -1846.3782, 23.2628 >>
sArray[55].fHeading = 235.3726
sArray[55].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[55].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[55].CoverpointArc = COVARC_180
sArray[55].bActive = FALSE
sArray[55].bStationary = FALSE
sArray[56].vPosition = << -6.8817, -1837.0306, 24.0336 >>
sArray[56].fHeading = 227.5375
sArray[56].CoverpointUsage = COVUSE_WALLTONEITHER
sArray[56].CoverpointHeight = COVHEIGHT_LOW
sArray[56].CoverpointArc = COVARC_180
sArray[56].bActive = FALSE
sArray[56].bStationary = FALSE
sArray[57].vPosition = << 1.4230, -1837.1008, 23.8195 >>
sArray[57].fHeading = 141.9094
sArray[57].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[57].CoverpointHeight = COVHEIGHT_LOW
sArray[57].CoverpointArc = COVARC_180
sArray[57].bActive = FALSE
sArray[57].bStationary = FALSE
sArray[58].vPosition = <<75.6596, -1897.3557, 20.7856>> //<< 76.1384, -1896.6304, 20.8449 >>
sArray[58].fHeading = 43.5654
sArray[58].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[58].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[58].CoverpointArc = COVARC_90//COVARC_180
sArray[58].bActive = FALSE
sArray[58].bStationary = FALSE
sArray[58].bPlayerPriority = TRUE
sArray[59].vPosition = << 8.4098, -1843.5679, 23.3954 >>
sArray[59].fHeading = 45.1052
sArray[59].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[59].CoverpointHeight = COVHEIGHT_LOW
sArray[59].CoverpointArc = COVARC_180
sArray[59].bActive = FALSE
sArray[59].bStationary = FALSE
sArray[60].vPosition = << 77.1253, -1931.6445, 19.8003 >>
sArray[60].fHeading = 52.0250
sArray[60].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[60].CoverpointHeight = COVHEIGHT_LOW
sArray[60].CoverpointArc = COVARC_180
sArray[60].bActive = TRUE
sArray[60].bStationary = FALSE
sArray[61].vPosition = << 14.8813, -1880.9801, 22.2229 >>
sArray[61].fHeading = 48.6704
sArray[61].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[61].CoverpointHeight = COVHEIGHT_LOW
sArray[61].CoverpointArc = COVARC_180
sArray[61].bActive = TRUE
sArray[61].bStationary = FALSE
sArray[62].vPosition = << 52.07, -1919.99, 20.57 >>
sArray[62].fHeading = 231.1549
sArray[62].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[62].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[62].CoverpointArc = COVARC_90
sArray[62].bActive = TRUE
sArray[62].bStationary = FALSE
//create coverpoints
INT i = 0
FOR i = 0 TO ( COUNT_OF(sArray) - 1 )
IF ( sArray[i].bStationary = FALSE )
sArray[i].CoverpointIndex = ADD_COVER_POINT(sArray[i].vPosition, sArray[i].fHeading, sArray[i].CoverpointUsage,
sArray[i].CoverpointHeight, sArray[i].CoverpointArc, sArray[i].bPlayerPriority)
ENDIF
//save the distance from start of the street corrdinates
sArray[i].fDistance = VDIST2(vGroveStreetStart, sArray[i].vPosition)
ENDFOR
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted coverpoints.")
#ENDIF
ENDPROC
PROC REMOVE_COVERPOINTS(COVERPOINT_STRUCT &sArray[], BOOL &bCoverpointsCreatedFlag)
INT i = 0
FOR i = 0 TO ( COUNT_OF(sArray) - 1 )
REMOVE_COVER_POINT(sArray[i].CoverpointIndex)
ENDFOR
bCoverpointsCreatedFlag = FALSE
REMOVE_COVER_POINT(EndCoverPointIndex)
bEndCoverPointCreated = FALSE
ENDPROC
PROC UPDATE_COVERPOINTS_ACTIVE_STATE_FOR_PEDS(FLOAT fPed1Distance, FLOAT fPed2Distance, COVERPOINT_STRUCT &csArray[], FLOAT fRadius = 50.0)
INT i = 0
FOR i = 0 TO ( COUNT_OF(csArray) - 1 )
IF ( csArray[i].bActive = TRUE )
IF ( csArray[i].fDistance - fPed1Distance - fRadius < 0 )
OR ( csArray[i].fDistance - fPed2Distance - fRadius < 0 )
csArray[i].bActive = FALSE
ENDIF
ENDIF
ENDFOR
ENDPROC
FUNC BOOL IS_PLAYER_IN_SHOOTOUT_AREA()
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<49.515247,-1892.616577,14.793283>>, <<115.109360,-1961.272461,28.311836>>, 84.0)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<53.815639,-1893.396484,14.593086>>, <<-42.446770,-1812.097900,33.587776>>, 82.0)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_FRIENDLY_PED_IN_ANY_SPEEDOPHILE(PED_INDEX friendlyPed)
IF NOT DOES_ENTITY_EXIST(friendlyPed)
RETURN FALSE
ENDIF
INT iter
REPEAT COUNT_OF(vsSpeedophiles) iter
IF IS_PED_SITTING_IN_THIS_VEHICLE(friendlyPed, vsSpeedophiles[iter].VehicleIndex)
RETURN TRUE
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Checks for various mission fail conditions. Redirects mission flow to MISSION_STAGE_FAILED when one of fail conditions is true.
/// PARAMS:
/// eStage - Mission stage variable.
/// eFail - Mission fail reason.
PROC RUN_FAIL_CHECKS(MISSION_STAGES &eStage, MISSION_FAILS &eFail)
IF eStage <> MISSION_STAGE_PASSED
AND eStage <> MISSION_STAGE_FAILED
IF NOT IS_CUTSCENE_PLAYING()
IF DOES_ENTITY_EXIST(vsVan.VehicleIndex)
IF ( FailFlags[MISSION_FAIL_CAR_UNDRIVABLE] = TRUE )
IF IS_VEHICLE_PERMANENTLY_STUCK(vsVan.VehicleIndex)
eFail = MISSION_FAIL_CAR_UNDRIVABLE
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_CAR_DEAD] = TRUE )
IF NOT IS_VEHICLE_DRIVEABLE(vsVan.VehicleIndex, TRUE)
OR IS_ENTITY_ON_FIRE(vsVan.VehicleIndex)
OR ( HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vsVan.VehicleIndex, PLAYER_PED_ID()) AND HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(vsVan.VehicleIndex, WEAPONTYPE_MOLOTOV) )
eFail = MISSION_FAIL_CAR_DEAD
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsSpeedophiles[0].VehicleIndex)
AND DOES_ENTITY_EXIST(vsSpeedophiles[1].VehicleIndex)
AND DOES_ENTITY_EXIST(vsSpeedophiles[2].VehicleIndex)
IF ( FailFlags[MISSION_FAIL_SPEEDOPHILE_DEAD] = TRUE )
IF NOT IS_VEHICLE_DRIVEABLE(vsSpeedophiles[0].VehicleIndex)
OR NOT IS_VEHICLE_DRIVEABLE(vsSpeedophiles[1].VehicleIndex)
OR NOT IS_VEHICLE_DRIVEABLE(vsSpeedophiles[2].VehicleIndex)
eFail = MISSION_FAIL_SPEEDOPHILE_DEAD
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_SPEEDOPHILE_UNDRIVABLE] = TRUE )
IF IS_SPEEDOPHILE_STUCK(vsSpeedophiles[0].VehicleIndex)
OR IS_SPEEDOPHILE_STUCK(vsSpeedophiles[1].VehicleIndex)
OR IS_SPEEDOPHILE_STUCK(vsSpeedophiles[2].VehicleIndex)
eFail = MISSION_FAIL_SPEEDOPHILE_UNDRIVABLE
eStage = MISSION_STAGE_FAILED
ENDIF
IF eStage = MISSION_STAGE_GROVE_STREET_SHOOTOUT
OR eStage = MISSION_STAGE_RUN_TO_SPEEDOPHILES
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[0].VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vsSpeedophiles[1].VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vsSpeedophiles[2].VehicleIndex)
IF IS_ENTITY_UPSIDEDOWN(vsSpeedophiles[0].VehicleIndex)
OR IS_ENTITY_UPSIDEDOWN(vsSpeedophiles[1].VehicleIndex)
OR IS_ENTITY_UPSIDEDOWN(vsSpeedophiles[2].VehicleIndex)
eFail = MISSION_FAIL_SPEEDOPHILE_UNDRIVABLE
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psLamar.PedIndex)
IF ( FailFlags[MISSION_FAIL_LAMAR_DEAD] = TRUE )
IF IS_PED_INJURED(psLamar.PedIndex)
OR IS_ENTITY_DEAD(psLamar.PedIndex)
eFail = MISSION_FAIL_LAMAR_DEAD
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_BUDDIES_LOST] = TRUE)
OR ( FailFlags[MISSION_FAIL_BUDDIES_LEFT_BEHIND] = TRUE )
IF NOT IS_PED_INJURED(psLamar.PedIndex)
SWITCH eStage
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT
CASE MISSION_STAGE_RUN_TO_SPEEDOPHILES
IF ( psLamar.bFleeing = FALSE)
OR ( psLamar.eState = PED_STATE_RUNNING_TO_ALLEY )
OR ( psLamar.eState = PED_STATE_WAITING_IN_ALLEY)
IF NOT IS_PLAYER_IN_SHOOTOUT_AREA()
eFail = MISSION_FAIL_BUDDIES_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
IF ( GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psLamar.PedIndex) > ABANDON_BUDDY_FAIL_RANGE )
eFail = MISSION_FAIL_BUDDIES_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ELSE
IF ( GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psLamar.PedIndex) > ABANDON_BUDDY_FAIL_RANGE )
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << 5.18,-1855.46, 22.19 >>, << -32.06, -1825.13, 33.10 >>, 40.0)
eFail = MISSION_FAIL_BUDDIES_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_SPEEDOPHILE_RIDE
IF ( GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psLamar.PedIndex) > 150 )
eFail = MISSION_FAIL_BUDDIES_LOST
eStage = MISSION_STAGE_FAILED
ENDIF
BREAK
DEFAULT
IF ( GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psLamar.PedIndex) > ABANDON_BUDDY_FAIL_RANGE )
eFail = MISSION_FAIL_BUDDIES_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_LAMAR_LEFT_BEHIND] = TRUE )
IF NOT IS_PED_INJURED(psLamar.PedIndex)
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psLamar.PedIndex) > ABANDON_BUDDY_FAIL_RANGE
eFail = MISSION_FAIL_LAMAR_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
IF ( FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE )
IF IS_PED_INJURED(psTrevor.PedIndex)
CPRINTLN(DEBUG_MISSION, "bsw trevor died, trevor's state: ", psTrevor.iProgress)
eFail = MISSION_FAIL_TREVOR_DEAD
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_TREVOR_LEFT_BEHIND] = TRUE )
IF NOT IS_PED_INJURED(psTrevor.PedIndex)
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psTrevor.PedIndex) > ABANDON_BUDDY_FAIL_RANGE
eFail = MISSION_FAIL_TREVOR_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psFranklin.PedIndex)
IF ( FailFlags[MISSION_FAIL_FRANKLIN_DEAD] = TRUE )
IF IS_PED_INJURED(psFranklin.PedIndex)
eFail = MISSION_FAIL_FRANKLIN_DEAD
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_FRANKLIN_LEFT_BEHIND] = TRUE )
IF NOT IS_PED_INJURED(psFranklin.PedIndex)
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psFranklin.PedIndex) > ABANDON_BUDDY_FAIL_RANGE
eFail = MISSION_FAIL_FRANKLIN_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psChop.PedIndex)
IF ( FailFlags[MISSION_FAIL_CHOP_DEAD] = TRUE )
IF IS_PED_INJURED(psChop.PedIndex)
eFail = MISSION_FAIL_CHOP_DEAD
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_CHOP_DROWNED] = TRUE )
IF IS_ENTITY_ATTACHED_TO_ENTITY(psChop.PedIndex, vsVan.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vsVan.VehicleIndex)
IF IS_ENTITY_IN_WATER(vsVan.VehicleIndex)
IF IS_PED_INJURED(psChop.PedIndex)
eFail = MISSION_FAIL_CHOP_DROWNED
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_DEAL_BLOWN] = TRUE )
IF IS_PED_SHOOTING_AT_AREA(PLAYER_PED_ID(), TRUE, << 89.17, -1952.71, 19.74 >>, 10.0)
OR IS_PED_SHOOTING_AT_AREA(PLAYER_PED_ID(), FALSE, << 89.17, -1952.71, 19.74 >>, 10.0)
OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, << 89.17, -1952.71, 19.74 >>, 10.0)
OR IS_PED_IN_COMBAT_WITH_ANY_PED_FROM_RELATIONSHIP_GROUP_IN_AREA(PLAYER_PED_ID(), RELGROUPHASH_AMBIENT_GANG_BALLAS, << 104.54, -1939.98, 19.80 >>, 50.0)
eFail = MISSION_FAIL_DEAL_BLOWN
eStage = MISSION_STAGE_FAILED
ENDIF
IF IS_ANY_VEHICLE_NEAR_POINT(<< 85.03947, -1958.29053, 20.12669 >>, 5.0)
eFail = MISSION_FAIL_DEAL_BLOWN
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Sets mission as failed and provides mission flow with reason to print on screen.
/// PARAMS:
/// eFailReason - One of MISSION_FAILS values.
PROC SET_MISSION_FAILED_WITH_REASON(MISSION_FAILS &eFailReason)
SWITCH eFailReason
CASE MISSION_FAIL_DEAL_BLOWN
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FRA1_DBLOW") //Deal blown
BREAK
CASE MISSION_FAIL_CAR_DEAD
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FRA1_VDEST") //Van is destroyed
BREAK
CASE MISSION_FAIL_CAR_UNDRIVABLE
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FRA1_VUND") //Van is undrivable
BREAK
CASE MISSION_FAIL_LAMAR_DEAD
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FRA1_LDIED") //Lamar died
BREAK
CASE MISSION_FAIL_LAMAR_LEFT_BEHIND
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FRA1_LLEFT") //Lamar left behind
BREAK
CASE MISSION_FAIL_TREVOR_DEAD
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_TDIED") //Trevor died
BREAK
CASE MISSION_FAIL_TREVOR_LEFT_BEHIND
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_TLEFT") //Trevor left behind
BREAK
CASE MISSION_FAIL_FRANKLIN_DEAD
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_FDIED") //Franklin died
BREAK
CASE MISSION_FAIL_FRANKLIN_LEFT_BEHIND
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_FLEFT") //Franklin left behind
BREAK
CASE MISSION_FAIL_CHOP_DEAD
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FRA1_CDIED") //Chop died
BREAK
CASE MISSION_FAIL_CHOP_DROWNED
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FRA1_CDROW") //Chop drowned
BREAK
CASE MISSION_FAIL_BUDDIES_LOST
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FRA1_FLB") //Buddies lost
BREAK
CASE CHAR_TREVOR
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FRA1_TLB")
BREAK
ENDSWITCH
BREAK
CASE MISSION_FAIL_BUDDIES_LEFT_BEHIND
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FRA1_FAB") //Buddies left behind
BREAK
CASE CHAR_TREVOR
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FRA1_TAB")
BREAK
ENDSWITCH
BREAK
CASE MISSION_FAIL_SPEEDOPHILE_DEAD
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FRA1_SDEST") //Speedophile destroyed
BREAK
CASE MISSION_FAIL_SPEEDOPHILE_UNDRIVABLE
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FRA1_SUND") //Speedophile undrivable
BREAK
CASE MISSION_FAIL_FORCE_FAIL
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FRA1_FAIL") //Debug forced fail
BREAK
ENDSWITCH
ENDPROC
PROC RESET_PED_PROPERTIES_AFTER_HOTSWAP(PED_INDEX PedIndex)
IF NOT IS_PED_INJURED(PedIndex)
CLEAR_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_MELEE)
CLEAR_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_BULLET_IMPACT)
CLEAR_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_IMPACT)
SET_PED_CONFIG_FLAG(PedIndex, PCF_ForcePedToFaceLeftInCover, FALSE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_ForcePedToFaceRightInCover, FALSE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_BlockPedFromTurningInCover, FALSE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_BLIND_FIRE_IN_COVER, TRUE)
SET_PED_DIES_IN_WATER(PedIndex, TRUE)
SET_PED_INFINITE_AMMO(PedIndex, FALSE)
SWITCH GET_ENTITY_MODEL(PedIndex)
CASE PLAYER_ONE
SET_PED_INFINITE_AMMO(PedIndex, FALSE, WEAPONTYPE_SMG)
BREAK
CASE PLAYER_TWO
SET_PED_INFINITE_AMMO(PedIndex, FALSE, WEAPONTYPE_PUMPSHOTGUN)
BREAK
ENDSWITCH
ENDIF
ENDPROC
PROC SET_PED_PROPERTIES_AFTER_HOTSWAP(PED_STRUCT &ped, PED_INDEX PedIndex, BOOL bCreateBlip, REL_GROUP_HASH relGroupHash)
IF NOT IS_PED_INJURED(PedIndex)
ped.PedIndex = PedIndex
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, TRUE)
SET_PED_CAN_BE_TARGETTED(PedIndex, FALSE)
SET_PED_AS_ENEMY(PedIndex, FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(PedIndex, relGroupHash)
SET_PED_DIES_IN_WATER(PedIndex, FALSE)
SET_PED_SUFFERS_CRITICAL_HITS(PedIndex, FALSE)
SET_PED_MAX_HEALTH_WITH_SCALE(PedIndex, MAX_BUDDY_PED_HEALTH)
SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_BULLET_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_IMPACT)
SET_PED_HIGHLY_PERCEPTIVE(PedIndex, TRUE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_DisableHurt, TRUE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_DisablePanicInVehicle, TRUE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_WillFlyThroughWindscreen, FALSE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_RunFromFiresAndExplosions, FALSE)
SET_COMBAT_FLOAT(PedIndex, CCF_TIME_TO_INVALIDATE_INJURED_TARGET, 1.0)
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_CAN_FIGHT_ARMED_PEDS_WHEN_NOT_ARMED, TRUE)
IF ( bCreateBlip = TRUE )
IF NOT DOES_BLIP_EXIST(ped.BlipIndex)
ped.BlipIndex = CREATE_BLIP_FOR_ENTITY(ped.PedIndex, FALSE)
ENDIF
ENDIF
//set the ped timer to current game timer when the hotswap happens
ped.iTimer = GET_GAME_TIMER()
ENDIF
ENDPROC
PROC SET_PED_WEAPON_AND_AMMO_AFTER_HOTSWAP(PED_INDEX PedIndex, WEAPON_TYPE eWeaponType, BOOL bForceInHand = TRUE, INT iClips = 1)
IF NOT IS_PED_INJURED(PedIndex)
IF NOT HAS_PED_GOT_WEAPON(PedIndex, eWeaponType)
GIVE_WEAPON_TO_PED(PedIndex, eWeaponType, 0)
ENDIF
SET_CURRENT_PED_WEAPON(PedIndex, eWeaponType, bForceInHand)
//IF ( GET_AMMO_IN_PED_WEAPON(PedIndex, eWeaponType) < GET_MAX_AMMO_IN_CLIP(PedIndex, eWeaponType) )
IF ( GET_AMMO_IN_PED_WEAPON(PedIndex, eWeaponType) < 2 )
ADD_AMMO_TO_PED(PedIndex, eWeaponType, GET_MAX_AMMO_IN_CLIP(PedIndex, eWeaponType) * iClips)
ENDIF
ENDIF
ENDPROC
PROC RUN_PED_WEAPON_AMMO_RESTORE_CHECK(PED_INDEX PedIndex, WEAPON_TYPE eWeaponType, INT iClips = 1)
IF NOT IS_PED_INJURED(PedIndex)
//IF ( GET_AMMO_IN_PED_WEAPON(PedIndex, eWeaponType) < GET_MAX_AMMO_IN_CLIP(PedIndex, eWeaponType) )
IF ( GET_AMMO_IN_PED_WEAPON(PedIndex, eWeaponType) < 2 )
ADD_AMMO_TO_PED(PedIndex, eWeaponType, GET_MAX_AMMO_IN_CLIP(PedIndex, eWeaponType) * iClips)
ENDIF
ENDIF
ENDPROC
PROC SET_PED_CURRENT_WEAPON(PED_INDEX PedIndex, WEAPON_SLOT eWeaponSlot, WEAPON_TYPE eWeaponType, BOOL bForceInHand, INT iClips = 6)
IF NOT IS_PED_INJURED(PedIndex)
WEAPON_TYPE eCurrentWeaponType
eCurrentWeaponType = GET_PED_WEAPONTYPE_IN_SLOT(PedIndex, eWeaponSlot)
IF ( eCurrentWeaponType = WEAPONTYPE_INVALID )
OR ( eCurrentWeaponType <> eWeaponType )
GIVE_WEAPON_TO_PED(PedIndex, eWeaponType, GET_MAX_AMMO_IN_CLIP(PedIndex, eWeaponType) * iClips, bForceInHand)
ELSE
SET_CURRENT_PED_WEAPON(PedIndex, eCurrentWeaponType, bForceInHand)
ENDIF
IF ( GET_AMMO_IN_PED_WEAPON(PedIndex, eWeaponType) < GET_MAX_AMMO_IN_CLIP(PedIndex, eWeaponType) )
ADD_AMMO_TO_PED(PedIndex, eWeaponType, GET_MAX_AMMO_IN_CLIP(PedIndex, eWeaponType) * iClips)
ENDIF
ENDIF
ENDPROC
PROC EQUIP_PED_BEST_WEAPON(PED_INDEX PedIndex, BOOL bForceIntoHand)
IF NOT IS_PED_INJURED(PedIndex)
WEAPON_TYPE eBestWeaponType = GET_BEST_PED_WEAPON(PedIndex, TRUE)
IF ( eBestWeaponType <> WEAPONTYPE_UNARMED )
SET_CURRENT_PED_WEAPON(PedIndex, eBestWeaponType, bForceIntoHand)
IF ( GET_AMMO_IN_PED_WEAPON(PedIndex, eBestWeaponType) < GET_MAX_AMMO_IN_CLIP(PedIndex, eBestWeaponType) )
ADD_AMMO_TO_PED(PedIndex, eBestWeaponType, GET_MAX_AMMO_IN_CLIP(PedIndex, eBestWeaponType) * 2)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SET_PED_COVER_PROPERTIES(PED_INDEX PedIndex, BOOL bCanUseCover, BOOL bForceFaceLeft = FALSE, BOOL bForceFaceRight = FALSE,
BOOL bBlockTurnInCover = FALSE, FLOAT fTimeBetweenPeeks = 10.0, BOOL bCanBlindFire = TRUE,
FLOAT fBlindFireChance = 0.05, FLOAT fTimeBetweenBursts = 1.25, FLOAT fBurstDuration = 4.0)
IF NOT IS_PED_INJURED(PedIndex)
SET_PED_COMBAT_ATTRIBUTES(pedIndex, CA_USE_COVER, bCanUseCover)
SET_PED_CONFIG_FLAG(PedIndex, PCF_ForcePedToFaceLeftInCover, bForceFaceLeft)
SET_PED_CONFIG_FLAG(PedIndex, PCF_ForcePedToFaceRightInCover, bForceFaceRight)
SET_PED_CONFIG_FLAG(PedIndex, PCF_BlockPedFromTurningInCover, bBlockTurnInCover)
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_BLIND_FIRE_IN_COVER, bCanBlindFire)
IF ( fTimeBetweenPeeks >= 0.0 )
SET_COMBAT_FLOAT(PedIndex, CCF_TIME_BETWEEN_PEEKS, fTimeBetweenPeeks)
ENDIF
IF ( fTimeBetweenBursts >= 0.0 )
SET_COMBAT_FLOAT(PedIndex, CCF_TIME_BETWEEN_BURSTS_IN_COVER, fTimeBetweenBursts)
ENDIF
IF ( fBurstDuration >= 0.0 )
SET_COMBAT_FLOAT(PedIndex, CCF_BURST_DURATION_IN_COVER, fBurstDuration)
ENDIF
IF ( fBlindFireChance >= 0.0 )
SET_COMBAT_FLOAT(PedIndex, CCF_BLIND_FIRE_CHANCE, fBlindFireChance)
ENDIF
ENDIF
ENDPROC
PROC SET_PED_PREFERRED_COVERPOINT(PED_INDEX PedIndex, ITEMSET_INDEX &ItemsetIndex, COVERPOINT_INDEX &CoverpointIndex)
IF NOT IS_PED_INJURED(PedIndex)
IF IS_ITEMSET_VALID(ItemsetIndex)
DESTROY_ITEMSET(ItemsetIndex)
ENDIF
IF NOT IS_ITEMSET_VALID(ItemsetIndex)
ItemsetIndex = CREATE_ITEMSET(TRUE)
ENDIF
ADD_TO_ITEMSET(CoverpointIndex, ItemsetIndex)
SET_PED_PREFERRED_COVER_SET(PedIndex, ItemsetIndex)
ENDIF
ENDPROC
PROC REMOVE_PED_PREFERRED_COVERPOINT(PED_INDEX PedIndex, ITEMSET_INDEX &ItemsetIndex)
IF NOT IS_PED_INJURED(PedIndex)
REMOVE_PED_PREFERRED_COVER_SET(PedIndex)
IF IS_ITEMSET_VALID(ItemsetIndex)
DESTROY_ITEMSET(ItemsetIndex)
ENDIF
ENDIF
ENDPROC
PROC SET_PED_MOVEMENT_PROPERTIES(PED_INDEX PedIndex, FLOAT fStrafeMovingChance, FLOAT fWalkStrafingChance)
IF NOT IS_PED_INJURED(PedIndex)
SET_COMBAT_FLOAT(PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, fStrafeMovingChance)
SET_COMBAT_FLOAT(PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, fWalkStrafingChance)
ENDIF
ENDPROC
//|======================= END MISCELLANEOUS PROCEDURES & FUNCTIONS ======================|
//|======================= DEBUG VARIABLES, PROCEDURES & FUNCTIONS =======================|
#IF IS_DEBUG_BUILD
//mission skip menu and widget variables
MissionStageMenuTextStruct SkipMenu[13]
INT iReturnStage = 0
BOOL bStageResetFlag
BOOL bDrawLamarsPath
BOOL bDrawObjectNames
BOOL bPrintDebugOutput
BOOL bPrintGameplayCameraInfo
BOOL bPositionGameplayCamera
FLOAT fGameplayCameraDesiredHeading
FLOAT fGameplayCameraDesiredPitch
BOOL bStartChasePlayback
BOOL bStopChasePlayback
BOOL bStartOnAccelerateToggle
BOOL bDrawDebugLinesAndSpheres
BOOL bDrawDebugStates
BOOL bDrawDebugCoverpoints
BOOL bDrawDebugVehicleDamageInfo
VECTOR vPropCameraPosition = << -104.15, -1887.18, 0.70 >>
VECTOR vPropCameraRotation = << 0.0, 0.0, 140.0 >>
//debug widgets variables
WIDGET_GROUP_ID Franklin1Widgets
FUNC STRING GET_MISSION_STAGE_NAME_FOR_DEBUG(MISSION_STAGES eStage)
SWITCH eStage
CASE MISSION_STAGE_CUTSCENE_INTRO
RETURN "MISSION_STAGE_CUTSCENE_INTRO"
BREAK
CASE MISSION_STAGE_DRIVE_TO_DEAL
RETURN "MISSION_STAGE_DRIVE_TO_DEAL"
BREAK
CASE MISSION_STAGE_CUTSCENE_DEAL
RETURN "MISSION_STAGE_CUTSCENE_DEAL"
BREAK
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT
RETURN "MISSION_STAGE_GROVE_STREET_SHOOTOUT"
BREAK
CASE MISSION_STAGE_RUN_TO_SPEEDOPHILES
RETURN "MISSION_STAGE_RUN_TO_SPEEDOPHILES"
BREAK
CASE MISSION_STAGE_SPEEDOPHILE_RIDE
RETURN "MISSION_STAGE_SPEEDOPHILE_RIDE"
BREAK
CASE MISSION_STAGE_LOSE_COPS
RETURN "MISSION_STAGE_LOSE_COPS"
BREAK
CASE MISSION_STAGE_CUTSCENE_DROPOFF_LAMAR
RETURN "MISSION_STAGE_CUTSCENE_DROPOFF_LAMAR"
BREAK
CASE MISSION_STAGE_CUTSCENE_DROPOFF_TREVOR
RETURN "MISSION_STAGE_CUTSCENE_DROPOFF_TREVOR"
BREAK
CASE MISSION_STAGE_CUTSCENE_DROPOFF_FRANKLIN
RETURN "MISSION_STAGE_CUTSCENE_DROPOFF_FRANKLIN"
BREAK
CASE MISSION_STAGE_END
RETURN "MISSION_STAGE_END"
BREAK
CASE MISSION_STAGE_DEBUG_PLAYBACK_CHASE
RETURN "MISSION_STAGE_DEBUG_PLAYBACK_CHASE"
BREAK
CASE MISSION_STAGE_DEBUG_RECORD_CHASE
RETURN "MISSION_STAGE_DEBUG_RECORD_CHASE"
BREAK
ENDSWITCH
RETURN "INCORRECT_MISSION_STAGE"
ENDFUNC
FUNC STRING GET_PED_STATE_NAME_FOR_DEBUG(PED_STATES eState)
SWITCH eState
CASE PED_STATE_IDLE
RETURN "PED_STATE_IDLE"
BREAK
CASE PED_STATE_PLAYING_BEGIN_ANIM
RETURN "PED_STATE_PLAYING_BEGIN_ANIM"
BREAK
CASE PED_STATE_PLAYING_REACTION_ANIM
RETURN "PED_STATE_PLAYING_REACTION_ANIM"
BREAK
CASE PED_STATE_PLAYING_END_ANIM
RETURN "PED_STATE_PLAYING_END_ANIM"
BREAK
CASE PED_STATE_FLEEING
RETURN "PED_STATE_FLEEING"
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
RETURN "PED_STATE_COMBAT_ON_FOOT"
BREAK
CASE PED_STATE_COMBAT_FROM_VEHICLE
RETURN "PED_STATE_COMBAT_FROM_VEHICLE"
BREAK
CASE PED_STATE_RUNNING_TO_ALLEY
RETURN "PED_STATE_RUNNING_TO_ALLEY"
BREAK
CASE PED_STATE_WAITING_IN_ALLEY
RETURN "PED_STATE_WAITING_IN_ALLEY"
BREAK
CASE PED_STATE_RUNNING_TO_RIVER
RETURN "PED_STATE_RUNNING_TO_RIVER"
BREAK
CASE PED_STATE_WAITING_FOR_PLAYER
RETURN "PED_STATE_WAITING_FOR_PLAYER"
BREAK
CASE PED_STATE_RUNNING_TO_VEHICLE
RETURN "PED_STATE_RUNNING_TO_VEHICLE"
BREAK
CASE PED_STATE_WAITING_AT_VEHICLE
RETURN "PED_STATE_WAITING_AT_VEHICLE"
BREAK
CASE PED_STATE_ENTERING_VEHICLE
RETURN "PED_STATE_ENTERING_VEHICLE"
BREAK
CASE PED_STATE_SITTING_IN_VEHICLE
RETURN "PED_STATE_SITTING_IN_VEHICLE"
BREAK
CASE PED_STATE_EXITING_VEHICLE
RETURN "PED_STATE_EXITING_VEHICLE"
BREAK
CASE PED_STATE_STARTING_RECORDING_PLAYBACK
RETURN "PED_STATE_STARTING_RECORDING_PLAYBACK"
BREAK
CASE PED_STATE_RECORDING_PLAYBACK
RETURN "PED_STATE_RECORDING_PLAYBACK"
BREAK
CASE PED_STATE_ENDING_RECORDING_PLAYBACK
RETURN "PED_STATE_ENDING_RECORDING_PLAYBACK"
BREAK
CASE PED_STATE_CATCHING_UP_WITH_RECORDING
RETURN "PED_STATE_CATCHING_UP_WITH_RECORDING"
BREAK
CASE PED_STATE_FLEE_COPS_ON_FOOT
RETURN "PED_STATE_FLEE_COPS_ON_FOOT"
BREAK
CASE PED_STATE_FOLLOWING_PLAYER
RETURN "PED_STATE_FOLLOWING_PLAYER"
BREAK
CASE PED_STATE_PLAYER_CONTROL_ENABLED
RETURN "PED_STATE_PLAYER_CONTROL_ENABLED"
BREAK
CASE PED_STATE_PLAYER_CONTROL_DISABLED
RETURN "PED_STATE_PLAYER_CONTROL_DISABLED"
BREAK
CASE PED_STATE_WAITING_FOR_TASK_AFTER_SWITCH
RETURN "PED_STATE_WAITING_FOR_TASK_AFTER_SWITCH"
BREAK
ENDSWITCH
RETURN "INVALID_PED_STATE"
ENDFUNC
PROC DO_SCREEN_FADE_IN_FOR_DEBUG(INT iTime)
IF NOT IS_SCREEN_FADED_IN()
DO_SCREEN_FADE_IN(iTime)
WHILE NOT IS_SCREEN_FADED_IN()
WAIT(0)
ENDWHILE
ENDIF
ENDPROC
PROC DO_SCREEN_FADE_OUT_FOR_DEBUG(INT iTime)
IF NOT IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_OUT(iTime)
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT(0)
ENDWHILE
ENDIF
ENDPROC
/// PURPOSE:
/// Creates debug widgets for the mission.
PROC CREATE_DEBUG_WIDGETS()
Franklin1Widgets = START_WIDGET_GROUP("Mission: Franklin1")
ADD_WIDGET_BOOL("Print debug output", bPrintDebugOutput)
ADD_WIDGET_BOOL("Allow HotSwap", bAllowHotSwap)
START_WIDGET_GROUP("BMX Crew")
ADD_WIDGET_FLOAT_SLIDER("fBMX0PlaybackSpeed", fBMX0PlabackSpeed, 0.0, 2.0, 0.05)
ADD_WIDGET_FLOAT_SLIDER("fBMX1PlaybackSpeed", fBMX1PlabackSpeed, 0.0, 2.0, 0.05)
ADD_WIDGET_FLOAT_SLIDER("fBMX2PlaybackSpeed", fBMX2PlabackSpeed, 0.0, 2.0, 0.05)
ADD_WIDGET_FLOAT_SLIDER("fBMX0StartTime", fBMX0StartTime, 0.0, 30000.0, 1.0)
ADD_WIDGET_FLOAT_SLIDER("fBMX1StartTime", fBMX1StartTime, 0.0, 30000.0, 1.0)
ADD_WIDGET_FLOAT_SLIDER("fBMX2StartTime", fBMX2StartTime, 0.0, 30000.0, 1.0)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Grove Street Shootout")
ADD_WIDGET_BOOL("Render enemy blips", bRenderEnemyBlips)
ADD_WIDGET_BOOL("Draw Lamar's path", bDrawLamarsPath)
ADD_WIDGET_BOOL("Draw object names", bDrawObjectNames)
START_WIDGET_GROUP("Front Left offset")
ADD_WIDGET_VECTOR_SLIDER("Front Left offset", vFrontLeftOffset, -5.0, 5.0, 0.05)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Front Right offset")
ADD_WIDGET_VECTOR_SLIDER("Front Right offset", vFrontRightOffset, -5.0, 5.0, 0.05)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Rear Left offset")
ADD_WIDGET_VECTOR_SLIDER("Rear Left offset", vRearLeftOffset, -5.0, 5.0, 0.05)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Rear Right offset")
ADD_WIDGET_VECTOR_SLIDER("Rear Right offset", vRearRightOffset, -5.0, 5.0, 0.05)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Front Left damage offset")
ADD_WIDGET_VECTOR_SLIDER("Front Left damage offset", vFrontLeftDamageOffset, -5.0, 5.0, 0.05)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Front Right damage offset")
ADD_WIDGET_VECTOR_SLIDER("Front Right damage offset", vFrontRightDamageOffset, -5.0, 5.0, 0.05)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Rear Left damage offset")
ADD_WIDGET_VECTOR_SLIDER("Rear Left damage offset", vRearLeftDamageOffset, -5.0, 5.0, 0.05)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Rear Right damage offset")
ADD_WIDGET_VECTOR_SLIDER("Rear Right damage offset", vRearRightDamageOffset, -5.0, 5.0, 0.05)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Gameplay camera positioning")
ADD_WIDGET_BOOL("Print gameplay camera info", bPrintGameplayCameraInfo)
ADD_WIDGET_BOOL("Position gameplay camera", bPositionGameplayCamera)
ADD_WIDGET_FLOAT_SLIDER("Gameplay camera desired heading", fGameplayCameraDesiredHeading, -360.0, 360.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("Gameplay camera desired pitch", fGameplayCameraDesiredPitch, -360.0, 360.0, 0.1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Playback chase")
ADD_WIDGET_BOOL("Start chase playback", bStartChasePlayback)
ADD_WIDGET_BOOL("Stop chase playback", bStopChasePlayback)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Record chase")
ADD_WIDGET_BOOL("Start when accelerate is pressed", bStartOnAccelerateToggle)
ADD_WIDGET_VECTOR_SLIDER("Camera position", vPropCameraPosition, -2000, 2000, 1.0)
ADD_WIDGET_VECTOR_SLIDER("Camera rotation", vPropCameraRotation, -180, 180, 1.0)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Water waves")
ADD_WIDGET_FLOAT_SLIDER("Ocean wave amplitude", fOceanWaveAmplitude, 0.0, 10.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("Min ocean wave amplitude", fOceanWaveMinAmplitude, 0.0, 20.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("Max ocean wave amplitude", fOceanWaveMaxAmplitude, 0.0, 20.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("Ocean noise min amplitude",fOceanNoiseMinAmplitude,0.0, 50.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("Shore wave amplitude", fShoreWaveamplitude, 0.0, 20.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("Min shore wave amplitude", fShoreWaveMinamplitude, 0.0, 20.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("Max shore wave amplitude", fShoreWaveMaxamplitude, 0.0, 20.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("Ripple disturb", fRippleDisturb, 0.0, 2.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("Ripple bumpiness", fRippleBumpiness, 0.0, 2.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("Min ripple bumpiness", fRippleMinBumpiness, 0.0, 2.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("Max ripple bumpiness", fRippleMaxBumpiness, 0.0, 2.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("Override strength", fOverrideStrength, 0.0, 1.0, 0.01)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("First Person Flashes")
ADD_WIDGET_FLOAT_SLIDER("fTrevorEntryFlashPhase", fTrevorEntryFlashPhase, 0.0, 1.0, 0.01)
ADD_WIDGET_INT_SLIDER("iLamarEntryFlashTime", iLamarEntryFlashTime, 0, 10000, 100)
ADD_WIDGET_FLOAT_SLIDER("fFranklinEntryFlashPhase", fFranklinEntryFlashPhase, 0.0, 1.0, 0.01)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
SET_UBER_PARENT_WIDGET_GROUP(Franklin1Widgets)
SET_LOCATES_HEADER_WIDGET_GROUP(Franklin1Widgets)
ENDPROC
/// PURPOSE:
/// Deletes debug widgets for the mission.
PROC DELETE_DEBUG_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(Franklin1Widgets)
DELETE_WIDGET_GROUP(Franklin1Widgets)
ENDIF
ENDPROC
/// PURPOSE:
/// Creates debug mission stage menu.
PROC CREATE_DEBUG_MISSION_STAGE_MENU()
SkipMenu[0].sTxtLabel = "CUT - INTRO - FRANKLIN_1_INT"
SkipMenu[1].sTxtLabel = "DRIVE TO DEAL"
SkipMenu[2].sTxtLabel = "CUT - DEAL - FRA_1_MCS_1"
SkipMenu[3].sTxtLabel = "GROVE STREET SHOOTOUT"
SkipMenu[4].sTxtLabel = "RUN TO SPEEDOPHILES"
SkipMenu[5].sTxtLabel = "SPEEDOPHILE RIDE"
SkipMenu[6].sTxtLabel = "LOSE COPS"
SkipMenu[7].sTxtLabel = "CUT - DROPOFF LAMAR"
SkipMenu[8].sTxtLabel = "CUT - DROPOFF TREVOR"
SkipMenu[9].sTxtLabel = "CUT - DROPOFF FRANKLIN"
SkipMenu[10].sTxtLabel = "END"
SkipMenu[11].sTxtLabel = "DEBUG - PLAYBACK CHASE"
SkipMenu[12].sTxtLabel = "DEBUG - RECORD CHASE"
ENDPROC
/// PURPOSE:
/// Stops an active mocap cutscene and waits until it has finished.
PROC STOP_CUTSCENE_FOR_DEBUG()
IF IS_CUTSCENE_PLAYING()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
STOP_CUTSCENE(TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE) //needs to be called to make sure all scripted systems work correctly when cutscene is skipped
ENDIF
WHILE NOT HAS_CUTSCENE_FINISHED()
WAIT(0)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Waiting for the cutscene to finish.")
#ENDIF
ENDWHILE
ENDPROC
/// PURPOSE:
/// Checks if any of the debug pass or fail keys has been pressed to force mission end.
/// PARAMS:
/// eStage - Mission stage variable
/// eFailReason - Mission fail variable.
PROC RUN_DEBUG_PASS_AND_FAIL_CHECK(MISSION_STAGES &eStage, MISSION_FAILS &eFailReason)
IF IS_KEYBOARD_KEY_PRESSED (KEY_S)
IF IS_CUTSCENE_PLAYING()
STOP_CUTSCENE_FOR_DEBUG()
ENDIF
eStage = MISSION_STAGE_PASSED
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN_FOR_DEBUG(DEFAULT_FADE_TIME)
ENDIF
ENDIF
IF IS_KEYBOARD_KEY_PRESSED (KEY_F)
IF IS_CUTSCENE_PLAYING()
STOP_CUTSCENE_FOR_DEBUG()
ENDIF
eStage = MISSION_STAGE_FAILED
eFailReason = MISSION_FAIL_FORCE_FAIL
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN_FOR_DEBUG(DEFAULT_FADE_TIME)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Performs mission stage cleanup for specified stage.
/// PARAMS:
/// eStage - Mission stage to perform cleanup for.
PROC RUN_MISSION_STAGE_CLEANUP_FOR_DEBUG(MISSION_STAGES eStage)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting mission stage cleanup.")
#ENDIF
REMOVE_CUTSCENE()
KILL_ANY_CONVERSATION()
KILL_PHONE_CONVERSATION()
HANG_UP_AND_PUT_AWAY_PHONE(TRUE)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
//Chop cam specific cleanup
//enable player ped ragdoll when player's ragdoll was disabled during combat
IF ( bPlayerInCombatWhenChopCamActive = TRUE )
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS(PLAYER_PED_ID())
SET_PED_CAN_RAGDOLL(PLAYER_PED_ID(), TRUE)
ENDIF
IF NOT IS_PLAYER_CONTROL_ON(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
bPlayerInCombatWhenChopCamActive = FALSE
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
ENDIF
//remove mission peds
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
CLEANUP_PED(psTrevor, TRUE)
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
CLEANUP_PED(psFranklin, TRUE)
ENDIF
CLEANUP_PED(psLamar, TRUE)
CLEANUP_PED(psChop, TRUE)
CLEANUP_PED_GROUP(psFilmCrew, TRUE)
bLamarsOutfitSet = FALSE //reset Lamar's outfit flag
bLamarsBagEquipped = FALSE
REMOVE_ANIM_DICT("missfra1")
REMOVE_ANIM_DICT("missfra1leadinoutmcs_1")
REMOVE_ANIM_DICT(GET_CHOP_IN_VAN_ANIM_DICT())
REMOVE_ANIM_DICT("creatures@rottweiler@amb@world_dog_sitting@base")
REMOVE_ANIM_DICT("creatures@rottweiler@amb@world_dog_sitting@enter")
REMOVE_ANIM_DICT("creatures@rottweiler@amb@world_dog_sitting@idle_a")
SET_GPS_DISABLED_ZONE(<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
//remove vehciles
CLEANUP_VEHICLE(vsVan, TRUE)
CLEANUP_VEHICLE(vsSpeedophiles[0], TRUE)
CLEANUP_VEHICLE(vsSpeedophiles[1], TRUE)
CLEANUP_VEHICLE(vsSpeedophiles[2], TRUE)
CLEANUP_VEHICLE(vsGhosts[0], TRUE)
CLEANUP_VEHICLE(vsGhosts[1], TRUE)
CLEANUP_VEHICLE(vsGhosts[2], TRUE)
IF DOES_ENTITY_EXIST(sMissionTrain.VehicleIndex)
IF NOT IS_ENTITY_DEAD(sMissionTrain.VehicleIndex)
DELETE_MISSION_TRAIN(sMissionTrain.VehicleIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Deleted mission train.")
#ENDIF
ENDIF
ENDIF
//remove blips
IF DOES_BLIP_EXIST(psTrevor.BlipIndex)
REMOVE_BLIP(psTrevor.BlipIndex)
ENDIF
IF DOES_BLIP_EXIST(psFranklin.BlipIndex)
REMOVE_BLIP(psFranklin.BlipIndex)
ENDIF
IF DOES_BLIP_EXIST(psLamar.BlipIndex)
REMOVE_BLIP(psLamar.BlipIndex)
ENDIF
//reset this flag for skips
bGameplayCameraSet = FALSE
//clear locates header data
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
//remove waypoint recordings
REMOVE_WAYPOINT_RECORDING("fra1_cflee")
bFirstEnemyGroupInCombat = FALSE
bFirstEnemyGroupInitialised = FALSE
CLEANUP_MISSION_OBJECT(osBag, TRUE)
CLEANUP_MISSION_OBJECT(osLight, TRUE)
CLEANUP_MISSION_OBJECT(osCamera, TRUE)
CLEANUP_MISSION_OBJECT(osTrowel, TRUE)
CLEANUP_MISSION_OBJECT(osBoombox, TRUE)
CLEANUP_MISSION_OBJECT(osCokeBlock, TRUE)
CLEANUP_MISSION_OBJECT(osMicrophone, TRUE)
CLEANUP_PED_GROUP(psBmxCrew)
CLEANUP_VEHICLE_GROUP(vsBmxBikes, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(BMX)
SET_MODEL_AS_NO_LONGER_NEEDED(G_M_Y_FAMFOR_01)
SET_MODEL_AS_NO_LONGER_NEEDED(G_M_Y_FAMCA_01)
SET_MODEL_AS_NO_LONGER_NEEDED(mnBalla)
CLEANUP_VEHICLE(vsEnemyLeftChaseCar, TRUE)
CLEANUP_VEHICLE_GROUP(vsGetawayCars, TRUE)
//cleanup enemy peds
CLEANUP_ENEMY_GROUP(esCarCuldeSacLeft, TRUE)
CLEANUP_ENEMY_GROUP(esCarCuldeSacRight, TRUE)
CLEANUP_ENEMY_GROUP(esCarStreetLeft, TRUE)
CLEANUP_ENEMY_GROUP(esCarIntersection1Left, TRUE)
CLEANUP_ENEMY_GROUP(esCarIntersection2Left, TRUE)
CLEANUP_ENEMY_GROUP(esCarIntersection1Right, TRUE)
CLEANUP_ENEMY_GROUP(esCarStreetRight, TRUE)
CLEANUP_ENEMY_GROUP(esCarDriveway, TRUE)
CLEANUP_ENEMY_GROUP(esGroup1, TRUE)
CLEANUP_ENEMY_GROUP(esGroup2, TRUE)
CLEANUP_ENEMY_GROUP(esGroup3, TRUE)
CLEANUP_ENEMY_GROUP(esGroup4, TRUE)
CLEANUP_ENEMY_GROUP(esGroup5, TRUE)
CLEANUP_ENEMY_GROUP(esGroup6, TRUE)
CLEANUP_ENEMY_GROUP(esGroup7, TRUE)
CLEANUP_ENEMY_GROUP(esGroup8, TRUE)
CLEANUP_ENEMY_GROUP(esGroup9, TRUE)
CLEANUP_ENEMY_GROUP(esHouseEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esPorchEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esLeftChaseEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esPoliceCarEndReinforcements, TRUE)
CLEANUP_PED_GROUP(psBoatCops, TRUE)
CLEANUP_PED_GROUP(psRiverCopCar0Cops, TRUE)
CLEANUP_PED_GROUP(psRiverCopCar1Cops, TRUE)
CLEANUP_PED_GROUP(psRiverCopCar2Cops, TRUE)
CLEANUP_PED_GROUP(psRiverCopCar3Cops, TRUE)
CLEANUP_PED_GROUP(psRiverCopCar4Cops, TRUE)
CLEANUP_PED_GROUP(psStreetCopCar1Cops, TRUE)
CLEANUP_PED_GROUP(psStreetCopCar2Cops, TRUE)
CLEANUP_PED_GROUP(psStreetCopCar3Cops, TRUE)
CLEANUP_PED_GROUP(psHillCopCar0Cops, TRUE)
SET_ALL_EVENT_FLAGS(Events, FALSE)
CLEANUP_SPAWNPOINTS(EnemySpawnpoints, TRUE)
CLEANUP_SPAWNPOINTS(EnemySidekickSpawnpoints, TRUE)
//cleanup enemy vehicles
CLEANUP_VEHICLE_GROUP(vsEnemyCars, TRUE)
CLEANUP_VEHICLE_GROUP(vsParkedVehicles, TRUE)
CLEANUP_VEHICLE_GROUP(vsStreetCopCars, TRUE)
CLEANUP_VEHICLE_GROUP(vsRiverCopCars, TRUE)
CLEANUP_VEHICLE_GROUP(vsHillCopCars, TRUE)
CLEANUP_PED_GROUP(psSwat, TRUE)
CLEANUP_VEHICLE(vsPoliceHeli, TRUE)
CLEANUP_VEHICLE(vsCopBoat, TRUE)
CLEANUP_ENEMY_GROUP(esSidelineEnemies, TRUE)
STOP_AUDIO_SCENES()
IF DOES_ENTITY_EXIST(vsEnemyLeftChaseCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsEnemyLeftChaseCar.VehicleIndex)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vsEnemyLeftChaseCar.VehicleIndex)
ENDIF
ENDIF
CLEANUP_VEHICLE(vsEnemyLeftChaseCar, TRUE)
//reset stats for headshots
RESET_MISSION_STATS_ENTITY_WATCH()
REMOVE_COVERPOINTS(csCoverpoints, bCoverpointsCreated)
CLEANUP_MISSION_OBJECT_GROUP(osDumpsters, TRUE)
//cleanup sound effects
STOP_SOUND(iPhotoShootSoundID)
RELEASE_NAMED_SCRIPT_AUDIO_BANK("SCRIPT\\FRANKLIN_1_CAMERAS")
RELEASE_NAMED_SCRIPT_AUDIO_BANK("SCRIPT\\FRANKLIN_1_GIRLS")
IF DOES_CAM_EXIST(ScriptedCamera)
DESTROY_CAM(ScriptedCamera)
ENDIF
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DESTROY_ALL_CAMS()
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
REMOVE_IPL("SC1_27_Cut")
SWITCH eStage
CASE MISSION_STAGE_DEBUG_PLAYBACK_CHASE
CLEANUP_UBER_PLAYBACK(TRUE)
BREAK
ENDSWITCH
TRIGGER_MUSIC_EVENT("FRA1_MISSION_FAIL")
CANCEL_MUSIC_EVENT("FRA1_SPEED")
REMOVE_DISPATCH_SPAWN_BLOCKING_AREA(iArea1)
REMOVE_DISPATCH_SPAWN_BLOCKING_AREA(iArea2)
REMOVE_VEHICLE_COMBAT_AVOIDANCE_AREA(iVehCombatArea1)
REMOVE_VEHICLE_COMBAT_AVOIDANCE_AREA(iVehCombatArea2)
REMOVE_VEHICLE_ASSET(GET_NPC_VEH_MODEL(CHAR_LAMAR))
OVERRIDE_WATER_SETTINGS(FALSE, 0.1)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished mission stage cleanup.")
#ENDIF
ENDPROC
/// PURPOSE:
/// Controls running the debug mission stage menu.
/// PARAMS:
/// iSelectedStage - Variable that stores int value returned from the debug mission stage menu.
/// eStage - Mission stage variable.
/// bSkipActive - Skip flag.
PROC RUN_DEBUG_MISSION_STAGE_MENU(INT &iSelectedStage, MISSION_STAGES &eStage, BOOL &bSkipActive, BOOL &bResetStage)
IF LAUNCH_MISSION_STAGE_MENU(SkipMenu, iSelectedStage, ENUM_TO_INT(eStage), FALSE, "FRANKLIN 1")
DO_SCREEN_FADE_OUT_FOR_DEBUG(FADE_TIME)
STOP_CUTSCENE_FOR_DEBUG()
CLEAR_HELP()
CLEAR_PRINTS()
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
RUN_MISSION_STAGE_CLEANUP_FOR_DEBUG(eStage)
eStage = INT_TO_ENUM(MISSION_STAGES, iSelectedStage)
bResetStage = FALSE
bSkipActive = TRUE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current mission stage changed to ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), " via mission stage menu.")
RESET_MISSION_FLAGS()
ENDIF
ENDPROC
PROC RUN_DEBUG_SKIPS(MISSION_STAGES &eStage, BOOL &bSkipActive, BOOL &bResetStage)
INT iCurrentStage = ENUM_TO_INT(eStage)
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
IF eStage <> MISSION_STAGE_END
DO_SCREEN_FADE_OUT_FOR_DEBUG(FADE_TIME)
STOP_CUTSCENE_FOR_DEBUG()
CLEAR_HELP()
CLEAR_PRINTS()
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
RUN_MISSION_STAGE_CLEANUP_FOR_DEBUG(eStage)
iCurrentStage++
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
bResetStage = FALSE
bSkipActive = TRUE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current mission stage changed to ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), " via J skip.")
RESET_MISSION_FLAGS()
ENDIF
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
IF eStage <> MISSION_STAGE_CUTSCENE_INTRO
DO_SCREEN_FADE_OUT_FOR_DEBUG(FADE_TIME)
STOP_CUTSCENE_FOR_DEBUG()
CLEAR_HELP()
CLEAR_PRINTS()
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
RUN_MISSION_STAGE_CLEANUP_FOR_DEBUG(eStage)
IF ( eStage <> MISSION_STAGE_CUTSCENE_INTRO )
IF ( bResetStage = FALSE )
iCurrentStage--
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
ELIF ( bResetStage = TRUE )
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
ENDIF
ELIF ( eStage = MISSION_STAGE_CUTSCENE_INTRO )
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
ENDIF
bResetStage = FALSE
bSkipActive = TRUE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current mission stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), " reset via P skip.")
RESET_MISSION_FLAGS()
ENDIF
ENDIF
ENDPROC
PROC RUN_DEBUG_WIDGETS(MISSION_STAGES eStage)
INT i = 0
IF ( bPrintGameplayCameraInfo = TRUE )
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Gameplay camera heading ", GET_GAMEPLAY_CAM_RELATIVE_HEADING(), ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Gameplay camera pitch ", GET_GAMEPLAY_CAM_RELATIVE_PITCH(), ".")
bPrintGameplayCameraInfo = FALSE
ENDIF
IF ( bPositionGameplayCamera = TRUE )
SET_GAMEPLAY_CAM_RELATIVE_HEADING(fGameplayCameraDesiredHeading - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(fGameplayCameraDesiredPitch)
//bPositionGameplayCamera = FALSE
ENDIF
SWITCH eStage
CASE MISSION_STAGE_DRIVE_TO_DEAL
IF IS_VEHICLE_DRIVEABLE(vsBmxBikes[0].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsBmxBikes[0].VehicleIndex)
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsBmxBikes[0].VehicleIndex, GET_STRING_FROM_FLOAT(GET_TIME_POSITION_IN_RECORDING(vsBmxBikes[0].VehicleIndex)))
#ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsBmxBikes[1].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsBmxBikes[1].VehicleIndex)
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsBmxBikes[1].VehicleIndex, GET_STRING_FROM_FLOAT(GET_TIME_POSITION_IN_RECORDING(vsBmxBikes[1].VehicleIndex)))
#ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsBmxBikes[2].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsBmxBikes[2].VehicleIndex)
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsBmxBikes[2].VehicleIndex, GET_STRING_FROM_FLOAT(GET_TIME_POSITION_IN_RECORDING(vsBmxBikes[2].VehicleIndex)))
#ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_DEAL
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT
IF ( bDrawDebugCoverpoints = TRUE )
AND ( bDrawDebugLinesAndSpheres = TRUE)
FOR i = 0 TO ( COUNT_OF(csCoverpoints) - 1 )
IF ( csCoverpoints[i].bActive = TRUE )
//draw non stationary coverpoints
IF ( csCoverpoints[i].bStationary = FALSE )
DRAW_DEBUG_SPHERE(csCoverpoints[i].vPosition, 0.25, 0, 255, 0)
//draw stationary coverpoints
ELIF ( csCoverpoints[i].bStationary = TRUE )
DRAW_DEBUG_SPHERE(csCoverpoints[i].vPosition, 0.25, 0, 255, 255)
ENDIF
DRAW_DEBUG_TEXT(GET_STRING_FROM_INT(i), << csCoverpoints[i].vPosition.x, csCoverpoints[i].vPosition.y, csCoverpoints[i].vPosition.z + 0.25>>)
ELSE
DRAW_DEBUG_SPHERE(csCoverpoints[i].vPosition, 0.25, 255, 0, 0)
DRAW_DEBUG_TEXT(GET_STRING_FROM_INT(i), << csCoverpoints[i].vPosition.x, csCoverpoints[i].vPosition.y, csCoverpoints[i].vPosition.z + 0.25>>)
ENDIF
ENDFOR
ENDIF
IF ( bDrawLamarsPath = TRUE )
FOR i = 0 TO ( COUNT_OF(LamarShootoutPositions) - 1 )
DRAW_DEBUG_SPHERE(LamarShootoutPositions[i], 0.175, 0, 0, 255)
DRAW_DEBUG_TEXT(GET_STRING_FROM_INT(i), <<LamarShootoutPositions[i].x, LamarShootoutPositions[i].y, LamarShootoutPositions[i].z + 0.25>>)
IF ( i >= 1 )
DRAW_DEBUG_LINE(<< LamarShootoutPositions[i].X, LamarShootoutPositions[i].Y, LamarShootoutPositions[i].Z + 0.15 >>,
<< LamarShootoutPositions[i - 1].X, LamarShootoutPositions[i - 1].Y, LamarShootoutPositions[i - 1].Z + 0.15 >>, 0, 0, 255)
ENDIF
ENDFOR
ENDIF
IF ( bDrawObjectNames = TRUE )
FOR i = 0 TO ( COUNT_OF(osDumpsters) - 1 )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(osDumpsters[i].ObjectIndex, GET_STRING_FROM_INT(i), 1.25)
ENDFOR
ENDIF
BREAK
CASE MISSION_STAGE_DEBUG_PLAYBACK_CHASE
IF ( bStartChasePlayback = TRUE )
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[0].VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsSpeedophiles[0].VehicleIndex)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(vsSpeedophiles[0].iRecordingNumber, sVehicleRecordingsFile)
START_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[0].VehicleIndex, vsSpeedophiles[0].iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[1].VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsSpeedophiles[1].VehicleIndex)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(vsSpeedophiles[1].iRecordingNumber, sVehicleRecordingsFile)
START_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[1].VehicleIndex, vsSpeedophiles[1].iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ENDIF
ENDIF
bStartChasePlayback = FALSE
ENDIF
IF ( bStopChasePlayback = TRUE )
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[0].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsSpeedophiles[0].VehicleIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[0].VehicleIndex)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[1].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsSpeedophiles[1].VehicleIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[1].VehicleIndex)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[2].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsSpeedophiles[2].VehicleIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[2].VehicleIndex)
ENDIF
ENDIF
bStopChasePlayback = FALSE
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC RUN_DEBUG_INFORMATION_DISPLAY()
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD4)
IF ( bDrawDebugLinesAndSpheres = FALSE)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
bDrawDebugLinesAndSpheres = TRUE
ELSE
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE)
bDrawDebugLinesAndSpheres = FALSE
ENDIF
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD5)
IF ( bDrawDebugStates = FALSE)
bDrawDebugStates = TRUE
ELSE
bDrawDebugStates = FALSE
ENDIF
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD6)
IF ( bDrawDebugCoverpoints = FALSE)
bDrawDebugCoverpoints = TRUE
ELSE
bDrawDebugCoverpoints = FALSE
ENDIF
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD7)
IF ( bDrawDebugVehicleDamageInfo = FALSE)
bDrawDebugVehicleDamageInfo = TRUE
ELSE
bDrawDebugVehicleDamageInfo = FALSE
ENDIF
ENDIF
ENDPROC
#ENDIF
//|===================== END DEBUG VARIABLES, PROCEDURES & FUNCTIONS =====================|
PROC GO_TO_PED_STATE(PED_STRUCT &ped, PED_STATES eState)
ped.bHasTask = FALSE
ped.eState = eState
#IF IS_DEBUG_BUILD
IF NOT IS_STRING_NULL_OR_EMPTY(ped.sDebugName)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Sending ped with debug name ", ped.sDebugName, " to state ", GET_PED_STATE_NAME_FOR_DEBUG(eState), ".")
ENDIF
#ENDIF
ENDPROC
FUNC BOOL IS_PED_IN_PED_STATE(PED_STRUCT &ped, PED_STATES ePedState)
IF DOES_ENTITY_EXIST(ped.PedIndex)
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
IF ( ped.eState = ePedState )
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC RUN_HOTSWAP(SELECTOR_PED_STRUCT &SelectorPed, SELECTOR_CAM_STRUCT &SelectorCamera)
IF NOT SelectorCamera.bRun
IF UPDATE_SELECTOR_HUD(SelectorPed)
//if any selector ped, other than multiplayer selector ped was selected
IF NOT HAS_SELECTOR_PED_BEEN_SELECTED(SelectorPed, SELECTOR_PED_MULTIPLAYER)
//continue with hot swap if the new selector ped is different than Michael (in this case Chop)
//and if the new selector ped is different than current selector ped
//and if the chop view cam is in the disabled state (gameplay camera is on the player)
IF SelectorPed.eNewSelectorPed <> SELECTOR_PED_MICHAEL
IF SelectorPed.eNewSelectorPed <> GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(GET_CURRENT_PLAYER_PED_ENUM())
SelectorCamera.pedTo = SelectorPed.pedID[SelectorPed.eNewSelectorPed]
SelectorCamera.bRun = TRUE
CLEAR_HELP()
CLEAR_PRINTS()
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF RUN_SWITCH_CAM_FROM_PLAYER_TO_PED_SHORT_RANGE(SelectorCamera)
IF SelectorCamera.bOKToSwitchPed = TRUE
IF NOT SelectorCamera.bPedSwitched
IF TAKE_CONTROL_OF_SELECTOR_PED(SelectorPed, TRUE, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": HOTSWAP - Performing hotswap to ",
GET_MODEL_NAME_FOR_DEBUG(GET_PLAYER_PED_MODEL(GET_CURRENT_PLAYER_PED_ENUM())), ".")
#ENDIF
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN //player hot swapped to Franklin
//remove blip for Franklin (current player ped)
IF DOES_BLIP_EXIST(psFranklin.BlipIndex)
REMOVE_BLIP(psFranklin.BlipIndex)
ENDIF
#IF IS_DEBUG_BUILD psTrevor.sDebugName = "Trevor" #ENDIF
//remove blip for speedophile Franklin is using
IF ( psFranklin.ePedVehicle <> MAX_SPEEDOPHILES )
IF DOES_BLIP_EXIST(vsSpeedophiles[psFranklin.ePedVehicle].BlipIndex)
REMOVE_BLIP(vsSpeedophiles[psFranklin.ePedVehicle].BlipIndex)
ENDIF
ENDIF
//set Trevor's proprties after hot swap
SET_PED_PROPERTIES_AFTER_HOTSWAP(psTrevor, SelectorPed.pedID[SelectorPed.ePreviousSelectorPed], TRUE, RELGROUPHASH_PLAYER)
SET_PED_WEAPON_AND_AMMO_AFTER_HOTSWAP(psTrevor.PedIndex, WEAPONTYPE_PUMPSHOTGUN)
RESET_PED_PROPERTIES_AFTER_HOTSWAP(GET_PED_INDEX(CHAR_FRANKLIN))
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(GET_PED_INDEX(CHAR_TREVOR), TRUE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(GET_PED_INDEX(CHAR_FRANKLIN), FALSE)
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
FailFlags[MISSION_FAIL_FRANKLIN_DEAD] = FALSE
//send other player ped to waiting for task state, use Trevor's struct
GO_TO_PED_STATE(psTrevor, PED_STATE_WAITING_FOR_TASK_AFTER_SWITCH)
SWITCH eMissionStage //mission stage specific settings
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT //weapon and cover reset
SET_PED_COVER_PROPERTIES(GET_PED_INDEX(CHAR_TREVOR), TRUE, FALSE, FALSE, FALSE)
SET_PED_COVER_PROPERTIES(GET_PED_INDEX(CHAR_FRANKLIN), TRUE, FALSE, FALSE, FALSE)
BREAK
CASE MISSION_STAGE_SPEEDOPHILE_RIDE //modify speedophiles top speed values
IF ( psFranklin.ePedVehicle <> MAX_SPEEDOPHILES )
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex)
MODIFY_VEHICLE_TOP_SPEED(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex, 0.0)
MODIFY_VEHICLE_TOP_SPEED(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex, -15.0)
ENDIF
ENDIF
IF ( psTrevor.ePedVehicle <> MAX_SPEEDOPHILES )
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex)
MODIFY_VEHICLE_TOP_SPEED(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex, 0.0)
ENDIF
ENDIF
BREAK
ENDSWITCH
BREAK
CASE CHAR_TREVOR //player hot swapped to Trevor
//remove blip for Trevor (current player ped)
IF DOES_BLIP_EXIST(psTrevor.BlipIndex)
REMOVE_BLIP(psTrevor.BlipIndex)
ENDIF
#IF IS_DEBUG_BUILD psTrevor.sDebugName = "Franklin" #ENDIF
//remove blip for speedophile Trevor is using
IF ( psTrevor.ePedVehicle <> MAX_SPEEDOPHILES )
IF DOES_BLIP_EXIST(vsSpeedophiles[psTrevor.ePedVehicle].BlipIndex)
REMOVE_BLIP(vsSpeedophiles[psTrevor.ePedVehicle].BlipIndex)
ENDIF
ENDIF
SET_PED_PROPERTIES_AFTER_HOTSWAP(psFranklin, SelectorPed.pedID[SelectorPed.ePreviousSelectorPed], TRUE, RELGROUPHASH_PLAYER)
SET_PED_WEAPON_AND_AMMO_AFTER_HOTSWAP(psFranklin.PedIndex, WEAPONTYPE_SMG)
RESET_PED_PROPERTIES_AFTER_HOTSWAP(GET_PED_INDEX(CHAR_TREVOR))
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(GET_PED_INDEX(CHAR_TREVOR), FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(GET_PED_INDEX(CHAR_FRANKLIN), TRUE)
FailFlags[MISSION_FAIL_TREVOR_DEAD] = FALSE
FailFlags[MISSION_FAIL_FRANKLIN_DEAD] = TRUE
//send other player ped to waiting for task state, use Trevor's struct
GO_TO_PED_STATE(psTrevor, PED_STATE_WAITING_FOR_TASK_AFTER_SWITCH)
SWITCH eMissionStage
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT //weapon and cover reset
SET_PED_COVER_PROPERTIES(GET_PED_INDEX(CHAR_TREVOR), TRUE, FALSE, FALSE, FALSE)
SET_PED_COVER_PROPERTIES(GET_PED_INDEX(CHAR_FRANKLIN), TRUE, FALSE, FALSE, FALSE)
BREAK
CASE MISSION_STAGE_SPEEDOPHILE_RIDE //modify speedophiles top speed values
IF ( psTrevor.ePedVehicle <> MAX_SPEEDOPHILES )
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex)
MODIFY_VEHICLE_TOP_SPEED(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex, 0.0)
MODIFY_VEHICLE_TOP_SPEED(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex, -15.0)
ENDIF
ENDIF
IF ( psFranklin.ePedVehicle <> MAX_SPEEDOPHILES )
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex)
MODIFY_VEHICLE_TOP_SPEED(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex, 0.0)
ENDIF
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
IF ( eMissionStage = MISSION_STAGE_GROVE_STREET_SHOOTOUT )
OR ( eMissionStage = MISSION_STAGE_RUN_TO_SPEEDOPHILES )
//reset this flag so that on hotswap if player runs out of the locate when buddies are waiting
//the buddy that will run into the locate can go into combat and wait for the player ped again
psTrevor.bWaitingForPlayer = FALSE
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_ENTER_VEHICLE) = PERFORMING_TASK
IF NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
AND NOT IS_ENTITY_ATTACHED_TO_ANY_VEHICLE(PLAYER_PED_ID())
CLEAR_PED_TASKS(PLAYER_PED_ID())
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CMN_TABIL_RET") //handle displaying Trevor's special
IF ( eMissionStage = MISSION_STAGE_GROVE_STREET_SHOOTOUT ) //ability help text during shootout
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR //for the first time player switches
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
PRINT_HELP("CMN_TABIL_RET_KM", DEFAULT_HELP_TEXT_TIME) //to Trevor, also give 10% charge
ELSE
PRINT_HELP("CMN_TABIL_RET", DEFAULT_HELP_TEXT_TIME) //to Trevor, also give 10% charge
ENDIF
IF IS_PLAYER_PLAYING(PLAYER_ID()) //to special ability
SPECIAL_ABILITY_CHARGE_LARGE(PLAYER_ID(), TRUE, TRUE)
ENDIF
SET_LABEL_AS_TRIGGERED("CMN_TABIL_RET", TRUE)
ENDIF
ENDIF
ENDIF
IF ( bBuddyPinnedDown = TRUE )
SET_SELECTOR_PED_DAMAGED(SelectorPed, SELECTOR_PED_TREVOR, FALSE)
SET_SELECTOR_PED_DAMAGED(SelectorPed, SELECTOR_PED_FRANKLIN, FALSE)
bBuddyPinnedDownSwitched = TRUE
ENDIF
INFORM_MISSION_STATS_OF_INCREMENT(FRA1_SWITCHES)
SelectorCamera.bPedSwitched = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
//|======================= ASSET REQUESTING PROCEDURES & FUNCTIONS =======================|
/// PURPOSE:
/// Adds a model to model request array.
/// PARAMS:
/// ModelName - Model name being requested.
/// array - MODEL_NAMES array to add the requested model name to.
/// iArrayLength - Maximum length of the array.
/// iModelsAlreadyRequested - Number of models already requested in this array.
PROC ADD_MODEL_REQUEST_TO_ARRAY(MODEL_NAMES ModelName, MODEL_NAMES &array[], INT iArrayLength, INT &iModelsAlreadyRequested)
INT i = 0
BOOL bModelAlreadyRequested = FALSE
IF ( iModelsAlreadyRequested >= 0 )
IF ( iModelsAlreadyRequested <= ( iArrayLength - 1 ) )
//loop through the array (from 0 to number of models already requested)
//to see if the array already contains the model name being requested
//modify the boolean flag if the model was found in array, otherwise leave the flag unchanged
FOR i = 0 TO ( iModelsAlreadyRequested )
IF ( array[i] = ModelName )
bModelAlreadyRequested = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested model at index ", i, " ", GET_MODEL_NAME_FOR_DEBUG(ModelName), " is already in model array.")
#ENDIF
ENDIF
ENDFOR
IF ( bModelAlreadyRequested = FALSE )
REQUEST_MODEL(ModelName)
//iModelsAlreadyRequested will be the model array index of the model being requested
array[iModelsAlreadyRequested] = ModelName
iModelsAlreadyRequested++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested model ", GET_MODEL_NAME_FOR_DEBUG(ModelName), " and added to model array.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Number of models requested: ", iModelsAlreadyRequested, ".")
#ENDIF
ENDIF
ELSE
SCRIPT_ASSERT("Number of requested models is greater than the length of the model array.")
ENDIF
ELSE
SCRIPT_ASSERT("Number of requested models is less than 0.")
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if all requested models from model array are loaded into memory.
/// PARAMS:
/// array - MODEL_NAMES array holding the models.
/// iModelsAlreadyRequested - Number of already requested models. Should be greated than 0, since 0 means no models have been requested.
/// RETURNS:
/// TRUE if all models from model array are loaded into memory. FALSE if otherwise.
FUNC BOOL ARE_REQUESTED_MODELS_LOADED(MODEL_NAMES &array[], INT &iModelsAlreadyRequested)
INT i = 0
IF ( iModelsAlreadyRequested > 0 )
FOR i = 0 TO ( iModelsAlreadyRequested - 1 )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Model in array[", i, "]: ", GET_MODEL_NAME_FOR_DEBUG(array[i]), ".")
#ENDIF
IF NOT HAS_MODEL_LOADED(array[i])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Model ", GET_MODEL_NAME_FOR_DEBUG(array[i]), " is loading.")
#ENDIF
//if the model is not loaded keep requesting it
REQUEST_MODEL(array[i])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requesting model ", GET_MODEL_NAME_FOR_DEBUG(array[i]), ".")
#ENDIF
RETURN FALSE
ENDIF
ENDFOR
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Models from model array loaded. Number of models loaded: ", iModelsAlreadyRequested, ".")
#ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Cleans model array from requested models.
/// PARAMS:
/// array - MODEL_NAMES array.
/// iModelsAlreadyRequested - Number of already requested models. Should be greated than 0, since 0 means no models have been requested.
PROC CLEANUP_MODEL_ARRAY(MODEL_NAMES &array[], INT &iModelsAlreadyRequested)
INT i = 0
IF ( iModelsAlreadyRequested > 0 )
FOR i = 0 TO ( iModelsAlreadyRequested - 1 )
IF array[i] <> DUMMY_MODEL_FOR_SCRIPT
SET_MODEL_AS_NO_LONGER_NEEDED(array[i])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Model ", GET_MODEL_NAME_FOR_DEBUG(array[i]), " cleaned up from model array by setting it as no longer needed.")
#ENDIF
array[i] = DUMMY_MODEL_FOR_SCRIPT
ENDIF
ENDFOR
ENDIF
iModelsAlreadyRequested = 0
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Model array cleaned up. Number of requested models set to 0.")
#ENDIF
ENDPROC
/// PURPOSE:
/// Checks if two strings are equal.
/// PARAMS:
/// sString1 - First string.
/// sString2 - Second string.
/// RETURNS:
/// TRUE if strings are equal, FALSE if otherwise or if any of the strings is empty or NULL.
FUNC BOOL IS_STRING_EQUAL_TO_STRING(STRING sString1, STRING sString2)
IF NOT Is_String_Null_Or_Empty(sString1)
AND NOT Is_String_Null_Or_Empty(sString2)
RETURN ARE_STRINGS_EQUAL(sString1, sString2)
ELSE
RETURN FALSE
ENDIF
ENDFUNC
/// PURPOSE:
/// Adds animation dictionary to animation request array.
/// PARAMS:
/// sAnimName - Name of the animation dictionary to request.
/// array - STRING array containing requested animations.
/// iArrayLength - Maximum length of the array
/// iAnimationsAlreadyRequested - Number of animations already requested in this array.
PROC ADD_ANIMATION_REQUEST_TO_ARRAY(STRING sAnimName, STRING &array[], INT iArrayLength, INT &iAnimationsAlreadyRequested)
INT i = 0
BOOL bAnimationRequested
IF ( iAnimationsAlreadyRequested >= 0 )
IF ( iAnimationsAlreadyRequested <= (iArrayLength - 1 ) )
FOR i = 0 TO ( iAnimationsAlreadyRequested )
IF IS_STRING_EQUAL_TO_STRING(sAnimName, array[i])
bAnimationRequested = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested animation ", sAnimName, " is already in animation array.")
#ENDIF
ENDIF
ENDFOR
IF ( bAnimationRequested = FALSE )
REQUEST_ANIM_DICT(sAnimName)
array[iAnimationsAlreadyRequested] = sAnimName
iAnimationsAlreadyRequested++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested animation ", sAnimName, " and added to animation array.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Number of animations requested: ", iAnimationsAlreadyRequested, ".")
#ENDIF
ENDIF
ELSE
SCRIPT_ASSERT("Number of requested animations is greater than the length of the animation array.")
ENDIF
ELSE
SCRIPT_ASSERT("Number of requested animations is less than 0.")
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if all requested animations are loaded into memory.
/// PARAMS:
/// array - STRING array containing requested animations.
/// iAnimationsAlreadyRequested - Number of animations already requested in this array.
/// RETURNS:
/// TRUE if all requested animations from animation array are loaded into memory. FALSE if otherwise.
FUNC BOOL ARE_REQUESTED_ANIMATIONS_LOADED(STRING &array[], INT &iAnimationsAlreadyRequested)
INT i = 0
IF ( iAnimationsAlreadyRequested > 0 )
FOR i = 0 TO ( iAnimationsAlreadyRequested - 1 )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Animation dictionary in array[", i, "]: ", array[i], ".")
#ENDIF
IF NOT HAS_ANIM_DICT_LOADED(array[i])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Animation dictionary ", array[i], " is loading.")
#ENDIF
//if the animation dictionary is not loaded keep requesting it
REQUEST_ANIM_DICT(array[i])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requesting animation dictionary ", array[i], ".")
#ENDIF
RETURN FALSE
ENDIF
ENDFOR
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Animations from animation array loaded. Number of animations loaded: ", iAnimationsAlreadyRequested, ".")
#ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Cleans animation array from requested animations.
/// PARAMS:
/// array - STRING array of animations to clean.
/// iAnimationsAlreadyRequested - Number of animations already requested in this array.
PROC CLEANUP_ANIMATION_ARRAY(STRING &array[], INT &iAnimationsAlreadyRequested)
INT i = 0
STRING sNull = NULL
IF ( iAnimationsAlreadyRequested > 0 )
FOR i = 0 TO ( iAnimationsAlreadyRequested - 1 )
//brute force remove animation dictionary from memory
REMOVE_ANIM_DICT(array[i])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Animation dictionary ", array[i], " removed from memory and cleaned up from animation array.")
#ENDIF
array[i] = sNull
ENDFOR
ENDIF
iAnimationsAlreadyRequested = 0
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Animation array cleaned up. Number of requested animations set to 0.")
#ENDIF
ENDPROC
/// PURPOSE:
/// Adds a car recording number to recording request array.
/// PARAMS:
/// iRecording - Recording number being requested.
/// sFile - Name of the file containing the car recording.
/// array - INT arry to add the requested recording number to.
/// iArrayLength - Maximum length of the array
/// iRecordingsAlreadyRequested - Number of recordings already requested in this array.
PROC ADD_CARREC_REQUEST_TO_ARRAY(INT iRecording, STRING sFile, INT &array[], INT iArrayLength, INT &iRecordingsAlreadyRequested)
INT i = 0
BOOL bRecordingRequested = FALSE
IF ( iRecordingsAlreadyRequested >= 0 )
IF ( iRecordingsAlreadyRequested <= ( iArrayLength - 1 ) )
FOR i = 0 TO ( iRecordingsAlreadyRequested )
IF array[i] = iRecording
bRecordingRequested = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested car recording ", iRecording, " is already in recording array.")
#ENDIF
ENDIF
ENDFOR
IF ( bRecordingRequested = FALSE )
REQUEST_VEHICLE_RECORDING(iRecording, sFile)
array[iRecordingsAlreadyRequested] = iRecording
iRecordingsAlreadyRequested++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested car recording ", iRecording, " and added to recording array.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Number of car recordings requested: ", iRecordingsAlreadyRequested, ".")
#ENDIF
ENDIF
ELSE
SCRIPT_ASSERT("Number of requested recordings is greater than the length of the recording array.")
ENDIF
ELSE
SCRIPT_ASSERT("Number of requested recordings is less than 0.")
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if all requested car recordings are loaded into memory.
/// PARAMS:
/// sFile - File name of the car recording file.
/// array - INT array holding the recording numbers.
/// iRecordingsAlreadyRequested - Number of already requested recordings. Should be greated than 0, since 0 means no recordings have been requested.
/// RETURNS:
/// TRUE if all recordings from recording array are loaded into memory. FALSE if otherwise.
FUNC BOOL ARE_REQUESTED_CARRECS_LOADED(STRING sFile, INT &array[], INT &iRecordingsAlreadyRequested)
INT i = 0
IF ( iRecordingsAlreadyRequested > 0 )
FOR i = 0 TO ( iRecordingsAlreadyRequested - 1 )
IF NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(array[i], sFile)
#IF IS_DEBUG_BUILD
IF DOES_VEHICLE_RECORDING_FILE_EXIST(array[i], sFile)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Car recording ", array[i], " exists.")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Car recording ", array[i], " does not exist.")
ENDIF
#ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Car recording ", array[i], " is loading.")
#ENDIF
//if the vehicle recording is not loaded keep requesting it
REQUEST_VEHICLE_RECORDING(array[i], sFile)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requesting vehicle recording ", array[i], ".")
#ENDIF
RETURN FALSE
ENDIF
ENDFOR
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Car recordings from recording array loaded. Number of car recordings loaded: ", iRecordingsAlreadyRequested, ".")
#ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Cleans recording array from requested recordings.
/// PARAMS:
/// sFile - File name of the car recording file.
/// array - INT array holding the recording numbers.
/// iRecordingsAlreadyRequested - Number of already requested recordings. Should be greated than 0, since 0 means no recordings have been requested.
PROC CLEANUP_CARREC_ARRAY(STRING sFile, INT &array[], INT &iRecordingsAlreadyRequested)
INT i = 0
IF ( iRecordingsAlreadyRequested > 0 )
FOR i = 0 TO ( iRecordingsAlreadyRequested - 1 )
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(array[i], sFile)
REMOVE_VEHICLE_RECORDING(array[i], sFile)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Car recording ", array[i], " cleaned up from recording array.")
#ENDIF
array[i] = 0
ENDIF
ENDFOR
ENDIF
iRecordingsAlreadyRequested = 0
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Recording array cleaned up. Number of requested car recordings set to 0.")
#ENDIF
ENDPROC
//|===================== END ASSET REQUESTING PROCEDURES & FUNCTIONS =====================|
//|========================== MISSION STAGE LOADINGS PROCEDURES ==========================|
/// PURPOSE:
/// Sets mission stage enum for replay.
/// PARAMS:
/// eStage - Mission stage enum variable.
/// iValue - Mid-mission replay value returned by the script when replaying the mission.
PROC SET_MISSION_STAGE_FOR_REPLAY(MISSION_STAGES &eStage, INT iValue)
IF iValue = ENUM_TO_INT(MID_MISSION_STAGE_DRIVE_TO_DEAL)
eStage = MISSION_STAGE_DRIVE_TO_DEAL
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_GROVE_STREET_SHOOTOUT)
eStage = MISSION_STAGE_GROVE_STREET_SHOOTOUT
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_RUN_TO_SPEEDOPHILES)
eStage = MISSION_STAGE_RUN_TO_SPEEDOPHILES
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_SPEEDOPHILE_RIDE)
eStage = MISSION_STAGE_SPEEDOPHILE_RIDE
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_LOSE_COPS)
eStage = MISSION_STAGE_LOSE_COPS
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission is being replayed at stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
ENDPROC
/// PURPOSE:
/// Handles cleaning up when mission ends.
PROC MISSION_CLEANUP()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting mission cleanup.")
DELETE_DEBUG_WIDGETS()
#ENDIF
CLEAR_PRINTS()
CLEAR_HELP()
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION()
//DISTANT_COP_CAR_SIRENS(FALSE)
SET_FAKE_WANTED_LEVEL(0)
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
ENDIF
IF NOT IS_PED_INJURED(psLamar.PedIndex)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(psLamar.PedIndex, KNOCKOFFVEHICLE_DEFAULT)
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(GET_PED_INDEX(CHAR_TREVOR), KNOCKOFFVEHICLE_DEFAULT)
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), KNOCKOFFVEHICLE_DEFAULT)
ENDIF
//Chop cam specific cleanup
//enable player ped ragdoll when player's ragdoll was disabled during combat
IF ( bPlayerInCombatWhenChopCamActive = TRUE )
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS(PLAYER_PED_ID())
SET_PED_CAN_RAGDOLL(PLAYER_PED_ID(), TRUE)
ENDIF
IF NOT IS_PLAYER_CONTROL_ON(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
bPlayerInCombatWhenChopCamActive = FALSE
ENDIF
CLEANUP_MODEL_ARRAY(MissionModels, iModelsRequested)
CLEANUP_CARREC_ARRAY(sVehicleRecordingsFile, MissionRecordings, iRecordingsRequested)
CLEANUP_ANIMATION_ARRAY(MissionAnimations, iAnimationsRequested)
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
ENDIF
CLEANUP_PED(psChop, IS_SCREEN_FADED_OUT(), FALSE, TRUE)
CLEANUP_PED(psLamar, IS_SCREEN_FADED_OUT(), FALSE, TRUE)
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
IF NOT IS_PED_INJURED(psTrevor.PedIndex)
SET_PED_KEEP_TASK(psTrevor.PedIndex, TRUE)
IF IS_PED_GROUP_MEMBER(psTrevor.PedIndex, PLAYER_GROUP_ID())
REMOVE_PED_FROM_GROUP(psTrevor.PedIndex)
ENDIF
ENDIF
IF NOT IS_SCREEN_FADED_OUT()
IF ( ePlayerBuddy != PLAYER_BUDDY_TREVOR)
SET_PED_AS_NO_LONGER_NEEDED(psTrevor.PedIndex)
ENDIF
ELSE
DELETE_PED(psTrevor.PedIndex)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SET_PED_AS_NO_LONGER_NEEDED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF DOES_ENTITY_EXIST(psFranklin.PedIndex)
IF NOT IS_PED_INJURED(psFranklin.PedIndex)
SET_PED_KEEP_TASK(psFranklin.PedIndex, TRUE)
IF IS_PED_GROUP_MEMBER(psFranklin.PedIndex, PLAYER_GROUP_ID())
REMOVE_PED_FROM_GROUP(psFranklin.PedIndex)
ENDIF
ENDIF
IF NOT IS_SCREEN_FADED_OUT()
IF ( ePlayerBuddy != PLAYER_BUDDY_FRANKLIN)
SET_PED_AS_NO_LONGER_NEEDED(psFranklin.PedIndex)
ENDIf
ELSE
DELETE_PED(psFranklin.PedIndex)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
SET_PED_AS_NO_LONGER_NEEDED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
ENDIF
ENDIF
//remove mission vehicles
IF DOES_ENTITY_EXIST(vsVan.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vsVan.VehicleIndex)
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vsVan.VehicleIndex, TRUE)
ENDIF
IF NOT IS_SCREEN_FADED_OUT()
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsVan.VehicleIndex)
ELSE
DELETE_VEHICLE(vsVan.VehicleIndex)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsSpeedophiles[0].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsSpeedophiles[0].VehicleIndex)
IF IS_ENTITY_A_MISSION_ENTITY(vsSpeedophiles[0].VehicleIndex)
AND DOES_ENTITY_BELONG_TO_THIS_SCRIPT(vsSpeedophiles[0].VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsSpeedophiles[0].VehicleIndex)
ENDIF
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsSpeedophiles[0].VehicleIndex)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsSpeedophiles[1].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsSpeedophiles[1].VehicleIndex)
IF IS_ENTITY_A_MISSION_ENTITY(vsSpeedophiles[1].VehicleIndex)
AND DOES_ENTITY_BELONG_TO_THIS_SCRIPT(vsSpeedophiles[1].VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsSpeedophiles[1].VehicleIndex)
ENDIF
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsSpeedophiles[1].VehicleIndex)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsSpeedophiles[2].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsSpeedophiles[2].VehicleIndex)
IF IS_ENTITY_A_MISSION_ENTITY(vsSpeedophiles[2].VehicleIndex)
AND DOES_ENTITY_BELONG_TO_THIS_SCRIPT(vsSpeedophiles[2].VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsSpeedophiles[2].VehicleIndex)
ENDIF
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsSpeedophiles[2].VehicleIndex)
ENDIF
ENDIF
CLEANUP_VEHICLE(vsGhosts[0], TRUE)
CLEANUP_VEHICLE(vsGhosts[1], TRUE)
CLEANUP_VEHICLE(vsGhosts[2], TRUE)
IF DOES_ENTITY_EXIST(sMissionTrain.VehicleIndex)
IF NOT IS_ENTITY_DEAD(sMissionTrain.VehicleIndex)
DELETE_MISSION_TRAIN(sMissionTrain.VehicleIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Deleted mission train.")
#ENDIF
ENDIF
ENDIF
SET_RANDOM_TRAINS(TRUE)
SET_GPS_DISABLED_ZONE(<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
CLEANUP_PED_GROUP(psBmxCrew, FALSE)
CLEANUP_VEHICLE_GROUP(vsBmxBikes, FALSE, FALSE)
CLEANUP_PED_GROUP(psFilmCrew, IS_SCREEN_FADED_OUT())
CLEANUP_ENEMY_GROUP(esCarCuldeSacLeft, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esCarCuldeSacRight, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esCarIntersection1Left, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esCarIntersection1Right, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esCarIntersection2Left, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esCarStreetLeft, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esCarStreetRight, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esCarDriveway, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esGroup1, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esGroup2, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esGroup3, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esGroup4, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esGroup5, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esGroup6, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esGroup7, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esGroup8, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esGroup9, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esHouseEnemies, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esPorchEnemies, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esLeftChaseEnemies, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esPoliceCarEndReinforcements, FALSE, FALSE)
CLEANUP_PED_GROUP(psBoatCops, FALSE, FALSE)
CLEANUP_PED_GROUP(psRiverCopCar0Cops, FALSE, FALSE)
CLEANUP_PED_GROUP(psRiverCopCar1Cops, FALSE, FALSE)
CLEANUP_PED_GROUP(psRiverCopCar2Cops, FALSE, FALSE)
CLEANUP_PED_GROUP(psRiverCopCar3Cops, FALSE, FALSE)
CLEANUP_PED_GROUP(psRiverCopCar4Cops, FALSE, FALSE)
CLEANUP_PED_GROUP(psStreetCopCar1Cops, FALSE, FALSE)
CLEANUP_PED_GROUP(psStreetCopCar2Cops, FALSE, FALSE)
CLEANUP_PED_GROUP(psStreetCopCar3Cops, FALSE, FALSE)
CLEANUP_PED_GROUP(psHillCopCar0Cops, FALSE, FALSE)
CLEANUP_VEHICLE_GROUP(vsEnemyCars, FALSE)
CLEANUP_VEHICLE_GROUP(vsParkedVehicles, FALSE)
CLEANUP_VEHICLE_GROUP(vsStreetCopCars, FALSE)
CLEANUP_VEHICLE_GROUP(vsRiverCopCars, FALSE)
CLEANUP_VEHICLE_GROUP(vsHillCopCars, FALSE)
CLEANUP_VEHICLE_GROUP(vsGetawayCars, FALSE)
CLEANUP_ENEMY_GROUP(esSidelineEnemies, TRUE)
CLEANUP_PED_GROUP(psSwat, FALSE, FALSE)
CLEANUP_VEHICLE(vsPoliceHeli, FALSE, FALSE)
CLEANUP_VEHICLE(vsCopBoat, FALSE, FALSE)
STOP_AUDIO_SCENES()
IF DOES_ENTITY_EXIST(vsEnemyLeftChaseCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsEnemyLeftChaseCar.VehicleIndex)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vsEnemyLeftChaseCar.VehicleIndex)
ENDIF
ENDIF
CLEANUP_VEHICLE(vsEnemyLeftChaseCar, FALSE)
CLEANUP_SPAWNPOINTS(EnemySpawnpoints, FALSE)
CLEANUP_SPAWNPOINTS(EnemySidekickSpawnpoints, FALSE)
CLEANUP_MISSION_OBJECT(osBag, FALSE)
CLEANUP_MISSION_OBJECT(osLight, FALSE)
CLEANUP_MISSION_OBJECT(osTrowel, FALSE)
CLEANUP_MISSION_OBJECT(osCamera, FALSE)
CLEANUP_MISSION_OBJECT(osCokeBlock, FALSE)
CLEANUP_MISSION_OBJECT(osMicrophone, FALSE)
CLEANUP_MISSION_OBJECT_GROUP(osDumpsters, FALSE)
//remove blips
IF DOES_BLIP_EXIST(psLamar.BlipIndex)
REMOVE_BLIP(psLamar.BlipIndex)
ENDIF
IF DOES_BLIP_EXIST(psFranklin.BlipIndex)
REMOVE_BLIP(psFranklin.BlipIndex)
ENDIF
IF DOES_BLIP_EXIST(psTrevor.BlipIndex)
REMOVE_BLIP(psTrevor.BlipIndex)
ENDIF
REMOVE_COVERPOINTS(csCoverpoints, bCoverpointsCreated)
//remove waypoint recordings
REMOVE_WAYPOINT_RECORDING("fra1_cflee")
//disable mission vehicle and ped models suppressing
SET_VEHICLE_MODEL_IS_SUPPRESSED(SEASHARK, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_NPC_VEH_MODEL(CHAR_LAMAR), FALSE)
REMOVE_VEHICLE_ASSET(GET_NPC_VEH_MODEL(CHAR_LAMAR))
//enable dispatch services
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, TRUE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
//turn wanted level back to 1.0
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_PED_POPULATION_BUDGET(3)
SET_VEHICLE_POPULATION_BUDGET(3)
REMOVE_SCENARIO_BLOCKING_AREAS()
SET_ALL_VEHICLE_GENERATORS_ACTIVE()
//cleanup audio and sound effects
STOP_SOUND(iPhotoShootSoundID)
RELEASE_SOUND_ID(iPhotoShootSoundID)
RELEASE_NAMED_SCRIPT_AUDIO_BANK("SCRIPT\\FRANKLIN_1_CAMERAS")
RELEASE_NAMED_SCRIPT_AUDIO_BANK("SCRIPT\\FRANKLIN_1_GIRLS")
RELEASE_SCRIPT_AUDIO_BANK()
UNREGISTER_SCRIPT_WITH_AUDIO()
DISABLE_CELLPHONE(FALSE)
DISABLE_TAXI_HAILING(FALSE)
RELEASE_SUPPRESSED_EMERGENCY_CALLS()
ALLOW_DIALOGUE_IN_WATER(FALSE)
REMOVE_IPL("SC1_27_Cut")
TRIGGER_MUSIC_EVENT("FRA1_MISSION_FAIL")
CANCEL_MUSIC_EVENT("FRA1_SPEED")
CLEAR_WEATHER_TYPE_PERSIST()
OVERRIDE_WATER_SETTINGS(FALSE, 5.0)
SET_PLAYER_PED_DATA_IN_CUTSCENES(TRUE, TRUE)
REMOVE_DISPATCH_SPAWN_BLOCKING_AREA(iArea1)
REMOVE_DISPATCH_SPAWN_BLOCKING_AREA(iArea2)
REMOVE_VEHICLE_COMBAT_AVOIDANCE_AREA(iVehCombatArea1)
REMOVE_VEHICLE_COMBAT_AVOIDANCE_AREA(iVehCombatArea2)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_UP, FALSE)
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_DOWN, FALSE)
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", FALSE)
SET_AUDIO_FLAG("DisableAbortConversationForDeathAndInjury", FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished mission cleanup.")
#ENDIF
ENDPROC
PROC INITIALISE_ARRAYS_FOR_COPS()
//grove street cop cars
vsStreetCopCars[COPCAR_STREET_1].vPosition = << -138.6286, -1765.9523, 28.8108 >>
vsStreetCopCars[COPCAR_STREET_1].fHeading = 301.7188
vsStreetCopCars[COPCAR_STREET_1].ModelName = POLICE3
vsStreetCopCars[COPCAR_STREET_1].iRecordingNumber = 015
//end postion after the car recording stops <<-26.7525, -1827.2965, 24.8785>>
//end heading after the car recording stop 284.6982
vsStreetCopCars[COPCAR_STREET_2].vPosition = << -17.0346, -1765.3695, 27.9308 >>
vsStreetCopCars[COPCAR_STREET_2].fHeading = 231.2858
vsStreetCopCars[COPCAR_STREET_2].ModelName = POLICE3
vsStreetCopCars[COPCAR_STREET_2].iRecordingNumber = 016
//end postion after the car recording stops <<-36.1803, -1829.1926, 24.9183>>
//end heading after the car recording stop 161.8743
vsStreetCopCars[COPCAR_STREET_3].vPosition = <<-52.3304, -1720.1871, 28.3354>>
vsStreetCopCars[COPCAR_STREET_3].fHeading = 231.2858
vsStreetCopCars[COPCAR_STREET_3].ModelName = POLICE3
vsStreetCopCars[COPCAR_STREET_3].iRecordingNumber = 603 //018
//end postion after the car recording stops <<-19.9758, -1802.6586, 26.1321>>
//end heading after the car recording stop 200.3464
vsStreetCopCars[COPCAR_STREET_4].vPosition = <<3.8300, -1783.0084, 27.7980>>
vsStreetCopCars[COPCAR_STREET_4].fHeading = 131.2858
vsStreetCopCars[COPCAR_STREET_4].ModelName = POLICE3
vsStreetCopCars[COPCAR_STREET_4].iRecordingNumber = 017
//end postion after the car recording stops <<-54.6234, -1806.0216, 26.1688>>
//end heading after the car recording stop 266.7573
vsStreetCopCars[COPCAR_STREET_5].vPosition = <<3.8300, -1783.0084, 27.7980>>
vsStreetCopCars[COPCAR_STREET_5].fHeading = 131.2858
vsStreetCopCars[COPCAR_STREET_5].ModelName = POLICE3
vsStreetCopCars[COPCAR_STREET_5].iRecordingNumber = 014
//end postion after the car recording stops <<-47.0634, -1810.0951, 25.7914>>
//end heading after the car recording stop 163.2093
//river chase cop cars
vsRiverCopCars[0].vPosition = <<197.1758, -2186.0186, 6.0975>>
vsRiverCopCars[0].fHeading = 93.7542
vsRiverCopCars[0].iRecordingNumber = 701
vsRiverCopCars[0].ModelName = POLICE3
vsRiverCopCars[1].vPosition = <<259.2205, -2114.4358, 15.3720>>
vsRiverCopCars[1].fHeading = 230.7495
vsRiverCopCars[1].iRecordingNumber = 702
vsRiverCopCars[1].ModelName = POLICE3
vsRiverCopCars[2].vPosition = <<510.3493, -2239.6572, 4.9860>>
vsRiverCopCars[2].fHeading = 187.3048
vsRiverCopCars[2].iRecordingNumber = 703
vsRiverCopCars[2].ModelName = POLICE3
vsRiverCopCars[3].vPosition = <<659.7458, -2691.0503, 5.0820>>
vsRiverCopCars[3].fHeading = 36.9602
vsRiverCopCars[3].iRecordingNumber = 704
vsRiverCopCars[2].ModelName = POLICE3
vsRiverCopCars[4].vPosition = <<676.6281, -2509.5039, 18.8334>>
vsRiverCopCars[4].fHeading = 250.7224
vsRiverCopCars[4].ModelName = POLICE3
vsCopBoat.vPosition = <<586.5859, -2493.7842, -10.6828>>
vsCopBoat.fHeading = 204.3793
vsCopBoat.iRecordingNumber = 706
vsCopBoat.ModelName = PREDATOR
vsHillCopCars[0].vPosition = <<1179.0925, -2576.9578, 34.7871>>
vsHillCopCars[0].fHeading = 198.0128
vsHillCopCars[0].ModelName = POLICE3
ENDPROC
PROC INITIALISE_ARRAYS_FOR_FILM_CREW()
vsSpeedophiles[0].vPosition = << -120.1, -1868.2, -0.4 >> //<<-119.5767, -1867.7559, -0.4374>>
vsSpeedophiles[0].fHeading = 230.5773
vsSpeedophiles[0].ModelName = SEASHARK
vsSpeedophiles[1].vPosition = << -124.100, -1864.900, -0.4 >>//<<-123.3175, -1864.3885, -0.4478>>
vsSpeedophiles[1].fHeading = 230.7892
vsSpeedophiles[1].ModelName = SEASHARK
vsSpeedophiles[2].vPosition = << -127.600, -1861.950, -0.4 >>//<<-126.6995, -1861.5201, -0.4478>>
vsSpeedophiles[2].fHeading = 230.0387
vsSpeedophiles[2].ModelName = SEASHARK
psFilmCrew[FCP_JACKEDGIRL].vPosition = << -129.2383, -1864.0924, 0.1382 >>
psFilmCrew[FCP_JACKEDGIRL].fHeading = 30.5089
psFilmCrew[FCP_JACKEDGIRL].ModelName = A_F_Y_BEACH_01
psFilmCrew[FCP_GIRL].vPosition = << -120.6672, -1864.6771, 0.4591 >>
psFilmCrew[FCP_GIRL].fHeading = 101.7921
psFilmCrew[FCP_GIRL].ModelName = A_F_Y_BEACH_01
psFilmCrew[FCP_CLAY].vPosition = << -168.1493, -1844.2439, 0.4590 >>
psFilmCrew[FCP_CLAY].fHeading = 233.1860
psFilmCrew[FCP_CLAY].ModelName = IG_CLAYPAIN
psFilmCrew[FCP_CAMERAMAN].vPosition = << -160.52, -1850.36, 0.46 >>
psFilmCrew[FCP_CAMERAMAN].fHeading = 202.5305
psFilmCrew[FCP_CAMERAMAN].ModelName = S_M_Y_GRIP_01
psFilmCrew[FCP_BOOMMAN].vPosition = << -159.32, -1852.03, 0.46 >>
psFilmCrew[FCP_BOOMMAN].fHeading = 193.2793
psFilmCrew[FCP_BOOMMAN].ModelName = S_M_Y_GRIP_01
osLight.vPosition = <<-128.0000, -1856.1000, 0.4600>>
osLight.vRotation = <<-0.0000, 0.0000, 35.0000>>
osLight.ModelName = PROP_WORKLIGHT_03B
osCamera.vPosition = << -159.36, -1850.97, 1.0 >>
osCamera.vRotation = << 0.0, 0.0, 0.0 >>
osCamera.ModelName = PROP_V_CAM_01
osMicrophone.vPosition = << -158.72, -1852.29, 1.0 >>
osMicrophone.vRotation = << 0.0, 0.0, 0.0 >>
osMicrophone.ModelName = PROP_V_BMIKE_01
osBoombox.vPosition = <<-128.8600, -1857.2000, 0.6950>>
osBoombox.vRotation = << 0.0, 0.0, 69.84 >>
osBoombox.ModelName = PROP_BOOMBOX_01
ENDPROC
PROC INITIALISE_ARRAYS_FOR_PARKED_VEHCILES()
vsParkedVehicles[0].vPosition = << 89.3010, -1920.6060, 19.5927 >>
vsParkedVehicles[0].fHeading = 52.1336
vsParkedVehicles[0].ModelName = EMPEROR2
vsParkedVehicles[1].vPosition = << 41.3838, -1893.4818, 20.8455 >>
vsParkedVehicles[1].fHeading = 231.0601
vsParkedVehicles[1].ModelName = EMPEROR2
vsParkedVehicles[2].vPosition = << 68.0439, -1915.7057, 20.4028 >>
vsParkedVehicles[2].fHeading = 230.4548
vsParkedVehicles[2].ModelName = EMPEROR2
vsParkedVehicles[3].vPosition = << 7.9280, -1865.5116, 22.6563 >>
vsParkedVehicles[3].fHeading = 230.2654
vsParkedVehicles[3].ModelName = EMPEROR2
osDumpsters[0].vPosition = <<71.3600, -1926.9301, 20.0600>>
osDumpsters[0].vRotation = <<0.3000, -2.2000, 140.3800>>
osDumpsters[0].ModelName = P_DUMPSTER_T
osDumpsters[1].vPosition = <<84.9905, -1908.6350, 20.1000>>
osDumpsters[1].vRotation = <<0.0000, 3.2000, -40.6000>>
osDumpsters[1].ModelName = P_DUMPSTER_T
osDumpsters[2].vPosition = <<61.9100, -1919.3700, 20.6300>>
osDumpsters[2].vRotation = <<5.9000, -1.2000, 139.6800>>
osDumpsters[2].ModelName = P_DUMPSTER_T
osDumpsters[3].vPosition = <<56.7225, -1890.2581, 20.5779>>
osDumpsters[3].vRotation = <<2.0000, 0.0000, 25.5600>>
osDumpsters[3].ModelName = P_DUMPSTER_T
osDumpsters[4].vPosition = <<43.1631, -1898.2450, 20.7900>>
osDumpsters[4].vRotation = <<2.0000, 1.5000, -9.0000>>
osDumpsters[4].ModelName = P_DUMPSTER_T
osDumpsters[5].vPosition = <<24.1317, -1883.1240, 21.8523>>
osDumpsters[5].vRotation = <<2.0200, 0.0000, 37.4400>>
osDumpsters[5].ModelName = P_DUMPSTER_T
osDumpsters[6].vPosition = <<13.7830, -1880.9850, 22.2731>>
osDumpsters[6].vRotation = <<-1.5000, -2.2000, -132.1200>>
osDumpsters[6].ModelName = P_DUMPSTER_T
osDumpsters[7].vPosition = <<21.1804, -1860.0050, 22.5200>>
osDumpsters[7].vRotation = <<2.8000, 1.3000, 21.9600>>
osDumpsters[7].ModelName = P_DUMPSTER_T
osDumpsters[8].vPosition = <<3.0904, -1872.0450, 22.7600>>
osDumpsters[8].vRotation = <<1.9000, 0.0000, 49.9400>>
osDumpsters[8].ModelName = P_DUMPSTER_T
ENDPROC
/// PURPOSE:
/// Populates structs and arrays with data such as vectors, model names etc for a specified mission stage.
/// PARAMS:
/// eStage - Mission stage to initialise arrays for.
PROC INITIALISE_ARRAYS_FOR_MISSION_STAGE(MISSION_STAGES eStage)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Initialising arrays for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
INITIALISE_ARRAYS_FOR_COPS()
INITIALISE_ARRAYS_FOR_PARKED_VEHCILES()
osFranklinsDoorDummy.ModelName = V_ILEV_FA_FRONTDOOR
osFranklinsDoorDummy.vPosition = <<-14.8689, -1441.1821, 31.1932>>
osFranklinsDoorDummy.vRotation = << 0.0, 0.0, 0.0 >>
osStripClubDoorDummy.ModelName = PROP_STRIP_DOOR_01
osStripClubDoorDummy.vPosition = << 128.010, -1298.565, 29.425 >>// << 127.960, -1298.515, 29.425 >>//<<127.9413, -1298.4857, 29.4196>>
osStripClubDoorDummy.vRotation = << 0.0, 0.0, 0.0 >>
SWITCH eStage
CASE MISSION_STAGE_CUTSCENE_INTRO
vsVan.vPosition = << -19.1293, -1455.2057, 29.5073 >>
vsVan.fHeading = 94.6991
vsVan.ModelName = GET_NPC_VEH_MODEL(CHAR_LAMAR)
psFranklin.vPosition = <<-14.1001, -1448.9307, 29.6472>>
psFranklin.fHeading = 190.0336
psFranklin.ModelName = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
psTrevor.vPosition = << -18.6223, -1428.4569, 29.6632 >>
psTrevor.fHeading = 177.6198
psTrevor.ModelName = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
psLamar.vPosition = <<-18.0384, -1452.6208, 29.5806>>
psLamar.fHeading = 122.8744
psLamar.ModelName = GET_NPC_PED_MODEL(CHAR_LAMAR)
psChop.vPosition = << -23.2493, -1458.2067, 29.6356 >>
psChop.fHeading = 95.2972
psChop.ModelName = GET_CHOP_MODEL()
osTrowel.vPosition = <<-12.8990, -1446.5100, 29.6976>>
osTrowel.vRotation = <<-93.2400, -0.0000, 40.7000>>
osTrowel.ModelName = PROP_CS_TROWEL
BREAK
CASE MISSION_STAGE_DRIVE_TO_DEAL
vsVan.vPosition = << -19.1293, -1455.2057, 29.5073 >>
vsVan.fHeading = 94.6991
vsVan.ModelName = GET_NPC_VEH_MODEL(CHAR_LAMAR)
psFranklin.vPosition = <<-14.1001, -1448.9307, 29.6472>>
psFranklin.fHeading = 190.0336
psFranklin.ModelName = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
psTrevor.vPosition = << -14.8952, -1455.4774, 29.4390 >>
psTrevor.fHeading = 95.3372
psTrevor.ModelName = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
psLamar.vPosition = <<-18.0384, -1452.6208, 29.5806>>
psLamar.fHeading = 122.8744
psLamar.ModelName = GET_NPC_PED_MODEL(CHAR_LAMAR)
psChop.vPosition = << -23.2493, -1458.2067, 29.6356 >>
psChop.fHeading = 95.2972
psChop.ModelName = GET_CHOP_MODEL()
osBag.ModelName = P_LD_HEIST_BAG_S_1
//bmx crew
vsBmxBikes[0].vPosition = << 83.8966, -1920.0219, 19.8475 >>
vsBmxBikes[0].fHeading = 48.1261
vsBmxBikes[0].ModelName = BMX
vsBmxBikes[0].iRecordingNumber = 25
vsBmxBikes[1].vPosition = << 84.1394, -1921.7198, 19.8443 >>
vsBmxBikes[1].fHeading = 54.4925
vsBmxBikes[1].ModelName = BMX
vsBmxBikes[1].iRecordingNumber = 26
vsBmxBikes[2].vPosition = << 84.9489, -1919.3877, 19.7905 >>
vsBmxBikes[2].fHeading = 51.5015
vsBmxBikes[2].ModelName = BMX
vsBmxBikes[2].iRecordingNumber = 27
psBmxCrew[0].ModelName = G_M_Y_FAMFOR_01
psBmxCrew[1].ModelName = G_M_Y_FAMCA_01
psBmxCrew[2].ModelName = G_M_Y_FAMCA_01
osTrowel.vPosition = <<-12.8990, -1446.5100, 29.6976>>
osTrowel.vRotation = <<-93.2400, -0.0000, 40.7000>>
osTrowel.ModelName = PROP_CS_TROWEL
BREAK
CASE MISSION_STAGE_CUTSCENE_DEAL
vsVan.vPosition = << 95.2699, -1942.2426, 19.7230 >>
vsVan.fHeading = 207.4629
vsVan.ModelName = GET_NPC_VEH_MODEL(CHAR_LAMAR)
psFranklin.vPosition = << 82.7797, -1949.6857, 19.79 >> //<< 82.898, -1949.781, 19.79 >>
psFranklin.fHeading = 319.4117
psFranklin.ModelName = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
psTrevor.vPosition = << 85.02, -1946.93, 19.78 >>
psTrevor.fHeading = 319.4117
psTrevor.ModelName = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
psLamar.vPosition = << 83.7215, -1948.4117, 19.6708 >>
psLamar.fHeading = 319.4117
psLamar.ModelName = GET_NPC_PED_MODEL(CHAR_LAMAR)
psChop.vPosition = <<89.0399, -1957.4697, 19.7474>>
psChop.fHeading = 48.5293
psChop.ModelName = GET_CHOP_MODEL()
osCokeBlock.vPosition = <<85.6152, -1958.0890, 20.1654>>
osCokeBlock.vRotation = << 0.0, 0.0, 153.36 >>
osCokeBlock.ModelName = PROP_COKE_BLOCK_HALF_B
BREAK
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT
vsVan.vPosition = << 95.2699, -1942.2426, 19.7230 >>
vsVan.fHeading = 207.4629
vsVan.ModelName = GET_NPC_VEH_MODEL(CHAR_LAMAR)
psLamar.vPosition = << 83.7215, -1948.4117, 19.6708 >>
psLamar.fHeading = 319.4117
psLamar.ModelName = GET_NPC_PED_MODEL(CHAR_LAMAR)
psTrevor.vPosition = << 85.02, -1946.93, 19.78 >>
psTrevor.fHeading = 319.4117
psTrevor.ModelName = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
psFranklin.vPosition = << 82.7797, -1949.6857, 19.79 >> //<< 82.898, -1949.781, 19.79 >>
psFranklin.fHeading = 319.4117
psFranklin.ModelName = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
psChop.vPosition = << 88.84, -1949.01, 19.74 >>
psChop.fHeading = 29.5409
psChop.ModelName = GET_CHOP_MODEL()
osCokeBlock.vPosition = <<85.6152, -1958.0890, 20.1654>>
osCokeBlock.vRotation = << 0.0, 0.0, 153.36 >>
osCokeBlock.ModelName = PROP_COKE_BLOCK_HALF_B
vsEnemyCars[CAR_CULDESAC].vPosition = << 94.6551, -1857.8273, 23.5068 >>
vsEnemyCars[CAR_CULDESAC].fHeading = 149.4152
vsEnemyCars[CAR_CULDESAC].ModelName = FELON//ORACLE
vsEnemyCars[CAR_CULDESAC].iRecordingNumber = 001
// intersection cars
vsEnemyCars[CAR_INTERSECTION1].vPosition = <<75.8712, -1849.0306, 23.6678>>
vsEnemyCars[CAR_INTERSECTION1].fHeading = 235.5536
vsEnemyCars[CAR_INTERSECTION1].ModelName = FELON
vsEnemyCars[CAR_INTERSECTION1].iRecordingNumber = 600
vsEnemyCars[CAR_INTERSECTION2].vPosition = <<123.8393, -1869.3236, 23.2737>>
vsEnemyCars[CAR_INTERSECTION2].fHeading = 66.8293
vsEnemyCars[CAR_INTERSECTION2].ModelName = FELON
vsEnemyCars[CAR_INTERSECTION2].iRecordingNumber = 601
// another street car
vsEnemyCars[CAR_STREET].vPosition = << -14.3781, -1767.9717, 27.9510 >>
vsEnemyCars[CAR_STREET].fHeading = 233.6783
vsEnemyCars[CAR_STREET].ModelName = ORACLE//FELON
vsEnemyCars[CAR_STREET].iRecordingNumber = 007
//parked car that rolls into the street
vsEnemyCars[CAR_DRIVEWAY].vPosition = << 43.1274, -1850.7629, 21.8317 >>
vsEnemyCars[CAR_DRIVEWAY].fHeading = 139.4681
vsEnemyCars[CAR_DRIVEWAY].ModelName = EMPEROR2
vsEnemyCars[CAR_DRIVEWAY].iRecordingNumber = 009
tbWave2.vStart = <<71.126610,-1938.604248,19.373554>>
tbWave2.vEnd = <<121.538376,-1907.023315,23.434996>>
tbWave2.fWidth = 14.0
#IF IS_DEBUG_BUILD tbWave2.sDebugName = "trigWave2" #ENDIF
tbIntersection.vStart = <<87.8450, -1911.4603, 17.9964>> // lamar will trigger this. if we dont want that, use <<85.0053, -1908.3538, 17.1758>> instead
tbIntersection.vEnd = <<64.6608, -1933.1770, 23.9972>>
tbIntersection.fWidth = 5.0
#IF IS_DEBUG_BUILD tbIntersection.sDebugName = "trigIntersect" #ENDIF
tbWave3.vStart = <<31.576103,-1913.141846,12.644478>>
tbWave3.vEnd = <<72.211205,-1864.884033,27.256504>>
tbWave3.fWidth = 8.0
#IF IS_DEBUG_BUILD tbWave3.sDebugName = "trigWave3" #ENDIF
// copy of parked car (mostly)
tbWave4.vStart = <<50.922531,-1870.579346,20.418753>>//<<19.062645,-1888.295166,20.780989>>
tbWave4.vEnd = <<30.111002,-1895.438965,25.338440>>//<<42.118252,-1860.359741,24.844620>>
tbWave4.fWidth = 8.0
#IF IS_DEBUG_BUILD tbWave4.sDebugName = "trigWave4" #ENDIF
tbWave5.vStart = <<12.8855, -1885.8887, 24.2318>>
tbWave5.vEnd = <<42.7759, -1849.4467, 20.8340>>
tbWave5.fWidth = 8.0
#IF IS_DEBUG_BUILD tbWave5.sDebugName = "trigWave5" #ENDIF
tbParkedCar.vStart = <<50.922531,-1870.579346,20.418753>>
tbParkedCar.vEnd = <<30.111002,-1895.438965,25.338440>>
tbParkedCar.fWidth = 16.0
#IF IS_DEBUG_BUILD tbParkedCar.sDebugName = "trigParkedCar" #ENDIF
tbAlliesToRiver.vStart = <<-44.493145,-1867.814697,23.294022>>
tbAlliesToRiver.vEnd = <<-17.559521,-1835.444336,29.422800>>
tbAlliesToRiver.fWidth = 22.0
#IF IS_DEBUG_BUILD tbAlliesToRiver.sDebugName = "tbAlliesToRiver" #ENDIF
vsEnemyLeftChaseCar.vPosition = <<-63.9716, -1884.2588, 8.4079>>//<< -35.8882, -1900.3604, 9.9100 >>
vsEnemyLeftChaseCar.fHeading = 235.0957//57.5635
vsEnemyLeftChaseCar.ModelName = ORACLE//POLICE3
vsEnemyLeftChaseCar.iRecordingNumber = 58
INITIALISE_ARRAYS_FOR_FILM_CREW()
BREAK
CASE MISSION_STAGE_RUN_TO_SPEEDOPHILES
psLamar.vPosition = <<-26.6284, -1851.1584, 24.6834>>
psLamar.fHeading = 125.7717
psLamar.ModelName = GET_NPC_PED_MODEL(CHAR_LAMAR)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
psTrevor.vPosition = <<-26.9378, -1849.2456, 24.7405>>
psTrevor.fHeading = 129.2849
psTrevor.ModelName = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
psFranklin.vPosition = << -23.5686, -1845.6843, 24.3252 >>
psFranklin.fHeading = 139.5157
psFranklin.ModelName = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
BREAK
CASE CHAR_TREVOR //switch Trevor and Franklin positions for this checkpoint
psFranklin.vPosition = <<-26.9378, -1849.2456, 24.7405>>
psFranklin.fHeading = 129.2849
psFranklin.ModelName = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
psTrevor.vPosition = << -23.5686, -1845.6843, 24.3252 >>
psTrevor.fHeading = 139.5157
psTrevor.ModelName = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
BREAK
ENDSWITCH
vsEnemyLeftChaseCar.vPosition = <<-63.9716, -1884.2588, 8.4079>>//<< -35.8882, -1900.3604, 9.9100 >>
vsEnemyLeftChaseCar.fHeading = 235.0957//57.5635
vsEnemyLeftChaseCar.ModelName = ORACLE//POLICE3
vsEnemyLeftChaseCar.iRecordingNumber = 58
INITIALISE_ARRAYS_FOR_FILM_CREW()
BREAK
CASE MISSION_STAGE_SPEEDOPHILE_RIDE
psFranklin.vPosition = << -113.7057, -1871.0229, 0.5306 >>
psFranklin.fHeading = 142.4835
psFranklin.ModelName = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
psTrevor.vPosition = << -123.1736, -1863.0868, 0.4591 >>
psTrevor.fHeading = 142.4846
psTrevor.ModelName = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
psLamar.vPosition = << -118.2788, -1866.7175, 0.4708 >>
psLamar.fHeading = 142.4846
psLamar.ModelName = GET_NPC_PED_MODEL(CHAR_LAMAR)
vsEnemyLeftChaseCar.vPosition = <<-63.9716, -1884.2588, 8.4079>>//<< -35.8882, -1900.3604, 9.9100 >>
vsEnemyLeftChaseCar.fHeading = 235.0957//57.5635
vsEnemyLeftChaseCar.ModelName = ORACLE//POLICE3
vsEnemyLeftChaseCar.iRecordingNumber = 58
vsPoliceHeli.vPosition = << -48.0368, -2279.3125, -12.2942 >>
vsPoliceHeli.fHeading = 276.3763
vsPoliceHeli.ModelName = POLMAV
vsPoliceHeli.iRecordingNumber = 091
sMissionTrain.iConfiguration = 23
sMissionTrain.vPosition = << 217.36, -2223.17, 11.34 >>
sMissionTrain.ModelName1 = FREIGHT
sMissionTrain.ModelName2 = FREIGHTCAR
sMissionTrain.ModelName3 = FREIGHTCONT1
INITIALISE_ARRAYS_FOR_FILM_CREW()
BREAK
CASE MISSION_STAGE_LOSE_COPS
psFranklin.vPosition = << 696.08569, -2584.13452, 0.15417 >>
psFranklin.fHeading = 236.2914
psFranklin.ModelName = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
psTrevor.vPosition = << 697.13495, -2593.27393, 0.24273 >>
psTrevor.fHeading = 236.2914
psTrevor.ModelName = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
psLamar.vPosition = << 708.53217, -2593.76733, 0.31231 >>
psLamar.fHeading = 236.2914
psLamar.ModelName = GET_NPC_PED_MODEL(CHAR_LAMAR)
vsSpeedophiles[0].vPosition = << 697.13495, -2593.27393, 0.24273 >>
vsSpeedophiles[0].fHeading = 236.2914
vsSpeedophiles[0].ModelName = SEASHARK
vsSpeedophiles[0].iRecordingNumber = 63
vsSpeedophiles[1].vPosition = << 708.53217, -2593.76733, 0.31231 >>
vsSpeedophiles[1].fHeading = 236.2914
vsSpeedophiles[1].ModelName = SEASHARK
vsSpeedophiles[1].iRecordingNumber = 72
vsSpeedophiles[2].vPosition = << 696.08569, -2584.13452, 0.15417 >>
vsSpeedophiles[2].fHeading = 236.2914
vsSpeedophiles[2].ModelName = SEASHARK
vsSpeedophiles[2].iRecordingNumber = 82
vsPoliceHeli.vPosition = << -48.0368, -2279.3125, -12.2942 >>
vsPoliceHeli.fHeading = 276.3763
vsPoliceHeli.ModelName = POLMAV
vsPoliceHeli.iRecordingNumber = 091
BREAK
CASE MISSION_STAGE_CUTSCENE_DROPOFF_LAMAR
psFranklin.vPosition = <<-14.1001, -1448.9307, 29.6472>>
psFranklin.fHeading = 190.0336
psFranklin.ModelName = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
psTrevor.vPosition = << -14.8952, -1455.4774, 29.4390 >>
psTrevor.fHeading = 95.3372
psTrevor.ModelName = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
psLamar.vPosition = <<-18.0384, -1452.6208, 29.5806>>
psLamar.fHeading = 122.8744
psLamar.ModelName = GET_NPC_PED_MODEL(CHAR_LAMAR)
BREAK
CASE MISSION_STAGE_CUTSCENE_DROPOFF_TREVOR
psFranklin.vPosition = <<133.7964, -1312.0645, 28.1227>>
psFranklin.fHeading = 350.3661
psFranklin.ModelName = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
psTrevor.vPosition = <<140.4018, -1312.3334, 28.0595>>
psTrevor.fHeading = 310.2663
psTrevor.ModelName = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
BREAK
CASE MISSION_STAGE_CUTSCENE_DROPOFF_FRANKLIN
psFranklin.vPosition = <<-14.1001, -1448.9307, 29.6472>>
psFranklin.fHeading = 190.0336
psFranklin.ModelName = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
psTrevor.vPosition = << -14.8952, -1455.4774, 29.4390 >>
psTrevor.fHeading = 95.3372
psTrevor.ModelName = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
BREAK
CASE MISSION_STAGE_END
psFranklin.vPosition = <<1176.6774, -3048.6213, 4.9016>>
psFranklin.fHeading = 174.4718
psFranklin.ModelName = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
psTrevor.vPosition = <<1176.6774, -3048.6213, 4.9016>>
psTrevor.fHeading = 174.4718
psTrevor.ModelName = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
BREAK
#IF IS_DEBUG_BUILD
CASE MISSION_STAGE_DEBUG_PLAYBACK_CHASE
psFranklin.vPosition = << -113.7057, -1871.0229, 0.5306 >>
psFranklin.fHeading = 142.4835
psFranklin.ModelName = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
psTrevor.vPosition = << -123.1736, -1863.0868, 0.4591 >>
psTrevor.fHeading = 142.4846
psTrevor.ModelName = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
vsEnemyLeftChaseCar.vPosition = << 87.0173, -2018.3556, 17.1012 >>
vsEnemyLeftChaseCar.fHeading = 9.9813
vsEnemyLeftChaseCar.ModelName = ORACLE
vsSpeedophiles[0].vPosition = << -158.527, -1847.91, 0.051 >>
vsSpeedophiles[0].fHeading = 225.769485
vsSpeedophiles[0].ModelName = SEASHARK
vsSpeedophiles[0].iRecordingNumber = 63
vsSpeedophiles[1].vPosition = << -161.725, -1845.14, 0.051 >>
vsSpeedophiles[1].fHeading = 230.190735
vsSpeedophiles[1].ModelName = SEASHARK
vsSpeedophiles[1].iRecordingNumber = 72
vsSpeedophiles[2].vPosition = << -164.91, -1842.28, 0.051 >>
vsSpeedophiles[2].fHeading = 229.192627
vsSpeedophiles[2].ModelName = SEASHARK
vsSpeedophiles[2].iRecordingNumber = 82
BREAK
CASE MISSION_STAGE_DEBUG_RECORD_CHASE
psFranklin.vPosition = << -113.7057, -1871.0229, 0.5306 >>
psFranklin.fHeading = 142.4835
psFranklin.ModelName = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
psTrevor.vPosition = << -123.1736, -1863.0868, 0.4591 >>
psTrevor.fHeading = 142.4846
psTrevor.ModelName = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
vsGhosts[0].vPosition = << -158.527, -1847.91, 0.051 >>
vsGhosts[0].fHeading = 225.769485
vsGhosts[0].ModelName = SEASHARK
vsGhosts[0].iRecordingNumber = 63
vsGhosts[1].vPosition = << -161.725, -1845.14, 0.051 >>
vsGhosts[1].fHeading = 230.190735
vsGhosts[1].ModelName = SEASHARK
vsGhosts[1].iRecordingNumber = 72
vsGhosts[2].vPosition = << -164.91, -1842.28, 0.051 >>
vsGhosts[2].fHeading = 229.192627
vsGhosts[2].ModelName = SEASHARK
vsGhosts[2].iRecordingNumber = 82
INITIALISE_ARRAYS_FOR_FILM_CREW()
vsSpeedophiles[0].iRecordingNumber = 101//931
vsSpeedophiles[1].iRecordingNumber = 102//922
vsSpeedophiles[2].iRecordingNumber = 103//933
osCamera.vPosition = << -104.15, -1887.18, -0.32 >>
osCamera.vRotation = << 0.0, 0.0, 0.0 >>
osCamera.ModelName = PROP_V_CAM_01
BREAK
#ENDIF
ENDSWITCH
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished initialising arrays for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
ENDPROC
PROC BUILD_REQUEST_BANK_FOR_MISSION_STAGE(MISSION_STAGES eStage)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Building request bank for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
SWITCH eStage
CASE MISSION_STAGE_CUTSCENE_INTRO
//don't request anything here
BREAK
CASE MISSION_STAGE_DRIVE_TO_DEAL
IF NOT DOES_ENTITY_EXIST(vsVan.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsVan.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psLamar.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psLamar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psTrevor.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psTrevor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psChop.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psChop.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
ADD_ANIMATION_REQUEST_TO_ARRAY(GET_CHOP_IN_VAN_ANIM_DICT(), MissionAnimations, MAX_ANIMATIONS, iAnimationsRequested)
ADD_ANIMATION_REQUEST_TO_ARRAY("missfra1_tovan", MissionAnimations, MAX_ANIMATIONS, iAnimationsRequested)
BREAK
CASE MISSION_STAGE_CUTSCENE_DEAL
IF NOT DOES_ENTITY_EXIST(vsVan.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsVan.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psLamar.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psLamar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psTrevor.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psTrevor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psChop.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psChop.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
BREAK
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT
IF NOT DOES_ENTITY_EXIST(vsVan.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsVan.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psLamar.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psLamar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psTrevor.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psTrevor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psChop.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psChop.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(osDumpsters[0].ObjectIndex)
ADD_MODEL_REQUEST_TO_ARRAY(osDumpsters[0].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
REQUEST_WAYPOINT_RECORDING("fra1_cflee")
ADD_MODEL_REQUEST_TO_ARRAY(mnBalla, MissionModels, MAX_MODELS, iModelsRequested)
BREAK
CASE MISSION_STAGE_RUN_TO_SPEEDOPHILES
IF NOT DOES_ENTITY_EXIST(psLamar.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psLamar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psTrevor.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psTrevor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
BREAK
CASE MISSION_STAGE_SPEEDOPHILE_RIDE
IF NOT DOES_ENTITY_EXIST(psLamar.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psLamar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psTrevor.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psTrevor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(vsSpeedophiles[0].VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsSpeedophiles[0].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(vsSpeedophiles[1].VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsSpeedophiles[1].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(vsSpeedophiles[2].VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsSpeedophiles[2].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
ADD_MODEL_REQUEST_TO_ARRAY(mnBalla, MissionModels, MAX_MODELS, iModelsRequested)
ADD_MODEL_REQUEST_TO_ARRAY(vsEnemyLeftChaseCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ADD_CARREC_REQUEST_TO_ARRAY(vsEnemyLeftChaseCar.iRecordingNumber, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
BREAK
CASE MISSION_STAGE_LOSE_COPS
IF NOT DOES_ENTITY_EXIST(psLamar.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psLamar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psTrevor.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psTrevor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(vsSpeedophiles[0].VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsSpeedophiles[0].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(vsSpeedophiles[1].VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsSpeedophiles[1].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(vsSpeedophiles[2].VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsSpeedophiles[2].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
BREAK
CASE MISSION_STAGE_END
//don't request anything here
BREAK
#IF IS_DEBUG_BUILD
CASE MISSION_STAGE_DEBUG_PLAYBACK_CHASE
IF NOT DOES_ENTITY_EXIST(vsSpeedophiles[0].VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsSpeedophiles[0].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(vsSpeedophiles[1].VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsSpeedophiles[1].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(vsSpeedophiles[2].VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsSpeedophiles[2].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
ADD_CARREC_REQUEST_TO_ARRAY(vsSpeedophiles[1].iRecordingNumber, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
BREAK
CASE MISSION_STAGE_DEBUG_RECORD_CHASE
IF NOT DOES_ENTITY_EXIST(vsSpeedophiles[0].VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsSpeedophiles[0].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(vsSpeedophiles[1].VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsSpeedophiles[1].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(vsSpeedophiles[2].VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsSpeedophiles[2].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
ADD_CARREC_REQUEST_TO_ARRAY(vsSpeedophiles[0].iRecordingNumber, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
ADD_CARREC_REQUEST_TO_ARRAY(vsSpeedophiles[1].iRecordingNumber, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
ADD_CARREC_REQUEST_TO_ARRAY(vsSpeedophiles[2].iRecordingNumber, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
ADD_CARREC_REQUEST_TO_ARRAY(vsGhosts[0].iRecordingNumber, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
ADD_CARREC_REQUEST_TO_ARRAY(vsGhosts[1].iRecordingNumber, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
ADD_CARREC_REQUEST_TO_ARRAY(vsGhosts[2].iRecordingNumber, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
BREAK
#ENDIF
ENDSWITCH
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished building request bank for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
ENDPROC
FUNC BOOL IS_MISSION_STAGE_LOADED(MISSION_STAGES eStage, INT &iSetupProgress, BOOL &bStageLoaded, BOOL &bStageSkippedTo, BOOL &bStageReplayed)
//handle initial mission setup
//only run this IF block once, when the mission first loads
IF ( iSetupProgress = 0 )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting initial mission loading.")
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE)
#ENDIF
CLEAR_HELP()
CLEAR_PRINTS()
REQUEST_ADDITIONAL_TEXT("FRAN1", MISSION_TEXT_SLOT)
REQUEST_ADDITIONAL_TEXT("FKN1AUD", MISSION_DIALOGUE_TEXT_SLOT)
WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
WAIT(0)
ENDWHILE
WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_DIALOGUE_TEXT_SLOT)
WAIT(0)
ENDWHILE
SET_WIND(0.1)
SET_WIND_SPEED(0.1)
REGISTER_SCRIPT_WITH_AUDIO(TRUE)
//suppress mission vehicles
SET_VEHICLE_MODEL_IS_SUPPRESSED(SEASHARK, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_NPC_VEH_MODEL(CHAR_LAMAR), TRUE)
//setup relationship groups
ADD_RELATIONSHIP_GROUP("DOG", rgDog)
ADD_RELATIONSHIP_GROUP("BMX", rgBmxCrew)
ADD_RELATIONSHIP_GROUP("ENEMIES", rgEnemies)
ADD_RELATIONSHIP_GROUP("FILMCREW", rgFilmCrew)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, rgEnemies)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, rgEnemies, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, rgDog, rgEnemies)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rgEnemies, rgEnemies)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, RELGROUPHASH_PLAYER, rgFilmCrew)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, rgDog)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rgFilmCrew, rgFilmCrew)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, rgFilmCrew, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rgFilmCrew, rgDog)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rgDog, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rgDog, rgFilmCrew)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, RELGROUPHASH_COP)
//when mission starts get chop behaviour enum from external app
eChopBehaviour = GET_CHOP_BEHAVIOUR_FROM_APP()
iPhotoShootSoundID = GET_SOUND_ID()
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID(), FRA1_DAMAGE)
SET_PLAYER_PED_DATA_IN_CUTSCENES(FALSE, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling SET_PLAYER_PED_DATA_IN_CUTSCENES(FALSE, TRUE).")
#ENDIF
g_ePostFranklin1Switch = POST_FRANKLIN1_NULL
IF ( ScenarioBlockingArea6 = NULL ) //setup Lamar's porch
ScenarioBlockingArea6 = CREATE_SCENARIO_BLOCKING_AREA(<< -62.46, -1451.80, 33.12 >>, << 4.0, 4.0, 3.0 >>)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<< -62.46, -1451.80, 33.12 >>, << 4.0, 4.0, 3.0 >>, FALSE)
REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(<< -62.46, -1451.80, 33.12 >>, << 4.0, 4.0, 3.0 >>)
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished initial mission loading.")
#ENDIF
iSetupProgress++
ENDIF
IF ( iSetupProgress = 1 )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Started mission stage loading for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
INITIALISE_ARRAYS_FOR_MISSION_STAGE(eStage) //initialise arrays for stage entities
CLEANUP_MODEL_ARRAY(MissionModels, iModelsRequested) //cleanup the asset arrays so that they are
CLEANUP_ANIMATION_ARRAY(MissionAnimations, iAnimationsRequested) //ready to be populated with assets needed
CLEANUP_CARREC_ARRAY(sVehicleRecordingsFile, MissionRecordings, iRecordingsRequested) //for the stage being loaded
CLEAR_TRIGGERED_LABELS() //clear triggered text labels
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE ) //reset triggered text labels
sLabelFLAMAR = "FRA1_FLAMAR"
ENDIF
bStageLoaded = FALSE //set stage loaded flag to FALSE
iSetupProgress++
ENDIF
IF ( iSetupProgress = 2 ) //handle player ped position for mission stage skips or retry
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Warping player ped to new position for mission stage being loaded due to skipping or replay.")
#ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
ENDIF
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN )
WARP_PED(PLAYER_PED_ID(), psFranklin.vPosition, psFranklin.fHeading, FALSE, TRUE, FALSE)
ELIF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR )
WARP_PED(PLAYER_PED_ID(), psTrevor.vPosition, psTrevor.fHeading, FALSE, TRUE, FALSE)
ENDIF
IF eStage = MISSION_STAGE_SPEEDOPHILE_RIDE
OR eStage = MISSION_STAGE_LOSE_COPS
OVERRIDE_WATER_SETTINGS(TRUE, 1.0, fOverrideStrength)
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
CLEAR_PED_WETNESS(PLAYER_PED_ID())
CLEAR_PED_DECORATIONS(PLAYER_PED_ID())
CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED_ID())
RESET_PED_VISIBLE_DAMAGE(PLAYER_PED_ID())
RESTORE_PLAYER_PED_TATTOOS(PLAYER_PED_ID())
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
REMOVE_ALL_PICKUPS_OF_TYPE(PICKUP_MONEY_VARIABLE)
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0, TRUE)
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0)
REMOVE_DECALS_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0)
REMOVE_PARTICLE_FX_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
SET_ENTITY_HEALTH(PLAYER_PED_ID(), GET_PED_MAX_HEALTH(PLAYER_PED_ID()))
ENDIF
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
ENDIF
ENDIF
IF ( bStageReplayed = TRUE ) //start replay setup if stage is being retried
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
START_REPLAY_SETUP(psFranklin.vPosition, psFranklin.fHeading)
BREAK
CASE CHAR_TREVOR
START_REPLAY_SETUP(psTrevor.vPosition, psTrevor.fHeading)
BREAK
ENDSWITCH
ENDIF
BUILD_REQUEST_BANK_FOR_MISSION_STAGE(eStage) //request assets needed for current stage
iSetupProgress++
ENDIF
IF ( iSetupProgress = 3 ) //handle loading of mission assets requested in BUILD_REQUEST_BANK_FOR_MISSION_STAGE()
IF ARE_REQUESTED_MODELS_LOADED(MissionModels, iModelsRequested)
IF ARE_REQUESTED_ANIMATIONS_LOADED(MissionAnimations, iAnimationsRequested)
IF ARE_REQUESTED_CARRECS_LOADED(sVehicleRecordingsFile, MissionRecordings, iRecordingsRequested)
iSetupProgress++
ENDIF
ENDIF
ENDIF
ENDIF
//THIS SETUP SECTION ASSUMES THAT ALL REQUIRED ASSETS HAVE BEEN ALREADY LOADED TO MEMORY IN PREVIOUS SETUP SECTIONS
IF ( iSetupProgress = 4 ) //handle creating entities and setting up fail flags
SET_FAIL_FLAGS(FALSE)
SWITCH eStage
CASE MISSION_STAGE_CUTSCENE_INTRO
IF IS_REPEAT_PLAY_ACTIVE() //create mission vehicle on mission repeat play only
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsVan, FALSE, FALSE, CHAR_LAMAR, TRUE, -1, -1, -1, 0, 0 #IF IS_DEBUG_BUILD, "M_Van" #ENDIF)
SET_VEHICLE_AS_RESTRICTED(vsVan.VehicleIndex, 0)
iSetupProgress++
ENDIF
ELSE //move on if repeat play is not active
iSetupProgress++
ENDIF
BREAK
CASE MISSION_STAGE_DRIVE_TO_DEAL
FailFlags[MISSION_FAIL_DEAL_BLOWN] = TRUE
//create van
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsVan, FALSE, FALSE, CHAR_LAMAR, TRUE)
AND HAS_MISSION_OBJECT_BEEN_CREATED(osTrowel, TRUE)
FailFlags[MISSION_FAIL_CAR_DEAD] = TRUE
FailFlags[MISSION_FAIL_CAR_UNDRIVABLE] = TRUE
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(vsVan.VehicleIndex, FRA1_MAX_SPEED)
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(vsVan.VehicleIndex, FRA1_CAR_DAMAGE)
SET_VEHICLE_AS_RESTRICTED(vsVan.VehicleIndex, 0)
//create Lamar
IF HAS_MISSION_PED_BEEN_CREATED(psLamar, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_LAMAR, FALSE, FALSE, FALSE)
FailFlags[MISSION_FAIL_LAMAR_DEAD] = TRUE
FailFlags[MISSION_FAIL_BUDDIES_LEFT_BEHIND] = TRUE
//create Chop
IF HAS_CHOP_BEEN_CREATED(psChop, rgDog, FALSE)
FailFlags[MISSION_FAIL_CHOP_DEAD] = TRUE
FailFlags[MISSION_FAIL_CHOP_DROWNED] = TRUE
//create player peds
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN )
IF HAS_MISSION_PED_BEEN_CREATED(psTrevor, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_TREVOR)
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = psTrevor.PedIndex
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
iSetupProgress++
ENDIF
ELIF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR )
IF HAS_MISSION_PED_BEEN_CREATED(psFranklin, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_FRANKLIN)
sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN] = psFranklin.PedIndex
FailFlags[MISSION_FAIL_FRANKLIN_DEAD] = TRUE
iSetupProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_DEAL
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsVan, FALSE, FALSE, CHAR_LAMAR, TRUE)
IF IS_VEHICLE_DRIVEABLE(vsVan.VehicleIndex)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsVan.VehicleIndex, FALSE)
ENDIF
SET_VEHICLE_AS_RESTRICTED(vsVan.VehicleIndex, 0)
//create Lamar
IF HAS_MISSION_PED_BEEN_CREATED(psLamar, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_LAMAR)
FailFlags[MISSION_FAIL_LAMAR_DEAD] = TRUE
FailFlags[MISSION_FAIL_BUDDIES_LEFT_BEHIND] = TRUE
//create Chop
IF HAS_CHOP_BEEN_CREATED(psChop, rgDog, FALSE)
FailFlags[MISSION_FAIL_CHOP_DEAD] = TRUE
//create player peds
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN )
IF HAS_MISSION_PED_BEEN_CREATED(psTrevor, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_TREVOR)
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = psTrevor.PedIndex
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
iSetupProgress++
ENDIF
ELIF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR )
IF HAS_MISSION_PED_BEEN_CREATED(psFranklin, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_FRANKLIN)
sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN] = psFranklin.PedIndex
FailFlags[MISSION_FAIL_FRANKLIN_DEAD] = TRUE
iSetupProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT
psLamar.ePedVehicle = MAX_SPEEDOPHILES
psFranklin.ePedVehicle = MAX_SPEEDOPHILES
psTrevor.ePedVehicle = MAX_SPEEDOPHILES
psLamar.bVehicleReached = FALSE
psFranklin.bVehicleReached = FALSE
psTrevor.bVehicleReached = FALSE
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsVan, FALSE, FALSE, CHAR_LAMAR, TRUE)
AND HAS_MISSION_VEHICLE_BEEN_CREATED(vsParkedVehicles[0], FALSE, FALSE, NO_CHARACTER, FALSE)
AND HAS_MISSION_VEHICLE_BEEN_CREATED(vsParkedVehicles[1], FALSE, FALSE, NO_CHARACTER, FALSE)
AND HAS_MISSION_VEHICLE_BEEN_CREATED(vsParkedVehicles[2], FALSE, FALSE, NO_CHARACTER, FALSE)
AND HAS_MISSION_VEHICLE_BEEN_CREATED(vsParkedVehicles[3], FALSE, FALSE, NO_CHARACTER, FALSE)
AND HAS_MISSION_OBJECT_BEEN_CREATED(osCokeBlock, TRUE)
IF IS_VEHICLE_DRIVEABLE(vsVan.VehicleIndex)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsVan.VehicleIndex, FALSE)
ENDIF
SET_VEHICLE_AS_RESTRICTED(vsVan.VehicleIndex, 0)
//create Lamar
IF HAS_MISSION_PED_BEEN_CREATED(psLamar, FALSE, RELGROUPHASH_PLAYER, TRUE, CHAR_LAMAR)
FailFlags[MISSION_FAIL_LAMAR_DEAD] = TRUE
FailFlags[MISSION_FAIL_BUDDIES_LEFT_BEHIND] = TRUE
//create Chop
IF HAS_CHOP_BEEN_CREATED(psChop, rgDog, FALSE)
FailFlags[MISSION_FAIL_CHOP_DEAD] = TRUE
//create player peds
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN )
IF HAS_MISSION_PED_BEEN_CREATED(psTrevor, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_TREVOR)
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = psTrevor.PedIndex
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
iSetupProgress++
ENDIF
ELIF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR )
IF HAS_MISSION_PED_BEEN_CREATED(psFranklin, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_FRANKLIN)
sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN] = psFranklin.PedIndex
FailFlags[MISSION_FAIL_FRANKLIN_DEAD] = TRUE
iSetupProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_RUN_TO_SPEEDOPHILES
psLamar.ePedVehicle = MAX_SPEEDOPHILES
psFranklin.ePedVehicle = MAX_SPEEDOPHILES
psTrevor.ePedVehicle = MAX_SPEEDOPHILES
psLamar.bVehicleReached = FALSE
psFranklin.bVehicleReached = FALSE
psTrevor.bVehicleReached = FALSE
//create Lamar
IF HAS_MISSION_PED_BEEN_CREATED(psLamar, FALSE, RELGROUPHASH_PLAYER, TRUE, CHAR_LAMAR)
FailFlags[MISSION_FAIL_LAMAR_DEAD] = TRUE
FailFlags[MISSION_FAIL_BUDDIES_LEFT_BEHIND] = TRUE
//create player peds
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN )
IF HAS_MISSION_PED_BEEN_CREATED(psTrevor, TRUE, RELGROUPHASH_PLAYER, TRUE, CHAR_TREVOR)
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = psTrevor.PedIndex
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
iSetupProgress++
ENDIF
ELIF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR )
IF HAS_MISSION_PED_BEEN_CREATED(psFranklin, TRUE, RELGROUPHASH_PLAYER, TRUE, CHAR_FRANKLIN)
sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN] = psFranklin.PedIndex
FailFlags[MISSION_FAIL_FRANKLIN_DEAD] = TRUE
iSetupProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_SPEEDOPHILE_RIDE
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsSpeedophiles[SPEEDOPHILE_1], FALSE, FALSE, NO_CHARACTER, TRUE, -1, 46, 46, 0, 0 #IF IS_DEBUG_BUILD, "SPEEDOPHILE_1" #ENDIF)
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsSpeedophiles[SPEEDOPHILE_2], FALSE, FALSE, NO_CHARACTER, TRUE, -1, 51, 51, 0, 0 #IF IS_DEBUG_BUILD, "SPEEDOPHILE_2" #ENDIF)
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsSpeedophiles[SPEEDOPHILE_3], FALSE, FALSE, NO_CHARACTER, TRUE, -1, 82, 82, 0, 0 #IF IS_DEBUG_BUILD, "SPEEDOPHILE_3" #ENDIF)
FailFlags[MISSION_FAIL_SPEEDOPHILE_DEAD] = TRUE
FailFlags[MISSION_FAIL_SPEEDOPHILE_UNDRIVABLE] = TRUE
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex)
SET_VEHICLE_RADIO_ENABLED(vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex)
SET_VEHICLE_RADIO_ENABLED(vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex)
SET_VEHICLE_RADIO_ENABLED(vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex, FALSE)
ENDIF
IF HAS_MISSION_PED_BEEN_CREATED(psLamar, FALSE, RELGROUPHASH_PLAYER, TRUE, CHAR_LAMAR, FALSE, FALSE, FALSE)//, vsSpeedophiles[1].VehicleIndex)
FailFlags[MISSION_FAIL_LAMAR_DEAD] = TRUE
FailFlags[MISSION_FAIL_BUDDIES_LOST] = TRUE
FailFlags[MISSION_FAIL_BUDDIES_LEFT_BEHIND] = TRUE
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN )
IF HAS_MISSION_PED_BEEN_CREATED(psTrevor, TRUE, RELGROUPHASH_PLAYER, TRUE, CHAR_TREVOR, FALSE, FALSE, FALSE)//, vsSpeedophiles[0].VehicleIndex)
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = psTrevor.PedIndex
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
iSetupProgress++
ENDIF
ELIF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR )
IF HAS_MISSION_PED_BEEN_CREATED(psFranklin, TRUE, RELGROUPHASH_PLAYER, TRUE, CHAR_FRANKLIN, FALSE, FALSE, FALSE)//, vsSpeedophiles[2].VehicleIndex)
sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN] = psFranklin.PedIndex
FailFlags[MISSION_FAIL_FRANKLIN_DEAD] = TRUE
iSetupProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_LOSE_COPS
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsSpeedophiles[SPEEDOPHILE_1], FALSE, FALSE, NO_CHARACTER, TRUE, -1, 46, 46, 0, 0 #IF IS_DEBUG_BUILD, "SPEEDOPHILE_1" #ENDIF)
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsSpeedophiles[SPEEDOPHILE_2], FALSE, FALSE, NO_CHARACTER, TRUE, -1, 51, 51, 0, 0 #IF IS_DEBUG_BUILD, "SPEEDOPHILE_2" #ENDIF)
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsSpeedophiles[SPEEDOPHILE_3], FALSE, FALSE, NO_CHARACTER, TRUE, -1, 82, 82, 0, 0 #IF IS_DEBUG_BUILD, "SPEEDOPHILE_3" #ENDIF)
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex)
SET_VEHICLE_RADIO_ENABLED(vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex)
SET_VEHICLE_RADIO_ENABLED(vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex)
SET_VEHICLE_RADIO_ENABLED(vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex, FALSE)
ENDIF
//FailFlags[MISSION_FAIL_SPEEDOPHILE_DEAD] = TRUE
//FailFlags[MISSION_FAIL_SPEEDOPHILE_UNDRIVABLE] = TRUE
//what if the player shoots up buddy's speedophile?
IF HAS_MISSION_PED_BEEN_CREATED(psLamar, FALSE, RELGROUPHASH_PLAYER, TRUE, CHAR_LAMAR, FALSE, FALSE, FALSE)//, vsSpeedophiles[1].VehicleIndex)
FailFlags[MISSION_FAIL_LAMAR_DEAD] = TRUE
//FailFlags[MISSION_FAIL_BUDDIES_LEFT_BEHIND] = TRUE
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN )
IF HAS_MISSION_PED_BEEN_CREATED(psTrevor, TRUE, RELGROUPHASH_PLAYER, TRUE, CHAR_TREVOR, FALSE, FALSE, FALSE)//, vsSpeedophiles[0].VehicleIndex)
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = psTrevor.PedIndex
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
iSetupProgress++
ENDIF
ELIF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR )
IF HAS_MISSION_PED_BEEN_CREATED(psFranklin, TRUE, RELGROUPHASH_PLAYER, TRUE, CHAR_FRANKLIN, FALSE, FALSE, FALSE)//, vsSpeedophiles[2].VehicleIndex)
sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN] = psFranklin.PedIndex
FailFlags[MISSION_FAIL_FRANKLIN_DEAD] = TRUE
iSetupProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_DROPOFF_LAMAR
IF HAS_MISSION_PED_BEEN_CREATED(psLamar, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_LAMAR, FALSE, FALSE, FALSE)
FailFlags[MISSION_FAIL_LAMAR_DEAD] = TRUE
iSetupProgress++
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_DROPOFF_TREVOR
CASE MISSION_STAGE_CUTSCENE_DROPOFF_FRANKLIN
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN )
IF HAS_MISSION_PED_BEEN_CREATED(psTrevor, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_TREVOR)
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = psTrevor.PedIndex
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
iSetupProgress++
ENDIF
ELIF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR )
IF HAS_MISSION_PED_BEEN_CREATED(psFranklin, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_FRANKLIN)
sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN] = psFranklin.PedIndex
FailFlags[MISSION_FAIL_FRANKLIN_DEAD] = TRUE
iSetupProgress++
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_END
iSetupProgress++
BREAK
#IF IS_DEBUG_BUILD
CASE MISSION_STAGE_DEBUG_PLAYBACK_CHASE
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsSpeedophiles[1], FALSE, FALSE, NO_CHARACTER, TRUE, -1, 51, 51, 0, 0 #IF IS_DEBUG_BUILD, "1" #ENDIF)
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsEnemyLeftChaseCar, FALSE, FALSe, NO_CHARACTER, TRUE, -1, 51, 51, 0, 0)
IF DOES_ENTITY_EXIST(vsSpeedophiles[1].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsSpeedophiles[1].VehicleIndex)
SET_ENTITY_INVINCIBLE(vsSpeedophiles[1].VehicleIndex, TRUE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsSpeedophiles[0].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsSpeedophiles[0].VehicleIndex)
SET_ENTITY_INVINCIBLE(vsSpeedophiles[0].VehicleIndex, TRUE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsSpeedophiles[2].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsSpeedophiles[2].VehicleIndex)
SET_ENTITY_COLLISION(vsSpeedophiles[2].VehicleIndex, FALSE)
SET_ENTITY_INVINCIBLE(vsSpeedophiles[2].VehicleIndex, TRUE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsEnemyLeftChaseCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsEnemyLeftChaseCar.VehicleIndex)
SET_ENTITY_INVINCIBLE(vsEnemyLeftChaseCar.VehicleIndex, TRUE)
ENDIF
ENDIF
iSetupProgress++
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_DEBUG_RECORD_CHASE
IF HAS_MISSION_OBJECT_BEEN_CREATED(osCamera, TRUE)
IF DOES_ENTITY_EXIST(osCamera.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osCamera.ObjectIndex)
SET_ENTITY_COLLISION(osCamera.ObjectIndex, FALSE)
ENDIF
ENDIF
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsSpeedophiles[1], FALSE, FALSE, NO_CHARACTER, TRUE, -1, 51, 51, 0, 0 #IF IS_DEBUG_BUILD, "1" #ENDIF)
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsSpeedophiles[2], FALSE, FALSE, NO_CHARACTER, TRUE, -1, 82, 82, 0, 0 #IF IS_DEBUG_BUILD, "2" #ENDIF)
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsSpeedophiles[0], FALSE, FALSE, NO_CHARACTER, TRUE, -1, 46, 46, 0, 0 #IF IS_DEBUG_BUILD, "0" #ENDIF)
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsGhosts[1], FALSE, FALSE, NO_CHARACTER, TRUE, -1, 51, 51, 0, 0 #IF IS_DEBUG_BUILD, "1" #ENDIF)
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsGhosts[2], FALSE, FALSE, NO_CHARACTER, TRUE, -1, 82, 82, 0, 0 #IF IS_DEBUG_BUILD, "2" #ENDIF)
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsGhosts[0], FALSE, FALSE, NO_CHARACTER, TRUE, -1, 46, 46, 0, 0 #IF IS_DEBUG_BUILD, "0" #ENDIF)
IF DOES_ENTITY_EXIST(vsSpeedophiles[0].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsSpeedophiles[0].VehicleIndex)
SET_ENTITY_INVINCIBLE(vsSpeedophiles[0].VehicleIndex, TRUE)
//SET_ENTITY_COLLISION(vsSpeedophiles[0].VehicleIndex, FALSE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsSpeedophiles[1].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsSpeedophiles[1].VehicleIndex)
SET_ENTITY_INVINCIBLE(vsSpeedophiles[1].VehicleIndex, TRUE)
//SET_ENTITY_COLLISION(vsSpeedophiles[1].VehicleIndex, FALSE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsSpeedophiles[2].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsSpeedophiles[2].VehicleIndex)
SET_ENTITY_INVINCIBLE(vsSpeedophiles[2].VehicleIndex, TRUE)
//SET_ENTITY_COLLISION(vsSpeedophiles[2].VehicleIndex, FALSE)
ENDIF
ENDIF
//ghosts
IF DOES_ENTITY_EXIST(vsGhosts[0].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsGhosts[0].VehicleIndex)
SET_ENTITY_INVINCIBLE(vsGhosts[0].VehicleIndex, TRUE)
SET_ENTITY_COLLISION(vsGhosts[0].VehicleIndex, FALSE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsGhosts[1].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsGhosts[1].VehicleIndex)
SET_ENTITY_INVINCIBLE(vsGhosts[1].VehicleIndex, TRUE)
SET_ENTITY_COLLISION(vsGhosts[1].VehicleIndex, FALSE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsGhosts[2].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsGhosts[2].VehicleIndex)
SET_ENTITY_INVINCIBLE(vsGhosts[2].VehicleIndex, TRUE)
SET_ENTITY_COLLISION(vsGhosts[2].VehicleIndex, FALSE)
ENDIF
ENDIF
iSetupProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
#ENDIF
ENDSWITCH
IF ( bLamarsOutfitSet = FALSE )
IF DOES_ENTITY_EXIST(psLamar.PedIndex)
IF NOT IS_ENTITY_DEAD(psLamar.PedIndex)
SET_PED_COMPONENT_VARIATION(psLamar.PedIndex, PED_COMP_HEAD, 0, 0)
SET_PED_COMPONENT_VARIATION(psLamar.PedIndex, PED_COMP_BERD, 0, 0)
SET_PED_COMPONENT_VARIATION(psLamar.PedIndex, PED_COMP_HAIR, 0, 0)
SET_PED_COMPONENT_VARIATION(psLamar.PedIndex, PED_COMP_TORSO, 2, 1)
SET_PED_COMPONENT_VARIATION(psLamar.PedIndex, PED_COMP_LEG, 5, 0)
SET_PED_COMPONENT_VARIATION(psLamar.PedIndex, PED_COMP_HAND, 0, 0)
SET_PED_COMPONENT_VARIATION(psLamar.PedIndex, PED_COMP_FEET, 1, 0)
SET_PED_COMPONENT_VARIATION(psLamar.PedIndex, PED_COMP_TEETH, 0, 0)
SET_PED_COMPONENT_VARIATION(psLamar.PedIndex, PED_COMP_SPECIAL, 0, 0)
SET_PED_COMPONENT_VARIATION(psLamar.PedIndex, PED_COMP_DECL, 1, 2)
SWITCH eStage
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT
CASE MISSION_STAGE_RUN_TO_SPEEDOPHILES
CASE MISSION_STAGE_SPEEDOPHILE_RIDE
CASE MISSION_STAGE_LOSE_COPS
IF ( bLamarsBagEquipped = FALSE )
SET_PED_COMPONENT_VARIATION(psLamar.PedIndex, PED_COMP_SPECIAL2, 1, 0) //adds bag
bLamarsBagEquipped = TRUE
ENDIF
BREAK
DEFAULT
SET_PED_COMPONENT_VARIATION(psLamar.PedIndex, PED_COMP_SPECIAL2, 0, 0) //removes bag
BREAK
ENDSWITCH
bLamarsOutfitSet = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//set the bAllowHotSwap flag depending on mission stage
//set the current player ped enum depending on mission stage
//delete the other player ped if mission stage requires only one player ped
IF ( iSetupProgress = 5 )
SWITCH eStage
CASE MISSION_STAGE_CUTSCENE_INTRO
iSetupProgress++
BREAK
CASE MISSION_STAGE_DRIVE_TO_DEAL
CASE MISSION_STAGE_CUTSCENE_DEAL
IF MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Performing script controlled hotswap to Franklin for mission stage being loaded.")
#ENDIF
psTrevor.PedIndex = sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
ENDIF
iSetupProgress++
BREAK
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT
IF MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Performing script controlled hotswap to Franklin for mission stage being loaded.")
#ENDIF
psTrevor.PedIndex = sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
ENDIF
IF HAVE_MISSION_OBJECTS_BEEN_CREATED(osDumpsters)
IF ( bCoverpointsCreated = FALSE )
CREATE_COVERPOINTS(csCoverpoints)
bCoverpointsCreated = TRUE
ENDIF
iSetupProgress++
ENDIF
BREAK
CASE MISSION_STAGE_SPEEDOPHILE_RIDE
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
IF MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Performing script controlled hotswap to Franklin for mission stage being loaded due to skip or replay.")
#ENDIF
ENDIF
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Performing script controlled hotswap to Trevor for mission stage being loaded due to skip or replay.")
#ENDIF
ENDIF
ENDIF
ENDIF
iSetupProgress++
BREAK
CASE MISSION_STAGE_CUTSCENE_DROPOFF_TREVOR
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
IF MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Performing script controlled hotswap to Franklin for mission stage being loaded.")
#ENDIF
psTrevor.PedIndex = sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
ENDIF
ENDIF
iSetupProgress++
BREAK
CASE MISSION_STAGE_CUTSCENE_DROPOFF_FRANKLIN
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
IF MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Performing script controlled hotswap to Trevor for mission stage being loaded.")
#ENDIF
psFranklin.PedIndex = sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]
ENDIF
ENDIF
iSetupProgress++
BREAK
CASE MISSION_STAGE_END
IF ( bEndCoverPointCreated = FALSE )
EndCoverPointIndex = ADD_COVER_POINT(<<1176.6774, -3048.6213, 4.9016>>, 83.0167, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_90, TRUE)
bEndCoverPointCreated = TRUE
ENDIF
iSetupProgress++
BREAK
DEFAULT
iSetupProgress++
BREAK
ENDSWITCH
ENDIF
IF ( iSetupProgress = 6 ) //handle dialogue setup, cellphone and taxi hailing
REMOVE_PED_FOR_DIALOGUE(sFranklin1Conversation, 1) //Franklin
REMOVE_PED_FOR_DIALOGUE(sFranklin1Conversation, 2) //Trevor
REMOVE_PED_FOR_DIALOGUE(sFranklin1Conversation, 3) //Lamar
REMOVE_PED_FOR_DIALOGUE(sFranklin1Conversation, 4) //Balla 1/Balla 4/Girl
REMOVE_PED_FOR_DIALOGUE(sFranklin1Conversation, 5) //Balla 2/Balla 5
REMOVE_PED_FOR_DIALOGUE(sFranklin1Conversation, 6) //Balla 3/Balla 6
REMOVE_PED_FOR_DIALOGUE(sFranklin1Conversation, 7) //Balla 7/Mc Clip
REMOVE_PED_FOR_DIALOGUE(sFranklin1Conversation, 8) //Police/Film Crew
SWITCH eStage
CASE MISSION_STAGE_CUTSCENE_INTRO
CASE MISSION_STAGE_CUTSCENE_DEAL
//do nothing for mocap cutscenes
BREAK
CASE MISSION_STAGE_DRIVE_TO_DEAL
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT
CASE MISSION_STAGE_RUN_TO_SPEEDOPHILES
CASE MISSION_STAGE_SPEEDOPHILE_RIDE
CASE MISSION_STAGE_LOSE_COPS
CASE MISSION_STAGE_CUTSCENE_DROPOFF_LAMAR
CASE MISSION_STAGE_CUTSCENE_DROPOFF_TREVOR
CASE MISSION_STAGE_CUTSCENE_DROPOFF_FRANKLIN
CASE MISSION_STAGE_END
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
ADD_PED_FOR_DIALOGUE(sFranklin1Conversation, 1, GET_PED_INDEX(CHAR_FRANKLIN), "FRANKLIN")
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
ADD_PED_FOR_DIALOGUE(sFranklin1Conversation, 2, GET_PED_INDEX(CHAR_TREVOR), "TREVOR")
ENDIF
IF NOT IS_PED_INJURED(psLamar.PedIndex)
ADD_PED_FOR_DIALOGUE(sFranklin1Conversation, 3, psLamar.PedIndex, "LAMAR")
ENDIF
DISABLE_CELLPHONE(FALSE)
DISABLE_TAXI_HAILING(TRUE)
SUPPRESS_EMERGENCY_CALLS()
BREAK
ENDSWITCH
SWITCH eStage
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT
CASE MISSION_STAGE_RUN_TO_SPEEDOPHILES
CASE MISSION_STAGE_SPEEDOPHILE_RIDE
CASE MISSION_STAGE_LOSE_COPS
ALLOW_DIALOGUE_IN_WATER(TRUE)
BREAK
DEFAULT
ALLOW_DIALOGUE_IN_WATER(FALSE)
BREAK
ENDSWITCH
iSetupProgress++
ENDIF
//handle dispatch services and ped population and wanted depending on current mission stage
//run this each time new mission stage needs to be loaded
IF ( iSetupProgress = 7 )
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_UP, FALSE)
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_DOWN, FALSE)
SWITCH eStage
CASE MISSION_STAGE_CUTSCENE_INTRO
CLEAR_AREA(vGroveStreet, 250.0, TRUE)
CLEAR_AREA_OF_VEHICLES(vGroveStreet, 250.0)
//enable dispatch services
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_CRUISING, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_PULLED_OVER, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_BOAT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, TRUE)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_PED_POPULATION_BUDGET(3)
SET_VEHICLE_POPULATION_BUDGET(3)
IF ( bStageReplayed = TRUE OR bStageSkippedTo = TRUE )
SETUP_ROADS_IN_GROVE_STREET(TRUE, iGroveStreetSetup)
ENDIF
BREAK
CASE MISSION_STAGE_DRIVE_TO_DEAL
CLEAR_AREA(vGroveStreet, 300.0, TRUE)
CLEAR_AREA_OF_VEHICLES(vGroveStreet, 300.0)
//enable dispatch services
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_CRUISING, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_PULLED_OVER, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_BOAT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, TRUE)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_PED_POPULATION_BUDGET(3)
SET_VEHICLE_POPULATION_BUDGET(3)
SET_RANDOM_TRAINS(TRUE)
IF ( bStageReplayed = TRUE OR bStageSkippedTo = TRUE )
SETUP_ROADS_IN_GROVE_STREET(TRUE, iGroveStreetSetup)
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_DEAL
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT
CASE MISSION_STAGE_RUN_TO_SPEEDOPHILES
#IF IS_DEBUG_BUILD
CASE MISSION_STAGE_DEBUG_PLAYBACK_CHASE
CASE MISSION_STAGE_DEBUG_RECORD_CHASE
#ENDIF
SWITCH eStage
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_SHOOTING)
BREAK
ENDSWITCH
//disable dispatch services
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_CRUISING, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_PULLED_OVER, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_BOAT, FALSE)
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, FALSE)
SET_WANTED_LEVEL_MULTIPLIER(0.0)
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
IF ( eStage = MISSION_STAGE_RUN_TO_SPEEDOPHILES )
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 3)
ENDIF
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
ENDIF
SET_PED_POPULATION_BUDGET(0)
SET_VEHICLE_POPULATION_BUDGET(0)
SET_RANDOM_TRAINS(FALSE)
IF ( bStageReplayed = TRUE OR bStageSkippedTo = TRUE )
SETUP_ROADS_IN_GROVE_STREET(TRUE, iGroveStreetSetup)
ENDIF
IF ( ScenarioBlockingArea5 = NULL )
ScenarioBlockingArea5 = CREATE_SCENARIO_BLOCKING_AREA(<< 82.898, -1949.781, 19.79 >>, << 5000.0, 5000.0, 96.0 >>)
ENDIF
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_UP, TRUE)
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_DOWN, TRUE)
BREAK
CASE MISSION_STAGE_SPEEDOPHILE_RIDE
//disable dispatch services
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_CRUISING, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_PULLED_OVER, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_BOAT, FALSE)
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, FALSE)
SET_WANTED_LEVEL_MULTIPLIER(0.0)
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 3)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
ENDIF
SET_PED_POPULATION_BUDGET(3)
SET_VEHICLE_POPULATION_BUDGET(3)
SET_RANDOM_TRAINS(FALSE)
IF ( bStageReplayed = TRUE OR bStageSkippedTo = TRUE )
SETUP_ROADS_IN_GROVE_STREET(TRUE, iGroveStreetSetup)
ENDIF
IF ( ScenarioBlockingArea5 = NULL )
ScenarioBlockingArea5 = CREATE_SCENARIO_BLOCKING_AREA(<< 82.898, -1949.781, 19.79 >>, << 5000.0, 5000.0, 64.0 >>)
ENDIF
IF NOT IS_PED_INJURED(psLamar.PedIndex)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(psLamar.PedIndex, KNOCKOFFVEHICLE_HARD)
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(GET_PED_INDEX(CHAR_TREVOR), KNOCKOFFVEHICLE_HARD)
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), KNOCKOFFVEHICLE_HARD)
ENDIF
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_UP, TRUE)
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_DOWN, TRUE)
BREAK
CASE MISSION_STAGE_LOSE_COPS
//disable dispatch services
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_CRUISING, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_PULLED_OVER, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_BOAT, FALSE)
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, FALSE)
//enable helicopters only
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
SET_WANTED_LEVEL_MULTIPLIER(0.25)
SET_VEHICLE_GENERATOR_AREA_OF_INTEREST(<< 1133.4, -2512.1, 33.2>>, 100.0) //Lamar's side
SET_VEHICLE_GENERATOR_AREA_OF_INTEREST(<< 769.37, -2954.11, 4.84 >>, 100.0) //Franklin's/Trevor's side
iVehCombatArea1 = ADD_VEHICLE_COMBAT_ANGLED_AVOIDANCE_AREA(<<1034.899414,-2649.698242,-2.152824>>, <<1206.040039,-2625.697510,46.102722>>, 96.0)
iVehCombatArea2 = ADD_VEHICLE_COMBAT_ANGLED_AVOIDANCE_AREA(<<1170.989380,-2583.810791,-1.248177>>, <<1184.574097,-2652.445068,42.043415>>, 32.0)
iArea1 = ADD_DISPATCH_SPAWN_ANGLED_BLOCKING_AREA(<<886.251648,-2602.161377,-2.892773>>, <<1278.528931,-2703.511963,17.073622>>, 72.0)
iArea2 = ADD_DISPATCH_SPAWN_ANGLED_BLOCKING_AREA(<<1175.262939,-2587.421387,-0.919907>>, <<1188.792358,-2672.672852,39.559231>>, 24.0)
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 3)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
INSTANTLY_FILL_VEHICLE_POPULATION()
ENDIF
SET_PED_POPULATION_BUDGET(3)
SET_VEHICLE_POPULATION_BUDGET(3)
SET_RANDOM_TRAINS(TRUE)
ePlayerBuddy = PLAYER_BUDDY_NONE
REMOVE_SCENARIO_BLOCKING_AREAS()
IF NOT IS_PED_INJURED(psLamar.PedIndex)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(psLamar.PedIndex, KNOCKOFFVEHICLE_HARD)
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(GET_PED_INDEX(CHAR_TREVOR), KNOCKOFFVEHICLE_HARD)
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), KNOCKOFFVEHICLE_HARD)
ENDIF
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_UP, TRUE)
DISABLE_CHEAT(CHEAT_TYPE_WANTED_LEVEL_DOWN, TRUE)
BREAK
CASE MISSION_STAGE_CUTSCENE_DROPOFF_LAMAR
CASE MISSION_STAGE_CUTSCENE_DROPOFF_TREVOR
CASE MISSION_STAGE_CUTSCENE_DROPOFF_FRANKLIN
CASE MISSION_STAGE_END
//enable dispatch services
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_CRUISING, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_PULLED_OVER, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_BOAT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, TRUE)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SET_PED_POPULATION_BUDGET(3)
SET_VEHICLE_POPULATION_BUDGET(3)
SET_RANDOM_TRAINS(TRUE)
REMOVE_SCENARIO_BLOCKING_AREAS()
SET_VEHICLE_GENERATOR_AREA_OF_INTEREST(<<1145.4602, -3116.7410, 4.8235>>, 100.0)
BREAK
ENDSWITCH
iSetupProgress++
ENDIF
IF ( iSetupProgress = 8 ) //handle load scenes
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
IF ( bStageReplayed = TRUE ) //end setup replay when mission stage is being retried
END_REPLAY_SETUP(NULL, DEFAULT, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling END_REPLAY_SETUP().")
#ENDIF
ELSE //run a new load scene when mission stage is debug skipped to
NEW_LOAD_SCENE_START_SPHERE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 20.0)
#IF IS_DEBUG_BUILD
VECTOR vNewLoadScenePosition = GET_ENTITY_COORDS(PLAYER_PED_ID())
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_START_SPHERE() at coordinates ", vNewLoadScenePosition, " for mission replay or stage skip. This might take a while to load.")
#ENDIF
INT iLoadSceneTimer = GET_GAME_TIMER() + 15000
WHILE IS_NEW_LOAD_SCENE_ACTIVE()
AND NOT IS_NEW_LOAD_SCENE_LOADED()
AND GET_GAME_TIMER() < iLoadSceneTimer
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Load scene timer: ", iLoadSceneTimer - GET_GAME_TIMER(), ".")
#ENDIF
WAIT(0)
ENDWHILE
NEW_LOAD_SCENE_STOP()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP().")
#ENDIF
ENDIF
ENDIF
iSetupProgress++
ENDIF
IF ( iSetupProgress = 9 )
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE ) //stage was skipped to or is being replayed
SWITCH eStage
CASE MISSION_STAGE_SPEEDOPHILE_RIDE
CASE MISSION_STAGE_LOSE_COPS
IF ( g_iFranklin1VehicleChoice = 0 )
psTrevor.ePedVehicle = SPEEDOPHILE_1
psLamar.ePedVehicle = SPEEDOPHILE_2
psFranklin.ePedVehicle = SPEEDOPHILE_3
vsSpeedophiles[psLamar.ePedVehicle].iRecordingNumber = SPEEDOPHILE_RECORDING_FRONT
vsSpeedophiles[psTrevor.ePedVehicle].iRecordingNumber = SPEEDOPHILE_RECORDING_RIGHT
vsSpeedophiles[psFranklin.ePedVehicle].iRecordingNumber = SPEEDOPHILE_RECORDING_LEFT
ELSE
GET_SPEEDOPHILE_POSITIONS_FROM_INT(g_iFranklin1VehicleChoice, psLamar.ePedVehicle, psFranklin.ePedVehicle, psTrevor.ePedVehicle)
vsSpeedophiles[psLamar.ePedVehicle].iRecordingNumber = SPEEDOPHILE_RECORDING_FRONT
vsSpeedophiles[psTrevor.ePedVehicle].iRecordingNumber = SPEEDOPHILE_RECORDING_RIGHT
vsSpeedophiles[psFranklin.ePedVehicle].iRecordingNumber = SPEEDOPHILE_RECORDING_LEFT
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex) AND NOT IS_PED_INJURED(psLamar.PedIndex)
SET_PED_INTO_VEHICLE(psLamar.PedIndex, vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex, VS_DRIVER)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex) AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
SET_PED_INTO_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex, VS_DRIVER)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex) AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
SET_PED_INTO_VEHICLE(GET_PED_INDEX(CHAR_TREVOR), vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex, VS_DRIVER)
ENDIF
BREAK
ENDSWITCH
ENDIF
iSetupProgress++
ENDIF
IF ( iSetupProgress = 10 ) //handle setting up tasks after scene loads
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
SWITCH eStage
CASE MISSION_STAGE_DRIVE_TO_DEAL
IF HAS_ANIM_DICT_LOADED("missfra1_tovan")
IF DOES_ENTITY_EXIST(vsVan.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsVan.VehicleIndex)
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iVanEnterSceneID)
iVanEnterSceneID = CREATE_SYNCHRONIZED_SCENE(<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iVanEnterSceneID, vsVan.VehicleIndex, -1)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iVanEnterSceneID, FALSE)
PLAY_SYNCHRONIZED_ENTITY_ANIM(vsVan.VehicleIndex, iVanEnterSceneID, "put_chop_in_van_van", "missfra1_tovan",
INSTANT_BLEND_IN, INSTANT_BLEND_OUT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_BLOCK_MOVER_UPDATE | SYNCED_SCENE_VEHICLE_ALLOW_PLAYER_ENTRY))
//PLAY_ENTITY_ANIM(vsVan.VehicleIndex, "put_chop_in_van_van", "missfra1_tovan", INSTANT_BLEND_IN,
// FALSE, FALSE, FALSE, 0, ENUM_TO_INT(AF_USE_KINEMATIC_PHYSICS))
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(vsVan.VehicleIndex)
IF DOES_ENTITY_EXIST(psChop.PedIndex)
IF NOT IS_ENTITY_DEAD(psChop.PedIndex)
SET_RAGDOLL_BLOCKING_FLAGS(psChop.PedIndex, RBF_MELEE)
SET_RAGDOLL_BLOCKING_FLAGS(psChop.PedIndex, RBF_EXPLOSION)
SET_RAGDOLL_BLOCKING_FLAGS(psChop.PedIndex, RBF_PLAYER_IMPACT)
TASK_SYNCHRONIZED_SCENE(psChop.PedIndex, iVanEnterSceneID, "missfra1_tovan",
"put_chop_in_van_chop", 1, SLOW_BLEND_OUT,
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT,
RBF_MELEE | RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psChop.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psChop.PedIndex, TRUE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
IF NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
SET_RAGDOLL_BLOCKING_FLAGS(psTrevor.PedIndex, RBF_MELEE)
SET_RAGDOLL_BLOCKING_FLAGS(psTrevor.PedIndex, RBF_PLAYER_IMPACT)
TASK_SYNCHRONIZED_SCENE(psTrevor.PedIndex, iVanEnterSceneID, "missfra1_tovan",
"put_chop_in_van_lam", 1, SLOW_BLEND_OUT,
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT,
RBF_MELEE | RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psTrevor.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psTrevor.PedIndex, TRUE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(psLamar.PedIndex)
IF IS_VEHICLE_DRIVEABLE(vsVan.VehicleIndex)
TASK_ENTER_VEHICLE(psLamar.PedIndex, vsVan.VehicleIndex, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT, PEDMOVE_WALK, ECF_USE_RIGHT_ENTRY | ECF_RESUME_IF_INTERRUPTED)
FORCE_PED_MOTION_STATE(psLamar.PedIndex, MS_ON_FOOT_WALK)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SEQUENCE_INDEX PlayerPedSequence
OPEN_SEQUENCE_TASK(PlayerPedSequence)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -14.25, -1454.61, 29.48 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -14.99, -1456.87, 29.41 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -18.12, -1456.95, 29.46 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT)
CLOSE_SEQUENCE_TASK(PlayerPedSequence)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), PlayerPedSequence)
CLEAR_SEQUENCE_TASK(PlayerPedSequence)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK)
ENDIF
WAIT(500)
iSetupProgress++
ENDIF
ENDIF
ENDIF
ELSE
REQUEST_ANIM_DICT("missfra1_tovan")
ENDIF
BREAK
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT
REQUEST_MODEL(mnBalla)
REQUEST_WEAPON_ASSET(WEAPONTYPE_SMG)
REQUEST_WEAPON_ASSET(WEAPONTYPE_MICROSMG)
REQUEST_WEAPON_ASSET(WEAPONTYPE_PUMPSHOTGUN)
REQUEST_WEAPON_ASSET(WEAPONTYPE_ASSAULTRIFLE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Waiting for weapon assets to load for MISSION_STAGE_GROVE_STREET_SHOOTOUT.")
#ENDIF
IF NOT IS_PED_INJURED(psLamar.PedIndex)
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
IF HAS_MODEL_LOADED(mnBalla)
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_SMG)
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_MICROSMG)
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_PUMPSHOTGUN)
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_ASSAULTRIFLE)
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(psLamar.PedIndex)
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(GET_PED_INDEX(CHAR_TREVOR))
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(GET_PED_INDEX(CHAR_FRANKLIN))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Weapon assets loaded for MISSION_STAGE_GROVE_STREET_SHOOTOUT.")
#ENDIF
IF NOT DOES_ENTITY_EXIST(esGroup1[0].PedIndex)
esGroup1[0].PedIndex = CREATE_ENEMY_PED(mnBalla, vGroup1Enemy0Position, fGroup1Enemy0Heading, rgEnemies, WEAPONTYPE_MICROSMG, 125)
TASK_AIM_GUN_AT_COORD(esGroup1[0].PedIndex, vGroup1EnemyAimCoords, -1, TRUE)
ENDIF
IF NOT DOES_ENTITY_EXIST(esGroup1[1].PedIndex)
esGroup1[1].PedIndex = CREATE_ENEMY_PED(mnBalla, <<81.7639, -1904.2952, 20.5794>>, 142.1008, rgEnemies, WEAPONTYPE_MICROSMG, 125)
ENDIF
IF NOT DOES_ENTITY_EXIST(esGroup1[2].PedIndex)
esGroup1[2].PedIndex = CREATE_ENEMY_PED(mnBalla, <<79.4749, -1908.1135, 20.3492>>, 169.8566, rgEnemies, WEAPONTYPE_MICROSMG, 125)
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
WARP_PED(GET_PED_INDEX(CHAR_FRANKLIN), psFranklin.vPosition, psFranklin.fHeading, FALSE, FALSE, FALSE)
GIVE_WEAPON_TO_PED(GET_PED_INDEX(CHAR_FRANKLIN), WEAPONTYPE_SMG, GET_AMMO_IN_PED_WEAPON(GET_PED_INDEX(CHAR_FRANKLIN), WEAPONTYPE_SMG) * 2, TRUE)
TASK_PUT_PED_DIRECTLY_INTO_COVER(GET_PED_INDEX(CHAR_FRANKLIN), csCoverpoints[0].vPosition, -1, FALSE, 0, TRUE, FALSE, csCoverpoints[0].CoverpointIndex)
FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_PED_INDEX(CHAR_FRANKLIN), TRUE)
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
WARP_PED(GET_PED_INDEX(CHAR_TREVOR), psTrevor.vPosition, psTrevor.fHeading, FALSE, FALSE, FALSE)
GIVE_WEAPON_TO_PED(GET_PED_INDEX(CHAR_TREVOR), WEAPONTYPE_PUMPSHOTGUN, GET_AMMO_IN_PED_WEAPON(GET_PED_INDEX(CHAR_TREVOR), WEAPONTYPE_PUMPSHOTGUN) * 2, TRUE)
TASK_PUT_PED_DIRECTLY_INTO_COVER(GET_PED_INDEX(CHAR_TREVOR), csCoverpoints[2].vPosition, -1, FALSE, 0, TRUE, FALSE, csCoverpoints[2].CoverpointIndex)
FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_PED_INDEX(CHAR_TREVOR))
ENDIF
IF NOT IS_PED_INJURED(psLamar.PedIndex)
WARP_PED(psLamar.PedIndex, psLamar.vPosition, psLamar.fHeading, FALSE, FALSE, FALSE)
GIVE_WEAPON_TO_PED(psLamar.PedIndex, WEAPONTYPE_ASSAULTRIFLE, INFINITE_AMMO, TRUE)
TASK_PUT_PED_DIRECTLY_INTO_COVER(psLamar.PedIndex, csCoverpoints[1].vPosition, -1, FALSE, 0, TRUE, FALSE, csCoverpoints[1].CoverpointIndex)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psLamar.PedIndex)
ENDIF
GO_TO_PED_STATE(psLamar, PED_STATE_COMBAT_ON_FOOT)
GO_TO_PED_STATE(psTrevor, PED_STATE_COMBAT_ON_FOOT)
WAIT(500)
iSetupProgress++
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_RUN_TO_SPEEDOPHILES
REQUEST_MODEL(POLICE3)
REQUEST_MODEL(S_M_Y_COP_01)
REQUEST_WEAPON_ASSET(WEAPONTYPE_SMG)
REQUEST_WEAPON_ASSET(WEAPONTYPE_PUMPSHOTGUN)
REQUEST_WEAPON_ASSET(WEAPONTYPE_ASSAULTRIFLE)
IF ( eFranklinsFailWeapon <> WEAPONTYPE_INVALID )
AND ( eFranklinsFailWeapon <> WEAPONTYPE_UNARMED )
REQUEST_WEAPON_ASSET(eFranklinsFailWeapon)
ENDIF
IF ( eTrevorsFailWeapon <> WEAPONTYPE_INVALID )
AND ( eTrevorsFailWeapon <> WEAPONTYPE_UNARMED )
REQUEST_WEAPON_ASSET(eTrevorsFailWeapon)
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Waiting for weapon assets to load for MISSION_STAGE_RUN_TO_SPEEDOPHILES.")
#ENDIF
IF HAS_MODEL_LOADED(POLICE3)
AND HAS_MODEL_LOADED(S_M_Y_COP_01)
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_SMG)
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_PUMPSHOTGUN)
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_ASSAULTRIFLE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Weapon assets loaded for MISSION_STAGE_RUN_TO_SPEEDOPHILES.")
#ENDIF
INT i
vsStreetCopCars[COPCAR_STREET_1].VehicleIndex = CREATE_VEHICLE(POLICE3, <<-26.7525, -1827.2965, 24.8785>>, 284.6982)
vsStreetCopCars[COPCAR_STREET_2].VehicleIndex = CREATE_VEHICLE(POLICE3, <<-36.1803, -1829.1926, 24.9183>>, 161.8743)
vsStreetCopCars[COPCAR_STREET_3].VehicleIndex = CREATE_VEHICLE(POLICE3, <<-19.9758, -1802.6586, 26.1321>>, 200.3464)
REPEAT 3 i
SET_VEHICLE_SIREN(vsStreetCopCars[i].VehicleIndex, TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsStreetCopCars[i].VehicleIndex, FALSE)
ENDREPEAT
psStreetCopCar1Cops[0].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex, PEDTYPE_COP, mnCop, VS_DRIVER)
psStreetCopCar1Cops[1].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex, PEDTYPE_COP, mnCop, VS_FRONT_RIGHT)
psStreetCopCar2Cops[0].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex, PEDTYPE_COP, mnCop, VS_DRIVER)
psStreetCopCar2Cops[1].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex, PEDTYPE_COP, mnCop, VS_FRONT_RIGHT)
psStreetCopCar3Cops[0].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex, PEDTYPE_COP, mnCop, VS_DRIVER)
psStreetCopCar3Cops[1].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex, PEDTYPE_COP, mnCop, VS_FRONT_RIGHT)
bCopWaveSpawned = TRUE
GO_TO_PED_STATE(psStreetCopCar1Cops[0], PED_STATE_COMBAT_ON_FOOT)
GO_TO_PED_STATE(psStreetCopCar1Cops[1], PED_STATE_COMBAT_ON_FOOT)
GO_TO_PED_STATE(psStreetCopCar2Cops[0], PED_STATE_COMBAT_ON_FOOT)
GO_TO_PED_STATE(psStreetCopCar2Cops[1], PED_STATE_COMBAT_ON_FOOT)
GO_TO_PED_STATE(psStreetCopCar3Cops[0], PED_STATE_COMBAT_ON_FOOT)
GO_TO_PED_STATE(psStreetCopCar3Cops[1], PED_STATE_COMBAT_ON_FOOT)
SET_MODEL_AS_NO_LONGER_NEEDED(POLICE)
SET_MODEL_AS_NO_LONGER_NEEDED(S_M_Y_COP_01)
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
//check for Trevor's fail weapon
IF ( eTrevorsFailWeapon = WEAPONTYPE_INVALID )
OR ( eTrevorsFailWeapon = WEAPONTYPE_UNARMED )
eTrevorsFailWeapon = GET_BEST_PED_WEAPON(GET_PED_INDEX(CHAR_TREVOR), TRUE)
IF ( eTrevorsFailWeapon = WEAPONTYPE_INVALID )
OR ( eTrevorsFailWeapon = WEAPONTYPE_UNARMED )
eTrevorsFailWeapon = WEAPONTYPE_PUMPSHOTGUN //if fail weapon is invalid or unarmed, give scripted weapon
ENDIF
ENDIF
INT iAmmo
//check for ammo in currently given weapon, add 2 clips if player has no ammo (replay_controller stores ammo on checkpoints)
IF ( GET_AMMO_IN_PED_WEAPON(GET_PED_INDEX(CHAR_TREVOR), eTrevorsFailWeapon) < GET_MAX_AMMO_IN_CLIP(GET_PED_INDEX(CHAR_TREVOR), eTrevorsFailWeapon) )
iAmmo = GET_MAX_AMMO_IN_CLIP(GET_PED_INDEX(CHAR_TREVOR), eTrevorsFailWeapon) * 2
ENDIF
//give fail weapon (or specific script weapon) to Trevor, adds 0 if Trevor had more than 1 clip of bullets
GIVE_WEAPON_TO_PED(GET_PED_INDEX(CHAR_TREVOR), eTrevorsFailWeapon, iAmmo, TRUE)
ENDIF
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
//check for Franklin's fail weapon
IF ( eFranklinsFailWeapon = WEAPONTYPE_INVALID )
OR ( eFranklinsFailWeapon = WEAPONTYPE_UNARMED )
eFranklinsFailWeapon = GET_BEST_PED_WEAPON(GET_PED_INDEX(CHAR_FRANKLIN), TRUE)
IF ( eFranklinsFailWeapon = WEAPONTYPE_INVALID )
OR ( eFranklinsFailWeapon = WEAPONTYPE_UNARMED )
eFranklinsFailWeapon = WEAPONTYPE_SMG //if fail weapon is invalid or unarmed, give scripted weapon
ENDIF
ENDIF
INT iAmmo
//check for ammo in currently given weapon, add 2 clips if player has no ammo (replay_controller stores ammo on checkpoints)
IF ( GET_AMMO_IN_PED_WEAPON(GET_PED_INDEX(CHAR_FRANKLIN), eFranklinsFailWeapon) < GET_MAX_AMMO_IN_CLIP(GET_PED_INDEX(CHAR_FRANKLIN), eFranklinsFailWeapon) )
iAmmo = GET_MAX_AMMO_IN_CLIP(GET_PED_INDEX(CHAR_FRANKLIN), eFranklinsFailWeapon) * 2
ENDIF
//give fail weapon (or specific script weapon) to Franklin, adds 0 if Franklin had more than 1 clip of bullets
GIVE_WEAPON_TO_PED(GET_PED_INDEX(CHAR_FRANKLIN), eFranklinsFailWeapon, iAmmo, TRUE)
ENDIF
IF NOT IS_PED_INJURED(psLamar.PedIndex)
GIVE_WEAPON_TO_PED(psLamar.PedIndex, WEAPONTYPE_ASSAULTRIFLE, INFINITE_AMMO, TRUE)
TASK_FOLLOW_NAV_MESH_TO_COORD(psLamar.PedIndex, <<-115.4358, -1861.7389, 1.2639>>, PEDMOVE_RUN)
FORCE_PED_MOTION_STATE(psLamar.PedIndex, MS_ON_FOOT_RUN)
SET_PED_USING_ACTION_MODE(psLamar.PedIndex, TRUE)
ENDIF
IF NOT IS_PED_INJURED(GET_OTHER_PLAYER_PED_INDEX())
TASK_FOLLOW_NAV_MESH_TO_COORD(GET_OTHER_PLAYER_PED_INDEX(), <<-114.8476, -1864.9554, 0.4774>>, PEDMOVE_RUN)
FORCE_PED_MOTION_STATE(GET_OTHER_PLAYER_PED_INDEX(), MS_ON_FOOT_RUN)
SET_PED_USING_ACTION_MODE(GET_OTHER_PLAYER_PED_INDEX(), TRUE)
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_RUN)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_RUN, 3000)
ENDIF
GO_TO_PED_STATE(psLamar, PED_STATE_RUNNING_TO_RIVER)
GO_TO_PED_STATE(psTrevor, PED_STATE_RUNNING_TO_RIVER)
WAIT(500)
iSetupProgress++
ENDIF
BREAK
CASE MISSION_STAGE_SPEEDOPHILE_RIDE
REQUEST_MODEL(mnBalla)
REQUEST_MODEL(vsEnemyLeftChaseCar.ModelName)
REQUEST_VEHICLE_RECORDING(vsEnemyLeftChaseCar.iRecordingNumber, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(vsSpeedophiles[SPEEDOPHILE_1].iRecordingNumber, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(vsSpeedophiles[SPEEDOPHILE_2].iRecordingNumber, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(vsSpeedophiles[SPEEDOPHILE_3].iRecordingNumber, sVehicleRecordingsFile)
IF ( g_bFranklin1GirlFled = FALSE AND DOES_ENTITY_EXIST(psFilmCrew[FCP_JACKEDGIRL].PedIndex))
OR ( g_bFranklin1GirlFled = TRUE )
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(vsSpeedophiles[SPEEDOPHILE_1].iRecordingNumber, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsSpeedophiles[SPEEDOPHILE_2].iRecordingNumber, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsSpeedophiles[SPEEDOPHILE_3].iRecordingNumber, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsEnemyLeftChaseCar.iRecordingNumber, sVehicleRecordingsFile)
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex, vsSpeedophiles[psLamar.ePedVehicle].iRecordingNumber, sVehicleRecordingsFile)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex, 5500.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex, vsSpeedophiles[psTrevor.ePedVehicle].iRecordingNumber, sVehicleRecordingsFile)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex, 5500.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex, vsSpeedophiles[psFranklin.ePedVehicle].iRecordingNumber, sVehicleRecordingsFile)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex, 5500.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex)
ENDIF
GO_TO_PED_STATE(psLamar, PED_STATE_STARTING_RECORDING_PLAYBACK)
GO_TO_PED_STATE(psTrevor, PED_STATE_STARTING_RECORDING_PLAYBACK)
GO_TO_PED_STATE(psFranklin, PED_STATE_STARTING_RECORDING_PLAYBACK)
WAIT(500)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
iSetupProgress++
ENDIF
ELSE
IF ( g_bFranklin1GirlFled = FALSE )
IF HAS_MISSION_PED_BEEN_CREATED(psFilmCrew[FCP_JACKEDGIRL], FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE, FALSE, vsSpeedophiles[0].VehicleIndex, VS_FRONT_RIGHT)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_JACKEDGIRL].PedIndex, PED_COMP_HEAD, 1, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_JACKEDGIRL].PedIndex, PED_COMP_HAIR, 1, 1, 0) //(hair)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_JACKEDGIRL].PedIndex, PED_COMP_TORSO, 0, 5, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_JACKEDGIRL].PedIndex, PED_COMP_LEG, 0, 5, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_JACKEDGIRL].PedIndex, PED_COMP_SPECIAL, 1, 0, 0) //(accs)
#IF IS_DEBUG_BUILD
psFilmCrew[FCP_JACKEDGIRL].sDebugName = "FCP_JACKEDGIRL"
#ENDIF
GO_TO_PED_STATE(psFilmCrew[FCP_JACKEDGIRL], PED_STATE_SITTING_IN_VEHICLE)
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_LOSE_COPS
REQUEST_MODEL(POLMAV)
REQUEST_MODEL(POLICE3)
REQUEST_MODEL(S_M_Y_COP_01)
REQUEST_MODEL(S_M_Y_SWAT_01)
REQUEST_VEHICLE_RECORDING(vsPoliceHeli.iRecordingNumber, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(vsSpeedophiles[SPEEDOPHILE_1].iRecordingNumber, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(vsSpeedophiles[SPEEDOPHILE_2].iRecordingNumber, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(vsSpeedophiles[SPEEDOPHILE_3].iRecordingNumber, sVehicleRecordingsFile)
IF HAS_MODEL_LOADED(POLMAV)
AND HAS_MODEL_LOADED(POLICE3)
AND HAS_MODEL_LOADED(S_M_Y_COP_01)
AND HAS_MODEL_LOADED(S_M_Y_SWAT_01)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsPoliceHeli.iRecordingNumber, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsSpeedophiles[SPEEDOPHILE_1].iRecordingNumber, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsSpeedophiles[SPEEDOPHILE_2].iRecordingNumber, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsSpeedophiles[SPEEDOPHILE_3].iRecordingNumber, sVehicleRecordingsFile)
//setup police helicopter
INT i
vsPoliceHeli.VehicleIndex = CREATE_VEHICLE(POLMAV, vsPoliceHeli.vPosition, vsPoliceHeli.fHeading)
psSwat[0].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsPoliceHeli.VehicleIndex, PEDTYPE_COP, S_M_Y_SWAT_01, VS_DRIVER)
psSwat[1].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsPoliceHeli.VehicleIndex, PEDTYPE_COP, S_M_Y_SWAT_01, VS_BACK_LEFT)
psSwat[2].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsPoliceHeli.VehicleIndex, PEDTYPE_COP, S_M_Y_SWAT_01, VS_BACK_RIGHT)
FOR i = 0 TO 2
GIVE_WEAPON_TO_PED(psSwat[i].PedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO, FALSE)
GIVE_WEAPON_TO_PED(psSwat[i].PedIndex, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, FALSE)
SET_PED_HEARING_RANGE(psSwat[i].PedIndex, 150)
SET_PED_SEEING_RANGE(psSwat[i].PedIndex, 150)
SET_PED_ID_RANGE(psSwat[i].PedIndex, 150)
SET_PED_HIGHLY_PERCEPTIVE(psSwat[i].PedIndex, TRUE)
SET_PED_SHOOT_RATE(psSwat[i].PedIndex, 50)
SET_PED_ACCURACY(psSwat[i].PedIndex, 5)
ENDFOR
SET_VEHICLE_LIVERY(vsPoliceHeli.VehicleIndex, 0)
START_PLAYBACK_RECORDED_VEHICLE(vsPoliceHeli.VehicleIndex, vsPoliceHeli.iRecordingNumber, sVehicleRecordingsFile)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsPoliceHeli.VehicleIndex, 51025.0)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsPoliceHeli.VehicleIndex, TRUE)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsPoliceHeli.VehicleIndex)
SET_HELI_BLADES_FULL_SPEED(vsPoliceHeli.VehicleIndex)
//setup police squads by the river
vsRiverCopCars[3].VehicleIndex = CREATE_VEHICLE(POLICE3, << 625.9272, -2607.0547, 5.0864 >>, 286.7750)
psRiverCopCar3Cops[0].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsRiverCopCars[3].VehicleIndex, PEDTYPE_COP, S_M_Y_COP_01, VS_DRIVER)
psRiverCopCar3Cops[1].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsRiverCopCars[3].VehicleIndex, PEDTYPE_COP, S_M_Y_COP_01, VS_FRONT_RIGHT)
SET_VEHICLE_SIREN(vsRiverCopCars[3].VehicleIndex, TRUE)
//give weapons to cop peds
SET_PED_AS_COP(psRiverCopCar3Cops[0].PedIndex)
SET_PED_AS_COP(psRiverCopCar3Cops[1].PedIndex)
GIVE_WEAPON_TO_PED(psRiverCopCar3Cops[0].PedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO)
GIVE_WEAPON_TO_PED(psRiverCopCar3Cops[1].PedIndex, WEAPONTYPE_PUMPSHOTGUN, INFINITE_AMMO)
vsRiverCopCars[4].VehicleIndex = CREATE_VEHICLE(POLICE3, vsRiverCopCars[4].vPosition, vsRiverCopCars[4].fHeading)
psRiverCopCar4Cops[0].PedIndex = CREATE_PED(PEDTYPE_COP, S_M_Y_COP_01, <<693.4204, -2529.8364, 11.4264>>, 115.3417)
psRiverCopCar4Cops[1].PedIndex = CREATE_PED(PEDTYPE_COP, S_M_Y_COP_01, <<691.3856, -2529.0046, 11.4266>>, 103.4375)
//give weapons to cop peds
GIVE_WEAPON_TO_PED(psRiverCopCar4Cops[0].PedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO)
GIVE_WEAPON_TO_PED(psRiverCopCar4Cops[1].PedIndex, WEAPONTYPE_PUMPSHOTGUN, INFINITE_AMMO)
SET_VEHICLE_SIREN(vsRiverCopCars[4].VehicleIndex, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(POLMAV)
SET_MODEL_AS_NO_LONGER_NEEDED(POLICE3)
SET_MODEL_AS_NO_LONGER_NEEDED(S_M_Y_COP_01)
SET_MODEL_AS_NO_LONGER_NEEDED(S_M_Y_SWAT_01)
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex, vsSpeedophiles[psLamar.ePedVehicle].iRecordingNumber, sVehicleRecordingsFile)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex, 73000.0)
SET_PLAYBACK_SPEED(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex, 0.8)
vsSpeedophiles[psLamar.ePedVehicle].fPlaybackSpeed = 0.8
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex, vsSpeedophiles[psTrevor.ePedVehicle].iRecordingNumber, sVehicleRecordingsFile)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex, 73000.0)
SET_PLAYBACK_SPEED(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex, 0.8)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex, vsSpeedophiles[psFranklin.ePedVehicle].iRecordingNumber, sVehicleRecordingsFile)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex, 73000.0)
SET_PLAYBACK_SPEED(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex, 0.8)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex)
ENDIF
GO_TO_PED_STATE(psSwat[0], PED_STATE_RECORDING_PLAYBACK)
GO_TO_PED_STATE(psRiverCopCar0Cops[0], PED_STATE_FLEEING)
GO_TO_PED_STATE(psRiverCopCar1Cops[0], PED_STATE_FLEEING)
GO_TO_PED_STATE(psRiverCopCar2Cops[0], PED_STATE_FLEEING)
GO_TO_PED_STATE(psRiverCopCar3Cops[0], PED_STATE_COMBAT_ON_FOOT)
GO_TO_PED_STATE(psRiverCopCar4Cops[0], PED_STATE_COMBAT_ON_FOOT)
GO_TO_PED_STATE(psLamar, PED_STATE_ENDING_RECORDING_PLAYBACK)
GO_TO_PED_STATE(psFranklin, PED_STATE_ENDING_RECORDING_PLAYBACK)
GO_TO_PED_STATE(psTrevor, PED_STATE_ENDING_RECORDING_PLAYBACK)
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 3)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
UPDATE_WANTED_POSITION_THIS_FRAME(PLAYER_ID())
ENDIF
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), TRUE)
SET_CREATE_RANDOM_COPS(TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
WAIT(500)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
iSetupProgress++
ENDIF
BREAK
DEFAULT
iSetupProgress++
BREAK
ENDSWITCH
ELSE
iSetupProgress++
ENDIF
ENDIF
IF ( iSetupProgress = 11 ) //handle music events for mission stage retry and handle fade in when screen was faded out
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
IF ( bGameplayCameraSet = FALSE )
SWITCH eStage
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-9.077)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(17.0 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
BREAK
DEFAULT
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
BREAK
ENDSWITCH
bGameplayCameraSet = TRUE
ENDIF
SWITCH eStage //handle music events
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT
TRIGGER_MUSIC_EVENT("FRA1_FIGHT_RESTART")
BREAK
CASE MISSION_STAGE_RUN_TO_SPEEDOPHILES
TRIGGER_MUSIC_EVENT("FRA1_FIGHT_LEAVE_RESTART")
BREAK
CASE MISSION_STAGE_SPEEDOPHILE_RIDE
CASE MISSION_STAGE_LOSE_COPS
TRIGGER_MUSIC_EVENT("FRA1_SPEED_RESTART")
BREAK
ENDSWITCH
SWITCH eStage //handle screen fade in
CASE MISSION_STAGE_CUTSCENE_INTRO
CASE MISSION_STAGE_CUTSCENE_DEAL
CASE MISSION_STAGE_CUTSCENE_DROPOFF_LAMAR
CASE MISSION_STAGE_CUTSCENE_DROPOFF_TREVOR
CASE MISSION_STAGE_CUTSCENE_DROPOFF_FRANKLIN
CASE MISSION_STAGE_END
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Halting loading screen fade in for skip to a mission stage that will fade the screen in.")
#ENDIF
BREAK
DEFAULT
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling a loading screen fade in.")
#ENDIF
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(FADE_TIME)
ENDIF
BREAK
ENDSWITCH
ENDIF
SWITCH eStage //handle audio scenes
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT
IF NOT IS_AUDIO_SCENE_ACTIVE("FRANKLIN_1_SHOOTOUT_MAIN")
START_AUDIO_SCENE("FRANKLIN_1_SHOOTOUT_MAIN")
ENDIF
BREAK
CASE MISSION_STAGE_RUN_TO_SPEEDOPHILES
IF NOT IS_AUDIO_SCENE_ACTIVE("FRANKLIN_1_APPROACH_RIVER")
START_AUDIO_SCENE("FRANKLIN_1_APPROACH_RIVER")
ENDIF
BREAK
CASE MISSION_STAGE_SPEEDOPHILE_RIDE
IF NOT IS_AUDIO_SCENE_ACTIVE("FRANKLIN_1_JETSKI_START")
START_AUDIO_SCENE("FRANKLIN_1_JETSKI_START")
ENDIF
BREAK
CASE MISSION_STAGE_LOSE_COPS
IF NOT IS_AUDIO_SCENE_ACTIVE("FRANKLIN_1_JETSKI_HELI_ESCAPE")
START_AUDIO_SCENE("FRANKLIN_1_JETSKI_HELI_ESCAPE")
ENDIF
BREAK
ENDSWITCH
iSetupProgress++
ENDIF
IF ( iSetupProgress = 12 ) //handle setting of mid-mission replay checkpoints
SWITCH eStage
CASE MISSION_STAGE_DRIVE_TO_DEAL
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_DRIVE_TO_DEAL), "DRIVE TO DEAL", FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_DRIVE_TO_DEAL), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_GROVE_STREET_SHOOTOUT), "GROVE STREET SHOOTOUT", FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_GROVE_STREET_SHOOTOUT), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
CASE MISSION_STAGE_RUN_TO_SPEEDOPHILES
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_RUN_TO_SPEEDOPHILES), "RUN TO SPEEDOPHILES", FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_RUN_TO_SPEEDOPHILES), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
CASE MISSION_STAGE_SPEEDOPHILE_RIDE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_SPEEDOPHILE_RIDE), "SPEEDOPHILE RIDE", FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_SPEEDOPHILE_RIDE), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
CASE MISSION_STAGE_LOSE_COPS
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_LOSE_COPS), "LOSE COPS", TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_LOSE_COPS), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
ENDSWITCH
iSetupProgress++
ENDIF
IF ( iSetupProgress = 13 )
SWITCH eStage
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT
CASE MISSION_STAGE_RUN_TO_SPEEDOPHILES
CASE MISSION_STAGE_SPEEDOPHILE_RIDE
bAllowHotSwap = TRUE
BREAK
DEFAULT
bAllowHotSwap = FALSE
BREAK
ENDSWITCH
iSetupProgress++
ENDIF
IF ( iSetupProgress = 14 )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished mission stage loading for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
//reset the stage reset flag
#IF IS_DEBUG_BUILD
bStageResetFlag = FALSE
#ENDIF
bStageLoaded = TRUE
bStageReplayed = FALSE
bStageSkippedTo = FALSE
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
iSetupProgress++
ENDIF
IF ( iSetupProgress = 15 )
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
//|======================== END MISSION STAGE LOADINGS PROCEDURES ========================|
//|====================== VEHICLE RECORDING PROCEDURES & FUNCTIONS =======================|
/// PURPOSE:
/// Returns the percentage progress of a vehicle recording.
/// PARAMS:
/// VehicleIndex - Vehicle index to get the vehicle recording percentage.
/// RETURNS:
/// Float number from 0.0 to 100.0 representing percentage of vehicle recording in progress.
/// AUTHOR:
/// Ross Wallace
FUNC FLOAT GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(VEHICLE_INDEX VehicleIndex #IF IS_DEBUG_BUILD, BOOL bPrintRecordingTime = FALSE #ENDIF)
IF DOES_ENTITY_EXIST(VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(VehicleIndex)
RECORDING_ID RecordingID = GET_CURRENT_PLAYBACK_FOR_VEHICLE(VehicleIndex)
#IF IS_DEBUG_BUILD
INT iPercentage = ROUND( 100.0 * ( GET_TIME_POSITION_IN_RECORDING(VehicleIndex) / GET_TOTAL_DURATION_OF_VEHICLE_RECORDING_ID(RecordingID) ) )
TEXT_LABEL_63 debugName = GET_VEHICLE_RECORDING_NAME(RecordingID)
debugName += ":"
debugName += iPercentage
SET_VEHICLE_NAME_DEBUG(VehicleIndex, debugName)
//PRINTLN(GET_THIS_SCRIPT_NAME(), ": Recording ", GET_VEHICLE_RECORDING_NAME(RecordingID), " playback percentage ", 100.0 * ( GET_TIME_POSITION_IN_RECORDING(VehicleIndex) / GET_TOTAL_DURATION_OF_VEHICLE_RECORDING_ID(RecordingID) ) )
#ENDIF
#IF IS_DEBUG_BUILD
IF ( bPrintRecordingTime = TRUE )
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Recording ", GET_VEHICLE_RECORDING_NAME(RecordingID), " time is ", GET_TIME_POSITION_IN_RECORDING(VehicleIndex), ".")
ENDIF
#ENDIF
RETURN ( 100.0 * ( GET_TIME_POSITION_IN_RECORDING(VehicleIndex) / GET_TOTAL_DURATION_OF_VEHICLE_RECORDING_ID(RecordingID) ) )
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE_PROGRESS: Playback not going on for vehicle.")
#ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE_PROGRESS: Vehicle does not exist or is not driveable.")
#ENDIF
ENDIF
RETURN -1.0
ENDFUNC
PROC START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(VEH_STRUCT vsCar, STRING sFileName, FLOAT fPlaybackSpeed, BOOL bPaused = FALSE,
FLOAT fTime = 0.0, BOOL bSkipToVehiclePosition = FALSE, BOOL bUseFlags = FALSE,
INT iFlags = SWITCH_ON_PLAYER_VEHICLE_IMPACT)
IF IS_VEHICLE_DRIVEABLE(vsCar.VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsCar.VehicleIndex)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(vsCar.iRecordingNumber, sFileName)
SET_VEHICLE_ENGINE_ON(vsCar.VehicleIndex, TRUE, TRUE)
IF ( bUseFlags = FALSE )
START_PLAYBACK_RECORDED_VEHICLE(vsCar.VehicleIndex, vsCar.iRecordingNumber, sFileName)
ELIF ( bUseFlags = TRUE )
START_PLAYBACK_RECORDED_VEHICLE_WITH_FLAGS(vsCar.VehicleIndex, vsCar.iRecordingNumber, sFileName, iFlags)
ENDIF
IF ( fTime > 0.0 )
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsCar.VehicleIndex, fTime)
ELIF ( bSkipToVehiclePosition = TRUE )
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsCar.VehicleIndex, GET_CLOSEST_TIME_POSITION_IN_RECORDING_TO_POINT(GET_ENTITY_COORDS(vsCar.VehicleIndex), vsCar.iRecordingNumber, sFileName, 16))
ENDIF
SET_PLAYBACK_SPEED(vsCar.VehicleIndex, fPlaybackSpeed)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Vehicle recording ", sFileName, " number ", vsCar.iRecordingNumber, " for vehicle ", GET_MODEL_NAME_FOR_DEBUG(vsCar.ModelName), " started with playback speed ", fPlaybackSpeed, ".")
#ENDIF
IF ( bPaused = TRUE )
PAUSE_PLAYBACK_RECORDED_VEHICLE(vsCar.VehicleIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Vehicle recording ", sFileName, " number ", vsCar.iRecordingNumber, " for vehicle ", GET_MODEL_NAME_FOR_DEBUG(vsCar.ModelName), " paused.")
#ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Vehicle recording number ", vsCar.iRecordingNumber, " for vehicle ", GET_MODEL_NAME_FOR_DEBUG(vsCar.ModelName), " is not loaded.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Starts a vehicle recording using AI if it is not in progress already.
/// PARAMS:
/// vsVehicle - VEH_STRUCT containing details of the vehicle to play recording for (stores recording number as well).
/// sFileName - Vehicle recording file name.
/// fCruiseSpeed - Speed of the recording playback.
PROC START_VEHICLE_RECORDING_PLAYBACK_USING_AI_FOR_VEHICLE(VEH_STRUCT vsVehicle, STRING sFileName, FLOAT fCruiseSpeed = 10.0, DRIVINGMODE eDrivingMode = DRIVINGMODE_AVOIDCARS)
IF IS_VEHICLE_DRIVEABLE(vsVehicle.VehicleIndex)
IF NOT IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(vsVehicle.VehicleIndex)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(vsVehicle.iRecordingNumber, sFileName)
START_PLAYBACK_RECORDED_VEHICLE_USING_AI(vsVehicle.VehicleIndex, vsVehicle.iRecordingNumber, sFileName, fCruiseSpeed, eDrivingMode)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Vehicle recording ", sFileName, " number ", vsVehicle.iRecordingNumber, " for vehicle ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " started using AI with cruise speed ", fCruiseSpeed, ".")
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Vehicle recording number ", vsVehicle.iRecordingNumber, " for vehicle ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " is not loaded.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if a recording playback is going on for a vehicle or vehicle driver was killed when recording playback was going on for vehicle.
/// PARAMS:
/// VehicleIndex - Vehicle to check for playback or dead driver during playback.
/// fPlaybackPercentage - Outputs the playback percentage going on for the specified vehicle.
/// bDriverDead - Outputs if the driver of the specified vehicle was killed when playback was going of the vehicle.
/// RETURNS:
/// TRUE if recording playback is going on for vehicle or the driver was killed during an ongoing playback, FALSE if otherwise.
FUNC BOOL IS_VEHICLE_RECORDING_PLAYBACK_RUNNING_OR_DRIVER_DEAD(VEHICLE_INDEX VehicleIndex, FLOAT &fPlaybackPercentage, BOOL &bDriverDead,
BOOL bStopPlaybackOnDriversDeath = TRUE)
IF DOES_ENTITY_EXIST(VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(VehicleIndex)
fPlaybackPercentage = GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(VehicleIndex)
PED_INDEX DriverPedIndex
DriverPedIndex = GET_PED_IN_VEHICLE_SEAT(VehicleIndex, VS_DRIVER)
IF DOES_ENTITY_EXIST(DriverPedIndex)
IF IS_PED_INJURED(DriverPedIndex)
bDriverDead = TRUE
IF ( bStopPlaybackOnDriversDeath = TRUE )
STOP_PLAYBACK_RECORDED_VEHICLE(VehicleIndex)
ENDIF
ENDIF
ENDIF
RETURN TRUE
ELSE
IF ( bDriverDead = TRUE )
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
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 RUBBER_BAND_PLAYBACK_SPEED_FOR_TRIGGER_VEHICLE(VEHICLE_INDEX TriggerVehicleIndex, VEHICLE_INDEX VehicleIndex, FLOAT &fCurrentPlaybackSpeed,
FLOAT fCurrentPlaybackTime
#IF IS_DEBUG_BUILD, BOOL bPrintOutput = FALSE, STRING sTriggerVehicleDebugName = NULL,
STRING sVehicleDebugName = NULL #ENDIF)
IF IS_VEHICLE_DRIVEABLE(TriggerVehicleIndex)
AND IS_VEHICLE_DRIVEABLE(VehicleIndex)
VECTOR vTriggerVehiclePosition = GET_ENTITY_COORDS(TriggerVehicleIndex)
VECTOR vVehiclePosition = GET_ENTITY_COORDS(VehicleIndex)
FLOAT fDistance = GET_DISTANCE_BETWEEN_COORDS(vTriggerVehiclePosition, vVehiclePosition)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(TriggerVehicleIndex, GET_STRING_FROM_FLOAT(fDistance), 2.5)
#ENDIF
FLOAT fCloseDistance = 5.0
FLOAT fIdealDistance = 10.0
FLOAT fMaxDistance = 17.5 //20.0
FLOAT fSuperMaxDistance = 50.0
FLOAT fDesiredPlaybackSpeed = 1.0
VECTOR vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(TriggerVehicleIndex, vVehiclePosition)
IF ( vOffset.y > 1.0 ) //trigger vehicle is behind the vehicle, need to increase recording playback speed
#IF IS_DEBUG_BUILD
IF ( bPrintOutput = TRUE )
PRINTLN(GET_THIS_SCRIPT_NAME(), ": ", sTriggerVehicleDebugName, " vehicle is behind ", sVehicleDebugName, " vehicle.")
ENDIF
#ENDIF
IF ( fDistance > fSuperMaxDistance )
fDesiredPlaybackSpeed = 5.0
ELIF ( fDistance > fMaxDistance )
fDesiredPlaybackSpeed = 4.0
ELIF ( fDistance > fIdealDistance )
fDesiredPlaybackSpeed = 3.0
ELSE
fDesiredPlaybackSpeed = 2.5
ENDIF
ELSE //trigger vehicle is front of the vehicle, lower recording playback speed when needed
#IF IS_DEBUG_BUILD
IF ( bPrintOutput = TRUE )
PRINTLN(GET_THIS_SCRIPT_NAME(), ": ", sTriggerVehicleDebugName, " vehicle is in front of ", sVehicleDebugName, " vehicle.")
ENDIF
#ENDIF
IF ( fDistance > fSuperMaxDistance )
IF fCurrentPlaybackTime < 30000.0
fDesiredPlaybackSpeed = 0.5 //0.55
ELSE
fDesiredPlaybackSpeed = 0.4 //0.55
ENDIF
ELIF ( fDistance > fMaxDistance )
fDesiredPlaybackSpeed = 0.75 //0.8 //1.0
ELIF ( fDistance > fIdealDistance )
fDesiredPlaybackSpeed = 1.0 //1.85
ELIF ( fDistance > fCloseDistance )
fDesiredPlaybackSpeed = 1.25 //1.65
ELSE
fDesiredPlaybackSpeed = 1.35
ENDIF
ENDIF
//if player is trying to cut off buddies by going under the bridge, fix for B*1917187
IF IS_ENTITY_AT_COORD(VehicleIndex, <<347.608215,-2354.942627,9.179920>>,<<36.000000,64.000000,10.000000>>)
fDesiredPlaybackSpeed += 0.25
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player vehicle going under the bridge.")
ENDIF
CONVERGE_VALUE(fCurrentPlaybackSpeed, fDesiredPlaybackSpeed, 0.01, TRUE)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(TriggerVehicleIndex, GET_STRING_FROM_FLOAT(fCurrentPlaybackSpeed), 3.0)
#ENDIF
ENDIF
ENDPROC
//|==================== END VEHICLE RECORDING PROCEDURES & FUNCTIONS =====================|
//|============================ COMBAT PROCEDURES & FUNCTIONS ============================|
FUNC BOOL CAN_GET_CLOSEST_COVERPOINT_FOR_PED(PED_INDEX PedIndex, COVERPOINT_STRUCT &sArray[], COVERPOINT_STRUCT &sResult,
BOOL bCheckForPlayerPed = FALSE, FLOAT fPlayerDistance = 3.0,
BOOL bPreferCoverPoints = FALSE)
INT i = 0
FLOAT fShortestDistance = 1000.0
FLOAT fCurrentDistance = 0.0
INT iClosestCoverpoint = -1
PED_INDEX ClosestPed
IF NOT IS_PED_INJURED(PedIndex)
FOR i = 0 TO ( COUNT_OF(sArray) - 1 )
IF ( sArray[i].bActive = TRUE )
//check if there is no other ped there
IF NOT GET_CLOSEST_PED(sArray[i].vPosition, fPlayerDistance, FALSE, TRUE, ClosestPed)
IF ( bPreferCoverPoints = FALSE )
fCurrentDistance = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PedIndex), sArray[i].vPosition)
IF ( fCurrentDistance < fShortestDistance)
IF ( bCheckForPlayerPed = TRUE)
IF ( GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), sArray[i].vPosition) > fPlayerDistance)
fShortestDistance = fCurrentDistance
iClosestCoverpoint = i
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_GET_CLOSEST_COVERPOINT_FOR_PED() Player ped is within the distance of the selected active coverpoint with index ", i, ".")
#ENDIF
ENDIF
ELIF ( bCheckForPlayerPed = FALSE )
fShortestDistance = fCurrentDistance
iClosestCoverpoint = i
ENDIF
ENDIF
ELIF ( bPreferCoverPoints = TRUE )
IF ( sArray[i].bStationary = FALSE )
fCurrentDistance = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PedIndex), sArray[i].vPosition)
IF ( fCurrentDistance < fShortestDistance)
IF ( bCheckForPlayerPed = TRUE)
IF ( GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), sArray[i].vPosition) > fPlayerDistance)
fShortestDistance = fCurrentDistance
iClosestCoverpoint = i
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_GET_CLOSEST_COVERPOINT_FOR_PED() Player ped is within the distance of the selected active coverpoint with index ", i, ".")
#ENDIF
ENDIF
ELIF ( bCheckForPlayerPed = FALSE )
fShortestDistance = fCurrentDistance
iClosestCoverpoint = i
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
ENDIF
IF ( iClosestCoverpoint = -1 )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_GET_CLOSEST_COVERPOINT_FOR_PED() No active coverpoints found. Check your scripted coverpoints, fShortestDistance or ped's state.")
#ENDIF
RETURN FALSE
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_GET_CLOSEST_COVERPOINT_FOR_PED() Found closest active coverpoint from coverpoint array at index ", iClosestCoverpoint, ".")
#ENDIF
sResult = sArray[iClosestCoverpoint]
#IF IS_DEBUG_BUILD
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PedIndex), sArray[iClosestCoverpoint].vPosition, 0, 255, 0)
#ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Finds the closest ped from a specified relationship group for specified ped.
/// PARAMS:
/// PedIndex - Ped to scan for nearby peds.
/// rgHash - Relationship group to search for.
/// RETURNS:
/// PED_INDEX of the closest ped from the specified relationship group.
FUNC PED_INDEX GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(PED_INDEX PedIndex, REL_GROUP_HASH rgHash, INT iProximity = 0, BOOL bOnScreen = FALSE
#IF IS_DEBUG_BUILD, INT iRed = 0, INT iGreen = 255, INT iBlue = 0 #ENDIF)
PED_INDEX pedArray[16]
INT i = 0
IF NOT IS_PED_INJURED(PedIndex)
GET_PED_NEARBY_PEDS(PedIndex, pedArray, PEDTYPE_ANIMAL)
FOR i = 0 TO ( COUNT_OF(pedArray) - 1 )
IF DOES_ENTITY_EXIST(pedArray[i])
IF NOT IS_PED_INJURED(pedArray[i])
IF ( GET_PED_RELATIONSHIP_GROUP_HASH(pedArray[i]) = rgHash )
IF ( iProximity <= 0)
IF ( bOnScreen = TRUE )
IF IS_ENTITY_ON_SCREEN(pedArray[i])
#IF IS_DEBUG_BUILD
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PedIndex), GET_ENTITY_COORDS(pedArray[i]), iRed, iGreen, iBlue)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Closest nearby ped on screen has index ", i, ".")
#ENDIF
RETURN pedArray[i]
ENDIF
ELSE
#IF IS_DEBUG_BUILD
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PedIndex), GET_ENTITY_COORDS(pedArray[i]), iRed, iGreen, iBlue)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Closest nearby ped has index ", i, ".")
#ENDIF
RETURN pedArray[i]
ENDIF
ELSE
IF ( i + iProximity <= COUNT_OF(pedArray) - 1 )
IF DOES_ENTITY_EXIST(pedArray[i + iProximity])
IF NOT IS_PED_INJURED(pedArray[i + iProximity])
IF ( GET_PED_RELATIONSHIP_GROUP_HASH(pedArray[i + iProximity]) = rgHash )
IF ( bOnScreen = TRUE )
IF IS_ENTITY_ON_SCREEN(pedArray[i + iProximity])
#IF IS_DEBUG_BUILD
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PedIndex), GET_ENTITY_COORDS(pedArray[i + iProximity]), iRed, iGreen, iBlue)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Nearby ped on screen offset by ", iProximity, " from closest nearby ped has index ", i + iProximity, ".")
#ENDIF
RETURN pedArray[i + iProximity]
ENDIF
ELSE
#IF IS_DEBUG_BUILD
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PedIndex), GET_ENTITY_COORDS(pedArray[i + iProximity]), iRed, iGreen, iBlue)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Nearby ped offset by ", iProximity, " from closest nearby ped has index ", i + iProximity, ".")
#ENDIF
RETURN pedArray[i + iProximity]
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
ENDIF
RETURN NULL
ENDFUNC
PROC INITIALISE_ENEMY_GROUP(ENEMY_STRUCT &esEnemies[], BOOL bAddBlips = TRUE #IF IS_DEBUG_BUILD, STRING sDebugGroupName = NULL #ENDIF)
INT i = 0
FOR i = 0 TO ( COUNT_OF(esEnemies) - 1 )
IF NOT IS_PED_INJURED(esEnemies[i].PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esEnemies[i].PedIndex, TRUE)
IF ( bAddBlips = TRUE )
IF NOT DOES_BLIP_EXIST(esEnemies[i].BlipIndex)
esEnemies[i].BlipIndex = CREATE_BLIP_FOR_ENTITY(esEnemies[i].PedIndex, TRUE)
ENDIF
ENDIF
esEnemies[i].bCreated = TRUE
#IF IS_DEBUG_BUILD
IF NOT Is_String_Null_Or_Empty(sDebugGroupName)
TEXT_LABEL_31 tlDebugName = sDebugGroupName
tlDebugName += i
SET_PED_NAME_DEBUG(esEnemies[i].PedIndex, tlDebugName)
esEnemies[i].sDebugName = tlDebugName
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Initialised enemy ped with debug name ", tlDebugName, ".")
ENDIF
#ENDIF
ENDIF
ENDFOR
ENDPROC
PROC TASK_ENEMY_GROUP_COMBAT_HATED_PEDS(ENEMY_STRUCT &esEnemies[])
INT i = 0
FOR i = 0 TO ( COUNT_OF(esEnemies) - 1 )
IF NOT IS_PED_INJURED(esEnemies[i].PedIndex)
//can charge changes
SET_PED_COMBAT_ATTRIBUTES(esEnemies[i].PedIndex, CA_CAN_FLANK, FALSE)
SET_PED_COMBAT_ATTRIBUTES(esEnemies[i].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esEnemies[i].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esEnemies[i].PedIndex, 3000)
ENDIF
ENDFOR
ENDPROC
PROC UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(ENEMY_STRUCT &array[], BOOL bRenderBlip = TRUE)
INT i
FOR i = 0 TO ( COUNT_OF(array) - 1 )
IF ( bRenderBlip = TRUE )
UPDATE_AI_PED_BLIP(array[i].PedIndex, array[i].EnemyBlipData, -1, NULL, FALSE, FALSE, 500)
ELSE
CLEANUP_AI_PED_BLIP(array[i].EnemyBlipData)
ENDIF
ENDFOR
ENDPROC
PROC SET_PED_COMBAT_PROPERTIES(PED_INDEX pedIndex, COMBAT_MOVEMENT eCombatMovement, COMBAT_ABILITY_LEVEL eCombatAbilityLevel,
COMBAT_RANGE eCombatRange, COMBAT_ATTRIBUTE eCombatAttributes, BOOL bCanRagdoll = TRUE)
IF NOT IS_PED_INJURED(pedIndex)
SET_PED_TARGET_LOSS_RESPONSE(pedIndex, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_MOVEMENT(pedIndex, eCombatMovement)
SET_PED_COMBAT_ABILITY(pedIndex, eCombatAbilityLevel)
SET_PED_COMBAT_RANGE(pedIndex, eCombatRange)
SET_PED_COMBAT_ATTRIBUTES(pedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(pedIndex, CA_DO_DRIVEBYS, FALSE)
SET_PED_COMBAT_ATTRIBUTES(pedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_ATTRIBUTES(pedIndex, CA_CAN_INVESTIGATE, FALSE)
IF ( eCombatAttributes <> CA_INVALID)
SET_PED_COMBAT_ATTRIBUTES(pedIndex, eCombatAttributes, TRUE)
ENDIF
SET_PED_CAN_RAGDOLL(pedIndex, bCanRagdoll)
IF ( bCanRagdoll = FALSE )
SET_PED_CAN_RAGDOLL(pedIndex, TRUE)
SET_RAGDOLL_BLOCKING_FLAGS(pedIndex, RBF_PLAYER_BUMP)
SET_RAGDOLL_BLOCKING_FLAGS(pedIndex, RBF_PLAYER_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(pedIndex, RBF_BULLET_IMPACT)
ENDIF
ENDIF
ENDPROC
PROC SET_PED_DEFENSIVE_AREA_ANGLED(PED_INDEX PedIndex, VECTOR vPosition1, VECTOR vPosition2, FLOAT fWidth, BOOL bGoToCenter = FALSE)
IF NOT IS_PED_INJURED(PedIndex)
SET_PED_ANGLED_DEFENSIVE_AREA(PedIndex, vPosition1, vPosition2, fWidth, bGoToCenter)
ENDIF
ENDPROC
PROC SET_PED_DEFENSIVE_AREA_SPHERE(PED_INDEX PedIndex, VECTOR vPosition, FLOAT fRadius, BOOL bGoToCenter = FALSE)
IF NOT IS_PED_INJURED(PedIndex)
SET_PED_SPHERE_DEFENSIVE_AREA(PedIndex, vPosition, fRadius, bGoToCenter)
ENDIF
ENDPROC
PROC STORE_DEFENSIVE_AREA_ANGLED(DEFENSIVEAREA_STRUCT &sArea, VECTOR vPosition1, VECTOR vPosition2, FLOAT fWidth)
sArea.vPosition = vPosition1
sArea.vPosition2 = vPosition2
sArea.fWidth = fWidth
sArea.bSphere = FALSE
ENDPROC
PROC STORE_DEFENSIVE_AREA_SPHERE(DEFENSIVEAREA_STRUCT &sArea, VECTOR vPosition, FLOAT fRadius)
sArea.vPosition = vPosition
sArea.vPosition2 = << 0.0, 0.0, 0.0 >>
sArea.fWidth = fRadius
sArea.bSphere = TRUE
ENDPROC
FUNC BOOL IS_PED_IN_DEFENSIVE_AREA(PED_INDEX PedIndex, DEFENSIVEAREA_STRUCT sArea)
IF DOES_ENTITY_EXIST(PedIndex)
IF NOT IS_PED_INJURED(PedIndex)
IF ( sArea.bSphere = TRUE )
IF ( GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PedIndex), sArea.vPosition) < sArea.fWidth )
RETURN TRUE
ENDIF
ELSE
IF IS_ENTITY_IN_ANGLED_AREA(PedIndex, sArea.vPosition, sArea.vPosition2, sArea.fWidth, FALSE, TRUE, TM_ON_FOOT)
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC SET_PED_PROOFS(PED_INDEX PedIndex, BOOL bBulletProof, BOOL bFlameProof, BOOL bExplosionProof, BOOL bCollisonProof, BOOL bMeleeProof, BOOL bRunFromFiresAndExplosions = FALSE)
IF NOT IS_PED_INJURED(PedIndex)
SET_ENTITY_PROOFS(PedIndex, bBulletProof, bFlameProof, bExplosionProof, bCollisonProof, bMeleeProof)
SET_PED_CONFIG_FLAG(PedIndex, PCF_RunFromFiresAndExplosions, bRunFromFiresAndExplosions)
ENDIF
ENDPROC
FUNC BOOL IS_ENTITY_CLOSE_ENOUGH_TO_TARGET_ENTITY(ENTITY_INDEX EntityIndex, ENTITY_INDEX TargetEntityIndex, FLOAT fDistanceBetweenEntities,
FLOAT fCloseEnoughDistance, VECTOR vStartPosition)
IF DOES_ENTITY_EXIST(EntityIndex)
AND DOES_ENTITY_EXIST(TargetEntityIndex)
IF NOT IS_ENTITY_DEAD(EntityIndex)
AND NOT IS_ENTITY_DEAD(TargetEntityIndex)
IF ( fDistanceBetweenEntities < fCloseEnoughDistance )
RETURN TRUE
ELSE
IF ( GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(TargetEntityIndex), vStartPosition) >= GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(EntityIndex), vStartPosition) )
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Returns the number of alive enemies from a specified enemy group
/// PARAMS:
/// esArray - Enemy group to check.
/// RETURNS:
/// Number of created enemies who are alive and not injured from a specified enemy group.
FUNC INT GET_NUMBER_OF_ENEMIES_ALIVE(ENEMY_STRUCT &esArray[])
INT i = 0
INT iEnemiesAlive = 0
FOR i = 0 TO ( COUNT_OF(esArray) - 1 )
//check only created enemies
IF esArray[i].bCreated = TRUE
IF DOES_ENTITY_EXIST(esArray[i].PedIndex)
IF NOT IS_PED_INJURED(esArray[i].PedIndex)
iEnemiesAlive++
ENDIF
ENDIF
ENDIF
ENDFOR
RETURN iEnemiesAlive
ENDFUNC
/// PURPOSE:
/// Returns the number of dead enemies from a specified enemy group
/// PARAMS:
/// esArray - Enemy group to check.
/// RETURNS:
/// Number of created enemies who were killed and are dead from a specified enemy group.
FUNC INT GET_NUMBER_OF_ENEMIES_DEAD(ENEMY_STRUCT &esArray[])
INT i = 0
INT iEnemiesDead = 0
FOR i = 0 TO (COUNT_OF(esArray) - 1)
//check only created enemies
IF esArray[i].bCreated = TRUE
//if created enemy exists and is injured
IF DOES_ENTITY_EXIST(esArray[i].PedIndex)
IF IS_PED_INJURED(esArray[i].PedIndex)
iEnemiesDead++
ENDIF
//if created enemy does not exist anymore
//due to deleting or setting as no longer needed
//then count this enemy as dead
ELSE
iEnemiesDead++
ENDIF
ENDIF
ENDFOR
RETURN iEnemiesDead
ENDFUNC
FUNC BOOL IS_ENEMY_PED_DEAD(ENEMY_STRUCT &enemy)
IF ( enemy.bCreated = TRUE )
IF DOES_ENTITY_EXIST(enemy.PedIndex)
IF IS_PED_INJURED(enemy.PedIndex)
OR IS_ENTITY_DEAD(enemy.PedIndex)
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ELSE
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_ENEMY_GROUP_DEAD(ENEMY_STRUCT &esArray[])
INT i = 0
FOR i = 0 TO (COUNT_OF(esArray) - 1)
IF ( esArray[i].bCreated = TRUE )
IF NOT IS_PED_INJURED(esArray[i].PedIndex)
RETURN FALSE
ENDIF
ELSE
RETURN FALSE
ENDIF
ENDFOR
RETURN TRUE
ENDFUNC
PROC SET_PED_COMBAT_DRIVE_BY(PED_INDEX PedIndex, FLOAT fRange = 100.0)
IF NOT IS_PED_INJURED(PedIndex)
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_DO_DRIVEBYS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_USE_VEHICLE, TRUE)
SET_PED_SEEING_RANGE(PedIndex, fRange)
SET_PED_HEARING_RANGE(PedIndex, fRange)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(PedIndex, fRange)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, FALSE)
ENDIF
ENDPROC
PROC COMBAT_SEQUENCE_EXIT_CAR_RUN_TO_SPOT_AND_ATTACK(PED_INDEX ped, VECTOR vCoord)
IF NOT DOES_ENTITY_EXIST(ped)
EXIT
ENDIF
IF IS_ENTITY_DEAD(ped)
EXIT
ENDIF
CPRINTLN(DEBUG_MISSION, "COMBAT_SEQUENCE_EXIT_CAR_RUN_TO_SPOT_AND_ATTACK tasking ped")
SEQUENCE_INDEX iSeq
OPEN_SEQUENCE_TASK(iSeq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_CLOSE_DOOR)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, vCoord, PLAYER_PED_ID(), PEDMOVE_SPRINT, TRUE)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(iSeq)
TASK_PERFORM_SEQUENCE(ped, iSeq)
CLEAR_SEQUENCE_TASK(iSeq)
ENDPROC
PROC COMBAT_SEQUENCE_EXIT_VEHICLE_THEN_DEFEND(PED_INDEX ped, VEHICLE_INDEX defendVehicle, VECTOR vCoord)
IF NOT DOES_ENTITY_EXIST(ped)
EXIT
ENDIF
IF IS_ENTITY_DEAD(ped)
EXIT
ENDIF
IF NOT DOES_ENTITY_EXIST(defendVehicle)
EXIT
ENDIF
SEQUENCE_INDEX iSeq
OPEN_SEQUENCE_TASK(iSeq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_CLOSE_DOOR)
IF NOT ARE_VECTORS_EQUAL(vCoord, <<0.0, 0.0, 0.0>>)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, vCoord, PLAYER_PED_ID(), PEDMOVE_SPRINT, TRUE)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 50.0)
CLOSE_SEQUENCE_TASK(iSeq)
TASK_PERFORM_SEQUENCE(ped, iSeq)
CLEAR_SEQUENCE_TASK(iSeq)
IF NOT IS_PED_INJURED(ped)
AND IS_VEHICLE_DRIVEABLE(defendVehicle)
SET_PED_DEFENSIVE_SPHERE_ATTACHED_TO_VEHICLE(ped, defendVehicle, <<0, 0, 0>>, 10.0)
ENDIF
ENDPROC
PROC COMBAT_SEQUENCE_GO_TO_COORD_THEN_COMBAT(PED_INDEX ped, VECTOR vDestination, FLOAT fMoveSpeed, INT iTime = DEFAULT_TIME_BEFORE_WARP, BOOL bUnblockEvents = FALSE, BOOL bUseNavmesh = TRUE,
FLOAT fRange = 100.0, FLOAT fRadius = DEFAULT_NAVMESH_RADIUS, ENAV_SCRIPT_FLAGS eNavigationFlags = ENAV_DEFAULT)
IF NOT IS_PED_INJURED(ped)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF ( bUseNavmesh = TRUE )
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vDestination, fMoveSpeed, iTime, fRadius, eNavigationFlags)
ELSE
TASK_GO_STRAIGHT_TO_COORD(NULL, vDestination, fMoveSpeed, iTime)
ENDIF
// TASK_TOGGLE_DUCK(
IF ( bUnblockEvents = TRUE )
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, fRange)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDPROC
PROC COMBAT_SEQUENCE_GO_TO_COVER_THEN_COMBAT(PED_INDEX PedIndex, VECTOR vDestination, FLOAT fMoveSpeed, INT iTimeInCover, BOOL bCanPeekAndAim,
BOOL bForceFaceDirection = FALSE, BOOL bForceFaceLeft = FALSE, FLOAT fCombatRange = 100.0,
BOOL bUseNavmesh = TRUE, INT iTimeBeforeWarp = DEFAULT_TIME_BEFORE_WARP,
FLOAT fRadius = DEFAULT_NAVMESH_RADIUS, ENAV_SCRIPT_FLAGS eNavigationFlags = ENAV_DEFAULT)
IF NOT IS_PED_INJURED(PedIndex)
SEQUENCE_INDEX SequenceIndex
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF ( bUseNavmesh = TRUE )
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vDestination, fMoveSpeed, iTimeBeforeWarp, fRadius, eNavigationFlags)
ELSE
TASK_GO_STRAIGHT_TO_COORD(NULL, vDestination, fMoveSpeed, iTimeBeforeWarp)
ENDIF
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, vDestination, iTimeInCover, bCanPeekAndAim, 1.5, bForceFaceDirection, bForceFaceLeft, NULL, TRUE)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, fCombatRange)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
ENDIF
ENDPROC
PROC COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_AIM(PED_INDEX PedIndex, VECTOR vDestination, FLOAT fMoveSpeed, BOOL bAimAtHatedPeds, VECTOR vAimPosition,
ENTITY_INDEX EntityIndex = NULL, BOOL bShoot = FALSE, BOOL bShootAfterStopped = TRUE,
INT iTime = -1, BOOL bUnblockEvents = FALSE, FLOAT fTargetDistance = 0.5,
FLOAT fSlowDistance = 0.5, BOOL bUseNavmesh = TRUE, ENAV_SCRIPT_FLAGS eNavigationFlags = ENAV_DEFAULT, FIRING_TYPE eFiringType = FIRING_TYPE_RANDOM_BURSTS)
IF NOT IS_PED_INJURED(PedIndex)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF ( bAimAtHatedPeds = TRUE ) //aim at hated entities makes the ped automatically change aiming to nearest hated ped, once the initial one is dead
IF IS_ENTITY_DEAD(EntityIndex)
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, vDestination, vAimPosition, fMoveSpeed, bShoot, fTargetDistance, fSlowDistance, bUseNavmesh, eNavigationFlags)
ELSE
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, vDestination, GET_ENTITY_COORDS(EntityIndex), fMoveSpeed, bShoot, fTargetDistance, fSlowDistance, bUseNavmesh, eNavigationFlags)
ENDIF
ELIF ( bAimAtHatedPeds = FALSE ) // aim at entity does not update aiming when that entity is dead, ped will keep aiming at dead body
IF IS_ENTITY_DEAD(EntityIndex)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, vDestination, vAimPosition, fMoveSpeed, bShoot, fTargetDistance, fSlowdistance, bUseNavmesh)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, vDestination, EntityIndex, fMoveSpeed, bShoot, fTargetDistance, fSlowDistance, bUseNavmesh)
ENDIF
ENDIF
IF IS_ENTITY_DEAD(EntityIndex)
IF ( bShootAfterStopped = TRUE )
TASK_SHOOT_AT_COORD(NULL, vAimPosition, iTime, eFiringType)
ELSE
TASK_AIM_GUN_AT_COORD(NULL, vAimPosition, iTime)
ENDIF
ELSE
IF ( bShootAfterStopped = TRUE )
TASK_SHOOT_AT_ENTITY(NULL, EntityIndex, iTime, eFiringType)
ELSE
TASK_AIM_GUN_AT_ENTITY(NULL, EntityIndex, iTime)
ENDIF
ENDIF
IF ( bUnblockEvents = TRUE )
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
ENDIF
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(PedIndex, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDPROC
PROC COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_AIM_THEN_COMBAT(PED_INDEX ped, VECTOR vDestination, FLOAT fMoveSpeed, BOOL bAimAtHatedPeds, VECTOR vAimPosition,
ENTITY_INDEX EntityIndex = NULL, BOOL bShoot = FALSE, BOOL bShootAfterStopped = TRUE, INT iShootingTime = -1, FLOAT fRange = 100.0,
FLOAT fTargetDistance = 0.5, FLOAT fSlowDistance = 0.5, BOOL bUseNavmesh = TRUE, ENAV_SCRIPT_FLAGS eNavigationFlags = ENAV_DEFAULT, FIRING_TYPE eFiringType = FIRING_TYPE_RANDOM_BURSTS)
IF NOT IS_PED_INJURED(ped)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF ( bAimAtHatedPeds = TRUE ) //aim at hated entities makes the ped automatically change aiming to nearest hated ped, once the initial one is dead
IF IS_ENTITY_DEAD(EntityIndex)
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, vDestination, vAimPosition, fMoveSpeed, bShoot, fTargetDistance, fSlowDistance, bUseNavmesh, eNavigationFlags)
ELSE
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, vDestination, GET_ENTITY_COORDS(EntityIndex), fMoveSpeed, bShoot, fTargetDistance, fSlowDistance, bUseNavmesh, eNavigationFlags)
ENDIF
ELIF ( bAimAtHatedPeds = FALSE ) // aim at entity does not update aiming when that entity is dead, ped will keep aiming at dead body
IF IS_ENTITY_DEAD(EntityIndex)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, vDestination, vAimPosition, fMoveSpeed, bShoot, fTargetDistance, fSlowdistance, bUseNavmesh)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, vDestination, EntityIndex, fMoveSpeed, bShoot, fTargetDistance, fSlowDistance, bUseNavmesh)
ENDIF
ENDIF
IF IS_ENTITY_DEAD(EntityIndex)
IF ( bShootAfterStopped = TRUE )
TASK_SHOOT_AT_COORD(NULL, vAimPosition, iShootingTime, eFiringType)
ELSE
TASK_AIM_GUN_AT_COORD(NULL, vAimPosition, iShootingTime)
ENDIF
ELSE
IF ( bShootAfterStopped = TRUE )
TASK_SHOOT_AT_ENTITY(NULL, EntityIndex, iShootingTime, eFiringType)
ELSE
TASK_AIM_GUN_AT_ENTITY(NULL, EntityIndex, iShootingTime)
ENDIF
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, fRange)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDPROC
PROC COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT_NEW(PED_INDEX PedIndex, VECTOR vDestination, FLOAT fMoveSpeed,
BOOL bAimAtHatedPeds, VECTOR vAimPosition, ENTITY_INDEX EntityIndex = NULL,
BOOL bShootWhileMoving = FALSE, BOOL bCombatAfterStopped = TRUE,
BOOL bShootAfterStopped = FALSE, INT iAimShootTime = 1000,
FIRING_TYPE eFiringType = FIRING_TYPE_RANDOM_BURSTS,
BOOL bUnblockEvents = TRUE, FLOAT fTargetDistance = 0.5,
FLOAT fSlowDistance = 0.5, BOOL bUseNavmesh = TRUE, FLOAT fCombatRange = 100.0,
ENAV_SCRIPT_FLAGS eNavigationFlags = ENAV_DEFAULT)
IF NOT IS_PED_INJURED(PedIndex)
SEQUENCE_INDEX SequenceIndex
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF ( bAimAtHatedPeds = TRUE ) //aim at hated entities makes the ped automatically change aiming to nearest hated ped, once the initial ped is dead
IF IS_ENTITY_DEAD(EntityIndex)
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, vDestination, vAimPosition, fMoveSpeed, bShootWhileMoving, fTargetDistance, fSlowDistance, bUseNavmesh, eNavigationFlags, GO_TO_AIM_NONE, eFiringType)
ELSE
//if the entity does not exist, what then? might end up aiming at <<0,0,0>>
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, vDestination, GET_ENTITY_COORDS(EntityIndex), fMoveSpeed, bShootWhileMoving, fTargetDistance, fSlowDistance, bUseNavmesh, eNavigationFlags, GO_TO_AIM_NONE, eFiringType)
ENDIF
ELIF ( bAimAtHatedPeds = FALSE ) // aim at entity does not update aiming when that entity is dead, ped will keep aiming at dead ped
IF IS_ENTITY_DEAD(EntityIndex)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, vDestination, vAimPosition, fMoveSpeed, bShootWhileMoving, fTargetDistance, fSlowdistance, bUseNavmesh, eNavigationFlags, FALSE, eFiringType)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, vDestination, EntityIndex, fMoveSpeed, bShootWhileMoving, fTargetDistance, fSlowDistance, bUseNavmesh, eNavigationFlags, FALSE, eFiringType)
ENDIF
ENDIF
IF ( bCombatAfterStopped = FALSE )
IF IS_ENTITY_DEAD(EntityIndex)
IF ( bShootAfterStopped = TRUE )
TASK_SHOOT_AT_COORD(NULL, vAimPosition, iAimShootTime, eFiringType)
ELSE
TASK_AIM_GUN_AT_COORD(NULL, vAimPosition, iAimShootTime)
ENDIF
ELSE
IF ( bShootAfterStopped = TRUE )
TASK_SHOOT_AT_ENTITY(NULL, EntityIndex, iAimShootTime, eFiringType)
ELSE
TASK_AIM_GUN_AT_ENTITY(NULL, EntityIndex, iAimShootTime)
ENDIF
ENDIF
ENDIF
IF ( bUnblockEvents = TRUE )
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, fCombatRange)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
ENDIF
ENDPROC
PROC COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(PED_INDEX ped, VECTOR vDestination, FLOAT fMoveSpeed, BOOL bAimAtHatedPeds, VECTOR vAimPosition,
ENTITY_INDEX EntityIndex = NULL, BOOL bShoot = TRUE, BOOL bUnblockEvents = TRUE, FLOAT fTargetDistance = 0.5,
FLOAT fSlowDistance = 0.5, BOOL bUseNavmesh = TRUE, FLOAT fCombatRange = 100.0, ENAV_SCRIPT_FLAGS eNavigationFlags = ENAV_DEFAULT)
IF NOT IS_PED_INJURED(ped)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF ( bAimAtHatedPeds = TRUE ) //aim at hated entities makes the ped automatically change aiming to nearest hated ped, once the initial one is dead
IF IS_ENTITY_DEAD(EntityIndex)
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, vDestination, vAimPosition, fMoveSpeed, bShoot, fTargetDistance, fSlowDistance, bUseNavmesh, eNavigationFlags)
ELSE
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, vDestination, GET_ENTITY_COORDS(EntityIndex), fMoveSpeed, bShoot, fTargetDistance, fSlowDistance, bUseNavmesh, eNavigationFlags)
ENDIF
ELIF ( bAimAtHatedPeds = FALSE ) // aim at entity does not update aiming when that entity is dead, ped will keep aiming at dead body
IF IS_ENTITY_DEAD(EntityIndex)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, vDestination, vAimPosition, fMoveSpeed, bShoot, fTargetDistance, fSlowdistance, bUseNavmesh)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, vDestination, EntityIndex, fMoveSpeed, bShoot, fTargetDistance, fSlowDistance, bUseNavmesh)
ENDIF
ENDIF
IF ( bUnblockEvents = TRUE )
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, fCombatRange)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(ped, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDPROC
PROC COMBAT_SEQUENCE_GO_TO_COMBAT(PED_INDEX PedIndex, FLOAT fRange = 100.0, PED_INDEX TargetPedIndex = NULL)
IF NOT IS_PED_INJURED(PedIndex)
SEQUENCE_INDEX SequenceIndex
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
IF ( TargetPedIndex = NULL )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, fRange)
ELSE
IF NOT IS_PED_INJURED(TargetPedIndex)
TASK_COMBAT_PED(NULL, TargetPedIndex)
ENDIF
ENDIF
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
ENDIF
ENDPROC
PROC COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_TO_COVER_THEN_COMBAT(PED_INDEX PedIndex, VECTOR vDestination, FLOAT fMoveSpeed, BOOL bAimAtHatedPeds, VECTOR vAimPosition,
ENTITY_INDEX EntityIndex, BOOL bShoot, VECTOR vCoverCoordinates, VECTOR vFromCoordinates,
INT iTimeInCover, FLOAT fCombatRange = 100.0, BOOL bCanPeekAndAim = FALSE, BOOL bUseNavmesh = TRUE,
FLOAT fTargetDistance = 0.5, FLOAT fSlowDistance = 0.5, ENAV_SCRIPT_FLAGS eNavigationFlags = ENAV_DEFAULT)
IF NOT IS_PED_INJURED(PedIndex)
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK(seq)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF ( bAimAtHatedPeds = TRUE ) //aim at hated entities makes the ped automatically change aiming to nearest hated ped, once the initial one is dead
IF IS_ENTITY_DEAD(EntityIndex)
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, vDestination, vAimPosition, fMoveSpeed, bShoot, fTargetDistance, fSlowDistance, bUseNavmesh, eNavigationFlags)
ELSE
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, vDestination, GET_ENTITY_COORDS(EntityIndex), fMoveSpeed, bShoot, fTargetDistance, fSlowDistance, bUseNavmesh, eNavigationFlags)
ENDIF
ELIF ( bAimAtHatedPeds = FALSE ) // aim at entity does not update aiming when that entity is dead, ped will keep aiming at dead body
IF IS_ENTITY_DEAD(EntityIndex)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, vDestination, vAimPosition, fMoveSpeed, bShoot, fTargetDistance, fSlowdistance, bUseNavmesh)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, vDestination, EntityIndex, fMoveSpeed, bShoot, fTargetDistance, fSlowDistance, bUseNavmesh)
ENDIF
ENDIF
TASK_SEEK_COVER_TO_COORDS(NULL, vCoverCoordinates, vFromCoordinates, iTimeInCover, bCanPeekAndAim)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, fCombatRange)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(PedIndex, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDPROC
FUNC INT GET_NUM_REMAINING_OF_WAVE_1_ENEMIES()
RETURN GET_NUMBER_OF_ENEMIES_ALIVE(esGroup1) + GET_NUMBER_OF_ENEMIES_ALIVE(esCarCuldeSacLeft) + GET_NUMBER_OF_ENEMIES_ALIVE(esCarCuldeSacRight) + GET_NUMBER_OF_ENEMIES_ALIVE(esGroup2)
ENDFUNC
FUNC INT GET_NUM_REMAINING_OF_WAVE_2_ENEMIES()
RETURN GET_NUMBER_OF_ENEMIES_ALIVE(esGroup3) + GET_NUMBER_OF_ENEMIES_ALIVE(esGroup4) + GET_NUMBER_OF_ENEMIES_ALIVE(esCarIntersection1Left) + GET_NUMBER_OF_ENEMIES_ALIVE(esCarIntersection1Right) + GET_NUMBER_OF_ENEMIES_ALIVE(esCarIntersection2Left)
ENDFUNC
FUNC INT GET_NUM_REMAINING_OF_WAVE_3_ENEMIES()
RETURN GET_NUMBER_OF_ENEMIES_ALIVE(esGroup5) + GET_NUMBER_OF_ENEMIES_ALIVE(esGroup6)
ENDFUNC
FUNC INT GET_NUM_REMAINING_OF_WAVE_4_ENEMIES()
RETURN GET_NUMBER_OF_ENEMIES_ALIVE(esGroup7) + GET_NUMBER_OF_ENEMIES_ALIVE(esGroup8)
ENDFUNC
FUNC INT GET_NUM_ACTIVE_SPAWNER_PEDS()
INT iCount = 0
INT i
FOR i = 0 TO ( COUNT_OF(EnemySpawnpoints) - 1 )
IF DOES_ENTITY_EXIST(EnemySpawnpoints[i].sEnemy.PedIndex)
IF NOT IS_ENTITY_DEAD(EnemySpawnpoints[i].sEnemy.PedIndex)
iCount++
ENDIF
ENDIF
ENDFOR
FOR i = 0 TO ( COUNT_OF(EnemySidekickSpawnpoints) - 1 )
IF DOES_ENTITY_EXIST(EnemySidekickSpawnpoints[i].sEnemy.PedIndex)
IF NOT IS_ENTITY_DEAD(EnemySidekickSpawnpoints[i].sEnemy.PedIndex)
iCount++
ENDIF
ENDIF
ENDFOR
RETURN iCount
ENDFUNC
FUNC INT GET_NUM_REMAINING_PARKED_CAR_ENEMIES()
RETURN GET_NUMBER_OF_ENEMIES_ALIVE(esCarDriveway)
ENDFUNC
FUNC INT GET_NUM_REMAINING_OF_INTERSECTION_CAR_ENEMIES()
RETURN GET_NUMBER_OF_ENEMIES_ALIVE(esCarIntersection1Left) + GET_NUMBER_OF_ENEMIES_ALIVE(esCarIntersection1Right) + GET_NUMBER_OF_ENEMIES_ALIVE(esCarIntersection2Left)
ENDFUNC
FUNC BOOL SHOULD_ALLIES_LEAVE_STARTING_COVER()
IF GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(vsEnemyCars[CAR_CULDESAC].VehicleIndex) > 70.0
OR GET_NUM_REMAINING_OF_WAVE_1_ENEMIES() < 2
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SHOULD_ALLIES_ADVANCE_TO_STREET()
IF IS_PLAYER_IN_ANGLED_AREA_LOCATE(tbWave2)
OR GET_NUM_REMAINING_OF_WAVE_1_ENEMIES() < 3
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SHOULD_ALLIES_ADVANCE_TO_UP_STREET_1()
IF IS_ANY_FRIENDLY_IN_ANGLED_AREA_LOCATE(tbIntersection)
OR (GET_NUM_REMAINING_OF_WAVE_1_ENEMIES() < 1 AND GET_NUM_REMAINING_OF_WAVE_2_ENEMIES() < 2)
CPRINTLN(DEBUG_MISSION, "SHOULD_ALLIES_ADVANCE_TO_UP_STREET_1 true")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SHOULD_ALLIES_ADVANCE_TO_UP_STREET_2()
IF IS_ANY_FRIENDLY_IN_ANGLED_AREA_LOCATE(tbWave3)
OR (GET_NUM_REMAINING_OF_WAVE_1_ENEMIES() + GET_NUM_REMAINING_OF_WAVE_2_ENEMIES() + GET_NUM_REMAINING_OF_WAVE_3_ENEMIES() <= 2 )
CPRINTLN(DEBUG_MISSION, "SHOULD_ALLIES_ADVANCE_TO_UP_STREET_2 true")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SHOULD_OTHER_PLAYER_PED_ADVANCE_UP_TO_BIN_3()
IF ( Events[EVENT_ENEMY_WAVE_CARINTERSECTION_SPAWNED] = TRUE )
AND ( GET_NUM_REMAINING_OF_WAVE_1_ENEMIES() + GET_NUMBER_OF_ENEMIES_ALIVE(esGroup3) + GET_NUMBER_OF_ENEMIES_ALIVE(esGroup4) < 2)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SHOULD_ALLIES_ADVANCE_TO_UP_STREET_3()
IF IS_ANY_FRIENDLY_IN_ANGLED_AREA_LOCATE(tbParkedCar) OR GET_NUM_REMAINING_OF_WAVE_4_ENEMIES() < 2
CPRINTLN(DEBUG_MISSION, "SHOULD_ALLIES_ADVANCE_TO_UP_STREET_3 true")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
// we need to include the tbParkedCar check here so that we dont miss the trigger in
// street5 if the player doesnt kill everyone before hitting the trigger
FUNC BOOL SHOULD_ALLIES_ADVANCE_TO_UP_STREET_4()
IF (Events[EVENT_ENEMIES_GROUP5_KILLED] = TRUE AND Events[EVENT_ENEMIES_GROUP6_KILLED] = TRUE)
OR IS_PLAYER_IN_ANGLED_AREA_LOCATE(tbParkedCar)
CPRINTLN(DEBUG_MISSION, "SHOULD_ALLIES_ADVANCE_TO_UP_STREET_4 true")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SHOULD_ALLIES_ADVANCE_TO_UP_STREET_5()
IF IS_PLAYER_IN_ANGLED_AREA_LOCATE(tbWave5)
OR (GET_NUM_REMAINING_OF_WAVE_3_ENEMIES() + GET_NUM_REMAINING_OF_WAVE_4_ENEMIES() + GET_NUM_REMAINING_PARKED_CAR_ENEMIES() + GET_NUM_ACTIVE_SPAWNER_PEDS() <= 2)
CPRINTLN(DEBUG_MISSION, "SHOULD_ALLIES_ADVANCE_TO_UP_STREET_5 true")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SHOULD_ALLIES_RUN_TO_RIVER()
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), tbAlliesToRiver.vStart, tbAlliesToRiver.vEnd, tbAlliesToRiver.fWidth)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SHOULD_SPAWN_WAVE_2()
IF IS_ANY_FRIENDLY_IN_ANGLED_AREA_LOCATE(tbWave2)
OR GET_NUM_REMAINING_OF_WAVE_1_ENEMIES() < 3
CPRINTLN(DEBUG_MISSION, "SHOULD_SPAWN_WAVE_2 true")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SHOULD_SPAWN_INTERSECTION_CARS()
// there is a case where these won't spawn (which is OK)
// its to prevent too many enemies at once, for performance
IF IS_ANY_FRIENDLY_IN_ANGLED_AREA_LOCATE(tbIntersection)
AND GET_NUM_REMAINING_OF_WAVE_1_ENEMIES() + GET_NUM_REMAINING_OF_WAVE_2_ENEMIES() < 8
CPRINTLN(DEBUG_MISSION, "SHOULD_SPAWN_INTERSECTION_CARS true")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SHOULD_SPAWN_WAVE_3()
IF GET_NUM_REMAINING_OF_WAVE_2_ENEMIES() < 3
OR IS_ANY_FRIENDLY_IN_ANGLED_AREA_LOCATE(tbWave3)
CPRINTLN(DEBUG_MISSION, "SHOULD_SPAWN_WAVE_3 true")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SHOULD_SPAWN_WAVE_4()
IF GET_NUM_REMAINING_OF_WAVE_3_ENEMIES() + GET_NUM_REMAINING_OF_INTERSECTION_CAR_ENEMIES() < 2
OR IS_ANY_FRIENDLY_IN_ANGLED_AREA_LOCATE(tbWave4)
CPRINTLN(DEBUG_MISSION, "SHOULD_SPAWN_WAVE_4 true")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SHOULD_SPAWN_WAVE_5()
IF NOT Events[EVENT_ENEMY_WAVE_5_SPAWNED] AND Events[EVENT_ENEMY_WAVE_4_SPAWNED]
IF IS_ANY_FRIENDLY_IN_ANGLED_AREA_LOCATE(tbWave5)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SHOULD_SPAWN_COP_WAVE()
IF (IS_ANY_PED_IN_ANGLED_AREA_LOCATE(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), psLamar.PedIndex, <<13.0041, -1844.2789, 20.5150>>, <<-5.4139, -1872.2899, 25.2182>>, 8.0) AND Events[EVENT_ENEMY_WAVE_6_SPAWNED])
CPRINTLN(DEBUG_MISSION, "SHOULD_SPAWN_COP_WAVE true")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SHOULD_COP_REINFORCEMENTS_SPAWN()
IF Events[EVENT_COPS_ARRIVE]
//AND (GET_NUMBER_OF_ENEMIES_ALIVE(esPoliceCarEnd1Cops) + GET_NUMBER_OF_ENEMIES_ALIVE(esPoliceCarEnd2Cops) + GET_NUMBER_OF_ENEMIES_ALIVE(esPoliceCarEnd2Cops) <= 4)
AND HAS_TIME_PASSED(12000, iCopReinforcementTimer)
CPRINTLN(DEBUG_MISSION, "SHOULD_COP_REINFORCEMENTS_SPAWN true")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC UPDATE_SPAWNPOINT(SPAWNPOINT_STRUCT &sSpawnpoint, BOOL bResetTimer = FALSE )
IF ( sSpawnpoint.bActive = TRUE )
IF ( sSpawnpoint.bTaken = FALSE )
IF NOT DOES_ENTITY_EXIST(sSpawnpoint.sEnemy.PedIndex)
IF HAS_TIME_PASSED(sSpawnpoint.iIntervalTime, sSpawnpoint.iTimer)
IF NOT IS_SPHERE_VISIBLE(sSpawnpoint.vPosition, 2.0)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), sSpawnpoint.vPosition) > 10.0
// if the cops have arrived, spawn more cops instead of gangsters
// (because we now use this in MANAGE_COP..)
// @BSW
BOOL bTrackHeadShot
MODEL_NAMES spawnerModel
IF Events[EVENT_COPS_ARRIVE]
bTrackHeadShot = FALSE
spawnerModel = mnCop
ELSE
bTrackHeadShot = TRUE
spawnerModel = mnBalla
ENDIF
sSpawnpoint.sEnemy.PedIndex = CREATE_ENEMY_PED(spawnerModel, sSpawnpoint.vPosition, sSpawnpoint.fHeading, rgEnemies, WEAPONTYPE_PISTOL, DEFAULT, bTrackHeadShot)
IF (spawnerModel = mnCop)
SET_PED_ACCURACY(sSpawnpoint.sEnemy.PedIndex, 3)
ENDIF
CPRINTLN(DEBUG_MISSION, "Spawner created a ped" )
#IF IS_DEBUG_BUILD
TEXT_LABEL sDebugPedName = "Spawner "
SET_PED_NAME_DEBUG(sSpawnpoint.sEnemy.PedIndex, sDebugPedName)
#ENDIF
sSpawnpoint.sEnemy.iCleanupAttempts = 0
IF bTrackHeadShot = TRUE
sSpawnpoint.sEnemy.eCleanupReason = PED_CLEANUP_NO_CLEANUP
ELSE
sSpawnpoint.sEnemy.eCleanupReason = PED_CLEANUP_NONE
ENDIF
sSpawnpoint.bTaken = TRUE
sSpawnpoint.bHasTask = FALSE
ENDIF
ELSE
IF ( bResetTimer = TRUE )
sSpawnpoint.iTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
//|========================== END COMBAT PROCEDURES & FUNCTIONS ==========================|
//|=========================== BMX CREW PROCEDURES & FUNCTIONS ===========================|
PROC UPDATE_AND_CLEANUP_BMX_BIKER(PED_INDEX PedIndex, VEH_STRUCT &vehicle, BOOL &bHornUsed, FLOAT fWanderSpeed, STRING sFileName, DRIVINGMODE eDrivingMode = DRIVINGMODE_AVOIDCARS_OBEYLIGHTS)
IF DOES_ENTITY_EXIST(PedIndex)
IF NOT IS_PED_INJURED(PedIndex)
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
IF NOT IS_PED_IN_VEHICLE(PedIndex, vehicle.VehicleIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vehicle.VehicleIndex)
ENDIF
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
AND NOT IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
TASK_VEHICLE_DRIVE_WANDER(PedIndex, vehicle.VehicleIndex, fWanderSpeed, eDrivingMode)
SET_PED_KEEP_TASK(PedIndex, TRUE)
SET_PED_AS_NO_LONGER_NEEDED(PedIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sFileName)
ELSE
IF NOT IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
IF IS_ENTITY_AT_ENTITY(vehicle.VehicleIndex, PLAYER_PED_ID(), << 30.0, 30.0, 30.0>>)
STOP_PLAYBACK_RECORDED_VEHICLE(vehicle.VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE_USING_AI(vehicle.VehicleIndex, vehicle.iRecordingNumber, sFileName,
fWanderSpeed, DRIVINGMODE_AVOIDCARS)
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bHornUsed = FALSE )
IF NOT IS_PED_INJURED(PedIndex)
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
IF IS_PED_SITTING_IN_VEHICLE(PedIndex, vehicle.VehicleIndex)
IF IS_ENTITY_AT_ENTITY(vehicle.VehicleIndex, PLAYER_PED_ID(), <<10.0, 10.0, 10.0>>)
START_VEHICLE_HORN(vehicle.VehicleIndex, 1000)
bHornUsed = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
SET_PED_AS_NO_LONGER_NEEDED(PedIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sFileName)
ENDIF
ELSE
SET_PED_AS_NO_LONGER_NEEDED(PedIndex)
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vehicle.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sFileName)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_BMX_CREW(INT &iProgress)
INT i = 0
SWITCH iProgress
CASE 0
IF ( g_bFranklin1BikersSpawned = TRUE )
g_bFranklin1BikersSpawned = FALSE
iProgress = -1
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": BMX bikers will not be spawned this time due to being spawned last time. Setting g_bFranklin1BikersSpawned to FALSE to have BMX bikers spawn next time.")
#ENDIF
ELSE
SWITCH GET_RANDOM_INT_IN_RANGE(0, 2) //randomly decide to spawn or not to spawn the bikers
CASE 0 //don't spawn the bikers
g_bFranklin1BikersSpawned = FALSE
iProgress = -1
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": BMX bikers will not be spawned this time due to random flag set to 0. Setting g_bFranklin1BikersSpawned to FALSE to have BMX bikers spawn next time.")
#ENDIF
BREAK
CASE 1 //spawn the bikers
g_bFranklin1BikersSpawned = TRUE
iProgress++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": BMX bikers will be spawned this time. Setting g_bFranklin1BikersSpawned to TRUE to have BMX bikers not spawn next time.")
#ENDIF
BREAK
ENDSWITCH
ENDIF
BREAK
CASE 1 //set the bmx crew playback speed and playnack start time depending on which locate player triggers first
REQUEST_VEHICLE_RECORDING(vsBmxBikes[0].iRecordingNumber, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(vsBmxBikes[1].iRecordingNumber, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(vsBmxBikes[2].iRecordingNumber, sVehicleRecordingsFile)
REQUEST_MODEL(BMX)
REQUEST_MODEL(G_M_Y_FAMFOR_01)
REQUEST_MODEL(G_M_Y_FAMCA_01)
//player van goes through the alley as shown in the GPS
IF IS_ENTITY_IN_ANGLED_AREA(vsVan.VehicleIndex, <<18.164326,-1794.524048,25.571041>>, <<-34.210644,-1751.416626,34.148041>>, 36.000000)
fBMX0PlabackSpeed = 0.715
fBMX0StartTime = 13500.0
fBMX1PlabackSpeed = 0.875
fBMX1StartTime = 16300.0
fBMX2PlabackSpeed = 0.795
fBMX2StartTime = 15800.0
iProgress++
//if player tries to cut through the parking lot
ELIF IS_ENTITY_IN_ANGLED_AREA(vsVan.VehicleIndex, <<58.184845,-1718.744995,27.291744>>, <<-16.241100,-1752.140503,34.291744>>, 32.000000)
fBMX0PlabackSpeed = 0.715
fBMX0StartTime = 13525.0
fBMX1PlabackSpeed = 0.875
fBMX1StartTime = 16375.0
fBMX2PlabackSpeed = 0.795
fBMX2StartTime = 15850.0
iProgress++
//if player van goes through the street closest to the deal location
ELIF IS_ENTITY_IN_ANGLED_AREA(vsVan.VehicleIndex, <<56.542507,-1908.319702,19.473255>>, <<132.084869,-1819.205200,32.228783>>, 96.000000)
fBMX0PlabackSpeed = 0.735
fBMX0StartTime = 2400.0
fBMX1PlabackSpeed = 0.850
fBMX1StartTime = 2700.0
fBMX2PlabackSpeed = 0.775
fBMX2StartTime = 2475.0
iProgress++
//if player van goes through the entire grove street
ELIF IS_ENTITY_AT_COORD(vsVan.VehicleIndex, <<-96.577042,-1786.544067,32.035469>>,<<46.000000,46.000000,8.000000>>)
fBMX0PlabackSpeed = 0.735
fBMX0StartTime = 6400.0
fBMX1PlabackSpeed = 0.850
fBMX1StartTime = 6700.0
fBMX2PlabackSpeed = 0.775
fBMX2StartTime = 6500.0
iProgress++
ENDIF
BREAK
CASE 2 //create the bmx crew
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsBmxBikes[0], FALSE, FALSE, NO_CHARACTER, TRUE, -1, 58, 0, 0, 0 #IF IS_DEBUG_BUILD, "0" #ENDIF)
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsBmxBikes[1], FALSE, FALSE, NO_CHARACTER, TRUE, -1, 4, 0, 0, 0 #IF IS_DEBUG_BUILD, "1" #ENDIF)
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsBmxBikes[2], FALSE, FALSE, NO_CHARACTER, TRUE, -1, 37, 0, 0, 0 #IF IS_DEBUG_BUILD, "2" #ENDIF)
IF HAS_MISSION_PED_BEEN_CREATED(psBmxCrew[2], FALSE, rgBmxCrew, FALSE, NO_CHARACTER, FALSE, TRUE, FALSE, vsBmxBikes[2].VehicleIndex, VS_DRIVER, TRUE #IF IS_DEBUG_BUILD, "BMX 2" #ENDIF)
IF HAS_MISSION_PED_BEEN_CREATED(psBmxCrew[1], FALSE, rgBmxCrew, FALSE, NO_CHARACTER, FALSE, TRUE, FALSE, vsBmxBikes[1].VehicleIndex, VS_DRIVER, TRUE #IF IS_DEBUG_BUILD, "BMX 1" #ENDIF)
IF HAS_MISSION_PED_BEEN_CREATED(psBmxCrew[0], FALSE, rgBmxCrew, FALSE, NO_CHARACTER, FALSE, TRUE, FALSE, vsBmxBikes[0].VehicleIndex, VS_DRIVER, TRUE #IF IS_DEBUG_BUILD, "BMX 0" #ENDIF)
IF NOT IS_PED_INJURED(psBmxCrew[0].PedIndex)
SET_PED_COMPONENT_VARIATION(psBmxCrew[0].PedIndex, PED_COMP_HEAD, 1, 1, 0) //(head)
SET_PED_COMPONENT_VARIATION(psBmxCrew[0].PedIndex, PED_COMP_TORSO, 1, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psBmxCrew[0].PedIndex, PED_COMP_LEG, 0, 1, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psBmxCrew[0].PedIndex, PED_COMP_SPECIAL, 0, 1, 0) //(accs)
SET_PED_PROP_INDEX(psBmxCrew[0].PedIndex, ANCHOR_HEAD, 1, 0)
ENDIF
IF NOT IS_PED_INJURED(psBmxCrew[1].PedIndex)
SET_PED_COMPONENT_VARIATION(psBmxCrew[1].PedIndex, PED_COMP_HEAD, 1, 2, 0) //(head)
SET_PED_COMPONENT_VARIATION(psBmxCrew[1].PedIndex, PED_COMP_TORSO, 1, 1, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psBmxCrew[1].PedIndex, PED_COMP_LEG, 0, 0, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psBmxCrew[1].PedIndex, PED_COMP_SPECIAL, 0, 1, 0) //(accs)
SET_PED_PROP_INDEX(psBmxCrew[1].PedIndex, ANCHOR_HEAD, 1, 0)
ENDIF
IF NOT IS_PED_INJURED(psBmxCrew[2].PedIndex)
SET_PED_COMPONENT_VARIATION(psBmxCrew[2].PedIndex, PED_COMP_HEAD, 1, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(psBmxCrew[2].PedIndex, PED_COMP_TORSO, 0, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psBmxCrew[2].PedIndex, PED_COMP_LEG, 0, 1, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psBmxCrew[2].PedIndex, PED_COMP_SPECIAL, 0, 1, 0) //(accs)
SET_PED_PROP_INDEX(psBmxCrew[2].PedIndex, ANCHOR_HEAD, 0, 0)
ENDIF
iProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 3 //start vehicle recording on the bmx crew with playback speed and start time depending on which locate was hit first
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vsBmxBikes[0], sVehicleRecordingsFile, fBMX0PlabackSpeed, FALSE, fBMX0StartTime, FALSE, TRUE)
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vsBmxBikes[1], sVehicleRecordingsFile, fBMX1PlabackSpeed, FALSE, fBMX1StartTime, FALSE, TRUE)
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vsBmxBikes[2], sVehicleRecordingsFile, fBMX2PlabackSpeed, FALSE, fBMX2StartTime, FALSE, TRUE)
iProgress++
BREAK
CASE 4
//if any biker is damaged by player flee and cleanup
IF HAS_ENTITY_DAMAGED_VEHICLES(PLAYER_PED_ID(), vsBmxBikes)
OR HAS_ENTITY_DAMAGED_PEDS(PLAYER_PED_ID(), psBmxCrew)
OR HAS_ENTITY_DAMAGED_VEHICLES(vsVan.VehicleIndex, vsBmxBikes)
OR HAS_ENTITY_DAMAGED_PEDS(vsVan.VehicleIndex, psBmxCrew)
OR IS_PED_SHOOTING_AT_VEHICLES(PLAYER_PED_ID(), vsBmxBikes)
OR IS_PED_SHOOTING_AT_PEDS(PLAYER_PED_ID(), psBmxCrew)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player attacked bmx crew.")
#ENDIF
FOR i = 0 TO ( COUNT_OF(vsBmxBikes) - 1)
IF IS_VEHICLE_DRIVEABLE(vsBmxBikes[i].VehicleIndex)
AND NOT IS_PED_INJURED(psBmxCrew[i].PedIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vsBmxBikes[i].VehicleIndex)
SET_PED_FLEE_ATTRIBUTES(psBmxCrew[i].PedIndex, FA_DISABLE_HANDS_UP, TRUE)
SET_PED_FLEE_ATTRIBUTES(psBmxCrew[i].PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(psBmxCrew[i].PedIndex, FA_USE_VEHICLE, TRUE)
SET_PED_FLEE_ATTRIBUTES(psBmxCrew[i].PedIndex, FA_PREFER_PAVEMENTS, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psBmxCrew[i].PedIndex, CA_LEAVE_VEHICLES, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psBmxCrew[i].PedIndex, CA_USE_VEHICLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psBmxCrew[i].PedIndex, CA_ALWAYS_FLEE, TRUE)
TASK_SMART_FLEE_PED(psBmxCrew[i].PedIndex, PLAYER_PED_ID(),300, -1)
//TASK_VEHICLE_MISSION(psBmxCrew[i].PedIndex, vsBmxBikes[i].VehicleIndex, vsVan.VehicleIndex, MISSION_FLEE, 12.0,DRIVINGMODE_AVOIDCARS, 300.0, 20.0)
SET_PED_KEEP_TASK(psBmxCrew[i].PedIndex, TRUE)
SET_PED_AS_NO_LONGER_NEEDED(psBmxCrew[i].PedIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsBmxBikes[i].VehicleIndex)
REMOVE_VEHICLE_RECORDING(vsBmxBikes[i].iRecordingNumber, sVehicleRecordingsFile)
iProgress++
ENDIF
ENDFOR
ELSE //update and cleanup the bikers once the recording is over and they wander
UPDATE_AND_CLEANUP_BMX_BIKER(psBmxCrew[0].PedIndex, vsBmxBikes[0], bBMXHornUsed, 8.0, sVehicleRecordingsFile)
UPDATE_AND_CLEANUP_BMX_BIKER(psBmxCrew[1].PedIndex, vsBmxBikes[1], bBMXHornUsed, 8.0, sVehicleRecordingsFile)
UPDATE_AND_CLEANUP_BMX_BIKER(psBmxCrew[2].PedIndex, vsBmxBikes[2], bBMXHornUsed, 8.0, sVehicleRecordingsFile)
ENDIF
BREAK
ENDSWITCH
ENDPROC
//|========================= END BMX CREW PROCEDURES & FUNCTIONS =========================|
//|=============================== MISSION STAGES FUNCTIONS ==============================|
PROC SEQUENCE_FACE_AND_LOOK_AT_PED(PED_INDEX PedIndex, PED_INDEX TargetPedIndex, INT iLookTime, SCRIPT_LOOK_FLAG eScriptLookFlag = SLF_DEFAULT)
IF NOT IS_PED_INJURED(PedIndex)
AND NOT IS_PED_INJURED(TargetPedIndex)
SEQUENCE_INDEX PedSequence
OPEN_SEQUENCE_TASK(PedSequence)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, TargetPedIndex)
TASK_LOOK_AT_ENTITY(NULL, TargetPedIndex, iLookTime, eScriptLookFlag)
CLOSE_SEQUENCE_TASK(PedSequence)
TASK_PERFORM_SEQUENCE(PedIndex, PedSequence)
CLEAR_SEQUENCE_TASK(PedSequence)
ENDIF
ENDPROC
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_INTRO_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN )
IF HAS_REQUESTED_CUTSCENE_LOADED("franklin_1_int")
REGISTER_ENTITY_FOR_CUTSCENE(psTrevor.PedIndex, "Trevor", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, psTrevor.ModelName)
REGISTER_ENTITY_FOR_CUTSCENE(psChop.PedIndex, "Chop", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, psChop.ModelName)
REGISTER_ENTITY_FOR_CUTSCENE(psLamar.PedIndex, "Lamar", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, psLamar.ModelName)
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[0])
IF NOT IS_ENTITY_DEAD(g_sTriggerSceneAssets.ped[0])
REGISTER_ENTITY_FOR_CUTSCENE(g_sTriggerSceneAssets.ped[0], "Denise", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY, IG_DENISE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.object[0])
IF NOT IS_ENTITY_DEAD(g_sTriggerSceneAssets.object[0])
SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.object[0], TRUE, TRUE)
osTrowel.ObjectIndex = g_sTriggerSceneAssets.object[0]
FREEZE_ENTITY_POSITION(osTrowel.ObjectIndex, FALSE)
IF IS_ENTITY_ATTACHED(osTrowel.ObjectIndex)
DETACH_ENTITY(osTrowel.ObjectIndex, FALSE, TRUE)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(osTrowel.ObjectIndex, "Denises_Trowel", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, osTrowel.ModelName)
ENDIF
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(osTrowel.ObjectIndex, "Denises_Trowel", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osTrowel.ModelName)
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
bCutsceneRecordingStarted = FALSE
START_CUTSCENE()
iStageProgress++
ELSE
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Franklin", PLAYER_PED_ID())
/* //commenting this out for TODO B*1579081
IF IS_SPECIAL_EDITION_GAME()
SET_CUTSCENE_PED_OUTFIT("Trevor", PLAYER_TWO, OUTFIT_P2_DENIM)
ELSE
SET_CUTSCENE_PED_OUTFIT("Trevor", PLAYER_TWO, OUTFIT_P2_TSHIRT_CARGOPANTS_3)
ENDIF
*/
SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS(CHAR_TREVOR, "Trevor")
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_HEAD, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_BERD, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_HAIR, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_TORSO, 2, 1)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_LEG, 5, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_HAND, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_FEET, 1, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_TEETH, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_SPECIAL, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_SPECIAL2, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_DECL, 1, 2)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chop", PED_COMP_TORSO, 0, GET_CHOP_COLLAR_FROM_APP())
ENDIF
ENDIF
ELIF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR )
IF HAS_REQUESTED_CUTSCENE_LOADED("franklin_1_int", CS_SECTION_2 | CS_SECTION_3 | CS_SECTION_4)
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[0])
IF NOT IS_ENTITY_DEAD(g_sTriggerSceneAssets.ped[0])
REGISTER_ENTITY_FOR_CUTSCENE(g_sTriggerSceneAssets.ped[0], "Denise", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY, IG_DENISE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.object[0])
IF NOT IS_ENTITY_DEAD(g_sTriggerSceneAssets.object[0])
SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.object[0], TRUE, TRUE)
osTrowel.ObjectIndex = g_sTriggerSceneAssets.object[0]
FREEZE_ENTITY_POSITION(osTrowel.ObjectIndex, FALSE)
IF IS_ENTITY_ATTACHED(osTrowel.ObjectIndex)
DETACH_ENTITY(osTrowel.ObjectIndex, FALSE, TRUE)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(osTrowel.ObjectIndex, "Denises_Trowel", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, osTrowel.ModelName)
ENDIF
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(osTrowel.ObjectIndex, "Denises_Trowel", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osTrowel.ModelName)
ENDIF
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[1])
IF NOT IS_ENTITY_DEAD(g_sTriggerSceneAssets.ped[1])
SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.ped[1], TRUE, TRUE)
psLamar.PedIndex = g_sTriggerSceneAssets.ped[1]
SET_MISSION_PED_PROPERTIES(psLamar.PedIndex, RELGROUPHASH_PLAYER, FALSE, TRUE, FALSE, FALSE)
#IF IS_DEBUG_BUILD
SET_PED_NAME_DEBUG(psLamar.PedIndex, "TS_Lamar")
#ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(psLamar.PedIndex, "Lamar", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, IG_LAMARDAVIS)
ENDIF
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(psLamar.PedIndex, "Lamar", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, IG_LAMARDAVIS)
ENDIF
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[2])
IF NOT IS_ENTITY_DEAD(g_sTriggerSceneAssets.ped[2])
SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.ped[2], TRUE, TRUE)
psChop.PedIndex = g_sTriggerSceneAssets.ped[2]
SET_MISSION_PED_PROPERTIES(psChop.PedIndex, rgDog, FALSE, TRUE, FALSE, FALSE)
#IF IS_DEBUG_BUILD
SET_PED_NAME_DEBUG(psChop.PedIndex, "TS_Chop")
#ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(psChop.PedIndex, "Chop", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_CHOP_MODEL())
ENDIF
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(psChop.PedIndex, "Chop", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_CHOP_MODEL())
ENDIF
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[3])
IF NOT IS_ENTITY_DEAD(g_sTriggerSceneAssets.ped[3])
SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.ped[3], TRUE, TRUE)
psFranklin.PedIndex = g_sTriggerSceneAssets.ped[3]
SET_MISSION_PED_PROPERTIES(psFranklin.PedIndex, RELGROUPHASH_PLAYER, FALSE, TRUE, FALSE, FALSE)
sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN] = psFranklin.PedIndex
#IF IS_DEBUG_BUILD
SET_PED_NAME_DEBUG(psFranklin.PedIndex, "TS_Franklin")
#ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(psFranklin.PedIndex, "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, PLAYER_ONE)
ENDIF
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(psFranklin.PedIndex, "Franklin", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, PLAYER_ONE)
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
bCutsceneRecordingStarted = FALSE
START_CUTSCENE(CUTSCENE_PLAYER_FP_FLASH_FRANKLIN)
iStageProgress++
ELSE
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Trevor", PLAYER_PED_ID())
/* //commenting this out for TODO B*1579081
SET_CUTSCENE_PED_OUTFIT("Franklin", PLAYER_ONE, OUTFIT_P1_HOODIE_AND_JEANS_1)
*/
SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS(CHAR_FRANKLIN, "Franklin")
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chop", PED_COMP_TORSO, 0, GET_CHOP_COLLAR_FROM_APP())
ENDIF
ENDIF
ENDIF
BREAK
CASE 1 //fade screen in if screen was faded out due to shit skip or debug skip
IF IS_CUTSCENE_PLAYING()
IF GET_CUTSCENE_SECTION_PLAYING() >= 3
AND bCutsceneRecordingStarted = FALSE
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
bCutsceneRecordingStarted = TRUE
ENDIF
IF IS_REPLAY_START_VEHICLE_AVAILABLE()
AND DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE())
IF ( GET_MISSION_START_VEHICLE_INDEX() = GET_PLAYERS_LAST_VEHICLE() )
IF NOT IS_ENTITY_DEAD(GET_PLAYERS_LAST_VEHICLE())
AND NOT IS_ENTITY_ON_FIRE(GET_PLAYERS_LAST_VEHICLE())
AND IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE(), TRUE)
STOP_VEHICLE_FIRE(GET_PLAYERS_LAST_VEHICLE())
SET_ENTITY_COORDS(GET_PLAYERS_LAST_VEHICLE(), <<-25.0246, -1467.7142, 29.7815>>)
SET_ENTITY_HEADING(GET_PLAYERS_LAST_VEHICLE(), 275.6534)
SET_VEHICLE_DOORS_SHUT(GET_PLAYERS_LAST_VEHICLE())
SET_VEHICLE_ON_GROUND_PROPERLY(GET_PLAYERS_LAST_VEHICLE())
SET_VEHICLE_ENGINE_ON(GET_PLAYERS_LAST_VEHICLE(), FALSE, TRUE)
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<<-25.0246, -1467.7142, 29.7815>>, 275.6534)
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_MISSION_VEH)
ENDIF
ENDIF
ENDIF
STOP_GAMEPLAY_HINT(TRUE)
CLEAR_AREA_OF_PEDS(<< -14.12, -1448.62, 29.65 >>, 250.0)
CLEAR_AREA_OF_VEHICLES(<< -14.12, -1448.62, 29.65 >>, 250.0)
CLEAR_AREA_OF_PROJECTILES(<< -14.12, -1448.62, 29.65 >>, 250.0)
SET_WEATHER_TYPE_OVERTIME_PERSIST("EXTRASUNNY", 30.0)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(FADE_TIME)
ENDIF
iGroveStreetSetup = 0
iStageProgress++
ENDIF
BREAK
CASE 2
REQUEST_ANIM_DICT("missfra1_tovan")
REQUEST_ANIM_DICT(GET_CHOP_IN_VAN_ANIM_DICT())
REQUEST_VEHICLE_ASSET(vsVan.ModelName, ENUM_TO_INT(VRF_REQUEST_ENTRY_ANIMS))
SETUP_ROADS_IN_GROVE_STREET(FALSE, iGroveStreetSetup)
IF NOT DOES_ENTITY_EXIST(osTrowel.ObjectIndex)
IF DOES_CUTSCENE_ENTITY_EXIST("Denises_Trowel")
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Denises_Trowel"))
osTrowel.ObjectIndex = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Denises_Trowel"))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created object Denises_Trowel in the cutscene.")
#ENDIF
ENDIF
ENDIF
ENDIF
//create mission vehicle during mocap cutscene
IF IS_CUTSCENE_PLAYING()
IF NOT DOES_ENTITY_EXIST(vsVan.VehicleIndex)
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.veh[0])
SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.veh[0], TRUE, TRUE)
vsVan.VehicleIndex = g_sTriggerSceneAssets.veh[0]
IF IS_ENTITY_ON_FIRE(vsVan.VehicleIndex)
SET_ENTITY_HEALTH(vsVan.VehicleIndex, 1000)
SET_VEHICLE_ENGINE_HEALTH(vsVan.VehicleIndex, 1000.0)
SET_VEHICLE_PETROL_TANK_HEALTH(vsVan.VehicleIndex, 1000.0)
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(vsVan.VehicleIndex), 2.5)
CLEAR_AREA(GET_ENTITY_COORDS(vsVan.VehicleIndex), 2.5, TRUE)
ENDIF
SET_ENTITY_COORDS(vsVan.VehicleIndex, vsVan.vPosition)
SET_ENTITY_HEADING(vsVan.VehicleIndex, vsVan.fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(vsVan.VehicleIndex)
SET_VEHICLE_DOORS_LOCKED(vsVan.VehicleIndex, VEHICLELOCK_UNLOCKED)
SET_VEHICLE_CAN_LEAK_OIL(vsVan.VehicleIndex, FALSE)
SET_VEHICLE_CAN_LEAK_PETROL(vsVan.VehicleIndex, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(vsVan.VehicleIndex, TRUE)
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vsVan.VehicleIndex, FALSE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVan.VehicleIndex, SC_DOOR_FRONT_LEFT, FALSE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVan.VehicleIndex, SC_DOOR_FRONT_RIGHT, FALSE)
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsVan.VehicleIndex, "TS_Van")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Set mission vehicle properties for vehicle ", "TS_Van", " with model ", GET_MODEL_NAME_FOR_DEBUG(vsVan.ModelName), ".")
#ENDIF
ELSE
IF ( GET_CUTSCENE_TIME() > 36000 )
HAS_MISSION_VEHICLE_BEEN_CREATED(vsVan, FALSE, FALSE, CHAR_LAMAR, TRUE, -1, -1, -1, 0, 0 #IF IS_DEBUG_BUILD, "M_Van" #ENDIF)
ENDIF
ENDIF
ELSE
IF NOT IS_ENTITY_DEAD(vsVan.VehicleIndex)
SET_FORCE_HD_VEHICLE(vsVan.VehicleIndex, TRUE)
REQUEST_VEHICLE_HIGH_DETAIL_MODEL(vsVan.VehicleIndex)
ENDIF
ENDIF
ENDIF
//create Lamar ped during the intro mocap cutscene
IF NOT DOES_ENTITY_EXIST(psLamar.PedIndex)
IF DOES_CUTSCENE_ENTITY_EXIST("Lamar", IG_LAMARDAVIS)
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Lamar", IG_LAMARDAVIS))
psLamar.PedIndex = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Lamar", IG_LAMARDAVIS))
SET_MISSION_PED_PROPERTIES(psLamar.PedIndex, RELGROUPHASH_PLAYER, FALSE, TRUE, FALSE, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Set up properites for mission ped Lamar created in the intro cutscene.")
#ENDIF
bLamarsOutfitSet = TRUE
ENDIF
ENDIF
ENDIF
//create player ped Trevor when playing as Franklin by extracting him from mocap cutscene
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN )
IF NOT DOES_ENTITY_EXIST(psTrevor.PedIndex)
IF DOES_CUTSCENE_ENTITY_EXIST("Trevor")
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Trevor"))
psTrevor.PedIndex = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Trevor"))
SET_MISSION_PED_PROPERTIES(psTrevor.PedIndex, RELGROUPHASH_PLAYER, FALSE, TRUE, FALSE, FALSE)
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = psTrevor.PedIndex
STORE_PLAYER_PED_VARIATIONS(psTrevor.PedIndex, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Set up properites for mission player ped Trevor created in the intro cutscene.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//create player ped Franklin when playing as Trevor by extracting him from mocap cutscene
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR )
IF NOT DOES_ENTITY_EXIST(psFranklin.PedIndex)
IF DOES_CUTSCENE_ENTITY_EXIST("Franklin")
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Franklin"))
psFranklin.PedIndex = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Franklin"))
SET_MISSION_PED_PROPERTIES(psFranklin.PedIndex, RELGROUPHASH_PLAYER, FALSE, TRUE, FALSE, FALSE)
sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN] = psFranklin.PedIndex
STORE_PLAYER_PED_VARIATIONS(psFranklin.PedIndex, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Set up properites for mission player ped Franklin created in the intro cutscene.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//create Chop's ped during the intro mocap cutscene
IF NOT DOES_ENTITY_EXIST(psChop.PedIndex)
IF DOES_CUTSCENE_ENTITY_EXIST("Chop")
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Chop"))
psChop.PedIndex = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Chop"))
SET_MISSION_PED_PROPERTIES(psChop.PedIndex, rgDog, FALSE, TRUE, FALSE, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Set up properites for mission ped Chop created in the intro cutscene.")
#ENDIF
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
REPLAY_STOP_EVENT()
ENDIF
IF CAN_SET_ENTER_STATE_FOR_REGISTERED_ENTITY("Denises_Trowel")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Denises_Trowel.")
#ENDIF
IF DOES_ENTITY_EXIST(osTrowel.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osTrowel.ObjectIndex)
SET_ENTITY_COORDS_NO_OFFSET(osTrowel.ObjectIndex, osTrowel.vPosition)
SET_ENTITY_ROTATION(osTrowel.ObjectIndex, osTrowel.vRotation)
FREEZE_ENTITY_POSITION(osTrowel.ObjectIndex, TRUE)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Franklin.")
#ENDIF
//if on Franklin's exit state we are still not in control of Franklin then switch to Franklin
//(the switch can also happen on Trevor's exit state, but then don't let code clear tasks after switch)
IF ( GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_FRANKLIN ) //if player is not Franklin
IF MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN) //then switch player to Franklin
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Taking control of player ped Franklin when CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Franklin.")
#ENDIF
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_TREVOR))
psTrevor.PedIndex = GET_PED_INDEX(CHAR_TREVOR)
SET_MISSION_PED_PROPERTIES(psTrevor.PedIndex, RELGROUPHASH_PLAYER, FALSE, TRUE, FALSE, FALSE)
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = psTrevor.PedIndex
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Set up properites for mission player ped Trevor for hot swap during intro cutscene when CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Franklin.")
#ENDIF
ENDIF
ENDIF
ENDIF
IF GET_PLAYER_CHARACTER_AT_MISSION_START() <> CHAR_FRANKLIN
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) != CAM_VIEW_MODE_FIRST_PERSON
ANIMPOSTFX_PLAY("SwitchSceneFranklin", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "Hit_1", "LONG_PLAYER_SWITCH_SOUNDS")
ENDIF
ENDIF
IF ( bCutsceneSkipped = FALSE )
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
SEQUENCE_INDEX PlayerPedSequence
OPEN_SEQUENCE_TASK(PlayerPedSequence)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -13.81, -1454.59, 29.49 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -14.39, -1456.48, 29.41 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -18.12, -1456.95, 29.46 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT)
CLOSE_SEQUENCE_TASK(PlayerPedSequence)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), PlayerPedSequence)
CLEAR_SEQUENCE_TASK(PlayerPedSequence)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lamar", CS_LAMARDAVIS)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Lamar.")
#ENDIF
IF ( bCutsceneSkipped = FALSE )
IF DOES_ENTITY_EXIST(psLamar.PedIndex)
IF NOT IS_ENTITY_DEAD(psLamar.PedIndex)
IF IS_VEHICLE_DRIVEABLE(vsVan.VehicleIndex)
FORCE_PED_MOTION_STATE(psLamar.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -14.57, -1449.72, 29.63 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_TIME_BEFORE_WARP, ENAV_NO_STOPPING)
TASK_ENTER_VEHICLE(NULL, vsVan.VehicleIndex, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT, PEDMOVE_WALK, ECF_USE_RIGHT_ENTRY | ECF_RESUME_IF_INTERRUPTED)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(psLamar.PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psLamar.PedIndex, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Trevor.")
#ENDIF
IF ( bCutsceneSkipped = FALSE )
//switch player peds on Trevor's exit state, this happens earlier than Franklin's exit state
//do it only when not skipping the cutscene
IF ( GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_FRANKLIN ) //if player is not Franklin
IF MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN) //then switch player to Franklin
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE, TCF_CLEAR_TASK_INTERRUPT_CHECKS)//don't clear tasks after switch
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Taking control of player ped Franklin when CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Trevor.")
#ENDIF
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_TREVOR))
psTrevor.PedIndex = GET_PED_INDEX(CHAR_TREVOR)
SET_MISSION_PED_PROPERTIES(psTrevor.PedIndex, RELGROUPHASH_PLAYER, FALSE, TRUE, FALSE, FALSE)
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = psTrevor.PedIndex
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Set up properites for mission player ped Trevor for hot swap during intro cutscene when CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Trevor.")
#ENDIF
ENDIF
ENDIF
ENDIF
//give task to Trevor ped when not skipping cutscene
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
IF NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
IF IS_VEHICLE_DRIVEABLE(vsVan.VehicleIndex)
VECTOR vAnimPosition, vAnimRotation
vAnimPosition = GET_ANIM_INITIAL_OFFSET_POSITION("missfra1_tovan", "put_chop_in_van_lam",
GET_ENTITY_COORDS(vsVan.VehicleIndex), GET_ENTITY_ROTATION(vsVan.VehicleIndex))
vAnimRotation = GET_ANIM_INITIAL_OFFSET_ROTATION("missfra1_tovan", "put_chop_in_van_lam",
GET_ENTITY_COORDS(vsVan.VehicleIndex), GET_ENTITY_ROTATION(vsVan.VehicleIndex))
FORCE_PED_MOTION_STATE(psTrevor.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
TASK_FOLLOW_NAV_MESH_TO_COORD(psTrevor.PedIndex, vAnimPosition, 0.5, DEFAULT_TIME_BEFORE_WARP,
DEFAULT_NAVMESH_RADIUS, ENAV_STOP_EXACTLY, vAnimRotation.Z)
SET_RAGDOLL_BLOCKING_FLAGS(psTrevor.PedIndex, RBF_MELEE)
SET_RAGDOLL_BLOCKING_FLAGS(psTrevor.PedIndex, RBF_PLAYER_IMPACT)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psTrevor.PedIndex, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Chop")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Chop.")
#ENDIF
IF ( bCutsceneSkipped = FALSE )
IF DOES_ENTITY_EXIST(psChop.PedIndex)
IF NOT IS_ENTITY_DEAD(psChop.PedIndex)
VECTOR vAnimPosition, vAnimRotation
vAnimPosition = GET_ANIM_INITIAL_OFFSET_POSITION("missfra1_tovan", "put_chop_in_van_chop",
GET_ENTITY_COORDS(vsVan.VehicleIndex), GET_ENTITY_ROTATION(vsVan.VehicleIndex))
vAnimRotation = GET_ANIM_INITIAL_OFFSET_ROTATION("missfra1_tovan", "put_chop_in_van_chop",
GET_ENTITY_COORDS(vsVan.VehicleIndex), GET_ENTITY_ROTATION(vsVan.VehicleIndex))
WARP_PED(psChop.PedIndex, << -14.66, -1450.87, 29.55 >>, 183.5236, FALSE, FALSE, FALSE)
FORCE_PED_MOTION_STATE(psChop.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
TASK_FOLLOW_NAV_MESH_TO_COORD(psChop.PedIndex, vAnimPosition, 1.5, DEFAULT_TIME_BEFORE_WARP,
DEFAULT_NAVMESH_RADIUS, ENAV_STOP_EXACTLY, vAnimRotation.Z)
SET_RAGDOLL_BLOCKING_FLAGS(psChop.PedIndex, RBF_MELEE)
SET_RAGDOLL_BLOCKING_FLAGS(psChop.PedIndex, RBF_EXPLOSION)
SET_RAGDOLL_BLOCKING_FLAGS(psChop.PedIndex, RBF_PLAYER_IMPACT)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psChop.PedIndex, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_CUTSCENE_FINISHED()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Intro cutscene has finished.")
#ENDIF
IF DOES_ENTITY_EXIST(psChop.PedIndex)
AND DOES_ENTITY_EXIST(psLamar.PedIndex)
AND DOES_ENTITY_EXIST(psTrevor.PedIndex)
AND NOT IS_ENTITY_DEAD(psChop.PedIndex)
AND NOT IS_ENTITY_DEAD(psLamar.PedIndex)
AND NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
AND HAS_ANIM_DICT_LOADED("missfra1_tovan")
AND HAS_ANIM_DICT_LOADED(GET_CHOP_IN_VAN_ANIM_DICT())
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(psChop.PedIndex)
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(psLamar.PedIndex)
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(psTrevor.PedIndex)
AND HAS_MISSION_VEHICLE_BEEN_CREATED(vsVan, FALSE, FALSE, CHAR_LAMAR, TRUE)
AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
IF ( bCutsceneSkipped = TRUE )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Repositioning peds and giving new tasks due to into cutscene skip.")
#ENDIF
SETUP_ROADS_IN_GROVE_STREET(TRUE, iGroveStreetSetup)
IF DOES_ENTITY_EXIST(vsVan.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsVan.VehicleIndex)
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iVanEnterSceneID)
iVanEnterSceneID = CREATE_SYNCHRONIZED_SCENE(<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iVanEnterSceneID, vsVan.VehicleIndex, -1)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iVanEnterSceneID, FALSE)
PLAY_SYNCHRONIZED_ENTITY_ANIM(vsVan.VehicleIndex, iVanEnterSceneID, "put_chop_in_van_van", "missfra1_tovan",
INSTANT_BLEND_IN, INSTANT_BLEND_OUT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_BLOCK_MOVER_UPDATE | SYNCED_SCENE_VEHICLE_ALLOW_PLAYER_ENTRY))
//PLAY_ENTITY_ANIM(vsVan.VehicleIndex, "put_chop_in_van_van", "missfra1_tovan", INSTANT_BLEND_IN,
// FALSE, FALSE, FALSE, 0, ENUM_TO_INT(AF_USE_KINEMATIC_PHYSICS))
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(vsVan.VehicleIndex)
IF DOES_ENTITY_EXIST(psChop.PedIndex)
IF NOT IS_ENTITY_DEAD(psChop.PedIndex)
CLEAR_PED_TASKS_IMMEDIATELY(psChop.PedIndex)
SET_RAGDOLL_BLOCKING_FLAGS(psChop.PedIndex, RBF_MELEE)
SET_RAGDOLL_BLOCKING_FLAGS(psChop.PedIndex, RBF_EXPLOSION)
SET_RAGDOLL_BLOCKING_FLAGS(psChop.PedIndex, RBF_PLAYER_IMPACT)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psChop.PedIndex, TRUE)
TASK_SYNCHRONIZED_SCENE(psChop.PedIndex, iVanEnterSceneID, "missfra1_tovan",
"put_chop_in_van_chop", INSTANT_BLEND_IN, SLOW_BLEND_OUT,
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psChop.PedIndex)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
IF NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
CLEAR_PED_TASKS_IMMEDIATELY(psTrevor.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psTrevor.PedIndex, TRUE)
TASK_SYNCHRONIZED_SCENE(psTrevor.PedIndex, iVanEnterSceneID, "missfra1_tovan",
"put_chop_in_van_lam", INSTANT_BLEND_IN, SLOW_BLEND_OUT,
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psTrevor.PedIndex)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psLamar.PedIndex)
IF NOT IS_ENTITY_DEAD(psLamar.PedIndex)
CLEAR_PED_TASKS_IMMEDIATELY(psLamar.PedIndex)
WARP_PED(psLamar.PedIndex, psLamar.vPosition, psLamar.fHeading, FALSE, FALSE, FALSE)
FORCE_PED_MOTION_STATE(psLamar.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psLamar.PedIndex, TRUE)
TASK_ENTER_VEHICLE(psLamar.PedIndex, vsVan.VehicleIndex, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT, PEDMOVE_WALK, ECF_USE_RIGHT_ENTRY | ECF_RESUME_IF_INTERRUPTED)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
WARP_PED(PLAYER_PED_ID(), psFranklin.vPosition, psFranklin.fHeading, FALSE, FALSE, FALSE)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
SEQUENCE_INDEX PlayerPedSequence
OPEN_SEQUENCE_TASK(PlayerPedSequence)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -14.25, -1454.61, 29.48 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -14.99, -1456.87, 29.41 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -18.12, -1456.95, 29.46 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT)
CLOSE_SEQUENCE_TASK(PlayerPedSequence)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), PlayerPedSequence)
CLEAR_SEQUENCE_TASK(PlayerPedSequence)
ENDIF
ENDIF
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
ENDIF
IF DOES_ENTITY_EXIST(osTrowel.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osTrowel.ObjectIndex)
SET_ENTITY_COORDS_NO_OFFSET(osTrowel.ObjectIndex, osTrowel.vPosition)
SET_ENTITY_ROTATION(osTrowel.ObjectIndex, osTrowel.vRotation)
FREEZE_ENTITY_POSITION(osTrowel.ObjectIndex, TRUE)
ENDIF
ENDIF
SET_VEHICLE_AS_RESTRICTED(vsVan.VehicleIndex, 0)
STORE_PLAYER_PED_VARIATIONS(GET_PED_INDEX(CHAR_TREVOR), TRUE)
STORE_PLAYER_PED_VARIATIONS(GET_PED_INDEX(CHAR_FRANKLIN), TRUE)
DEBIT_BANK_ACCOUNT(CHAR_TREVOR, BAAC_UNLOGGED_SMALL_ACTION, 7)
MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_MISSION_FRANKLIN_1)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(FADE_TIME)
ENDIF
RETURN TRUE
ELSE //if not all entities exits, make sure player peds are created in script if the cutscene did not create them
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Not all entites exist.")
#ENDIF
ENDIF
ELSE
//if cutscene is skipped, fade out and remain cutscene on faded out screen
IF ( bCutsceneSkipped = FALSE )
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
bCutsceneSkipped = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Intro mocap cutscene was skipped by the player.")
#ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC MANAGE_CONVERSATIONS_DURING_VAN_RIDE(INT &iProgress)
IF ( iProgress > 1 )
AND ( iProgress < 3 )
IF IS_VEHICLE_DRIVEABLE(vsVan.VehicleIndex)
AND NOT IS_PED_INJURED(psLamar.PedIndex)
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
//resume paused conversations when player gets back in the car
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
ENDIF
ENDIF
//if vehicle is upside down
IF IS_VEHICLE_STOPPED(vsVan.VehicleIndex)
AND IS_ENTITY_UPSIDEDOWN(vsVan.VehicleIndex)
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_GDVUD")
IF ( bConversationPaused = FALSE )
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
lConversationLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_GDVUD", CONV_PRIORITY_HIGH)
bConversationPaused = TRUE
SET_LABEL_AS_TRIGGERED("F1_GDVUD", TRUE)
ENDIF
// ELSE
// IF NOT IS_AMBIENT_SPEECH_PLAYING(GET_PED_INDEX(CHAR_TREVOR))
// PLAY_PED_AMBIENT_SPEECH(GET_PED_INDEX(CHAR_TREVOR), "FKN1_KTAA", SPEECH_PARAMS_FORCE)
// bConversationPaused = TRUE
// SET_LABEL_AS_TRIGGERED("F1_GDVUD", TRUE)
// ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE //locates header blip does not exist, player is out of the car or wanted
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) //when wanted, kill conversation, pause it and play wanted conversation
IF ( bConversationPaused = FALSE )
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
lConversationLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_WNTD", CONV_PRIORITY_HIGH)
bConversationPaused = TRUE
ENDIF
ENDIF
ENDIF
ELSE //player not wanted, pause face to face conversations
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH iProgress
CASE 0
iConversationTimer = GET_GAME_TIMER()
iProgress++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Conversation progress is now ", iProgress, ".")
#ENDIF
BREAK
CASE 1
IF IS_VEHICLE_DRIVEABLE(vsVan.VehicleIndex)
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
AND NOT IS_PED_INJURED(psLamar.PedIndex)
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_SDRVE")
IF HAS_TIME_PASSED(1500, iConversationTimer)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//check if player ped is near the van to trigger the conversation, in case player decides to run away from the van
IF IS_PED_IN_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), vsVan.VehicleIndex, TRUE)
AND IS_PED_IN_VEHICLE(GET_PED_INDEX(CHAR_TREVOR), vsVan.VehicleIndex, TRUE)
AND IS_PED_IN_VEHICLE(psLamar.PedIndex, vsVan.VehicleIndex, TRUE)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_SDRVE", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_SDRVE", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
iProgress++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Conversation progress is now ", iProgress, ".")
#ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF IS_VEHICLE_DRIVEABLE(vsVan.VehicleIndex)
AND NOT IS_ENTITY_UPSIDEDOWN(vsVan.VehicleIndex)
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
AND NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
AND NOT IS_PED_INJURED(psLamar.PedIndex)
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
//handle the "F1_DRIVE" conversation when Franklin, Trevor, Laamar and Chop drive to Grove Street
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_DRIVE")
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_DRIVE", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_DRIVE", TRUE)
bConversationPaused = FALSE //set the main conversation as not paused
ENDIF
ENDIF
ELSE
IF ( bConversationPaused = TRUE )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(sFranklin1Conversation, "FKN1AUD", "F1_DRIVE", lConversationLabel, CONV_PRIORITY_MEDIUM)
bConversationPaused = FALSE
SET_LABEL_AS_TRIGGERED("F1_GDVUD", FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
//handle the "F1_ALLEY" conversation as the peds get close to the alley near Grove Street, pick randomly from 2 versions
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_ALLEY")
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_ALLEY2")
IF IS_ENTITY_AT_COORD(vsVan.VehicleIndex, <<-12.465752,-1776.519531,29.691679>>, << 24.0, 24.0, 4.0 >>)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_RANDOM_INT_IN_RANGE(0, 2)
CASE 0
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_ALLEY", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_ALLEY", TRUE)
bConversationPaused = FALSE //set the main conversation as not paused
ENDIF
BREAK
CASE 1
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_ALLEY2", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_ALLEY2", TRUE)
bConversationPaused = FALSE //set the main conversation as not paused
ENDIF
BREAK
ENDSWITCH
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ELSE
IF ( bConversationPaused = TRUE )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(sFranklin1Conversation, "FKN1AUD", "F1_ALLEY", lConversationLabel, CONV_PRIORITY_MEDIUM)
bConversationPaused = FALSE
SET_LABEL_AS_TRIGGERED("F1_GDVUD", FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
//handle the "F1_DRVE2" conversation about Clay Jackson as the peds get closer to the deal location
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_DRVE2")
IF IS_ENTITY_AT_COORD(vsVan.VehicleIndex, <<-46.280575,-1832.291138,27.419958>>, << 58.0, 32.0, 5.0 >>)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_DRVE2", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_DRVE2", TRUE)
//make sure alley conversations doesn't play after this one if player avoided alley conversation locates
SET_LABEL_AS_TRIGGERED("F1_ALLEY", TRUE)
bConversationPaused = FALSE //set the main conversation as not paused
#IF IS_DEBUG_BUILD
bStageResetFlag = TRUE
#ENDIF
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ELSE
IF ( bConversationPaused = TRUE )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(sFranklin1Conversation, "FKN1AUD", "F1_DRVE2", lConversationLabel, CONV_PRIORITY_MEDIUM)
bConversationPaused = FALSE
SET_LABEL_AS_TRIGGERED("F1_GDVUD", FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//handle the "F1_LCAR" conversation when the peds get out of the van
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCAR")
IF ( bPlayerArrivedAtGroveStreet = TRUE )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCAR", "F1_LCAR_01", CONV_PRIORITY_HIGH)
SET_LABEL_AS_TRIGGERED("F1_LCAR", TRUE)
iConversationTimer = GET_GAME_TIMER()
iProgress++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Conversation progress is now ", iProgress, ".")
#ENDIF
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 3 //lead in conversations
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_MCS1L_1")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_MCS1L", "F1_MCS1L_1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_MCS1L_1", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_MCS1L_2")
IF DOES_ENTITY_EXIST(psLamar.PedIndex)
IF NOT IS_ENTITY_DEAD(psLamar.PedIndex)
IF IS_ENTITY_PLAYING_ANIM(psLamar.PedIndex, "missfra1leadinoutmcs_1", "_leadin_action_lamar")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_MCS1L", "F1_MCS1L_2", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_MCS1L_2", TRUE)
ENDIF
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_HURRY")
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_MCS1L_2")
IF DOES_ENTITY_EXIST(psLamar.PedIndex)
IF NOT IS_ENTITY_DEAD(psLamar.PedIndex)
IF IS_ENTITY_PLAYING_ANIM(psLamar.PedIndex, "missfra1leadinoutmcs_1", "_leadin_intro_lamar")
OR IS_ENTITY_PLAYING_ANIM(psLamar.PedIndex, "missfra1leadinoutmcs_1", "_leadin_loop_lamar")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF HAS_TIME_PASSED(10000, psLamar.iHealthConversationTimer)
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_HURRY2")
IF IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsVan.VehicleIndex)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_HURRY2", CONV_PRIORITY_MEDIUM)
psLamar.iHealthConversationTimer = GET_GAME_TIMER()
psLamar.iHealthConversationCounter++
IF ( psLamar.iHealthConversationCounter = 2 )
SET_LABEL_AS_TRIGGERED("F1_HURRY", TRUE)
ENDIF
SET_LABEL_AS_TRIGGERED("F1_HURRY2", TRUE)
TASK_LOOK_AT_ENTITY(psLamar.PedIndex, PLAYER_PED_ID(), 2000, SLF_WHILE_NOT_IN_FOV)
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_HURRY1")
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_HURRY1", CONV_PRIORITY_MEDIUM)
psLamar.iHealthConversationTimer = GET_GAME_TIMER()
psLamar.iHealthConversationCounter++
IF ( psLamar.iHealthConversationCounter = 2 )
SET_LABEL_AS_TRIGGERED("F1_HURRY", TRUE)
ENDIF
TASK_LOOK_AT_ENTITY(psLamar.PedIndex, PLAYER_PED_ID(), 2000, SLF_WHILE_NOT_IN_FOV)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_CHOP_IN_VAN(INT &iProgress)
IF IS_SYNCHRONIZED_SCENE_RUNNING(iVanEnterSceneID)
IF DOES_ENTITY_EXIST(psChop.PedIndex)
IF NOT IS_ENTITY_DEAD(psChop.PedIndex)
SET_PED_CAPSULE(psChop.PedIndex, 0.25)
SET_PED_RESET_FLAG(psChop.PedIndex, PRF_ExpandPedCapsuleFromSkeleton, TRUE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
IF NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
SET_PED_CAPSULE(psTrevor.PedIndex, 0.5)
//SET_PED_RESET_FLAG(psTrevor.PedIndex, PRF_ExpandPedCapsuleFromSkeleton, TRUE)
ENDIF
ENDIF
ENDIF
SWITCH iProgress
CASE 0
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iVanEnterSceneID)
IF NOT IS_PED_INJURED(psChop.PedIndex)
AND NOT IS_PED_INJURED(psTrevor.PedIndex)
//fix for B*1827983, stop Trevor from playing wall hit animation when walking into Chop
SET_PED_RESET_FLAG(psTrevor.PedIndex, PRF_DisableWallHitAnimation, TRUE)
SET_PED_RESET_FLAG(psTrevor.PedIndex, PRF_DisablePedCollisionWithPedEvent, TRUE)
IF GET_SCRIPT_TASK_STATUS(psTrevor.PedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = FINISHED_TASK
IF GET_SCRIPT_TASK_STATUS(psTrevor.PedIndex, SCRIPT_TASK_LOOK_AT_ENTITY) != PERFORMING_TASK
TASK_LOOK_AT_ENTITY(psTrevor.PedIndex, psChop.PedIndex, INFINITE_TASK_TIME)
ENDIF
ENDIF
IF GET_SCRIPT_TASK_STATUS(psChop.PedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = FINISHED_TASK
AND GET_SCRIPT_TASK_STATUS(psTrevor.PedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = FINISHED_TASK
iProgress++
ENDIF
ENDIF
ELSE
iProgress++
ENDIF
BREAK
CASE 1
IF DOES_ENTITY_EXIST(vsVan.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsVan.VehicleIndex)
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iVanEnterSceneID)
iVanEnterSceneID = CREATE_SYNCHRONIZED_SCENE(<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iVanEnterSceneID, vsVan.VehicleIndex, -1)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iVanEnterSceneID, FALSE)
PLAY_SYNCHRONIZED_ENTITY_ANIM(vsVan.VehicleIndex, iVanEnterSceneID, "put_chop_in_van_van", "missfra1_tovan",
INSTANT_BLEND_IN, INSTANT_BLEND_OUT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_BLOCK_MOVER_UPDATE | SYNCED_SCENE_VEHICLE_ALLOW_PLAYER_ENTRY))
//PLAY_ENTITY_ANIM(vsVan.VehicleIndex, "put_chop_in_van_van", "missfra1_tovan", INSTANT_BLEND_IN,
// FALSE, FALSE, FALSE, 0, ENUM_TO_INT(AF_USE_KINEMATIC_PHYSICS))
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(vsVan.VehicleIndex)
IF DOES_ENTITY_EXIST(psChop.PedIndex)
IF NOT IS_ENTITY_DEAD(psChop.PedIndex)
//CLEAR_PED_TASKS_IMMEDIATELY(psChop.PedIndex)
SET_RAGDOLL_BLOCKING_FLAGS(psChop.PedIndex, RBF_MELEE)
SET_RAGDOLL_BLOCKING_FLAGS(psChop.PedIndex, RBF_EXPLOSION)
SET_RAGDOLL_BLOCKING_FLAGS(psChop.PedIndex, RBF_PLAYER_IMPACT)
TASK_SYNCHRONIZED_SCENE(psChop.PedIndex, iVanEnterSceneID, "missfra1_tovan",
"put_chop_in_van_chop", WALK_BLEND_IN, SLOW_BLEND_OUT,
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT,
RBF_MELEE | RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT, WALK_BLEND_IN)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psChop.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psChop.PedIndex, TRUE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
IF NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
//CLEAR_PED_TASKS_IMMEDIATELY(psTrevor.PedIndex)
SET_RAGDOLL_BLOCKING_FLAGS(psTrevor.PedIndex, RBF_MELEE)
SET_RAGDOLL_BLOCKING_FLAGS(psTrevor.PedIndex, RBF_PLAYER_IMPACT)
TASK_SYNCHRONIZED_SCENE(psTrevor.PedIndex, iVanEnterSceneID, "missfra1_tovan",
"put_chop_in_van_lam", WALK_BLEND_IN, SLOW_BLEND_OUT,
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT,
RBF_MELEE | RBF_PLAYER_IMPACT | RBF_BULLET_IMPACT, WALK_BLEND_IN)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psTrevor.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psTrevor.PedIndex, TRUE)
ENDIF
ENDIF
ELSE
iProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF DOES_ENTITY_EXIST(vsVan.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsVan.VehicleIndex)
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
IF NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
IF NOT IS_PED_IN_VEHICLE(psTrevor.PedIndex, vsVan.VehicleIndex)
IF IS_SYNCHRONIZED_SCENE_RUNNING(iVanEnterSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iVanEnterSceneID) > 0.9875
CLEAR_PED_TASKS(psTrevor.PedIndex)
TASK_CLEAR_LOOK_AT(psTrevor.PedIndex)
SET_PED_INTO_VEHICLE(psTrevor.PedIndex, vsVan.VehicleIndex, VS_BACK_LEFT)
SET_VEHICLE_DOOR_LATCHED(vsVan.VehicleIndex, SC_DOOR_REAR_LEFT, TRUE, TRUE)
ENDIF
ENDIF
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iVanEnterSceneID)
CLEAR_PED_TASKS(psTrevor.PedIndex)
TASK_CLEAR_LOOK_AT(psTrevor.PedIndex)
SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(psTrevor.PedIndex, TRUE)
SET_PED_INTO_VEHICLE(psTrevor.PedIndex, vsVan.VehicleIndex, VS_BACK_LEFT)
SET_VEHICLE_DOOR_LATCHED(vsVan.VehicleIndex, SC_DOOR_REAR_LEFT, TRUE, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iVanEnterSceneID)
IF DOES_ENTITY_EXIST(psChop.PedIndex)
IF NOT IS_ENTITY_DEAD(psChop.PedIndex)
CLEAR_PED_TASKS(psChop.PedIndex)
SET_PED_CAN_RAGDOLL(psChop.PedIndex, FALSE)
SET_CHOP_INTO_VAN(psChop.PedIndex, vsVan.VehicleIndex, eChopInVanState, fCachedVanSpeed, FALSE, TRUE, FALSE,
TRUE, 0.00955187, -0.951951, 0.273625)
ENDIF
ENDIF
REMOVE_ANIM_DICT("missfra1_tovan")
iProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
HANDLE_CHOP_LEAN_IN_VAN(psChop.PedIndex, vsVan.VehicleIndex, eChopInVanState, fCachedVanSpeed, iNextChopAnimTime, iNextBarkTime)
IF ( bPlayerArrivedAtGroveStreet = TRUE )
iProgress++
ENDIF
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL IS_MISSION_STAGE_DRIVE_TO_DEAL_COMPLETED(INT &iStageProgress)
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
MANAGE_CHOP_IN_VAN(iChopInVanProgress)
MANAGE_BMX_CREW(psBmxCrew[0].iProgress)
CREATE_PARKED_VEHICLES(iParkedVehiclesProgress)
MANAGE_CONVERSATIONS_DURING_VAN_RIDE(iConversationProgress)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_DisableAgitation, TRUE)
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_DisableAgitationTriggers, TRUE)
ENDIF
IF NOT IS_PED_INJURED(psTrevor.PedIndex)
SET_PED_RESET_FLAG(psTrevor.PedIndex, PRF_DisableAgitation, TRUE)
SET_PED_RESET_FLAG(psTrevor.PedIndex, PRF_DisableAgitationTriggers, TRUE)
ENDIF
IF NOT IS_PED_INJURED(psLamar.PedIndex)
SET_PED_RESET_FLAG(psLamar.PedIndex, PRF_DisableAgitation, TRUE)
SET_PED_RESET_FLAG(psLamar.PedIndex, PRF_DisableAgitationTriggers, TRUE)
ENDIF
IF DOES_BLIP_EXIST(vsVan.BlipIndex)
IF IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsVan.VehicleIndex)
IF IS_THIS_PRINT_BEING_DISPLAYED("FRA1_GIV")
CLEAR_PRINTS()
ENDIF
REMOVE_BLIP(vsVan.BlipIndex)
ENDIF
ENDIF
IF ( bShouldUseDefaultRoute = FALSE )
IF ( bCustomRouteActive = FALSE )
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
SET_GPS_DISABLED_ZONE(<< 32.459106 - 42.0, -1468.717529 - 42.0, 35.138702 - 8.0>>,
<< 32.459106 + 42.0, -1468.717529 + 42.0, 35.138702 + 8.0>>)
bCustomRouteActive = TRUE
ENDIF
ELSE
IF NOT DOES_BLIP_EXIST(sLocatesData.LocationBlip)
SET_GPS_DISABLED_ZONE(<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
bCustomRouteActive = FALSE
ENDIF
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), << 32.459106, -1468.717529, 35.138702 >>, << 42.0, 42.0, 8.0 >>)
OR NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), << -52.991241, -1465.017944, 36.128830>>, << 64.0, 64.0, 8.0 >>)
SET_GPS_DISABLED_ZONE(<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
bShouldUseDefaultRoute = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH iStageProgress
CASE 0 //give ped tasks to enter the van and create blips
IF IS_VEHICLE_DRIVEABLE(vsVan.VehicleIndex)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsVan.VehicleIndex)
IF ( GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK )
SEQUENCE_INDEX PlayerPedSequence
OPEN_SEQUENCE_TASK(PlayerPedSequence)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -13.81, -1454.59, 29.49 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -14.39, -1456.48, 29.41 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -18.12, -1456.95, 29.46 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT)
CLOSE_SEQUENCE_TASK(PlayerPedSequence)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), PlayerPedSequence)
CLEAR_SEQUENCE_TASK(PlayerPedSequence)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psLamar.PedIndex)
IF NOT IS_ENTITY_DEAD(psLamar.PedIndex)
IF NOT IS_PED_GETTING_INTO_A_VEHICLE(psLamar.PedIndex)
AND NOT ( GET_SCRIPT_TASK_STATUS(psLamar.PedIndex, SCRIPT_TASK_ENTER_VEHICLE) = PERFORMING_TASK )
AND NOT ( GET_SCRIPT_TASK_STATUS(psLamar.PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK )
FORCE_PED_MOTION_STATE(psLamar.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psLamar.PedIndex, TRUE)
TASK_ENTER_VEHICLE(psLamar.PedIndex, vsVan.VehicleIndex, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT, PEDMOVE_WALK, ECF_USE_RIGHT_ENTRY | ECF_RESUME_IF_INTERRUPTED)
ENDIF
ENDIF
ENDIF
//block the back doors of the van from being broken off
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVan.VehicleIndex, SC_DOOR_REAR_LEFT, FALSE)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVan.VehicleIndex, SC_DOOR_REAR_RIGHT, FALSE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsVan.VehicleIndex)
IF NOT DOES_BLIP_EXIST(vsVan.BlipIndex)
vsVan.BlipIndex = CREATE_BLIP_FOR_VEHICLE(vsVan.VehicleIndex, FALSE)
ENDIF
PRINT_GOD_TEXT_ADVANCED("FRA1_GIV", DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
iStageProgress++
BREAK
CASE 1 //wait until all peds enter the van
//block the driving controls until all peds are in
IF IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsVan.VehicleIndex)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
DISABLE_PLAYER_VEHICLE_DRIVING_CONTROLS_THIS_FRAME()
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND NOT IS_PED_INJURED(psLamar.PedIndex)
AND NOT IS_PED_INJURED(psTrevor.PedIndex)
AND IS_VEHICLE_DRIVEABLE(vsVan.VehicleIndex)
//block player from getting through lamar's door
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_ForcePlayerToEnterVehicleThroughDirectDoorOnly, TRUE)
IF ( bEnterVehicleTaskInterrupted = FALSE )
INT iXValue, iYValue
iXValue = ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_LR) * 255.0)
iYValue = ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_UD) * 255.0)
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK
IF NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
IF (iXValue < -20 OR iXValue > 20)
OR (iYValue < -20 OR iYValue > 20)
CLEAR_PED_TASKS(PLAYER_PED_ID())
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WaitingForPlayerControlInterrupt, TRUE)
bEnterVehicleTaskInterrupted = TRUE
ENDIF
ENDIF
ENDIF
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WaitingForPlayerControlInterrupt, TRUE)
bEnterVehicleTaskInterrupted = TRUE
ENDIF
ENDIF
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vsVan.VehicleIndex)
AND IS_PED_SITTING_IN_VEHICLE(psLamar.PedIndex, vsVan.VehicleIndex)
AND IS_PED_SITTING_IN_VEHICLE(psTrevor.PedIndex, vsVan.VehicleIndex)
REPLAY_RECORD_BACK_FOR_TIME(5.0 , 8.0, REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ENDIF
ENDIF
BREAK
CASE 2
IF IS_VEHICLE_DRIVEABLE(vsVan.VehicleIndex)
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(),vsVan.VehicleIndex)
IF NOT DOES_BLIP_EXIST(vsVan.BlipIndex)
vsVan.BlipIndex = CREATE_BLIP_FOR_VEHICLE(vsVan.VehicleIndex)
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("FRA1_GBIV")
PRINT_GOD_TEXT_ADVANCED("FRA1_GBIV")
SET_LABEL_AS_TRIGGERED("FRA1_GBIV", TRUE)
ENDIF
ELSE
IF HAS_LABEL_BEEN_TRIGGERED("FRA1_GBIV")
CLEAR_PRINTS()
ENDIF
IF DOES_BLIP_EXIST(vsVan.BlipIndex)
REMOVE_BLIP(vsVan.BlipIndex)
ENDIF
ENDIF
ENDIF
//if dialogue has been played, then move on
IF HAS_LABEL_BEEN_TRIGGERED("F1_SDRVE")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
iStageProgress++
ENDIF
ENDIF
BREAK
CASE 3 //Franklin, Trevor, Lamar and Chop drive to Grove Street
IF DOES_BLIP_EXIST(vsVan.BlipIndex)
REMOVE_BLIP(vsVan.BlipIndex)
ENDIF
IF IS_PLAYER_AT_LOCATION_WITH_BUDDIES_IN_VEHICLE(sLocatesData, << 99.07, -1945.10, 19.73 >>, << 3.0, 3.0, LOCATE_SIZE_HEIGHT >>, TRUE,
psLamar.PedIndex, psTrevor.PedIndex, NULL, vsVan.VehicleIndex,
"FRA1_GROVE", "CMN_LLEAVE", "CMN_TLEAVE", "FRA1_PICKUP", "FRA1_PICKUP",
"FRA1_GIV", "FRA1_GBIV", FALSE, TRUE, TRUE)
CLEANUP_PED_GROUP(psBmxCrew, FALSE)
CLEANUP_VEHICLE_GROUP(vsBmxBikes, FALSE, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(BMX)
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
bPlayerArrivedAtGroveStreet = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player arrived at Grove Street locate.")
#ENDIF
REPLAY_RECORD_BACK_FOR_TIME(5.0 , 8.0, REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("FRANKLIN_1_GET_TO_GROVE_ST")
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
START_AUDIO_SCENE("FRANKLIN_1_GET_TO_GROVE_ST")
ENDIF
ENDIF
IF IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()
OR IS_PLAYER_CHANGING_CLOTHES()
IF HAS_THIS_CUTSCENE_LOADED("fra_1_mcs_1")
OR HAS_CUTSCENE_LOADED()
OR IS_CUTSCENE_ACTIVE()
REMOVE_CUTSCENE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player browsing items in a shop or changing clothes. Removing cutscene.")
#ENDIF
ENDIF
ELSE
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vGroveStreet) < DEFAULT_CUTSCENE_LOAD_DIST
REQUEST_CUTSCENE("fra_1_mcs_1")
REQUEST_IPL("SC1_27_Cut")
REQUEST_MODEL(osBag.ModelName)
REQUEST_ANIM_DICT("missfra1leadinoutmcs_1")
REQUEST_CLIP_SET("move_ped_wpn_jerrycan_generic")
REQUEST_WEAPON_ASSET(WEAPONTYPE_SMG)
REQUEST_WEAPON_ASSET(WEAPONTYPE_PUMPSHOTGUN)
REQUEST_WEAPON_ASSET(WEAPONTYPE_ASSAULTRIFLE)
REQUEST_MODEL(GET_WEAPONTYPE_MODEL(WEAPONTYPE_SMG))
REQUEST_MODEL(GET_WEAPONTYPE_MODEL(WEAPONTYPE_PUMPSHOTGUN))
REQUEST_MODEL(GET_WEAPONTYPE_MODEL(WEAPONTYPE_ASSAULTRIFLE))
CLEANUP_MISSION_OBJECT(osTrowel, TRUE)
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Franklin", GET_PED_INDEX(CHAR_FRANKLIN))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Trevor", GET_PED_INDEX(CHAR_TREVOR))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Lamar", psLamar.PedIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting cutscene ped components for cutscene ped Franklin, Trevor, Lamar and Chop from peds.")
#ENDIF
ENDIF
ELSE
IF HAS_THIS_CUTSCENE_LOADED("fra_1_mcs_1")
OR HAS_CUTSCENE_LOADED()
OR IS_CUTSCENE_ACTIVE()
REMOVE_CUTSCENE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player too far away from destination to keep cutscene in memory. Removing cutscene.")
#ENDIF
ENDIF
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
ENDIF
ENDIF
ENDIF
BREAK
CASE 4
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vsVan.VehicleIndex, 6.0)
IF IS_VEHICLE_DRIVEABLE(vsVan.VehicleIndex)
SET_VEHICLE_UNDRIVEABLE(vsVan.VehicleIndex, TRUE) //make sure it does not turn back on due to player sitting in it
SET_VEHICLE_ENGINE_ON(vsVan.VehicleIndex, FALSE, FALSE) //switch of van engine
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsVan.VehicleIndex, FALSE)
ENDIF
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
psChop.iProgress = 0
psLamar.iProgress = 0
psTrevor.iProgress = 0
psChop.bHasTask = FALSE
psLamar.bHasTask = FALSE
psTrevor.bHasTask = FALSE
STOP_AUDIO_SCENE("FRANKLIN_1_GET_TO_GROVE_ST")
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
iStageProgress++
ENDIF
BREAK
CASE 5
SUPPRESS_CONTEXT_BUTTON_ACTIONS_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_AIM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_COVER)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DETONATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DUCK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
IF IS_PED_IN_THIS_VEHICLE(psLamar.PedIndex, vsVan.VehicleIndex)
AND IS_PED_IN_THIS_VEHICLE(psTrevor.PedIndex, vsVan.VehicleIndex)
AND IS_PED_SITTING_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsVan.VehicleIndex)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
ENDIF
IF ( bLeadInLocateReached = FALSE )
IF ( bLeadInTriggered = TRUE )
OR IS_PLAYER_AT_LOCATION_ANY_MEANS(sLocatesData, << 85.99, -1957.19, 19.75 >>, << 1.25, 1.25, LOCATE_SIZE_HEIGHT >>, TRUE, "FRA1_HOUSE", TRUE)
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
bLeadInLocateReached = TRUE
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psLamar.PedIndex)
IF NOT IS_ENTITY_DEAD(psLamar.PedIndex)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psLamar.PedIndex, GET_STRING_FROM_INT(psLamar.iProgress), 1.0)
#ENDIF
SET_PED_RESET_FLAG(psLamar.PedIndex, PRF_DisablePedCollisionWithPedEvent, TRUE)
SWITCH psLamar.iProgress
CASE 0
IF ( psLamar.bHasTask = FALSE )
IF HAS_LABEL_BEEN_TRIGGERED("F1_MCS1L_1")
osBag.vPosition = GET_ENTITY_COORDS(psLamar.PedIndex)
osBag.vRotation = << 0.0, 0.0, 0.0 >>
IF HAS_MISSION_OBJECT_BEEN_CREATED(osBag)
ATTACH_ENTITY_TO_ENTITY(osBag.ObjectIndex, psLamar.PedIndex,
GET_PED_BONE_INDEX(psLamar.PedIndex, BONETAG_PH_R_HAND),
<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
PLAY_ENTITY_ANIM(osBag.ObjectIndex, "money_bag", "missfra1leadinoutmcs_1", INSTANT_BLEND_IN, TRUE, FALSE)
SET_ENTITY_VISIBLE(osBag.ObjectIndex, FALSE)
ENDIF
REMOVE_PED_FROM_GROUP(psLamar.PedIndex)
SET_PED_WEAPON_MOVEMENT_CLIPSET(psLamar.PedIndex, "move_ped_wpn_jerrycan_generic")
VECTOR vScenePosition, vSceneRotation
vScenePosition = GET_ANIM_INITIAL_OFFSET_POSITION("missfra1leadinoutmcs_1", "_leadin_intro_lamar", vLamarsLeadInPosition, vLamarsLeadInRotation)
vSceneRotation = GET_ANIM_INITIAL_OFFSET_ROTATION("missfra1leadinoutmcs_1", "_leadin_intro_lamar", vLamarsLeadInPosition, vLamarsLeadInRotation)
SEQUENCE_INDEX WalkSequenceIndex
CLEAR_SEQUENCE_TASK(WalkSequenceIndex)
OPEN_SEQUENCE_TASK(WalkSequenceIndex)
TASK_LEAVE_ANY_VEHICLE(NULL)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << 87.99, -1954.83, 19.76 >>, PEDMOVE_WALK + 0.2, DEFAULT_TIME_BEFORE_WARP,
DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vScenePosition, PEDMOVE_WALK + 0.2, DEFAULT_TIME_BEFORE_WARP,
DEFAULT_NAVMESH_RADIUS, ENAV_STOP_EXACTLY, vSceneRotation.Z)
TASK_ACHIEVE_HEADING(NULL, vSceneRotation.Z)
TASK_STAND_STILL(NULL, 10)
CLOSE_SEQUENCE_TASK(WalkSequenceIndex)
TASK_PERFORM_SEQUENCE(psLamar.PedIndex, WalkSequenceIndex)
CLEAR_SEQUENCE_TASK(WalkSequenceIndex)
SET_RAGDOLL_BLOCKING_FLAGS(psLamar.PedIndex, RBF_MELEE)
SET_RAGDOLL_BLOCKING_FLAGS(psLamar.PedIndex, RBF_PLAYER_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(psLamar.PedIndex, RBF_BULLET_IMPACT)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psLamar.PedIndex, TRUE)
psLamar.bHasTask = TRUE
ENDIF
ENDIF
IF ( psLamar.bHasTask = TRUE )
IF DOES_ENTITY_EXIST(osBag.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osBag.ObjectIndex)
IF NOT IS_ENTITY_VISIBLE(osBag.ObjectIndex)
IF NOT IS_PED_IN_ANY_VEHICLE(psLamar.PedIndex)
SET_ENTITY_VISIBLE(osBag.ObjectIndex, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF GET_SCRIPT_TASK_STATUS(psLamar.PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK
psLamar.bHasTask = FALSE
psLamar.iProgress++
ENDIF
ENDIF
BREAK
CASE 1
IF ( psLamar.bHasTask = FALSE )
IF HAS_ANIM_DICT_LOADED("missfra1leadinoutmcs_1")
SEQUENCE_INDEX AnimSequenceIndex
CLEAR_SEQUENCE_TASK(AnimSequenceIndex)
OPEN_SEQUENCE_TASK(AnimSequenceIndex)
TASK_PLAY_ANIM_ADVANCED(NULL, "missfra1leadinoutmcs_1", "_leadin_intro_lamar",
vLamarsLeadInPosition, vLamarsLeadInRotation,
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1,
AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE |
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
TASK_PLAY_ANIM_ADVANCED(NULL, "missfra1leadinoutmcs_1", "_leadin_loop_lamar",
vLamarsLeadInPosition, vLamarsLeadInRotation,
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1,
AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_LOOPING |
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
CLOSE_SEQUENCE_TASK(AnimSequenceIndex)
TASK_PERFORM_SEQUENCE(psLamar.PedIndex, AnimSequenceIndex)
CLEAR_SEQUENCE_TASK(AnimSequenceIndex)
TASK_LOOK_AT_ENTITY(psLamar.PedIndex, PLAYER_PED_ID(), INFINITE_TASK_TIME, SLF_WHILE_NOT_IN_FOV)
RESET_PED_WEAPON_MOVEMENT_CLIPSET(psLamar.PedIndex)
psLamar.iHealthConversationTimer = GET_GAME_TIMER()
psLamar.iHealthConversationCounter = 0
psLamar.bHasTask = TRUE
ELSE
REQUEST_ANIM_DICT("missfra1leadinoutmcs_1")
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(psLamar.PedIndex, "missfra1leadinoutmcs_1", "_leadin_loop_lamar")
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<90.288116,-1952.259155,19.639692>>, <<84.327744,-1959.426147,23.126755>>, 8.0)
bLeadInTriggered = TRUE
psLamar.bHasTask = FALSE
psLamar.iProgress++
ENDIF
ENDIF
BREAK
CASE 2
IF ( psLamar.bHasTask = FALSE )
IF HAS_ANIM_DICT_LOADED("missfra1leadinoutmcs_1")
TASK_PLAY_ANIM_ADVANCED(psLamar.PedIndex, "missfra1leadinoutmcs_1", "_leadin_action_lamar",
vLamarsLeadInPosition, vLamarsLeadInRotation,
NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1,
AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_HOLD_LAST_FRAME |
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
RESET_PED_WEAPON_MOVEMENT_CLIPSET(psLamar.PedIndex)
psLamar.bHasTask = TRUE
ELSE
REQUEST_ANIM_DICT("missfra1leadinoutmcs_1")
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(psLamar.PedIndex, "missfra1leadinoutmcs_1", "_leadin_action_lamar")
SET_ENTITY_ANIM_SPEED(psLamar.PedIndex, "missfra1leadinoutmcs_1", "_leadin_action_lamar", 1.25)
ENDIF
BREAK
ENDSWITCH
IF IS_ENTITY_PLAYING_ANIM(psLamar.PedIndex, "missfra1leadinoutmcs_1", "_leadin_loop_lamar")
OR IS_ENTITY_PLAYING_ANIM(psLamar.PedIndex, "missfra1leadinoutmcs_1", "_leadin_loop_lamar")
OR IS_ENTITY_PLAYING_ANIM(psLamar.PedIndex, "missfra1leadinoutmcs_1", "_leadin_action_lamar")
SET_PED_CAPSULE(psLamar.PedIndex, 0.25)
SET_PED_RESET_FLAG(psLamar.PedIndex, PRF_ExpandPedCapsuleFromSkeleton, TRUE)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
IF NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psTrevor.PedIndex, GET_STRING_FROM_INT(psTrevor.iProgress), 1.0)
#ENDIF
SET_PED_RESET_FLAG(psTrevor.PedIndex, PRF_DisablePedCollisionWithPedEvent, TRUE)
SWITCH psTrevor.iProgress
CASE 0
IF ( psTrevor.bHasTask = FALSE )
IF NOT IS_PED_IN_ANY_VEHICLE(psLamar.PedIndex)
VECTOR vScenePosition, vSceneRotation
vScenePosition = GET_ANIM_INITIAL_OFFSET_POSITION("missfra1leadinoutmcs_1", "_leadin_action_trevor", vTrevorsLeadInPosition, vTrevorsLeadInRotation)
vSceneRotation = GET_ANIM_INITIAL_OFFSET_ROTATION("missfra1leadinoutmcs_1", "_leadin_action_trevor", vTrevorsLeadInPosition, vTrevorsLeadInRotation)
REMOVE_PED_FROM_GROUP(psTrevor.PedIndex)
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_LEAVE_ANY_VEHICLE(NULL, 500)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << 86.44, -1955.48, 19.77 >>, PEDMOVE_WALK - 0.2, DEFAULT_TIME_BEFORE_WARP,
DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vScenePosition, PEDMOVE_WALK - 0.2, DEFAULT_TIME_BEFORE_WARP,
DEFAULT_NAVMESH_RADIUS, ENAV_STOP_EXACTLY, vSceneRotation.Z)
TASK_ACHIEVE_HEADING(NULL, vSceneRotation.Z)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(psTrevor.PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
SET_RAGDOLL_BLOCKING_FLAGS(psTrevor.PedIndex, RBF_MELEE)
SET_RAGDOLL_BLOCKING_FLAGS(psTrevor.PedIndex, RBF_PLAYER_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(psTrevor.PedIndex, RBF_BULLET_IMPACT)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psTrevor.PedIndex, TRUE)
psTrevor.bHasTask = TRUE
ENDIF
ENDIF
IF ( psTrevor.bHasTask = TRUE )
IF GET_SCRIPT_TASK_STATUS(psTrevor.PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK
psTrevor.bHasTask = FALSE
psTrevor.iProgress++
ENDIF
ENDIF
BREAK
CASE 1
IF ( psTrevor.bHasTask = FALSE )
TASK_LOOK_AT_ENTITY(psTrevor.PedIndex, PLAYER_PED_ID(), INFINITE_TASK_TIME, SLF_WHILE_NOT_IN_FOV)
psTrevor.bHasTask = TRUE
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<90.288116,-1952.259155,19.639692>>, <<84.327744,-1959.426147,23.126755>>, 8.0)
psTrevor.bHasTask = FALSE
psTrevor.iProgress++
ENDIF
BREAK
CASE 2
IF ( psTrevor.bHasTask = FALSE )
IF HAS_ANIM_DICT_LOADED("missfra1leadinoutmcs_1")
IF IS_ENTITY_PLAYING_ANIM(psLamar.PedIndex, "missfra1leadinoutmcs_1", "_leadin_action_lamar")
//TASK_PLAY_ANIM_ADVANCED(psTrevor.PedIndex, "missfra1leadinoutmcs_1", "_leadin_action_trevor",
// vTrevorsLeadInPosition, vTrevorsLeadInRotation,
// SLOW_BLEND_IN, SLOW_BLEND_OUT, -1,
// AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE |
// AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION | AF_HOLD_LAST_FRAME)
TASK_PLAY_ANIM(psTrevor.PedIndex, "missfra1leadinoutmcs_1", "_leadin_action_trevor",
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE |
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION | AF_HOLD_LAST_FRAME)
psTrevor.bHasTask = TRUE
ENDIF
ELSE
REQUEST_ANIM_DICT("missfra1leadinoutmcs_1")
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(psTrevor.PedIndex, "missfra1leadinoutmcs_1", "_leadin_action_trevor")
SET_ENTITY_ANIM_SPEED(psTrevor.PedIndex, "missfra1leadinoutmcs_1", "_leadin_action_trevor", 1.25)
ENDIF
BREAK
ENDSWITCH
IF IS_ENTITY_PLAYING_ANIM(psTrevor.PedIndex, "missfra1leadinoutmcs_1", "_leadin_action_trevor")
SET_PED_CAPSULE(psTrevor.PedIndex, 0.25)
SET_PED_RESET_FLAG(psTrevor.PedIndex, PRF_ExpandPedCapsuleFromSkeleton, TRUE)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psChop.PedIndex)
IF NOT IS_ENTITY_DEAD(psChop.PedIndex)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psChop.PedIndex, GET_STRING_FROM_INT(psChop.iProgress), 1.0)
#ENDIF
SWITCH psChop.iProgress
CASE 0
IF NOT IS_PED_IN_ANY_VEHICLE(psLamar.PedIndex)
IF IS_ENTRY_POINT_FOR_SEAT_CLEAR(psTrevor.PedIndex, vsVan.VehicleIndex, VS_BACK_LEFT)
AND IS_ENTRY_POINT_FOR_SEAT_CLEAR(psTrevor.PedIndex, vsVan.VehicleIndex, VS_BACK_RIGHT)
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iVanExitSceneID)
iVanExitSceneID = CREATE_SYNCHRONIZED_SCENE(<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iVanExitSceneID, FALSE)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iVanExitSceneID, vsVan.VehicleIndex, -1)
IF IS_VEHICLE_DRIVEABLE(vsVan.VehicleIndex)
PLAY_ENTITY_ANIM(vsVan.VehicleIndex, "_open_van_door_van", "missfra1leadinoutmcs_1",
INSTANT_BLEND_IN, FALSE, FALSE, FALSE, 0, ENUM_TO_INT(AF_USE_KINEMATIC_PHYSICS))
ENDIF
IF IS_ENTITY_ATTACHED(psChop.PedIndex)
DETACH_ENTITY(psChop.PedIndex)
ENDIF
SET_PED_CAN_RAGDOLL(psChop.PedIndex, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(psChop.PedIndex)
TASK_SYNCHRONIZED_SCENE(psChop.PedIndex, iVanExitSceneID, "missfra1leadinoutmcs_1",
"chop_van_getout", INSTANT_BLEND_IN, SLOW_BLEND_OUT,
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psChop.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psChop.PedIndex, TRUE)
ENDIF
ELSE
IF IS_ENTITY_ATTACHED(psChop.PedIndex)
DETACH_ENTITY(psChop.PedIndex)
ENDIF
CLEAR_PED_TASKS_IMMEDIATELY(psChop.PedIndex)
WARP_PED(psChop.PedIndex, << 91.15, -1945.23, 19.74 >>, 0.0, FALSE, FALSE, FALSE)
ENDIF
REMOVE_ANIM_DICT(GET_CHOP_IN_VAN_ANIM_DICT())
psChop.bHasTask = FALSE
psChop.iProgress++
ENDIF
BREAK
CASE 1
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iVanExitSceneID)
psChop.bHasTask = FALSE
psChop.iProgress++
ENDIF
BREAK
CASE 2
IF ( psChop.bHasTask = FALSE )
REQUEST_ANIM_DICT("creatures@rottweiler@amb@world_dog_sitting@base")
REQUEST_ANIM_DICT("creatures@rottweiler@amb@world_dog_sitting@enter")
REQUEST_ANIM_DICT("creatures@rottweiler@amb@world_dog_sitting@idle_a")
SEQUENCE_INDEX ChopSequenceIndex
CLEAR_SEQUENCE_TASK(ChopSequenceIndex)
OPEN_SEQUENCE_TASK(ChopSequenceIndex)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << 89.63, -1954.82, 19.84 >>, PEDMOVE_WALK - 0.4,
DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << 88.250, -1956.100, 19.83 >>, PEDMOVE_WALK - 0.4,
DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_STOP_EXACTLY, 95.0)
CLOSE_SEQUENCE_TASK(ChopSequenceIndex)
TASK_PERFORM_SEQUENCE(psChop.PedIndex, ChopSequenceIndex)
CLEAR_SEQUENCE_TASK(ChopSequenceIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psChop.PedIndex, TRUE)
psChop.bHasTask = TRUE
ENDIF
IF ( psChop.bHasTask = TRUE )
IF IS_ENTITY_AT_COORD(psChop.PedIndex, << 88.250, -1956.100, 19.83 >>, << 1.0, 1.0, 1.0>>)
IF GET_SCRIPT_TASK_STATUS(psChop.PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK
IF HAS_ANIM_DICT_LOADED("creatures@rottweiler@amb@world_dog_sitting@base")
AND HAS_ANIM_DICT_LOADED("creatures@rottweiler@amb@world_dog_sitting@enter")
AND HAS_ANIM_DICT_LOADED("creatures@rottweiler@amb@world_dog_sitting@idle_a")
psChop.bHasTask = FALSE
psChop.iProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
IF ( psChop.bHasTask = FALSE )
SEQUENCE_INDEX ChopSequenceIndex
CLEAR_SEQUENCE_TASK(ChopSequenceIndex)
OPEN_SEQUENCE_TASK(ChopSequenceIndex)
TASK_PLAY_ANIM(NULL, "creatures@rottweiler@amb@world_dog_sitting@enter", "enter",
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS |
AF_USE_MOVER_EXTRACTION)
TASK_PLAY_ANIM(NULL, "creatures@rottweiler@amb@world_dog_sitting@base", "base",
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_LOOPING |
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
CLOSE_SEQUENCE_TASK(ChopSequenceIndex)
TASK_PERFORM_SEQUENCE(psChop.PedIndex, ChopSequenceIndex)
CLEAR_SEQUENCE_TASK(ChopSequenceIndex)
CLEAR_RAGDOLL_BLOCKING_FLAGS(psChop.PedIndex, RBF_EXPLOSION)
SET_RAGDOLL_BLOCKING_FLAGS(psChop.PedIndex, RBF_MELEE)
SET_RAGDOLL_BLOCKING_FLAGS(psChop.PedIndex, RBF_PLAYER_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(psChop.PedIndex, RBF_BULLET_IMPACT)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psChop.PedIndex, TRUE)
psChop.iTimer = GET_GAME_TIMER()
psChop.iHealthConversationTimer = GET_RANDOM_INT_IN_RANGE(5000, 7501)
psChop.bHasTask = TRUE
ENDIF
IF ( psChop.bHasTask = TRUE )
IF IS_ENTITY_PLAYING_ANIM(psChop.PedIndex, "creatures@rottweiler@amb@world_dog_sitting@base", "base")
IF HAS_TIME_PASSED(psChop.iHealthConversationTimer, psChop.iTimer)
STRING ChopAnimation
SEQUENCE_INDEX ChopSequenceIndex
SWITCH GET_RANDOM_INT_IN_RANGE(0, 3)
CASE 0
ChopAnimation = "idle_a"
BREAK
CASE 1
ChopAnimation = "idle_b"
BREAK
CASE 2
ChopAnimation = "idle_c"
BREAK
ENDSWITCH
CLEAR_SEQUENCE_TASK(ChopSequenceIndex)
OPEN_SEQUENCE_TASK(ChopSequenceIndex)
TASK_PLAY_ANIM(NULL, "creatures@rottweiler@amb@world_dog_sitting@idle_a", ChopAnimation,
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS |
AF_USE_MOVER_EXTRACTION)
TASK_PLAY_ANIM(NULL, "creatures@rottweiler@amb@world_dog_sitting@base", "base",
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_LOOPING |
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
CLOSE_SEQUENCE_TASK(ChopSequenceIndex)
TASK_PERFORM_SEQUENCE(psChop.PedIndex, ChopSequenceIndex)
CLEAR_SEQUENCE_TASK(ChopSequenceIndex)
psChop.iTimer = GET_GAME_TIMER()
psChop.iPedConversationTimer = GET_RANDOM_INT_IN_RANGE(5000, 7501)
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND NOT IS_PED_INJURED(psChop.PedIndex)
AND NOT IS_PED_INJURED(psLamar.PedIndex)
AND NOT IS_PED_INJURED(psTrevor.PedIndex)
IF IS_ENTITY_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_TREVOR), <<86.655319,-1959.258545,19.626707>>, <<84.261604,-1957.282837,22.626705>>, 3.5)
AND IS_ENTITY_IN_ANGLED_AREA(psLamar.PedIndex, <<86.655319,-1959.258545,19.626707>>, <<84.261604,-1957.282837,22.626705>>, 3.5)
IF IS_ENTITY_PLAYING_ANIM(psLamar.PedIndex, "missfra1leadinoutmcs_1", "_leadin_action_lamar")
IF GET_ENTITY_ANIM_CURRENT_TIME(psLamar.PedIndex, "missfra1leadinoutmcs_1", "_leadin_action_lamar") > 0.725
REMOVE_PED_FROM_GROUP(psChop.PedIndex)
REMOVE_ANIM_DICT("missfra1leadinoutmcs_1")
REMOVE_ANIM_DICT("creatures@rottweiler@amb@world_dog_sitting@base")
REMOVE_ANIM_DICT("creatures@rottweiler@amb@world_dog_sitting@enter")
REMOVE_ANIM_DICT("creatures@rottweiler@amb@world_dog_sitting@idle_a")
REMOVE_CLIP_SET("move_ped_wpn_jerrycan_generic")
RESET_PED_WEAPON_MOVEMENT_CLIPSET(psLamar.PedIndex)
REMOVE_VEHICLE_ASSET(GET_NPC_VEH_MODEL(CHAR_LAMAR))
TASK_CLEAR_LOOK_AT(psLamar.PedIndex)
TASK_CLEAR_LOOK_AT(psTrevor.PedIndex)
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC MANAGE_LAMAR_IN_GROVE_STREET(PED_STRUCT &ped, PED_INDEX TargetPedIndex)
IF DOES_ENTITY_EXIST(ped.PedIndex)
AND NOT IS_ENTITY_DEAD(ped.PedIndex)
IF DOES_ENTITY_EXIST(TargetPedIndex)
AND NOT IS_PED_INJURED(TargetPedIndex)
#IF IS_DEBUG_BUILD //debug info display
IF ( bDrawDebugStates = TRUE)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_STRING_FROM_INT(ped.iProgress), 1.35)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_STRING_FROM_FLOAT(GET_PED_HEALTH_RATIO(ped.PedIndex)), 1.45)
IF ( ped.bWaitingToAdvance = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, "WAITING_TO_ADVANCE", 1.55)
ENDIF
ENDIF
ped.sDebugName = "Lamar"
#ENDIF
SET_PED_RESET_FLAG(ped.PedIndex, PRF_DontSuppressUseNavMeshToNavigateToVehicleDoorWhenVehicleInWater, TRUE) //fix for B*2027310
SET_PED_RESET_FLAG(ped.PedIndex, PRF_BlockWeaponReactionsUnlessDead, TRUE) //block weapon reactions
SET_PED_RESET_FLAG(ped.PedIndex, PRF_DisableFriendlyGunReactAudio, TRUE)
ped.fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(ped.PedIndex, TargetPedIndex) //get distance to player
ped.fDistanceToCoord = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(ped.PedIndex), vGroveStreetStart) //get distance to shootout start
SWITCH ped.eState
CASE PED_STATE_COMBAT_ON_FOOT
SWITCH ped.iProgress
CASE 0 //make Lamar wait in cover for shootout combat to begin
IF NOT DOES_BLIP_EXIST(ped.BlipIndex)
ped.BlipIndex = CREATE_BLIP_FOR_ENTITY(ped.PedIndex, FALSE)
ENDIF
IF ( ped.bHasTask = FALSE )
SET_ENTITY_HEALTH(ped.PedIndex, MAX_BUDDY_PED_HEALTH)
SET_PED_MAX_HEALTH(ped.PedIndex, MAX_BUDDY_PED_HEALTH)
SET_PED_SUFFERS_CRITICAL_HITS(ped.PedIndex, FALSE)
SET_PED_PROOFS(ped.PedIndex, FALSE, TRUE, TRUE, FALSE, FALSE)
GIVE_WEAPON_TO_PED(ped.PedIndex, WEAPONTYPE_ASSAULTRIFLE, INFINITE_AMMO, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, TRUE)
ped.bHasTask = TRUE
ENDIF
IF ( Events[EVENT_SHOOTOUT_STARTED] = TRUE ) //if shootout is started, move on to the next stage
ped.iTimer = GET_GAME_TIMER()
ped.bHasTask = FALSE
ped.iProgress++
ENDIF
BREAK
CASE 1 //make Lamar wait a bit in cover behind low white wall after the shootout started, then make Lamar go to combat
IF ( ped.bHasTask = FALSE )
IF HAS_TIME_PASSED(1250, ped.iTimer)
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF NOT IS_PED_IN_COVER(ped.PedIndex)
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, csCoverpoints[1].vPosition, 1750, FALSE, 0, TRUE, FALSE)
ENDIF
IF NOT IS_PED_INJURED(esGroup1[0].PedIndex)
TASK_COMBAT_PED(NULL, esGroup1[0].PedIndex)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 150.0)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(ped.PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
SET_PED_COMBAT_PROPERTIES(ped.PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER, FALSE)
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<83.982208,-1948.702637,19.784775>>, <<84.980690,-1947.491943,21.768717>>, 1.5)
SET_PED_COVER_PROPERTIES(ped.PedIndex, TRUE, FALSE, TRUE, TRUE)
SET_PED_PREFERRED_COVERPOINT(ped.PedIndex, ped.ItemsetIndex, csCoverpoints[1].CoverpointIndex)
SET_PED_SHOOTING_PROPERTIES(ped.PedIndex, 15, 90, FIRING_PATTERN_FULL_AUTO)
ped.bHasTask = TRUE
ENDIF
ENDIF
IF SHOULD_ALLIES_LEAVE_STARTING_COVER()
ped.iTimer = GET_GAME_TIMER()
ped.bHasTask = FALSE
ped.iProgress++
ENDIF
BREAK
CASE 2 //make Lamar move to the end of low white wall and combat from there
IF ( ped.bHasTask = FALSE )
IF HAS_TIME_PASSED(300, ped.iTimer)
SET_PED_COMBAT_PROPERTIES(ped.PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, FALSE)
SET_PED_DEFENSIVE_AREA_SPHERE(ped.PedIndex, LamarShootoutPositions[0], 0.76, TRUE)
SET_PED_MOVEMENT_PROPERTIES(ped.PedIndex, 1.0, 0.0)
SET_PED_SHOOTING_PROPERTIES(ped.PedIndex, 15, 90, FIRING_PATTERN_FULL_AUTO)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(ped.PedIndex, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ped.bHasTask = TRUE
ENDIF
ENDIF
IF SHOULD_ALLIES_ADVANCE_TO_STREET()
ped.bHasTask = FALSE
ped.iProgress++
ENDIF
BREAK
CASE 3 //make Lamar move close to the first car
IF ( ped.bHasTask = FALSE )
SET_PED_COMBAT_PROPERTIES(ped.PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, FALSE)
SET_PED_DEFENSIVE_AREA_SPHERE(ped.PedIndex, LamarShootoutPositions[1], 5.0, TRUE)
SET_PED_COVER_PROPERTIES(ped.PedIndex, TRUE)
SET_PED_MOVEMENT_PROPERTIES(ped.PedIndex, 1.0, 0.0)
SET_PED_SHOOTING_PROPERTIES(ped.PedIndex, 15, 90, FIRING_PATTERN_FULL_AUTO)
ped.bHasTask = TRUE
ENDIF
IF SHOULD_ALLIES_ADVANCE_TO_UP_STREET_1()
ped.bHasTask = FALSE
ped.iProgress++
ENDIF
BREAK
CASE 4 //make Lamar move to the green bin on the left side of the street
IF ( ped.bHasTask = FALSE )
SET_PED_COMBAT_PROPERTIES(ped.PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, FALSE)
SET_PED_MOVEMENT_PROPERTIES(ped.PedIndex, 1.0, 0.0)
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<85.600143,-1910.209351,19.930676>>, <<86.443237,-1909.208374,22.010962>>, 1.25, TRUE)
STORE_DEFENSIVE_AREA_ANGLED(sLamarsDefensiveArea, <<85.600143,-1910.209351,19.930676>>, <<86.443237,-1909.208374,22.010962>>, 1.25)
SET_PED_COVER_PROPERTIES(ped.PedIndex, TRUE, TRUE, FALSE, TRUE, 16.0, FALSE, 0.0, 3.0, 8.0)
SET_PED_PREFERRED_COVERPOINT(ped.PedIndex, ped.ItemsetIndex, csCoverpoints[35].CoverpointIndex)
SET_PED_SHOOTING_PROPERTIES(ped.PedIndex, 15, 90, FIRING_PATTERN_FULL_AUTO)
ped.bDefensiveAreaTaken = FALSE
ped.bBehindPlayer = FALSE
ped.bInPosition = FALSE
ped.bHasTask = TRUE
ENDIF
IF ( ped.bInPosition = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(ped.PedIndex, sLamarsDefensiveArea)
ped.bInPosition = TRUE
ENDIF
ENDIF
IF ( ped.bDefensiveAreaTaken = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sLamarsDefensiveArea)
IF ( ped.bInPosition = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(ped.PedIndex, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ENDIF
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<87.089577,-1909.869141,19.598919>>, <<83.724327,-1913.982178,22.993858>>, 4.0)
STORE_DEFENSIVE_AREA_ANGLED(sLamarsDefensiveArea, <<87.089577,-1909.869141,19.598919>>, <<83.724327,-1913.982178,22.993858>>, 4.0)
REMOVE_PED_PREFERRED_COVERPOINT(ped.PedIndex, ped.ItemsetIndex)
ped.bDefensiveAreaTaken = TRUE
ENDIF
ELSE
IF NOT IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sLamarsDefensiveArea)
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<85.600143,-1910.209351,19.930676>>, <<86.443237,-1909.208374,22.010962>>, 1.25, TRUE)
STORE_DEFENSIVE_AREA_ANGLED(sLamarsDefensiveArea, <<85.600143,-1910.209351,19.930676>>, <<86.443237,-1909.208374,22.010962>>, 1.25)
SET_PED_PREFERRED_COVERPOINT(ped.PedIndex, ped.ItemsetIndex, csCoverpoints[35].CoverpointIndex)
ped.bDefensiveAreaTaken = FALSE
ENDIF
ENDIF
IF SHOULD_ALLIES_ADVANCE_TO_UP_STREET_2()
IF IS_ENTITY_CLOSE_ENOUGH_TO_TARGET_ENTITY(ped.PedIndex, TargetPedIndex, ped.fDistanceToTargetPed, 25, vGroveStreetStart)
ped.bWaitingToAdvance = FALSE
ped.bDefensiveAreaTaken = FALSE
ped.bHasTask = FALSE
ped.iProgress++
ELSE
ped.bWaitingToAdvance = TRUE
ENDIF
ENDIF
BREAK
CASE 5 //make Lamar move to the elecricity box on the corner of the street
IF ( ped.bHasTask = FALSE )
SET_PED_COMBAT_PROPERTIES(ped.PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, FALSE)
SET_PED_MOVEMENT_PROPERTIES(ped.PedIndex, 1.0, 0.0)
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<77.564301,-1895.341797,20.497177>>, <<74.564690,-1898.971680,23.120573>>, 2.5)
STORE_DEFENSIVE_AREA_ANGLED(sLamarsDefensiveArea, <<77.564301,-1895.341797,20.497177>>, <<74.564690,-1898.971680,23.120573>>, 2.5)
SET_PED_COVER_PROPERTIES(ped.PedIndex, TRUE, TRUE, FALSE, TRUE)
SET_PED_PREFERRED_COVERPOINT(ped.PedIndex, ped.ItemsetIndex, csCoverpoints[58].CoverpointIndex)
SET_PED_SHOOTING_PROPERTIES(ped.PedIndex, 15, 90, FIRING_PATTERN_FULL_AUTO)
ped.bHasTask = TRUE
ENDIF
IF ( ped.bDefensiveAreaTaken = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sLamarsDefensiveArea)
SET_PED_DEFENSIVE_AREA_SPHERE(ped.PedIndex, << 73.83, -1897.55, 20.67 >>, 4.0, FALSE)
STORE_DEFENSIVE_AREA_SPHERE(sLamarsDefensiveArea, << 73.83, -1897.55, 20.67 >>, 4.0)
ped.bDefensiveAreaTaken = TRUE
ENDIF
ELSE
IF NOT IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sLamarsDefensiveArea)
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<77.564301,-1895.341797,20.497177>>, <<74.564690,-1898.971680,23.120573>>, 2.5)
STORE_DEFENSIVE_AREA_ANGLED(sLamarsDefensiveArea, <<77.564301,-1895.341797,20.497177>>, <<74.564690,-1898.971680,23.120573>>, 2.5)
ped.bDefensiveAreaTaken = FALSE
ENDIF
ENDIF
IF IS_ENEMY_PED_DEAD(esPorchEnemies[0])
IF SHOULD_ALLIES_ADVANCE_TO_UP_STREET_3()
IF IS_ENTITY_CLOSE_ENOUGH_TO_TARGET_ENTITY(ped.PedIndex, TargetPedIndex, ped.fDistanceToTargetPed, 40, vGroveStreetStart)
ped.bWaitingToAdvance = FALSE
ped.bHasTask = FALSE
ped.bDefensiveAreaTaken = FALSE
ped.iProgress++
ELSE
ped.bWaitingToAdvance = TRUE
ENDIF
ENDIF
ENDIF
BREAK
CASE 6 //make Lamar move to the first white wall corner
IF ( ped.bHasTask = FALSE)
SET_PED_COMBAT_PROPERTIES(ped.PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER, FALSE)
SET_PED_SHOOTING_PROPERTIES(ped.PedIndex, 15, 90, FIRING_PATTERN_FULL_AUTO)
SET_PED_COVER_PROPERTIES(ped.PedIndex, TRUE, TRUE, FALSE, FALSE, 6.0, FALSE, 0.0, 3.0)
SET_PED_PREFERRED_COVERPOINT(ped.PedIndex, ped.ItemsetIndex, csCoverpoints[32].CoverpointIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<60.649189,-1886.116943,20.631060>>, <<59.815632,-1887.141357,23.162979>>, 1.5, TRUE)
STORE_DEFENSIVE_AREA_ANGLED(sLamarsDefensiveArea, <<60.649189,-1886.116943,20.631060>>, <<59.815632,-1887.141357,23.162979>>, 1.5)
ped.bDefensiveAreaTaken = FALSE
ped.bInPosition = FALSE
ped.bHasTask = TRUE
ENDIF
IF ( ped.bInPosition = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(ped.PedIndex, sLamarsDefensiveArea)
ped.bInPosition = TRUE
ENDIF
ENDIF
IF ( ped.bDefensiveAreaTaken = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sLamarsDefensiveArea)
IF ( ped.bInPosition = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(ped.PedIndex, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ENDIF
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<61.658737,-1886.880981,20.171867>>, <<56.869209,-1892.697510,23.476622>>, 5.0)
STORE_DEFENSIVE_AREA_ANGLED(sLamarsDefensiveArea, <<61.658737,-1886.880981,20.171867>>, <<56.869209,-1892.697510,23.476622>>, 5.0)
REMOVE_PED_PREFERRED_COVERPOINT(ped.PedIndex, ped.ItemsetIndex)
SET_PED_COVER_PROPERTIES(ped.PedIndex, TRUE, FALSE, FALSE, FALSE)
ped.bDefensiveAreaTaken = TRUE
ENDIF
ELSE
IF NOT IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sLamarsDefensiveArea)
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<60.649189,-1886.116943,20.631060>>, <<59.815632,-1887.141357,23.162979>>, 1.5)
STORE_DEFENSIVE_AREA_ANGLED(sLamarsDefensiveArea, <<60.649189,-1886.116943,20.631060>>, <<59.815632,-1887.141357,23.162979>>, 1.5)
SET_PED_PREFERRED_COVERPOINT(ped.PedIndex, ped.ItemsetIndex, csCoverpoints[32].CoverpointIndex)
ped.bDefensiveAreaTaken = FALSE
ENDIF
ENDIF
IF SHOULD_ALLIES_ADVANCE_TO_UP_STREET_4()
IF IS_ENTITY_CLOSE_ENOUGH_TO_TARGET_ENTITY(ped.PedIndex, TargetPedIndex, ped.fDistanceToTargetPed, 25, vGroveStreetStart)
ped.bWaitingToAdvance = FALSE
ped.bHasTask = FALSE
ped.iProgress++
ELSE
ped.bWaitingToAdvance = TRUE
ENDIF
ENDIF
BREAK
CASE 7 //make Lamar go to the second white wall corner
IF ( ped.bHasTask = FALSE )
SET_PED_COMBAT_PROPERTIES(ped.PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER, FALSE)
SET_PED_SHOOTING_PROPERTIES(ped.PedIndex, 15, 90, FIRING_PATTERN_FULL_AUTO)
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<46.914013,-1874.782715,20.902359>>, <<45.906673,-1875.919922,24.362179>>, 1.5)
STORE_DEFENSIVE_AREA_ANGLED(sLamarsDefensiveArea, <<46.914013,-1874.782715,20.902359>>, <<45.906673,-1875.919922,24.362179>>, 1.5)
SET_PED_COVER_PROPERTIES(ped.PedIndex, TRUE, TRUE, FALSE, FALSE, 6.0, FALSE, 0.0, 3.0)
SET_PED_PREFERRED_COVERPOINT(ped.PedIndex, ped.ItemsetIndex, csCoverpoints[28].CoverpointIndex)
ped.bDefensiveAreaTaken = FALSE
ped.bInPosition = FALSE
ped.bHasTask = TRUE
ENDIF
IF ( ped.bInPosition = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(ped.PedIndex, sLamarsDefensiveArea)
ped.bInPosition = TRUE
ENDIF
ENDIF
IF ( ped.bDefensiveAreaTaken = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sLamarsDefensiveArea)
IF ( ped.bInPosition = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(ped.PedIndex, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ENDIF
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<48.228836,-1875.824707,20.864565>>, <<43.268642,-1881.522461,24.114298>>, 5.0)
STORE_DEFENSIVE_AREA_ANGLED(sLamarsDefensiveArea, <<48.228836,-1875.824707,20.864565>>, <<43.268642,-1881.522461,24.114298>>, 5.0)
REMOVE_PED_PREFERRED_COVERPOINT(ped.PedIndex, ped.ItemsetIndex)
SET_PED_COVER_PROPERTIES(ped.PedIndex, TRUE, FALSE, FALSE, FALSE)
ped.bDefensiveAreaTaken = TRUE
ENDIF
ELSE
IF NOT IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sLamarsDefensiveArea)
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<46.914013,-1874.782715,20.902359>>, <<45.906673,-1875.919922,24.362179>>, 1.5)
STORE_DEFENSIVE_AREA_ANGLED(sLamarsDefensiveArea, <<46.914013,-1874.782715,20.902359>>, <<45.906673,-1875.919922,24.362179>>, 1.5)
SET_PED_PREFERRED_COVERPOINT(ped.PedIndex, ped.ItemsetIndex, csCoverpoints[28].CoverpointIndex)
ped.bDefensiveAreaTaken = FALSE
ENDIF
ENDIF
IF SHOULD_ALLIES_ADVANCE_TO_UP_STREET_5()
IF IS_ENTITY_CLOSE_ENOUGH_TO_TARGET_ENTITY(ped.PedIndex, TargetPedIndex, ped.fDistanceToTargetPed, 25, vGroveStreetStart)
ped.bWaitingToAdvance = FALSE
ped.bHasTask = FALSE
ped.iProgress++
ELSE
ped.bWaitingToAdvance = TRUE
ENDIF
ENDIF
BREAK
CASE 8 //make Lamar move to the third white wall corner
IF ( ped.bHasTask = FALSE )
SET_PED_COMBAT_PROPERTIES(ped.PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER, FALSE)
SET_PED_SHOOTING_PROPERTIES(ped.PedIndex, 15, 90, FIRING_PATTERN_FULL_AUTO)
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<31.006004,-1861.029419,21.636925>>, <<29.675428,-1862.520874,25.219547>>, 1.5)
STORE_DEFENSIVE_AREA_ANGLED(sLamarsDefensiveArea, <<31.006004,-1861.029419,21.636925>>, <<29.675428,-1862.520874,25.219547>>, 1.5)
SET_PED_COVER_PROPERTIES(ped.PedIndex, TRUE, TRUE, FALSE, FALSE, 6.0, FALSE, 0.0, 3.0)
SET_PED_PREFERRED_COVERPOINT(ped.PedIndex, ped.ItemsetIndex, csCoverpoints[30].CoverpointIndex)
ped.bDefensiveAreaTaken = FALSE
ped.bBehindPlayer = FALSE
ped.bInPosition = FALSE
ped.bHasTask = TRUE
ENDIF
IF ( ped.bInPosition = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(ped.PedIndex, sLamarsDefensiveArea)
ped.bInPosition = TRUE
ENDIF
ENDIF
IF ( ped.bDefensiveAreaTaken = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sLamarsDefensiveArea)
IF ( ped.bInPosition = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(ped.PedIndex, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ENDIF
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<32.000683,-1861.708740,21.591938>>, <<27.473648,-1866.846558,25.148037>>, 4.0)
STORE_DEFENSIVE_AREA_ANGLED(sLamarsDefensiveArea, <<32.000683,-1861.708740,21.591938>>, <<27.473648,-1866.846558,25.148037>>, 4.0)
REMOVE_PED_PREFERRED_COVERPOINT(ped.PedIndex, psLamar.ItemsetIndex)
SET_PED_COVER_PROPERTIES(ped.PedIndex, TRUE, FALSE, FALSE, FALSE)
ped.bDefensiveAreaTaken = TRUE
ENDIF
ELSE
IF NOT IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sLamarsDefensiveArea)
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<31.006004,-1861.029419,21.636925>>, <<29.675428,-1862.520874,25.219547>>, 1.5)
STORE_DEFENSIVE_AREA_ANGLED(sLamarsDefensiveArea, <<31.006004,-1861.029419,21.636925>>, <<29.675428,-1862.520874,25.219547>>, 1.5)
SET_PED_PREFERRED_COVERPOINT(ped.PedIndex, ped.ItemsetIndex, csCoverpoints[30].CoverpointIndex)
ped.bDefensiveAreaTaken = FALSE
ENDIF
ENDIF
IF ( Events[EVENT_ENEMIES_GROUP8_KILLED] = TRUE )
IF IS_ENTITY_CLOSE_ENOUGH_TO_TARGET_ENTITY(ped.PedIndex, TargetPedIndex, ped.fDistanceToTargetPed, 25, vGroveStreetStart)
ped.bWaitingToAdvance = FALSE
ped.bBehindPlayer = FALSE
ped.bHasTask = FALSE
ped.iProgress++
ELSE
ped.bWaitingToAdvance = TRUE
ENDIF
ELSE
IF ( ped.bBehindPlayer = FALSE )
IF NOT IS_ENEMY_PED_DEAD(esGroup8[1])
IF ( ped.bInPosition = TRUE )
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN)), vAlleyEntrance) < GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(ped.PedIndex), vAlleyEntrance)
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_TREVOR)), vAlleyEntrance) < GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(ped.PedIndex), vAlleyEntrance)
SET_PED_DEFENSIVE_AREA_SPHERE(ped.PedIndex, << 23.08, -1857.19, 22.56 >>, 1.25, TRUE)
ped.bBehindPlayer = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 9 //make Lamar run to the fourth white wall cover
IF ( ped.bHasTask = FALSE )
SET_PED_COMBAT_PROPERTIES(ped.PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER, FALSE)
SET_PED_SHOOTING_PROPERTIES(ped.PedIndex, 15, 90, FIRING_PATTERN_FULL_AUTO)
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<21.373867,-1852.910889,22.234501>>, <<19.742620,-1854.827148,25.728672>>, 2.0)
STORE_DEFENSIVE_AREA_ANGLED(sLamarsDefensiveArea, <<21.373867,-1852.910889,22.234501>>, <<19.742620,-1854.827148,25.728672>>, 2.0)
SET_PED_COVER_PROPERTIES(ped.PedIndex, TRUE, TRUE, FALSE, FALSE, 6.0, FALSE, 0.0, 3.0)
SET_PED_PREFERRED_COVERPOINT(ped.PedIndex, ped.ItemsetIndex, csCoverpoints[34].CoverpointIndex)
ped.bDefensiveAreaTaken = FALSE
ped.bInPosition = FALSE
ped.bHasTask = TRUE
ENDIF
IF ( ped.bInPosition = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(ped.PedIndex, sLamarsDefensiveArea)
ped.bInPosition = TRUE
ENDIF
ENDIF
IF ( ped.bDefensiveAreaTaken = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sLamarsDefensiveArea)
IF ( ped.bInPosition = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(ped.PedIndex, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ENDIF
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<22.464781,-1853.238159,22.331705>>, <<17.881580,-1858.349365,25.682585>>, 4.0)
STORE_DEFENSIVE_AREA_ANGLED(sLamarsDefensiveArea, <<22.464781,-1853.238159,22.331705>>, <<17.881580,-1858.349365,25.682585>>, 4.0)
REMOVE_PED_PREFERRED_COVERPOINT(ped.PedIndex, ped.ItemsetIndex)
SET_PED_COVER_PROPERTIES(ped.PedIndex, TRUE, FALSE, FALSE, FALSE)
ped.bDefensiveAreaTaken = TRUE
ENDIF
ELSE
IF NOT IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sLamarsDefensiveArea)
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<21.373867,-1852.910889,22.234501>>, <<19.742620,-1854.827148,25.728672>>, 2.0)
STORE_DEFENSIVE_AREA_ANGLED(sLamarsDefensiveArea, <<21.373867,-1852.910889,22.234501>>, <<19.742620,-1854.827148,25.728672>>, 2.0)
SET_PED_PREFERRED_COVERPOINT(ped.PedIndex, ped.ItemsetIndex, csCoverpoints[34].CoverpointIndex)
ped.bDefensiveAreaTaken = FALSE
ENDIF
ENDIF
IF ( GET_NUMBER_OF_ENEMIES_ALIVE(esGroup7) <= 1 )
AND ( Events[EVENT_ENEMIES_GROUP8_KILLED] = TRUE )
AND ( Events[EVENT_ENEMIES_CARSTREETRIGHT_KILLED] = TRUE )
IF IS_ENTITY_CLOSE_ENOUGH_TO_TARGET_ENTITY(ped.PedIndex, TargetPedIndex, ped.fDistanceToTargetPed, 25, vGroveStreetStart)
ped.bWaitingToAdvance = FALSE
ped.bHasTask = FALSE
ped.iProgress++
ELSE
ped.bWaitingToAdvance = TRUE
ENDIF
ENDIF
BREAK
CASE 10 //make Lamar run to the orange wall corner
IF ( ped.bHasTask = FALSE )
SET_PED_COMBAT_PROPERTIES(ped.PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER, FALSE)
SET_PED_SHOOTING_PROPERTIES(ped.PedIndex, 15, 90, FIRING_PATTERN_FULL_AUTO)
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<11.226377,-1842.662476,23.029819>>, <<7.591852,-1846.963135,25.803003>>, 4.0)
STORE_DEFENSIVE_AREA_ANGLED(sLamarsDefensiveArea, <<11.226377,-1842.662476,23.029819>>, <<7.591852,-1846.963135,25.803003>>, 4.0)
SET_PED_COVER_PROPERTIES(ped.PedIndex, TRUE, TRUE, FALSE, FALSE, 6.0, FALSE, 0.0, 3.0)
SET_PED_PREFERRED_COVERPOINT(ped.PedIndex, ped.ItemsetIndex, csCoverpoints[59].CoverpointIndex)
ped.bHasTask = TRUE
ENDIF
IF ( Events[EVENT_COPS_ARRIVE] = TRUE )
GO_TO_PED_STATE(ped, PED_STATE_RUNNING_TO_ALLEY)
ENDIF
BREAK
ENDSWITCH
IF ( Events[EVENT_COPS_ARRIVE] = TRUE )
GO_TO_PED_STATE(ped, PED_STATE_RUNNING_TO_ALLEY)
ENDIF
BREAK
CASE PED_STATE_RUNNING_TO_ALLEY
IF ( ped.bHasTask = FALSE )
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, TRUE)
TASK_FOLLOW_NAV_MESH_TO_COORD(ped.PedIndex, << -22.67, -1846.52, 24.27 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS * 2, ENAV_NO_STOPPING)
//TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(ped.PedIndex, << -22.67, -1846.52, 24.27 >>, << -29.40, -1829.25, 24.95 >>, PEDMOVE_SPRINT, TRUE)
//TASK_FOLLOW_NAV_MESH_TO_COORD(ped.PedIndex, << -22.67, -1846.52, 24.27 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP * 3)
//TASK_COMBAT_HATED_TARGETS_AROUND_PED(ped.PedIndex, 200.0)
//SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
//SET_PED_MOVEMENT_PROPERTIES(psLamar.PedIndex, 0.25, 0.0)
SET_PED_COMBAT_PROPERTIES(ped.PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, FALSE)
SET_PED_SHOOTING_PROPERTIES(ped.PedIndex, 30, 90, FIRING_PATTERN_FULL_AUTO)
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<-25.168402,-1849.832520,24.081337>>, <<-23.603153,-1848.054199,27.270437>>, 2.0)
SET_PED_COVER_PROPERTIES(ped.PedIndex, FALSE)
REMOVE_PED_PREFERRED_COVERPOINT(ped.PedIndex, ped.ItemsetIndex)
ped.bHasTask = TRUE
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(psLamar.PedIndex, <<-43.314060,-1866.162598,23.556183>>, <<-24.120207,-1844.029419,29.362137>>, 8.0)
GO_TO_PED_STATE(ped, PED_STATE_WAITING_IN_ALLEY)
ENDIF
BREAK
CASE PED_STATE_WAITING_IN_ALLEY
IF ( ped.bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(ped.PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(ped.PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, FALSE)
SET_PED_DEFENSIVE_AREA_ANGLED(ped.PedIndex, <<-25.168402,-1849.832520,24.081337>>, <<-23.603153,-1848.054199,27.270437>>, 2.0)
SET_PED_SHOOTING_PROPERTIES(ped.PedIndex, 30, 100, FIRING_PATTERN_FULL_AUTO)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ped.bWaitingForPlayer = TRUE
ped.iTimer = GET_GAME_TIMER()
ped.bHasTask = TRUE
ENDIF
IF SHOULD_ALLIES_RUN_TO_RIVER()
GO_TO_PED_STATE(ped, PED_STATE_RUNNING_TO_RIVER)
ENDIF
REQUEST_WAYPOINT_RECORDING("fra1_lamar")
BREAK
CASE PED_STATE_RUNNING_TO_RIVER
IF ( ped.bHasTask = FALSE )
REQUEST_WAYPOINT_RECORDING("fra1_lamar")
IF GET_IS_WAYPOINT_RECORDING_LOADED("fra1_lamar")
//CLEAR_PED_TASKS(ped.PedIndex)
REMOVE_PED_DEFENSIVE_AREA(ped.PedIndex)
SET_PED_PROOFS(ped.PedIndex, FALSE, FALSE, FALSE, FALSE, FALSE)
SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(ped.PedIndex, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, TRUE)
TASK_FOLLOW_WAYPOINT_RECORDING(ped.PedIndex, "fra1_lamar", 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_TURN_TO_FACE_WAYPOINT_HEADING_AT_END)
//TASK_FOLLOW_NAV_MESH_TO_COORD(ped.PedIndex, <<-115.4358, -1861.7389, 1.2639>>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP * 3)
ped.iPedConversationTimer = GET_GAME_TIMER()
ped.bWaitingForPlayer = FALSE
ped.bFleeing = TRUE
ped.bHasTask = TRUE
ENDIF
ENDIF
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(ped.PedIndex)
IF IS_PED_RUNNING(TargetPedIndex)
OR IS_PED_SPRINTING(TargetPedIndex)
WAYPOINT_PLAYBACK_OVERRIDE_SPEED(ped.PedIndex, PEDMOVE_SPRINT)
ELSE
WAYPOINT_PLAYBACK_OVERRIDE_SPEED(ped.PedIndex, PEDMOVE_RUN)
ENDIF
ELSE
IF IS_PED_RUNNING(TargetPedIndex)
OR IS_PED_SPRINTING(TargetPedIndex)
SET_PED_DESIRED_MOVE_BLEND_RATIO(ped.PedIndex, PEDMOVE_SPRINT)
ELSE
SET_PED_DESIRED_MOVE_BLEND_RATIO(ped.PedIndex, PEDMOVE_RUN)
ENDIF
ENDIF
//IF ( GET_PED_WAYPOINT_PROGRESS(ped.PedIndex) > 25 )
IF ( ped.fDistanceToTargetPed > 25.0 ) AND bShouldAlliesWaitForPlayer
IF GET_DISTANCE_BETWEEN_COORDS(vFilmCrewBeginAnimPosition, GET_ENTITY_COORDS(TargetPedIndex)) > GET_DISTANCE_BETWEEN_COORDS(vFilmCrewBeginAnimPosition, GET_ENTITY_COORDS(ped.PedIndex))
GO_TO_PED_STATE(ped, PED_STATE_WAITING_FOR_PLAYER)
ENDIF
ENDIF
//ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(ped.PedIndex), vsSpeedophiles[1].vPosition) < 20.0
GO_TO_PED_STATE(ped, PED_STATE_RUNNING_TO_VEHICLE)
ENDIF
BREAK
CASE PED_STATE_WAITING_FOR_PLAYER
IF ( ped.bHasTask = FALSE )
CLEAR_PED_TASKS(ped.PedIndex)
SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(ped.PedIndex, FALSE)
SEQUENCE_FACE_AND_LOOK_AT_PED(ped.PedIndex, TargetPedIndex, -1, SLF_USE_TORSO | SLF_FAST_TURN_RATE)
ped.iTimer = GET_GAME_TIMER()
ped.bWaitingForPlayer = TRUE
ped.bHasTask = TRUE
ENDIF
IF ( ped.fDistanceToTargetPed < 10.0 )
OR GET_DISTANCE_BETWEEN_COORDS(vFilmCrewBeginAnimPosition, GET_ENTITY_COORDS(TargetPedIndex)) < GET_DISTANCE_BETWEEN_COORDS(vFilmCrewBeginAnimPosition, GET_ENTITY_COORDS(ped.PedIndex))
TASK_CLEAR_LOOK_AT(ped.PedIndex)
GO_TO_PED_STATE(ped, PED_STATE_RUNNING_TO_RIVER)
ELSE
IF HAS_TIME_PASSED(1000, ped.iTimer)
GO_TO_PED_STATE(ped, PED_STATE_WAITING_FOR_PLAYER)
ENDIF
ENDIF
BREAK
CASE PED_STATE_RUNNING_TO_VEHICLE
IF ( ped.bHasTask = FALSE )
CLEAR_PED_TASKS(ped.PedIndex)
SEQUENCE_INDEX SequenceIndex
OPEN_SEQUENCE_TASK(SequenceIndex)
IF NOT IS_PED_INJURED(psFilmCrew[FCP_GIRL].PedIndex)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<-116.9544, -1861.3503, 0.9790>> /*<< -159.64218, -1842.44299, -0.44773 >>*/, psFilmCrew[FCP_GIRL].PedIndex, PEDMOVE_RUN, FALSE)
TASK_AIM_GUN_AT_ENTITY(NULL, psFilmCrew[FCP_GIRL].PedIndex, -1, TRUE)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-116.9544, -1861.3503, 0.9790>> /*<< -159.64218, -1842.44299, -0.44773 >>*/, << -164.11, -1847.47, 0.46 >>, PEDMOVE_RUN, FALSE)
TASK_AIM_GUN_AT_COORD(NULL, << -164.11, -1847.47, 0.46 >>, -1, TRUE)
ENDIF
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(ped.PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
ped.bFleeing = TRUE
ped.bHasTask = TRUE
ENDIF
IF ( ped.bHasTask = TRUE )
IF ( GET_SCRIPT_TASK_STATUS(ped.PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK )
IF ( GET_SEQUENCE_PROGRESS(ped.PedIndex) = 1 )
GO_TO_PED_STATE(ped, PED_STATE_WAITING_AT_VEHICLE)
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_WAITING_AT_VEHICLE
IF ( ped.bHasTask = FALSE )
IF NOT IS_PED_INJURED(psFilmCrew[FCP_GIRL].PedIndex)
TASK_AIM_GUN_AT_ENTITY(ped.PedIndex, psFilmCrew[FCP_GIRL].PedIndex, -1, TRUE)
ELSE
TASK_AIM_GUN_AT_COORD(ped.PedIndex, << -164.11, -1847.47, 0.46 >>, -1, TRUE)
ENDIF
iLamarEnterSeasharkDelayTimer = 0
ped.bHasTask = TRUE
ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(TargetPedIndex), vsSpeedophiles[0].vPosition) < 10.0
OR GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(TargetPedIndex), vsSpeedophiles[1].vPosition) < 10.0
OR GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(TargetPedIndex), vsSpeedophiles[2].vPosition) < 10.0
IF ( iLamarEnterSeasharkDelayTimer = 0)
iLamarEnterSeasharkDelayTimer = GET_GAME_TIMER()
ELSE
IF HAS_TIME_PASSED(500, iLamarEnterSeasharkDelayTimer)
CLEAR_PED_TASKS(ped.PedIndex)
GO_TO_PED_STATE(ped, PED_STATE_ENTERING_VEHICLE)
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_ENTERING_VEHICLE
IF ( ped.bHasTask = FALSE )
IF ( ped.ePedVehicle = MAX_SPEEDOPHILES )
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex)
IF IS_VEHICLE_SEAT_FREE(vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex, VS_DRIVER)
IF GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_FRANKLIN)) <> vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex
AND GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_TREVOR)) <> vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex
TASK_ENTER_VEHICLE(ped.PedIndex, vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex, DEFAULT_TIME_BEFORE_WARP, VS_DRIVER, PEDMOVE_RUN, ECF_JACK_ANYONE)
ped.ePedVehicle = SPEEDOPHILE_2
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " is tasked to enter SPEEDOPHILE_2.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( ped.ePedVehicle = MAX_SPEEDOPHILES )
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex)
IF IS_VEHICLE_SEAT_FREE(vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex, VS_DRIVER)
IF GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_FRANKLIN)) <> vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex
AND GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_TREVOR)) <> vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex
TASK_ENTER_VEHICLE(ped.PedIndex, vsSpeedophiles[2].VehicleIndex, DEFAULT_TIME_BEFORE_WARP, VS_DRIVER, PEDMOVE_RUN, ECF_JACK_ANYONE)
ped.ePedVehicle = SPEEDOPHILE_3
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " is tasked to enter SPEEDOPHILE_3.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( ped.ePedVehicle = MAX_SPEEDOPHILES )
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex)
IF IS_VEHICLE_SEAT_FREE(vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, VS_DRIVER)
IF GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_FRANKLIN)) <> vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex
AND GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_TREVOR)) <> vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex
TASK_ENTER_VEHICLE(ped.PedIndex, vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, DEFAULT_TIME_BEFORE_WARP, VS_DRIVER, PEDMOVE_RUN, ECF_JACK_ANYONE)
ped.ePedVehicle = SPEEDOPHILE_1
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " is tasked to enter SPEEDOPHILE_1.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ped.bHasTask = TRUE
ENDIF
SWITCH ped.ePedVehicle
CASE SPEEDOPHILE_1
CASE SPEEDOPHILE_2
CASE SPEEDOPHILE_3
#IF IS_DEBUG_BUILD
SWITCH ped.ePedVehicle
CASE SPEEDOPHILE_1
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " is assigned SPEEDOPHILE_1.")
BREAK
CASE SPEEDOPHILE_2
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " is assigned SPEEDOPHILE_2.")
BREAK
CASE SPEEDOPHILE_3
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " is assigned SPEEDOPHILE_3.")
BREAK
ENDSWITCH
#ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[ped.ePedVehicle].VehicleIndex) //change this to vehicle array
//it is possible to still block them
IF NOT IS_PED_IN_VEHICLE(ped.PedIndex, vsSpeedophiles[ped.ePedVehicle].VehicleIndex, TRUE)
IF NOT IS_VEHICLE_SEAT_FREE(vsSpeedophiles[ped.ePedVehicle].VehicleIndex, VS_DRIVER)
OR vsSpeedophiles[ped.ePedVehicle].VehicleIndex = GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_FRANKLIN))
OR vsSpeedophiles[ped.ePedVehicle].VehicleIndex = GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_TREVOR))
CLEAR_PED_TASKS(ped.PedIndex)
ped.ePedVehicle = MAX_SPEEDOPHILES
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " has to pick a different vehicle.")
#ENDIF
GO_TO_PED_STATE(ped, PED_STATE_ENTERING_VEHICLE)
ENDIF
IF GET_SCRIPT_TASK_STATUS(ped.PedIndex, SCRIPT_TASK_ENTER_VEHICLE) != WAITING_TO_START_TASK
AND GET_SCRIPT_TASK_STATUS(ped.PedIndex, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
CLEAR_PED_TASKS(ped.PedIndex)
ped.ePedVehicle = MAX_SPEEDOPHILES
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " has to be retasked to enter a vehicle.")
#ENDIF
GO_TO_PED_STATE(ped, PED_STATE_ENTERING_VEHICLE)
ENDIF
ELSE
IF IS_PED_IN_VEHICLE(ped.PedIndex, vsSpeedophiles[ped.ePedVehicle].VehicleIndex, TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsSpeedophiles[ped.ePedVehicle].VehicleIndex, FALSE)
ENDIF
IF IS_PED_SITTING_IN_VEHICLE(ped.PedIndex, vsSpeedophiles[ped.ePedVehicle].VehicleIndex)
GO_TO_PED_STATE(ped, PED_STATE_SITTING_IN_VEHICLE)
ENDIF
ENDIF
ENDIF
BREAK
CASE MAX_SPEEDOPHILES
CLEAR_PED_TASKS(ped.PedIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " has to pick a vehicle again.")
#ENDIF
GO_TO_PED_STATE(ped, PED_STATE_ENTERING_VEHICLE)
BREAK
ENDSWITCH
BREAK
CASE PED_STATE_SITTING_IN_VEHICLE
IF ( ped.bHasTask = FALSE )
//do nothing
ped.bHasTask = TRUE
ENDIF
IF NOT IS_PED_IN_VEHICLE(ped.PedIndex, vsSpeedophiles[ped.ePedVehicle].VehicleIndex)
ped.ePedVehicle = MAX_SPEEDOPHILES
GO_TO_PED_STATE(ped, PED_STATE_ENTERING_VEHICLE)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
PROC MANAGE_OTHER_PLAYER_PED_IN_GROVE_STREET(PED_INDEX PedIndex, PED_STRUCT &ped, PED_INDEX TargetPedIndex)
IF DOES_ENTITY_EXIST(PedIndex)
AND NOT IS_ENTITY_DEAD(PedIndex)
IF DOES_ENTITY_EXIST(TargetPedIndex)
AND NOT IS_PED_INJURED(TargetPedIndex)
#IF IS_DEBUG_BUILD //debug info display
IF ( bDrawDebugStates = TRUE)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(PedIndex, GET_STRING_FROM_INT(ped.iProgress), 1.35)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(PedIndex, GET_STRING_FROM_FLOAT(GET_PED_HEALTH_RATIO(PedIndex)), 1.45)
IF ( ped.bWaitingToAdvance = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(PedIndex, "WAITING_TO_ADVANCE", 1.55)
ENDIF
ENDIF
SWITCH GET_CURRENT_PLAYER_PED_ENUM() //set ped debug name for debug output
CASE CHAR_FRANKLIN
ped.sDebugName = "Trevor"
BREAK
CASE CHAR_TREVOR
ped.sDebugName = "Franklin"
BREAK
ENDSWITCH
#ENDIF
COVERPOINT_STRUCT csCover
//every frame checks and commands
SET_PED_RESET_FLAG(PedIndex, PRF_DontSuppressUseNavMeshToNavigateToVehicleDoorWhenVehicleInWater, TRUE) //fix for B*2027310
SET_PED_RESET_FLAG(PedIndex, PRF_BlockWeaponReactionsUnlessDead, TRUE) //block weapon reactions
SET_PED_RESET_FLAG(PedIndex, PRF_DisableFriendlyGunReactAudio, TRUE)
ped.fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(PedIndex, TargetPedIndex) //get distance to player
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
RUN_PED_WEAPON_AMMO_RESTORE_CHECK(PedIndex, WEAPONTYPE_PUMPSHOTGUN)
BREAK
CASE CHAR_TREVOR
RUN_PED_WEAPON_AMMO_RESTORE_CHECK(PedIndex, WEAPONTYPE_SMG)
BREAK
ENDSWITCH
//update ped states
SWITCH ped.eState
CASE PED_STATE_COMBAT_ON_FOOT
SWITCH ped.iProgress //combat progression
CASE 0 //put other player ped into cover behind low white wall if he is not in cover, make him wait in cover for shootout to begin
IF NOT DOES_BLIP_EXIST(ped.BlipIndex)
ped.BlipIndex = CREATE_BLIP_FOR_ENTITY(PedIndex, FALSE)
ENDIF
IF ( ped.bHasTask = FALSE )
IF NOT IS_PED_INJURED(PedIndex)
SET_ENTITY_HEALTH(PedIndex, MAX_BUDDY_PED_HEALTH)
SET_PED_MAX_HEALTH(PedIndex, MAX_BUDDY_PED_HEALTH)
SET_PED_SUFFERS_CRITICAL_HITS(PedIndex, FALSE)
SET_PED_INFINITE_AMMO(PedIndex, FALSE)
SET_PED_INFINITE_AMMO(PedIndex, FALSE, WEAPONTYPE_PUMPSHOTGUN)
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_CAN_FIGHT_ARMED_PEDS_WHEN_NOT_ARMED, TRUE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_RunFromFiresAndExplosions, FALSE)
IF NOT IS_PED_IN_COVER(PedIndex)
WARP_PED(PedIndex, ped.vPosition, ped.fHeading, FALSE, FALSE, FALSE)
TASK_PUT_PED_DIRECTLY_INTO_COVER(PedIndex, csCoverpoints[2].vPosition, -1, FALSE, 0, TRUE, FALSE, csCoverpoints[2].CoverpointIndex)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PedIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Putting the other player ped in cover on shootout start.")
#ENDIF
ENDIF
SET_PED_USING_ACTION_MODE(PedIndex, TRUE)
ENDIF
ped.bHasTask = TRUE
ENDIF
IF ( Events[EVENT_SHOOTOUT_STARTED] = TRUE )
ped.iTimer = GET_GAME_TIMER()
ped.bHasTask = FALSE
ped.bIgnoreProgress = FALSE
ped.iProgress++
ENDIF
BREAK
CASE 1 //make other player ped wait in cover behind low white wall after the shootout started, then go to combat
IF ( ped.bHasTask = FALSE )
IF HAS_TIME_PASSED(850, ped.iTimer) //wait in cover
IF DOES_ENTITY_EXIST(esGroup1[0].PedIndex)
AND NOT IS_PED_INJURED(esGroup1[0].PedIndex)
TASK_SHOOT_AT_ENTITY(PedIndex, esGroup1[0].PedIndex, -1, FIRING_TYPE_CONTINUOUS)
ELSE
TASK_COMBAT_HATED_TARGETS_AROUND_PED(PedIndex, 100.0)
ENDIF
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, TRUE)
SET_PED_COMBAT_PROPERTIES(PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER, FALSE)
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, <<84.926735,-1947.690674,19.272692>>, <<86.487030,-1945.870117,21.760073>>, 1.5)
SET_PED_SHOOTING_PROPERTIES(PedIndex, 15, 100, FIRING_PATTERN_FULL_AUTO)
psTrevor.bHasTask = TRUE
ENDIF
ENDIF
IF SHOULD_ALLIES_LEAVE_STARTING_COVER()
ped.iTimer = GET_GAME_TIMER()
ped.bHasTask = FALSE
ped.bIgnoreProgress = FALSE
ped.iProgress++
ENDIF
BREAK
CASE 2 //make other player ped move to the end of low white wall and combat from there
IF ( ped.bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(PedIndex, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, FALSE)
SET_PED_COMBAT_PROPERTIES(PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, FALSE)
SET_PED_DEFENSIVE_AREA_SPHERE(PedIndex, << 90.05, -1941.15, 19.74 >>, 0.76, TRUE)
SET_PED_SHOOTING_PROPERTIES(PedIndex, 15, 90, FIRING_PATTERN_BURST_FIRE)
ped.bHasTask = TRUE
ENDIF
IF SHOULD_ALLIES_ADVANCE_TO_STREET()
ped.bHasTask = FALSE
ped.bIgnoreProgress = FALSE
ped.iProgress++
ENDIF
BREAK
CASE 3 //make other player ped go to the first blue dumpster and take cover there
IF ( ped.bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(PedIndex, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, FALSE)
SET_PED_COMBAT_PROPERTIES(PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, FALSE)
SET_PED_COVER_PROPERTIES(PedIndex, TRUE, FALSE, FALSE, FALSE)
SET_PED_SHOOTING_PROPERTIES(PedIndex, 15, 90, FIRING_PATTERN_BURST_FIRE)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[60].CoverpointIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 76.77, -1932.37, 19.28 >>, << 78.38, -1930.44, 21.76 >>, 2.5)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 76.77, -1932.37, 19.28 >>, << 78.38, -1930.44, 21.76 >>, 2.5)
ped.bHasTask = TRUE
ENDIF
IF ( ped.bDefensiveAreaTaken = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sTrevorsDefensiveArea)
REMOVE_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 76.83, -1933.13, 19.26 >>, << 81.12, -1928.17, 21.69 >>, 3.5)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 76.83, -1933.13, 19.26 >>, << 81.12, -1928.17, 21.69 >>, 3.5)
ped.bDefensiveAreaTaken = TRUE
ENDIF
ELSE
IF NOT IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sTrevorsDefensiveArea)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[60].CoverpointIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 76.77, -1932.37, 19.28 >>, << 78.38, -1930.44, 21.76 >>, 2.5)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 76.77, -1932.37, 19.28 >>, << 78.38, -1930.44, 21.76 >>, 2.5)
ped.bDefensiveAreaTaken = FALSE
ENDIF
ENDIF
IF SHOULD_ALLIES_ADVANCE_TO_UP_STREET_1()
ped.bWaitingToAdvance = FALSE
ped.bHasTask = FALSE
ped.bIgnoreProgress = FALSE
ped.bDefensiveAreaTaken = FALSE
ped.iProgress++
ENDIF
BREAK
CASE 4 //make other player ped move to the first green dumpster on the right side of the street
IF ( ped.bHasTask = FALSE )
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT_NEW(PedIndex, << 74.24, -1927.30, 19.95 >>, PEDMOVE_RUN, TRUE, << 59.68, -1915.02, 20.58 >>, NULL, TRUE)
SET_PED_COMBAT_PROPERTIES(PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, FALSE)
SET_PED_COVER_PROPERTIES(PedIndex, TRUE, FALSE, TRUE, TRUE)
SET_PED_SHOOTING_PROPERTIES(PedIndex, 15, 90, FIRING_PATTERN_BURST_FIRE)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[3].CoverpointIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 72.78, -1928.84, 19.46 >>, << 75.01, -1926.21, 22.34 >>, 3.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 72.78, -1928.84, 19.46 >>, << 75.01, -1926.21, 22.34 >>, 3.0)
ped.bHasTask = TRUE
ENDIF
IF ( ped.bDefensiveAreaTaken = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sTrevorsDefensiveArea)
REMOVE_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 72.86, -1928.85, 19.48 >>, << 76.75, -1924.10, 21.78 >>, 3.5)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 72.86, -1928.85, 19.48 >>, << 76.75, -1924.10, 21.78 >>, 3.5)
ped.bDefensiveAreaTaken = TRUE
ENDIF
ELSE
IF NOT IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sTrevorsDefensiveArea)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[3].CoverpointIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 72.78, -1928.84, 19.46 >>, << 75.01, -1926.21, 22.34 >>, 3.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 72.78, -1928.84, 19.46 >>, << 75.01, -1926.21, 22.34 >>, 3.0)
ped.bDefensiveAreaTaken = FALSE
ENDIF
ENDIF
//IF SHOULD_ALLIES_ADVANCE_TO_UP_STREET_2()
IF SHOULD_OTHER_PLAYER_PED_ADVANCE_UP_TO_BIN_3()
IF IS_ENTITY_CLOSE_ENOUGH_TO_TARGET_ENTITY(PedIndex, TargetPedIndex, ped.fDistanceToTargetPed, 25, vGroveStreetStart)
ped.bWaitingToAdvance = FALSE
ped.bHasTask = FALSE
ped.bIgnoreProgress = FALSE
ped.bDefensiveAreaTaken = FALSE
ped.iProgress++
ELSE
ped.bWaitingToAdvance = TRUE
ENDIF
ENDIF
BREAK
CASE 5 //make other player ped move to the second green bin
IF ( ped.bHasTask = FALSE )
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT_NEW(PedIndex, << 66.13, -1920.24, 20.46 >>, PEDMOVE_RUN, TRUE, << 52.56, -1909.63, 20.63 >>, NULL, TRUE)
SET_PED_COMBAT_PROPERTIES(PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, FALSE)
SET_PED_COVER_PROPERTIES(PedIndex, TRUE, FALSE, TRUE, TRUE)
SET_PED_SHOOTING_PROPERTIES(PedIndex, 15, 90, FIRING_PATTERN_BURST_FIRE)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[11].CoverpointIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 63.13, -1921.39, 20.15 >>, << 65.40, -1918.74, 23.03 >>, 3.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 63.13, -1921.39, 20.15 >>, << 65.40, -1918.74, 23.03 >>, 3.0)
//make him go to cover
ped.bHasTask = TRUE
ENDIF
IF ( ped.bDefensiveAreaTaken = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sTrevorsDefensiveArea)
REMOVE_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, <<63.63, -1922.20, 19.98 >>, << 69.73, -1915.05, 22.44 >>, 5.5)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, <<63.63, -1922.20, 19.98 >>, << 69.73, -1915.05, 22.44 >>, 5.5)
ped.bDefensiveAreaTaken = TRUE
ENDIF
ELSE
IF NOT IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sTrevorsDefensiveArea)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[11].CoverpointIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 63.13, -1921.39, 20.15 >>, << 65.40, -1918.74, 23.03 >>, 3.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 63.13, -1921.39, 20.15 >>, << 65.40, -1918.74, 23.03 >>, 3.0)
ped.bDefensiveAreaTaken = FALSE
ENDIF
ENDIF
//handle the switch to buddy under fire
IF ( bBuddyPinnedDown = FALSE )
IF DOES_ENTITY_EXIST(esPorchEnemies[0].PedIndex)
IF NOT IS_ENTITY_DEAD(esPorchEnemies[0].PedIndex)
IF IS_PED_IN_DEFENSIVE_AREA(PedIndex, sTrevorsDefensiveArea)
IF IS_PED_IN_COVER(PedIndex)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, TRUE)
BREAK
CASE CHAR_TREVOR
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, TRUE)
BREAK
ENDSWITCH
bBuddyPinnedDown = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_ENEMY_PED_DEAD(esPorchEnemies[0])
IF IS_ANY_FRIENDLY_IN_ANGLED_AREA_LOCATE(tbParkedCar) OR GET_NUM_REMAINING_OF_WAVE_4_ENEMIES() < 5
bBuddyPinnedDown = FALSE
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
ped.bWaitingToAdvance = FALSE
ped.bHasTask = FALSE
ped.bIgnoreProgress = FALSE
ped.bDefensiveAreaTaken = FALSE
ped.iProgress++
ENDIF
ENDIF
BREAK
CASE 6 //make other player ped move to the white wall cover
IF ( ped.bHasTask = FALSE )
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT_NEW(PedIndex, << 56.78, -1913.42, 20.62 >>, PEDMOVE_RUN, TRUE, << 52.56, -1909.63, 20.63 >>, NULL, TRUE)
SET_PED_COMBAT_PROPERTIES(PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, FALSE)
SET_PED_COVER_PROPERTIES(PedIndex, TRUE, FALSE, TRUE, TRUE)
SET_PED_SHOOTING_PROPERTIES(PedIndex, 15, 90, FIRING_PATTERN_BURST_FIRE)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[4].CoverpointIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 53.54, -1913.36, 20.20 >>, << 56.28, -1910.08, 23.04 >>, 3.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 53.54, -1913.36, 20.20 >>, << 56.28, -1910.08, 23.04 >>, 3.0)
ped.bHasTask = TRUE
ENDIF
IF ( ped.bDefensiveAreaTaken = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sTrevorsDefensiveArea)
REMOVE_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 54.60, -1914.03, 20.18 >>, << 58.81, -1908.89, 22.47 >>, 5.5)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 54.60, -1914.03, 20.18 >>, << 58.81, -1908.89, 22.47 >>, 5.5)
ped.bDefensiveAreaTaken = TRUE
ENDIF
ELSE
IF NOT IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sTrevorsDefensiveArea)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[4].CoverpointIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 53.54, -1913.36, 20.20 >>, << 56.28, -1910.08, 23.04 >>, 3.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 53.54, -1913.36, 20.20 >>, << 56.28, -1910.08, 23.04 >>, 3.0)
ped.bDefensiveAreaTaken = FALSE
ENDIF
ENDIF
IF ( Events[EVENT_ENEMIES_GROUP3_KILLED] = TRUE )
AND ( Events[EVENT_ENEMIES_GROUP4_KILLED] = TRUE )
IF IS_ENTITY_CLOSE_ENOUGH_TO_TARGET_ENTITY(PedIndex, TargetPedIndex, ped.fDistanceToTargetPed, 25, vGroveStreetStart)
ped.bWaitingToAdvance = FALSE
ped.bHasTask = FALSE
ped.bIgnoreProgress = FALSE
ped.bDefensiveAreaTaken = FALSE
ped.iProgress++
ELSE
ped.bWaitingToAdvance = TRUE
ENDIF
ENDIF
BREAK
CASE 7 //make other player ped move to the brown garage wall
IF ( ped.bHasTask = FALSE )
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT_NEW(PedIndex, << 40.10, -1900.23, 20.85 >>, PEDMOVE_RUN, TRUE, << 30.67, -1891.61, 21.37 >>, NULL, TRUE)
SET_PED_COMBAT_PROPERTIES(PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, FALSE)
SET_PED_COVER_PROPERTIES(PedIndex, TRUE, FALSE, TRUE, TRUE)
SET_PED_SHOOTING_PROPERTIES(PedIndex, 15, 90, FIRING_PATTERN_BURST_FIRE)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[10].CoverpointIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 37.22, -1901.63, 20.41 >>, << 39.89, -1898.44, 23.38 >>, 3.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 37.22, -1901.63, 20.41 >>, << 39.89, -1898.44, 23.38 >>, 3.0)
ped.bHasTask = TRUE
ENDIF
IF ( ped.bDefensiveAreaTaken = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sTrevorsDefensiveArea)
REMOVE_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 38.18, -1902.36, 20.43 >>, << 44.59, -1894.62, 23.76 >>, 6.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 38.18, -1902.36, 20.43 >>, << 44.59, -1894.62, 23.76 >>, 6.0)
ped.bDefensiveAreaTaken = TRUE
ENDIF
ELSE
IF NOT IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sTrevorsDefensiveArea)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[10].CoverpointIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 37.22, -1901.63, 20.41 >>, << 39.89, -1898.44, 23.38 >>, 3.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 37.22, -1901.63, 20.41 >>, << 39.89, -1898.44, 23.38 >>, 3.0)
ped.bDefensiveAreaTaken = FALSE
ENDIF
ENDIF
IF SHOULD_ALLIES_ADVANCE_TO_UP_STREET_4()
IF IS_ENTITY_CLOSE_ENOUGH_TO_TARGET_ENTITY(PedIndex, TargetPedIndex, ped.fDistanceToTargetPed, 25, vGroveStreetStart)
ped.bWaitingToAdvance = FALSE
ped.bHasTask = FALSE
ped.bIgnoreProgress = FALSE
ped.bDefensiveAreaTaken = FALSE
ped.iProgress++
ELSE
ped.bWaitingToAdvance = TRUE
ENDIF
ENDIF
BREAK
CASE 8 //make other player ped move to the low white wall corner
IF ( ped.bHasTask = FALSE )
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT_NEW(PedIndex, << 34.62, -1895.43, 21.14 >>, PEDMOVE_RUN, TRUE, << 22.67, -1884.88, 21.80 >>, NULL, TRUE)
SET_PED_COMBAT_PROPERTIES(PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, FALSE)
SET_PED_COVER_PROPERTIES(PedIndex, TRUE, FALSE, TRUE, TRUE)
SET_PED_SHOOTING_PROPERTIES(PedIndex, 15, 90, FIRING_PATTERN_BURST_FIRE)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[5].CoverpointIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 31.64, -1895.74, 20.80 >>, << 33.99, -1892.91, 23.71 >>, 3.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 31.64, -1895.74, 20.80 >>, << 33.99, -1892.91, 23.71 >>, 3.0)
ped.bHasTask = TRUE
ENDIF
IF ( ped.bDefensiveAreaTaken = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sTrevorsDefensiveArea)
REMOVE_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 32.46,-1896.44, 20.79 >>, << 38.02, -1889.85, 24.08 >>, 5.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 32.46,-1896.44, 20.79 >>, << 38.02, -1889.85, 24.08 >>, 5.0)
ped.bDefensiveAreaTaken = TRUE
ENDIF
ELSE
IF NOT IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sTrevorsDefensiveArea)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[5].CoverpointIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 31.64, -1895.74, 20.80 >>, << 33.99, -1892.91, 23.71 >>, 3.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 31.64, -1895.74, 20.80 >>, << 33.99, -1892.91, 23.71 >>, 3.0)
ped.bDefensiveAreaTaken = FALSE
ENDIF
ENDIF
IF SHOULD_ALLIES_ADVANCE_TO_UP_STREET_5()
IF IS_ENTITY_CLOSE_ENOUGH_TO_TARGET_ENTITY(PedIndex, TargetPedIndex, ped.fDistanceToTargetPed, 25, vGroveStreetStart)
ped.bWaitingToAdvance = FALSE
ped.bHasTask = FALSE
ped.bIgnoreProgress = FALSE
ped.bDefensiveAreaTaken = FALSE
ped.iProgress++
ELSE
ped.bWaitingToAdvance = TRUE
ENDIF
ENDIF
BREAK
CASE 9 //make other player ped move to the green dumpster
IF ( ped.bHasTask = FALSE )
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT_NEW(PedIndex, << 18.13, -1881.51, 22.03 >>, PEDMOVE_RUN, TRUE, << 5.44, -1868.51, 22.75 >>, NULL, TRUE)
SET_PED_COMBAT_PROPERTIES(PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, FALSE)
SET_PED_COVER_PROPERTIES(PedIndex, TRUE, FALSE, TRUE, TRUE)
SET_PED_SHOOTING_PROPERTIES(PedIndex, 15, 90, FIRING_PATTERN_BURST_FIRE)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[61].CoverpointIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 14.52, -1883.05, 21.67 >>, << 17.70, -1879.24, 24.59 >>, 3.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 14.52, -1883.05, 21.67 >>, << 17.70, -1879.24, 24.59 >>, 3.0)
ped.bHasTask = TRUE
ENDIF
IF ( ped.bDefensiveAreaTaken = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sTrevorsDefensiveArea)
REMOVE_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 14.78, -1883.76, 21.68 >>, << 20.16, -1877.56, 24.94 >>, 5.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 14.78, -1883.76, 21.68 >>, << 20.16, -1877.56, 24.94 >>, 5.0)
ped.bDefensiveAreaTaken = TRUE
ENDIF
ELSE
IF NOT IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sTrevorsDefensiveArea)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[61].CoverpointIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 14.52, -1883.05, 21.67 >>, << 17.70, -1879.24, 24.59 >>, 3.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 14.52, -1883.05, 21.67 >>, << 17.70, -1879.24, 24.59 >>, 3.0)
ped.bDefensiveAreaTaken = FALSE
ENDIF
ENDIF
IF IS_ENEMY_PED_DEAD(esGroup7[1])
AND ( IS_ENEMY_PED_DEAD(esGroup7[2]) OR IS_ENEMY_PED_DEAD(esGroup7[0]) )
IF IS_ENTITY_CLOSE_ENOUGH_TO_TARGET_ENTITY(PedIndex, TargetPedIndex, ped.fDistanceToTargetPed, 25, vGroveStreetStart)
ped.bWaitingToAdvance = FALSE
ped.bHasTask = FALSE
ped.bIgnoreProgress = FALSE
ped.bDefensiveAreaTaken = FALSE
ped.iProgress++
ELSE
ped.bWaitingToAdvance = TRUE
ENDIF
ENDIF
BREAK
CASE 10 //make other player ped move to the high white wall
IF ( ped.bHasTask = FALSE )
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT_NEW(PedIndex, << 11.21, -1875.09, 22.42 >>, PEDMOVE_RUN, TRUE, << 5.44, -1868.51, 22.75 >>, NULL, TRUE)
SET_PED_COMBAT_PROPERTIES(PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, FALSE)
SET_PED_COVER_PROPERTIES(PedIndex, TRUE, FALSE, TRUE, TRUE)
SET_PED_SHOOTING_PROPERTIES(PedIndex, 15, 90, FIRING_PATTERN_BURST_FIRE)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[6].CoverpointIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 7.52, -1876.60, 21.93 >>, << 10.41, -1873.20, 25.00 >>, 3.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 7.52, -1876.60, 21.93 >>, << 10.41, -1873.20, 25.00 >>, 3.0)
ped.bHasTask = TRUE
ENDIF
IF ( ped.bDefensiveAreaTaken = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sTrevorsDefensiveArea)
REMOVE_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 8.79, -1877.08, 21.90 >>, << 13.30, -1871.56, 25.45 >>, 5.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 8.79, -1877.08, 21.90 >>, << 13.30, -1871.56, 25.45 >>, 5.0)
ped.bDefensiveAreaTaken = TRUE
ENDIF
ELSE
IF NOT IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sTrevorsDefensiveArea)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[6].CoverpointIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 7.52, -1876.60, 21.93 >>, << 10.41, -1873.20, 25.00 >>, 3.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 7.52, -1876.60, 21.93 >>, << 10.41, -1873.20, 25.00 >>, 3.0)
ped.bDefensiveAreaTaken = FALSE
ENDIF
ENDIF
IF IS_ENEMY_PED_DEAD(esGroup7[0])
AND IS_ENEMY_PED_DEAD(esGroup7[1])
AND IS_ENEMY_PED_DEAD(esGroup7[2])
IF IS_ENTITY_CLOSE_ENOUGH_TO_TARGET_ENTITY(PedIndex, TargetPedIndex, ped.fDistanceToTargetPed, 25, vGroveStreetStart)
ped.bWaitingToAdvance = FALSE
ped.bHasTask = FALSE
ped.bIgnoreProgress = FALSE
ped.bDefensiveAreaTaken = FALSE
ped.iProgress++
ELSE
ped.bWaitingToAdvance = TRUE
ENDIF
ENDIF
BREAK
CASE 11 //make other player ped move to the green dumpster
IF ( ped.bHasTask = FALSE )
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT_NEW(PedIndex, << 6.77, -1871.65, 22.66 >>, PEDMOVE_RUN, TRUE, << 2.82, -1852.34, 23.32 >>, NULL, TRUE)
SET_PED_COMBAT_PROPERTIES(PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, FALSE)
SET_PED_COVER_PROPERTIES(PedIndex, TRUE, FALSE, TRUE, TRUE)
SET_PED_SHOOTING_PROPERTIES(PedIndex, 15, 90, FIRING_PATTERN_BURST_FIRE)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[8].CoverpointIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 4.13, -1873.69, 22.20 >>, << 6.66, -1870.60, 25.18 >>, 3.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 4.13, -1873.69, 22.20 >>, << 6.66, -1870.60, 25.18 >>, 3.0)
ped.bHasTask = TRUE
ENDIF
IF ( ped.bDefensiveAreaTaken = FALSE )
IF IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sTrevorsDefensiveArea)
REMOVE_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 4.42, -1874.28, 22.17 >>, << 10.90, -1866.32, 25.62 >>, 5.5)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 4.42, -1874.28, 22.17 >>, << 10.90, -1866.32, 25.62 >>, 5.5)
ped.bDefensiveAreaTaken = TRUE
ENDIF
ELSE
IF NOT IS_PED_IN_DEFENSIVE_AREA(TargetPedIndex, sTrevorsDefensiveArea)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[8].CoverpointIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, << 4.13, -1873.69, 22.20 >>, << 6.66, -1870.60, 25.18 >>, 3.0)
STORE_DEFENSIVE_AREA_ANGLED(sTrevorsDefensiveArea, << 4.13, -1873.69, 22.20 >>, << 6.66, -1870.60, 25.18 >>, 3.0)
ped.bDefensiveAreaTaken = FALSE
ENDIF
ENDIF
IF ( Events[EVENT_ENEMIES_GROUP7_KILLED] = TRUE )
AND ( Events[EVENT_ENEMIES_CARSTREETRIGHT_KILLED] = TRUE )
AND ( Events[EVENT_COPS_ARRIVE] = TRUE )
IF IS_ENTITY_CLOSE_ENOUGH_TO_TARGET_ENTITY(PedIndex, TargetPedIndex, ped.fDistanceToTargetPed, 25, vGroveStreetStart)
ped.bWaitingToAdvance = FALSE
ped.bHasTask = FALSE
ped.bIgnoreProgress = FALSE
ped.bDefensiveAreaTaken = FALSE
ped.iProgress++
ELSE
ped.bWaitingToAdvance = TRUE
ENDIF
ENDIF
BREAK
CASE 12
IF ( ped.bHasTask = FALSE )
IF NOT IS_ENEMY_PED_DEAD(esGroup9[1])
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT_NEW(PedIndex, << -24.73, -1845.16, 24.38 >>, PEDMOVE_RUN, TRUE,
<< -20.29, -1850.10, 24.10 >>, esGroup9[1].PedIndex, TRUE)
ELSE
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT_NEW(PedIndex, << -24.73, -1845.16, 24.38 >>, PEDMOVE_RUN, TRUE,
<< -1.23, -1833.20, 23.97 >>, esGroup9[1].PedIndex, TRUE)
ENDIF
SET_PED_COMBAT_PROPERTIES(PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, FALSE)
SET_PED_SHOOTING_PROPERTIES(PedIndex, 15, 100, FIRING_PATTERN_BURST_FIRE)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, <<-27.294376,-1848.436646,24.232262>>, <<-24.770103,-1845.416748,27.368807>>, 2.0)
SET_PED_COVER_PROPERTIES(PedIndex, TRUE, FALSE, TRUE, FALSE)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[26].CoverpointIndex)
ped.bHasTask = TRUE
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PedIndex, <<-44.493145,-1867.814697,23.294022>>, <<-17.559521,-1835.444336,29.422800>>, 22.0)
GO_TO_PED_STATE(ped, PED_STATE_WAITING_IN_ALLEY)
ENDIF
BREAK
ENDSWITCH
IF ( Events[EVENT_COPS_ARRIVE] = TRUE )
GO_TO_PED_STATE(ped, PED_STATE_RUNNING_TO_ALLEY)
ENDIF
IF ( ped.bHasTask = TRUE AND ped.bIgnoreProgress = TRUE AND ped.bHasSwitchTask = FALSE )
IF CAN_GET_CLOSEST_COVERPOINT_FOR_PED(PedIndex, csCoverpoints, csCover, TRUE, 3.5, bOtherPedAtStationaryCoverpoint)
IF ( csCover.bStationary = FALSE )
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_TO_COVER_THEN_COMBAT(PedIndex, csCover.vPosition, PEDMOVE_RUN, TRUE, vGroveStreetEnd,
GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(PedIndex, rgEnemies),
TRUE, csCover.vPosition, vGroveStreetEnd, 1000)
//set other ped's combat settings when the coverpoint is non stationary
SET_PED_COMBAT_PROPERTIES(PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_NEAR, CA_USE_COVER, FALSE)
SET_PED_DEFENSIVE_AREA_SPHERE(PedIndex, csCover.vPosition, 2.0)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCover.CoverpointIndex)
SWITCH csCover.CoverpointUsage //set ped cover properties based on the selected non stationary coverpoint
CASE COVUSE_WALLTOLEFT
SET_PED_COVER_PROPERTIES(PedIndex, TRUE, FALSE, TRUE, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped going to coverpoint with COVUSE_WALLTOLEFT, ped will face right in cover.")
#ENDIF
BREAK
CASE COVUSE_WALLTORIGHT
SET_PED_COVER_PROPERTIES(PedIndex, TRUE, TRUE, FALSE, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped going to coverpoint with COVUSE_WALLTORIGHT, ped will face left in cover.")
#ENDIF
BREAK
DEFAULT
SET_PED_COVER_PROPERTIES(PedIndex, TRUE, FALSE, FALSE, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped going to coverpoint without any specific direction to face in cover.")
#ENDIF
BREAK
ENDSWITCH
bOtherPedAtStationaryCoverpoint = FALSE
ped.bHasSwitchTask = TRUE
ELIF ( csCover.bStationary = TRUE )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped going to stationary cover point.")
#ENDIF
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_AIM_THEN_COMBAT(PedIndex, csCover.vPosition, PEDMOVE_RUN, TRUE, vGroveStreetEnd,
GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(PedIndex, rgEnemies),
TRUE, TRUE, 1500)
//set other ped's combat settings when the coverpoint is stationary
SET_PED_COMBAT_PROPERTIES(PedIndex, CM_STATIONARY, CAL_PROFESSIONAL, CR_NEAR, CA_AGGRESSIVE, FALSE)
SET_PED_DEFENSIVE_AREA_SPHERE(PedIndex, csCover.vPosition, 2.0)
//remove ped's preferred coverpoint and reset the cover flags
REMOVE_PED_PREFERRED_COVERPOINT(PedIndex, psTrevor.ItemsetIndex)
SET_PED_COVER_PROPERTIES(PedIndex, FALSE, FALSE, FALSE, FALSE)
bOtherPedAtStationaryCoverpoint = TRUE
ped.bHasSwitchTask = TRUE
ped.iTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_RUNNING_TO_ALLEY
IF ( ped.bHasTask = FALSE )
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, TRUE)
SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(PedIndex, FALSE)
TASK_FOLLOW_NAV_MESH_TO_COORD(PedIndex, << -22.67, -1846.52, 24.27 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP * 3)
//SEQUENCE_INDEX SequenceIndex
//CLEAR_SEQUENCE_TASK(SequenceIndex)
//OPEN_SEQUENCE_TASK(SequenceIndex)
// TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, << -4.30, -1862.53, 23.26 >> /*<< -22.67, -1846.52, 24.27 >>*/, << -29.40, -1829.25, 24.95 >>, PEDMOVE_RUN, TRUE)
// TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
//CLOSE_SEQUENCE_TASK(SequenceIndex)
//TASK_PERFORM_SEQUENCE(PedIndex, SequenceIndex)
SET_PED_COMBAT_MOVEMENT(PedIndex, CM_DEFENSIVE)
SET_PED_MOVEMENT_PROPERTIES(PedIndex, 0.8, 0.0)
SET_PED_SHOOTING_PROPERTIES(PedIndex, 30, 90, FIRING_PATTERN_BURST_FIRE)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, <<-27.294376,-1848.436646,24.232262>>, <<-24.770103,-1845.416748,27.368807>>, 2.0)
REMOVE_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex)
ped.bHasTask = TRUE
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PedIndex, <<-44.493145,-1867.814697,23.294022>>, <<-17.559521,-1835.444336,29.422800>>, 22.0)
GO_TO_PED_STATE(ped, PED_STATE_WAITING_IN_ALLEY)
ENDIF
REQUEST_WAYPOINT_RECORDING("fra1_trevor")
BREAK
CASE PED_STATE_WAITING_IN_ALLEY
IF ( ped.bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_USE_COVER, FALSE)
SET_PED_DEFENSIVE_AREA_ANGLED(PedIndex, <<-27.294376,-1848.436646,24.232262>>, <<-24.770103,-1845.416748,27.368807>>, 2.0)
SET_PED_SHOOTING_PROPERTIES(PedIndex, 30, 100, FIRING_PATTERN_BURST_FIRE)
SET_PED_COVER_PROPERTIES(PedIndex, TRUE, FALSE, TRUE, FALSE)
SET_PED_PREFERRED_COVERPOINT(PedIndex, ped.ItemsetIndex, csCoverpoints[26].CoverpointIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, FALSE)
ped.iTimer = GET_GAME_TIMER()
ped.bWaitingForPlayer = TRUE
ped.bHasTask = TRUE
ENDIF
IF SHOULD_ALLIES_RUN_TO_RIVER()
OR psLamar.bFleeing = TRUE
GO_TO_PED_STATE(ped, PED_STATE_RUNNING_TO_RIVER)
ENDIF
REQUEST_WAYPOINT_RECORDING("fra1_trevor")
BREAK
CASE PED_STATE_RUNNING_TO_RIVER
IF ( ped.bHasTask = FALSE )
REQUEST_WAYPOINT_RECORDING("fra1_trevor")
IF GET_IS_WAYPOINT_RECORDING_LOADED("fra1_trevor")
IF ( ped.iTimer <> 0)
IF HAS_TIME_PASSED(375, ped.iTimer) //use the time delay to make other player and Lamar not run in perfect sync
CLEAR_PED_TASKS(PedIndex)
REMOVE_PED_DEFENSIVE_AREA(PedIndex)
SET_PED_PROOFS(GET_PED_INDEX(CHAR_TREVOR), FALSE, FALSE, FALSE, FALSE, FALSE)
SET_PED_PROOFS(GET_PED_INDEX(CHAR_FRANKLIN), FALSE, FALSE, FALSE, FALSE, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, TRUE)
SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(PedIndex, FALSE)
TASK_FOLLOW_WAYPOINT_RECORDING(PedIndex, "fra1_trevor", 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_TURN_TO_FACE_WAYPOINT_HEADING_AT_END | EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT)
//TASK_FOLLOW_NAV_MESH_TO_COORD(PedIndex, <<-114.8476, -1864.9554, 0.4774>>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP * 3)
ped.bFleeing = TRUE
ped.bHasTask = TRUE
ENDIF
ELSE
ped.iTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(PedIndex)
IF IS_PED_RUNNING(TargetPedIndex)
OR IS_PED_SPRINTING(TargetPedIndex)
WAYPOINT_PLAYBACK_OVERRIDE_SPEED(PedIndex, PEDMOVE_SPRINT)
ELSE
WAYPOINT_PLAYBACK_OVERRIDE_SPEED(PedIndex, PEDMOVE_RUN)
ENDIF
ELSE
IF IS_PED_RUNNING(TargetPedIndex)
OR IS_PED_SPRINTING(TargetPedIndex)
SET_PED_DESIRED_MOVE_BLEND_RATIO(PedIndex, PEDMOVE_SPRINT)
ELSE
SET_PED_DESIRED_MOVE_BLEND_RATIO(PedIndex, PEDMOVE_RUN)
ENDIF
ENDIF
//IF ( GET_PED_WAYPOINT_PROGRESS(PedIndex) > 25 )
IF ( ped.fDistanceToTargetPed > 25.0 ) AND bShouldAlliesWaitForPlayer
IF GET_DISTANCE_BETWEEN_COORDS(vFilmCrewBeginAnimPosition, GET_ENTITY_COORDS(TargetPedIndex)) > GET_DISTANCE_BETWEEN_COORDS(vFilmCrewBeginAnimPosition, GET_ENTITY_COORDS(PedIndex))
GO_TO_PED_STATE(ped, PED_STATE_WAITING_FOR_PLAYER)
ENDIF
ENDIF
//ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PedIndex), vsSpeedophiles[0].vPosition) < 20.0
GO_TO_PED_STATE(ped, PED_STATE_RUNNING_TO_VEHICLE)
ENDIF
BREAK
CASE PED_STATE_WAITING_FOR_PLAYER
IF ( ped.bHasTask = FALSE )
CLEAR_PED_TASKS(PedIndex)
SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(PedIndex, FALSE)
SEQUENCE_FACE_AND_LOOK_AT_PED(PedIndex, TargetPedIndex, -1, SLF_USE_TORSO | SLF_FAST_TURN_RATE)
ped.bHasTask = TRUE
ENDIF
IF ( ped.fDistanceToTargetPed < 10.0 )
OR GET_DISTANCE_BETWEEN_COORDS(vFilmCrewBeginAnimPosition, GET_ENTITY_COORDS(TargetPedIndex)) < GET_DISTANCE_BETWEEN_COORDS(vFilmCrewBeginAnimPosition, GET_ENTITY_COORDS(PedIndex))
TASK_CLEAR_LOOK_AT(PedIndex)
GO_TO_PED_STATE(ped, PED_STATE_RUNNING_TO_RIVER)
ENDIF
BREAK
CASE PED_STATE_RUNNING_TO_VEHICLE
IF ( ped.bHasTask = FALSE )
CLEAR_PED_TASKS(PedIndex)
SEQUENCE_INDEX SequenceIndex
OPEN_SEQUENCE_TASK(SequenceIndex)
IF NOT IS_PED_INJURED(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<-114.8476, -1864.9554, 0.4774>> /*<< -163.90746, -1838.89514, -0.44773 >>*/, psFilmCrew[FCP_JACKEDGIRL].PedIndex, PEDMOVE_RUN, FALSE)
TASK_AIM_GUN_AT_ENTITY(NULL, psFilmCrew[FCP_JACKEDGIRL].PedIndex, -1, TRUE)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<-114.8476, -1864.9554, 0.4774>> /*<< -163.90746, -1838.89514, -0.44773 >>*/, << -166.80, -1842.87, 0.46 >>, PEDMOVE_RUN, FALSE)
TASK_AIM_GUN_AT_COORD(NULL, << -166.80, -1842.87, 0.46 >>, -1, TRUE)
ENDIF
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
ped.bFleeing = TRUE
ped.bHasTask = TRUE
ENDIF
IF ( ped.bHasTask = TRUE )
IF ( GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK )
IF ( GET_SEQUENCE_PROGRESS(PedIndex) = 1 )
GO_TO_PED_STATE(ped, PED_STATE_WAITING_AT_VEHICLE)
ENDIF
ENDIF
IF IS_PED_IN_THIS_VEHICLE(TargetPedIndex, vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, TRUE)
OR IS_PED_IN_THIS_VEHICLE(TargetPedIndex, vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex, TRUE)
OR IS_PED_IN_THIS_VEHICLE(TargetPedIndex, vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex, TRUE)
GO_TO_PED_STATE(ped, PED_STATE_ENTERING_VEHICLE)
ENDIF
ENDIF
BREAK
CASE PED_STATE_WAITING_AT_VEHICLE
IF ( ped.bHasTask = FALSE )
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN //player playing Franklin, give Trevor specific task and parameters
IF NOT IS_PED_INJURED(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
TASK_AIM_GUN_AT_ENTITY(PedIndex, psFilmCrew[FCP_JACKEDGIRL].PedIndex, -1, TRUE)
ELSE
TASK_AIM_GUN_AT_COORD(PedIndex, << -159.72, -1849.10, 0.46 >>, -1, TRUE)
ENDIF
BREAK
CASE CHAR_TREVOR //player playing Trevor, give Franklin specific task and parameters
IF NOT IS_PED_INJURED(psFilmCrew[FCP_CLAY].PedIndex)
TASK_AIM_GUN_AT_ENTITY(PedIndex, psFilmCrew[FCP_CLAY].PedIndex, -1, TRUE)
ELSE
TASK_AIM_GUN_AT_COORD(PedIndex, << -166.80, -1842.87, 0.46 >>, -1, TRUE)
ENDIF
BREAK
ENDSWITCH
ped.bVehicleReached = TRUE
ped.bHasTask = TRUE
ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(TargetPedIndex), vsSpeedophiles[SPEEDOPHILE_1].vPosition) < 10.0
OR GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(TargetPedIndex), vsSpeedophiles[SPEEDOPHILE_1].vPosition) < 10.0
OR GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(TargetPedIndex), vsSpeedophiles[SPEEDOPHILE_1].vPosition) < 10.0
GO_TO_PED_STATE(ped, PED_STATE_ENTERING_VEHICLE)
ENDIF
IF IS_PED_IN_THIS_VEHICLE(TargetPedIndex, vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, TRUE)
OR IS_PED_IN_THIS_VEHICLE(TargetPedIndex, vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex, TRUE)
OR IS_PED_IN_THIS_VEHICLE(TargetPedIndex, vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex, TRUE)
GO_TO_PED_STATE(ped, PED_STATE_ENTERING_VEHICLE)
ENDIF
BREAK
CASE PED_STATE_ENTERING_VEHICLE
IF ( ped.bHasTask = FALSE )
IF ( ped.ePedVehicle = MAX_SPEEDOPHILES )
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex)
IF IS_VEHICLE_SEAT_FREE(vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, VS_DRIVER)
IF GET_VEHICLE_PED_IS_USING(TargetPedIndex) <> vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex
AND GET_VEHICLE_PED_IS_USING(psLamar.PedIndex) <> vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex
TASK_ENTER_VEHICLE(PedIndex, vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, DEFAULT_TIME_BEFORE_WARP, VS_DRIVER, PEDMOVE_RUN, ECF_JACK_ANYONE)
ped.ePedVehicle = SPEEDOPHILE_1
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " is tasked to enter SPEEDOPHILE_1.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( ped.ePedVehicle = MAX_SPEEDOPHILES )
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex)
IF IS_VEHICLE_SEAT_FREE(vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex, VS_DRIVER)
IF GET_VEHICLE_PED_IS_USING(TargetPedIndex) <> vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex
AND GET_VEHICLE_PED_IS_USING(psLamar.PedIndex) <> vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex
TASK_ENTER_VEHICLE(PedIndex, vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex, DEFAULT_TIME_BEFORE_WARP, VS_DRIVER, PEDMOVE_RUN, ECF_JACK_ANYONE)
ped.ePedVehicle = SPEEDOPHILE_2
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " is tasked to enter SPEEDOPHILE_2.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( ped.ePedVehicle = MAX_SPEEDOPHILES )
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex)
IF IS_VEHICLE_SEAT_FREE(vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex, VS_DRIVER)
IF GET_VEHICLE_PED_IS_USING(TargetPedIndex) <> vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex
AND GET_VEHICLE_PED_IS_USING(psLamar.PedIndex) <> vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex
TASK_ENTER_VEHICLE(PedIndex, vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex, DEFAULT_TIME_BEFORE_WARP, VS_DRIVER, PEDMOVE_RUN, ECF_JACK_ANYONE)
ped.ePedVehicle = SPEEDOPHILE_3
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " is tasked to enter SPEEDOPHILE_3.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( iEnterVehicleTimer = 0 )
iEnterVehicleTimer = GET_GAME_TIMER()
ENDIF
ped.bVehicleReached = TRUE
ped.bHasTask = TRUE
ENDIF
SWITCH ped.ePedVehicle
CASE SPEEDOPHILE_1
CASE SPEEDOPHILE_2
CASE SPEEDOPHILE_3
#IF IS_DEBUG_BUILD
SWITCH ped.ePedVehicle
CASE SPEEDOPHILE_1
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " is assigned SPEEDOPHILE_1.")
BREAK
CASE SPEEDOPHILE_2
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " is assigned SPEEDOPHILE_2.")
BREAK
CASE SPEEDOPHILE_3
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " is assigned SPEEDOPHILE_3.")
BREAK
ENDSWITCH
#ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[ped.ePedVehicle].VehicleIndex)
//fix for B*2027310 - warp buddy ped into vehicle if they cannot enter
IF NOT IS_PED_IN_VEHICLE(PedIndex, vsSpeedophiles[ped.ePedVehicle].VehicleIndex, TRUE)
AND GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
IF ( iEnterVehicleTimer != 0 )
IF HAS_TIME_PASSED(DEFAULT_TIME_BEFORE_WARP / 2, iEnterVehicleTimer)
CLEAR_PED_TASKS(PedIndex)
SET_PED_INTO_VEHICLE(PedIndex, vsSpeedophiles[ped.ePedVehicle].VehicleIndex, VS_DRIVER)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " was warped into vehicle.")
#ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_PED_IN_VEHICLE(PedIndex, vsSpeedophiles[ped.ePedVehicle].VehicleIndex, TRUE)
IF NOT IS_VEHICLE_SEAT_FREE(vsSpeedophiles[ped.ePedVehicle].VehicleIndex, VS_DRIVER)
OR vsSpeedophiles[ped.ePedVehicle].VehicleIndex = GET_VEHICLE_PED_IS_USING(TargetPedIndex)
OR vsSpeedophiles[ped.ePedVehicle].VehicleIndex = GET_VEHICLE_PED_IS_USING(psLamar.PedIndex)
CLEAR_PED_TASKS(PedIndex)
iEnterVehicleTimer = 0 //reset warp timer if we need to pick a new vehicle
ped.ePedVehicle = MAX_SPEEDOPHILES
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " has to pick a different vehicle.")
#ENDIF
GO_TO_PED_STATE(ped, PED_STATE_ENTERING_VEHICLE)
ENDIF
IF GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_ENTER_VEHICLE) != WAITING_TO_START_TASK
AND GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
CLEAR_PED_TASKS(PedIndex)
ped.ePedVehicle = MAX_SPEEDOPHILES
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " has to be retasked to enter a vehicle.")
#ENDIF
GO_TO_PED_STATE(ped, PED_STATE_ENTERING_VEHICLE)
ENDIF
ELSE
IF IS_PED_IN_VEHICLE(PedIndex, vsSpeedophiles[ped.ePedVehicle].VehicleIndex, TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsSpeedophiles[ped.ePedVehicle].VehicleIndex, FALSE)
ENDIF
IF IS_PED_SITTING_IN_VEHICLE(PedIndex, GET_VEHICLE_PED_IS_USING(PedIndex))
GO_TO_PED_STATE(ped, PED_STATE_SITTING_IN_VEHICLE)
ENDIF
ENDIF
ENDIF
BREAK
CASE MAX_SPEEDOPHILES
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " is assigned MAX_SPEEDOPHILES.")
#ENDIF
CLEAR_PED_TASKS(PedIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " has to pick a vehicle again.")
#ENDIF
GO_TO_PED_STATE(ped, PED_STATE_ENTERING_VEHICLE)
BREAK
ENDSWITCH
BREAK
CASE PED_STATE_SITTING_IN_VEHICLE
IF ( ped.bHasTask = FALSE )
//do nothing
ped.bHasTask = TRUE
ENDIF
IF NOT IS_PED_IN_VEHICLE(PedIndex, vsSpeedophiles[ped.ePedVehicle].VehicleIndex)
ped.ePedVehicle = MAX_SPEEDOPHILES
GO_TO_PED_STATE(ped, PED_STATE_ENTERING_VEHICLE)
ENDIF
BREAK
CASE PED_STATE_WAITING_FOR_TASK_AFTER_SWITCH
IF IS_PED_IN_ANY_VEHICLE(PedIndex, TRUE)
IF NOT IS_PED_IN_THIS_VEHICLE(PedIndex, vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, TRUE)
AND NOT IS_PED_IN_THIS_VEHICLE(PedIndex, vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex, TRUE)
AND NOT IS_PED_IN_THIS_VEHICLE(PedIndex, vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex, TRUE)
TASK_LEAVE_ANY_VEHICLE(PedIndex)
ENDIF
ENDIF
IF ( ped.bFleeing = TRUE )
IF NOT IS_PED_IN_ANY_VEHICLE(PedIndex)
ped.ePedVehicle = MAX_SPEEDOPHILES
IF ( ped.bVehicleReached = TRUE )
GO_TO_PED_STATE(ped, PED_STATE_ENTERING_VEHICLE)
ELSE
GO_TO_PED_STATE(ped, PED_STATE_RUNNING_TO_RIVER)
ENDIF
ENDIF
ELIF ( ped.bWaitingForPlayer = TRUE )
GO_TO_PED_STATE(ped, PED_STATE_WAITING_IN_ALLEY)
ELIF ( Events[EVENT_SHOOTOUT_ENDED] = TRUE )
GO_TO_PED_STATE(ped, PED_STATE_RUNNING_TO_ALLEY)
ELIF ( Events[EVENT_SHOOTOUT_ENDED] = FALSE )
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ped.bHasTask = TRUE
ped.bHasSwitchTask = FALSE
ped.bIgnoreProgress = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
PROC MANAGE_ENEMY_PEDS_DURING_DEAL_CUTSCENE(INT &iEnemyProgress)
SWITCH iEnemyProgress
CASE 0
IF IS_CUTSCENE_PLAYING()
iEnemyProgress++
ENDIF
BREAK
CASE 1 //create enemies
REQUEST_MODEL(mnBalla)
IF HAS_MODEL_LOADED(mnBalla)
esGroup1[0].PedIndex = CREATE_ENEMY_PED(mnBalla, <<73.5813, -1944.3768, 19.8115>>, 304.0889, rgEnemies, WEAPONTYPE_MICROSMG, 125)
esGroup1[1].PedIndex = CREATE_ENEMY_PED(mnBalla, <<81.7639, -1904.2952, 20.5794>>, 142.1008, rgEnemies, WEAPONTYPE_MICROSMG, 125)
esGroup1[2].PedIndex = CREATE_ENEMY_PED(mnBalla, <<79.4749, -1908.1135, 20.3492>>, 169.8566, rgEnemies, WEAPONTYPE_MICROSMG, 125)
INITIALISE_ENEMY_GROUP(esGroup1, FALSE #IF IS_DEBUG_BUILD, "Group1 " #ENDIF)
iEnemyProgress++
ENDIF
BREAK
CASE 2 //give combat task
IF ( bCutsceneSkipped = FALSE )
IF ( bFirstEnemyGroupInitialised = FALSE )
IF ( GET_CUTSCENE_TIME() > 61500.0 )
IF DOES_ENTITY_EXIST(esGroup1[0].PedIndex)
IF NOT IS_ENTITY_DEAD(esGroup1[0].PedIndex)
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, << 81.91, -1942.41, 19.85 >>, vGroup1EnemyAimCoords, PEDMOVE_RUN, TRUE)
TASK_SHOOT_AT_COORD(NULL, vGroup1EnemyAimCoords, INFINITE_TASK_TIME, FIRING_TYPE_CONTINUOUS)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(esGroup1[0].PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esGroup1[1].PedIndex)
IF NOT IS_ENTITY_DEAD(esGroup1[1].PedIndex)
SET_PED_COMBAT_MOVEMENT(esGroup1[1].PedIndex, CM_DEFENSIVE)
SET_PED_DEFENSIVE_AREA_SPHERE(esGroup1[1].PedIndex, << 89.92, -1918.83, 19.63 >>, 3.0)
SET_PED_CHANCE_OF_FIRING_BLANKS(esGroup1[1].PedIndex, 1.0, 1.0)
SET_PED_SHOOTING_PROPERTIES(esGroup1[1].PedIndex, 1, 175, FIRING_PATTERN_FULL_AUTO)
SET_COMBAT_FLOAT(esGroup1[1].PedIndex, CCF_MAX_SHOOTING_DISTANCE, 100.0)
SET_COMBAT_FLOAT(esGroup1[1].PedIndex, CCF_MIN_DISTANCE_TO_TARGET, 100.0)
SET_COMBAT_FLOAT(esGroup1[1].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(esGroup1[1].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[1].PedIndex, CA_ALWAYS_FIGHT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[1].PedIndex, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[1].PedIndex, CA_CAN_SHOOT_WITHOUT_LOS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[1].PedIndex, CA_REQUIRES_LOS_TO_SHOOT, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esGroup1[1].PedIndex, 150.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esGroup1[1].PedIndex, FALSE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esGroup1[2].PedIndex)
IF NOT IS_ENTITY_DEAD(esGroup1[2].PedIndex)
SET_PED_COMBAT_MOVEMENT(esGroup1[2].PedIndex, CM_DEFENSIVE)
SET_PED_DEFENSIVE_AREA_SPHERE(esGroup1[2].PedIndex, << 86.32, -1918.05, 19.69 >>, 3.0)
SET_PED_CHANCE_OF_FIRING_BLANKS(esGroup1[2].PedIndex, 1.0, 1.0)
SET_PED_SHOOTING_PROPERTIES(esGroup1[2].PedIndex, 1, 175, FIRING_PATTERN_FULL_AUTO)
SET_COMBAT_FLOAT(esGroup1[2].PedIndex, CCF_MAX_SHOOTING_DISTANCE, 100.0)
SET_COMBAT_FLOAT(esGroup1[2].PedIndex, CCF_MIN_DISTANCE_TO_TARGET, 100.0)
SET_COMBAT_FLOAT(esGroup1[2].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(esGroup1[2].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[2].PedIndex, CA_ALWAYS_FIGHT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[2].PedIndex, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[2].PedIndex, CA_CAN_SHOOT_WITHOUT_LOS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[2].PedIndex, CA_REQUIRES_LOS_TO_SHOOT, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esGroup1[2].PedIndex, 150.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esGroup1[2].PedIndex, FALSE)
ENDIF
ENDIF
bFirstEnemyGroupInitialised = TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_DEAL_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
REQUEST_IPL("SC1_27_Cut")
IF IS_IPL_ACTIVE("SC1_27_Cut")
AND HAS_REQUESTED_CUTSCENE_LOADED("fra_1_mcs_1")
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_SMG, GET_MAX_AMMO_IN_CLIP(PLAYER_PED_ID(), WEAPONTYPE_SMG) * 2)
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, PLAYER_ONE)
ENDIF
IF NOT IS_PED_INJURED(psTrevor.PedIndex)
SET_PED_SUFFERS_CRITICAL_HITS(psTrevor.PedIndex, FALSE)
SET_ENTITY_HEALTH(psTrevor.PedIndex, MAX_BUDDY_PED_HEALTH)
SET_PED_MAX_HEALTH(psTrevor.PedIndex, MAX_BUDDY_PED_HEALTH)
SET_PED_INFINITE_AMMO(psTrevor.PedIndex, FALSE)
GIVE_WEAPON_TO_PED(psTrevor.PedIndex, WEAPONTYPE_PUMPSHOTGUN, GET_MAX_AMMO_IN_CLIP(psTrevor.PedIndex, WEAPONTYPE_PUMPSHOTGUN) * 2)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psTrevor.PedIndex, TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(psTrevor.PedIndex, "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, PLAYER_TWO)
ENDIF
IF NOT IS_PED_INJURED(psLamar.PedIndex)
SET_PED_SUFFERS_CRITICAL_HITS(psLamar.PedIndex, FALSE)
SET_ENTITY_HEALTH(psLamar.PedIndex, MAX_BUDDY_PED_HEALTH)
SET_PED_MAX_HEALTH(psLamar.PedIndex, MAX_BUDDY_PED_HEALTH)
GIVE_WEAPON_TO_PED(psLamar.PedIndex, WEAPONTYPE_ASSAULTRIFLE, INFINITE_AMMO)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psLamar.PedIndex, TRUE)
SET_PED_PRELOAD_VARIATION_DATA(psLamar.PedIndex, PED_COMP_SPECIAL2, 1, 0)
REGISTER_ENTITY_FOR_CUTSCENE(psLamar.PedIndex, "Lamar", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF DOES_ENTITY_EXIST(osBag.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osBag.ObjectIndex)
IF IS_ENTITY_ATTACHED(osBag.ObjectIndex)
DETACH_ENTITY(osBag.ObjectIndex, FALSE)
ENDIF
IF IS_ENTITY_PLAYING_ANIM(osBag.ObjectIndex, "missfra1leadinoutmcs_1", "money_bag")
STOP_ENTITY_ANIM(osBag.ObjectIndex, "money_bag", "missfra1leadinoutmcs_1", INSTANT_BLEND_OUT)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(osBag.ObjectIndex, "Michaels_Heist_Bag", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY, P_LD_HEIST_BAG_S_1)
ENDIF
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(osCokeBlock.ObjectIndex, "Coke_Block", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osCokeBlock.ModelName)
FranklinsWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_SMG)
REGISTER_ENTITY_FOR_CUTSCENE(FranklinsWeapon, "Franklins_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
TrevorsWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(psTrevor.PedIndex, WEAPONTYPE_PUMPSHOTGUN)
REGISTER_ENTITY_FOR_CUTSCENE(TrevorsWeapon, "Trevors_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_WEAPONTYPE_MODEL(WEAPONTYPE_SMG))
SET_MODEL_AS_NO_LONGER_NEEDED(GET_WEAPONTYPE_MODEL(WEAPONTYPE_PUMPSHOTGUN))
SET_MODEL_AS_NO_LONGER_NEEDED(GET_WEAPONTYPE_MODEL(WEAPONTYPE_ASSAULTRIFLE))
CLEAR_HELP()
CLEAR_PRINTS()
KILL_FACE_TO_FACE_CONVERSATION() //clear any previous coversations
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ELSE
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
//Franklin's variations
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_FRANKLIN))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Franklin", GET_PED_INDEX(CHAR_FRANKLIN))
ENDIF
//Trevor's variations
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_TREVOR))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Trevor", GET_PED_INDEX(CHAR_TREVOR))
ENDIF
//Lamar's variations
IF DOES_ENTITY_EXIST(psLamar.PedIndex)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Lamar", psLamar.PedIndex)
ENDIF
ENDIF
ENDIF
BREAK
CASE 1 //fade screen in if screen was faded out due to shit skip or debug skip
IF IS_CUTSCENE_PLAYING()
CLEANUP_VEHICLE_GROUP(vsParkedVehicles, TRUE)
IF ( bCoverpointsCreated = FALSE )
CREATE_COVERPOINTS(csCoverpoints)
bCoverpointsCreated = TRUE
ENDIF
//clear area when starting the cutscene
CLEAR_AREA(<< 93.38, -1948.68, 19.75 >>, 7.5, TRUE) //clear area in front of the house and driveway
CLEAR_AREA(<< 1.50, -1853.74, 23.31 >>, 125.00, TRUE) //clear grove street area for damage caused before triggering cutscene
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling clear area at in front of the dealer's house.")
#ENDIF
//create big scenario blocking area
IF ( ScenarioBlockingArea5 = NULL )
ScenarioBlockingArea5 = CREATE_SCENARIO_BLOCKING_AREA(<< 82.898, -1949.781, 19.79 >>, << 5000.0, 5000.0, 64.0 >>)
ENDIF
CLEAR_AREA_OF_PEDS(psFranklin.vPosition, 5000.0)
CLEAR_AREA_OF_VEHICLES(psFranklin.vPosition, 5000.0)
CLEAR_AREA_OF_PROJECTILES(psFranklin.vPosition, 5000.0)
//reposition player's van for cutscene
IF IS_VEHICLE_DRIVEABLE(vsVan.VehicleIndex)
SET_ENTITY_COORDS(vsVan.VehicleIndex, vsVan.vPosition)
SET_ENTITY_HEADING(vsVan.VehicleIndex, vsVan.fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(vsVan.VehicleIndex)
SET_VEHICLE_DOORS_SHUT(vsVan.VehicleIndex, TRUE)
ENDIF
//reposition Chop
IF DOES_ENTITY_EXIST(psChop.PedIndex)
IF NOT IS_ENTITY_DEAD(psChop.PedIndex)
CLEAR_PED_TASKS(psChop.PedIndex)
WARP_PED(psChop.PedIndex, << 88.97, -1958.81, 19.75 >>, 0.0, FALSE, FALSE, FALSE)
ENDIF
ENDIF
SET_WEATHER_TYPE_OVERTIME_PERSIST("EXTRASUNNY", 30.0)
bFirstEnemyGroupInCombat = FALSE
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(FADE_TIME)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 2
MANAGE_ENEMY_PEDS_DURING_DEAL_CUTSCENE(iEnemiesInCutsceneProgress)
//handle music events in the cutscene
IF IS_CUTSCENE_PLAYING()
CREATE_DUMPSTERS(iDumpstersProgress)
CREATE_PARKED_VEHICLES(iParkedVehiclesProgress)
IF ( bMusicScorePlaying = FALSE )
IF ( GET_CUTSCENE_TIME() > 60000 )
AND ( bCutsceneSkipped = FALSE )
IF TRIGGER_MUSIC_EVENT("FRA1_MISSION_START")
bMusicScorePlaying = TRUE
ENDIF
ENDIF
ENDIF
IF ( bMusicEventHustlerTriggered = FALSE )
IF ( GET_CUTSCENE_TIME() > 65000 )
AND ( bCutsceneSkipped = FALSE )
IF TRIGGER_MUSIC_EVENT("FRA1_HUSTLER")
bMusicEventHustlerTriggered = TRUE
ENDIF
ENDIF
ENDIF
//fix for B*2013717, warp Trevor to reset his ped capsule during cutscene
IF ( bCutsceneSkipped = FALSE )
IF ( bWarpTrevorToResetCapsule = FALSE )
IF ( GET_CUTSCENE_TIME() > 15000 )
IF NOT IS_PED_INJURED(psTrevor.PedIndex)
WARP_PED(psTrevor.PedIndex, GET_ENTITY_COORDS(psTrevor.PedIndex), 0.0, FALSE, FALSE, FALSE)
bWarpTrevorToResetCapsule = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(osCokeBlock.ObjectIndex)
IF DOES_CUTSCENE_ENTITY_EXIST("Coke_Block")
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Coke_Block"))
osCokeBlock.ObjectIndex = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Coke_Block"))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created object Coke_Block in the cutscene.")
#ENDIF
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Franklin.")
#ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), csCoverpoints[0].vPosition, -1, FALSE, 0.5, TRUE, FALSE, csCoverpoints[0].CoverpointIndex)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Putting Franklin into cover on cutscene end.")
#ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(17.0 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-9.077)
ENDIF
IF DOES_ENTITY_EXIST(osCokeBlock.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osCokeBlock.ObjectIndex)
SET_ENTITY_COORDS_NO_OFFSET(osCokeBlock.ObjectIndex, osCokeBlock.vPosition)
SET_ENTITY_ROTATION(osCokeBlock.ObjectIndex, osCokeBlock.vRotation)
FREEZE_ENTITY_POSITION(osCokeBlock.ObjectIndex, TRUE)
SET_ENTITY_INVINCIBLE(osCokeBlock.ObjectIndex, TRUE)
ENDIF
ENDIF
REPLAY_STOP_EVENT()
REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lamar", psLamar.ModelName)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Lamar.")
#ENDIF
IF NOT IS_PED_INJURED(psLamar.PedIndex)
WARP_PED(psLamar.PedIndex, psLamar.vPosition, psLamar.fHeading, FALSE, FALSE, FALSE)
SET_CURRENT_PED_WEAPON(psLamar.PedIndex, WEAPONTYPE_ASSAULTRIFLE, TRUE)
SET_PED_COMPONENT_VARIATION(psLamar.PedIndex, PED_COMP_SPECIAL2, 1, 0, 0)
TASK_PUT_PED_DIRECTLY_INTO_COVER(psLamar.PedIndex, csCoverpoints[1].vPosition, -1, FALSE, 0.5, TRUE, FALSE, csCoverpoints[1].CoverpointIndex)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psLamar.PedIndex)
bLamarsBagEquipped = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Putting Lamar into cover on exit state.")
#ENDIF
ENDIF
GO_TO_PED_STATE(psLamar, PED_STATE_COMBAT_ON_FOOT)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Trevor.")
#ENDIF
IF NOT IS_PED_INJURED(psTrevor.PedIndex)
TASK_PUT_PED_DIRECTLY_INTO_COVER(psTrevor.PedIndex, csCoverpoints[2].vPosition, -1, FALSE, 0.5, TRUE, FALSE, csCoverpoints[2].CoverpointIndex)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psTrevor.PedIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Putting Trevor into cover on exit state.")
#ENDIF
ENDIF
GO_TO_PED_STATE(psTrevor, PED_STATE_COMBAT_ON_FOOT)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklins_weapon")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Franklins_weapon.")
#ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
GIVE_WEAPON_OBJECT_TO_PED(FranklinsWeapon, PLAYER_PED_ID())
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_weapon")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Trevors_weapon.")
#ENDIF
IF NOT IS_PED_INJURED(psTrevor.PedIndex)
GIVE_WEAPON_OBJECT_TO_PED(TrevorsWeapon, psTrevor.PedIndex)
ENDIF
ENDIF
IF HAS_CUTSCENE_FINISHED()
IF HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_SMG)
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_PUMPSHOTGUN)
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_ASSAULTRIFLE)
AND GET_IS_WAYPOINT_RECORDING_LOADED("fra1_cflee")
AND DOES_ENTITY_EXIST(esGroup1[0].PedIndex)
AND DOES_ENTITY_EXIST(esGroup1[1].PedIndex)
AND DOES_ENTITY_EXIST(esGroup1[2].PedIndex)
IF ( bCutsceneSkipped = TRUE ) //cutscene was skipped
//put player ped and buddy peds into cover here on cutscene skip?
//give combat tasks to enemy peds on cutscene skip
IF NOT IS_ENTITY_DEAD(esGroup1[0].PedIndex)
WARP_PED(esGroup1[0].PedIndex, vGroup1Enemy0Position, fGroup1Enemy0Heading, FALSE, FALSE, FALSE)
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esGroup1[0].PedIndex, << 81.91, -1942.41, 19.85 >>, PEDMOVE_RUN, FALSE, vGroup1EnemyAimCoords, NULL, TRUE)
SET_PED_COMBAT_PROPERTIES(esGroup1[0].PedIndex, CM_STATIONARY, CAL_AVERAGE, CR_MEDIUM, CA_AGGRESSIVE)
SET_PED_SHOOTING_PROPERTIES(esGroup1[0].PedIndex, 1, 60, FIRING_PATTERN_FULL_AUTO)
SET_PED_CHANCE_OF_FIRING_BLANKS(esGroup1[0].PedIndex, 1.0, 1.0)
ENDIF
IF NOT IS_ENTITY_DEAD(esGroup1[1].PedIndex)
SET_PED_COMBAT_MOVEMENT(esGroup1[1].PedIndex, CM_DEFENSIVE)
SET_PED_DEFENSIVE_AREA_SPHERE(esGroup1[1].PedIndex, << 89.92, -1918.83, 19.63 >>, 3.0)
SET_PED_CHANCE_OF_FIRING_BLANKS(esGroup1[1].PedIndex, 1.0, 1.0)
SET_PED_SHOOTING_PROPERTIES(esGroup1[1].PedIndex, 1, 175, FIRING_PATTERN_FULL_AUTO)
SET_COMBAT_FLOAT(esGroup1[1].PedIndex, CCF_MAX_SHOOTING_DISTANCE, 100.0)
SET_COMBAT_FLOAT(esGroup1[1].PedIndex, CCF_MIN_DISTANCE_TO_TARGET, 100.0)
SET_COMBAT_FLOAT(esGroup1[1].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(esGroup1[1].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[1].PedIndex, CA_ALWAYS_FIGHT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[1].PedIndex, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[1].PedIndex, CA_CAN_SHOOT_WITHOUT_LOS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[1].PedIndex, CA_REQUIRES_LOS_TO_SHOOT, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esGroup1[1].PedIndex, 150.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esGroup1[1].PedIndex, FALSE)
ENDIF
IF NOT IS_ENTITY_DEAD(esGroup1[2].PedIndex)
SET_PED_COMBAT_MOVEMENT(esGroup1[2].PedIndex, CM_DEFENSIVE)
SET_PED_DEFENSIVE_AREA_SPHERE(esGroup1[2].PedIndex, << 86.32, -1918.05, 19.69 >>, 3.0)
SET_PED_CHANCE_OF_FIRING_BLANKS(esGroup1[2].PedIndex, 1.0, 1.0)
SET_PED_SHOOTING_PROPERTIES(esGroup1[2].PedIndex, 1, 175, FIRING_PATTERN_FULL_AUTO)
SET_COMBAT_FLOAT(esGroup1[2].PedIndex, CCF_MAX_SHOOTING_DISTANCE, 100.0)
SET_COMBAT_FLOAT(esGroup1[2].PedIndex, CCF_MIN_DISTANCE_TO_TARGET, 100.0)
SET_COMBAT_FLOAT(esGroup1[2].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(esGroup1[2].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[2].PedIndex, CA_ALWAYS_FIGHT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[2].PedIndex, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[2].PedIndex, CA_CAN_SHOOT_WITHOUT_LOS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[2].PedIndex, CA_REQUIRES_LOS_TO_SHOOT, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esGroup1[2].PedIndex, 150.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esGroup1[2].PedIndex, FALSE)
ENDIF
bFirstEnemyGroupInCombat = TRUE
WAIT(1500) //wait a bit so that enemies are moving, not stationary
KILL_FACE_TO_FACE_CONVERSATION() //clear any previous coversations
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
REMOVE_IPL("SC1_27_Cut")
DELETE_OBJECT(TrevorsWeapon)
DELETE_OBJECT(FranklinsWeapon)
TRIGGER_MUSIC_EVENT("FRA1_FIGHT_START")
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(FADE_TIME)
ENDIF
RETURN TRUE
ELSE //cutscene was not skipped
KILL_FACE_TO_FACE_CONVERSATION() //clear any previous coversations
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
REMOVE_IPL("SC1_27_Cut")
DELETE_OBJECT(TrevorsWeapon)
DELETE_OBJECT(FranklinsWeapon)
TRIGGER_MUSIC_EVENT("FRA1_FIGHT_START")
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(FADE_TIME)
ENDIF
RETURN TRUE
ENDIF
ENDIF
ELSE
REQUEST_MODEL(mnBalla)
REQUEST_WAYPOINT_RECORDING("fra1_cflee")
REQUEST_WEAPON_ASSET(WEAPONTYPE_SMG)
REQUEST_WEAPON_ASSET(WEAPONTYPE_PUMPSHOTGUN)
REQUEST_WEAPON_ASSET(WEAPONTYPE_ASSAULTRIFLE)
IF ( bCutsceneSkipped = FALSE ) //if cutscene is skipped, fade out and remain cutscene on faded out screen
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
bCutsceneSkipped = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mocap cutscene was skipped by the player.")
#ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC RUN_ENEMY_GROUP_DEAD_CHECK(ENEMY_STRUCT &esArray[], BOOL &bFlag #IF IS_DEBUG_BUILD, STRING sDebugPrint = NULL #ENDIF)
IF ( bFlag = FALSE )
IF IS_ENEMY_GROUP_DEAD(esArray)
bFlag = TRUE
#IF IS_DEBUG_BUILD
IF NOT IS_STRING_NULL_OR_EMPTY(sDebugPrint)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Flag ", sDebugPrint, " set to ", bFlag, ".")
ENDIF
#ENDIF
ENDIF
ENDIF
ENDPROC
PROC RUN_EVENTS_CHECK()
IF ( Events[EVENT_PLAYER_ENTERED_RIVER_ENTRANCE_LOCATE] = FALSE )
IF IS_ENTITY_IN_ANGLED_AREA_LOCATE(PLAYER_PED_ID(), <<-44.493145,-1867.814697,23.294022>>, <<-17.559521,-1835.444336,29.422800>>, 22.0)
Events[EVENT_PLAYER_ENTERED_RIVER_ENTRANCE_LOCATE] = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Event EVENT_PLAYER_ENTERED_RIVER_ENTRANCE_LOCATE set to TRUE.")
#ENDIF
ENDIF
ENDIF
IF ( Events[EVENT_SHOOTOUT_ENDED] = FALSE )
IF ( Events[EVENT_ENEMIES_GROUP7_KILLED] = TRUE )
AND ( Events[EVENT_ENEMIES_GROUP8_KILLED] = TRUE )
AND ( Events[EVENT_ENEMIES_CARSTREETLEFT_KILLED] = TRUE )
AND ( Events[EVENT_ENEMIES_CARSTREETRIGHT_KILLED] = TRUE )
AND ( Events[EVENT_COPS_ARRIVE] = TRUE)
Events[EVENT_SHOOTOUT_ENDED] = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Event EVENT_SHOOTOUT_ENDED set to TRUE.")
#ENDIF
ENDIF
ENDIF
IF ( Events[EVENT_BUDDIES_WAITING_FOR_PLAYER] = FALSE )
IF ( Events[EVENT_COPS_ARRIVE] = TRUE )
IF ( psTrevor.bWaitingForPlayer = TRUE )
OR ( psLamar.bWaitingForPlayer = TRUE)
Events[EVENT_BUDDIES_WAITING_FOR_PLAYER] = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Event EVENT_BUDDIES_WAITING_FOR_PLAYER set to TRUE.")
#ENDIF
ENDIF
ENDIF
ENDIF
IF ( Events[EVENT_COPS_ARRIVE] = FALSE )
IF ( Events[EVENT_COPS_SPAWNED] = TRUE )
IF IS_VEHICLE_AT_COORD(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex, <<-30.758705,-1822.644653,27.052753>>, <<10.000000,12.000000,3.000000>>)
OR IS_VEHICLE_AT_COORD(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex, <<-30.758705,-1822.644653,27.052753>>, <<10.000000,12.000000,3.000000>>)
Events[EVENT_COPS_ARRIVE] = TRUE
iCopReinforcementTimer = GET_GAME_TIMER()
SET_MODEL_AS_NO_LONGER_NEEDED(mnBalla)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Event EVENT_COPS_ARRIVE set to TRUE.")
CPRINTLN(DEBUG_MISSION, "Start tracking reinforcement time at:", iCopReinforcementTimer)
#ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_CHOP_DURING_SHOOTOUT(PED_STRUCT &ped)
IF DOES_ENTITY_EXIST(ped.PedIndex)
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
#IF IS_DEBUG_BUILD //debug info display
IF ( bDrawDebugStates = TRUE)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_STRING_FROM_INT(ped.iProgress), 1.35)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_STRING_FROM_FLOAT(GET_PED_HEALTH_RATIO(ped.PedIndex)), 1.45)
ENDIF
ped.sDebugName = "Chop"
#ENDIF
SWITCH ped.eState
CASE PED_STATE_IDLE
IF ( ped.bHasTask = FALSE )
SET_ENTITY_HEALTH(ped.PedIndex, 800)
SET_PED_MAX_HEALTH(ped.PedIndex, 800)
CLEAR_RAGDOLL_BLOCKING_FLAGS(ped.PedIndex, RBF_EXPLOSION)
SET_RAGDOLL_BLOCKING_FLAGS(ped.PedIndex, RBF_PLAYER_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(ped.PedIndex, RBF_BULLET_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(ped.PedIndex, RBF_PLAYER_IMPACT)
GIVE_WEAPON_TO_PED(ped.PedIndex, WEAPONTYPE_ANIMAL, INFINITE_AMMO)
WARP_PED(ped.PedIndex, ped.vPosition, ped.fHeading, FALSE, FALSE, FALSE)
ped.bHasTask = TRUE
ENDIF
IF ( Events[EVENT_SHOOTOUT_STARTED] = TRUE )
SWITCH eChopBehaviour
CASE CHOP_BEHAVIOUR_BAD
CASE CHOP_BEHAVIOUR_GOOD
CASE CHOP_BEHAVIOUR_MEDIUM
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
BREAK
ENDSWITCH
ENDIF
BREAK
CASE PED_STATE_FLEEING
IF ( ped.bHasTask = FALSE )
IF NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(ped.PedIndex)
REQUEST_WAYPOINT_RECORDING("fra1_cflee")
IF GET_IS_WAYPOINT_RECORDING_LOADED("fra1_cflee")
TASK_FOLLOW_WAYPOINT_RECORDING(ped.PedIndex, "fra1_cflee", 0, EWAYPOINT_START_FROM_CLOSEST_POINT)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, TRUE)
ENDIF
ELSE
ped.iHealthConversationTimer = 0 //use for F1_LCGO & F1_FCGO
ped.iHealthConversationCounter = 0 //use for F1_LCGO & F1_FCGO
ped.iPedConversationTimer = 0 //use for F1_LCGO & F1_FCGO
ped.iProgress = 0 //use ped progress to control chop camera
ped.bHasTask = TRUE
ENDIF
ENDIF
IF ( ped.bHasTask = TRUE )
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(ped.PedIndex)
WAYPOINT_PLAYBACK_OVERRIDE_SPEED(ped.PedIndex, 2.5, TRUE) //make chop sprint when fleeing
INT iWaypointProgress
iWaypointProgress = GET_PED_WAYPOINT_PROGRESS(ped.PedIndex)
IF ( iWaypointProgress >= 95 )
IF IS_ENTITY_OCCLUDED(ped.PedIndex)
OR NOT IS_ENTITY_ON_SCREEN(ped.PedIndex)
DELETE_PED(ped.PedIndex)
REMOVE_WAYPOINT_RECORDING("fra1_cflee")
ELSE
TASK_SMART_FLEE_COORD(ped.PedIndex, GET_ENTITY_COORDS(ped.PedIndex), 250.0, INFINITE_TASK_TIME)
SET_PED_KEEP_TASK(ped.PedIndex, TRUE)
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
REMOVE_WAYPOINT_RECORDING("fra1_cflee")
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
PROC RUN_VEHICLE_TYRE_BURST_CHECK(VEHICLE_INDEX VehicleIndex, SC_WHEEL_LIST eVehicleWheel, VECTOR vWheelOffset, FLOAT fRadius, BOOL bPlayerOnly,
BOOL bApplyDamage, VECTOR vDamageOffset, FLOAT fDamage = 100.0, FLOAT fDeformation = 100.0
#IF IS_DEBUG_BUILD, BOOL bDrawDebugInfo = TRUE #ENDIF)
IF DOES_ENTITY_EXIST(VehicleIndex)
IF NOT IS_ENTITY_DEAD(VehicleIndex)
IF NOT IS_VEHICLE_TYRE_BURST(VehicleIndex, eVehicleWheel)
IF IS_BULLET_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vWheelOffset), fRadius, bPlayerOnly)
SWITCH eVehicleWheel
CASE SC_WHEEL_CAR_FRONT_LEFT
SET_VEHICLE_TYRE_BURST(VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT)
SMASH_VEHICLE_WINDOW(VehicleIndex, SC_WINDOW_FRONT_LEFT)
BREAK
CASE SC_WHEEL_CAR_FRONT_RIGHT
SET_VEHICLE_TYRE_BURST(VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT)
SMASH_VEHICLE_WINDOW(VehicleIndex, SC_WINDOW_FRONT_RIGHT)
BREAK
CASE SC_WHEEL_CAR_REAR_LEFT
SET_VEHICLE_TYRE_BURST(VehicleIndex, SC_WHEEL_CAR_REAR_LEFT)
SMASH_VEHICLE_WINDOW(VehicleIndex, SC_WINDOW_REAR_LEFT)
BREAK
CASE SC_WHEEL_CAR_REAR_RIGHT
SET_VEHICLE_TYRE_BURST(VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT)
SMASH_VEHICLE_WINDOW(VehicleIndex, SC_WINDOW_REAR_RIGHT)
BREAK
ENDSWITCH
IF ( bApplyDamage = TRUE )
SET_VEHICLE_DAMAGE(VehicleIndex, vDamageOffset, fDamage, fDeformation, TRUE)
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
IF ( bDrawDebugInfo = TRUE )
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vWheelOffset), fRadius, 0, 0, 255, 64)
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vDamageOffset), 0.1, 255, 0, 0)
ENDIF
#ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC UPDATE_VEHICLE_FOR_DAMAGE(VEHICLE_INDEX VehicleIndex, INT iExplodeHealth #IF IS_DEBUG_BUILD, BOOL bDrawDebugInfo = TRUE #ENDIF)
IF DOES_ENTITY_EXIST(VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugInfo = TRUE )
TEXT_LABEL HealthLabel = "H: "
TEXT_LABEL EngineLabel = "E: "
TEXT_LABEL PetrolLabel = "P: "
HealthLabel += GET_STRING_FROM_INT(GET_ENTITY_HEALTH(VehicleIndex))
EngineLabel += GET_STRING_FROM_FLOAT(GET_VEHICLE_ENGINE_HEALTH(VehicleIndex))
PetrolLabel += GET_STRING_FROM_FLOAT(GET_VEHICLE_PETROL_TANK_HEALTH(VehicleIndex))
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, HealthLabel, 2.15)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, EngineLabel, 1.95)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, PetrolLabel, 1.75)
ENDIF
#ENDIF
IF NOT IS_ENTITY_DEAD(VehicleIndex)
IF ( GET_ENTITY_HEALTH(VehicleIndex) = 0 )
SET_VEHICLE_ENGINE_HEALTH(VehicleIndex, -100)
SET_VEHICLE_PETROL_TANK_HEALTH(VehicleIndex, -100)
ELIF ( GET_ENTITY_HEALTH(VehicleIndex) < iExplodeHealth )
SET_VEHICLE_ENGINE_HEALTH(VehicleIndex, -100)
SET_VEHICLE_PETROL_TANK_HEALTH(VehicleIndex, -100)
SET_ENTITY_HEALTH(VehicleIndex, 100)
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(VehicleIndex)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_FILMCREW_SCARED()
IF bFilmCrewAttacked
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC MANAGE_CONVERSATIONS_DURING_SHOOTOUT(INT &iProgress)
PED_INDEX ClosestEnemyPed
INT iEnemySpeakerID
STRING sEnemyVoiceName
STRING sEnemyConversationRoot
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_FLOW")
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_FRANKLIN))
IF NOT IS_ENTITY_DEAD(GET_PED_INDEX(CHAR_FRANKLIN))
IF GET_PED_HEALTH_RATIO(GET_PED_INDEX(CHAR_FRANKLIN)) < 0.475
IF HAS_TIME_PASSED(15000, psFranklin.iHealthConversationTimer)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_FLOW", CONV_PRIORITY_HIGH)
psFranklin.iHealthConversationTimer = GET_GAME_TIMER()
psFranklin.iHealthConversationCounter++
IF ( psFranklin.iHealthConversationCounter = 6 )
SET_LABEL_AS_TRIGGERED("F1_FLOW", TRUE)
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_AMBIENT_SPEECH_PLAYING(GET_PED_INDEX(CHAR_FRANKLIN))
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(GET_PED_INDEX(CHAR_FRANKLIN), "FKN1_GSAA", "FRANKLIN", SPEECH_PARAMS_FORCE_NORMAL)
psFranklin.iHealthConversationTimer = GET_GAME_TIMER()
psFranklin.iHealthConversationCounter++
IF ( psFranklin.iHealthConversationCounter = 6 )
SET_LABEL_AS_TRIGGERED("F1_FLOW", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_TLOW")
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_TREVOR))
IF NOT IS_ENTITY_DEAD(GET_PED_INDEX(CHAR_TREVOR))
IF GET_PED_HEALTH_RATIO(GET_PED_INDEX(CHAR_TREVOR)) < 0.475
IF HAS_TIME_PASSED(15000, psTrevor.iHealthConversationTimer)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_TLOW", CONV_PRIORITY_HIGH)
psTrevor.iHealthConversationTimer = GET_GAME_TIMER()
psTrevor.iHealthConversationCounter++
IF ( psTrevor.iHealthConversationCounter = 6 )
SET_LABEL_AS_TRIGGERED("F1_TLOW", TRUE)
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_AMBIENT_SPEECH_PLAYING(GET_PED_INDEX(CHAR_TREVOR))
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(GET_PED_INDEX(CHAR_TREVOR), "FKN1_GTAA", "TREVOR", SPEECH_PARAMS_FORCE_NORMAL)
psTrevor.iHealthConversationTimer = GET_GAME_TIMER()
psTrevor.iHealthConversationCounter++
IF ( psTrevor.iHealthConversationCounter = 6 )
SET_LABEL_AS_TRIGGERED("F1_TLOW", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bBuddyPinnedDown = TRUE AND bBuddyPinnedDownSwitched = FALSE )
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF HAS_TIME_PASSED(7500, psTrevor.iHealthConversationTimer)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_HELP1", CONV_PRIORITY_HIGH)
psTrevor.iHealthConversationTimer = GET_GAME_TIMER()
ENDIF
ELSE
IF NOT IS_AMBIENT_SPEECH_PLAYING(GET_PED_INDEX(CHAR_TREVOR))
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(GET_PED_INDEX(CHAR_TREVOR), "FKN1_KZAA", "TREVOR", SPEECH_PARAMS_FORCE_NORMAL)
psTrevor.iHealthConversationTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE CHAR_TREVOR
IF HAS_TIME_PASSED(7500, psFranklin.iHealthConversationTimer)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_FHELP1", CONV_PRIORITY_HIGH)
psFranklin.iHealthConversationTimer = GET_GAME_TIMER()
ENDIF
ELSE
IF NOT IS_AMBIENT_SPEECH_PLAYING(GET_PED_INDEX(CHAR_FRANKLIN))
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(GET_PED_INDEX(CHAR_FRANKLIN), "FKN1_LBAA", "FRANKLIN", SPEECH_PARAMS_FORCE_NORMAL)
psFranklin.iHealthConversationTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LLOW")
IF DOES_ENTITY_EXIST(psLamar.PedIndex)
IF NOT IS_ENTITY_DEAD(psLamar.PedIndex)
IF GET_PED_HEALTH_RATIO(psLamar.PedIndex) < 0.475
IF HAS_TIME_PASSED(15000, psLamar.iHealthConversationTimer)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LLOW", CONV_PRIORITY_HIGH)
psTrevor.iHealthConversationTimer = GET_GAME_TIMER()
psTrevor.iHealthConversationCounter++
IF ( psTrevor.iHealthConversationCounter = 4 )
SET_LABEL_AS_TRIGGERED("F1_LLOW", TRUE)
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_AMBIENT_SPEECH_PLAYING(psLamar.PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(psLamar.PedIndex, "FKN1_GRAA", "LAMAR", SPEECH_PARAMS_FORCE_NORMAL)
psLamar.iHealthConversationTimer = GET_GAME_TIMER()
psLamar.iHealthConversationCounter++
IF ( psLamar.iHealthConversationCounter = 4 )
SET_LABEL_AS_TRIGGERED("F1_LLOW", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH iProgress
CASE 0 //play conversation at the start of the shootout
IF ( Events[EVENT_SHOOTOUT_STARTED] = TRUE )
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_GSESCG")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_GSESCG", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_GSESCG", TRUE)
ENDIF
ENDIF
ENDIF
ELSE
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_GSVIW")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_GSVIW", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_GSVIW", TRUE)
iEnemyRandomConversationDelay = 5000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
iEnemyConversationTimer = GET_GAME_TIMER()
bRandomConversationAllowed = TRUE
iConversationTimer = GET_GAME_TIMER()
iProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1 //play conversations during the shootout
IF ( Events[EVENT_SHOOTOUT_ENDED] = FALSE ) //play conversations from shootout start to the end
//handle conversation for enemies in car doing drive by
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_BALL7D")
IF DOES_ENTITY_EXIST(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex)
IF GET_TIME_POSITION_IN_RECORDING(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex) > 3000.0
IF DOES_ENTITY_EXIST(esCarIntersection1Right[0].PedIndex)
IF NOT IS_ENTITY_DEAD(esCarIntersection1Right[0].PedIndex)
IF IS_PED_IN_COMBAT(esCarIntersection1Right[0].PedIndex)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
ADD_PED_FOR_DIALOGUE(sFranklin1Conversation, BALLA7SPEAKERID, esCarIntersection1Right[0].PedIndex, BALLA7VOICENAME)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_BALL7D", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_BALL7D", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//play conversation for car rolling out of control
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_ROLL")
IF DOES_ENTITY_EXIST(vsEnemyCars[CAR_DRIVEWAY].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsEnemyCars[CAR_DRIVEWAY].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyCars[CAR_DRIVEWAY].VehicleIndex)
IF GET_TIME_POSITION_IN_RECORDING(vsEnemyCars[CAR_DRIVEWAY].VehicleIndex) > 2000.0
IF DOES_ENTITY_EXIST(psLamar.PedIndex)
IF NOT IS_ENTITY_DEAD(psLamar.PedIndex)
IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY_IN_FRONT(psLamar.PedIndex, vsEnemyCars[CAR_DRIVEWAY].VehicleIndex)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_ROLL", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_ROLL", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//play conversation for player sniping
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LSNIPE_3")
IF bLastEnemyKilledWithSniperRifle = TRUE
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LSNIPE", CONV_PRIORITY_MEDIUM)
iSniperRifleConversationsCounter++
iConversationTimer = GET_GAME_TIMER()
bLastEnemyKilledWithSniperRifle = FALSE
IF ( iSniperRifleConversationsCounter >=3 )
SET_LABEL_AS_TRIGGERED("F1_LSNIPE_3", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psChop.PedIndex)
IF NOT IS_ENTITY_DEAD(psChop.PedIndex)
SWITCH pschop.eState
CASE PED_STATE_FLEEING
IF HAS_LABEL_BEEN_TRIGGERED("FRA1_ESCGSF")
OR HAS_LABEL_BEEN_TRIGGERED("FRA1_ESCGST")
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCGO")
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_FCGO")
IF ( psChop.iHealthConversationTimer = 0)
psChop.iPedConversationTimer = 250
psChop.iHealthConversationTimer = GET_GAME_TIMER()
ELSE
IF HAS_TIME_PASSED(psChop.iPedConversationTimer, psChop.iHealthConversationTimer)
SWITCH GET_RANDOM_INT_IN_RANGE(0, 2)
CASE 0
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCGO", CONV_PRIORITY_MEDIUM)
psChop.iPedConversationTimer = 1250
psChop.iHealthConversationTimer = GET_GAME_TIMER()
psChop.iHealthConversationCounter++
IF ( psChop.iHealthConversationCounter = 2 )
SET_LABEL_AS_TRIGGERED("F1_LCGO", TRUE)
ENDIF
ENDIF
ELSE
IF NOT IS_PED_INJURED(psLamar.PedIndex)
IF NOT IS_AMBIENT_SPEECH_PLAYING(psLamar.PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(psLamar.PedIndex, "FKN1_CDAA", "LAMAR", SPEECH_PARAMS_FORCE_NORMAL)
psChop.iPedConversationTimer = 1250
psChop.iHealthConversationTimer = GET_GAME_TIMER()
psChop.iHealthConversationCounter++
IF ( psChop.iHealthConversationCounter = 2 )
SET_LABEL_AS_TRIGGERED("F1_LCGO", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_FCGO", CONV_PRIORITY_MEDIUM)
psChop.iPedConversationTimer = 1250
psChop.iHealthConversationTimer = GET_GAME_TIMER()
psChop.iHealthConversationCounter++
IF ( psChop.iHealthConversationCounter = 2 )
SET_LABEL_AS_TRIGGERED("F1_FCGO", TRUE)
ENDIF
ENDIF
ELSE
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
IF NOT IS_AMBIENT_SPEECH_PLAYING(GET_PED_INDEX(CHAR_FRANKLIN))
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(GET_PED_INDEX(CHAR_FRANKLIN), "FKN1_CCAA", "FRANKLIN", SPEECH_PARAMS_FORCE_NORMAL)
psChop.iPedConversationTimer = 1250
psChop.iHealthConversationTimer = GET_GAME_TIMER()
psChop.iHealthConversationCounter++
IF ( psChop.iHealthConversationCounter = 2 )
SET_LABEL_AS_TRIGGERED("F1_FCGO", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF ( bRandomConversationAllowed = TRUE )
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LSIREN")
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_TSIREN")
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_FSIREN")
IF ( Events[EVENT_COPS_SPAWNED] = TRUE )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_RANDOM_INT_IN_RANGE(0,2)
CASE 0
lConversationLabel = "F1_LSIREN"
BREAK
CASE 1
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
lConversationLabel = "F1_TSIREN"
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
lConversationLabel = "F1_FSIREN"
ENDIF
BREAK
ENDSWITCH
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", lConversationLabel, CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED(lConversationLabel, TRUE)
iConversationTimer = GET_GAME_TIMER()
iEnemyConversationTimer = GET_GAME_TIMER()
iEnemyRandomConversationDelay = 2000 + GET_RANDOM_INT_IN_RANGE(0, 1001)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_TIME_PASSED(6000, iConversationTimer)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF ( psLamar.bWaitingToAdvance = FALSE )
AND ( psTrevor.bWaitingToAdvance = FALSE )
SWITCH GET_RANDOM_INT_IN_RANGE(0,3)
CASE 0
SWITCH GET_RANDOM_INT_IN_RANGE(0,3)
CASE 0
lConversationLabel = "F1_LCMBT"
BREAK
CASE 1
lConversationLabel = "F1_LMOVE"
BREAK
CASE 2
lConversationLabel = "F1_LMORE"
BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH GET_RANDOM_INT_IN_RANGE(0,2)
CASE 0
lConversationLabel = "F1_FCMBT"
BREAK
CASE 1
lConversationLabel = "F1_FMOVE"
BREAK
ENDSWITCH
BREAK
CASE 2
SWITCH GET_RANDOM_INT_IN_RANGE(0,2)
CASE 0
lConversationLabel = "F1_TCMBT"
BREAK
CASE 1
lConversationLabel = "F1_TMOVE"
BREAK
ENDSWITCH
BREAK
ENDSWITCH
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", lConversationLabel, CONV_PRIORITY_MEDIUM)
iConversationTimer = GET_GAME_TIMER()
ENDIF
ELSE
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_TREVOR
SWITCH GET_RANDOM_INT_IN_RANGE(0, 2)
CASE 0
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCWTA", CONV_PRIORITY_MEDIUM)
iConversationTimer = GET_GAME_TIMER()
ENDIF
BREAK
CASE 1
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_FCWTA", CONV_PRIORITY_MEDIUM)
iConversationTimer = GET_GAME_TIMER()
ENDIF
BREAK
ENDSWITCH
BREAK
CASE CHAR_FRANKLIN
SWITCH GET_RANDOM_INT_IN_RANGE(0, 2)
CASE 0
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCWTA", CONV_PRIORITY_MEDIUM)
iConversationTimer = GET_GAME_TIMER()
ENDIF
BREAK
CASE 1
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_TCWTA", CONV_PRIORITY_MEDIUM)
iConversationTimer = GET_GAME_TIMER()
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( Events[EVENT_COPS_ARRIVE] = TRUE ) //play conversations when cops arrive
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_BLOCK") //play conversation when cops block the street
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_BLOCK", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_BLOCK", TRUE)
ENDIF
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ELSE
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LEFT") //play conversation when Lamar starts running left to the alley
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LEFT", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LEFT", TRUE)
iConversationTimer = GET_GAME_TIMER()
iProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//play enemy random dialogue
IF HAS_TIME_PASSED(iEnemyRandomConversationDelay, iEnemyConversationTimer)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
ClosestEnemyPed = GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(PLAYER_PED_ID(), rgEnemies, GET_RANDOM_INT_IN_RANGE(0, 3))
IF ( ClosestEnemyPed <> NULL )
SWITCH GET_RANDOM_INT_IN_RANGE(0, 7)
CASE 0
iEnemySpeakerID = BALLA1SPEAKERID
sEnemyVoiceName = BALLA1VOICENAME
sEnemyConversationRoot = "F1_BALL1"
BREAK
CASE 1
iEnemySpeakerID = BALLA2SPEAKERID
sEnemyVoiceName = BALLA2VOICENAME
sEnemyConversationRoot = "F1_BALL2"
BREAK
CASE 2
iEnemySpeakerID = BALLA3SPEAKERID
sEnemyVoiceName = BALLA3VOICENAME
sEnemyConversationRoot = "F1_BALL3"
BREAK
CASE 3
iEnemySpeakerID = BALLA4SPEAKERID
sEnemyVoiceName = BALLA4VOICENAME
sEnemyConversationRoot = "F1_BALL4"
BREAK
CASE 4
iEnemySpeakerID = BALLA5SPEAKERID
sEnemyVoiceName = BALLA5VOICENAME
sEnemyConversationRoot = "F1_BALL5"
BREAK
CASE 5
iEnemySpeakerID = BALLA6SPEAKERID
sEnemyVoiceName = BALLA6VOICENAME
sEnemyConversationRoot = "F1_BALL6"
BREAK
CASE 6
iEnemySpeakerID = BALLA7SPEAKERID
sEnemyVoiceName = BALLA7VOICENAME
sEnemyConversationRoot = "F1_BALL7"
BREAK
ENDSWITCH
ADD_PED_FOR_DIALOGUE(sFranklin1Conversation, iEnemySpeakerID, ClosestEnemyPed, sEnemyVoiceName)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", sEnemyConversationRoot, CONV_PRIORITY_MEDIUM)
iEnemyConversationTimer = GET_GAME_TIMER()
iEnemyRandomConversationDelay = 6000 + GET_RANDOM_INT_IN_RANGE(0, 4001)
ENDIF
ELSE
iEnemyConversationTimer = GET_GAME_TIMER()
iEnemyRandomConversationDelay = 4000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2 //play conversations from the moment the buddies start waiting for the player at the alley to the river
IF ( Events[EVENT_BUDDIES_WAITING_FOR_PLAYER] = TRUE )
IF ( psLamar.bFleeing = FALSE )
AND ( psTrevor.bFleeing = FALSE )
IF HAS_TIME_PASSED(5000, iConversationTimer)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_RANDOM_INT_IN_RANGE(0,2)
CASE 0
lConversationLabel = "F1_LWAIT"
BREAK
CASE 1
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
lConversationLabel = "F1_TWAIT"
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
lConversationLabel = "F1_FWAIT"
ENDIF
BREAK
ENDSWITCH
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", lConversationLabel, CONV_PRIORITY_MEDIUM)
iConversationTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF ( psLamar.bFleeing = TRUE )
IF ( psLamar.bWaitingForPlayer = TRUE )
IF HAS_TIME_PASSED(3000, psLamar.iPedConversationTimer)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM02", CONV_PRIORITY_MEDIUM)
psLamar.iPedConversationTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LHILL")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LHILL", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LHILL", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_COM03")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF IS_ENTITY_IN_ANGLED_AREA(psLamar.PedIndex, <<-41.722290,-1866.694702,28.490503>>, <<-61.971512,-1891.405518,4.101753>>, 16.0)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM03", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_COM03", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_COM04")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT IS_PED_INJURED(psLamar.PedIndex)
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(psLamar.PedIndex)
IF ( GET_PED_WAYPOINT_PROGRESS(psLamar.PedIndex) > 40 )
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM04", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_COM04", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_FILMCREW_SCARED()
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_COM05")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF IS_PED_IN_PED_STATE(psLamar, PED_STATE_RUNNING_TO_VEHICLE)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM05", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_COM05", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_FILMCREW_SCARED()
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_COM06")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF IS_PED_IN_PED_STATE(psLamar, PED_STATE_WAITING_AT_VEHICLE)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM06", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_COM06", TRUE)
psLamar.iTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_PED_IN_PED_STATE(psLamar, PED_STATE_WAITING_AT_VEHICLE)
OR IS_PED_IN_PED_STATE(psLamar, PED_STATE_SITTING_IN_VEHICLE)
IF NOT IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex)
AND NOT IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex)
AND NOT IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF HAS_TIME_PASSED(5000, psLamar.iTimer)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM07", CONV_PRIORITY_MEDIUM)
IF NOT IS_PED_INJURED(psLamar.PedIndex)
TASK_LOOK_AT_ENTITY(psLamar.PedIndex, PLAYER_PED_ID(), 2000, SLF_WHILE_NOT_IN_FOV)
ENDIF
psLamar.iTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bFilmCrewAttacked = TRUE )
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_COM08F")
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_COM08T")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM08F", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_COM08F", TRUE)
ENDIF
BREAK
CASE CHAR_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM08T", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_COM08T", TRUE)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
IF ( psFilmCrew[FCP_CLAY].eCleanupReason <> PED_CLEANUP_NO_CLEANUP )
IF ( psFilmCrew[FCP_CLAY].bCleanupConversationTriggered = FALSE )
SWITCH psFilmCrew[FCP_CLAY].eCleanupReason
CASE PED_CLEANUP_KILLED_BY_PLAYER_AS_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM09F", CONV_PRIORITY_MEDIUM)
psFilmCrew[FCP_CLAY].bCleanupConversationTriggered = TRUE
ENDIF
BREAK
CASE PED_CLEANUP_KILLED_BY_PLAYER_AS_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM09F", CONV_PRIORITY_MEDIUM) //uses the same root here
psFilmCrew[FCP_CLAY].bCleanupConversationTriggered = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_FILM_CREW_PEDS_BEFORE_JACK(INT &iProgress)
SWITCH iProgress
CASE 0
IF ( Events[EVENT_COPS_ARRIVE] = TRUE )
OR ( Events[EVENT_PLAYER_ENTERED_RIVER_ENTRANCE_LOCATE] = TRUE )
OR IS_ANY_PED_IN_ANGLED_AREA_LOCATE(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), psLamar.PedIndex,
<<-52.439522,-1860.438843,23.112972>>, <<-38.097290,-1843.122192,29.922827>>, 84.0)
g_bFranklin1GirlFled = FALSE
iProgress++
ENDIF
BREAK
CASE 1 //create 1st speedophile
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsSpeedophiles[SPEEDOPHILE_1], FALSE, FALSE, NO_CHARACTER, TRUE, -1, 46, 46, 0, 0 #IF IS_DEBUG_BUILD, "SPEEDOPHILE_1" #ENDIF)
SET_VEHICLE_ENGINE_ON(vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, FALSE, TRUE)
SET_VEHICLE_RADIO_ENABLED(vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, FALSE)
SET_BOAT_ANCHOR(vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, TRUE)
SETTIMERA(0)
iProgress++
ENDIF
BREAK
CASE 2
IF TIMERA() > 100
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsSpeedophiles[SPEEDOPHILE_2], FALSE, FALSE, NO_CHARACTER, TRUE, -1, 51, 51, 0, 0 #IF IS_DEBUG_BUILD, "SPEEDOPHILE_2" #ENDIF)
SET_VEHICLE_ENGINE_ON(vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex, FALSE, TRUE)
SET_VEHICLE_RADIO_ENABLED(vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex, FALSE)
SET_BOAT_ANCHOR(vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex, TRUE)
SETTIMERA(0)
iProgress++
ENDIF
ENDIF
BREAK
CASE 3
IF TIMERA() > 100
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsSpeedophiles[SPEEDOPHILE_3], FALSE, FALSE, NO_CHARACTER, TRUE, -1, 82, 82, 0, 0 #IF IS_DEBUG_BUILD, "SPEEDOPHILE_3" #ENDIF)
SET_VEHICLE_ENGINE_ON(vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex, FALSE, TRUE)
SET_VEHICLE_RADIO_ENABLED(vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex, FALSE)
SET_BOAT_ANCHOR(vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex, TRUE)
FailFlags[MISSION_FAIL_SPEEDOPHILE_DEAD] = TRUE
FailFlags[MISSION_FAIL_SPEEDOPHILE_UNDRIVABLE] = TRUE
iProgress++
ENDIF
ENDIF
BREAK
CASE 4 //create film crew
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex)
REQUEST_MODEL(psFilmCrew[FCP_CLAY].ModelName) //request clay ped model
REQUEST_MODEL(psFilmCrew[FCP_CAMERAMAN].ModelName) //request grip ped model
REQUEST_MODEL(psFilmCrew[FCP_JACKEDGIRL].ModelName) //request beach girl ped model
REQUEST_MODEL(osLight.ModelName)
REQUEST_MODEL(osCamera.ModelName)
REQUEST_MODEL(osBoombox.ModelName)
REQUEST_MODEL(osMicrophone.ModelName)
IF HAS_MODEL_LOADED(osLight.ModelName)
AND HAS_MODEL_LOADED(osCamera.ModelName)
AND HAS_MODEL_LOADED(osBoombox.ModelName)
AND HAS_MODEL_LOADED(osMicrophone.ModelName)
AND HAS_MODEL_LOADED(psFilmCrew[FCP_CLAY].ModelName)
AND HAS_MODEL_LOADED(psFilmCrew[FCP_CAMERAMAN].ModelName)
AND HAS_MODEL_LOADED(psFilmCrew[FCP_JACKEDGIRL].ModelName)
IF HAS_MISSION_PED_BEEN_CREATED(psFilmCrew[FCP_JACKEDGIRL], FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE, FALSE, vsSpeedophiles[0].VehicleIndex)
IF HAS_MISSION_PED_BEEN_CREATED(psFilmCrew[FCP_GIRL], FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE, FALSE, vsSpeedophiles[1].VehicleIndex)
IF HAS_MISSION_PED_BEEN_CREATED(psFilmCrew[FCP_CLAY], FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE)
IF HAS_MISSION_PED_BEEN_CREATED(psFilmCrew[FCP_CAMERAMAN], FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE)
IF HAS_MISSION_PED_BEEN_CREATED(psFilmCrew[FCP_BOOMMAN], FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE)
IF HAS_MISSION_OBJECT_BEEN_CREATED(osLight)
AND HAS_MISSION_OBJECT_BEEN_CREATED(osCamera)
AND HAS_MISSION_OBJECT_BEEN_CREATED(osBoombox)
AND HAS_MISSION_OBJECT_BEEN_CREATED(osMicrophone)
IF NOT IS_PED_INJURED(psFilmCrew[FCP_CLAY].PedIndex)
SET_ENTITY_LOD_DIST(psFilmCrew[FCP_CLAY].PedIndex, 100)
SET_PED_LOD_MULTIPLIER(psFilmCrew[FCP_CLAY].PedIndex, 5.0)
ENDIF
IF NOT IS_PED_INJURED(psFilmCrew[FCP_CAMERAMAN].PedIndex)
SET_ENTITY_LOD_DIST(psFilmCrew[FCP_CAMERAMAN].PedIndex, 100)
SET_PED_LOD_MULTIPLIER(psFilmCrew[FCP_CAMERAMAN].PedIndex, 5.0)
ENDIF
IF NOT IS_PED_INJURED(psFilmCrew[FCP_BOOMMAN].PedIndex)
SET_ENTITY_LOD_DIST(psFilmCrew[FCP_BOOMMAN].PedIndex, 100)
SET_PED_LOD_MULTIPLIER(psFilmCrew[FCP_BOOMMAN].PedIndex, 5.0)
ENDIF
IF NOT IS_PED_INJURED(psFilmCrew[FCP_GIRL].PedIndex)
SET_ENTITY_LOD_DIST(psFilmCrew[FCP_GIRL].PedIndex, 100)
SET_PED_LOD_MULTIPLIER(psFilmCrew[FCP_GIRL].PedIndex, 5.0)
//fix for B*1809004, disable writhe as the ped can end up attached to vehicle they died on while in writhe
SET_PED_DIES_WHEN_INJURED(psFilmCrew[FCP_GIRL].PedIndex, TRUE)
SET_PED_CONFIG_FLAG(psFilmCrew[FCP_GIRL].PedIndex, PCF_DisableGoToWritheWhenInjured, TRUE)
ENDIF
IF NOT IS_PED_INJURED(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
SET_ENTITY_LOD_DIST(psFilmCrew[FCP_JACKEDGIRL].PedIndex, 100)
SET_PED_LOD_MULTIPLIER(psFilmCrew[FCP_JACKEDGIRL].PedIndex, 5.0)
//fix for B*1809004, disable writhe as the ped can end up attached to vehicle they died on while in writhe
SET_PED_DIES_WHEN_INJURED(psFilmCrew[FCP_JACKEDGIRL].PedIndex, TRUE)
SET_PED_CONFIG_FLAG(psFilmCrew[FCP_JACKEDGIRL].PedIndex, PCF_DisableGoToWritheWhenInjured, TRUE)
ENDIF
IF NOT IS_PED_INJURED(psFilmCrew[FCP_CAMERAMAN].PedIndex)
IF DOES_ENTITY_EXIST(osCamera.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osCamera.ObjectIndex)
IF NOT IS_ENTITY_ATTACHED(osCamera.ObjectIndex)
SET_ENTITY_INVINCIBLE(osCamera.ObjectIndex, TRUE)
ATTACH_ENTITY_TO_ENTITY(osCamera.ObjectIndex, psFilmCrew[FCP_CAMERAMAN].PedIndex,
GET_PED_BONE_INDEX(psFilmCrew[FCP_CAMERAMAN].PedIndex, BONETAG_PH_R_HAND),
<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_PED_INJURED(psFilmCrew[FCP_BOOMMAN].PedIndex)
IF DOES_ENTITY_EXIST(osMicrophone.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osMicrophone.ObjectIndex)
IF NOT IS_ENTITY_ATTACHED(osMicrophone.ObjectIndex)
SET_ENTITY_INVINCIBLE(osMicrophone.ObjectIndex, TRUE)
ATTACH_ENTITY_TO_ENTITY(osMicrophone.ObjectIndex, psFilmCrew[FCP_BOOMMAN].PedIndex,
GET_PED_BONE_INDEX(psFilmCrew[FCP_BOOMMAN].PedIndex, BONETAG_PH_R_HAND),
<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
ENDIF
ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD //give debug names to peds
psFilmCrew[FCP_GIRL].sDebugName = "FCP_GIRL"
psFilmCrew[FCP_CLAY].sDebugName = "FCP_CLAY"
psFilmCrew[FCP_JACKEDGIRL].sDebugName = "FCP_JACKEDGIRL"
psFilmCrew[FCP_CAMERAMAN].sDebugName = "FCP_CAMERAMAN"
psFilmCrew[FCP_BOOMMAN].sDebugName = "FCP_BOOMMAN"
#ENDIF
IF DOES_ENTITY_EXIST(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
IF NOT IS_ENTITY_DEAD(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_JACKEDGIRL].PedIndex, PED_COMP_HEAD, 1, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_JACKEDGIRL].PedIndex, PED_COMP_HAIR, 1, 1, 0) //(hair)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_JACKEDGIRL].PedIndex, PED_COMP_TORSO, 0, 5, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_JACKEDGIRL].PedIndex, PED_COMP_LEG, 0, 5, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_JACKEDGIRL].PedIndex, PED_COMP_SPECIAL, 1, 0, 0) //(accs)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psFilmCrew[FCP_GIRL].PedIndex)
IF NOT IS_ENTITY_DEAD(psFilmCrew[FCP_GIRL].PedIndex)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GIRL].PedIndex, PED_COMP_HEAD, 0, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GIRL].PedIndex, PED_COMP_HAIR, 2, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GIRL].PedIndex, PED_COMP_TORSO, 0, 2, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GIRL].PedIndex, PED_COMP_LEG, 0, 2, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GIRL].PedIndex, PED_COMP_SPECIAL, 1, 0, 0) //(accs)
ENDIF
ENDIF
iProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 5
REQUEST_ANIM_DICT("missfra1")
REQUEST_ANIM_DICT("missfra1mcs_2_crew_react")
IF HAS_ANIM_DICT_LOADED("missfra1")
AND HAS_ANIM_DICT_LOADED("missfra1mcs_2_crew_react")
AND REQUEST_SCRIPT_AUDIO_BANK("SCRIPT\\FRANKLIN_1_CAMERAS")
AND REQUEST_SCRIPT_AUDIO_BANK("SCRIPT\\FRANKLIN_1_GIRLS")
IF NOT IS_PED_INJURED(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
PLAY_SOUND_FROM_ENTITY(iPhotoShootSoundID, "FRANKLIN_1_PHOTO_SHOOT", psFilmCrew[FCP_JACKEDGIRL].PedIndex)
ENDIF
GO_TO_PED_STATE(psFilmCrew[FCP_JACKEDGIRL], PED_STATE_PLAYING_BEGIN_ANIM)
GO_TO_PED_STATE(psFilmCrew[FCP_GIRL], PED_STATE_PLAYING_BEGIN_ANIM)
GO_TO_PED_STATE(psFilmCrew[FCP_CLAY], PED_STATE_PLAYING_BEGIN_ANIM)
GO_TO_PED_STATE(psFilmCrew[FCP_CAMERAMAN], PED_STATE_PLAYING_BEGIN_ANIM)
GO_TO_PED_STATE(psFilmCrew[FCP_BOOMMAN], PED_STATE_PLAYING_BEGIN_ANIM)
iProgress++
ENDIF
BREAK
CASE 6 //update ped tasks
IF DOES_ENTITY_EXIST(psFilmCrew[FCP_CLAY].PedIndex)
IF NOT IS_ENTITY_DEAD(psFilmCrew[FCP_CLAY].PedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psFilmCrew[FCP_CLAY].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(psFilmCrew[FCP_CLAY].eState), 1.25)
ENDIF
#ENDIF
psFilmCrew[FCP_CLAY].fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(psFilmCrew[FCP_CLAY].PedIndex, PLAYER_PED_ID())
IF ( bFilmCrewAttacked = FALSE )
IF HAS_PED_BEEN_DAMAGED_OR_SHOT_AT(psFilmCrew[FCP_CLAY].PedIndex)
bFilmCrewAttacked = TRUE
ENDIF
ENDIF
IF NOT IS_PED_IN_PED_STATE(psFilmCrew[FCP_CLAY], PED_STATE_FLEEING)
IF IS_FILMCREW_SCARED()
GO_TO_PED_STATE(psFilmCrew[FCP_CLAY], PED_STATE_FLEEING)
ENDIF
ENDIF
SWITCH psFilmCrew[FCP_CLAY].eState
CASE PED_STATE_PLAYING_BEGIN_ANIM
IF ( psFilmCrew[FCP_CLAY].bHasTask = FALSE )
WARP_PED(psFilmCrew[FCP_CLAY].PedIndex, <<-119.6947, -1863.9877, 0.4591>>, 62.9280, FALSE, FALSE, FALSE)
TASK_PLAY_ANIM(psFilmCrew[FCP_CLAY].PedIndex, "missfra1", "fra_1_mcs_2_clayidle",
INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
psFilmCrew[FCP_CLAY].bHasTask = TRUE
ENDIF
IF ( psLamar.eState = PED_STATE_RUNNING_TO_VEHICLE)
GO_TO_PED_STATE(psFilmCrew[FCP_CLAY], PED_STATE_PLAYING_REACTION_ANIM)
ENDIF
BREAK
CASE PED_STATE_PLAYING_REACTION_ANIM
IF ( psFilmCrew[FCP_CLAY].bHasTask = FALSE )
SEQUENCE_INDEX SequenceIndex
CLEAR_PED_TASKS(psFilmCrew[FCP_CLAY].PedIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, psLamar.PedIndex)
TASK_LOOK_AT_ENTITY(NULL, psLamar.PedIndex, 100, SLF_USE_TORSO)
TASK_CLEAR_LOOK_AT(NULL)
TASK_PLAY_ANIM(NULL, "missfra1mcs_2_crew_react", "handsup_standing_base", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(psFilmCrew[FCP_CLAY].PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
psFilmCrew[FCP_CLAY].bHasTask = TRUE
ENDIF
PLAY_PAIN(psFilmCrew[FCP_CLAY].PedIndex, AUD_DAMAGE_REASON_SCREAM_SCARED)
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_CLIP3")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF IS_PED_IN_THIS_VEHICLE(psLamar.PedIndex, vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, TRUE)
OR IS_PED_IN_THIS_VEHICLE(psLamar.PedIndex, vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex, TRUE)
OR IS_PED_IN_THIS_VEHICLE(psLamar.PedIndex, vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex, TRUE)
OR IS_PED_IN_THIS_VEHICLE(GET_PED_INDEX(CHAR_TREVOR), vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, TRUE)
OR IS_PED_IN_THIS_VEHICLE(GET_PED_INDEX(CHAR_TREVOR), vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex, TRUE)
OR IS_PED_IN_THIS_VEHICLE(GET_PED_INDEX(CHAR_TREVOR), vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex, TRUE)
OR IS_PED_IN_THIS_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, TRUE)
OR IS_PED_IN_THIS_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex, TRUE)
OR IS_PED_IN_THIS_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex, TRUE)
ADD_PED_FOR_DIALOGUE(sFranklin1Conversation, 7, psFilmCrew[FCP_CLAY].PedIndex, "MCCLIP")
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_CLIP3", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_CLIP3", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_FLEEING
IF ( psFilmCrew[FCP_CLAY].bHasTask = FALSE )
CLEAR_PED_TASKS(psFilmCrew[FCP_CLAY].PedIndex)
TASK_SMART_FLEE_COORD(psFilmCrew[FCP_CLAY].PedIndex, vFilmCrewBeginAnimPosition, 300.0, INFINITE_TASK_TIME)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_CLAY].PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_CLAY].PedIndex, FA_DISABLE_HANDS_UP, TRUE)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_CLAY].PedIndex, FA_USE_VEHICLE, FALSE)
psFilmCrew[FCP_CLAY].bHasTask = TRUE
ENDIF
IF ( psFilmCrew[FCP_CLAY].bHasTask = TRUE )
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_CLIP2")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
ADD_PED_FOR_DIALOGUE(sFranklin1Conversation, 7, psFilmCrew[FCP_CLAY].PedIndex, "MCCLIP")
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_CLIP2", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_CLIP2", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF ( psFilmCrew[FCP_CLAY].fDistanceToTargetPed > 125 )
CLEANUP_PED(psFilmCrew[FCP_CLAY], FALSE, FALSE, TRUE)
ENDIF
BREAK
ENDSWITCH
ELSE
IF ( psFilmCrew[FCP_CLAY].eCleanupReason = PED_CLEANUP_NO_CLEANUP )
psFilmCrew[FCP_CLAY].eCleanupReason = GET_PED_CLEANUP_REASON(psFilmCrew[FCP_CLAY].PedIndex #IF IS_DEBUG_BUILD, psFilmCrew[FCP_CLAY].sDebugName #ENDIF)
IF NOT IS_REPEAT_PLAY_ACTIVE()
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_MISSION_FRANK1_MC_CLIPPED, TRUE)
ENDIF
bFilmCrewAttacked = TRUE
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
IF NOT IS_ENTITY_DEAD(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psFilmCrew[FCP_JACKEDGIRL].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(psFilmCrew[FCP_JACKEDGIRL].eState), 1.25)
ENDIF
#ENDIF
psFilmCrew[FCP_JACKEDGIRL].fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(psFilmCrew[FCP_JACKEDGIRL].PedIndex, PLAYER_PED_ID())
IF ( bFilmCrewAttacked = FALSE )
IF HAS_PED_BEEN_DAMAGED_OR_SHOT_AT(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
bFilmCrewAttacked = TRUE
ENDIF
ENDIF
IF NOT IS_PED_IN_PED_STATE(psFilmCrew[FCP_JACKEDGIRL], PED_STATE_FLEEING)
IF ( bFilmCrewAttacked = TRUE )
GO_TO_PED_STATE(psFilmCrew[FCP_JACKEDGIRL], PED_STATE_FLEEING)
ENDIF
ENDIF
SWITCH psFilmCrew[FCP_JACKEDGIRL].eState
CASE PED_STATE_PLAYING_BEGIN_ANIM
IF ( psFilmCrew[FCP_JACKEDGIRL].bHasTask = FALSE )
TASK_PLAY_ANIM(psFilmCrew[FCP_JACKEDGIRL].PedIndex, "missfra1mcs_2_crew_react", "mcs2_f_jetski_idle01",
INSTANT_BLEND_IN, WALK_BLEND_OUT, -1, AF_LOOPING, 0, FALSE, AIK_DISABLE_ARM_IK)
psFilmCrew[FCP_JACKEDGIRL].bHasTask = TRUE
ENDIF
IF ( psLamar.eState = PED_STATE_RUNNING_TO_VEHICLE)
GO_TO_PED_STATE(psFilmCrew[FCP_JACKEDGIRL], PED_STATE_PLAYING_REACTION_ANIM)
ENDIF
BREAK
CASE PED_STATE_PLAYING_REACTION_ANIM
IF ( psFilmCrew[FCP_JACKEDGIRL].bHasTask = FALSE )
ADD_PED_FOR_DIALOGUE(sFranklin1Conversation, 4, psFilmCrew[FCP_JACKEDGIRL].PedIndex, "FRA1MODEL1")
CLEAR_PED_TASKS(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_PAUSE(NULL, 750)
TASK_SHUFFLE_TO_NEXT_VEHICLE_SEAT(NULL, vsSpeedophiles[0].VehicleIndex)
TASK_PLAY_ANIM(NULL, "missfra1mcs_2_crew_react", "handsup_standing_base", WALK_BLEND_IN, WALK_BLEND_OUT,
-1, AF_UPPERBODY | AF_LOOPING, 0, FALSE, AIK_DISABLE_ARM_IK)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(psFilmCrew[FCP_JACKEDGIRL].PedIndex, SequenceIndex)
TASK_LOOK_AT_ENTITY(psFilmCrew[FCP_JACKEDGIRL].PedIndex, PLAYER_PED_ID(), INFINITE_TASK_TIME, SLF_WHILE_NOT_IN_FOV)
CLEAR_SEQUENCE_TASK(SequenceIndex)
STOP_SOUND(iPhotoShootSoundID)
PLAY_PAIN(psFilmCrew[FCP_JACKEDGIRL].PedIndex, AUD_DAMAGE_REASON_SCREAM_TERROR)
psFilmCrew[FCP_JACKEDGIRL].bHasTask = TRUE
ENDIF
IF IS_PED_SITTING_IN_VEHICLE(psFilmCrew[FCP_JACKEDGIRL].PedIndex, vsSpeedophiles[0].VehicleIndex)
IF IS_PED_SITTING_IN_VEHICLE_SEAT(psFilmCrew[FCP_JACKEDGIRL].PedIndex, vsSpeedophiles[0].VehicleIndex, VS_FRONT_RIGHT)
IF GET_VEHICLE_PED_IS_ENTERING(GET_PED_INDEX(CHAR_TREVOR)) = vsSpeedophiles[0].VehicleIndex
OR GET_VEHICLE_PED_IS_ENTERING(GET_PED_INDEX(CHAR_FRANKLIN)) = vsSpeedophiles[0].VehicleIndex
GO_TO_PED_STATE(psFilmCrew[FCP_JACKEDGIRL], PED_STATE_SITTING_IN_VEHICLE)
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_SITTING_IN_VEHICLE
IF ( psFilmCrew[FCP_JACKEDGIRL].bHasTask = FALSE )
CLEAR_PED_TASKS(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
psFilmCrew[FCP_JACKEDGIRL].bHasTask = TRUE
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_GIRLJ")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_GIRLJ", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_GIRLJ", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_FLEEING
IF ( psFilmCrew[FCP_JACKEDGIRL].bHasTask = FALSE )
CLEAR_PED_TASKS(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
SET_PED_DIES_IN_WATER(psFilmCrew[FCP_JACKEDGIRL].PedIndex, FALSE)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_JACKEDGIRL].PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_JACKEDGIRL].PedIndex, FA_DISABLE_HANDS_UP, TRUE)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_JACKEDGIRL].PedIndex, FA_USE_VEHICLE, FALSE)
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
IF IS_PED_IN_ANY_VEHICLE(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
TASK_LEAVE_ANY_VEHICLE(NULL, GET_RANDOM_INT_IN_RANGE(250, 501), ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP)
ENDIF
TASK_SMART_FLEE_COORD(NULL, vFilmCrewBeginAnimPosition, 300.0, INFINITE_TASK_TIME)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(psFilmCrew[FCP_JACKEDGIRL].PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
STOP_SOUND(iPhotoShootSoundID)
PLAY_PAIN(psFilmCrew[FCP_JACKEDGIRL].PedIndex, AUD_DAMAGE_REASON_SCREAM_SCARED)
g_bFranklin1GirlFled = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting g_bFranklin1GirlFled to TRUE.")
#ENDIF
psFilmCrew[FCP_JACKEDGIRL].bHasTask = TRUE
ENDIF
IF ( psFilmCrew[FCP_JACKEDGIRL].fDistanceToTargetPed > 125 )
CLEANUP_PED(psFilmCrew[FCP_JACKEDGIRL], FALSE, FALSE, TRUE)
ENDIF
BREAK
ENDSWITCH
ELSE
IF ( psFilmCrew[FCP_JACKEDGIRL].eCleanupReason = PED_CLEANUP_NO_CLEANUP )
psFilmCrew[FCP_JACKEDGIRL].eCleanupReason = GET_PED_CLEANUP_REASON(psFilmCrew[FCP_JACKEDGIRL].PedIndex #IF IS_DEBUG_BUILD, psFilmCrew[FCP_JACKEDGIRL].sDebugName #ENDIF)
bFilmCrewAttacked = TRUE
g_bFranklin1GirlFled = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting g_bFranklin1GirlFled to TRUE.")
#ENDIF
STOP_SOUND(iPhotoShootSoundID)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psFilmCrew[FCP_GIRL].PedIndex)
IF NOT IS_ENTITY_DEAD(psFilmCrew[FCP_GIRL].PedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psFilmCrew[FCP_GIRL].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(psFilmCrew[FCP_GIRL].eState), 1.25)
ENDIF
#ENDIF
psFilmCrew[FCP_GIRL].fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(psFilmCrew[FCP_GIRL].PedIndex, PLAYER_PED_ID())
IF ( bFilmCrewAttacked = FALSE )
IF HAS_PED_BEEN_DAMAGED_OR_SHOT_AT(psFilmCrew[FCP_GIRL].PedIndex)
bFilmCrewAttacked = TRUE
ENDIF
ENDIF
IF NOT IS_PED_IN_PED_STATE(psFilmCrew[FCP_GIRL], PED_STATE_FLEEING)
IF IS_FILMCREW_SCARED()
GO_TO_PED_STATE(psFilmCrew[FCP_GIRL], PED_STATE_FLEEING)
ENDIF
ENDIF
SWITCH psFilmCrew[FCP_GIRL].eState
CASE PED_STATE_PLAYING_BEGIN_ANIM
IF ( psFilmCrew[FCP_GIRL].bHasTask = FALSE )
TASK_PLAY_ANIM(psFilmCrew[FCP_GIRL].PedIndex, "missfra1mcs_2_crew_react", "mcs2_f_jetski_idle02",
INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
psFilmCrew[FCP_GIRL].bHasTask = TRUE
ENDIF
IF ( psLamar.eState = PED_STATE_RUNNING_TO_VEHICLE)
GO_TO_PED_STATE(psFilmCrew[FCP_GIRL], PED_STATE_PLAYING_REACTION_ANIM)
ENDIF
BREAK
CASE PED_STATE_PLAYING_REACTION_ANIM
IF ( psFilmCrew[FCP_GIRL].bHasTask = FALSE )
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
IF IS_PED_IN_ANY_VEHICLE(psFilmCrew[FCP_GIRL].PedIndex)
TASK_LEAVE_ANY_VEHICLE(NULL, GET_RANDOM_INT_IN_RANGE(0, 251))
ENDIF
TASK_TURN_PED_TO_FACE_ENTITY(NULL, psLamar.PedIndex)
TASK_LOOK_AT_ENTITY(NULL, psLamar.PedIndex, 100, SLF_USE_TORSO)
TASK_CLEAR_LOOK_AT(NULL)
TASK_PLAY_ANIM(NULL, "missfra1mcs_2_crew_react", "handsup_standing_base",
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
TASK_LOOK_AT_ENTITY(NULL, PLAYER_PED_ID(), INFINITE_TASK_TIME)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(psFilmCrew[FCP_GIRL].PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
STOP_SOUND(iPhotoShootSoundID)
PLAY_PAIN(psFilmCrew[FCP_GIRL].PedIndex, AUD_DAMAGE_REASON_SCREAM_SCARED)
psFilmCrew[FCP_GIRL].iTimer = GET_GAME_TIMER()
psFilmCrew[FCP_GIRL].bHasTask = TRUE
ENDIF
IF HAS_TIME_PASSED(4000, psFilmCrew[FCP_GIRL].iTimer)
GO_TO_PED_STATE(psFilmCrew[FCP_GIRL], PED_STATE_FLEEING)
ENDIF
BREAK
CASE PED_STATE_FLEEING
IF ( psFilmCrew[FCP_GIRL].bHasTask = FALSE )
CLEAR_PED_TASKS(psFilmCrew[FCP_GIRL].PedIndex)
SET_PED_DIES_IN_WATER(psFilmCrew[FCP_GIRL].PedIndex, FALSE)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_GIRL].PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_GIRL].PedIndex, FA_DISABLE_HANDS_UP, TRUE)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_GIRL].PedIndex, FA_USE_VEHICLE, FALSE)
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
IF IS_PED_IN_ANY_VEHICLE(psFilmCrew[FCP_GIRL].PedIndex)
TASK_LEAVE_ANY_VEHICLE(NULL)
ENDIF
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -164.81, -1837.12, -0.45 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_SMART_FLEE_COORD(NULL, vFilmCrewBeginAnimPosition, 300.0, INFINITE_TASK_TIME)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(psFilmCrew[FCP_GIRL].PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
PLAY_PAIN(psFilmCrew[FCP_GIRL].PedIndex, AUD_DAMAGE_REASON_SCREAM_TERROR)
psFilmCrew[FCP_GIRL].bHasTask = TRUE
ENDIF
IF ( psFilmCrew[FCP_GIRL].fDistanceToTargetPed > 125 )
CLEANUP_PED(psFilmCrew[FCP_GIRL], FALSE, FALSE, TRUE)
ENDIF
BREAK
ENDSWITCH
ELSE
IF ( psFilmCrew[FCP_GIRL].eCleanupReason = PED_CLEANUP_NO_CLEANUP )
psFilmCrew[FCP_GIRL].eCleanupReason = GET_PED_CLEANUP_REASON(psFilmCrew[FCP_GIRL].PedIndex #IF IS_DEBUG_BUILD, psFilmCrew[FCP_GIRL].sDebugName #ENDIF)
bFilmCrewAttacked = TRUE
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psFilmCrew[FCP_CAMERAMAN].PedIndex)
IF NOT IS_ENTITY_DEAD(psFilmCrew[FCP_CAMERAMAN].PedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psFilmCrew[FCP_CAMERAMAN].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(psFilmCrew[FCP_CAMERAMAN].eState), 1.25)
ENDIF
#ENDIF
psFilmCrew[FCP_CAMERAMAN].fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(psFilmCrew[FCP_CAMERAMAN].PedIndex, PLAYER_PED_ID())
IF ( bFilmCrewAttacked = FALSE )
IF HAS_PED_BEEN_DAMAGED_OR_SHOT_AT(psFilmCrew[FCP_CAMERAMAN].PedIndex)
bFilmCrewAttacked = TRUE
ENDIF
ENDIF
IF ( psFilmCrew[FCP_CAMERAMAN].eState <> PED_STATE_FLEEING )
IF IS_FILMCREW_SCARED()
GO_TO_PED_STATE(psFilmCrew[FCP_CAMERAMAN], PED_STATE_FLEEING)
ENDIF
ENDIF
SWITCH psFilmCrew[FCP_CAMERAMAN].eState
CASE PED_STATE_PLAYING_BEGIN_ANIM
IF ( psFilmCrew[FCP_CAMERAMAN].bHasTask = FALSE )
TASK_PLAY_ANIM_ADVANCED(psFilmCrew[FCP_CAMERAMAN].PedIndex, "missfra1", "mcs2_crew_idle_m_camera",
vFilmCrewBeginAnimPosition, vFilmCrewBeginAnimRotation,
INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET)
psFilmCrew[FCP_CAMERAMAN].bHasTask = TRUE
ENDIF
IF ( psLamar.eState = PED_STATE_RUNNING_TO_VEHICLE)
GO_TO_PED_STATE(psFilmCrew[FCP_CAMERAMAN], PED_STATE_PLAYING_REACTION_ANIM)
ENDIF
BREAK
CASE PED_STATE_PLAYING_REACTION_ANIM
IF ( psFilmCrew[FCP_CAMERAMAN].bHasTask = FALSE )
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_PLAY_ANIM(NULL, "missfra1mcs_2_crew_react", "intro_m_camera", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1)
TASK_PLAY_ANIM(NULL, "missfra1mcs_2_crew_react", "idle_m_camera", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
TASK_LOOK_AT_ENTITY(NULL, PLAYER_PED_ID(), INFINITE_TASK_TIME)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(psFilmCrew[FCP_CAMERAMAN].PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
psFilmCrew[FCP_CAMERAMAN].iTimer = 750
psFilmCrew[FCP_CAMERAMAN].iPedConversationTimer = GET_GAME_TIMER()
psFilmCrew[FCP_CAMERAMAN].bHasTask = TRUE
ENDIF
//detach camera prop
IF DOES_ENTITY_EXIST(osCamera.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osCamera.ObjectIndex)
IF IS_ENTITY_ATTACHED(osCamera.ObjectIndex)
IF IS_ENTITY_PLAYING_ANIM(psFilmCrew[FCP_CAMERAMAN].PedIndex, "missfra1mcs_2_crew_react", "intro_m_camera")
IF GET_ENTITY_ANIM_CURRENT_TIME(psFilmCrew[FCP_CAMERAMAN].PedIndex, "missfra1mcs_2_crew_react", "intro_m_camera") > 0.5575
DETACH_ENTITY(osCamera.ObjectIndex, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_TIME_PASSED(psFilmCrew[FCP_CAMERAMAN].iTimer, psFilmCrew[FCP_CAMERAMAN].iPedConversationTimer)
SWITCH GET_RANDOM_INT_IN_RANGE(0, 4)
CASE 0
PLAY_PED_AMBIENT_SPEECH(psFilmCrew[FCP_CAMERAMAN].PedIndex, "GENERIC_SHOCKED_MED", SPEECH_PARAMS_FORCE)
psFilmCrew[FCP_CAMERAMAN].iTimer = 5250
psFilmCrew[FCP_CAMERAMAN].iPedConversationTimer = GET_GAME_TIMER()
BREAK
CASE 1
PLAY_PED_AMBIENT_SPEECH(psFilmCrew[FCP_CAMERAMAN].PedIndex, "GENERIC_SHOCKED_HIGH", SPEECH_PARAMS_FORCE)
psFilmCrew[FCP_CAMERAMAN].iTimer = 5250
psFilmCrew[FCP_CAMERAMAN].iPedConversationTimer = GET_GAME_TIMER()
BREAK
CASE 2
PLAY_PED_AMBIENT_SPEECH(psFilmCrew[FCP_CAMERAMAN].PedIndex, "GENERIC_FRIGHTENED_MED", SPEECH_PARAMS_FORCE)
psFilmCrew[FCP_CAMERAMAN].iTimer = 5250
psFilmCrew[FCP_CAMERAMAN].iPedConversationTimer = GET_GAME_TIMER()
BREAK
CASE 3
PLAY_PED_AMBIENT_SPEECH(psFilmCrew[FCP_CAMERAMAN].PedIndex, "GENERIC_FRIGHTENED_HIGH", SPEECH_PARAMS_FORCE)
psFilmCrew[FCP_CAMERAMAN].iTimer = 5250
psFilmCrew[FCP_CAMERAMAN].iPedConversationTimer = GET_GAME_TIMER()
BREAK
CASE 4
PLAY_PED_AMBIENT_SPEECH(psFilmCrew[FCP_CAMERAMAN].PedIndex, "JACKED_GENERIC", SPEECH_PARAMS_FORCE)
psFilmCrew[FCP_CAMERAMAN].iTimer = 5250
psFilmCrew[FCP_CAMERAMAN].iPedConversationTimer = GET_GAME_TIMER()
BREAK
ENDSWITCH
ENDIF
BREAK
CASE PED_STATE_FLEEING
IF ( psFilmCrew[FCP_CAMERAMAN].bHasTask = FALSE )
CLEAR_PED_TASKS(psFilmCrew[FCP_CAMERAMAN].PedIndex)
IF DOES_ENTITY_EXIST(osCamera.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osCamera.ObjectIndex)
IF IS_ENTITY_ATTACHED(osCamera.ObjectIndex)
DETACH_ENTITY(osCamera.ObjectIndex, FALSE)
ENDIF
ENDIF
ENDIF
TASK_SMART_FLEE_COORD(psFilmCrew[FCP_CAMERAMAN].PedIndex, vFilmCrewBeginAnimPosition, 300.0, INFINITE_TASK_TIME)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_CAMERAMAN].PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_CAMERAMAN].PedIndex, FA_DISABLE_HANDS_UP, TRUE)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_CAMERAMAN].PedIndex, FA_USE_VEHICLE, FALSE)
psFilmCrew[FCP_CAMERAMAN].bHasTask = TRUE
ENDIF
IF ( psFilmCrew[FCP_CAMERAMAN].fDistanceToTargetPed > 125 )
CLEANUP_PED(psFilmCrew[FCP_CAMERAMAN], FALSE, FALSE, TRUE)
ENDIF
BREAK
ENDSWITCH
ELSE
IF ( psFilmCrew[FCP_CAMERAMAN].eCleanupReason = PED_CLEANUP_NO_CLEANUP )
psFilmCrew[FCP_CAMERAMAN].eCleanupReason = GET_PED_CLEANUP_REASON(psFilmCrew[FCP_CAMERAMAN].PedIndex #IF IS_DEBUG_BUILD, psFilmCrew[FCP_CAMERAMAN].sDebugName #ENDIF)
bFilmCrewAttacked = TRUE
ENDIF
ENDIF
IF IS_PED_DEAD_OR_DYING(psFilmCrew[FCP_CAMERAMAN].PedIndex)
IF DOES_ENTITY_EXIST(osCamera.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osCamera.ObjectIndex)
IF IS_ENTITY_ATTACHED(osCamera.ObjectIndex)
DETACH_ENTITY(osCamera.ObjectIndex, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psFilmCrew[FCP_BOOMMAN].PedIndex)
IF NOT IS_ENTITY_DEAD(psFilmCrew[FCP_BOOMMAN].PedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psFilmCrew[FCP_BOOMMAN].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(psFilmCrew[FCP_BOOMMAN].eState), 1.25)
ENDIF
#ENDIF
psFilmCrew[FCP_BOOMMAN].fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(psFilmCrew[FCP_BOOMMAN].PedIndex, PLAYER_PED_ID())
IF ( bFilmCrewAttacked = FALSE )
IF HAS_PED_BEEN_DAMAGED_OR_SHOT_AT(psFilmCrew[FCP_BOOMMAN].PedIndex)
bFilmCrewAttacked = TRUE
ENDIF
ENDIF
IF ( psFilmCrew[FCP_BOOMMAN].eState <> PED_STATE_FLEEING )
IF IS_FILMCREW_SCARED()
GO_TO_PED_STATE(psFilmCrew[FCP_BOOMMAN], PED_STATE_FLEEING)
ENDIF
ENDIF
SWITCH psFilmCrew[FCP_BOOMMAN].eState
CASE PED_STATE_PLAYING_BEGIN_ANIM
IF ( psFilmCrew[FCP_BOOMMAN].bHasTask = FALSE )
TASK_PLAY_ANIM_ADVANCED(psFilmCrew[FCP_BOOMMAN].PedIndex, "missfra1", "mcs2_crew_idle_m_boom",
vFilmCrewBeginAnimPosition, vFilmCrewBeginAnimRotation,
INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET)
psFilmCrew[FCP_BOOMMAN].bHasTask = TRUE
ENDIF
IF ( psLamar.eState = PED_STATE_RUNNING_TO_VEHICLE)
GO_TO_PED_STATE(psFilmCrew[FCP_BOOMMAN], PED_STATE_PLAYING_REACTION_ANIM)
ENDIF
BREAK
CASE PED_STATE_PLAYING_REACTION_ANIM
IF ( psFilmCrew[FCP_BOOMMAN].bHasTask = FALSE )
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_PLAY_ANIM(NULL, "missfra1mcs_2_crew_react", "intro_m_boom", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1)
TASK_PLAY_ANIM(NULL, "missfra1mcs_2_crew_react", "idle_m_boom", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
TASK_LOOK_AT_ENTITY(NULL, PLAYER_PED_ID(), INFINITE_TASK_TIME)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(psFilmCrew[FCP_BOOMMAN].PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
psFilmCrew[FCP_BOOMMAN].iTimer = 500
psFilmCrew[FCP_BOOMMAN].iPedConversationTimer = GET_GAME_TIMER()
psFilmCrew[FCP_BOOMMAN].bHasTask = TRUE
ENDIF
IF HAS_TIME_PASSED(psFilmCrew[FCP_BOOMMAN].iTimer, psFilmCrew[FCP_BOOMMAN].iPedConversationTimer)
SWITCH GET_RANDOM_INT_IN_RANGE(0, 4)
CASE 0
PLAY_PED_AMBIENT_SPEECH(psFilmCrew[FCP_BOOMMAN].PedIndex, "GENERIC_SHOCKED_MED", SPEECH_PARAMS_FORCE)
psFilmCrew[FCP_BOOMMAN].iTimer = 7000
psFilmCrew[FCP_BOOMMAN].iPedConversationTimer = GET_GAME_TIMER()
BREAK
CASE 1
PLAY_PED_AMBIENT_SPEECH(psFilmCrew[FCP_BOOMMAN].PedIndex, "GENERIC_SHOCKED_HIGH", SPEECH_PARAMS_FORCE)
psFilmCrew[FCP_BOOMMAN].iTimer = 7000
psFilmCrew[FCP_BOOMMAN].iPedConversationTimer = GET_GAME_TIMER()
BREAK
CASE 2
PLAY_PED_AMBIENT_SPEECH(psFilmCrew[FCP_BOOMMAN].PedIndex, "GENERIC_CURSE_MED", SPEECH_PARAMS_FORCE)
psFilmCrew[FCP_BOOMMAN].iTimer = 7000
psFilmCrew[FCP_BOOMMAN].iPedConversationTimer = GET_GAME_TIMER()
BREAK
CASE 3
PLAY_PED_AMBIENT_SPEECH(psFilmCrew[FCP_BOOMMAN].PedIndex, "GENERIC_CURSE_HIGH", SPEECH_PARAMS_FORCE)
psFilmCrew[FCP_BOOMMAN].iTimer = 7000
psFilmCrew[FCP_BOOMMAN].iPedConversationTimer = GET_GAME_TIMER()
BREAK
CASE 4
PLAY_PED_AMBIENT_SPEECH(psFilmCrew[FCP_BOOMMAN].PedIndex, "JACKED_GENERIC", SPEECH_PARAMS_FORCE)
psFilmCrew[FCP_BOOMMAN].iTimer = 7000
psFilmCrew[FCP_BOOMMAN].iPedConversationTimer = GET_GAME_TIMER()
BREAK
ENDSWITCH
ENDIF
BREAK
CASE PED_STATE_FLEEING
IF ( psFilmCrew[FCP_BOOMMAN].bHasTask = FALSE )
CLEAR_PED_TASKS(psFilmCrew[FCP_BOOMMAN].PedIndex)
IF DOES_ENTITY_EXIST(osMicrophone.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osMicrophone.ObjectIndex)
IF IS_ENTITY_ATTACHED(osMicrophone.ObjectIndex)
DETACH_ENTITY(osMicrophone.ObjectIndex, FALSE)
ENDIF
ENDIF
ENDIF
TASK_SMART_FLEE_COORD(psFilmCrew[FCP_BOOMMAN].PedIndex, vFilmCrewBeginAnimPosition, 300.0, INFINITE_TASK_TIME)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_BOOMMAN].PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_BOOMMAN].PedIndex, FA_DISABLE_HANDS_UP, TRUE)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_BOOMMAN].PedIndex, FA_USE_VEHICLE, FALSE)
psFilmCrew[FCP_BOOMMAN].bHasTask = TRUE
ENDIF
IF ( psFilmCrew[FCP_BOOMMAN].fDistanceToTargetPed > 125 )
CLEANUP_PED(psFilmCrew[FCP_BOOMMAN], FALSE, FALSE, TRUE)
ENDIF
BREAK
ENDSWITCH
ELSE
IF ( psFilmCrew[FCP_BOOMMAN].eCleanupReason = PED_CLEANUP_NO_CLEANUP )
psFilmCrew[FCP_BOOMMAN].eCleanupReason = GET_PED_CLEANUP_REASON(psFilmCrew[FCP_BOOMMAN].PedIndex #IF IS_DEBUG_BUILD, psFilmCrew[FCP_BOOMMAN].sDebugName #ENDIF)
bFilmCrewAttacked = TRUE
ENDIF
ENDIF
IF IS_PED_DEAD_OR_DYING(psFilmCrew[FCP_BOOMMAN].PedIndex)
IF DOES_ENTITY_EXIST(osMicrophone.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osMicrophone.ObjectIndex)
IF IS_ENTITY_ATTACHED(osMicrophone.ObjectIndex)
DETACH_ENTITY(osMicrophone.ObjectIndex, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(osBoombox.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osBoombox.ObjectIndex)
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(osBoombox.ObjectIndex, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
SET_ENTITY_HEALTH(osBoombox.ObjectIndex, 0)
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_FILM_CREW_PEDS_AFTER_JACK()
IF DOES_ENTITY_EXIST(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
IF NOT IS_ENTITY_DEAD(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psFilmCrew[FCP_JACKEDGIRL].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(psFilmCrew[FCP_JACKEDGIRL].eState), 1.25)
ENDIF
psFilmCrew[FCP_JACKEDGIRL].sDebugName = "FCP_JACKEDGIRL"
#ENDIF
psFilmCrew[FCP_JACKEDGIRL].fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(psFilmCrew[FCP_JACKEDGIRL].PedIndex, PLAYER_PED_ID())
SWITCH psFilmCrew[FCP_JACKEDGIRL].eState
CASE PED_STATE_SITTING_IN_VEHICLE
IF ( psFilmCrew[FCP_JACKEDGIRL].bHasTask = FALSE )
SET_ENTITY_IS_TARGET_PRIORITY(psFilmCrew[FCP_JACKEDGIRL].PedIndex, FALSE)
SET_PED_DIES_IN_WATER(psFilmCrew[FCP_JACKEDGIRL].PedIndex, FALSE)
REMOVE_PED_FOR_DIALOGUE(sFranklin1Conversation, 4)
psFilmCrew[FCP_JACKEDGIRL].bHasTask = TRUE
ENDIF
IF ( bJackedGirlConversationFinished = TRUE )
GO_TO_PED_STATE(psFilmCrew[FCP_JACKEDGIRL], PED_STATE_EXITING_VEHICLE)
ENDIF
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(psFilmCrew[FCP_JACKEDGIRL].PedIndex, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
GO_TO_PED_STATE(psFilmCrew[FCP_JACKEDGIRL], PED_STATE_EXITING_VEHICLE)
ENDIF
IF DOES_ENTITY_EXIST(vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex)
PED_INDEX DriverPedIndex
DriverPedIndex = GET_PED_IN_VEHICLE_SEAT(vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, VS_DRIVER)
IF DOES_ENTITY_EXIST(DriverPedIndex) //check for seashark driver being present
AND NOT IS_ENTITY_DEAD(DriverPedIndex) //check for seashark driver leaving
IF NOT IS_PED_SITTING_IN_VEHICLE_SEAT(DriverPedIndex, vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, VS_DRIVER)
GO_TO_PED_STATE(psFilmCrew[FCP_JACKEDGIRL], PED_STATE_EXITING_VEHICLE)
ENDIF
ELSE
GO_TO_PED_STATE(psFilmCrew[FCP_JACKEDGIRL], PED_STATE_EXITING_VEHICLE)
ENDIF
IF NOT IS_PED_IN_VEHICLE(psFilmCrew[FCP_JACKEDGIRL].PedIndex, vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex)
GO_TO_PED_STATE(psFilmCrew[FCP_JACKEDGIRL], PED_STATE_EXITING_VEHICLE)
ENDIF
IF IS_PED_IN_VEHICLE(psFilmCrew[FCP_JACKEDGIRL].PedIndex, vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex)
IF ( DOES_ENTITY_EXIST(esLeftChaseEnemies[0].PedIndex) AND NOT IS_ENTITY_DEAD(esLeftChaseEnemies[0].PedIndex) AND IS_PED_SHOOTING(esLeftChaseEnemies[0].PedIndex) )
OR ( DOES_ENTITY_EXIST(esLeftChaseEnemies[1].PedIndex) AND NOT IS_ENTITY_DEAD(esLeftChaseEnemies[1].PedIndex) AND IS_PED_SHOOTING(esLeftChaseEnemies[1].PedIndex) )
PLAY_PAIN(psFilmCrew[FCP_JACKEDGIRL].PedIndex, AUD_DAMAGE_REASON_SCREAM_SCARED)
ENDIF
IF ( vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime > 37500)
GO_TO_PED_STATE(psFilmCrew[FCP_JACKEDGIRL], PED_STATE_EXITING_VEHICLE)
ENDIF
ENDIF
ELSE
GO_TO_PED_STATE(psFilmCrew[FCP_JACKEDGIRL], PED_STATE_EXITING_VEHICLE)
ENDIF
ENDIF
BREAK
CASE PED_STATE_EXITING_VEHICLE
IF ( psFilmCrew[FCP_JACKEDGIRL].bHasTask = FALSE )
IF IS_PED_IN_ANY_VEHICLE(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
IF IS_PED_STOPPED(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
TASK_LEAVE_ANY_VEHICLE(psFilmCrew[FCP_JACKEDGIRL].PedIndex, 0, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP)
ELSE
TASK_LEAVE_ANY_VEHICLE(psFilmCrew[FCP_JACKEDGIRL].PedIndex, 0, ECF_JUMP_OUT | ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP)
ENDIF
ENDIF
STOP_AUDIO_SCENE("FRANKLIN_1_JETSKI_GIRL_JUMP")
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(psFilmCrew[FCP_JACKEDGIRL].PedIndex, "SCREAM_PANIC", "WAVELOAD_PAIN_FEMALE", SPEECH_PARAMS_FORCE_FRONTEND)
iJackedGirlAmbientSpeechDelay = GET_GAME_TIMER()
psFilmCrew[FCP_JACKEDGIRL].bHasTask = TRUE
ENDIF
IF ( GET_SCRIPT_TASK_STATUS(psFilmCrew[FCP_JACKEDGIRL].PedIndex, SCRIPT_TASK_LEAVE_VEHICLE) = FINISHED_TASK )
IF NOT IS_PED_RAGDOLL(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
GO_TO_PED_STATE(psFilmCrew[FCP_JACKEDGIRL], PED_STATE_FLEEING)
ENDIF
ENDIF
BREAK
CASE PED_STATE_FLEEING
IF ( psFilmCrew[FCP_JACKEDGIRL].bHasTask = FALSE )
STOP_PED_SPEAKING(psFilmCrew[FCP_JACKEDGIRL].PedIndex, TRUE)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_JACKEDGIRL].PedIndex, FA_USE_VEHICLE, FALSE)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_JACKEDGIRL].PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_JACKEDGIRL].PedIndex, FA_DISABLE_HANDS_UP, TRUE)
TASK_SMART_FLEE_PED(psFilmCrew[FCP_JACKEDGIRL].PedIndex, GET_PED_INDEX(CHAR_TREVOR), 300, -1)
psFilmCrew[FCP_JACKEDGIRL].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
IF NOT IS_PED_IN_ANY_VEHICLE(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
IF ( psFilmCrew[FCP_JACKEDGIRL].fDistanceToTargetPed > 125 )
CLEANUP_PED(psFilmCrew[FCP_JACKEDGIRL], FALSE, FALSE, TRUE)
ENDIF
ENDIF
ELSE
STOP_AUDIO_SCENE("FRANKLIN_1_JETSKI_GIRL_JUMP")
ENDIF
CLEANUP_PED(psFilmCrew[FCP_JACKEDGIRL], FALSE, TRUE)
ELSE
STOP_AUDIO_SCENE("FRANKLIN_1_JETSKI_GIRL_JUMP")
ENDIF
IF DOES_ENTITY_EXIST(psFilmCrew[FCP_GIRL].PedIndex)
IF NOT IS_ENTITY_DEAD(psFilmCrew[FCP_GIRL].PedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psFilmCrew[FCP_GIRL].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(psFilmCrew[FCP_GIRL].eState), 1.25)
ENDIF
psFilmCrew[FCP_GIRL].sDebugName = "FCP_GIRL"
#ENDIF
psFilmCrew[FCP_GIRL].fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(psFilmCrew[FCP_GIRL].PedIndex, PLAYER_PED_ID())
IF ( bFilmCrewAttacked = FALSE )
IF HAS_PED_BEEN_DAMAGED_OR_SHOT_AT(psFilmCrew[FCP_GIRL].PedIndex)
bFilmCrewAttacked = TRUE
ENDIF
ENDIF
IF NOT IS_PED_IN_PED_STATE(psFilmCrew[FCP_GIRL], PED_STATE_FLEEING)
IF IS_FILMCREW_SCARED()
GO_TO_PED_STATE(psFilmCrew[FCP_GIRL], PED_STATE_FLEEING)
ENDIF
ENDIF
SWITCH psFilmCrew[FCP_GIRL].eState
CASE PED_STATE_PLAYING_REACTION_ANIM
CASE PED_STATE_PLAYING_END_ANIM
//task?
BREAK
CASE PED_STATE_FLEEING
IF ( psFilmCrew[FCP_GIRL].bHasTask = FALSE )
CLEAR_PED_TASKS(psFilmCrew[FCP_GIRL].PedIndex)
TASK_SMART_FLEE_COORD(psFilmCrew[FCP_GIRL].PedIndex, vFilmCrewBeginAnimPosition, 300.0, INFINITE_TASK_TIME)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_GIRL].PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_GIRL].PedIndex, FA_DISABLE_HANDS_UP, TRUE)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_GIRL].PedIndex, FA_USE_VEHICLE, FALSE)
psFilmCrew[FCP_GIRL].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
IF ( psFilmCrew[FCP_GIRL].fDistanceToTargetPed > 125 )
CLEANUP_PED(psFilmCrew[FCP_GIRL], FALSE, FALSE, TRUE)
ENDIF
ENDIF
CLEANUP_PED(psFilmCrew[FCP_GIRL], FALSE, TRUE)
ENDIF
IF DOES_ENTITY_EXIST(psFilmCrew[FCP_CLAY].PedIndex)
IF NOT IS_ENTITY_DEAD(psFilmCrew[FCP_CLAY].PedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psFilmCrew[FCP_CLAY].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(psFilmCrew[FCP_CLAY].eState), 1.25)
ENDIF
psFilmCrew[FCP_CLAY].sDebugName = "FCP_CLAY"
#ENDIF
psFilmCrew[FCP_CLAY].fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(psFilmCrew[FCP_CLAY].PedIndex, PLAYER_PED_ID())
IF ( bFilmCrewAttacked = FALSE )
IF HAS_PED_BEEN_DAMAGED_OR_SHOT_AT(psFilmCrew[FCP_CLAY].PedIndex)
bFilmCrewAttacked = TRUE
ENDIF
ENDIF
IF NOT IS_PED_IN_PED_STATE(psFilmCrew[FCP_CLAY], PED_STATE_FLEEING)
IF IS_FILMCREW_SCARED()
GO_TO_PED_STATE(psFilmCrew[FCP_CLAY], PED_STATE_FLEEING)
ENDIF
ENDIF
SWITCH psFilmCrew[FCP_CLAY].eState
CASE PED_STATE_FLEEING
IF ( psFilmCrew[FCP_CLAY].bHasTask = FALSE )
CLEAR_PED_TASKS(psFilmCrew[FCP_CLAY].PedIndex)
TASK_SMART_FLEE_COORD(psFilmCrew[FCP_CLAY].PedIndex, vFilmCrewBeginAnimPosition, 300.0, INFINITE_TASK_TIME)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_CLAY].PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_CLAY].PedIndex, FA_DISABLE_HANDS_UP, TRUE)
SET_PED_FLEE_ATTRIBUTES(psFilmCrew[FCP_CLAY].PedIndex, FA_USE_VEHICLE, FALSE)
psFilmCrew[FCP_CLAY].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
IF ( psFilmCrew[FCP_CLAY].fDistanceToTargetPed > 125 )
CLEANUP_PED(psFilmCrew[FCP_CLAY], FALSE, FALSE, TRUE)
ENDIF
ENDIF
IF IS_ENTITY_DEAD(psFilmCrew[FCP_CLAY].PedIndex)
IF NOT IS_REPEAT_PLAY_ACTIVE()
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_MISSION_FRANK1_MC_CLIPPED, TRUE)
ENDIF
ENDIF
CLEANUP_PED(psFilmCrew[FCP_CLAY], FALSE, TRUE)
ENDIF
IF DOES_ENTITY_EXIST(psFilmCrew[FCP_CAMERAMAN].PedIndex)
IF NOT IS_ENTITY_DEAD(psFilmCrew[FCP_CAMERAMAN].PedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psFilmCrew[FCP_CAMERAMAN].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(psFilmCrew[FCP_CAMERAMAN].eState), 1.25)
ENDIF
psFilmCrew[FCP_CAMERAMAN].sDebugName = "FCP_CAMERAMAN"
#ENDIF
psFilmCrew[FCP_CAMERAMAN].fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(psFilmCrew[FCP_CAMERAMAN].PedIndex, PLAYER_PED_ID())
SWITCH psFilmCrew[FCP_CAMERAMAN].eState
CASE PED_STATE_FLEEING
BREAK
ENDSWITCH
IF ( psFilmCrew[FCP_CAMERAMAN].fDistanceToTargetPed > 125 )
CLEANUP_PED(psFilmCrew[FCP_CAMERAMAN], FALSE, FALSE, TRUE)
CLEANUP_MISSION_OBJECT(osCamera, FALSE)
ENDIF
ELSE
CLEANUP_MISSION_OBJECT(osCamera, FALSE)
ENDIF
CLEANUP_PED(psFilmCrew[FCP_CAMERAMAN], FALSE, TRUE)
ENDIF
IF DOES_ENTITY_EXIST(psFilmCrew[FCP_BOOMMAN].PedIndex)
IF NOT IS_ENTITY_DEAD(psFilmCrew[FCP_BOOMMAN].PedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psFilmCrew[FCP_BOOMMAN].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(psFilmCrew[FCP_BOOMMAN].eState), 1.25)
ENDIF
psFilmCrew[FCP_BOOMMAN].sDebugName = "FCP_BOOMMAN"
#ENDIF
psFilmCrew[FCP_BOOMMAN].fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(psFilmCrew[FCP_BOOMMAN].PedIndex, PLAYER_PED_ID())
SWITCH psFilmCrew[FCP_BOOMMAN].eState
CASE PED_STATE_FLEEING
BREAK
ENDSWITCH
IF ( psFilmCrew[FCP_BOOMMAN].fDistanceToTargetPed > 125 )
CLEANUP_PED(psFilmCrew[FCP_BOOMMAN], FALSE, FALSE, TRUE)
CLEANUP_MISSION_OBJECT(osMicrophone, FALSE)
ENDIF
ELSE
CLEANUP_MISSION_OBJECT(osMicrophone, FALSE)
ENDIF
CLEANUP_PED(psFilmCrew[FCP_BOOMMAN], FALSE, TRUE)
ENDIF
IF DOES_ENTITY_EXIST(osBoombox.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osBoombox.ObjectIndex)
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(osBoombox.ObjectIndex, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
SET_ENTITY_HEALTH(osBoombox.ObjectIndex, 0)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(osCamera.ObjectIndex)
OR DOES_ENTITY_EXIST(osBoombox.ObjectIndex)
OR DOES_ENTITY_EXIST(osMicrophone.ObjectIndex)
IF (vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime > 15000.0)
SET_OBJECT_AS_NO_LONGER_NEEDED(osCamera.ObjectIndex)
SET_OBJECT_AS_NO_LONGER_NEEDED(osBoombox.ObjectIndex)
SET_OBJECT_AS_NO_LONGER_NEEDED(osMicrophone.ObjectIndex)
ENDIF
ENDIF
ENDPROC
PROC MANAGE_HOUSE_ENEMY(INT &iProgress)
SWITCH iProgress
CASE 0 //check if any player ped or buddy ped reached the locate to trigger the enemy
IF IS_ANY_PED_IN_ANGLED_AREA_LOCATE(psLamar.PedIndex, GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR),
<<14.236324,-1913.274292,20.469467>>, <<70.221039,-1849.264526,24.780987>>, 12.0)
iProgress++
ENDIF
BREAK
CASE 1 //create enemy ped
esHouseEnemies[0].PedIndex = CREATE_ENEMY_PED(mnBalla, << 21.69, -1898.34, 21.96 >>, 313.9330, rgEnemies, WEAPONTYPE_ASSAULTRIFLE, 150)
INITIALISE_ENEMY_GROUP(esHouseEnemies, FALSE /*TRUE*/ #IF IS_DEBUG_BUILD, "House " #ENDIF)
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esHouseEnemies[0].PedIndex, << 28.59, -1889.94, 21.48 >>, PEDMOVE_RUN, FALSE, << 66.79, -1885.01, 22.46 >>,
GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(esHouseEnemies[0].PedIndex, RELGROUPHASH_PLAYER),
FALSE, TRUE, 0.25, 0.25, FALSE)
SET_PED_COMBAT_PROPERTIES(esHouseEnemies[0].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_NEAR, CA_AGGRESSIVE, TRUE)
SET_PED_DEFENSIVE_AREA_ANGLED(esHouseEnemies[0].PedIndex, <<24.075012,-1891.493652,20.611982>>, <<42.587761,-1869.529053,24.835415>>, 14.0, FALSE)
SET_PED_SHOOTING_PROPERTIES(esHouseEnemies[0].PedIndex, 5, 80, FIRING_PATTERN_FULL_AUTO)
iProgress++
BREAK
CASE 2
SET_DOOR_STATE(DOORNAME_FRANK1_HOUSE_DOOR, DOORSTATE_FORCE_UNLOCKED_THIS_FRAME)
IF DOES_ENTITY_EXIST(esHouseEnemies[0].PedIndex)
IF NOT IS_ENTITY_DEAD(esHouseEnemies[0].PedIndex)
IF NOT IS_ENTITY_IN_ANGLED_AREA(esHouseEnemies[0].PedIndex, <<21.022642,-1899.346313,21.970083>>, <<23.630833,-1896.150146,24.471025>>, 2.500000)
iProgress++
ENDIF
ENDIF
ELSE
iProgress++
ENDIF
BREAK
ENDSWITCH
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<22.705662,-1897.290283,21.970083>>, <<21.018452,-1899.358032,24.470083>>, 2.500000)
SET_DOOR_STATE(DOORNAME_FRANK1_HOUSE_DOOR, DOORSTATE_FORCE_UNLOCKED_THIS_FRAME)
ENDIF
//IF ( Events[EVENT_ENEMIES_HOUSE_KILLED] = FALSE )
CLEANUP_ENEMY_GROUP(esHouseEnemies, FALSE, TRUE, FALSE)//bRenderEnemyBlips)
//ENDIF
RUN_ENEMY_GROUP_DEAD_CHECK(esHouseEnemies, Events[EVENT_ENEMIES_HOUSE_KILLED] #IF IS_DEBUG_BUILD, "EVENT_ENEMIES_HOUSE_KILLED" #ENDIF)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esHouseEnemies, bRenderEnemyBlips)
ENDPROC
PROC MANAGE_CAR_PULLING_OUT(INT &iProgress)
FLOAT fPlaybackPercentage
SWITCH iProgress
CASE 0 //create car
REQUEST_MODEL(vsEnemyCars[CAR_DRIVEWAY].ModelName)
IF HAS_MODEL_LOADED(vsEnemyCars[CAR_DRIVEWAY].ModelName)
vsEnemyCars[CAR_DRIVEWAY].VehicleIndex = CREATE_ENEMY_VEHICLE(vsEnemyCars[CAR_DRIVEWAY], 2000, TRUE, VEHICLELOCK_UNLOCKED, 0, 113)
SET_MODEL_AS_NO_LONGER_NEEDED(vsEnemyCars[CAR_DRIVEWAY].ModelName)
iProgress++
ENDIF
BREAK
CASE 1
IF IS_ANY_FRIENDLY_IN_ANGLED_AREA_LOCATE(tbParkedCar)
iProgress++
ENDIF
BREAK
CASE 2 //start recording
REQUEST_VEHICLE_RECORDING(vsEnemyCars[CAR_DRIVEWAY].iRecordingNumber, sVehicleRecordingsFile)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(vsEnemyCars[CAR_DRIVEWAY].iRecordingNumber, sVehicleRecordingsFile)
esCarDriveway[0].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnBalla, vsEnemyCars[CAR_DRIVEWAY].VehicleIndex, VS_DRIVER, rgEnemies, WEAPONTYPE_PISTOL, 125)
esCarDriveway[1].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnBalla, vsEnemyCars[CAR_DRIVEWAY].VehicleIndex, VS_BACK_RIGHT, rgEnemies, WEAPONTYPE_MICROSMG, 150)
INITIALISE_ENEMY_GROUP(esCarDriveway, FALSE /*TRUE*/ #IF IS_DEBUG_BUILD, "ParkedCar " #ENDIF)
IF NOT IS_PED_INJURED(esCarDriveway[0].PedIndex)
SET_PED_PLAYS_HEAD_ON_HORN_ANIM_WHEN_DIES_IN_VEHICLE(esCarDriveway[0].PedIndex, TRUE)
ENDIF
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vsEnemyCars[CAR_DRIVEWAY], sVehicleRecordingsFile, 1.15, FALSE, 250)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsEnemyCars[CAR_DRIVEWAY].VehicleIndex, TRUE)
START_AUDIO_SCENE("FRANKLIN_1_SHOOTOUT_CAR_ARRIVE_CRASH")
IF IS_VEHICLE_DRIVEABLE(vsEnemyCars[CAR_DRIVEWAY].VehicleIndex)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vsEnemyCars[CAR_DRIVEWAY].VehicleIndex, "FRANKLIN_1_SHOOTOUT_CAR_CRASH_Group")
ENDIF
iProgress++
ENDIF
BREAK
CASE 3
#IF IS_DEBUG_BUILD
DRAW_DEBUG_VEHICLE_RECORDING_INFO(vsEnemyCars[CAR_DRIVEWAY].VehicleIndex, 1.0)
#ENDIF
IF IS_VEHICLE_RECORDING_PLAYBACK_RUNNING_OR_DRIVER_DEAD(vsEnemyCars[CAR_DRIVEWAY].VehicleIndex, fPlaybackPercentage, vsEnemyCars[CAR_DRIVEWAY].bDriverDead)
IF ( fPlaybackPercentage > 80.0 )
OR ( vsEnemyCars[CAR_DRIVEWAY].bDriverDead = TRUE )
IF NOT IS_PED_INJURED(esCarDriveway[0].PedIndex)
SET_PED_PLAYS_HEAD_ON_HORN_ANIM_WHEN_DIES_IN_VEHICLE(esCarDriveway[0].PedIndex, TRUE)
SET_ENTITY_HEALTH(esCarDriveway[0].PedIndex, 0)
vsEnemyCars[CAR_DRIVEWAY].bDriverDead = TRUE
ENDIF
STOP_PLAYBACK_RECORDED_VEHICLE(vsEnemyCars[CAR_DRIVEWAY].VehicleIndex)
REMOVE_VEHICLE_RECORDING(vsEnemyCars[CAR_DRIVEWAY].iRecordingNumber, sVehicleRecordingsFile)
COMBAT_SEQUENCE_GO_TO_COMBAT(esCarDriveway[1].PedIndex)
SET_PED_COMBAT_PROPERTIES(esCarDriveway[1].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_INVALID)
SET_PED_DEFENSIVE_AREA_SPHERE(esCarDriveway[1].PedIndex, << 28.82, -1882.00, 21.59 >>, 3.0)
SET_PED_SHOOTING_PROPERTIES(esCarDriveway[1].PedIndex, 5, 60)
SET_HORN_PERMANENTLY_ON_TIME(vsEnemyCars[CAR_DRIVEWAY].VehicleIndex, 10000)
SET_VEHICLE_ENGINE_HEALTH(vsEnemyCars[CAR_DRIVEWAY].VehicleIndex, 50.0)
STOP_AUDIO_SCENE("FRANKLIN_1_SHOOTOUT_CAR_ARRIVE_CRASH")
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vsEnemyCars[CAR_DRIVEWAY].VehicleIndex)
iProgress++
ENDIF
ENDIF
BREAK
ENDSWITCH
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyCars[CAR_DRIVEWAY].VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT, <<-0.85, 1.55, -0.15>>, 1.0, FALSE, TRUE,
<<-0.85, 2.15, 0.15>>, 100, 100 #IF IS_DEBUG_BUILD, bDrawDebugVehicleDamageInfo #ENDIF)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyCars[CAR_DRIVEWAY].VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT, <<0.85, 1.55, -0.15>>, 1.0, FALSE, TRUE,
<<1.0, 0.95, 0.15>>, 100, 100 #IF IS_DEBUG_BUILD, bDrawDebugVehicleDamageInfo #ENDIF)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyCars[CAR_DRIVEWAY].VehicleIndex, SC_WHEEL_CAR_REAR_LEFT, <<-0.8500, -1.5500, -0.1500>>, 1.0, FALSE, TRUE,
<<-1.0000, -2.1000, 0.1500>>, 100, 100 #IF IS_DEBUG_BUILD, bDrawDebugVehicleDamageInfo #ENDIF)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyCars[CAR_DRIVEWAY].VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT, <<0.8500, -1.5500, -0.1500>> , 1.0, FALSE, TRUE,
<<0.9500, -2.1500, 0.1500>>, 100, 100 #IF IS_DEBUG_BUILD, bDrawDebugVehicleDamageInfo #ENDIF)
//IF ( Events[EVENT_ENEMIES_CARPARKED_KILLED] = FALSE )
CLEANUP_ENEMY_GROUP(esCarDriveway, FALSE, TRUE, FALSE)//bRenderEnemyBlips)
//ENDIF
RUN_ENEMY_GROUP_DEAD_CHECK(esCarDriveway, Events[EVENT_ENEMIES_CARPARKED_KILLED] #IF IS_DEBUG_BUILD, "EVENT_ENEMIES_CARPARKED_KILLED" #ENDIF)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esCarDriveway, bRenderEnemyBlips)
ENDPROC
PROC MANAGE_FIRST_ENEMY_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL &bInitialEnemyGroupInitialised)
IF ( bCurrentEnemyWaveSpawned = FALSE )
REQUEST_MODEL(mnBalla)
REQUEST_MODEL(vsEnemyCars[CAR_CULDESAC].ModelName)
REQUEST_VEHICLE_RECORDING(vsEnemyCars[CAR_CULDESAC].iRecordingNumber, sVehicleRecordingsFile)
IF HAS_MODEL_LOADED(mnBalla)
AND HAS_MODEL_LOADED(vsEnemyCars[CAR_CULDESAC].ModelName)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsEnemyCars[CAR_CULDESAC].iRecordingNumber, sVehicleRecordingsFile)
IF NOT DOES_ENTITY_EXIST(esGroup1[0].PedIndex)
esGroup1[0].PedIndex = CREATE_ENEMY_PED(mnBalla, <<73.5813, -1944.3768, 19.8115>>, 304.0889, rgEnemies, WEAPONTYPE_MICROSMG, 125)
ENDIF
IF NOT DOES_ENTITY_EXIST(esGroup1[1].PedIndex)
esGroup1[1].PedIndex = CREATE_ENEMY_PED(mnBalla, <<81.7639, -1904.2952, 20.5794>>, 142.1008, rgEnemies, WEAPONTYPE_MICROSMG, 125)
ENDIF
IF NOT DOES_ENTITY_EXIST(esGroup1[2].PedIndex)
esGroup1[2].PedIndex = CREATE_ENEMY_PED(mnBalla, <<79.4749, -1908.1135, 20.3492>>, 169.8566, rgEnemies, WEAPONTYPE_MICROSMG, 125)
ENDIF
IF ( bInitialEnemyGroupInitialised = FALSE )
INITIALISE_ENEMY_GROUP(esGroup1, FALSE #IF IS_DEBUG_BUILD, "Group1 " #ENDIF)
bInitialEnemyGroupInitialised = TRUE
ENDIF
//unblock enemy events
IF ( bFirstEnemyGroupInCombat = FALSE )
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esGroup1[0].PedIndex, << 81.91, -1942.41, 19.85 >>, PEDMOVE_RUN, FALSE, vGroup1EnemyAimCoords, NULL, TRUE)
ENDIF
SET_PED_COMBAT_PROPERTIES(esGroup1[0].PedIndex, CM_STATIONARY, CAL_AVERAGE, CR_MEDIUM, CA_AGGRESSIVE)
SET_PED_SHOOTING_PROPERTIES(esGroup1[0].PedIndex, 3, 60, FIRING_PATTERN_FULL_AUTO)
IF DOES_ENTITY_EXIST(esGroup1[1].PedIndex)
IF NOT IS_ENTITY_DEAD(esGroup1[1].PedIndex)
SET_PED_COMBAT_MOVEMENT(esGroup1[1].PedIndex, CM_DEFENSIVE)
SET_PED_DEFENSIVE_AREA_SPHERE(esGroup1[1].PedIndex, << 89.92, -1918.83, 19.63 >>, 3.0)
SET_PED_CHANCE_OF_FIRING_BLANKS(esGroup1[1].PedIndex, 0.0, 0.5)
SET_PED_SHOOTING_PROPERTIES(esGroup1[1].PedIndex, 3, 125, FIRING_PATTERN_FULL_AUTO)
SET_COMBAT_FLOAT(esGroup1[1].PedIndex, CCF_MAX_SHOOTING_DISTANCE, 100.0)
SET_COMBAT_FLOAT(esGroup1[1].PedIndex, CCF_MIN_DISTANCE_TO_TARGET, 100.0)
SET_COMBAT_FLOAT(esGroup1[1].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 0.5)
SET_COMBAT_FLOAT(esGroup1[1].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[1].PedIndex, CA_ALWAYS_FIGHT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[1].PedIndex, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[1].PedIndex, CA_CAN_SHOOT_WITHOUT_LOS, FALSE)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[1].PedIndex, CA_REQUIRES_LOS_TO_SHOOT, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esGroup1[1].PedIndex, 150.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esGroup1[1].PedIndex, FALSE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esGroup1[2].PedIndex)
IF NOT IS_ENTITY_DEAD(esGroup1[2].PedIndex)
SET_PED_COMBAT_MOVEMENT(esGroup1[2].PedIndex, CM_DEFENSIVE)
SET_PED_DEFENSIVE_AREA_SPHERE(esGroup1[2].PedIndex, << 86.32, -1918.05, 19.69 >>, 3.0)
SET_PED_CHANCE_OF_FIRING_BLANKS(esGroup1[2].PedIndex, 0.0, 0.5)
SET_PED_SHOOTING_PROPERTIES(esGroup1[2].PedIndex, 3, 125, FIRING_PATTERN_FULL_AUTO)
SET_COMBAT_FLOAT(esGroup1[2].PedIndex, CCF_MAX_SHOOTING_DISTANCE, 100.0)
SET_COMBAT_FLOAT(esGroup1[2].PedIndex, CCF_MIN_DISTANCE_TO_TARGET, 100.0)
SET_COMBAT_FLOAT(esGroup1[2].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 0.5)
SET_COMBAT_FLOAT(esGroup1[2].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[2].PedIndex, CA_ALWAYS_FIGHT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[2].PedIndex, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[2].PedIndex, CA_CAN_SHOOT_WITHOUT_LOS, FALSE)
SET_PED_COMBAT_ATTRIBUTES(esGroup1[2].PedIndex, CA_REQUIRES_LOS_TO_SHOOT, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esGroup1[2].PedIndex, 150.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esGroup1[2].PedIndex, FALSE)
ENDIF
ENDIF
esGroup2[0].PedIndex = CREATE_ENEMY_PED(mnBalla, <<80.4945, -1897.3193, 21.0409>>, 146.6319, rgEnemies, WEAPONTYPE_PISTOL, 150) //round the intersection
INITIALISE_ENEMY_GROUP(esGroup2, FALSE #IF IS_DEBUG_BUILD, "Group2 " #ENDIF)
SET_PED_COMBAT_PROPERTIES(esGroup2[0].PedIndex, CM_WILLADVANCE, CAL_POOR, CR_MEDIUM, CA_AGGRESSIVE)
SET_PED_SHOOTING_PROPERTIES(esGroup2[0].PedIndex, 5, 40, FIRING_PATTERN_BURST_FIRE)
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esGroup2[0].PedIndex, <<85.9064, -1929.0186, 19.6911>>, PEDMOVE_RUN, TRUE, <<85.9064, -1929.0186, 19.6911>>, NULL, TRUE, TRUE, 4.0)
vsEnemyCars[CAR_CULDESAC].VehicleIndex = CREATE_ENEMY_VEHICLE(vsEnemyCars[CAR_CULDESAC], 1500, TRUE, VEHICLELOCK_UNLOCKED, 0, 0 #IF IS_DEBUG_BUILD, "Car0" #ENDIF)
esCarCuldeSacLeft[0].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnBalla, vsEnemyCars[CAR_CULDESAC].VehicleIndex, VS_DRIVER, rgEnemies, WEAPONTYPE_MICROSMG)
INITIALISE_ENEMY_GROUP(esCarCuldeSacLeft, FALSE #IF IS_DEBUG_BUILD, "Car1Left " #ENDIF)
esCarCuldeSacRight[0].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnBalla, vsEnemyCars[CAR_CULDESAC].VehicleIndex, VS_FRONT_RIGHT, rgEnemies, WEAPONTYPE_MICROSMG, 115)
INITIALISE_ENEMY_GROUP(esCarCuldeSacRight, FALSE #IF IS_DEBUG_BUILD, "Car1Right " #ENDIF)
esCarCuldeSacRight[0].bHasTask = FALSE
esCarCuldeSacRight[0].iProgress = 0
SET_PED_SHOOTING_PROPERTIES(esCarCuldeSacLeft[0].PedIndex, 5, 40, FIRING_PATTERN_BURST_FIRE)
SET_PED_SHOOTING_PROPERTIES(esCarCuldeSacRight[0].PedIndex, 5, 40, FIRING_PATTERN_BURST_FIRE)
SET_VEHICLE_ENGINE_ON(vsEnemyCars[CAR_CULDESAC].VehicleIndex, TRUE, TRUE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsEnemyCars[CAR_CULDESAC].VehicleIndex, TRUE)
START_PLAYBACK_RECORDED_VEHICLE(vsEnemyCars[CAR_CULDESAC].VehicleIndex, vsEnemyCars[CAR_CULDESAC].iRecordingNumber, sVehicleRecordingsFile)
SET_PLAYBACK_SPEED(vsEnemyCars[CAR_CULDESAC].VehicleIndex, 1.15)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsEnemyCars[CAR_CULDESAC].VehicleIndex)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vsEnemyCars[CAR_CULDESAC].VehicleIndex, "FRANKLIN_1_SHOOTOUT_CAR_01_Group")
START_AUDIO_SCENE("FRANKLIN_1_SHOOTOUT_CAR_ARRIVE_1")
SET_MODEL_AS_NO_LONGER_NEEDED(vsEnemyCars[CAR_CULDESAC].ModelName)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": 1st enemy wave spawned.")
#ENDIF
bCurrentEnemyWaveSpawned = TRUE
ENDIF
ELSE //update enemy peds
IF DOES_ENTITY_EXIST(esGroup1[0].PedIndex)
IF NOT IS_ENTITY_DEAD(esGroup1[0].PedIndex)
IF NOT IS_AMBIENT_SPEECH_PLAYING(esGroup1[0].PedIndex)
PLAY_PED_AMBIENT_SPEECH(esGroup1[0].PedIndex, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ENDIF
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(esGroup1[0].PedIndex)
SET_ENTITY_HEALTH(esGroup1[0].PedIndex, 0)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esCarCuldeSacRight[0].PedIndex)
IF NOT IS_ENTITY_DEAD(esCarCuldeSacRight[0].PedIndex)
SWITCH esCarCuldeSacRight[0].iProgress
CASE 0
IF ( esCarCuldeSacRight[0].bHasTask = FALSE )
IF NOT IS_ENTITY_DEAD(vsVan.VehicleIndex)
TASK_DRIVE_BY(esCarCuldeSacRight[0].PedIndex, NULL, vsVan.VehicleIndex, << 0.0, 0.0, 0.0 >>, 200.0, 75, TRUE)
ENDIF
esCarCuldeSacRight[0].bHasTask = TRUE
ENDIF
IF DOES_ENTITY_EXIST(vsEnemyCars[CAR_CULDESAC].VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vsEnemyCars[CAR_CULDESAC].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyCars[CAR_CULDESAC].VehicleIndex)
IF ( GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(vsEnemyCars[CAR_CULDESAC].VehicleIndex) > 95.0 )
//STOP_AUDIO_SCENE("FRANKLIN_1_SHOOTOUT_CAR_ARRIVE_1")
IF IS_VEHICLE_DRIVEABLE(vsEnemyCars[CAR_CULDESAC].VehicleIndex)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vsEnemyCars[CAR_CULDESAC].VehicleIndex)
ENDIF
esCarCuldeSacRight[0].bHasTask = FALSE
esCarCuldeSacRight[0].iProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF ( esCarCuldeSacRight[0].bHasTask = FALSE )
COMBAT_SEQUENCE_GO_TO_COMBAT(esCarCuldeSacRight[0].PedIndex, 100, PLAYER_PED_ID())
SET_PED_SHOOTING_PROPERTIES(esCarCuldeSacRight[0].PedIndex, 5, 50)
esCarCuldeSacRight[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsEnemyCars[CAR_CULDESAC].VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vsEnemyCars[CAR_CULDESAC].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyCars[CAR_CULDESAC].VehicleIndex)
IF ( GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(vsEnemyCars[CAR_CULDESAC].VehicleIndex) > 96.0 )
IF ( esCarCuldeSacLeft[0].bHasTask = FALSE )
COMBAT_SEQUENCE_GO_TO_COMBAT(esCarCuldeSacLeft[0].PedIndex, 100.0, PLAYER_PED_ID())
SET_PED_COVER_PROPERTIES(esCarCuldeSacLeft[0].PedIndex, TRUE, FALSE, FALSE, FALSE, 10.0, FALSE, 0.0, 1.0, 5.0)
SET_PED_SHOOTING_PROPERTIES(esCarCuldeSacLeft[0].PedIndex, 5, 95)
esCarCuldeSacLeft[0].bHasTask = TRUE
ENDIF
STOP_PLAYBACK_RECORDED_VEHICLE(vsEnemyCars[CAR_CULDESAC].VehicleIndex)
REMOVE_VEHICLE_RECORDING(vsEnemyCars[CAR_CULDESAC].iRecordingNumber, sVehicleRecordingsFile)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vsEnemyCars[CAR_CULDESAC].VehicleIndex)
//STOP_AUDIO_SCENE("FRANKLIN_1_SHOOTOUT_CAR_ARRIVE_1")
ENDIF
ENDIF
ENDIF
//IF ( Events[EVENT_ENEMIES_GROUP1_KILLED] = FALSE )
CLEANUP_ENEMY_GROUP(esGroup1, FALSE, TRUE, FALSE)
//ENDIF
//IF ( Events[EVENT_ENEMIES_GROUP2_KILLED] = FALSE )
CLEANUP_ENEMY_GROUP(esGroup2, FALSE, TRUE, FALSE)
//ENDIF
//IF ( Events[EVENT_ENEMIES_CARCULDESACLEFT_KILLED] = FALSE )
CLEANUP_ENEMY_GROUP(esCarCuldeSacLeft, FALSE, TRUE, FALSE)
//ENDIF
//IF ( Events[EVENT_ENEMIES_CARCULDESACRIGHT_KILLED] = FALSE )
CLEANUP_ENEMY_GROUP(esCarCuldeSacRight, FALSE, TRUE, FALSE)
//ENDIF
RUN_ENEMY_GROUP_DEAD_CHECK(esGroup1, Events[EVENT_ENEMIES_GROUP1_KILLED] #IF IS_DEBUG_BUILD, "EVENT_ENEMIES_GROUP1_KILLED" #ENDIF)
RUN_ENEMY_GROUP_DEAD_CHECK(esGroup2, Events[EVENT_ENEMIES_GROUP2_KILLED] #IF IS_DEBUG_BUILD, "EVENT_ENEMIES_GROUP2_KILLED" #ENDIF)
RUN_ENEMY_GROUP_DEAD_CHECK(esCarCuldeSacLeft, Events[EVENT_ENEMIES_CARCULDESACLEFT_KILLED] #IF IS_DEBUG_BUILD, "EVENT_ENEMIES_CARCULDESACLEFT_KILLED" #ENDIF)
RUN_ENEMY_GROUP_DEAD_CHECK(esCarCuldeSacRight, Events[EVENT_ENEMIES_CARCULDESACRIGHT_KILLED] #IF IS_DEBUG_BUILD, "EVENT_ENEMIES_CARCULDESACRIGHT_KILLED" #ENDIF)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esGroup1, bRenderEnemyBlips)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esGroup2, bRenderEnemyBlips)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esCarCuldeSacLeft, bRenderEnemyBlips)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esCarCuldeSacRight, bRenderEnemyBlips)
ENDIF
ENDPROC
PROC MANAGE_SECOND_ENEMY_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL bPreviousEnemyWaveSpawned)
//create enemy wave when there is a specified number of enemies alive from previous wave or when locate is reached
IF ( bCurrentEnemyWaveSpawned = FALSE )
IF ( bPreviousEnemyWaveSpawned = TRUE )
IF SHOULD_SPAWN_WAVE_2()
//create peds
esGroup3[0].PedIndex = CREATE_ENEMY_PED(mnBalla, << 50.75, -1912.24, 20.63 >>, 283.2224, rgEnemies, WEAPONTYPE_PISTOL, 150)
esGroup3[1].PedIndex = CREATE_ENEMY_PED(mnBalla, << 38.82, -1911.66, 20.95 >>, 311.4131, rgEnemies, WEAPONTYPE_MICROSMG)
esGroup3[2].PedIndex = CREATE_ENEMY_PED(mnBalla, << 46.45, -1913.46, 20.64 >>, 310.4631, rgEnemies, WEAPONTYPE_PISTOL, 125)
INITIALISE_ENEMY_GROUP(esGroup3, FALSE #IF IS_DEBUG_BUILD, "Group3 " #ENDIF)
esGroup4[0].PedIndex = CREATE_ENEMY_PED(mnBalla, << 86.95, -1882.96, 22.22 >>, 187.3570, rgEnemies, WEAPONTYPE_MICROSMG, 125)
esGroup4[1].PedIndex = CREATE_ENEMY_PED(mnBalla, << 81.71, -1894.12, 21.29 >>, 187.5137, rgEnemies, WEAPONTYPE_MICROSMG, 150)
INITIALISE_ENEMY_GROUP(esGroup4, FALSE #IF IS_DEBUG_BUILD, "Group4 " #ENDIF)
SET_ENEMY_GROUP_SHOOTING_PROPERTIES(esGroup3, 5, 80)
SET_ENEMY_GROUP_SHOOTING_PROPERTIES(esGroup4, 5, 80)
SET_PED_COMBAT_PROPERTIES(esGroup4[0].PedIndex, CM_DEFENSIVE, CAL_AVERAGE, CR_MEDIUM, CA_USE_COVER)
SET_PED_DEFENSIVE_AREA_ANGLED(esGroup4[0].PedIndex, <<71.759903,-1899.529053,19.466902>>, <<83.361237,-1909.626587,23.124557>>, 8.0)
SET_PED_COMBAT_PROPERTIES(esGroup4[1].PedIndex, CM_DEFENSIVE, CAL_AVERAGE, CR_MEDIUM, CA_USE_COVER)
SET_PED_DEFENSIVE_AREA_ANGLED(esGroup4[1].PedIndex, <<71.759903,-1899.529053,19.466902>>, <<83.361237,-1909.626587,23.124557>>, 8.0)
TASK_ENEMY_GROUP_COMBAT_HATED_PEDS(esGroup3)
TASK_ENEMY_GROUP_COMBAT_HATED_PEDS(esGroup4)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": 2nd enemy wave spawned.")
#ENDIF
bCurrentEnemyWaveSpawned = TRUE
ENDIF
ENDIF
ELSE //update enemy peds
//IF ( Events[EVENT_ENEMIES_GROUP3_KILLED] = FALSE )
CLEANUP_ENEMY_GROUP(esGroup3, FALSE, TRUE, FALSE)//bRenderEnemyBlips)
//ENDIF
//IF ( Events[EVENT_ENEMIES_GROUP4_KILLED] = FALSE )
CLEANUP_ENEMY_GROUP(esGroup4, FALSE, TRUE, FALSE)//bRenderEnemyBlips)
//ENDIF
RUN_ENEMY_GROUP_DEAD_CHECK(esGroup3, Events[EVENT_ENEMIES_GROUP3_KILLED] #IF IS_DEBUG_BUILD, "EVENT_ENEMIES_GROUP3_KILLED" #ENDIF)
RUN_ENEMY_GROUP_DEAD_CHECK(esGroup4, Events[EVENT_ENEMIES_GROUP4_KILLED] #IF IS_DEBUG_BUILD, "EVENT_ENEMIES_GROUP4_KILLED" #ENDIF)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esGroup3, bRenderEnemyBlips)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esGroup4, bRenderEnemyBlips)
ENDIF
ENDPROC
PROC MANAGE_ENEMY_CARS_AT_INTERSECTION()
IF NOT Events[EVENT_ENEMY_WAVE_CARINTERSECTION_SPAWNED]
IF SHOULD_SPAWN_INTERSECTION_CARS()
REQUEST_MODEL(vsEnemyCars[CAR_INTERSECTION1].ModelName)
REQUEST_MODEL(vsEnemyCars[CAR_INTERSECTION2].ModelName)
REQUEST_VEHICLE_RECORDING(vsEnemyCars[CAR_INTERSECTION1].iRecordingNumber, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(vsEnemyCars[CAR_INTERSECTION2].iRecordingNumber, sVehicleRecordingsFile)
IF HAS_MODEL_LOADED(vsEnemyCars[CAR_INTERSECTION1].ModelName)
AND HAS_MODEL_LOADED(vsEnemyCars[CAR_INTERSECTION2].ModelName)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsEnemyCars[CAR_INTERSECTION1].iRecordingNumber, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsEnemyCars[CAR_INTERSECTION2].iRecordingNumber, sVehicleRecordingsFile)
vsEnemyCars[CAR_INTERSECTION1].VehicleIndex = CREATE_ENEMY_VEHICLE(vsEnemyCars[CAR_INTERSECTION1], 1500, TRUE, VEHICLELOCK_UNLOCKED, 145, 105 #IF IS_DEBUG_BUILD, "Car0" #ENDIF)
esCarIntersection1Left[0].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnBalla, vsEnemyCars[CAR_INTERSECTION1].VehicleIndex, VS_DRIVER, rgEnemies, WEAPONTYPE_MICROSMG)
INITIALISE_ENEMY_GROUP(esCarIntersection1Left, FALSE #IF IS_DEBUG_BUILD, "CAR_INT1_L " #ENDIF)
esCarIntersection1Right[0].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnBalla, vsEnemyCars[CAR_INTERSECTION1].VehicleIndex, VS_FRONT_RIGHT, rgEnemies, WEAPONTYPE_MICROSMG, 115)
INITIALISE_ENEMY_GROUP(esCarIntersection1Right, FALSE #IF IS_DEBUG_BUILD, "CAR_INT1_R " #ENDIF)
esCarIntersection1Right[0].bHasTask = FALSE
esCarIntersection1Right[0].iProgress = 0
vsEnemyCars[CAR_INTERSECTION2].VehicleIndex = CREATE_ENEMY_VEHICLE(vsEnemyCars[CAR_INTERSECTION2], 1500, TRUE, VEHICLELOCK_UNLOCKED, 10, 10 #IF IS_DEBUG_BUILD, "Car0" #ENDIF)
esCarIntersection2Left[0].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnBalla, vsEnemyCars[CAR_INTERSECTION2].VehicleIndex, VS_DRIVER, rgEnemies, WEAPONTYPE_MICROSMG)
//esCarIntersection2Left[1].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnBalla, vsEnemyCars[CAR_INTERSECTION2].VehicleIndex, VS_BACK_LEFT, rgEnemies, WEAPONTYPE_MICROSMG)
INITIALISE_ENEMY_GROUP(esCarIntersection2Left, FALSE #IF IS_DEBUG_BUILD, "CAR_INT2_L " #ENDIF)
esCarIntersection2Left[1].bHasTask = FALSE
esCarIntersection2Left[1].iProgress = 0
IF IS_VEHICLE_DRIVEABLE(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex, TRUE)
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vsEnemyCars[CAR_INTERSECTION1], sVehicleRecordingsFile, 1.05, FALSE, 500.0)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex, "FRANKLIN_1_SHOOTOUT_CAR_02_Group")
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsEnemyCars[CAR_INTERSECTION2].VehicleIndex)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsEnemyCars[CAR_INTERSECTION2].VehicleIndex, TRUE)
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vsEnemyCars[CAR_INTERSECTION2], sVehicleRecordingsFile, 0.95)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vsEnemyCars[CAR_INTERSECTION2].VehicleIndex, "FRANKLIN_1_SHOOTOUT_CAR_02_Group")
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(vsEnemyCars[CAR_INTERSECTION1].ModelName)
SET_MODEL_AS_NO_LONGER_NEEDED(vsEnemyCars[CAR_INTERSECTION2].ModelName)
Events[EVENT_ENEMY_WAVE_CARINTERSECTION_SPAWNED] = TRUE
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
DRAW_DEBUG_VEHICLE_RECORDING_INFO(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex, 1.25)
DRAW_DEBUG_VEHICLE_RECORDING_INFO(vsEnemyCars[CAR_INTERSECTION2].VehicleIndex, 1.25)
#ENDIF
IF DOES_ENTITY_EXIST(esCarIntersection1Right[0].PedIndex)
IF NOT IS_ENTITY_DEAD(esCarIntersection1Right[0].PedIndex)
SWITCH esCarIntersection1Right[0].iProgress
CASE 0
IF ( esCarIntersection1Right[0].bHasTask = FALSE )
IF DOES_ENTITY_EXIST(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex)
IF GET_TIME_POSITION_IN_RECORDING(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex) > 3750
SET_PED_SEEING_RANGE(esCarIntersection1Right[0].PedIndex, 200.0)
SET_PED_HEARING_RANGE(esCarIntersection1Right[0].PedIndex, 200.0)
SET_PED_COMBAT_ATTRIBUTES(esCarIntersection1Right[0].PedIndex, CA_DO_DRIVEBYS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esCarIntersection1Right[0].PedIndex, CA_USE_VEHICLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esCarIntersection1Right[0].PedIndex, CA_LEAVE_VEHICLES, FALSE)
SET_PED_SHOOTING_PROPERTIES(esCarIntersection1Right[0].PedIndex, 3, 80, FIRING_PATTERN_FULL_AUTO)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esCarIntersection1Right[0].PedIndex, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esCarIntersection1Right[0].PedIndex, FALSE)
esCarIntersection1Right[0].bHasTask = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex)
IF GET_TIME_POSITION_IN_RECORDING(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex) > 5600
esCarIntersection1Right[0].bHasTask = FALSE
esCarIntersection1Right[0].iProgress++
ENDIf
ENDIF
ENDIF
BREAK
CASE 1
IF esCarIntersection1Right[0].bHasTask = FALSE
SET_PED_COMBAT_ATTRIBUTES(esCarIntersection1Right[0].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(esCarIntersection1Right[0].PedIndex, CA_LEAVE_VEHICLES, TRUE)
//COMBAT_SEQUENCE_EXIT_VEHICLE_THEN_DEFEND(esCarIntersection1Right[0].PedIndex, vsEnemyCars[CAR_INTERSECTION1].VehicleIndex, <<66.4768, -1899.1641, 20.6404>>)
STOP_AUDIO_SCENE("FRANKLIN_1_SHOOTOUT_CAR_ARRIVE_1")
IF IS_VEHICLE_DRIVEABLE(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex)
ENDIF
esCarIntersection1Right[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esCarIntersection1Left[0].PedIndex)
IF NOT IS_ENTITY_DEAD(esCarIntersection1Left[0].PedIndex)
SWITCH esCarIntersection1Left[0].iProgress
CASE 0
IF DOES_ENTITY_EXIST(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex)
IF GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex) > 75.0
STOP_PLAYBACK_RECORDED_VEHICLE(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex)
REMOVE_VEHICLE_RECORDING(vsEnemyCars[CAR_INTERSECTION1].iRecordingNumber, sVehicleRecordingsFile)
esCarIntersection1Left[0].bHasTask = FALSE
esCarIntersection1Left[0].iProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF esCarIntersection1Left[0].bHasTask = FALSE
SET_PED_SHOOTING_PROPERTIES(esCarIntersection1Left[0].PedIndex, 5, 75)
COMBAT_SEQUENCE_EXIT_VEHICLE_THEN_DEFEND(esCarIntersection1Left[0].PedIndex, vsEnemyCars[CAR_INTERSECTION1].VehicleIndex, <<61.4590, -1905.0114, 20.6796>>)
STOP_AUDIO_SCENE("FRANKLIN_1_SHOOTOUT_CAR_ARRIVE_1")
IF IS_VEHICLE_DRIVEABLE(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vsEnemyCars[CAR_INTERSECTION1].VehicleIndex)
ENDIF
esCarIntersection1Left[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esCarIntersection2Left[0].PedIndex)
IF NOT IS_ENTITY_DEAD(esCarIntersection2Left[0].PedIndex)
SWITCH esCarIntersection2Left[0].iProgress
CASE 0
IF DOES_ENTITY_EXIST(vsEnemyCars[CAR_INTERSECTION2].VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vsEnemyCars[CAR_INTERSECTION2].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyCars[CAR_INTERSECTION2].VehicleIndex)
IF GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(vsEnemyCars[CAR_INTERSECTION2].VehicleIndex) > 95.0
STOP_PLAYBACK_RECORDED_VEHICLE(vsEnemyCars[CAR_INTERSECTION2].VehicleIndex)
REMOVE_VEHICLE_RECORDING(vsEnemyCars[CAR_INTERSECTION2].iRecordingNumber, sVehicleRecordingsFile)
esCarIntersection2Left[0].bHasTask = FALSE
esCarIntersection2Left[0].iProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF esCarIntersection2Left[0].bHasTask = FALSE
SET_PED_SHOOTING_PROPERTIES(esCarIntersection2Left[0].PedIndex, 5, 75)
COMBAT_SEQUENCE_EXIT_VEHICLE_THEN_DEFEND(esCarIntersection2Left[0].PedIndex, vsEnemyCars[CAR_INTERSECTION2].VehicleIndex, <<0.0, 0.0, 0.0>>)
STOP_AUDIO_SCENE("FRANKLIN_1_SHOOTOUT_CAR_ARRIVE_1")
IF IS_VEHICLE_DRIVEABLE(vsEnemyCars[CAR_INTERSECTION2].VehicleIndex)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vsEnemyCars[CAR_INTERSECTION2].VehicleIndex)
ENDIF
esCarIntersection2Left[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esCarIntersection2Left[1].PedIndex)
IF NOT IS_ENTITY_DEAD(esCarIntersection2Left[1].PedIndex)
SWITCH esCarIntersection2Left[1].iProgress
CASE 0
IF DOES_ENTITY_EXIST(vsEnemyCars[CAR_INTERSECTION2].VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vsEnemyCars[CAR_INTERSECTION2].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyCars[CAR_INTERSECTION2].VehicleIndex)
IF GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(vsEnemyCars[CAR_INTERSECTION2].VehicleIndex) > 65.0
esCarIntersection2Left[1].bHasTask = FALSE
esCarIntersection2Left[1].iProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF esCarIntersection2Left[1].bHasTask = FALSE
SET_PED_SHOOTING_PROPERTIES(esCarIntersection2Left[1].PedIndex, 5, 75)
COMBAT_SEQUENCE_EXIT_VEHICLE_THEN_DEFEND(esCarIntersection2Left[1].PedIndex, vsEnemyCars[CAR_INTERSECTION2].VehicleIndex, <<0.0, 0.0, 0.0>>)
STOP_AUDIO_SCENE("FRANKLIN_1_SHOOTOUT_CAR_ARRIVE_1")
IF IS_VEHICLE_DRIVEABLE(vsEnemyCars[CAR_INTERSECTION2].VehicleIndex)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vsEnemyCars[CAR_INTERSECTION2].VehicleIndex)
ENDIF
esCarIntersection2Left[1].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
CLEANUP_ENEMY_GROUP(esCarIntersection1Left, FALSE, TRUE, FALSE)
CLEANUP_ENEMY_GROUP(esCarIntersection1Right, FALSE, TRUE, FALSE)
CLEANUP_ENEMY_GROUP(esCarIntersection2Left, FALSE, TRUE, FALSE)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esCarIntersection1Left, bRenderEnemyBlips)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esCarIntersection1Right, bRenderEnemyBlips)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esCarIntersection2Left, bRenderEnemyBlips)
ENDIF
ENDPROC
PROC MANAGE_3RD_ENEMY_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL bPreviousEnemyWaveSpawned)
//create enemy wave when there is a specified number of enemies alive from previous wave or when locate is reached
IF ( bCurrentEnemyWaveSpawned = FALSE )
IF ( bPreviousEnemyWaveSpawned = TRUE )
IF SHOULD_SPAWN_WAVE_3()
CPRINTLN(DEBUG_MISSION, "spawning wave 3")
//create peds
esGroup5[0].PedIndex = CREATE_ENEMY_PED(mnBalla, << 24.09, -1894.78, 21.61 >>, 247.1808, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
INITIALISE_ENEMY_GROUP(esGroup5, FALSE #IF IS_DEBUG_BUILD, "Group5 " #ENDIF)
esGroup6[0].PedIndex = CREATE_ENEMY_PED(mnBalla, << 44.57, -1870.54, 21.92 >>, 138.3147, rgEnemies, WEAPONTYPE_MICROSMG, 125)
esGroup6[1].PedIndex = CREATE_ENEMY_PED(mnBalla, << 43.22, -1865.36, 21.83 >>, 138.3147, rgEnemies, WEAPONTYPE_PISTOL)
//esGroup6[2].PedIndex = CREATE_ENEMY_PED(mnBalla, << 47.88, -1868.92, 21.85 >>, 138.3147, rgEnemies, WEAPONTYPE_PISTOL)
INITIALISE_ENEMY_GROUP(esGroup6, FALSE #IF IS_DEBUG_BUILD, "Group6 " #ENDIF)
SET_ENEMY_GROUP_SHOOTING_PROPERTIES(esGroup5, 20, 40)
SET_ENEMY_GROUP_SHOOTING_PROPERTIES(esGroup6, 20, 40)
TASK_ENEMY_GROUP_COMBAT_HATED_PEDS(esGroup5)
TASK_ENEMY_GROUP_COMBAT_HATED_PEDS(esGroup6)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": 3rd enemy wave spawned.")
#ENDIF
bCurrentEnemyWaveSpawned = TRUE
ENDIF
ENDIF
ELSE //update enemy peds
//IF ( Events[EVENT_ENEMIES_GROUP5_KILLED] = FALSE )
CLEANUP_ENEMY_GROUP(esGroup5, FALSE, TRUE, FALSE)//bRenderEnemyBlips)
//ENDIF
//IF ( Events[EVENT_ENEMIES_GROUP6_KILLED] = FALSE )
CLEANUP_ENEMY_GROUP(esGroup6, FALSE, TRUE, FALSE)//bRenderEnemyBlips)
//ENDIF
RUN_ENEMY_GROUP_DEAD_CHECK(esGroup5, Events[EVENT_ENEMIES_GROUP5_KILLED] #IF IS_DEBUG_BUILD, "EVENT_ENEMIES_GROUP5_KILLED" #ENDIF)
RUN_ENEMY_GROUP_DEAD_CHECK(esGroup6, Events[EVENT_ENEMIES_GROUP6_KILLED] #IF IS_DEBUG_BUILD, "EVENT_ENEMIES_GROUP6_KILLED" #ENDIF)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esGroup5, bRenderEnemyBlips)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esGroup6, bRenderEnemyBlips)
ENDIF
ENDPROC
PROC MANAGE_4TH_ENEMY_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL bPreviousEnemyWaveSpawned)
//create enemy wave when there is a specified number of enemies alive from previous wave or when locate is reached
IF ( bCurrentEnemyWaveSpawned = FALSE )
IF ( bPreviousEnemyWaveSpawned = TRUE )
IF SHOULD_SPAWN_WAVE_4()
//create peds
esGroup7[0].PedIndex = CREATE_ENEMY_PED(mnBalla, <<27.5975, -1897.2885, 21.5562>>, 309.5858, rgEnemies, WEAPONTYPE_PISTOL)
esGroup7[1].PedIndex = CREATE_ENEMY_PED(mnBalla, <<17.2164, -1889.5151, 22.0813>>, 284.5244, rgEnemies, WEAPONTYPE_PISTOL)
esGroup7[2].PedIndex = CREATE_ENEMY_PED(mnBalla, << 3.31, -1877.65, 22.61 >>, 329.7870, rgEnemies, WEAPONTYPE_PISTOL)
esGroup7[3].PedIndex = CREATE_ENEMY_PED(mnBalla, <<45.0939, -1853.9063, 21.8317>>, 317.1190, rgEnemies, WEAPONTYPE_MICROSMG, 125)
INITIALISE_ENEMY_GROUP(esGroup7, FALSE /*TRUE*/ #IF IS_DEBUG_BUILD, "Group7 " #ENDIF)
esGroup8[0].PedIndex = CREATE_ENEMY_PED(mnBalla, <<46.9275, -1865.1483, 22.2834>>, 138.9487, rgEnemies, WEAPONTYPE_PISTOL)
esGroup8[1].PedIndex = CREATE_ENEMY_PED(mnBalla, <<46.7417, -1873.0980, 21.7350>>, 146.0804, rgEnemies, WEAPONTYPE_MICROSMG, 115)
INITIALISE_ENEMY_GROUP(esGroup8, FALSE /*TRUE*/ #IF IS_DEBUG_BUILD, "Group8 " #ENDIF)
SET_ENEMY_GROUP_SHOOTING_PROPERTIES(esGroup7, 20, 40)
SET_ENEMY_GROUP_SHOOTING_PROPERTIES(esGroup8, 20, 40)
//combat tasks
TASK_ENEMY_GROUP_COMBAT_HATED_PEDS(esGroup7)
TASK_ENEMY_GROUP_COMBAT_HATED_PEDS(esGroup8)
SET_PED_COMBAT_PROPERTIES(esGroup7[0].PedIndex, CM_DEFENSIVE, CAL_AVERAGE, CR_MEDIUM, CA_CLEAR_PRIMARY_DEFENSIVE_AREA_WHEN_REACHED)
SET_PED_DEFENSIVE_AREA_SPHERE(esGroup7[0].PedIndex, csCoverpoints[50].vPosition, 2.0)
SET_PED_COMBAT_PROPERTIES(esGroup7[0].PedIndex, CM_DEFENSIVE, CAL_AVERAGE, CR_MEDIUM, CA_CLEAR_PRIMARY_DEFENSIVE_AREA_WHEN_REACHED)
SET_PED_DEFENSIVE_AREA_SPHERE(esGroup8[1].PedIndex, csCoverpoints[49].vPosition, 2.0)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": 4th enemy wave spawned.")
#ENDIF
INITIALISE_SPAWNPOINTS(EnemySpawnpoints, 4)
INITIALISE_SPAWNPOINTS(EnemySidekickSpawnpoints, 4)
bCurrentEnemyWaveSpawned = TRUE
ENDIF
ENDIF
ELSE //update enemy peds
IF NOT Events[EVENT_ENEMY_WAVE_5_SPAWNED] AND GET_NUM_REMAINING_OF_WAVE_4_ENEMIES() < 3
INT i
FOR i = 0 TO ( COUNT_OF(EnemySpawnpoints) - 1 )
UPDATE_SPAWNPOINT(EnemySpawnpoints[i])
UPDATE_SPAWNPOINT(EnemySidekickSpawnpoints[i])
ENDFOR
ENDIF
//IF ( Events[EVENT_ENEMIES_GROUP7_KILLED] = FALSE )
CLEANUP_ENEMY_GROUP(esGroup7, FALSE, TRUE, FALSE)//bRenderEnemyBlips)
//ENDIF
//IF ( Events[EVENT_ENEMIES_GROUP8_KILLED] = FALSE )
CLEANUP_ENEMY_GROUP(esGroup8, FALSE, TRUE, FALSE)//bRenderEnemyBlips)
//ENDIF
RUN_ENEMY_GROUP_DEAD_CHECK(esGroup7, Events[EVENT_ENEMIES_GROUP7_KILLED] #IF IS_DEBUG_BUILD, "EVENT_ENEMIES_GROUP7_KILLED" #ENDIF)
RUN_ENEMY_GROUP_DEAD_CHECK(esGroup8, Events[EVENT_ENEMIES_GROUP8_KILLED] #IF IS_DEBUG_BUILD, "EVENT_ENEMIES_GROUP8_KILLED" #ENDIF)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esGroup7, bRenderEnemyBlips)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esGroup8, bRenderEnemyBlips)
ENDIF
ENDPROC
PROC MANAGE_5TH_ENEMY_WAVE()
//create enemy wave when there is a specified number of enemies alive from previous wave or when locate is reached
IF NOT Events[EVENT_ENEMY_WAVE_5_SPAWNED]
IF SHOULD_SPAWN_WAVE_5()
REQUEST_MODEL(vsEnemyCars[CAR_STREET].ModelName)
REQUEST_VEHICLE_RECORDING(vsEnemyCars[CAR_STREET].iRecordingNumber, sVehicleRecordingsFile)
IF HAS_MODEL_LOADED(vsEnemyCars[CAR_STREET].ModelName)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsEnemyCars[CAR_STREET].iRecordingNumber, sVehicleRecordingsFile)
//create peds
vsEnemyCars[CAR_STREET].VehicleIndex = CREATE_ENEMY_VEHICLE(vsEnemyCars[CAR_STREET], 1500, TRUE, VEHICLELOCK_UNLOCKED, 68, 68)
esCarStreetLeft[0].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnBalla, vsEnemyCars[CAR_STREET].VehicleIndex, VS_DRIVER, rgEnemies, WEAPONTYPE_PISTOL)
INITIALISE_ENEMY_GROUP(esCarStreetLeft, FALSE #IF IS_DEBUG_BUILD, "CarstreetLeft " #ENDIF)
esCarStreetRight[0].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnBalla, vsEnemyCars[CAR_STREET].VehicleIndex, VS_FRONT_RIGHT, rgEnemies, WEAPONTYPE_MICROSMG)
INITIALISE_ENEMY_GROUP(esCarStreetRight, FALSE #IF IS_DEBUG_BUILD, "CarstreetRight " #ENDIF)
//combat tasks
SET_PED_COMBAT_DRIVE_BY(esCarStreetRight[0].PedIndex, 150.0)
SET_PED_SHOOTING_PROPERTIES(esCarStreetRight[0].PedIndex, 5, 75, FIRING_PATTERN_FULL_AUTO)
SET_VEHICLE_ENGINE_ON(vsEnemyCars[CAR_STREET].VehicleIndex, TRUE, TRUE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsEnemyCars[CAR_STREET].VehicleIndex, TRUE)
START_PLAYBACK_RECORDED_VEHICLE(vsEnemyCars[CAR_STREET].VehicleIndex, vsEnemyCars[CAR_STREET].iRecordingNumber, sVehicleRecordingsFile)
SET_PLAYBACK_SPEED(vsEnemyCars[CAR_STREET].VehicleIndex, 1.15)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsEnemyCars[CAR_STREET].VehicleIndex)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vsEnemyCars[CAR_STREET].VehicleIndex, "FRANKLIN_1_SHOOTOUT_CAR_03_Group")
START_AUDIO_SCENE("FRANKLIN_1_SHOOTOUT_CAR_ARRIVE_3")
SET_MODEL_AS_NO_LONGER_NEEDED(vsEnemyCars[CAR_STREET].ModelName)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": 5th enemy wave spawned.")
#ENDIF
Events[EVENT_ENEMY_WAVE_5_SPAWNED] = TRUE
ENDIF
ENDIF
ELSE //update enemy peds
//IF ( Events[EVENT_ENEMIES_CARSTREETLEFT_KILLED] = FALSE )
CLEANUP_ENEMY_GROUP(esCarStreetLeft, FALSE, TRUE, FALSE)//bRenderEnemyBlips)
//ENDIF
//IF ( Events[EVENT_ENEMIES_CARSTREETRIGHT_KILLED] = FALSE )
CLEANUP_ENEMY_GROUP(esCarStreetRight, FALSE, TRUE, FALSE)//bRenderEnemyBlips)
//ENDIF
RUN_ENEMY_GROUP_DEAD_CHECK(esCarStreetLeft, Events[EVENT_ENEMIES_CARSTREETLEFT_KILLED] #IF IS_DEBUG_BUILD, "EVENT_ENEMIES_CARSTREETLEFT_KILLED" #ENDIF)
RUN_ENEMY_GROUP_DEAD_CHECK(esCarStreetRight, Events[EVENT_ENEMIES_CARSTREETRIGHT_KILLED] #IF IS_DEBUG_BUILD, "EVENT_ENEMIES_CARSTREETRIGHT_KILLED" #ENDIF)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyCars[CAR_STREET].VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT, vFrontRightOffset, 1.0, FALSE, TRUE,
vFrontRightDamageOffset, 100, 100 #IF IS_DEBUG_BUILD, bDrawDebugVehicleDamageInfo #ENDIF)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyCars[CAR_STREET].VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT, vRearRightOffset, 1.0, FALSE, TRUE,
vRearRightDamageOffset, 100, 100 #IF IS_DEBUG_BUILD, bDrawDebugVehicleDamageInfo #ENDIF)
IF DOES_ENTITY_EXIST(vsEnemyCars[CAR_STREET].VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vsEnemyCars[CAR_STREET].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyCars[CAR_STREET].VehicleIndex)
IF ( GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(vsEnemyCars[CAR_STREET].VehicleIndex #IF IS_DEBUG_BUILD, TRUE #ENDIF ) > 80.0)
IF ( esCarStreetRight[0].bHasTask = FALSE )
IF NOT IS_ENTITY_DEAD(esCarStreetRight[0].PedIndex )
SET_CURRENT_PED_WEAPON(esCarStreetRight[0].PedIndex, WEAPONTYPE_MICROSMG, TRUE)
// run to a spot behind the car before shooting
COMBAT_SEQUENCE_EXIT_CAR_RUN_TO_SPOT_AND_ATTACK(esCarStreetRight[0].PedIndex, <<-0.2979, -1855.7231, 23.3036>>)
ENDIF
STOP_AUDIO_SCENE("FRANKLIN_1_SHOOTOUT_CAR_ARRIVE_3")
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vsEnemyCars[CAR_STREET].VehicleIndex)
esCarStreetRight[0].bHasTask = TRUE
ENDIF
ENDIF
IF ( GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(vsEnemyCars[CAR_STREET].VehicleIndex) > 90.0 )
IF ( esCarStreetLeft[0].bHasTask = FALSE )
COMBAT_SEQUENCE_GO_TO_COMBAT(esCarStreetLeft[0].PedIndex)
SET_PED_SHOOTING_PROPERTIES(esCarStreetLeft[0].PedIndex, 8, 60)
SET_PED_COVER_PROPERTIES(esCarStreetLeft[0].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, FALSE, 0.0, 3.0)
esCarStreetLeft[0].bHasTask = TRUE
ENDIF
STOP_AUDIO_SCENE("FRANKLIN_1_SHOOTOUT_CAR_ARRIVE_3")
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vsEnemyCars[CAR_STREET].VehicleIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vsEnemyCars[CAR_STREET].VehicleIndex)
REMOVE_VEHICLE_RECORDING(vsEnemyCars[CAR_STREET].iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ENDIF
ENDIF
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esCarStreetLeft, bRenderEnemyBlips)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esCarStreetRight, bRenderEnemyBlips)
ENDIF
ENDPROC
PROC MANAGE_6TH_ENEMY_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL bPreviousEnemyWaveSpawned, INT iAliveEnemiesCountToTriggerWave)
//create enemy wave when there is a specified number of enemies alive from previous wave or when locate is reached
IF ( bCurrentEnemyWaveSpawned = FALSE )
IF ( bPreviousEnemyWaveSpawned = TRUE )
IF ( ( GET_NUMBER_OF_ENEMIES_ALIVE(esCarStreetLeft) ) <= iAliveEnemiesCountToTriggerWave )
OR IS_ANY_PED_IN_ANGLED_AREA_LOCATE(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), psLamar.PedIndex,
<<-19.315809,-1883.604248,21.778067>>, <<27.231070,-1846.195313,25.670954>>, 8.0)
//create peds
esGroup9[0].PedIndex = CREATE_ENEMY_PED(mnBalla, << -16.66, -1813.80, 25.47 >>, 138.3147, rgEnemies, WEAPONTYPE_MICROSMG, 125)
esGroup9[1].PedIndex = CREATE_ENEMY_PED(mnBalla, << -24.22, -1856.45, 24.01 >>, 330.4768, rgEnemies, WEAPONTYPE_MICROSMG, 120)
esGroup9[2].PedIndex = CREATE_ENEMY_PED(mnBalla, << 6.5899, -1810.9725, 24.3479>>, 212.5341, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
INITIALISE_ENEMY_GROUP(esGroup9, FALSE #IF IS_DEBUG_BUILD, "Group9 " #ENDIF)
//combat tasks
SET_PED_SHOOTING_PROPERTIES(esGroup9[0].PedIndex, 5, 30)
COMBAT_SEQUENCE_GO_TO_COMBAT(esGroup9[0].PedIndex, 150.0)
SET_PED_COMBAT_PROPERTIES(esGroup9[0].PedIndex, CM_DEFENSIVE, CAL_POOR, CR_MEDIUM, CA_USE_COVER)
SET_PED_DEFENSIVE_AREA_ANGLED(esGroup9[0].PedIndex, <<-16.618637,-1821.934204,23.791941>>, <<-21.706158,-1828.041748,27.610094>>, 6.0)
COMBAT_SEQUENCE_GO_TO_COVER_THEN_COMBAT(esGroup9[1].PedIndex, csCoverpoints[40].vPosition, PEDMOVE_RUN, 3000, TRUE, TRUE, TRUE)
SET_PED_COVER_PROPERTIES(esGroup9[1].PedIndex, TRUE, TRUE, FALSE, TRUE, 10.0, FALSE, 0.0, 1.5, 5.0)
SET_PED_SHOOTING_PROPERTIES(esGroup9[1].PedIndex, 5, 30)
COMBAT_SEQUENCE_GO_TO_COORD_THEN_COMBAT(esGroup9[2].PedIndex, << 5.45, -1818.47, 24.35 >> /*<< 0.30, -1824.61, 28.55 >>*/, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP * 2, TRUE)
SET_PED_SHOOTING_PROPERTIES(esGroup9[2].PedIndex, 3, 90)
SET_PED_DEFENSIVE_AREA_ANGLED(esGroup9[2].PedIndex, <<-0.456124,-1825.613037,28.446308>>, <<1.161289,-1823.675171,30.546309>>, 1.5)
esGroup9[2].iTimer = GET_GAME_TIMER()
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT_NEW(esGroup9[3].PedIndex, csCoverpoints[57].vPosition, PEDMOVE_RUN, FALSE, vGroveStreetStart, NULL, FALSE)
SET_PED_COVER_PROPERTIES(esGroup9[3].PedIndex, TRUE, FALSE, FALSE, FALSE, 10.0, FALSE, 0.0, 1.0, 5.0)
SET_PED_SHOOTING_PROPERTIES(esGroup9[3].PedIndex, 5, 60)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": 6th enemy wave spawned.")
#ENDIF
bCurrentEnemyWaveSpawned = TRUE
ENDIF
ENDIF
ELSE //update enemy peds
//IF ( Events[EVENT_ENEMIES_GROUP9_KILLED] = FALSE )
CLEANUP_ENEMY_GROUP(esGroup9, FALSE, TRUE, FALSE)
//ENDIF
RUN_ENEMY_GROUP_DEAD_CHECK(esGroup9, Events[EVENT_ENEMIES_GROUP9_KILLED] #IF IS_DEBUG_BUILD, "EVENT_ENEMIES_GROUP9_KILLED" #ENDIF)
//update enemy who takes cover on the corner of the river entrance
IF NOT IS_PED_INJURED(esGroup9[1].PedIndex)
SWITCH esGroup9[1].iProgress
CASE 0 //when shootout ends, make the ped go out of cover for easy kill
IF ( Events[EVENT_SHOOTOUT_ENDED] = TRUE )
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esGroup9[1].PedIndex, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esGroup9[1].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esGroup9[1].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_NEAR, CA_AGGRESSIVE)
REMOVE_PED_DEFENSIVE_AREA(esGroup9[1].PedIndex)
SET_PED_COVER_PROPERTIES(esGroup9[1].PedIndex, FALSE)
esGroup9[1].iProgress++
ENDIF
BREAK
ENDSWITCH
ENDIF
IF NOT IS_PED_INJURED(esGroup9[2].PedIndex)
SWITCH esGroup9[2].iProgress
CASE 0
IF ( Events[EVENT_SHOOTOUT_ENDED] = TRUE )
esGroup9[2].bHasTask = FALSE
esGroup9[2].iProgress++
ENDIF
BREAK
CASE 1
IF ( esGroup9[2].bHasTask = FALSE )
REMOVE_PED_DEFENSIVE_AREA(esGroup9[2].PedIndex)
SET_PED_COMBAT_RANGE(esGroup9[2].PedIndex, CR_NEAR)
SET_PED_COMBAT_MOVEMENT(esGroup9[2].PedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(esGroup9[2].PedIndex, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_MOVEMENT_PROPERTIES(esGroup9[2].PedIndex, 1.0, 0.0)
SET_PED_SHOOTING_PROPERTIES(esGroup9[2].PedIndex, 5, 75)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esGroup9[2].PedIndex, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esGroup9[2].PedIndex, FALSE)
esGroup9[2].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esGroup9, bRenderEnemyBlips)
ENDIF
ENDPROC
PROC MANAGE_SPAWNER_PED(SPAWNPOINT_STRUCT &sSpawnpoint, BOOL bRenderBlip = TRUE)
IF ( sSpawnpoint.bTaken = TRUE )
IF DOES_ENTITY_EXIST(sSpawnpoint.sEnemy.PedIndex)
IF NOT IS_ENTITY_DEAD(sSpawnpoint.sEnemy.PedIndex)
IF NOT IS_PED_INJURED(sSpawnpoint.sEnemy.PedIndex)
IF ( sSpawnpoint.bHasTask = FALSE )
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
// give the spawner cops a defensive area so they dont follow
// the player down the hill
IF Events[EVENT_COPS_ARRIVE]
IF ( psLamar.bFleeing = FALSE )
SET_PED_ACCURACY(sSpawnpoint.sEnemy.PedIndex, 1)
COMBAT_SEQUENCE_EXIT_VEHICLE_THEN_DEFEND(sSpawnpoint.sEnemy.PedIndex, vsStreetCopCars[COPCAR_STREET_1].VehicleIndex, <<0.0, 0.0, 0.0>>)
ELSE
SET_PED_COMBAT_ATTRIBUTES(sSpawnpoint.sEnemy.PedIndex, CA_CAN_FLANK, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sSpawnpoint.sEnemy.PedIndex, CA_CAN_CHARGE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sSpawnpoint.sEnemy.PedIndex, CA_CAN_CHASE_TARGET_ON_FOOT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sSpawnpoint.sEnemy.PedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sSpawnpoint.sEnemy.PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sSpawnpoint.sEnemy.PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_TARGET_LOSS_RESPONSE(sSpawnpoint.sEnemy.PedIndex, TLR_SEARCH_FOR_TARGET)
SET_PED_COMBAT_MOVEMENT(sSpawnpoint.sEnemy.PedIndex, CM_DEFENSIVE)
SET_PED_ANGLED_DEFENSIVE_AREA(sSpawnpoint.sEnemy.PedIndex, <<-42.085915,-1866.869629,23.175344>>, <<-28.507175,-1851.517090,27.739193>>, 5.000000)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sSpawnpoint.sEnemy.PedIndex, 3000)
ENDIF
ELSE
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sSpawnpoint.sEnemy.PedIndex, 3000)
ENDIF
sSpawnpoint.bHasTask = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_DEAD(sSpawnpoint.sEnemy.PedIndex)
OR IS_PED_INJURED(sSpawnpoint.sEnemy.PedIndex)
IF ( sSpawnpoint.sEnemy.eCleanupReason = PED_CLEANUP_NO_CLEANUP )
IF DOES_BLIP_EXIST(sSpawnpoint.sEnemy.BlipIndex)
REMOVE_BLIP(sSpawnpoint.sEnemy.BlipIndex)
ENDIF
sSpawnpoint.sEnemy.eCleanupReason = GET_PED_CLEANUP_REASON(sSpawnpoint.sEnemy.PedIndex #IF IS_DEBUG_BUILD, "Spawner" #ENDIF)
sSpawnpoint.sEnemy.iCleanupAttempts++
IF ( sSpawnpoint.sEnemy.iCleanupAttempts = 10 )
sSpawnpoint.sEnemy.eCleanupReason = PED_CLEANUP_NONE
ENDIF
ELSE
sSpawnpoint.iKillCount++
sSpawnpoint.iTimer = GET_GAME_TIMER()
sSpawnpoint.bTaken = FALSE
sSpawnpoint.bHasTask = FALSE
UPDATE_PLAYER_AND_BUDDY_KILL_COUNTERS(sSpawnpoint.sEnemy.eCleanupReason, iPlayerFranklinKills, iPlayerTrevorKills,
iBuddyFranklinKills, iBuddyTrevorKills, iBuddyLamarKills, iBuddyChopKills)
SET_PED_AS_NO_LONGER_NEEDED(sSpawnpoint.sEnemy.PedIndex)
ENDIF
ENDIF
ENDIF
ENDIF
IF bRenderBlip = TRUE
IF DOES_ENTITY_EXIST(sSpawnpoint.sEnemy.PedIndex)
AND NOT IS_ENTITY_DEAD(sSpawnpoint.sEnemy.PedIndex)
AND GET_ENTITY_MODEL(sSpawnpoint.sEnemy.PedIndex) != mnCop
UPDATE_AI_PED_BLIP(sSpawnpoint.sEnemy.PedIndex, sSpawnpoint.sEnemy.EnemyBlipData)
ENDIF
ELSE
CLEANUP_AI_PED_BLIP(sSpawnpoint.sEnemy.EnemyBlipData)
ENDIF
ENDPROC
// separated this out from the spawner, as we need to keep
// managing them even if we've stopped spawning them
// @BSW
PROC MANAGE_SPAWNER_PEDS()
INT i
FOR i = 0 TO ( COUNT_OF(EnemySpawnpoints) - 1 )
MANAGE_SPAWNER_PED(EnemySpawnpoints[i], bRenderEnemyBlips)
ENDFOR
// do it twice because we're also using this for the "sidekicks"
// as a hacky way to double up the spawns!
FOR i = 0 TO ( COUNT_OF(EnemySidekickSpawnpoints) - 1 )
MANAGE_SPAWNER_PED(EnemySidekickSpawnpoints[i], bRenderEnemyBlips)
ENDFOR
ENDPROC
PROC MANAGE_COP_WAVE(BOOL &bCurrentEnemyWaveSpawned)
//create enemy wave when there is a specified number of enemies alive from previous wave or when locate is reached
IF ( bCurrentEnemyWaveSpawned = FALSE )
IF SHOULD_SPAWN_COP_WAVE()
INT i
REQUEST_MODEL(POLICE3)
REQUEST_MODEL(S_M_Y_COP_01)
REQUEST_VEHICLE_RECORDING(vsStreetCopCars[COPCAR_STREET_1].iRecordingNumber, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(vsStreetCopCars[COPCAR_STREET_2].iRecordingNumber, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(vsStreetCopCars[COPCAR_STREET_3].iRecordingNumber, sVehicleRecordingsFile)
IF HAS_MODEL_LOADED(POLICE3)
AND HAS_MODEL_LOADED(S_M_Y_COP_01)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsStreetCopCars[COPCAR_STREET_1].iRecordingNumber, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsStreetCopCars[COPCAR_STREET_2].iRecordingNumber, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsStreetCopCars[COPCAR_STREET_3].iRecordingNumber, sVehicleRecordingsFile)
//create first 3 cop cars
REPEAT 3 i
vsStreetCopCars[i].VehicleIndex = CREATE_VEHICLE(POLICE3, vsStreetCopCars[i].vPosition, vsStreetCopCars[i].fHeading)
SET_VEHICLE_SIREN(vsStreetCopCars[i].VehicleIndex, TRUE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsStreetCopCars[i].VehicleIndex, TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsStreetCopCars[i].VehicleIndex, FALSE)
ENDREPEAT
//create cop peds in first 3 cop cars
//first cop car
psStreetCopCar1Cops[0].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex, PEDTYPE_COP, mnCop, VS_DRIVER)
psStreetCopCar1Cops[1].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex, PEDTYPE_COP, mnCop, VS_FRONT_RIGHT)
GO_TO_PED_STATE(psStreetCopCar1Cops[0], PED_STATE_RECORDING_PLAYBACK)
GO_TO_PED_STATE(psStreetCopCar1Cops[1], PED_STATE_RECORDING_PLAYBACK)
//second cop car
psStreetCopCar2Cops[0].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex, PEDTYPE_COP, mnCop, VS_DRIVER)
psStreetCopCar2Cops[1].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex, PEDTYPE_COP, mnCop, VS_FRONT_RIGHT)
GO_TO_PED_STATE(psStreetCopCar2Cops[0], PED_STATE_RECORDING_PLAYBACK)
GO_TO_PED_STATE(psStreetCopCar2Cops[1], PED_STATE_RECORDING_PLAYBACK)
//third cop car
psStreetCopCar3Cops[0].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex, PEDTYPE_COP, mnCop, VS_DRIVER)
psStreetCopCar3Cops[1].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex, PEDTYPE_COP, mnCop, VS_FRONT_RIGHT)
GO_TO_PED_STATE(psStreetCopCar3Cops[0], PED_STATE_RECORDING_PLAYBACK)
GO_TO_PED_STATE(psStreetCopCar3Cops[1], PED_STATE_RECORDING_PLAYBACK)
//start vehicle recordings on the first 3 cop cars
REPEAT 3 i
START_PLAYBACK_RECORDED_VEHICLE(vsStreetCopCars[i].VehicleIndex, vsStreetCopCars[i].iRecordingNumber, sVehicleRecordingsFile)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsStreetCopCars[i].VehicleIndex)
ENDREPEAT
//adjust playback speeds
SET_PLAYBACK_SPEED(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex, 1.25)
SET_PLAYBACK_SPEED(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex, 0.95)
SET_PLAYBACK_SPEED(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex, 0.95)
//start audio scene
START_AUDIO_SCENE("FRANKLIN_1_SHOOTOUT_POLICE_ARRIVE")
//set 3 star wanted level
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 3)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(POLICE3)
SET_MODEL_AS_NO_LONGER_NEEDED(S_M_Y_COP_01)
PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_Franklin_2_01", 0.0)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Cops wave spawned.")
#ENDIF
bCurrentEnemyWaveSpawned = TRUE
//bCopConversationsAllowed = TRUE
iReplayCameraWarpTimer = GET_GAME_TIMER() + 1000 //Fix for bug 2229916
ENDIF
ENDIF
ELSE //update cop peds
///COP CAR 1
IF DOES_ENTITY_EXIST(psStreetCopCar1Cops[0].PedIndex)
IF NOT IS_ENTITY_DEAD(psStreetCopCar1Cops[0].PedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_VEHICLE_RECORDING_INFO(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex, 1.0)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psStreetCopCar1Cops[0].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(psStreetCopCar1Cops[0].eState), 1.25)
ENDIF
psStreetCopCar1Cops[0].sDebugName = "StreetCopCar1Cop 0"
#ENDIF
SWITCH psStreetCopCar1Cops[0].eState
CASE PED_STATE_RECORDING_PLAYBACK
IF ( psStreetCopCar1Cops[0].bHasTask = FALSE )
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex, vsStreetCopCars[COPCAR_STREET_1].iRecordingNumber, sVehicleRecordingsFile)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
SET_PLAYBACK_SPEED(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex, 1.25)
ELSE
GIVE_WEAPON_TO_PED(psStreetCopCar1Cops[0].PedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO)
SET_PED_ACCURACY(psStreetCopCar1Cops[0].PedIndex, 1)
psStreetCopCar1Cops[0].bHasTask = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF ( psStreetCopCar1Cops[0].bHasTask = TRUE )
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
IF GET_TIME_POSITION_IN_RECORDING(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex) > 10000.0
STOP_PLAYBACK_RECORDED_VEHICLE(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
REMOVE_VEHICLE_RECORDING(vsStreetCopCars[COPCAR_STREET_1].iRecordingNumber, sVehicleRecordingsFile)
psStreetCopCar1Cops[0].iProgress = 0
GO_TO_PED_STATE(psStreetCopCar1Cops[0], PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
SWITCH psStreetCopCar1Cops[0].iProgress
CASE 0
IF ( psStreetCopCar1Cops[0].bHasTask = FALSE )
GIVE_WEAPON_TO_PED(psStreetCopCar1Cops[0].PedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO)
SET_PED_ACCURACY(psStreetCopCar1Cops[0].PedIndex, 1)
SET_PED_SHOOT_RATE(psStreetCopCar1Cops[0].PedIndex, 90)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar1Cops[0].PedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar1Cops[0].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar1Cops[0].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_TARGET_LOSS_RESPONSE(psStreetCopCar1Cops[0].PedIndex, TLR_SEARCH_FOR_TARGET)
SET_PED_COMBAT_MOVEMENT(psStreetCopCar1Cops[0].PedIndex, CM_DEFENSIVE)
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
AND NOT IS_ENTITY_DEAD(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
SET_PED_DEFENSIVE_SPHERE_ATTACHED_TO_VEHICLE(psStreetCopCar1Cops[0].PedIndex, vsStreetCopCars[COPCAR_STREET_1].VehicleIndex, << 0.0, 0.0, 0.0>>, 10.0)
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(psStreetCopCar1Cops[0].PedIndex, 150.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psStreetCopCar1Cops[0].PedIndex, FALSE)
psStreetCopCar1Cops[0].bHasTask = TRUE
ENDIF
IF ( psLamar.bFleeing)
psStreetCopCar1Cops[0].iProgress++
psStreetCopCar1Cops[0].bHasTask = FALSE
ENDIF
BREAK
CASE 1
IF ( psStreetCopCar1Cops[0].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar1Cops[0].PedIndex, CA_CAN_FLANK, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar1Cops[0].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar1Cops[0].PedIndex, CA_CAN_CHASE_TARGET_ON_FOOT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar1Cops[0].PedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar1Cops[0].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar1Cops[0].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_TARGET_LOSS_RESPONSE(psStreetCopCar1Cops[0].PedIndex, TLR_SEARCH_FOR_TARGET)
REMOVE_PED_DEFENSIVE_AREA(psStreetCopCar1Cops[0].PedIndex)
SET_PED_COMBAT_MOVEMENT(psStreetCopCar1Cops[0].PedIndex, CM_WILLADVANCE)
psStreetCopCar1Cops[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDIF
IF IS_ENTITY_DEAD(psStreetCopCar1Cops[0].PedIndex)
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
REMOVE_VEHICLE_RECORDING(vsStreetCopCars[COPCAR_STREET_1].iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psStreetCopCar1Cops[1].PedIndex)
IF NOT IS_ENTITY_DEAD(psStreetCopCar1Cops[1].PedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psStreetCopCar1Cops[1].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(psStreetCopCar1Cops[1].eState), 1.25)
ENDIF
psStreetCopCar1Cops[1].sDebugName = "StreetCopCar1Cop 1"
#ENDIF
SWITCH psStreetCopCar1Cops[1].eState
CASE PED_STATE_RECORDING_PLAYBACK
IF ( psStreetCopCar1Cops[1].bHasTask = FALSE )
GIVE_WEAPON_TO_PED(psStreetCopCar1Cops[1].PedIndex, WEAPONTYPE_PUMPSHOTGUN, INFINITE_AMMO)
psStreetCopCar1Cops[1].bHasTask = TRUE
ENDIF
IF ( psStreetCopCar1Cops[1].bHasTask = TRUE )
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
IF GET_TIME_POSITION_IN_RECORDING(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex) > 9500.0
GO_TO_PED_STATE(psStreetCopCar1Cops[1], PED_STATE_COMBAT_ON_FOOT)
ENDIF
ELSE
psStreetCopCar1Cops[1].iProgress = 0
GO_TO_PED_STATE(psStreetCopCar1Cops[1], PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
SWITCH psStreetCopCar1Cops[1].iProgress
CASE 0
IF ( psStreetCopCar1Cops[1].bHasTask = FALSE )
GIVE_WEAPON_TO_PED(psStreetCopCar1Cops[1].PedIndex, WEAPONTYPE_PUMPSHOTGUN, INFINITE_AMMO)
SET_PED_ACCURACY(psStreetCopCar1Cops[1].PedIndex, 1)
SET_PED_SHOOT_RATE(psStreetCopCar1Cops[1].PedIndex, 90)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar1Cops[1].PedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar1Cops[1].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar1Cops[1].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_TARGET_LOSS_RESPONSE(psStreetCopCar1Cops[1].PedIndex, TLR_SEARCH_FOR_TARGET)
SET_PED_COMBAT_MOVEMENT(psStreetCopCar1Cops[1].PedIndex, CM_DEFENSIVE)
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
AND NOT IS_ENTITY_DEAD(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
SET_PED_DEFENSIVE_SPHERE_ATTACHED_TO_VEHICLE(psStreetCopCar1Cops[1].PedIndex, vsStreetCopCars[COPCAR_STREET_1].VehicleIndex, << 0.0, 0.0, 0.0>>, 10.0)
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(psStreetCopCar1Cops[1].PedIndex, 150.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psStreetCopCar1Cops[1].PedIndex, FALSE)
psStreetCopCar1Cops[1].bHasTask = TRUE
ENDIF
IF ( psLamar.bFleeing)
psStreetCopCar1Cops[1].iProgress++
psStreetCopCar1Cops[1].bHasTask = FALSE
ENDIF
BREAK
CASE 1
IF ( psStreetCopCar1Cops[1].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar1Cops[1].PedIndex, CA_CAN_FLANK, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar1Cops[1].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar1Cops[1].PedIndex, CA_CAN_CHASE_TARGET_ON_FOOT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar1Cops[1].PedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar1Cops[1].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar1Cops[1].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_TARGET_LOSS_RESPONSE(psStreetCopCar1Cops[1].PedIndex, TLR_SEARCH_FOR_TARGET)
REMOVE_PED_DEFENSIVE_AREA(psStreetCopCar1Cops[1].PedIndex)
SET_PED_COMBAT_MOVEMENT(psStreetCopCar1Cops[1].PedIndex, CM_WILLADVANCE)
psStreetCopCar1Cops[1].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDIF
ENDIF
///COP CAR 2
IF DOES_ENTITY_EXIST(psStreetCopCar2Cops[0].PedIndex)
IF NOT IS_ENTITY_DEAD(psStreetCopCar2Cops[0].PedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_VEHICLE_RECORDING_INFO(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex, 1.0)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psStreetCopCar2Cops[0].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(psStreetCopCar2Cops[0].eState), 1.25)
ENDIF
psStreetCopCar2Cops[0].sDebugName = "StreetCopCar2Cop 0"
#ENDIF
SWITCH psStreetCopCar2Cops[0].eState
CASE PED_STATE_RECORDING_PLAYBACK
IF ( psStreetCopCar2Cops[0].bHasTask = FALSE )
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex, vsStreetCopCars[COPCAR_STREET_2].iRecordingNumber, sVehicleRecordingsFile)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
SET_PLAYBACK_SPEED(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex, 1.25)
ELSE
GIVE_WEAPON_TO_PED(psStreetCopCar2Cops[0].PedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO)
SET_PED_ACCURACY(psStreetCopCar2Cops[0].PedIndex, 1)
psStreetCopCar2Cops[0].bHasTask = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF ( psStreetCopCar2Cops[0].bHasTask = TRUE )
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
IF GET_TIME_POSITION_IN_RECORDING(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex) > 9000.0
STOP_PLAYBACK_RECORDED_VEHICLE(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
REMOVE_VEHICLE_RECORDING(vsStreetCopCars[COPCAR_STREET_2].iRecordingNumber, sVehicleRecordingsFile)
psStreetCopCar2Cops[0].iProgress = 0
GO_TO_PED_STATE(psStreetCopCar2Cops[0], PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
SWITCH psStreetCopCar2Cops[0].iProgress
CASE 0
IF ( psStreetCopCar2Cops[0].bHasTask = FALSE )
GIVE_WEAPON_TO_PED(psStreetCopCar2Cops[0].PedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO)
SET_PED_ACCURACY(psStreetCopCar2Cops[0].PedIndex, 1)
SET_PED_SHOOT_RATE(psStreetCopCar2Cops[0].PedIndex, 90)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar2Cops[0].PedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar2Cops[0].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar2Cops[0].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_TARGET_LOSS_RESPONSE(psStreetCopCar2Cops[0].PedIndex, TLR_SEARCH_FOR_TARGET)
SET_PED_COMBAT_MOVEMENT(psStreetCopCar2Cops[0].PedIndex, CM_DEFENSIVE)
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
AND NOT IS_ENTITY_DEAD(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
SET_PED_DEFENSIVE_SPHERE_ATTACHED_TO_VEHICLE(psStreetCopCar2Cops[0].PedIndex, vsStreetCopCars[COPCAR_STREET_2].VehicleIndex, << 0.0, 0.0, 0.0>>, 10.0)
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(psStreetCopCar2Cops[0].PedIndex, 150.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psStreetCopCar2Cops[0].PedIndex, FALSE)
psStreetCopCar2Cops[0].bHasTask = TRUE
ENDIF
IF ( psLamar.bFleeing)
psStreetCopCar2Cops[0].iProgress++
psStreetCopCar2Cops[0].bHasTask = FALSE
ENDIF
BREAK
CASE 1
IF ( psStreetCopCar2Cops[0].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar2Cops[0].PedIndex, CA_CAN_FLANK, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar2Cops[0].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar2Cops[0].PedIndex, CA_CAN_CHASE_TARGET_ON_FOOT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar2Cops[0].PedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar2Cops[0].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar2Cops[0].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_TARGET_LOSS_RESPONSE(psStreetCopCar2Cops[0].PedIndex, TLR_SEARCH_FOR_TARGET)
REMOVE_PED_DEFENSIVE_AREA(psStreetCopCar2Cops[0].PedIndex)
SET_PED_COMBAT_MOVEMENT(psStreetCopCar2Cops[0].PedIndex, CM_WILLADVANCE)
psStreetCopCar2Cops[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDIF
IF IS_ENTITY_DEAD(psStreetCopCar2Cops[0].PedIndex)
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
REMOVE_VEHICLE_RECORDING(vsStreetCopCars[COPCAR_STREET_2].iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psStreetCopCar2Cops[1].PedIndex)
IF NOT IS_ENTITY_DEAD(psStreetCopCar2Cops[1].PedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psStreetCopCar2Cops[1].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(psStreetCopCar2Cops[1].eState), 1.25)
ENDIF
psStreetCopCar2Cops[1].sDebugName = "StreetCopCar2Cop 1"
#ENDIF
SWITCH psStreetCopCar2Cops[1].eState
CASE PED_STATE_RECORDING_PLAYBACK
IF ( psStreetCopCar2Cops[1].bHasTask = FALSE )
GIVE_WEAPON_TO_PED(psStreetCopCar2Cops[1].PedIndex, WEAPONTYPE_PUMPSHOTGUN, INFINITE_AMMO)
psStreetCopCar2Cops[1].bHasTask = TRUE
ENDIF
IF ( psStreetCopCar2Cops[1].bHasTask = TRUE )
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
IF GET_TIME_POSITION_IN_RECORDING(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex) > 8750.0
GO_TO_PED_STATE(psStreetCopCar2Cops[1], PED_STATE_COMBAT_ON_FOOT)
ENDIF
ELSE
psStreetCopCar2Cops[1].iProgress = 0
GO_TO_PED_STATE(psStreetCopCar2Cops[1], PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
SWITCH psStreetCopCar2Cops[1].iProgress
CASE 0
IF ( psStreetCopCar2Cops[1].bHasTask = FALSE )
GIVE_WEAPON_TO_PED(psStreetCopCar2Cops[1].PedIndex, WEAPONTYPE_PUMPSHOTGUN, INFINITE_AMMO)
SET_PED_ACCURACY(psStreetCopCar2Cops[1].PedIndex, 1)
SET_PED_SHOOT_RATE(psStreetCopCar2Cops[1].PedIndex, 90)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar2Cops[1].PedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar2Cops[1].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar2Cops[1].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_TARGET_LOSS_RESPONSE(psStreetCopCar2Cops[1].PedIndex, TLR_SEARCH_FOR_TARGET)
SET_PED_COMBAT_MOVEMENT(psStreetCopCar2Cops[1].PedIndex, CM_DEFENSIVE)
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
AND NOT IS_ENTITY_DEAD(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
SET_PED_DEFENSIVE_SPHERE_ATTACHED_TO_VEHICLE(psStreetCopCar2Cops[1].PedIndex, vsStreetCopCars[COPCAR_STREET_2].VehicleIndex, << 0.0, 0.0, 0.0>>, 10.0)
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(psStreetCopCar2Cops[1].PedIndex, 150.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psStreetCopCar2Cops[1].PedIndex, FALSE)
psStreetCopCar2Cops[1].bHasTask = TRUE
ENDIF
IF ( psLamar.bFleeing)
psStreetCopCar2Cops[1].iProgress++
psStreetCopCar2Cops[1].bHasTask = FALSE
ENDIF
BREAK
CASE 1
IF ( psStreetCopCar2Cops[1].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar2Cops[1].PedIndex, CA_CAN_FLANK, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar2Cops[1].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar2Cops[1].PedIndex, CA_CAN_CHASE_TARGET_ON_FOOT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar2Cops[1].PedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar2Cops[1].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar2Cops[1].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_TARGET_LOSS_RESPONSE(psStreetCopCar2Cops[1].PedIndex, TLR_SEARCH_FOR_TARGET)
REMOVE_PED_DEFENSIVE_AREA(psStreetCopCar2Cops[1].PedIndex)
SET_PED_COMBAT_MOVEMENT(psStreetCopCar2Cops[1].PedIndex, CM_WILLADVANCE)
psStreetCopCar2Cops[1].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDIF
ENDIF
///COP CAR 3
IF DOES_ENTITY_EXIST(psStreetCopCar3Cops[0].PedIndex)
IF NOT IS_ENTITY_DEAD(psStreetCopCar3Cops[0].PedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_VEHICLE_RECORDING_INFO(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex, 1.0)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psStreetCopCar3Cops[0].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(psStreetCopCar3Cops[0].eState), 1.25)
ENDIF
psStreetCopCar3Cops[0].sDebugName = "StreetCopCar3Cop 0"
#ENDIF
SWITCH psStreetCopCar3Cops[0].eState
CASE PED_STATE_RECORDING_PLAYBACK
IF ( psStreetCopCar3Cops[0].bHasTask = FALSE )
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex, vsStreetCopCars[COPCAR_STREET_3].iRecordingNumber, sVehicleRecordingsFile)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex)
SET_PLAYBACK_SPEED(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex, 1.25)
ELSE
GIVE_WEAPON_TO_PED(psStreetCopCar3Cops[0].PedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO)
SET_PED_ACCURACY(psStreetCopCar3Cops[0].PedIndex, 1)
psStreetCopCar3Cops[0].bHasTask = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF ( psStreetCopCar3Cops[0].bHasTask = TRUE )
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex)
IF GET_TIME_POSITION_IN_RECORDING(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex) > 8000.0
STOP_PLAYBACK_RECORDED_VEHICLE(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex)
REMOVE_VEHICLE_RECORDING(vsStreetCopCars[COPCAR_STREET_3].iRecordingNumber, sVehicleRecordingsFile)
psStreetCopCar3Cops[0].iProgress = 0
GO_TO_PED_STATE(psStreetCopCar3Cops[0], PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
SWITCH psStreetCopCar3Cops[0].iProgress
CASE 0
IF ( psStreetCopCar3Cops[0].bHasTask = FALSE )
GIVE_WEAPON_TO_PED(psStreetCopCar3Cops[0].PedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO)
SET_PED_ACCURACY(psStreetCopCar3Cops[0].PedIndex, 1)
SET_PED_SHOOT_RATE(psStreetCopCar3Cops[0].PedIndex, 90)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar3Cops[0].PedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar3Cops[0].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar3Cops[0].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_TARGET_LOSS_RESPONSE(psStreetCopCar3Cops[0].PedIndex, TLR_SEARCH_FOR_TARGET)
SET_PED_COMBAT_MOVEMENT(psStreetCopCar3Cops[0].PedIndex, CM_DEFENSIVE)
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex)
AND NOT IS_ENTITY_DEAD(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex)
SET_PED_DEFENSIVE_SPHERE_ATTACHED_TO_VEHICLE(psStreetCopCar3Cops[0].PedIndex, vsStreetCopCars[COPCAR_STREET_3].VehicleIndex, << 0.0, 0.0, 0.0>>, 10.0)
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(psStreetCopCar3Cops[0].PedIndex, 150.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psStreetCopCar3Cops[0].PedIndex, FALSE)
psStreetCopCar3Cops[0].bHasTask = TRUE
ENDIF
IF ( psLamar.bFleeing)
psStreetCopCar3Cops[0].iProgress++
psStreetCopCar3Cops[0].bHasTask = FALSE
ENDIF
BREAK
CASE 1
IF ( psStreetCopCar3Cops[0].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar3Cops[0].PedIndex, CA_CAN_FLANK, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar3Cops[0].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar3Cops[0].PedIndex, CA_CAN_CHASE_TARGET_ON_FOOT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar3Cops[0].PedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar3Cops[0].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar3Cops[0].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_TARGET_LOSS_RESPONSE(psStreetCopCar3Cops[0].PedIndex, TLR_SEARCH_FOR_TARGET)
REMOVE_PED_DEFENSIVE_AREA(psStreetCopCar3Cops[0].PedIndex)
SET_PED_COMBAT_MOVEMENT(psStreetCopCar3Cops[0].PedIndex, CM_WILLADVANCE)
psStreetCopCar3Cops[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDIF
IF IS_ENTITY_DEAD(psStreetCopCar3Cops[0].PedIndex)
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex)
REMOVE_VEHICLE_RECORDING(vsStreetCopCars[COPCAR_STREET_3].iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psStreetCopCar3Cops[1].PedIndex)
IF NOT IS_ENTITY_DEAD(psStreetCopCar3Cops[1].PedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psStreetCopCar3Cops[1].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(psStreetCopCar3Cops[1].eState), 1.25)
ENDIF
psStreetCopCar3Cops[1].sDebugName = "StreetCopCar3Cop 1"
#ENDIF
SWITCH psStreetCopCar3Cops[1].eState
CASE PED_STATE_RECORDING_PLAYBACK
IF ( psStreetCopCar3Cops[1].bHasTask = FALSE )
GIVE_WEAPON_TO_PED(psStreetCopCar3Cops[1].PedIndex, WEAPONTYPE_PUMPSHOTGUN, INFINITE_AMMO)
psStreetCopCar3Cops[1].bHasTask = TRUE
ENDIF
IF ( psStreetCopCar3Cops[1].bHasTask = TRUE )
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex)
IF GET_TIME_POSITION_IN_RECORDING(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex) > 7500.0
GO_TO_PED_STATE(psStreetCopCar3Cops[1], PED_STATE_COMBAT_ON_FOOT)
ENDIF
ELSE
psStreetCopCar3Cops[1].iProgress = 0
GO_TO_PED_STATE(psStreetCopCar3Cops[1], PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
SWITCH psStreetCopCar3Cops[1].iProgress
CASE 0
IF ( psStreetCopCar3Cops[1].bHasTask = FALSE )
GIVE_WEAPON_TO_PED(psStreetCopCar3Cops[1].PedIndex, WEAPONTYPE_PUMPSHOTGUN, INFINITE_AMMO)
SET_PED_ACCURACY(psStreetCopCar3Cops[1].PedIndex, 1)
SET_PED_SHOOT_RATE(psStreetCopCar3Cops[1].PedIndex, 90)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar3Cops[1].PedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar3Cops[1].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar3Cops[1].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_TARGET_LOSS_RESPONSE(psStreetCopCar3Cops[1].PedIndex, TLR_SEARCH_FOR_TARGET)
SET_PED_COMBAT_MOVEMENT(psStreetCopCar3Cops[1].PedIndex, CM_DEFENSIVE)
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex)
AND NOT IS_ENTITY_DEAD(vsStreetCopCars[COPCAR_STREET_3].VehicleIndex)
SET_PED_DEFENSIVE_SPHERE_ATTACHED_TO_VEHICLE(psStreetCopCar3Cops[1].PedIndex, vsStreetCopCars[COPCAR_STREET_3].VehicleIndex, << 0.0, 0.0, 0.0>>, 10.0)
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(psStreetCopCar3Cops[1].PedIndex, 150.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psStreetCopCar3Cops[1].PedIndex, FALSE)
psStreetCopCar3Cops[1].bHasTask = TRUE
ENDIF
IF ( psLamar.bFleeing)
psStreetCopCar3Cops[1].iProgress++
psStreetCopCar3Cops[1].bHasTask = FALSE
ENDIF
BREAK
CASE 1
IF ( psStreetCopCar3Cops[1].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar3Cops[1].PedIndex, CA_CAN_FLANK, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar3Cops[1].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar3Cops[1].PedIndex, CA_CAN_CHASE_TARGET_ON_FOOT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar3Cops[1].PedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar3Cops[1].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(psStreetCopCar3Cops[1].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_TARGET_LOSS_RESPONSE(psStreetCopCar3Cops[1].PedIndex, TLR_SEARCH_FOR_TARGET)
REMOVE_PED_DEFENSIVE_AREA(psStreetCopCar3Cops[1].PedIndex)
SET_PED_COMBAT_MOVEMENT(psStreetCopCar3Cops[1].PedIndex, CM_WILLADVANCE)
psStreetCopCar3Cops[1].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDIF
ENDIF
IF ( bCopConversationsAllowed = TRUE )
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_COP1")
IF GET_GAME_TIMER() - iCopConversationTimer > 0
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
PED_INDEX ClosestCopPedIndex
ClosestCopPedIndex = GET_PED_CLOSEST_PED_FROM_RELATIONSHIP_GROUP(PLAYER_PED_ID(), RELGROUPHASH_COP, 1)
IF DOES_ENTITY_EXIST(ClosestCopPedIndex)
IF NOT IS_ENTITY_DEAD(ClosestCopPedIndex)
AND NOT IS_PED_IN_WRITHE(ClosestCopPedIndex)
AND NOT IS_PED_DEAD_OR_DYING(ClosestCopPedIndex)
AND NOT IS_PED_IN_ANY_VEHICLE(ClosestCopPedIndex)
AND NOT IS_AMBIENT_SPEECH_PLAYING(ClosestCopPedIndex)
AND NOT IS_SCRIPTED_SPEECH_PLAYING(ClosestCopPedIndex)
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), ClosestCopPedIndex) < 50.0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
REMOVE_PED_FOR_DIALOGUE(sFranklin1Conversation, 8)
ADD_PED_FOR_DIALOGUE(sFranklin1Conversation, 8, ClosestCopPedIndex, "FRA1POLICE1")
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COP1", CONV_PRIORITY_MEDIUM)
iCopConversationCounter++
iCopConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7500, 10500)
IF ( iCopConversationCounter >= 4 )
SET_LABEL_AS_TRIGGERED("F1_COP1", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
CLEANUP_PED_GROUP(psStreetCopCar1Cops, FALSE, TRUE, FALSE)
CLEANUP_PED_GROUP(psStreetCopCar2Cops, FALSE, TRUE, FALSE)
CLEANUP_PED_GROUP(psStreetCopCar3Cops, FALSE, TRUE, FALSE)
ENDIF
ENDPROC
// these guys spawn if X cops are dead or after Y time
// they just add to the existing cops parked on the street to make it more menacing @BSW
PROC MANAGE_COP_REINFORCEMENTS()
IF Events[EVENT_COPS_ARRIVE]
IF NOT Events[EVENT_COPS_REINFORCEMENTS_SPAWNED]
IF SHOULD_COP_REINFORCEMENTS_SPAWN()
bShouldAlliesWaitForPlayer = FALSE
REQUEST_MODEL(mnCop)
REQUEST_MODEL(vsStreetCopCars[COPCAR_STREET_4].ModelName)
REQUEST_MODEL(vsStreetCopCars[COPCAR_STREET_5].ModelName)
REQUEST_VEHICLE_RECORDING(vsStreetCopCars[COPCAR_STREET_4].iRecordingNumber, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(vsStreetCopCars[COPCAR_STREET_5].iRecordingNumber, sVehicleRecordingsFile)
IF HAS_MODEL_LOADED(mnCop)
AND HAS_MODEL_LOADED(vsStreetCopCars[COPCAR_STREET_4].ModelName)
AND HAS_MODEL_LOADED(vsStreetCopCars[COPCAR_STREET_5].ModelName)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsStreetCopCars[COPCAR_STREET_4].iRecordingNumber, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsStreetCopCars[COPCAR_STREET_5].iRecordingNumber, sVehicleRecordingsFile)
vsStreetCopCars[COPCAR_STREET_4].VehicleIndex = CREATE_ENEMY_VEHICLE(vsStreetCopCars[COPCAR_STREET_4], 1000, FALSE)
vsStreetCopCars[COPCAR_STREET_5].VehicleIndex = CREATE_ENEMY_VEHICLE(vsStreetCopCars[COPCAR_STREET_5], 1000, FALSE)
SET_VEHICLE_SIREN(vsStreetCopCars[COPCAR_STREET_4].VehicleIndex, TRUE)
SET_VEHICLE_SIREN(vsStreetCopCars[COPCAR_STREET_5].VehicleIndex, TRUE)
// peds
esPoliceCarEndReinforcements[0].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsStreetCopCars[COPCAR_STREET_4].VehicleIndex, PEDTYPE_COP, mnCop, VS_DRIVER)
esPoliceCarEndReinforcements[1].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsStreetCopCars[COPCAR_STREET_4].VehicleIndex, PEDTYPE_COP, mnCop, VS_FRONT_RIGHT)
esPoliceCarEndReinforcements[2].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsStreetCopCars[COPCAR_STREET_5].VehicleIndex, PEDTYPE_COP, mnCop, VS_DRIVER)
esPoliceCarEndReinforcements[3].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsStreetCopCars[COPCAR_STREET_5].VehicleIndex, PEDTYPE_COP, mnCop, VS_FRONT_RIGHT)
GIVE_WEAPON_TO_PED(esPoliceCarEndReinforcements[0].PedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO)
GIVE_WEAPON_TO_PED(esPoliceCarEndReinforcements[1].PedIndex, WEAPONTYPE_PUMPSHOTGUN, INFINITE_AMMO)
GIVE_WEAPON_TO_PED(esPoliceCarEndReinforcements[2].PedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO)
GIVE_WEAPON_TO_PED(esPoliceCarEndReinforcements[3].PedIndex, WEAPONTYPE_PUMPSHOTGUN, INFINITE_AMMO)
SET_PED_TARGET_LOSS_RESPONSE(esPoliceCarEndReinforcements[0].PedIndex, TLR_SEARCH_FOR_TARGET)
SET_PED_TARGET_LOSS_RESPONSE(esPoliceCarEndReinforcements[1].PedIndex, TLR_SEARCH_FOR_TARGET)
SET_PED_TARGET_LOSS_RESPONSE(esPoliceCarEndReinforcements[2].PedIndex, TLR_SEARCH_FOR_TARGET)
SET_PED_TARGET_LOSS_RESPONSE(esPoliceCarEndReinforcements[3].PedIndex, TLR_SEARCH_FOR_TARGET)
SET_PED_ACCURACY(esPoliceCarEndReinforcements[0].PedIndex, 1)
SET_PED_ACCURACY(esPoliceCarEndReinforcements[1].PedIndex, 1)
SET_PED_ACCURACY(esPoliceCarEndReinforcements[2].PedIndex, 1)
SET_PED_ACCURACY(esPoliceCarEndReinforcements[3].PedIndex, 1)
INITIALISE_ENEMY_GROUP(esPoliceCarEndReinforcements, FALSE)
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vsStreetCopCars[COPCAR_STREET_4], sVehicleRecordingsFile, 1.0)
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vsStreetCopCars[COPCAR_STREET_5], sVehicleRecordingsFile, 1.0)
SET_MODEL_AS_NO_LONGER_NEEDED(vsStreetCopCars[COPCAR_STREET_4].ModelName)
SET_MODEL_AS_NO_LONGER_NEEDED(vsStreetCopCars[COPCAR_STREET_5].ModelName)
SET_MODEL_AS_NO_LONGER_NEEDED(mnCop)
INITIALISE_SPAWNPOINTS(EnemySpawnpoints, 7)
INITIALISE_SPAWNPOINTS(EnemySidekickSpawnpoints, 7)
Events[EVENT_COPS_REINFORCEMENTS_SPAWNED] = TRUE
ENDIF
ENDIF
ELSE
VEHICLE_INDEX defendCar = vsStreetCopCars[COPCAR_STREET_4].VehicleIndex
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_1].VehicleIndex)
defendCar = vsStreetCopCars[COPCAR_STREET_1].VehicleIndex
ELIF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_2].VehicleIndex)
defendCar = vsStreetCopCars[COPCAR_STREET_2].VehicleIndex
ENDIF
//reinforce1
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_4].VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vsStreetCopCars[COPCAR_STREET_4].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsStreetCopCars[COPCAR_STREET_4].VehicleIndex)
//if the driver is killed
IF IS_PED_INJURED(esPoliceCarEndReinforcements[0].PedIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vsStreetCopCars[COPCAR_STREET_4].VehicleIndex)
ENDIF
IF GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(vsStreetCopCars[COPCAR_STREET_4].VehicleIndex) > 95.0
STOP_PLAYBACK_RECORDED_VEHICLE(vsStreetCopCars[COPCAR_STREET_4].VehicleIndex)
REMOVE_VEHICLE_RECORDING(vsStreetCopCars[COPCAR_STREET_4].iRecordingNumber, sVehicleRecordingsFile)
COMBAT_SEQUENCE_EXIT_VEHICLE_THEN_DEFEND(esPoliceCarEndReinforcements[0].PedIndex, defendCar, <<0.0, 0.0, 0.0>>)
COMBAT_SEQUENCE_EXIT_VEHICLE_THEN_DEFEND(esPoliceCarEndReinforcements[1].PedIndex, defendCar, <<0.0, 0.0, 0.0>>)
ENDIF
ENDIF
ENDIF
//reinforce2
IF DOES_ENTITY_EXIST(vsStreetCopCars[COPCAR_STREET_5].VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vsStreetCopCars[COPCAR_STREET_5].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsStreetCopCars[COPCAR_STREET_5].VehicleIndex)
//if the driver is killed
IF IS_PED_INJURED(esPoliceCarEndReinforcements[2].PedIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vsStreetCopCars[COPCAR_STREET_5].VehicleIndex)
ENDIF
IF GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(vsStreetCopCars[COPCAR_STREET_5].VehicleIndex) > 95.0
STOP_PLAYBACK_RECORDED_VEHICLE(vsStreetCopCars[COPCAR_STREET_5].VehicleIndex)
REMOVE_VEHICLE_RECORDING(vsStreetCopCars[COPCAR_STREET_5].iRecordingNumber, sVehicleRecordingsFile)
COMBAT_SEQUENCE_EXIT_VEHICLE_THEN_DEFEND(esPoliceCarEndReinforcements[2].PedIndex, defendCar, <<0.0, 0.0, 0.0>>)
COMBAT_SEQUENCE_EXIT_VEHICLE_THEN_DEFEND(esPoliceCarEndReinforcements[3].PedIndex, defendCar, <<0.0, 0.0, 0.0>>)
ENDIF
ENDIF
ENDIF
INT i
FOR i = 0 TO ( COUNT_OF(EnemySpawnpoints) - 1 )
UPDATE_SPAWNPOINT(EnemySpawnpoints[i], TRUE)
UPDATE_SPAWNPOINT(EnemySidekickSpawnpoints[i], TRUE)
ENDFOR
ENDIF
ENDIF
ENDPROC
PROC MANAGE_PARKED_VEHICLES()
INT i
FOR i = 0 TO ( COUNT_OF(vsParkedVehicles) - 1 )
RUN_VEHICLE_TYRE_BURST_CHECK(vsParkedVehicles[i].VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT, <<-0.85, 1.55, -0.15>>, 2.0, FALSE, TRUE,
<<-0.85, 2.15, 0.15>>, 100, 100 #IF IS_DEBUG_BUILD, bDrawDebugVehicleDamageInfo #ENDIF)
RUN_VEHICLE_TYRE_BURST_CHECK(vsParkedVehicles[i].VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT, <<0.85, 1.55, -0.15>>, 2.0, FALSE, TRUE,
<<1.0, 0.95, 0.15>>, 100, 100 #IF IS_DEBUG_BUILD, bDrawDebugVehicleDamageInfo #ENDIF)
RUN_VEHICLE_TYRE_BURST_CHECK(vsParkedVehicles[i].VehicleIndex, SC_WHEEL_CAR_REAR_LEFT, <<-0.85, -1.55, -0.15>>, 2.0, FALSE, TRUE,
<<-1.0, -2.1, 0.15>>, 100, 100 #IF IS_DEBUG_BUILD, bDrawDebugVehicleDamageInfo #ENDIF)
RUN_VEHICLE_TYRE_BURST_CHECK(vsParkedVehicles[i].VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT, <<0.85, -1.55, -0.15>> , 2.0, FALSE, TRUE,
<<0.95, -2.15, 0.15>>, 100, 100 #IF IS_DEBUG_BUILD, bDrawDebugVehicleDamageInfo #ENDIF)
UPDATE_VEHICLE_FOR_DAMAGE(vsParkedVehicles[i].VehicleIndex, 100 #IF IS_DEBUG_BUILD, bDrawDebugVehicleDamageInfo #ENDIF)
ENDFOR
ENDPROC
PROC START_SPEEDOPHILE_CUTSCENE_RECORDING(PED_SPEEDOPHILE thisSpeedophile)
IF thisSpeedophile < MAX_SPEEDOPHILES
SET_BOAT_ANCHOR(vsSpeedophiles[thisSpeedophile].VehicleIndex, FALSE)
START_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[thisSpeedophile].VehicleIndex, vsSpeedophiles[thisSpeedophile].iRecordingNumber, sVehicleRecordingsFile)
SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(vsSpeedophiles[thisSpeedophile].VehicleIndex, << 1.0, 0.0, 0.0 >>)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[thisSpeedophile].VehicleIndex, 1000)
SET_PLAYBACK_SPEED(vsSpeedophiles[thisSpeedophile].VehicleIndex, 1.15)
ENDIF
ENDPROC
FUNC FLOAT GET_DISTANCE_BETWEEN_ENTITY_AND_COORDS(ENTITY_INDEX EntityIndex, VECTOR vPosition)
IF DOES_ENTITY_EXIST(EntityIndex)
IF NOT IS_ENTITY_DEAD(EntityIndex)
RETURN VDIST2(vPosition, GET_ENTITY_COORDS(EntityIndex))
ENDIF
ENDIF
RETURN -1.0
ENDFUNC
PROC RUN_MISSION_OBJECT_CLEANUP_CHECK(INT &iProgress)
SWITCH iProgress
CASE 0
IF ARE_ALL_PEDS_IN_ANGLED_AREA_LOCATE(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), psLamar.PedIndex,
<<31.568884,-1875.895630,20.774818>>, <<-27.926706,-1827.226196,28.930943>>, 48.0)
CLEANUP_MISSION_OBJECT(osDumpsters[0])
CLEANUP_MISSION_OBJECT(osDumpsters[1])
CLEANUP_MISSION_OBJECT(osDumpsters[2])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling first shootout cleanup.")
#ENDIF
iProgress++
ENDIF
BREAK
CASE 1
IF ARE_ALL_PEDS_IN_ANGLED_AREA_LOCATE(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), psLamar.PedIndex,
<<16.508175,-1865.456177,21.567459>>, <<-39.960506,-1818.817017,29.483551>>, 48.0)
CLEANUP_MISSION_OBJECT(osDumpsters[3])
CLEANUP_MISSION_OBJECT(osDumpsters[4])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling second shootout cleanup.")
#ENDIF
iProgress++
ENDIF
BREAK
CASE 2
IF ARE_ALL_PEDS_IN_ANGLED_AREA_LOCATE(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), psLamar.PedIndex,
<<-1.201015,-1851.073730,22.528681>>, <<-39.960506,-1818.817017,29.483551>>, 56.0)
CLEANUP_MISSION_OBJECT_GROUP(osDumpsters)
CLEANUP_VEHICLE_GROUP(vsEnemyCars, FALSE, FALSE)
CLEANUP_VEHICLE_GROUP(vsParkedVehicles, FALSE, FALSE)
CLEANUP_VEHICLE(vsVan, FALSE, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling third shootout cleanup.")
#ENDIF
iProgress++
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_PORCH_ENEMY(INT &iProgress)
SWITCH iProgress
CASE 0
IF IS_ANY_PED_IN_ANGLED_AREA_LOCATE(psLamar.PedIndex, GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR),
<<58.927086,-1922.503174,19.639235>>, <<78.294182,-1898.679810,23.840998>>, 20.0)
iProgress++
ENDIF
BREAK
CASE 1
esPorchEnemies[0].PedIndex = CREATE_ENEMY_PED(mnBalla, <<45.6679, -1922.8232, 20.5738>>, 316.8530, rgEnemies, WEAPONTYPE_CARBINERIFLE, 200)
INITIALISE_ENEMY_GROUP(esPorchEnemies, FALSE #IF IS_DEBUG_BUILD, "Porch " #ENDIF)
COMBAT_SEQUENCE_GO_TO_COVER_THEN_COMBAT(esPorchEnemies[0].PedIndex, csCoverpoints[62].vPosition, PEDMOVE_RUN, 3000, TRUE, TRUE, TRUE, 200.0)
SET_PED_COMBAT_PROPERTIES(esPorchEnemies[0].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER)
SET_PED_DEFENSIVE_AREA_ANGLED(esPorchEnemies[0].PedIndex, <<52.302341,-1920.344116,19.573799>>, <<50.694172,-1919.029419,23.573799>>, 2.5, FALSE)
SET_PED_COVER_PROPERTIES(esPorchEnemies[0].PedIndex, TRUE, TRUE, FALSE, FALSE, 12.0, FALSE, 0.0, 5.0, 6.0)
SET_PED_SHOOTING_PROPERTIES(esPorchEnemies[0].PedIndex, 8, 150, FIRING_PATTERN_FULL_AUTO)
iProgress++
BREAK
CASE 2
CLEANUP_ENEMY_GROUP(esPorchEnemies, FALSE, TRUE, FALSE)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esPorchEnemies, bRenderEnemyBlips)
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL IS_MISSION_STAGE_GROVE_STREET_SHOOTOUT_COMPLETED(INT &iStageProgress)
IF NOT IS_ENTITY_DEAD(GET_PED_INDEX(CHAR_TREVOR))
psTrevor.fDistanceToCoord = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_TREVOR)), vGroveStreetStart)
ENDIF
IF NOT IS_ENTITY_DEAD(GET_PED_INDEX(CHAR_FRANKLIN))
psFranklin.fDistanceToCoord = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN)), vGroveStreetStart)
ENDIF
REQUEST_WEAPON_ASSET(WEAPONTYPE_SMG)
REQUEST_WEAPON_ASSET(WEAPONTYPE_PISTOL)
REQUEST_WEAPON_ASSET(WEAPONTYPE_MICROSMG)
CLEANUP_VEHICLE_GROUP(vsEnemyCars)
RUN_EVENTS_CHECK()
MANAGE_CHOP_DURING_SHOOTOUT(psChop)
MANAGE_LAMAR_IN_GROVE_STREET(psLamar, PLAYER_PED_ID())
MANAGE_OTHER_PLAYER_PED_IN_GROVE_STREET(GET_OTHER_PLAYER_PED_INDEX(), psTrevor, PLAYER_PED_ID())
MANAGE_CONVERSATIONS_DURING_SHOOTOUT(iConversationProgress)
RUN_MISSION_OBJECT_CLEANUP_CHECK(iShootoutCleanupProgress)
UPDATE_COVERPOINTS_ACTIVE_STATE_FOR_PEDS(psFranklin.fDistanceToCoord, psTrevor.fDistanceToCoord, csCoverpoints)
MANAGE_FILM_CREW_PEDS_BEFORE_JACK(psFilmCrew[FCP_CLAY].iProgress)
MANAGE_PARKED_VEHICLES()
MANAGE_ENEMY_CARS_AT_INTERSECTION()
MANAGE_FIRST_ENEMY_WAVE(Events[EVENT_ENEMY_WAVE_1_SPAWNED], bFirstEnemyGroupInitialised)
MANAGE_SECOND_ENEMY_WAVE(Events[EVENT_ENEMY_WAVE_2_SPAWNED], Events[EVENT_ENEMY_WAVE_1_SPAWNED])
MANAGE_3RD_ENEMY_WAVE(Events[EVENT_ENEMY_WAVE_3_SPAWNED], Events[EVENT_ENEMY_WAVE_2_SPAWNED])
MANAGE_CAR_PULLING_OUT(vsEnemyCars[CAR_DRIVEWAY].iProgress)
MANAGE_PORCH_ENEMY(esPorchEnemies[0].iProgress)
MANAGE_HOUSE_ENEMY(esHouseEnemies[0].iProgress)
MANAGE_4TH_ENEMY_WAVE(Events[EVENT_ENEMY_WAVE_4_SPAWNED], Events[EVENT_ENEMY_WAVE_3_SPAWNED])
MANAGE_5TH_ENEMY_WAVE()
MANAGE_6TH_ENEMY_WAVE(Events[EVENT_ENEMY_WAVE_6_SPAWNED], Events[EVENT_ENEMY_WAVE_5_SPAWNED], 2)
MANAGE_SPAWNER_PEDS()
MANAGE_COP_WAVE(Events[EVENT_COPS_SPAWNED])
MANAGE_COP_REINFORCEMENTS()
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF NOT HAS_LABEL_BEEN_TRIGGERED("FRA1_SCTLT")
IF NOT IS_PED_INJURED(psLamar.PedIndex)
IF ( GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psLamar.PedIndex) > 50 )
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
PRINT_GOD_TEXT_ADVANCED("FRA1_SCTLT", DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE CHAR_TREVOR
IF NOT HAS_LABEL_BEEN_TRIGGERED("FRA1_SCTLF")
IF NOT IS_PED_INJURED(psLamar.PedIndex)
IF ( GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psLamar.PedIndex) > 50 )
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
PRINT_GOD_TEXT_ADVANCED("FRA1_SCTLF", DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
RUN_VEHICLE_TYRE_BURST_CHECK(vsVan.VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT, <<0.8, 1.5, -0.5>>, 1.25, FALSE, TRUE, <<0.85, 2.2, 0.25>>, 150, 150)
RUN_VEHICLE_TYRE_BURST_CHECK(vsVan.VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT, <<1.0, -1.6, -0.5>>, 1.25, FALSE, TRUE, <<0.9, -2.5, 0.25>>, 150, 150)
RUN_VEHICLE_TYRE_BURST_CHECK(vsVan.VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT, <<-0.8, 1.55, -0.5>>, 2.0, FALSE, TRUE, <<-0.85, 2.2, 0.25>>, 150, 150)
RUN_VEHICLE_TYRE_BURST_CHECK(vsVan.VehicleIndex, SC_WHEEL_CAR_REAR_LEFT, <<-1.0, -1.6, -0.5>>, 2.0, FALSE, TRUE, <<-0.9, -2.5, 0.25>>, 150, 150)
IF NOT HAS_LABEL_BEEN_TRIGGERED("FRA1_ESCGSF")
AND NOT HAS_LABEL_BEEN_TRIGGERED("FRA1_ESCGST")
IF HAS_LABEL_BEEN_TRIGGERED("F1_GSESCG")
AND HAS_LABEL_BEEN_TRIGGERED("F1_GSVIW")
IF NOT IS_PLAYER_SWITCH_IN_PROGRESS()
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
PRINT_GOD_TEXT_ADVANCED("FRA1_ESCGSF", DEFAULT_GOD_TEXT_TIME, TRUE)
BREAK
CASE CHAR_TREVOR
PRINT_GOD_TEXT_ADVANCED("FRA1_ESCGST", DEFAULT_GOD_TEXT_TIME, TRUE)
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
SWITCH iStageProgress
CASE 0 //shootout setup
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsVan.VehicleIndex)
ACTIVATE_PHYSICS(vsVan.VehicleIndex)
SET_ENTITY_DYNAMIC(vsVan.VehicleIndex, TRUE)
SMASH_VEHICLE_WINDOW(vsVan.VehicleIndex, SC_WINDOW_FRONT_LEFT) //visually damage the van
SET_VEHICLE_TYRE_BURST(vsVan.VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT)
SET_VEHICLE_TYRE_BURST(vsVan.VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT)
SET_VEHICLE_TYRE_BURST(vsVan.VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT)
SET_VEHICLE_ENGINE_HEALTH(vsVan.VehicleIndex, 50.0) //set engine health and block other peds from blowing up the van
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(vsVan.VehicleIndex, TRUE)
ENDIF
iStageProgress++
BREAK
CASE 1
IF ( bFirstEnemyGroupInitialised = TRUE )
Events[EVENT_SHOOTOUT_STARTED] = TRUE
iStageProgress++
ENDIF
BREAK
CASE 2
IF ( Events[EVENT_COPS_ARRIVE] = TRUE )
iStageProgress++
ENDIF
BREAK
CASE 3
IF NOT HAS_LABEL_BEEN_TRIGGERED(sLabelFLAMAR)
IF HAS_LABEL_BEEN_TRIGGERED("F1_LEFT")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
IF IS_PED_IN_PED_STATE(psLamar, PED_STATE_RUNNING_TO_ALLEY)
OR IS_PED_IN_PED_STATE(psLamar, PED_STATE_WAITING_IN_ALLEY)
OR IS_PED_IN_PED_STATE(psLamar, PED_STATE_RUNNING_TO_RIVER)
PRINT_GOD_TEXT_ADVANCED(sLabelFLAMAR, DEFAULT_GOD_TEXT_TIME, TRUE)
TRIGGER_MUSIC_EVENT("FRA1_FIGHT_LEAVE")
bRenderEnemyBlips = FALSE
bCopConversationsAllowed = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//this check might require a better check in case player does not go through the alley
IF IS_ENTITY_IN_ANGLED_AREA_LOCATE(PLAYER_PED_ID(), <<-46.707905,-1871.813354,21.337345>>, <<-30.788389,-1852.596924,28.817188>>, 24.0)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_RUN_TO_SPEEDOPHILES), "RUN TO SPEEDOPHILES", FALSE)
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_1_SHOOTOUT_MAIN")
STOP_AUDIO_SCENE("FRANKLIN_1_SHOOTOUT_MAIN")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("FRANKLIN_1_APPROACH_RIVER")
START_AUDIO_SCENE("FRANKLIN_1_APPROACH_RIVER")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_1_SHOOTOUT_POLICE_ARRIVE")
STOP_AUDIO_SCENE("FRANKLIN_1_SHOOTOUT_POLICE_ARRIVE")
ENDIF
ENDIF
IF ARE_ALL_PEDS_IN_ANGLED_AREA_LOCATE(GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_FRANKLIN), psLamar.PedIndex,
<<-58.721535,-1894.919189,21.326895>>, <<-86.694153,-1870.268921,-0.703830>>, 34.0)
CLEANUP_SPAWNPOINTS(EnemySpawnpoints, FALSE)
CLEANUP_SPAWNPOINTS(EnemySidekickSpawnpoints, FALSE)
CLEANUP_ENEMY_GROUP(esGroup9, TRUE)
CLEANUP_MISSION_OBJECT(osCokeBlock, FALSE)
ENDIF
IF ( bMusicEventWaterArriveTriggered = FALSE )
IF IS_ANY_PED_IN_ANGLED_AREA_LOCATE(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), psLamar.PedIndex,
<<-183.247894,-1877.746460,-8.911816>>, <<-121.605896,-1804.794434,29.815378>>, 72.0)
IF TRIGGER_MUSIC_EVENT("FRA1_WATER_ARRIVE")
bMusicEventWaterArriveTriggered = TRUE
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, TRUE)
OR IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex, TRUE)
OR IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex, TRUE)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_VEHICLE_NAME)
DISABLE_PLAYER_VEHICLE_CONTROLS_THIS_FRAME()
ENDIF
ENDIF
PREPARE_MUSIC_EVENT("FRA1_SPEED")
//request start seasharks recordings
REQUEST_VEHICLE_RECORDING(911, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(912, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(913, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(921, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(922, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(923, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(931, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(932, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(933, sVehicleRecordingsFile)
//request main seasharks recordings
REQUEST_VEHICLE_RECORDING(SPEEDOPHILE_RECORDING_FRONT, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(SPEEDOPHILE_RECORDING_LEFT, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(SPEEDOPHILE_RECORDING_RIGHT, sVehicleRecordingsFile)
IF (IS_FRIENDLY_PED_IN_ANY_SPEEDOPHILE(GET_PED_INDEX(CHAR_TREVOR))
AND IS_FRIENDLY_PED_IN_ANY_SPEEDOPHILE(GET_PED_INDEX(CHAR_FRANKLIN))
AND IS_FRIENDLY_PED_IN_ANY_SPEEDOPHILE(psLamar.PedIndex))
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(911, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(912, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(913, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(921, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(922, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(923, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(931, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(932, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(933, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(SPEEDOPHILE_RECORDING_FRONT, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(SPEEDOPHILE_RECORDING_LEFT, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(SPEEDOPHILE_RECORDING_RIGHT, sVehicleRecordingsFile)
IF NOT IS_PED_INJURED(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
CLEAR_PED_SECONDARY_TASK(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
ENDIF
//lamar
IF GET_VEHICLE_PED_IS_USING(psLamar.PedIndex) = vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex
psLamar.ePedVehicle = SPEEDOPHILE_1
vsSpeedophiles[SPEEDOPHILE_1].iRecordingNumber = 911
vsSpeedophiles[SPEEDOPHILE_2].iRecordingNumber = 912
vsSpeedophiles[SPEEDOPHILE_3].iRecordingNumber = 913
ELIF GET_VEHICLE_PED_IS_USING(psLamar.PedIndex) = vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex
psLamar.ePedVehicle = SPEEDOPHILE_2
vsSpeedophiles[SPEEDOPHILE_1].iRecordingNumber = 921
vsSpeedophiles[SPEEDOPHILE_2].iRecordingNumber = 922
vsSpeedophiles[SPEEDOPHILE_3].iRecordingNumber = 923
ELIF GET_VEHICLE_PED_IS_USING(psLamar.PedIndex) = vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex
psLamar.ePedVehicle = SPEEDOPHILE_3
vsSpeedophiles[SPEEDOPHILE_1].iRecordingNumber = 931
vsSpeedophiles[SPEEDOPHILE_2].iRecordingNumber = 932
vsSpeedophiles[SPEEDOPHILE_3].iRecordingNumber = 933
ENDIF
GO_TO_PED_STATE(psLamar, PED_STATE_STARTING_RECORDING_PLAYBACK)
//Trevor
IF GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_TREVOR)) = vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex
psTrevor.ePedVehicle = SPEEDOPHILE_1
ELIF GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_TREVOR)) = vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex
psTrevor.ePedVehicle = SPEEDOPHILE_2
ELIF GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_TREVOR)) = vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex
psTrevor.ePedVehicle = SPEEDOPHILE_3
ENDIF
GO_TO_PED_STATE(psTrevor, PED_STATE_STARTING_RECORDING_PLAYBACK)
//Franklin
IF GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_FRANKLIN)) = vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex
psFranklin.ePedVehicle = SPEEDOPHILE_1
ELIF GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_FRANKLIN)) = vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex
psFranklin.ePedVehicle = SPEEDOPHILE_2
ELIF GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_FRANKLIN)) = vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex
psFranklin.ePedVehicle = SPEEDOPHILE_3
ENDIF
GO_TO_PED_STATE(psFranklin, PED_STATE_STARTING_RECORDING_PLAYBACK)
GO_TO_PED_STATE(psFilmCrew[FCP_JACKEDGIRL], PED_STATE_SITTING_IN_VEHICLE)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
CLEAR_HELP()
CLEAR_PRINTS()
//make sure the remaining enemy blips are removed and enemies removed as well
//probably best to remove all enemy groups
CLEANUP_SPAWNPOINTS(EnemySpawnpoints, FALSE)
CLEANUP_SPAWNPOINTS(EnemySidekickSpawnpoints, FALSE)
CLEANUP_ENEMY_GROUP(esGroup9, FALSE, FALSE)
CLEANUP_VEHICLE_GROUP(vsEnemyCars, FALSE, FALSE)
CLEANUP_VEHICLE_GROUP(vsParkedVehicles, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esPoliceCarEndReinforcements, FALSE, FALSE)
CLEANUP_MISSION_OBJECT(osCokeBlock, FALSE)
CLEANUP_ENEMY_GROUP(esCarIntersection1Left, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esCarIntersection1Right, FALSE, FALSE)
CLEANUP_ENEMY_GROUP(esCarIntersection2Left, FALSE, FALSE)
CLEANUP_PED_GROUP(psSwat, TRUE, FALSE, FALSE)
CLEANUP_PED_GROUP(psStreetCopCar1Cops, FALSE, FALSE)
CLEANUP_PED_GROUP(psStreetCopCar2Cops, FALSE, FALSE)
CLEANUP_PED_GROUP(psStreetCopCar3Cops, FALSE, FALSE)
CLEANUP_VEHICLE(vsPoliceHeli, TRUE, FALSE)
CLEANUP_VEHICLE_GROUP(vsStreetCopCars, FALSE, FALSE)
REMOVE_VEHICLE_RECORDING(vsStreetCopCars[COPCAR_STREET_1].iRecordingNumber, sVehicleRecordingsFile)
REMOVE_VEHICLE_RECORDING(vsStreetCopCars[COPCAR_STREET_2].iRecordingNumber, sVehicleRecordingsFile)
REMOVE_VEHICLE_RECORDING(vsStreetCopCars[COPCAR_STREET_3].iRecordingNumber, sVehicleRecordingsFile)
STOP_SOUND(iPhotoShootSoundID)
RELEASE_NAMED_SCRIPT_AUDIO_BANK("SCRIPT\\FRANKLIN_1_CAMERAS")
RELEASE_NAMED_SCRIPT_AUDIO_BANK("SCRIPT\\FRANKLIN_1_GIRLS")
CLEANUP_MISSION_OBJECT_GROUP(osDumpsters, FALSE)
REMOVE_COVERPOINTS(csCoverpoints, bCoverpointsCreated)
//disable peds to be damaged only by player
IF NOT IS_PED_INJURED(GET_OTHER_PLAYER_PED_INDEX())
REMOVE_PED_FROM_GROUP(GET_OTHER_PLAYER_PED_INDEX())
ENDIF
IF NOT IS_PED_INJURED(psLamar.PedIndex)
REMOVE_PED_FROM_GROUP(psLamar.PedIndex)
ENDIF
IF NOT IS_PED_INJURED(psChop.PedIndex)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(psChop.PedIndex, FALSE)
ENDIF
REMOVE_ANIM_DICT("missfra1")
IF ( iPlayerFranklinKills >= 5 AND iPlayerTrevorKills >= 5 )
//INFORM_STAT_FRANKLIN_ONE_5_ENEMIES_KILLED_AS_FRANKLIN_AND_TREVOR()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Awarding mission stat for 5 kills as Franklin and 5 kills as Trevor.")
#ENDIF
ENDIF
TRIGGER_MUSIC_EVENT("FRA1_SPEED")
START_SPEEDOPHILE_CUTSCENE_RECORDING(psFranklin.ePedVehicle)
START_SPEEDOPHILE_CUTSCENE_RECORDING(psTrevor.ePedVehicle)
START_SPEEDOPHILE_CUTSCENE_RECORDING(psLamar.ePedVehicle)
IF NOT DOES_CAM_EXIST(ScriptedCamera)
DESTROY_ALL_CAMS()
ScriptedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
PLAY_CAM_ANIM(ScriptedCamera, "jetski_escape_cam", "missfra1", << -129.73, -1857.22, 0.35 >>, << 0.0, 0.0, 0.0 >>)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
ENDIF
SETTIMERA(0)
bAllowHotSwap = FALSE
SET_SPEEDOPHILE_POSITIONS_IN_INT(g_iFranklin1VehicleChoice, psLamar.ePedVehicle, psFranklin.ePedVehicle, psTrevor.ePedVehicle)
STOP_AUDIO_SCENE("FRANKLIN_1_APPROACH_RIVER")
START_AUDIO_SCENE("FRANKLIN_1_JETSKI_START")
iStageProgress++
ENDIF
ENDIF
BREAK
CASE 4
REQUEST_MODEL(mnBalla)
REQUEST_MODEL(vsEnemyLeftChaseCar.ModelName)
REQUEST_VEHICLE_RECORDING(vsEnemyLeftChaseCar.iRecordingNumber, sVehicleRecordingsFile)
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() //Fix for bug 2189178
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_VEHICLE_NAME)
DISABLE_PLAYER_VEHICLE_CONTROLS_THIS_FRAME()
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCLNCR")
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCLNCR", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCLNCR", TRUE)
ENDIF
ENDIF
IF ( TIMERA() > 3600 )
STOP_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex, SPEEDOPHILE_RECORDING_FRONT, sVehicleRecordingsFile)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex, 6000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex, SPEEDOPHILE_RECORDING_RIGHT, sVehicleRecordingsFile)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex, 6000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex, SPEEDOPHILE_RECORDING_LEFT, sVehicleRecordingsFile)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex, 6000.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex)
REMOVE_VEHICLE_RECORDING(911, sVehicleRecordingsFile)
REMOVE_VEHICLE_RECORDING(912, sVehicleRecordingsFile)
REMOVE_VEHICLE_RECORDING(913, sVehicleRecordingsFile)
REMOVE_VEHICLE_RECORDING(921, sVehicleRecordingsFile)
REMOVE_VEHICLE_RECORDING(922, sVehicleRecordingsFile)
REMOVE_VEHICLE_RECORDING(923, sVehicleRecordingsFile)
REMOVE_VEHICLE_RECORDING(931, sVehicleRecordingsFile)
REMOVE_VEHICLE_RECORDING(932, sVehicleRecordingsFile)
REMOVE_VEHICLE_RECORDING(933, sVehicleRecordingsFile)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex, TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex, TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex, TRUE)
vsSpeedophiles[psLamar.ePedVehicle].iRecordingNumber = SPEEDOPHILE_RECORDING_FRONT
vsSpeedophiles[psTrevor.ePedVehicle].iRecordingNumber = SPEEDOPHILE_RECORDING_RIGHT
vsSpeedophiles[psFranklin.ePedVehicle].iRecordingNumber = SPEEDOPHILE_RECORDING_LEFT
iStageProgress++
ELIF ( TIMERA() > 3300 )
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_BOAT) = CAM_VIEW_MODE_FIRST_PERSON
IF ( bFirstPersonFlashPlayed = FALSE )
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bFirstPersonFlashPlayed = TRUE
ENDIF
ENDIF
ENDIF
BREAK
CASE 5
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DESTROY_ALL_CAMS()
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
REMOVE_ANIM_DICT("missfra1")
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC MANAGE_LAMAR_IN_SPEEDOPHILE(PED_STRUCT &ped, VEH_STRUCT &vehicle, PED_INDEX TargetPedIndex)
IF DOES_ENTITY_EXIST(ped.PedIndex)
AND NOT IS_ENTITY_DEAD(ped.PedIndex)
IF DOES_ENTITY_EXIST(TargetPedIndex)
AND NOT IS_PED_INJURED(TargetPedIndex)
ped.fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(ped.PedIndex, TargetPedIndex) //get distance to player
SET_PED_RESET_FLAG(ped.PedIndex, PRF_DontSuppressUseNavMeshToNavigateToVehicleDoorWhenVehicleInWater, TRUE) //fix for B*2027310
SET_PED_RESET_FLAG(ped.PedIndex, PRF_DisableFriendlyGunReactAudio, TRUE)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE)
DRAW_DEBUG_VEHICLE_RECORDING_INFO(vehicle.VehicleIndex, 1.0)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_STRING_FROM_FLOAT(ped.fDistanceToTargetPed), 1.5)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_STRING_FROM_FLOAT(GET_PED_HEALTH_RATIO(ped.PedIndex)), 1.75)
ENDIF
ped.sDebugName = "Lamar"
#ENDIF
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
vehicle.fPlaybackTime = GET_TIME_POSITION_IN_RECORDING(vehicle.VehicleIndex) //get playback time
ENDIF
ENDIF
ENDIF
SWITCH ped.eState
CASE PED_STATE_STARTING_RECORDING_PLAYBACK
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
vehicle.fPlaybackSpeed = 1.15 //playback start speed
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
REQUEST_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(vehicle.iRecordingNumber, sVehicleRecordingsFile)
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vehicle, sVehicleRecordingsFile, vehicle.fPlaybackSpeed, FALSE, 1000.0)
ENDIF
ELSE
//give weapons and set as only damaged by player
GIVE_WEAPON_TO_PED(ped.PedIndex, WEAPONTYPE_MICROSMG, INFINITE_AMMO, FALSE, TRUE)
SET_CURRENT_PED_WEAPON(ped.PedIndex, WEAPONTYPE_MICROSMG, FALSE)
SET_PED_DIES_IN_WATER(ped.PedIndex, FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(ped.PedIndex, TRUE)
IF NOT DOES_BLIP_EXIST(ped.BlipIndex)
ped.BlipIndex = CREATE_BLIP_FOR_ENTITY(ped.PedIndex, FALSE)
ENDIF
ped.iProgress = 0
GO_TO_PED_STATE(ped, PED_STATE_RECORDING_PLAYBACK)
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_RECORDING_PLAYBACK
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
IF ( vehicle.fPlaybackTime > 3000.0) //start rubber banding to player ped after 3 seconds
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
RUBBER_BAND_PLAYBACK_SPEED_FOR_TRIGGER_VEHICLE(vehicle.VehicleIndex, vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex,
vehicle.fPlaybackSpeed, vehicle.fPlaybackTime
#IF IS_DEBUG_BUILD, bPrintDebugOutput, "Lamar's", "Franklin's" #ENDIF)
BREAK
CASE CHAR_TREVOR
RUBBER_BAND_PLAYBACK_SPEED_FOR_TRIGGER_VEHICLE(vehicle.VehicleIndex, vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex,
vehicle.fPlaybackSpeed, vehicle.fPlaybackTime
#IF IS_DEBUG_BUILD, bPrintDebugOutput, "Lamar's", "Trevor's" #ENDIF)
BREAK
ENDSWITCH
//clamp max buddy playback speed, fix for B*1917187
vehicle.fPlaybackSpeed = CLAMP(vehicle.fPlaybackSpeed, 0.0, 2.0)
SET_PLAYBACK_SPEED(vehicle.VehicleIndex, vehicle.fPlaybackSpeed)
ENDIF
ENDIF
SWITCH ped.iProgress //handle Lamar's task during vehicle recording playback
CASE 0 //Lamar sitting in the speedophile
IF DOES_ENTITY_EXIST(vsEnemyLeftChaseCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsEnemyLeftChaseCar.VehicleIndex)
AND NOT IS_ENEMY_GROUP_DEAD(esLeftChaseEnemies)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyLeftChaseCar.VehicleIndex)
IF ( vehicle.fPlaybackTime > 12000.0 )
ped.bHasTask = FALSE
ped.iProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1 //Lamar looking at the incoming enemy car
IF ( ped.bHasTask = FALSE )
IF DOES_ENTITY_EXIST(vsEnemyLeftChaseCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsEnemyLeftChaseCar.VehicleIndex)
TASK_LOOK_AT_ENTITY(ped.PedIndex, vsEnemyLeftChaseCar.VehicleIndex, 3000)
ENDIF
ENDIF
ped.bHasTask = TRUE
ENDIF
IF DOES_ENTITY_EXIST(vsEnemyLeftChaseCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsEnemyLeftChaseCar.VehicleIndex)
AND NOT IS_ENEMY_GROUP_DEAD(esLeftChaseEnemies)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyLeftChaseCar.VehicleIndex)
IF ( vehicle.fPlaybackTime > 15500.0 )
ped.bHasTask = FALSE
ped.iProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2 //Lamar in combat from speedophile with the enemy car
IF ( ped.bHasTask = FALSE )
IF DOES_ENTITY_EXIST(vsEnemyLeftChaseCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsEnemyLeftChaseCar.VehicleIndex)
AND NOT IS_ENEMY_GROUP_DEAD(esLeftChaseEnemies)
IF vehicle.fPlaybackTime >= fChaseAlliesCanFire
AND vehicle.fPlaybackTime < fChaseHeliSpawnTime
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_LEAVE_VEHICLES, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_USE_VEHICLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_DO_DRIVEBYS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex , CA_ALWAYS_FIGHT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex , CA_ALWAYS_FLEE, FALSE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex , FA_NEVER_FLEE, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(ped.PedIndex, 100.0)
SET_PED_SHOOTING_PROPERTIES(ped.PedIndex, 10, 50)
TASK_LOOK_AT_ENTITY(ped.PedIndex, vsEnemyLeftChaseCar.VehicleIndex, 1500)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, TRUE)
ped.bHasTask = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF vehicle.fPlaybackTime >= fChaseHeliSpawnTime
CLEAR_PED_TASKS(ped.PedIndex)
ped.bHasTask = FALSE
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
BREAK
CASE PED_STATE_ENDING_RECORDING_PLAYBACK
IF ( ped.bHasTask = FALSE )
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(vehicle.iRecordingNumber, sVehicleRecordingsFile)
SET_PED_INTO_VEHICLE(ped.PedIndex, vehicle.VehicleIndex, VS_DRIVER)
START_PLAYBACK_RECORDED_VEHICLE(vehicle.VehicleIndex, vehicle.iRecordingNumber, sVehicleRecordingsFile)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehicle.VehicleIndex, 73000.0)
SET_PLAYBACK_SPEED(vehicle.VehicleIndex, 0.8)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehicle.VehicleIndex)
ENDIF
ENDIF
ENDIF
ENDIF
SET_ENTITY_HEALTH(ped.PedIndex, MAX_BUDDY_PED_HEALTH)
SET_PED_MAX_HEALTH(ped.PedIndex, MAX_BUDDY_PED_HEALTH)
SET_ENTITY_HEALTH(vehicle.VehicleIndex, GET_ENTITY_HEALTH(vehicle.VehicleIndex) + 500)
SET_VEHICLE_ENGINE_HEALTH(vehicle.VehicleIndex, GET_VEHICLE_ENGINE_HEALTH(vehicle.VehicleIndex) + 500)
SET_VEHICLE_PETROL_TANK_HEALTH(vehicle.VehicleIndex, GET_VEHICLE_PETROL_TANK_HEALTH(vehicle.VehicleIndex) + 500)
GIVE_WEAPON_TO_PED(ped.PedIndex, WEAPONTYPE_MICROSMG, INFINITE_AMMO, FALSE, TRUE)
GIVE_WEAPON_TO_PED(ped.PedIndex, WEAPONTYPE_ASSAULTRIFLE, INFINITE_AMMO, FALSE, TRUE)
SET_PED_CAN_RAGDOLL(ped.PedIndex, FALSE)
SET_PED_SUFFERS_CRITICAL_HITS(ped.PedIndex, FALSE)
SET_PED_CONFIG_FLAG(ped.PedIndex, PCF_DisableHurt, TRUE)
CLEAR_PED_TASKS(ped.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, TRUE)
ped.bHasTask = TRUE
ENDIF
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vehicle.VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
RUBBER_BAND_PLAYBACK_SPEED_FOR_TRIGGER_VEHICLE(vehicle.VehicleIndex, vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex,
vehicle.fPlaybackSpeed, vehicle.fPlaybackTime
#IF IS_DEBUG_BUILD, bPrintDebugOutput, "Lamar's", "Franklin's" #ENDIF)
BREAK
CASE CHAR_TREVOR
RUBBER_BAND_PLAYBACK_SPEED_FOR_TRIGGER_VEHICLE(vehicle.VehicleIndex, vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex,
vehicle.fPlaybackSpeed, vehicle.fPlaybackTime
#IF IS_DEBUG_BUILD, bPrintDebugOutput, "Lamar's", "Trevor's" #ENDIF)
BREAK
ENDSWITCH
SET_PLAYBACK_SPEED(vehicle.VehicleIndex, vehicle.fPlaybackSpeed)
ELSE
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
GO_TO_PED_STATE(ped, PED_STATE_EXITING_VEHICLE)
ENDIF
ENDIF
ENDIF
IF ( ped.fDistanceToTargetPed >= 300.0 )
IF NOT IS_ENTITY_ON_SCREEN(ped.PedIndex)
DELETE_PED(ped.PedIndex)
ENDIF
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vehicle.VehicleIndex)
IF NOT IS_ENTITY_ON_SCREEN(vehicle.VehicleIndex)
DELETE_VEHICLE(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ENDIF
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
ENDIF
BREAK
CASE PED_STATE_EXITING_VEHICLE //Lamar exiting speedophile
IF ( ped.bHasTask = FALSE )
SEQUENCE_INDEX SequenceIndex
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_LEAVE_ANY_VEHICLE(NULL)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << 1175.89, -2582.79, 35.03 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(ped.PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
SET_CURRENT_PED_WEAPON(ped.PedIndex, WEAPONTYPE_ASSAULTRIFLE, TRUE)
SET_ENTITY_HEALTH(ped.PedIndex, MAX_BUDDY_PED_HEALTH * 2)
SET_PED_MAX_HEALTH(ped.PedIndex, MAX_BUDDY_PED_HEALTH * 2)
ped.bHasTask = TRUE
ENDIF
IF NOT IS_PED_IN_ANY_VEHICLE(ped.PedIndex)
WEAPON_TYPE eWeaponType
IF NOT GET_CURRENT_PED_WEAPON(ped.PedIndex, eWeaponType)
SET_CURRENT_PED_WEAPON(ped.PedIndex, WEAPONTYPE_ASSAULTRIFLE, TRUE)
ENDIF
ENDIF
IF ( ped.bHasTask = TRUE )
IF NOT IS_PED_IN_ANY_VEHICLE(ped.PedIndex)
IF GET_SCRIPT_TASK_STATUS(ped.PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK
GO_TO_PED_STATE(ped, PED_STATE_FLEE_COPS_ON_FOOT)
ENDIF
ENDIF
ENDIF
IF ( ped.fDistanceToTargetPed < 15.0 )
IF NOT IS_PED_IN_ANY_VEHICLE(ped.PedIndex)
SET_ENTITY_HEALTH(ped.PedIndex, MAX_BUDDY_PED_HEALTH)
SET_PED_MAX_HEALTH(ped.PedIndex, MAX_BUDDY_PED_HEALTH)
GO_TO_PED_STATE(ped, PED_STATE_FOLLOWING_PLAYER)
ENDIF
ENDIF
IF ( ped.fDistanceToTargetPed > 200.0 )
IF IS_ENTITY_ON_SCREEN(ped.PedIndex)
SET_PED_KEEP_TASK(ped.PedIndex, TRUE)
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
ELSE
DELETE_PED(ped.PedIndex)
ENDIF
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vehicle.VehicleIndex)
IF IS_ENTITY_ON_SCREEN(vehicle.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
ELSE
DELETE_VEHICLE(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ENDIF
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
ENDIF
BREAK
CASE PED_STATE_FLEE_COPS_ON_FOOT //Lamar fleeing cops on foot
IF ( ped.bHasTask = FALSE )
CLEAR_PED_TASKS(ped.PedIndex)
PED_INDEX CopPedIndex
CopPedIndex = GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(ped.PedIndex, RELGROUPHASH_COP)
IF DOES_ENTITY_EXIST(CopPedIndex)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(ped.PedIndex, FALSE), GET_ENTITY_COORDS(CopPedIndex, FALSE), 255, 255, 255)
#ENDIF
TASK_SMART_FLEE_PED(ped.PedIndex, CopPedIndex, 300, INFINITE_TASK_TIME)
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Not found nearby cops. Fleeing coords.")
#ENDIF
VECTOR vFleeCoords
vFleeCoords = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(ped.PedIndex, << 0.0, -2.0, 0.0 >>)
TASK_SMART_FLEE_COORD(ped.PedIndex, vFleeCoords, 300.0, INFINITE_TASK_TIME)
ENDIF
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_USE_VEHICLE, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, TRUE)
ped.iTimer = GET_GAME_TIMER()
ped.bHasTask = TRUE
ENDIF
IF ( ped.fDistanceToTargetPed < 15.0 )
IF ( bCopsChaseFinished = FALSE )
SET_ENTITY_HEALTH(ped.PedIndex, MAX_BUDDY_PED_HEALTH)
SET_PED_MAX_HEALTH(ped.PedIndex, MAX_BUDDY_PED_HEALTH)
GO_TO_PED_STATE(ped, PED_STATE_FOLLOWING_PLAYER)
ENDIF
ENDIF
IF ( ped.fDistanceToTargetPed > 200.0 )
IF IS_ENTITY_ON_SCREEN(ped.PedIndex)
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
ELSE
DELETE_PED(ped.PedIndex)
ENDIF
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vehicle.VehicleIndex)
IF IS_ENTITY_ON_SCREEN(vehicle.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
ELSE
DELETE_VEHICLE(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ENDIF
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
ENDIF
IF HAS_TIME_PASSED(7000, ped.iTimer)
GO_TO_PED_STATE(ped, PED_STATE_FLEE_COPS_ON_FOOT)
ENDIF
BREAK
CASE PED_STATE_FOLLOWING_PLAYER
IF ( ped.bHasTask = FALSE )
CLEAR_PED_TASKS(ped.PedIndex)
IF NOT IS_PED_GROUP_MEMBER(ped.PedIndex, PLAYER_GROUP_ID())
SET_PED_AS_GROUP_MEMBER(ped.PedIndex, PLAYER_GROUP_ID())
ENDIF
SET_GROUP_SEPARATION_RANGE(PLAYER_GROUP_ID(), BUDDY_SEPARATION_DIST)
SET_PED_GROUP_MEMBER_PASSENGER_INDEX(ped.PedIndex, VS_FRONT_RIGHT)
SET_PED_CAN_TELEPORT_TO_GROUP_LEADER(ped.PedIndex, PLAYER_GROUP_ID(), TRUE)
SET_PED_CONFIG_FLAG(ped.PedIndex, PCF_TeleportToLeaderVehicle, FALSE)
SET_PED_ACCURACY(ped.PedIndex, 20)
SET_PED_SHOOT_RATE(ped.PedIndex, 115)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_DO_DRIVEBYS, TRUE)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 0.9)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
//apparently this is not needed for group members
SET_PED_COMBAT_MOVEMENT(ped.PedIndex, CM_DEFENSIVE)
SET_PED_DEFENSIVE_SPHERE_ATTACHED_TO_PED(ped.PedIndex, TargetPedIndex, << 0.0, 0.0, 0.0 >>, 7.5)
SET_PED_CAN_RAGDOLL(ped.PedIndex, TRUE)
SET_RAGDOLL_BLOCKING_FLAGS(ped.PedIndex, RBF_BULLET_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(ped.PedIndex, RBF_PLAYER_IMPACT)
SET_PED_SUFFERS_CRITICAL_HITS(ped.PedIndex, FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(ped.PedIndex, FALSE)
SET_PED_CONFIG_FLAG(ped.PedIndex, PCF_DisableHurt, TRUE)
SET_PED_CONFIG_FLAG(ped.PedIndex, PCF_GetOutUndriveableVehicle, FALSE)
SET_PED_CONFIG_FLAG(ped.PedIndex, PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ePlayerBuddy = PLAYER_BUDDY_LAMAR
ped.bHasTask = TRUE
ENDIF
IF ( ped.bHasTask = TRUE)
IF ( ped.fDistanceToTargetPed > BUDDY_SEPARATION_DIST )
OR NOT IS_PED_GROUP_MEMBER(ped.PedIndex, PLAYER_GROUP_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped with debug name ", ped.sDebugName, " is not player group member any more.")
#ENDIF
GO_TO_PED_STATE(ped, PED_STATE_WAITING_FOR_PLAYER)
ENDIF
ENDIF
BREAK
CASE PED_STATE_WAITING_FOR_PLAYER
IF ( ped.bHasTask = FALSE )
SET_PED_COMBAT_MOVEMENT(ped.PedIndex, CM_DEFENSIVE)
SET_PED_DEFENSIVE_SPHERE_ATTACHED_TO_PED(ped.PedIndex, TargetPedIndex, << 0.0, 0.0, 0.0 >>, 7.5)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ped.bHasTask = TRUE
ENDIF
IF ( ped.bHasTask = TRUE)
IF ( ped.fDistanceToTargetPed <= BUDDY_SEPARATION_DIST / 3 )
GO_TO_PED_STATE(ped, PED_STATE_FOLLOWING_PLAYER)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
PROC MANAGE_PLAYER_PED_IN_SPEEDOPHILE(PED_INDEX PedIndex, PED_STRUCT &ped, VEH_STRUCT &vehicle, VEH_STRUCT &targetvehicle)
IF DOES_ENTITY_EXIST(PedIndex)
AND NOT IS_ENTITY_DEAD(PedIndex)
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
AND NOT IS_ENTITY_DEAD(vehicle.VehicleIndex)
SWITCH ped.eState
CASE PED_STATE_STARTING_RECORDING_PLAYBACK
vehicle.fPlaybackSpeed = 1.15 //playback start speed
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
REQUEST_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(vehicle.iRecordingNumber, sVehicleRecordingsFile)
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vehicle, sVehicleRecordingsFile, vehicle.fPlaybackSpeed, FALSE, 1000.0)
ENDIF
ELSE
GO_TO_PED_STATE(ped, PED_STATE_RECORDING_PLAYBACK)
ENDIF
BREAK
CASE PED_STATE_RECORDING_PLAYBACK
IF IS_PED_IN_VEHICLE(PedIndex, vehicle.VehicleIndex)
IF DOES_BLIP_EXIST(vehicle.BlipIndex)
IF IS_THIS_PRINT_BEING_DISPLAYED("FRA1_GETBACKIN")
CLEAR_PRINTS()
ENDIF
REMOVE_BLIP(vehicle.BlipIndex)
bDisplayBuddyBlips = TRUE
ENDIF
ELSE
//create blip for player's speedophile and display god text if player gets off
IF NOT DOES_BLIP_EXIST(vehicle.BlipIndex)
IF NOT HAS_LABEL_BEEN_TRIGGERED("FRA1_GETBACKIN")
IF IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
CLEAR_PRINTS()
ENDIF
ENDIF
vehicle.BlipIndex = CREATE_BLIP_FOR_VEHICLE(vehicle.VehicleIndex)
PRINT_GOD_TEXT_ADVANCED("FRA1_GETBACKIN", DEFAULT_GOD_TEXT_TIME, TRUE)
bDisplayBuddyBlips = FALSE
ENDIF
ENDIF
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
IF ( targetvehicle.fPlaybackTime > 3000.0 )
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
STOP_PLAYBACK_RECORDED_VEHICLE(vehicle.VehicleIndex)
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_ENDING_RECORDING_PLAYBACK
IF ( ped.bHasTask = FALSE )
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(vehicle.iRecordingNumber, sVehicleRecordingsFile)
SET_PED_INTO_VEHICLE(PedIndex, vehicle.VehicleIndex, VS_DRIVER)
START_PLAYBACK_RECORDED_VEHICLE(vehicle.VehicleIndex, vehicle.iRecordingNumber, sVehicleRecordingsFile)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehicle.VehicleIndex, 73000.0)
SET_PLAYBACK_SPEED(vehicle.VehicleIndex, 0.5)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehicle.VehicleIndex)
ENDIF
ENDIF
ENDIF
ENDIF
ped.bHasTask = TRUE
ENDIF
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
IF ( targetvehicle.fPlaybackTime > 73500.0 )
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
CLEAR_PED_TASKS(PedIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vehicle.VehicleIndex)
GO_TO_PED_STATE(ped, PED_STATE_FLEE_COPS_ON_FOOT)
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_FLEE_COPS_ON_FOOT
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
PROC MANAGE_OTHER_PLAYER_PED_IN_SPEEDOPHILE(PED_INDEX PedIndex, PED_STRUCT &ped, VEH_STRUCT &vehicle, PED_INDEX TargetPedIndex,
VEH_STRUCT &targetvehicle, BOOL bLoseCopsStage)
IF DOES_ENTITY_EXIST(PedIndex)
AND NOT IS_ENTITY_DEAD(PedIndex)
IF DOES_ENTITY_EXIST(TargetPedIndex)
AND NOT IS_PED_INJURED(TargetPedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE)
DRAW_DEBUG_VEHICLE_RECORDING_INFO(vehicle.VehicleIndex, 1.65)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(PedIndex, GET_STRING_FROM_FLOAT(GET_PED_HEALTH_RATIO(PedIndex)), 1.45)
ENDIF
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
ped.sDebugName = "Trevor"
BREAK
CASE CHAR_TREVOR
ped.sDebugName = "Franklin"
BREAK
ENDSWITCH
#ENDIF
ped.fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(PedIndex, TargetPedIndex) //get distance to player
SET_PED_RESET_FLAG(PedIndex, PRF_DisableFriendlyGunReactAudio, TRUE)
SET_PED_RESET_FLAG(PedIndex, PRF_DontSuppressUseNavMeshToNavigateToVehicleDoorWhenVehicleInWater, TRUE) //fix for B*2027310
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
vehicle.fPlaybackTime = GET_TIME_POSITION_IN_RECORDING(vehicle.VehicleIndex) //get playback time
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vehicle.VehicleIndex)
IF DOES_BLIP_EXIST(vehicle.BlipIndex)
IF IS_PED_IN_VEHICLE(PedIndex, vehicle.VehicleIndex)
REMOVE_BLIP(vehicle.BlipIndex)
ENDIF
IF ( bLoseCopsStage = TRUE )
REMOVE_BLIP(vehicle.BlipIndex)
ENDIF
ELSE
IF NOT IS_PED_IN_VEHICLE(PedIndex, vehicle.VehicleIndex)
IF ( bLoseCopsStage = FALSE )
vehicle.BlipIndex = CREATE_BLIP_FOR_VEHICLE(vehicle.VehicleIndex)
ENDIF
ENDIF
ENDIF
ELSE
IF DOES_BLIP_EXIST(vehicle.BlipIndex)
REMOVE_BLIP(vehicle.BlipIndex)
ENDIF
ENDIF
ENDIF
SWITCH ped.eState
CASE PED_STATE_STARTING_RECORDING_PLAYBACK
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
vehicle.fPlaybackSpeed = 1.15 //playback start speed
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
REQUEST_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(vehicle.iRecordingNumber, sVehicleRecordingsFile)
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vehicle, sVehicleRecordingsFile, vehicle.fPlaybackSpeed, FALSE, 1000.0)
ENDIF
ELSE
SET_PED_DIES_IN_WATER(PedIndex, FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(PedIndex, TRUE)
GO_TO_PED_STATE(ped, PED_STATE_RECORDING_PLAYBACK)
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_RECORDING_PLAYBACK
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
SET_PLAYBACK_SPEED(vehicle.VehicleIndex, targetvehicle.fPlaybackSpeed)
ENDIF
ENDIF
ENDIF
IF ( ped.bHasTask = FALSE )
IF DOES_ENTITY_EXIST(vsEnemyLeftChaseCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsEnemyLeftChaseCar.VehicleIndex)
AND NOT IS_ENEMY_GROUP_DEAD(esLeftChaseEnemies)
IF targetvehicle.fPlaybackTime >= fChaseAlliesCanFire + 1250
AND targetvehicle.fPlaybackTime < fChaseHeliSpawnTime
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_LEAVE_VEHICLES, FALSE)
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_USE_VEHICLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_DO_DRIVEBYS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(PedIndex , CA_ALWAYS_FIGHT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(PedIndex , CA_ALWAYS_FLEE, FALSE)
SET_PED_FLEE_ATTRIBUTES(PedIndex , FA_NEVER_FLEE, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(PedIndex, 100.0)
SET_PED_SHOOTING_PROPERTIES(PedIndex, 10, 50)
TASK_LOOK_AT_ENTITY(PedIndex, vsEnemyLeftChaseCar.VehicleIndex, 1500)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, TRUE)
ped.bHasTask = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF targetvehicle.fPlaybackTime >= fChaseHeliSpawnTime
CLEAR_PED_TASKS(PedIndex)
ped.bHasTask = FALSE
ENDIF
ENDIF
BREAK
CASE PED_STATE_CATCHING_UP_WITH_RECORDING
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
IF IS_PED_IN_VEHICLE(PedIndex, vehicle.VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
AND NOT IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
FLOAT fTimeFromPosition, fDistanceToRoute
VECTOR vVehiclePosition, vPositionInRecording
RECORDING_ID recordingID
vehicle.fPlaybackSpeed = 1.0
fTimeFromPosition = targetvehicle.fPlaybackTime
vVehiclePosition = GET_ENTITY_COORDS(vehicle.VehicleIndex)
recordingID = GET_VEHICLE_RECORDING_ID(vehicle.iRecordingNumber, sVehicleRecordingsFile)
vPositionInRecording = GET_POSITION_OF_VEHICLE_RECORDING_ID_AT_TIME(recordingID, fTimeFromPosition)
fDistanceToRoute = GET_DISTANCE_BETWEEN_COORDS(vPositionInRecording, vVehiclePosition)
IF ( fDistanceToRoute <= 13.0 )
fTimeFromPosition = targetvehicle.fPlaybackTime - 500
ELIF ( fDistanceToRoute > 13.0 AND fDistanceToRoute <= 20.0 )
fTimeFromPosition = targetvehicle.fPlaybackTime - 1000
ELIF ( fDistanceToRoute > 20.0 AND fDistanceToRoute <= 30.0 )
fTimeFromPosition = targetvehicle.fPlaybackTime - 2000
ELSE
fTimeFromPosition = targetvehicle.fPlaybackTime - 3000
ENDIF
START_PLAYBACK_RECORDED_VEHICLE(vehicle.VehicleIndex, vehicle.iRecordingNumber, sVehicleRecordingsFile)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehicle.VehicleIndex, fTimeFromPosition)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehicle.VehicleIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), "######################################")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playback time ", targetvehicle.fPlaybackTime, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": fDistanceToRoute ", fDistanceToRoute, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": fTimeFromPosition ", fTimeFromPosition, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), "######################################")
#ENDIF
ELSE
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
IF vehicle.fPlaybackTime < targetVehicle.fPlaybackTime
FLOAT fCatchUpSpeed
FLOAT fTimeDifference
fTimeDifference = targetVehicle.fPlaybackTime - vehicle.fPlaybackTime
IF ( fTimeDifference > 3000 )
fCatchUpSpeed = 1.4
ELIF ( fTimeDifference > 2000 )
fCatchUpSpeed = 1.3
ELIF ( fTimeDifference > 1000 )
fCatchUpSpeed = 1.2
ELIF ( fTimeDifference > 500 )
fCatchUpSpeed = 1.15
ELSE
fCatchUpSpeed = 1.1
ENDIF
CONVERGE_VALUE(vehicle.fPlaybackSpeed, fCatchUpSpeed, 0.01, TRUE)
SET_PLAYBACK_SPEED(vehicle.VehicleIndex, vehicle.fPlaybackSpeed)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(vehicle.VehicleIndex, GET_STRING_FROM_FLOAT(vehicle.fPlaybackSpeed), 2.0)
#ENDIF
ELSE
GO_TO_PED_STATE(ped, PED_STATE_RECORDING_PLAYBACK)
ENDIF
ENDIF
ENDIF
ELSE
SET_PED_INTO_VEHICLE(PedIndex, vehicle.VehicleIndex, VS_DRIVER)
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_ENDING_RECORDING_PLAYBACK
IF ( ped.bHasTask = FALSE )
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(vehicle.iRecordingNumber, sVehicleRecordingsFile)
SET_PED_INTO_VEHICLE(PedIndex, vehicle.VehicleIndex, VS_DRIVER)
START_PLAYBACK_RECORDED_VEHICLE(vehicle.VehicleIndex, vehicle.iRecordingNumber, sVehicleRecordingsFile)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehicle.VehicleIndex, 73000.0)
SET_PLAYBACK_SPEED(vehicle.VehicleIndex, 0.8)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehicle.VehicleIndex)
ENDIF
ENDIF
ENDIF
ENDIF
SET_ENTITY_HEALTH(PedIndex, MAX_BUDDY_PED_HEALTH)
SET_PED_MAX_HEALTH(PedIndex, MAX_BUDDY_PED_HEALTH)
GIVE_WEAPON_TO_PED(PedIndex, WEAPONTYPE_MICROSMG, INFINITE_AMMO, FALSE, TRUE)
GIVE_WEAPON_TO_PED(PedIndex, WEAPONTYPE_PUMPSHOTGUN, INFINITE_AMMO, FALSE, TRUE)
SET_PED_SUFFERS_CRITICAL_HITS(PedIndex, FALSE)
SET_PED_DIES_IN_WATER(PedIndex, FALSE)
ped.bHasTask = TRUE
ENDIF
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
//rubber band?
ELSE
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
GO_TO_PED_STATE(ped, PED_STATE_EXITING_VEHICLE)
ENDIF
ENDIF
ENDIF
IF ( ped.fDistanceToTargetPed > 200.0 )
IF IS_ENTITY_ON_SCREEN(PedIndex)
SET_PED_AS_NO_LONGER_NEEDED(PedIndex)
ELSE
DELETE_PED(PedIndex)
ENDIF
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vehicle.VehicleIndex)
IF IS_ENTITY_ON_SCREEN(vehicle.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
ELSE
DELETE_VEHICLE(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ENDIF
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
ENDIF
BREAK
CASE PED_STATE_EXITING_VEHICLE //Trevor/Franklin exiting speedophile and climbing ladder
IF ( ped.bHasTask = FALSE )
SEQUENCE_INDEX SequenceIndex
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_LEAVE_ANY_VEHICLE(NULL)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << 767.01, -2921.19, 5.53 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP * 2)
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<764.0746, -2939.4189, 4.8384>>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP * 2, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
SET_PED_DIES_IN_WATER(PedIndex, FALSE)
ped.bHasTask = TRUE
ENDIF
IF NOT IS_PED_IN_ANY_VEHICLE(PedIndex)
IF IS_PED_CLIMBING(TargetPedIndex) AND NOT IS_PED_CLIMBING(PedIndex)
IF IS_ENTITY_AT_COORD(TargetPedIndex, <<767.137512,-2920.180420,3.604882>>, << 1.5, 1.5, 4.0 >>)
IF GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK
IF IS_ENTITY_AT_COORD(PedIndex, <<768.390015,-2910.733398,1.063230>>,<<14.000000,10.000000,5.000000>>)
GO_TO_PED_STATE(ped, PED_STATE_FOLLOWING_PLAYER)
ENDIF
ENDIF
ENDIF
ENDIF
IF GET_SCRIPT_TASK_STATUS(PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK
IF ( ped.fDistanceToTargetPed < 15.0 )
GO_TO_PED_STATE(ped, PED_STATE_FOLLOWING_PLAYER)
ELSE
GO_TO_PED_STATE(ped, PED_STATE_FLEE_COPS_ON_FOOT)
ENDIF
ENDIF
ENDIF
IF ( ped.fDistanceToTargetPed > 200.0 )
IF IS_ENTITY_ON_SCREEN(PedIndex)
SET_PED_AS_NO_LONGER_NEEDED(PedIndex)
ELSE
DELETE_PED(PedIndex)
ENDIF
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vehicle.VehicleIndex)
IF IS_ENTITY_ON_SCREEN(vehicle.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
ELSE
DELETE_VEHICLE(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ENDIF
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
ENDIF
BREAK
CASE PED_STATE_FLEE_COPS_ON_FOOT //Trevor/Franklin fleeing cops on foot
IF ( ped.bHasTask = FALSE )
CLEAR_PED_TASKS(PedIndex)
PED_INDEX CopPedIndex
CopPedIndex = GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(PedIndex, RELGROUPHASH_COP)
IF DOES_ENTITY_EXIST(CopPedIndex)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PedIndex, FALSE), GET_ENTITY_COORDS(CopPedIndex, FALSE), 255, 255, 255)
#ENDIF
TASK_SMART_FLEE_PED(PedIndex, CopPedIndex, 300, INFINITE_TASK_TIME)
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Not found nearby cops. Fleeing coords.")
#ENDIF
VECTOR vFleeCoords
vFleeCoords = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(PedIndex, << 0.0, -2.0, 0.0 >>)
TASK_SMART_FLEE_COORD(PedIndex, vFleeCoords, 300.0, INFINITE_TASK_TIME)
ENDIF
SET_PED_FLEE_ATTRIBUTES(PedIndex, FA_USE_VEHICLE, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, TRUE)
ped.iTimer = GET_GAME_TIMER()
ped.bHasTask = TRUE
ENDIF
IF ( ped.fDistanceToTargetPed < 15.0 ) //determine to go to combat with cops or follow player
GO_TO_PED_STATE(ped, PED_STATE_FOLLOWING_PLAYER)
ENDIF
IF ( ped.fDistanceToTargetPed > 200.0 )
IF IS_ENTITY_ON_SCREEN(PedIndex)
SET_PED_AS_NO_LONGER_NEEDED(PedIndex)
ELSE
DELETE_PED(PedIndex)
ENDIF
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vehicle.VehicleIndex)
IF IS_ENTITY_ON_SCREEN(vehicle.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
ELSE
DELETE_VEHICLE(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ENDIF
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
ENDIF
IF HAS_TIME_PASSED(7000, ped.iTimer)
GO_TO_PED_STATE(ped, PED_STATE_FLEE_COPS_ON_FOOT)
ENDIF
BREAK
CASE PED_STATE_FOLLOWING_PLAYER
IF ( ped.bHasTask = FALSE )
CLEAR_PED_TASKS(PedIndex)
IF NOT IS_PED_GROUP_MEMBER(PedIndex, PLAYER_GROUP_ID())
SET_PED_AS_GROUP_MEMBER(PedIndex, PLAYER_GROUP_ID())
ENDIF
SET_PED_GROUP_MEMBER_PASSENGER_INDEX(PedIndex, VS_FRONT_RIGHT)
SET_PED_CAN_TELEPORT_TO_GROUP_LEADER(PedIndex, PLAYER_GROUP_ID(), TRUE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_TeleportToLeaderVehicle, FALSE)
SET_PED_ACCURACY(PedIndex, 20)
SET_PED_SHOOT_RATE(PedIndex, 115)
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_DO_DRIVEBYS, TRUE)
SET_COMBAT_FLOAT(PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 0.9)
SET_COMBAT_FLOAT(PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
//apparently this is not needed for group members
SET_PED_COMBAT_MOVEMENT(PedIndex, CM_DEFENSIVE)
SET_PED_DEFENSIVE_SPHERE_ATTACHED_TO_PED(PedIndex, TargetPedIndex, << 0.0, 0.0, 0.0 >>, 7.5)
SET_PED_CAN_RAGDOLL(PedIndex, TRUE)
SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_BULLET_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_IMPACT)
SET_PED_SUFFERS_CRITICAL_HITS(PedIndex, FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(PedIndex, FALSE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_DisableHurt, TRUE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_GetOutUndriveableVehicle, FALSE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_OnlyAttackLawIfPlayerIsWanted, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, FALSE)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
ePlayerBuddy = PLAYER_BUDDY_TREVOR
BREAK
CASE CHAR_TREVOR
ePlayerBuddy = PLAYER_BUDDY_FRANKLIN
BREAK
ENDSWITCH
ped.bHasTask = TRUE
ENDIF
IF ( ped.bHasTask = TRUE)
IF ( ped.fDistanceToTargetPed > BUDDY_SEPARATION_DIST )
OR NOT IS_PED_GROUP_MEMBER(PedIndex, PLAYER_GROUP_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped with debug name ", ped.sDebugName, " is not player group member any more.")
#ENDIF
GO_TO_PED_STATE(ped, PED_STATE_WAITING_FOR_PLAYER)
ENDIF
ENDIF
BREAK
CASE PED_STATE_WAITING_FOR_PLAYER
IF ( ped.bHasTask = FALSE )
SET_PED_COMBAT_MOVEMENT(PedIndex, CM_DEFENSIVE)
SET_PED_DEFENSIVE_SPHERE_ATTACHED_TO_PED(PedIndex, TargetPedIndex, << 0.0, 0.0, 0.0 >>, 7.5)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, FALSE)
ped.bHasTask = TRUE
ENDIF
IF ( ped.bHasTask = TRUE)
IF ( ped.fDistanceToTargetPed <= BUDDY_SEPARATION_DIST / 3 )
GO_TO_PED_STATE(ped, PED_STATE_FOLLOWING_PLAYER)
ENDIF
ENDIF
BREAK
CASE PED_STATE_WAITING_FOR_TASK_AFTER_SWITCH
GO_TO_PED_STATE(ped, PED_STATE_CATCHING_UP_WITH_RECORDING)
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_MISSION_STAGE_RUN_TO_SPEEDOPHILES_COMPLETED(INT &iStageProgress)
MANAGE_COP_WAVE(bCopWaveSpawned)
MANAGE_LAMAR_IN_GROVE_STREET(psLamar, PLAYER_PED_ID())
MANAGE_OTHER_PLAYER_PED_IN_GROVE_STREET(GET_OTHER_PLAYER_PED_INDEX(), psTrevor, PLAYER_PED_ID())
MANAGE_FILM_CREW_PEDS_BEFORE_JACK(psFilmCrew[FCP_CLAY].iProgress)
IF ( psLamar.bFleeing = TRUE )
IF ( psLamar.bWaitingForPlayer = TRUE )
IF HAS_TIME_PASSED(3000, psLamar.iPedConversationTimer)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM02", CONV_PRIORITY_MEDIUM)
psLamar.iPedConversationTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LHILL")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LHILL", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LHILL", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_COM03")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF IS_ENTITY_IN_ANGLED_AREA(psLamar.PedIndex, <<-41.722290,-1866.694702,28.490503>>, <<-61.971512,-1891.405518,4.101753>>, 16.0)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM03", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_COM03", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_COM04")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT IS_PED_INJURED(psLamar.PedIndex)
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(psLamar.PedIndex)
IF ( GET_PED_WAYPOINT_PROGRESS(psLamar.PedIndex) > 40 )
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM04", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_COM04", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_FILMCREW_SCARED()
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_COM05")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF IS_PED_IN_PED_STATE(psLamar, PED_STATE_RUNNING_TO_VEHICLE)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM05", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_COM05", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_FILMCREW_SCARED()
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_COM06")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF IS_PED_IN_PED_STATE(psLamar, PED_STATE_WAITING_AT_VEHICLE)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM06", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_COM06", TRUE)
psLamar.iTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_PED_IN_PED_STATE(psLamar, PED_STATE_WAITING_AT_VEHICLE)
OR IS_PED_IN_PED_STATE(psLamar, PED_STATE_SITTING_IN_VEHICLE)
IF NOT IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex)
AND NOT IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex)
AND NOT IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF HAS_TIME_PASSED(5000, psLamar.iTimer)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM07", CONV_PRIORITY_MEDIUM)
IF NOT IS_PED_INJURED(psLamar.PedIndex)
TASK_LOOK_AT_ENTITY(psLamar.PedIndex, PLAYER_PED_ID(), 2000, SLF_WHILE_NOT_IN_FOV)
ENDIF
psLamar.iTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bFilmCrewAttacked = TRUE )
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_COM08F")
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_COM08T")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM08F", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_COM08F", TRUE)
ENDIF
BREAK
CASE CHAR_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM08T", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_COM08T", TRUE)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
IF ( psFilmCrew[FCP_CLAY].eCleanupReason <> PED_CLEANUP_NO_CLEANUP )
IF ( psFilmCrew[FCP_CLAY].bCleanupConversationTriggered = FALSE )
SWITCH psFilmCrew[FCP_CLAY].eCleanupReason
CASE PED_CLEANUP_KILLED_BY_PLAYER_AS_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM09F", CONV_PRIORITY_MEDIUM)
psFilmCrew[FCP_CLAY].bCleanupConversationTriggered = TRUE
ENDIF
BREAK
CASE PED_CLEANUP_KILLED_BY_PLAYER_AS_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_COM09F", CONV_PRIORITY_MEDIUM) //uses the same root here
psFilmCrew[FCP_CLAY].bCleanupConversationTriggered = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
SWITCH iStageProgress
CASE 0
iStageProgress++
BREAK
CASE 1
IF ( bMusicEventWaterArriveTriggered = FALSE )
IF IS_ANY_PED_IN_ANGLED_AREA_LOCATE(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), psLamar.PedIndex,
<<-183.247894,-1877.746460,-8.911816>>, <<-121.605896,-1804.794434,29.815378>>, 72.0)
IF TRIGGER_MUSIC_EVENT("FRA1_WATER_ARRIVE")
bMusicEventWaterArriveTriggered = TRUE
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, TRUE)
OR IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex, TRUE)
OR IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex, TRUE)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_VEHICLE_NAME)
DISABLE_PLAYER_VEHICLE_CONTROLS_THIS_FRAME()
ENDIF
ENDIF
PREPARE_MUSIC_EVENT("FRA1_SPEED")
//request start seasharks recordings
REQUEST_VEHICLE_RECORDING(911, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(912, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(913, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(921, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(922, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(923, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(931, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(932, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(933, sVehicleRecordingsFile)
//request main seasharks recordings
REQUEST_VEHICLE_RECORDING(SPEEDOPHILE_RECORDING_FRONT, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(SPEEDOPHILE_RECORDING_LEFT, sVehicleRecordingsFile)
REQUEST_VEHICLE_RECORDING(SPEEDOPHILE_RECORDING_RIGHT, sVehicleRecordingsFile)
IF (IS_FRIENDLY_PED_IN_ANY_SPEEDOPHILE(GET_PED_INDEX(CHAR_TREVOR))
AND IS_FRIENDLY_PED_IN_ANY_SPEEDOPHILE(GET_PED_INDEX(CHAR_FRANKLIN))
AND IS_FRIENDLY_PED_IN_ANY_SPEEDOPHILE(psLamar.PedIndex))
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(911, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(912, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(913, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(921, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(922, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(923, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(931, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(932, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(933, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(SPEEDOPHILE_RECORDING_FRONT, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(SPEEDOPHILE_RECORDING_LEFT, sVehicleRecordingsFile)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(SPEEDOPHILE_RECORDING_RIGHT, sVehicleRecordingsFile)
IF NOT IS_PED_INJURED(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
CLEAR_PED_SECONDARY_TASK(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
ENDIF
//lamar
IF GET_VEHICLE_PED_IS_USING(psLamar.PedIndex) = vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex
psLamar.ePedVehicle = SPEEDOPHILE_1
vsSpeedophiles[SPEEDOPHILE_1].iRecordingNumber = 911
vsSpeedophiles[SPEEDOPHILE_2].iRecordingNumber = 912
vsSpeedophiles[SPEEDOPHILE_3].iRecordingNumber = 913
ELIF GET_VEHICLE_PED_IS_USING(psLamar.PedIndex) = vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex
psLamar.ePedVehicle = SPEEDOPHILE_2
vsSpeedophiles[SPEEDOPHILE_1].iRecordingNumber = 921
vsSpeedophiles[SPEEDOPHILE_2].iRecordingNumber = 922
vsSpeedophiles[SPEEDOPHILE_3].iRecordingNumber = 923
ELIF GET_VEHICLE_PED_IS_USING(psLamar.PedIndex) = vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex
psLamar.ePedVehicle = SPEEDOPHILE_3
vsSpeedophiles[SPEEDOPHILE_1].iRecordingNumber = 931
vsSpeedophiles[SPEEDOPHILE_2].iRecordingNumber = 932
vsSpeedophiles[SPEEDOPHILE_3].iRecordingNumber = 933
ENDIF
GO_TO_PED_STATE(psLamar, PED_STATE_STARTING_RECORDING_PLAYBACK)
//Trevor
IF GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_TREVOR)) = vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex
psTrevor.ePedVehicle = SPEEDOPHILE_1
ELIF GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_TREVOR)) = vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex
psTrevor.ePedVehicle = SPEEDOPHILE_2
ELIF GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_TREVOR)) = vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex
psTrevor.ePedVehicle = SPEEDOPHILE_3
ENDIF
GO_TO_PED_STATE(psTrevor, PED_STATE_STARTING_RECORDING_PLAYBACK)
//Franklin
IF GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_FRANKLIN)) = vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex
psFranklin.ePedVehicle = SPEEDOPHILE_1
ELIF GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_FRANKLIN)) = vsSpeedophiles[SPEEDOPHILE_2].VehicleIndex
psFranklin.ePedVehicle = SPEEDOPHILE_2
ELIF GET_VEHICLE_PED_IS_USING(GET_PED_INDEX(CHAR_FRANKLIN)) = vsSpeedophiles[SPEEDOPHILE_3].VehicleIndex
psFranklin.ePedVehicle = SPEEDOPHILE_3
ENDIF
GO_TO_PED_STATE(psFranklin, PED_STATE_STARTING_RECORDING_PLAYBACK)
GO_TO_PED_STATE(psFilmCrew[FCP_JACKEDGIRL], PED_STATE_SITTING_IN_VEHICLE)
TRIGGER_MUSIC_EVENT("FRA1_SPEED")
START_SPEEDOPHILE_CUTSCENE_RECORDING(psFranklin.ePedVehicle)
START_SPEEDOPHILE_CUTSCENE_RECORDING(psTrevor.ePedVehicle)
START_SPEEDOPHILE_CUTSCENE_RECORDING(psLamar.ePedVehicle)
CLEANUP_PED_GROUP(psStreetCopCar1Cops, FALSE, FALSE)
CLEANUP_PED_GROUP(psStreetCopCar2Cops, FALSE, FALSE)
CLEANUP_PED_GROUP(psStreetCopCar3Cops, FALSE, FALSE)
IF NOT DOES_CAM_EXIST(ScriptedCamera)
DESTROY_ALL_CAMS()
ScriptedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
PLAY_CAM_ANIM(ScriptedCamera, "jetski_escape_cam", "missfra1", << -129.73, -1857.22, 0.35 >>, << 0.0, 0.0, 0.0 >>)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
ENDIF
SETTIMERA(0)
bAllowHotSwap = FALSE
SET_SPEEDOPHILE_POSITIONS_IN_INT(g_iFranklin1VehicleChoice, psLamar.ePedVehicle, psFranklin.ePedVehicle, psTrevor.ePedVehicle)
STOP_AUDIO_SCENE("FRANKLIN_1_APPROACH_RIVER")
START_AUDIO_SCENE("FRANKLIN_1_JETSKI_START")
iStageProgress++
ENDIF
ENDIF
BREAK
CASE 2
REQUEST_MODEL(mnBalla)
REQUEST_MODEL(vsEnemyLeftChaseCar.ModelName)
REQUEST_VEHICLE_RECORDING(vsEnemyLeftChaseCar.iRecordingNumber, sVehicleRecordingsFile)
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() //Fix for bug 2189178
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_VEHICLE_NAME)
DISABLE_PLAYER_VEHICLE_CONTROLS_THIS_FRAME()
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCLNCR")
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCLNCR", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCLNCR", TRUE)
ENDIF
ENDIF
IF ( TIMERA() > 3600 )
STOP_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex, SPEEDOPHILE_RECORDING_FRONT, sVehicleRecordingsFile)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex, 5500.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex, SPEEDOPHILE_RECORDING_RIGHT, sVehicleRecordingsFile)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex, 5500.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex, SPEEDOPHILE_RECORDING_LEFT, sVehicleRecordingsFile)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex, 5500.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex)
REMOVE_VEHICLE_RECORDING(911, sVehicleRecordingsFile)
REMOVE_VEHICLE_RECORDING(912, sVehicleRecordingsFile)
REMOVE_VEHICLE_RECORDING(913, sVehicleRecordingsFile)
REMOVE_VEHICLE_RECORDING(921, sVehicleRecordingsFile)
REMOVE_VEHICLE_RECORDING(922, sVehicleRecordingsFile)
REMOVE_VEHICLE_RECORDING(923, sVehicleRecordingsFile)
REMOVE_VEHICLE_RECORDING(931, sVehicleRecordingsFile)
REMOVE_VEHICLE_RECORDING(932, sVehicleRecordingsFile)
REMOVE_VEHICLE_RECORDING(933, sVehicleRecordingsFile)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsSpeedophiles[psLamar.ePedVehicle].VehicleIndex, TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex, TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex, TRUE)
vsSpeedophiles[psLamar.ePedVehicle].iRecordingNumber = SPEEDOPHILE_RECORDING_FRONT
vsSpeedophiles[psTrevor.ePedVehicle].iRecordingNumber = SPEEDOPHILE_RECORDING_RIGHT
vsSpeedophiles[psFranklin.ePedVehicle].iRecordingNumber = SPEEDOPHILE_RECORDING_LEFT
iStageProgress++
ELIF ( TIMERA() > 3300 )
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_BOAT) = CAM_VIEW_MODE_FIRST_PERSON
IF ( bFirstPersonFlashPlayed = FALSE )
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bFirstPersonFlashPlayed = TRUE
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DESTROY_ALL_CAMS()
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
REMOVE_ANIM_DICT("missfra1")
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC MANAGE_COP_HELICOPTER_IN_CHASE(PED_STRUCT &ped, FLOAT fPlaybackTime, FLOAT fPlaybackSpeed)
INT i
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_VEHICLE_RECORDING_INFO(vsPoliceHeli.VehicleIndex, 0.0)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.0)
ENDIF
#ENDIF
SWITCH ped.eState
CASE PED_STATE_IDLE
IF NOT DOES_ENTITY_EXIST(vsPoliceHeli.VehicleIndex)
IF ( fPlaybackTime > 15000.0 )
REQUEST_MODEL(S_M_Y_SWAT_01)
REQUEST_MODEL(vsPoliceHeli.ModelName)
REQUEST_VEHICLE_RECORDING(vsPoliceHeli.iRecordingNumber, sVehicleRecordingsFile)
IF HAS_MODEL_LOADED(S_M_Y_SWAT_01)
AND HAS_MODEL_LOADED(vsPoliceHeli.ModelName)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsPoliceHeli.iRecordingNumber, sVehicleRecordingsFile)
IF ( fPlaybackTime >= fChaseHeliSpawnTime )
vsPoliceHeli.VehicleIndex = CREATE_VEHICLE(vsPoliceHeli.ModelName, vsPoliceHeli.vPosition, vsPoliceHeli.fHeading)
psSwat[0].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsPoliceHeli.VehicleIndex, PEDTYPE_COP, S_M_Y_SWAT_01, VS_DRIVER)
psSwat[1].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsPoliceHeli.VehicleIndex, PEDTYPE_COP, S_M_Y_SWAT_01, VS_BACK_LEFT)
psSwat[2].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsPoliceHeli.VehicleIndex, PEDTYPE_COP, S_M_Y_SWAT_01, VS_BACK_RIGHT)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psSwat[0].PedIndex, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psSwat[1].PedIndex, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psSwat[2].PedIndex, FALSE)
FOR i = 0 TO 2
GIVE_WEAPON_TO_PED(psSwat[i].PedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO, FALSE)
GIVE_WEAPON_TO_PED(psSwat[i].PedIndex, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, FALSE)
SET_ENTITY_HEALTH(psSwat[i].PedIndex, 250)
ADD_ARMOUR_TO_PED(psSwat[i].PedIndex, 100)
SET_PED_HEARING_RANGE(psSwat[i].PedIndex, 150)
SET_PED_SEEING_RANGE(psSwat[i].PedIndex, 150)
SET_PED_ID_RANGE(psSwat[i].PedIndex, 150)
SET_PED_HIGHLY_PERCEPTIVE(psSwat[i].PedIndex, TRUE)
SET_PED_SHOOT_RATE(psSwat[i].PedIndex, 50)
SET_PED_ACCURACY(psSwat[i].PedIndex, 5)
ENDFOR
TASK_VEHICLE_AIM_AT_PED(psSwat[0].PedIndex, psLamar.PedIndex)
ADD_PED_FOR_DIALOGUE(sFranklin1Conversation, 8, NULL, "FRA1POLICE1")
SET_ENTITY_FOR_NULL_CONV_PED(8, vsPoliceHeli.VehicleIndex)
SET_VEHICLE_LIVERY(vsPoliceHeli.VehicleIndex, 0)
START_PLAYBACK_RECORDED_VEHICLE(vsPoliceHeli.VehicleIndex, vsPoliceHeli.iRecordingNumber, sVehicleRecordingsFile)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsPoliceHeli.VehicleIndex, TRUE)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsPoliceHeli.VehicleIndex)
SET_PLAYBACK_SPEED(vsPoliceHeli.VehicleIndex, fPlaybackSpeed)
SET_HELI_BLADES_FULL_SPEED(vsPoliceHeli.VehicleIndex)
SET_MODEL_AS_NO_LONGER_NEEDED(S_M_Y_SWAT_01)
SET_MODEL_AS_NO_LONGER_NEEDED(vsPoliceHeli.ModelName)
START_AUDIO_SCENE("FRANKLIN_1_JETSKI_HELI_ESCAPE")
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 3)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
ENDIF
psSwat[0].iPedConversationTimer = 0
iSearchLightChangeTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7500, 9000)
GO_TO_PED_STATE(ped, PED_STATE_RECORDING_PLAYBACK)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_RECORDING_PLAYBACK
UPDATE_WANTED_POSITION_THIS_FRAME(PLAYER_ID())
IF IS_VEHICLE_DRIVEABLE(vsPoliceHeli.VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsPoliceHeli.VehicleIndex)
SET_PLAYBACK_SPEED(vsPoliceHeli.VehicleIndex, fPlaybackSpeed)
ENDIF
IF NOT IS_PED_INJURED(psSwat[0].PedIndex)
IF GET_GAME_TIMER() - iSearchLightChangeTimer > 0
SWITCH GET_RANDOM_INT_IN_RANGE(0, 3)
CASE 0
IF NOT IS_PED_INJURED(psLamar.PedIndex)
TASK_VEHICLE_AIM_AT_PED(psSwat[0].PedIndex, psLamar.PedIndex)
ENDIF
BREAK
CASE 1
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
TASK_VEHICLE_AIM_AT_PED(psSwat[0].PedIndex, GET_PED_INDEX(CHAR_TREVOR))
ENDIF
BREAK
CASE 2
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_FRANKLIN))
TASK_VEHICLE_AIM_AT_PED(psSwat[0].PedIndex, GET_PED_INDEX(CHAR_FRANKLIN))
ENDIF
BREAK
ENDSWITCH
iSearchLightChangeTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(5000, 7500)
ENDIF
ENDIF
ENDIF
IF ( fPlaybackTime >= 80000.0 )
IF DOES_ENTITY_EXIST(vsPoliceHeli.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vsPoliceHeli.VehicleIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vsPoliceHeli.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vsPoliceHeli.iRecordingNumber, sVehicleRecordingsFile)
FOR i = 0 TO 2
IF DOES_ENTITY_EXIST(psSwat[i].PedIndex)
IF NOT IS_PED_INJURED(psSwat[i].PedIndex)
TASK_COMBAT_PED(psSwat[i].PedIndex, PLAYER_PED_ID(), COMBAT_PED_PREVENT_CHANGING_TARGET)
SET_PED_KEEP_TASK(psSwat[i].PedIndex, TRUE)
SET_PED_AS_NO_LONGER_NEEDED(psSwat[i].PedIndex)
ENDIF
ENDIF
ENDFOR
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsPoliceHeli.VehicleIndex)
ENDIF
ENDIF
/*
SET_CREATE_RANDOM_COPS(TRUE)
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), TRUE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_CRUISING, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_PULLED_OVER, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_BOAT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, TRUE)
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0.1)
*/
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_FROM_VEHICLE)
ENDIF
CLEANUP_PED_GROUP(psSwat, FALSE, TRUE)
CLEANUP_VEHICLE(vsPoliceHeli, FALSE, TRUE)
IF NOT IS_VEHICLE_DRIVEABLE(vsPoliceHeli.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vsPoliceHeli.iRecordingNumber, sVehicleRecordingsFile)
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_COP_BOAT(PED_STRUCT &ped)
INT i
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_VEHICLE_RECORDING_INFO(vsCopBoat.VehicleIndex, 0.0)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.0)
ENDIF
#ENDIF
SWITCH ped.eState
CASE PED_STATE_IDLE
IF NOT DOES_ENTITY_EXIST(vsCopBoat.VehicleIndex)
IF HAS_LABEL_BEEN_TRIGGERED("LOSE_WANTED")
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<696.544495,-2563.472168,-3.594771>>, <<679.044983,-2604.659912,10.139076>>, 16.000000)
REQUEST_MODEL(S_M_Y_COP_01)
REQUEST_MODEL(vsCopBoat.ModelName)
REQUEST_VEHICLE_RECORDING(vsCopBoat.iRecordingNumber, sVehicleRecordingsFile)
IF HAS_MODEL_LOADED(S_M_Y_COP_01)
AND HAS_MODEL_LOADED(vsCopBoat.ModelName)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsCopBoat.iRecordingNumber, sVehicleRecordingsFile)
vsCopBoat.VehicleIndex = CREATE_VEHICLE(vsCopBoat.ModelName, vsCopBoat.vPosition, vsCopBoat.fHeading)
psBoatCops[0].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsCopBoat.VehicleIndex, PEDTYPE_COP, S_M_Y_COP_01, VS_DRIVER)
psBoatCops[1].PedIndex = CREATE_PED_INSIDE_VEHICLE(vsCopBoat.VehicleIndex, PEDTYPE_COP, S_M_Y_COP_01, VS_BACK_LEFT)
REPEAT 2 i
GIVE_WEAPON_TO_PED(psBoatCops[i].PedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO, FALSE)
GIVE_WEAPON_TO_PED(psBoatCops[i].PedIndex, WEAPONTYPE_CARBINERIFLE, INFINITE_AMMO, FALSE)
SET_ENTITY_HEALTH(psBoatCops[i].PedIndex, 250)
ADD_ARMOUR_TO_PED(psBoatCops[i].PedIndex, 100)
SET_PED_HEARING_RANGE(psBoatCops[i].PedIndex, 150)
SET_PED_SEEING_RANGE(psBoatCops[i].PedIndex, 150)
SET_PED_ID_RANGE(psBoatCops[i].PedIndex, 150)
SET_PED_HIGHLY_PERCEPTIVE(psBoatCops[i].PedIndex, TRUE)
SET_PED_SHOOT_RATE(psBoatCops[i].PedIndex, 50)
SET_PED_ACCURACY(psBoatCops[i].PedIndex, 5)
ENDREPEAT
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psBoatCops[0].PedIndex, TRUE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsCopBoat.VehicleIndex, TRUE)
START_PLAYBACK_RECORDED_VEHICLE(vsCopBoat.VehicleIndex, vsCopBoat.iRecordingNumber, sVehicleRecordingsFile)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsCopBoat.VehicleIndex, 500.0)
SET_PLAYBACK_SPEED(vsCopBoat.VehicleIndex, 1.15)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vsCopBoat.VehicleIndex)
SET_MODEL_AS_NO_LONGER_NEEDED(S_M_Y_COP_01)
SET_MODEL_AS_NO_LONGER_NEEDED(vsCopBoat.ModelName)
GO_TO_PED_STATE(ped, PED_STATE_RECORDING_PLAYBACK)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_RECORDING_PLAYBACK
IF DOES_ENTITY_EXIST(vsCopBoat.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vsCopBoat.VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsCopBoat.VehicleIndex)
IF GET_TIME_POSITION_IN_RECORDING(vsCopBoat.VehicleIndex) > 2250.0
STOP_PLAYBACK_RECORDED_VEHICLE(vsCopBoat.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vsCopBoat.iRecordingNumber, sVehicleRecordingsFile)
REPEAT 2 i
IF DOES_ENTITY_EXIST(psBoatCops[i].PedIndex)
IF NOT IS_PED_INJURED(psBoatCops[i].PedIndex)
TASK_COMBAT_PED(psBoatCops[i].PedIndex, PLAYER_PED_ID())
SET_PED_KEEP_TASK(psBoatCops[i].PedIndex, TRUE)
SET_PED_AS_NO_LONGER_NEEDED(psBoatCops[i].PedIndex)
ENDIF
ENDIF
ENDREPEAT
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsCopBoat.VehicleIndex)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_CONVERSATIONS_DURING_SPEEDOPHILE_RIDE(INT &iProgress)
INT i
INT iEnemySpeakerID
STRING sEnemyVoiceName
STRING sEnemyConversationRoot
//might need a label here to store current root playing
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_PED_IN_ANY_VEHICLE(GET_PED_INDEX(CHAR_TREVOR))
OR NOT IS_PED_IN_ANY_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN))
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
SWITCH iProgress
CASE 0 //reset timers
iEnemyConversationTimer = GET_GAME_TIMER()
iEnemyRandomConversationDelay = 2000
iProgress++
BREAK
CASE 1
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_SRESC1")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_SRESC1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_SRESC1", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
//handle conversation for Lamar spotting the incoming drive by car
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_CARIN")
IF DOES_ENTITY_EXIST(vsEnemyLeftChaseCar.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vsEnemyLeftChaseCar.VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyLeftChaseCar.VehicleIndex)
IF ( psLamar.iProgress >= 1 )
IF DOES_ENTITY_EXIST(esLeftChaseEnemies[0].PedIndex)
OR DOES_ENTITY_EXIST(esLeftChaseEnemies[1].PedIndex)
IF ( esLeftChaseEnemies[0].iProgress > 0 ) //enemy ped not doing drive by
OR ( esLeftChaseEnemies[1].iProgress > 0 ) //enemy ped not doing drive by
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_CARIN", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_CARIN", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//handle conversation for enemies in car doing drive by
IF DOES_ENTITY_EXIST(vsEnemyLeftChaseCar.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vsEnemyLeftChaseCar.VehicleIndex)
IF ( vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime < 25000.0 )
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyLeftChaseCar.VehicleIndex)
IF DOES_ENTITY_EXIST(esLeftChaseEnemies[0].PedIndex)
OR DOES_ENTITY_EXIST(esLeftChaseEnemies[1].PedIndex)
IF esLeftChaseEnemies[0].iProgress > 0 //ped doing drive by - if is ped in combat from vehicle state?
OR esLeftChaseEnemies[1].iProgress > 0 //ped doing drive by - if is ped in combat from vehicle state?
IF HAS_TIME_PASSED(iEnemyRandomConversationDelay, iEnemyConversationTimer)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
i = GET_RANDOM_INT_IN_RANGE(0, 2)
IF NOT IS_ENTITY_DEAD(esLeftChaseEnemies[i].PedIndex)
SWITCH i
CASE 0
iEnemySpeakerID = BALLA5SPEAKERID
sEnemyVoiceName = BALLA5VOICENAME
sEnemyConversationRoot = "F1_BALL5D"
BREAK
CASE 1
iEnemySpeakerID = BALLA6SPEAKERID
sEnemyVoiceName = BALLA6VOICENAME
sEnemyConversationRoot = "F1_BALL6D"
BREAK
ENDSWITCH
ADD_PED_FOR_DIALOGUE(sFranklin1Conversation, iEnemySpeakerID, esLeftChaseEnemies[i].PedIndex, sEnemyVoiceName)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", sEnemyConversationRoot, CONV_PRIORITY_MEDIUM)
iEnemyConversationTimer = GET_GAME_TIMER()
iEnemyRandomConversationDelay = 3000 + GET_RANDOM_INT_IN_RANGE(0, 2001)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_SRPH")
IF DOES_ENTITY_EXIST(psSwat[0].PedIndex)
IF NOT IS_ENTITY_DEAD(psSwat[0].PedIndex)
IF ( vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime > 27000.0 )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_SRPH", CONV_PRIORITY_MEDIUM)
psSwat[0].iPedConversationTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("F1_SRPH", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_SRGIRLT")
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_SRGIRLF")
IF DOES_ENTITY_EXIST(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
AND NOT IS_ENTITY_DEAD(psFilmCrew[FCP_JACKEDGIRL].PedIndex)
AND IS_PED_IN_VEHICLE(psFilmCrew[FCP_JACKEDGIRL].PedIndex, vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex)
IF ( vsEnemyLeftChaseCar.bDriverDead = TRUE )
OR ( vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime > 25000.0 )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
ADD_PED_FOR_DIALOGUE(sFranklin1Conversation, 4, psFilmCrew[FCP_JACKEDGIRL].PedIndex, "FRA1MODEL1")
IF IS_PED_SITTING_IN_VEHICLE_SEAT(GET_PED_INDEX(CHAR_TREVOR), vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, VS_DRIVER)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_SRGIRLT", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_SRGIRLT", TRUE)
START_AUDIO_SCENE("FRANKLIN_1_JETSKI_GIRL_JUMP")
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", TRUE)
SET_AUDIO_FLAG("DisableAbortConversationForDeathAndInjury", TRUE)
ENDIF
ELIF IS_PED_SITTING_IN_VEHICLE_SEAT(GET_PED_INDEX(CHAR_FRANKLIN), vsSpeedophiles[SPEEDOPHILE_1].VehicleIndex, VS_DRIVER)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_SRGIRLF", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_SRGIRLF", TRUE)
START_AUDIO_SCENE("FRANKLIN_1_JETSKI_GIRL_JUMP")
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", TRUE)
SET_AUDIO_FLAG("DisableAbortConversationForDeathAndInjury", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
TEXT_LABEL_23 LocalConversationRoot, LocalConversationLabel
LocalConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
LocalConversationLabel = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL()
IF NOT IS_STRING_NULL_OR_EMPTY(LocalConversationRoot)
AND NOT IS_STRING_NULL_OR_EMPTY(LocalConversationLabel)
IF ARE_STRINGS_EQUAL(LocalConversationRoot, "F1_SRGIRLT")
OR ARE_STRINGS_EQUAL(LocalConversationRoot, "F1_SRGIRLF")
IF ARE_STRINGS_EQUAL(LocalConversationLabel, "F1_SRGIRLT_7")
OR ARE_STRINGS_EQUAL(LocalConversationLabel, "F1_SRGIRLF_6")
OR ( psFilmCrew[FCP_JACKEDGIRL].eState = PED_STATE_FLEEING )
IF ( psFilmCrew[FCP_JACKEDGIRL].eState = PED_STATE_FLEEING )
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
bJackedGirlConversationFinished = TRUE
ENDIF
ENDIF
ENDIF
ELSE
bJackedGirlConversationFinished = TRUE
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", FALSE)
SET_AUDIO_FLAG("DisableAbortConversationForDeathAndInjury", FALSE)
ENDIF
ENDIF
IF ( vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime >= 29750.0 )
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_SRESC2")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF ( HAS_LABEL_BEEN_TRIGGERED("F1_SRGIRLF") AND iJackedGirlAmbientSpeechDelay <> 0 AND HAS_TIME_PASSED(3000, iJackedGirlAmbientSpeechDelay) )
OR ( HAS_LABEL_BEEN_TRIGGERED("F1_SRGIRLT") AND iJackedGirlAmbientSpeechDelay <> 0 AND HAS_TIME_PASSED(3000, iJackedGirlAmbientSpeechDelay) )
OR ( NOT HAS_LABEL_BEEN_TRIGGERED("F1_SRGIRLF") AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_SRGIRLT") )
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_SRESC2", CONV_PRIORITY_VERY_HIGH)
SET_LABEL_AS_TRIGGERED("F1_SRESC2", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_SRESC3")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF ( HAS_LABEL_BEEN_TRIGGERED("F1_SRGIRLF") AND iJackedGirlAmbientSpeechDelay <> 0 AND HAS_TIME_PASSED(3000, iJackedGirlAmbientSpeechDelay) )
OR ( HAS_LABEL_BEEN_TRIGGERED("F1_SRGIRLT") AND iJackedGirlAmbientSpeechDelay <> 0 AND HAS_TIME_PASSED(3000, iJackedGirlAmbientSpeechDelay) )
OR ( NOT HAS_LABEL_BEEN_TRIGGERED("F1_SRGIRLF") AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_SRGIRLT") )
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_SRESC3", CONV_PRIORITY_VERY_HIGH)
SET_LABEL_AS_TRIGGERED("F1_SRESC3", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_SRRACE")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF ( HAS_LABEL_BEEN_TRIGGERED("F1_SRGIRLF") AND iJackedGirlAmbientSpeechDelay <> 0 AND HAS_TIME_PASSED(3000, iJackedGirlAmbientSpeechDelay) )
OR ( HAS_LABEL_BEEN_TRIGGERED("F1_SRGIRLT") AND iJackedGirlAmbientSpeechDelay <> 0 AND HAS_TIME_PASSED(3000, iJackedGirlAmbientSpeechDelay) )
OR ( NOT HAS_LABEL_BEEN_TRIGGERED("F1_SRGIRLF") AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_SRGIRLT") )
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_SRRACE", CONV_PRIORITY_VERY_HIGH)
SET_LABEL_AS_TRIGGERED("F1_SRRACE", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC UPDATE_VEHICLE_SPINNING_WHEN_SHOT(VEHICLE_INDEX VehicleIndex, INT &iSpinTimer, FLOAT fPlaybackSpeed, BOOL bSpinLeft = FALSE)
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
PED_INDEX DriverPedIndex = GET_PED_IN_VEHICLE_SEAT(VehicleIndex, VS_DRIVER)
IF iSpinTimer = 0
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(VehicleIndex)
iSpinTimer = 1
ENDIF
ELIF iSpinTimer = 1
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(VehicleIndex)
IF ABSF(GET_ENTITY_SPEED(VehicleIndex)) > 4.0
IF DOES_ENTITY_EXIST(DriverPedIndex)
AND IS_PED_INJURED(DriverPedIndex)
//check for player damage to the driver and award a stat if player killed the driver ped
ENTITY_INDEX SourceOfDeathEntity = GET_PED_SOURCE_OF_DEATH(DriverPedIndex)
IF DOES_ENTITY_EXIST(SourceOfDeathEntity)
IF ( GET_PED_INDEX_FROM_ENTITY_INDEX(SourceOfDeathEntity) = PLAYER_PED_ID() )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player killed the driver ped of the enemy vehicle.")
#ENDIF
//INFORM_STAT_FRANKLIN_ONE_DRIVE_BY_FOILED()
ENDIF
ENDIF
STOP_PLAYBACK_RECORDED_VEHICLE(VehicleIndex)
SET_VEHICLE_ENGINE_HEALTH(VehicleIndex, 30.0)
SET_VEHICLE_PETROL_TANK_HEALTH(VehicleIndex, 2000.0)
REPLAY_RECORD_BACK_FOR_TIME(5, 0, REPLAY_IMPORTANCE_HIGH)
iSpinTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ELIF GET_GAME_TIMER() - iSpinTimer < 800
INT iForceModifier = 1
IF NOT bSpinLeft
iForceModifier = -1
ENDIF
APPLY_FORCE_TO_ENTITY(VehicleIndex, APPLY_TYPE_FORCE, << 20.0 * iForceModifier * fPlaybackSpeed, 0.0, 0.0 >>, <<0.0, 1.8, 0.0>>, 0, TRUE, TRUE, TRUE)
ELSE
//Kill the car off
SET_VEHICLE_ENGINE_HEALTH(VehicleIndex, -100.0)
SET_ENTITY_HEALTH(VehicleIndex, 1)
//kill the remainining passengers
PED_INDEX FrontRightPedIndex = GET_PED_IN_VEHICLE_SEAT(VehicleIndex, VS_FRONT_RIGHT)
PED_INDEX BackLeftPedIndex = GET_PED_IN_VEHICLE_SEAT(VehicleIndex, VS_BACK_LEFT)
PED_INDEX BackRightPedIndex = GET_PED_IN_VEHICLE_SEAT(VehicleIndex, VS_BACK_RIGHT)
IF NOT IS_PED_INJURED(FrontRightPedIndex)
SET_ENTITY_HEALTH(FrontRightPedIndex, 0)
ENDIF
IF NOT IS_PED_INJURED(BackLeftPedIndex)
SET_ENTITY_HEALTH(BackLeftPedIndex, 0)
ENDIF
IF NOT IS_PED_INJURED(BackRightPedIndex)
SET_ENTITY_HEALTH(BackRightPedIndex, 0)
ENDIF
//stop audio scenes when vehicle is taken out
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_01_JETSKI_CHASE_CAR")
STOP_AUDIO_SCENE("FRANKLIN_01_JETSKI_CHASE_CAR")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping audio scene FRANKLIN_01_JETSKI_CHASE_CAR")
#ENDIF
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_1_JETSKI_CAR_ARRIVE")
STOP_AUDIO_SCENE("FRANKLIN_1_JETSKI_CAR_ARRIVE")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping audio scene FRANKLIN_1_JETSKI_CAR_ARRIVE")
#ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsEnemyLeftChaseCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsEnemyLeftChaseCar.VehicleIndex)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vsEnemyLeftChaseCar.VehicleIndex)
ENDIF
ENDIF
vsEnemyLeftChaseCar.bDriverDead = TRUE
ENDIF
ENDIF
ENDPROC
PROC MANAGE_LEFT_ENEMY_CAR_DURING_SPEEDOPHILE_RIDE(INT &iProgress, FLOAT fPlaybackTime, FLOAT fPlaybackSpeed)
SWITCH iProgress
CASE 0
IF NOT DOES_ENTITY_EXIST(vsEnemyLeftChaseCar.VehicleIndex)
REQUEST_VEHICLE_RECORDING(vsEnemyLeftChaseCar.iRecordingNumber, sVehicleRecordingsFile)
IF HAS_MODEL_LOADED(mnBalla)
AND HAS_MODEL_LOADED(vsEnemyLeftChaseCar.ModelName)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsEnemyLeftChaseCar.iRecordingNumber, sVehicleRecordingsFile)
IF fPlaybackTime > 7000.0
vsEnemyLeftChaseCar.VehicleIndex = CREATE_ENEMY_VEHICLE(vsEnemyLeftChaseCar, 1000, TRUE, VEHICLELOCK_UNLOCKED, -1, -1 #IF IS_DEBUG_BUILD, "Chase Car" #ENDIF)
esLeftChaseEnemies[0].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnBalla, vsEnemyLeftChaseCar.VehicleIndex, VS_DRIVER, rgEnemies, WEAPONTYPE_MICROSMG, 245)
esLeftChaseEnemies[1].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnBalla, vsEnemyLeftChaseCar.VehicleIndex, VS_FRONT_RIGHT, rgEnemies, WEAPONTYPE_MICROSMG, 245)
INITIALISE_ENEMY_GROUP(esLeftChaseEnemies, FALSE #IF IS_DEBUG_BUILD, "Chase " #ENDIF)
bRenderEnemyBlips = FALSE //make the car invisible and don't render enemy blips
SET_ENTITY_VISIBLE(vsEnemyLeftChaseCar.VehicleIndex, FALSE) //just after creation
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsEnemyLeftChaseCar.VehicleIndex, TRUE)
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vsEnemyLeftChaseCar, sVehicleRecordingsFile, fPlaybackSpeed, FALSE, 50.0)// + 500.0)
SET_MODEL_AS_NO_LONGER_NEEDED(mnBalla)
SET_MODEL_AS_NO_LONGER_NEEDED(vsEnemyLeftChaseCar.ModelName)
START_AUDIO_SCENE("FRANKLIN_01_JETSKI_CHASE_CAR")
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vsEnemyLeftChaseCar.VehicleIndex, "FRANKLIN_01_GHETTO_SAFARI_GANG_CAR")
START_AUDIO_SCENE("FRANKLIN_1_JETSKI_CAR_ARRIVE")
iProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF DOES_ENTITY_EXIST(vsEnemyLeftChaseCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsEnemyLeftChaseCar.VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyLeftChaseCar.VehicleIndex)
SET_PLAYBACK_SPEED(vsEnemyLeftChaseCar.VehicleIndex, fPlaybackSpeed)
ENDIF
IF NOT IS_ENTITY_VISIBLE(vsEnemyLeftChaseCar.VehicleIndex) //make the car visible and render enemy blips
IF ( fPlaybackTime > 8000.0 )
SET_ENTITY_VISIBLE(vsEnemyLeftChaseCar.VehicleIndex, TRUE)
bRenderEnemyBlips = TRUE
ENDIF
ENDIF
ENDIF
IF ( fPlaybackTime > 30000.0 )
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_01_JETSKI_CHASE_CAR")
STOP_AUDIO_SCENE("FRANKLIN_01_JETSKI_CHASE_CAR")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping audio scene FRANKLIN_01_JETSKI_CHASE_CAR")
#ENDIF
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_1_JETSKI_CAR_ARRIVE")
STOP_AUDIO_SCENE("FRANKLIN_1_JETSKI_CAR_ARRIVE")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping audio scene FRANKLIN_1_JETSKI_CAR_ARRIVE")
#ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsEnemyLeftChaseCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsEnemyLeftChaseCar.VehicleIndex)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vsEnemyLeftChaseCar.VehicleIndex)
ENDIF
ENDIF
ENDIF
IF ( fPlaybackTime > 35000.0 ) //cleanup vehicle and peds based on recording playback time
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsEnemyLeftChaseCar.VehicleIndex)
IF DOES_ENTITY_EXIST(esLeftChaseEnemies[0].PedIndex)
SET_PED_AS_NO_LONGER_NEEDED(esLeftChaseEnemies[0].PedIndex)
ENDIF
IF DOES_ENTITY_EXIST(esLeftChaseEnemies[1].PedIndex)
SET_PED_AS_NO_LONGER_NEEDED(esLeftChaseEnemies[1].PedIndex)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esLeftChaseEnemies[0].PedIndex)
IF NOT IS_ENTITY_DEAD(esLeftChaseEnemies[0].PedIndex)
SWITCH esLeftChaseEnemies[0].iProgress
CASE 0
IF ( fPlaybackTime >= 15350.0 )
OR IS_PED_SHOOTING_AT_ENEMIES(PLAYER_PED_ID(), esLeftChaseEnemies)
esLeftChaseEnemies[0].bHasTask = FALSE
esLeftChaseEnemies[0].iProgress++
ENDIF
BREAK
CASE 1
IF (esLeftChaseEnemies[0].bHasTask = FALSE )
SET_PED_SEEING_RANGE(esLeftChaseEnemies[0].PedIndex, 100.0)
SET_PED_HEARING_RANGE(esLeftChaseEnemies[0].PedIndex, 100.0)
SET_PED_COMBAT_ATTRIBUTES(esLeftChaseEnemies[0].PedIndex, CA_USE_VEHICLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esLeftChaseEnemies[0].PedIndex, CA_DO_DRIVEBYS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esLeftChaseEnemies[0].PedIndex, CA_LEAVE_VEHICLES, FALSE)
SET_PED_SHOOTING_PROPERTIES(esLeftChaseEnemies[0].PedIndex, 5, 50)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esLeftChaseEnemies[0].PedIndex, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esLeftChaseEnemies[0].PedIndex, TRUE)
esLeftChaseEnemies[0].bHasTask = TRUE
ENDIF
//kill the ped for now when playback stops
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyLeftChaseCar.VehicleIndex)
IF NOT IS_PED_IN_CURRENT_CONVERSATION(esLeftChaseEnemies[0].PedIndex)
SET_ENTITY_HEALTH(esLeftChaseEnemies[0].PedIndex, 0)
vsEnemyLeftChaseCar.bDriverDead = TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esLeftChaseEnemies[1].PedIndex)
IF NOT IS_ENTITY_DEAD(esLeftChaseEnemies[1].PedIndex)
SWITCH esLeftChaseEnemies[1].iProgress
CASE 0
IF ( fPlaybackTime >= 15000.0 )
OR IS_PED_SHOOTING_AT_ENEMIES(PLAYER_PED_ID(), esLeftChaseEnemies)
esLeftChaseEnemies[1].bHasTask = FALSE
esLeftChaseEnemies[1].iProgress++
ENDIF
BREAK
CASE 1
IF ( esLeftChaseEnemies[1].bHasTask = FALSE )
SET_PED_SEEING_RANGE(esLeftChaseEnemies[1].PedIndex, 100.0)
SET_PED_HEARING_RANGE(esLeftChaseEnemies[1].PedIndex, 100.0)
SET_PED_COMBAT_ATTRIBUTES(esLeftChaseEnemies[1].PedIndex, CA_USE_VEHICLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esLeftChaseEnemies[1].PedIndex, CA_DO_DRIVEBYS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esLeftChaseEnemies[1].PedIndex, CA_LEAVE_VEHICLES, FALSE)
SET_PED_SHOOTING_PROPERTIES(esLeftChaseEnemies[1].PedIndex, 5, 50)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esLeftChaseEnemies[1].PedIndex, 100.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esLeftChaseEnemies[1].PedIndex, TRUE)
esLeftChaseEnemies[1].bHasTask = TRUE
ENDIF
//kill the ped for now when playback stops
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyLeftChaseCar.VehicleIndex)
IF NOT IS_PED_IN_CURRENT_CONVERSATION(esLeftChaseEnemies[1].PedIndex)
SET_ENTITY_HEALTH(esLeftChaseEnemies[1].PedIndex, 0)
vsEnemyLeftChaseCar.bDriverDead = TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
UPDATE_VEHICLE_SPINNING_WHEN_SHOT(vsEnemyLeftChaseCar.VehicleIndex, esLeftChaseEnemies[0].iTimer, fPlaybackSpeed, FALSE)
BREAK
ENDSWITCH
CLEANUP_ENEMY_GROUP(esLeftChaseEnemies, FALSE, TRUE, FALSE)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esLeftChaseEnemies, bRenderEnemyBlips)
ENDPROC
PROC MANAGE_MISSION_TRAIN(INT &iProgress, FLOAT fTime)
SWITCH iProgress
CASE 0
IF ( fTime >= 29000.0 )
IF HAS_MISSION_TRAIN_BEEN_CREATED(sMissionTrain, 12.5, FALSE)
iProgress++
ENDIF
ENDIF
BREAK
CASE 1
IF DOES_ENTITY_EXIST(sMissionTrain.VehicleIndex)
IF IS_ENTITY_AT_COORD(sMissionTrain.VehicleIndex, << 351.22, -2615.83, 13.01>>, << 16.0, 6.0, 4.0 >>)
//or playback time reached
IF NOT IS_ENTITY_DEAD(sMissionTrain.VehicleIndex)
DELETE_MISSION_TRAIN(sMissionTrain.VehicleIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Deleted mission train.")
#ENDIF
iProgress++
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_FIRST_RIVER_COP_CAR(VEH_STRUCT &vehicle, PED_STRUCT &peds[], FLOAT fPlaybackTime)
INT i
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE)
DRAW_DEBUG_VEHICLE_RECORDING_INFO(vehicle.VehicleIndex, 1.0)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(peds[0].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(peds[0].eState), 1.25)
REPEAT 2 i
DRAW_DEBUG_TEXT_ABOVE_ENTITY(peds[i].PedIndex, GET_STRING_FROM_FLOAT(peds[i].fDistanceToTargetPed), 1.5)
ENDREPEAT
ENDIF
#ENDIF
SWITCH peds[0].eState
CASE PED_STATE_IDLE
IF NOT DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF ( fPlaybackTime >= 25000.0 )
REQUEST_MODEL(POLICE3)
REQUEST_MODEL(S_M_Y_COP_01)
REQUEST_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
IF HAS_MODEL_LOADED(POLICE3)
AND HAS_MODEL_LOADED(S_M_Y_COP_01)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vehicle.iRecordingNumber, sVehicleRecordingsFile)
IF fPlaybackTime >= 30500.0
vehicle.VehicleIndex = CREATE_VEHICLE(POLICE3, vehicle.vPosition, vehicle.fHeading)
peds[0].PedIndex = CREATE_PED_INSIDE_VEHICLE(vehicle.VehicleIndex, PEDTYPE_COP, S_M_Y_COP_01, VS_DRIVER)
peds[1].PedIndex = CREATE_PED_INSIDE_VEHICLE(vehicle.VehicleIndex, PEDTYPE_COP, S_M_Y_COP_01, VS_FRONT_RIGHT)
//give weapons to cop peds
GIVE_WEAPON_TO_PED(peds[0].PedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO)
GIVE_WEAPON_TO_PED(peds[1].PedIndex, WEAPONTYPE_PUMPSHOTGUN, INFINITE_AMMO)
SET_PED_TARGET_LOSS_RESPONSE(peds[0].PedIndex, TLR_SEARCH_FOR_TARGET)
SET_PED_TARGET_LOSS_RESPONSE(peds[1].PedIndex, TLR_SEARCH_FOR_TARGET)
//start vehicle recording playback
SET_VEHICLE_SIREN(vehicle.VehicleIndex, TRUE)
SET_VEHICLE_ENGINE_ON(vehicle.VehicleIndex, TRUE, TRUE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehicle.VehicleIndex, TRUE)
START_PLAYBACK_RECORDED_VEHICLE(vehicle.VehicleIndex, vehicle.iRecordingNumber, sVehicleRecordingsFile)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehicle.VehicleIndex)
peds[0].iProgress = 0
peds[0].bHasTask = FALSE
peds[1].iProgress = 0
peds[1].bHasTask = FALSE
GO_TO_PED_STATE(peds[0], PED_STATE_RECORDING_PLAYBACK)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_RECORDING_PLAYBACK
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vehicle.VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
GO_TO_PED_STATE(peds[0], PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
REPEAT 2 i
IF DOES_ENTITY_EXIST(peds[i].PedIndex)
peds[i].fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(peds[i].PedIndex, PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(peds[i].PedIndex)
SWITCH peds[i].iProgress
CASE 0
IF ( peds[i].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(peds[i].PedIndex, CA_USE_COVER, FALSE)
SET_PED_COMBAT_ATTRIBUTES(peds[i].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(peds[i].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_ACCURACY(peds[i].PedIndex, 2)
SET_PED_SHOOT_RATE(peds[i].PedIndex, 125)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(peds[i].PedIndex, 250.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[i].PedIndex, FALSE)
peds[i].bHasTask = TRUE
ENDIF
IF fPlaybackTime >= 60000.0
IF ( peds[i].fDistanceToTargetPed > 250.0 )
SET_PED_AS_NO_LONGER_NEEDED(peds[i].PedIndex)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDREPEAT
CLEANUP_PED_GROUP(peds, FALSE, TRUE)
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF NOT DOES_ENTITY_EXIST(peds[0].PedIndex)
AND NOT DOES_ENTITY_EXIST(peds[1].PedIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_SECOND_RIVER_COP_CAR(VEH_STRUCT &vehicle, PED_STRUCT &peds[], FLOAT fPlaybackTime)
INT i
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE)
DRAW_DEBUG_VEHICLE_RECORDING_INFO(vehicle.VehicleIndex, 1.0)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(peds[0].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(peds[0].eState), 1.25)
REPEAT 2 i
DRAW_DEBUG_TEXT_ABOVE_ENTITY(peds[i].PedIndex, GET_STRING_FROM_FLOAT(peds[i].fDistanceToTargetPed), 1.5)
ENDREPEAT
ENDIF
#ENDIF
SWITCH peds[0].eState
CASE PED_STATE_IDLE
IF NOT DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF ( fPlaybackTime >= 26000.0 )
REQUEST_MODEL(POLICE3)
REQUEST_MODEL(S_M_Y_COP_01)
REQUEST_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
IF HAS_MODEL_LOADED(POLICE3)
AND HAS_MODEL_LOADED(S_M_Y_COP_01)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vehicle.iRecordingNumber, sVehicleRecordingsFile)
IF fPlaybackTime >= 32000.0
vehicle.VehicleIndex = CREATE_VEHICLE(POLICE3, vehicle.vPosition, vehicle.fHeading)
peds[0].PedIndex = CREATE_PED_INSIDE_VEHICLE(vehicle.VehicleIndex, PEDTYPE_COP, S_M_Y_COP_01, VS_DRIVER)
peds[1].PedIndex = CREATE_PED_INSIDE_VEHICLE(vehicle.VehicleIndex, PEDTYPE_COP, S_M_Y_COP_01, VS_FRONT_RIGHT)
//give weapons to cop peds
GIVE_WEAPON_TO_PED(peds[0].PedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO)
GIVE_WEAPON_TO_PED(peds[1].PedIndex, WEAPONTYPE_PUMPSHOTGUN, INFINITE_AMMO)
SET_PED_TARGET_LOSS_RESPONSE(peds[0].PedIndex, TLR_SEARCH_FOR_TARGET)
SET_PED_TARGET_LOSS_RESPONSE(peds[1].PedIndex, TLR_SEARCH_FOR_TARGET)
//start vehicle recording playback
SET_VEHICLE_SIREN(vehicle.VehicleIndex, TRUE)
SET_VEHICLE_ENGINE_ON(vehicle.VehicleIndex, TRUE, TRUE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehicle.VehicleIndex, TRUE)
START_PLAYBACK_RECORDED_VEHICLE(vehicle.VehicleIndex, vehicle.iRecordingNumber, sVehicleRecordingsFile)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehicle.VehicleIndex)
peds[0].iProgress = 0
peds[0].bHasTask = FALSE
peds[1].iProgress = 0
peds[1].bHasTask = FALSE
GO_TO_PED_STATE(peds[0], PED_STATE_RECORDING_PLAYBACK)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_RECORDING_PLAYBACK
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vehicle.VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
GO_TO_PED_STATE(peds[0], PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
REPEAT 2 i
IF DOES_ENTITY_EXIST(peds[i].PedIndex)
peds[i].fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(peds[i].PedIndex, PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(peds[i].PedIndex)
SWITCH peds[i].iProgress
CASE 0
IF ( peds[i].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(peds[i].PedIndex, CA_USE_COVER, FALSE)
SET_PED_COMBAT_ATTRIBUTES(peds[i].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(peds[i].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_ACCURACY(peds[i].PedIndex, 2)
SET_PED_SHOOT_RATE(peds[i].PedIndex, 125)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(peds[i].PedIndex, 250.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[i].PedIndex, FALSE)
peds[i].bHasTask = TRUE
ENDIF
IF fPlaybackTime >= 60000.0
IF ( peds[i].fDistanceToTargetPed > 250.0 )
SET_PED_AS_NO_LONGER_NEEDED(peds[i].PedIndex)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDREPEAT
CLEANUP_PED_GROUP(peds, FALSE, TRUE)
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF NOT DOES_ENTITY_EXIST(peds[0].PedIndex)
AND NOT DOES_ENTITY_EXIST(peds[1].PedIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_THIRD_RIVER_COP_CAR(VEH_STRUCT &vehicle, PED_STRUCT &peds[], FLOAT fPlaybackTime)
INT i
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE)
DRAW_DEBUG_VEHICLE_RECORDING_INFO(vehicle.VehicleIndex, 1.0)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(peds[0].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(peds[0].eState), 1.25)
REPEAT 2 i
DRAW_DEBUG_TEXT_ABOVE_ENTITY(peds[i].PedIndex, GET_STRING_FROM_FLOAT(peds[i].fDistanceToTargetPed), 1.5)
ENDREPEAT
ENDIF
#ENDIF
SWITCH peds[0].eState
CASE PED_STATE_IDLE
IF NOT DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF ( fPlaybackTime >= 42000.0 )
REQUEST_MODEL(POLICE3)
REQUEST_MODEL(S_M_Y_COP_01)
REQUEST_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
IF HAS_MODEL_LOADED(POLICE3)
AND HAS_MODEL_LOADED(S_M_Y_COP_01)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vehicle.iRecordingNumber, sVehicleRecordingsFile)
IF fPlaybackTime >= 47000.0
vehicle.VehicleIndex = CREATE_VEHICLE(POLICE3, vehicle.vPosition, vehicle.fHeading)
peds[0].PedIndex = CREATE_PED_INSIDE_VEHICLE(vehicle.VehicleIndex, PEDTYPE_COP, S_M_Y_COP_01, VS_DRIVER)
peds[1].PedIndex = CREATE_PED_INSIDE_VEHICLE(vehicle.VehicleIndex, PEDTYPE_COP, S_M_Y_COP_01, VS_FRONT_RIGHT)
//give weapons to cop peds
GIVE_WEAPON_TO_PED(peds[0].PedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO)
GIVE_WEAPON_TO_PED(peds[1].PedIndex, WEAPONTYPE_PUMPSHOTGUN, INFINITE_AMMO)
SET_PED_TARGET_LOSS_RESPONSE(peds[0].PedIndex, TLR_SEARCH_FOR_TARGET)
SET_PED_TARGET_LOSS_RESPONSE(peds[1].PedIndex, TLR_SEARCH_FOR_TARGET)
//start vehicle recording playback
SET_VEHICLE_SIREN(vehicle.VehicleIndex, TRUE)
SET_VEHICLE_ENGINE_ON(vehicle.VehicleIndex, TRUE, TRUE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehicle.VehicleIndex, TRUE)
START_PLAYBACK_RECORDED_VEHICLE(vehicle.VehicleIndex, vehicle.iRecordingNumber, sVehicleRecordingsFile)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehicle.VehicleIndex)
peds[0].iProgress = 0
peds[0].bHasTask = FALSE
peds[1].iProgress = 0
peds[1].bHasTask = FALSE
GO_TO_PED_STATE(peds[0], PED_STATE_RECORDING_PLAYBACK)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_RECORDING_PLAYBACK
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vehicle.VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
GO_TO_PED_STATE(peds[0], PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
REPEAT 2 i
IF DOES_ENTITY_EXIST(peds[i].PedIndex)
peds[i].fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(peds[i].PedIndex, PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(peds[i].PedIndex)
SWITCH peds[i].iProgress
CASE 0
IF ( peds[i].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(peds[i].PedIndex, CA_USE_COVER, FALSE)
SET_PED_COMBAT_ATTRIBUTES(peds[i].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(peds[i].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_ACCURACY(peds[i].PedIndex, 2)
SET_PED_SHOOT_RATE(peds[i].PedIndex, 125)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(peds[i].PedIndex, 250.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[i].PedIndex, FALSE)
peds[i].bHasTask = TRUE
ENDIF
IF fPlaybackTime >= 70000.0
IF ( peds[i].fDistanceToTargetPed > 250.0 )
SET_PED_AS_NO_LONGER_NEEDED(peds[i].PedIndex)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDREPEAT
CLEANUP_PED_GROUP(peds, FALSE, TRUE)
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF NOT DOES_ENTITY_EXIST(peds[0].PedIndex)
AND NOT DOES_ENTITY_EXIST(peds[1].PedIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_FOURTH_RIVER_COP_CAR(VEH_STRUCT &vehicle, PED_STRUCT &peds[], FLOAT fPlaybackTime)
INT i
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE)
DRAW_DEBUG_VEHICLE_RECORDING_INFO(vehicle.VehicleIndex, 1.0)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(peds[0].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(peds[0].eState), 1.25)
REPEAT 2 i
DRAW_DEBUG_TEXT_ABOVE_ENTITY(peds[i].PedIndex, GET_STRING_FROM_FLOAT(peds[i].fDistanceToTargetPed), 1.5)
ENDREPEAT
ENDIF
#ENDIF
SWITCH peds[0].eState
CASE PED_STATE_IDLE
IF NOT DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF ( fPlaybackTime >= 55000.0 )
REQUEST_MODEL(POLICE3)
REQUEST_MODEL(S_M_Y_COP_01)
REQUEST_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
IF HAS_MODEL_LOADED(POLICE3)
AND HAS_MODEL_LOADED(S_M_Y_COP_01)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vehicle.iRecordingNumber, sVehicleRecordingsFile)
IF fPlaybackTime >= 60000.0
vehicle.VehicleIndex = CREATE_VEHICLE(POLICE3, vehicle.vPosition, vehicle.fHeading)
peds[0].PedIndex = CREATE_PED_INSIDE_VEHICLE(vehicle.VehicleIndex, PEDTYPE_COP, S_M_Y_COP_01, VS_DRIVER)
peds[1].PedIndex = CREATE_PED_INSIDE_VEHICLE(vehicle.VehicleIndex, PEDTYPE_COP, S_M_Y_COP_01, VS_FRONT_RIGHT)
//give weapons to cop peds
GIVE_WEAPON_TO_PED(peds[0].PedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO)
GIVE_WEAPON_TO_PED(peds[1].PedIndex, WEAPONTYPE_PUMPSHOTGUN, INFINITE_AMMO)
SET_PED_TARGET_LOSS_RESPONSE(peds[0].PedIndex, TLR_SEARCH_FOR_TARGET)
SET_PED_TARGET_LOSS_RESPONSE(peds[1].PedIndex, TLR_SEARCH_FOR_TARGET)
//start vehicle recording playback
SET_VEHICLE_SIREN(vehicle.VehicleIndex, TRUE)
SET_VEHICLE_ENGINE_ON(vehicle.VehicleIndex, TRUE, TRUE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehicle.VehicleIndex, TRUE)
START_PLAYBACK_RECORDED_VEHICLE(vehicle.VehicleIndex, vehicle.iRecordingNumber, sVehicleRecordingsFile)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehicle.VehicleIndex)
peds[0].iProgress = 0
peds[0].bHasTask = FALSE
peds[1].iProgress = 0
peds[1].bHasTask = FALSE
iReplayCameraWarpTimer = GET_GAME_TIMER() + 1000 //Fix for bug 2229916
GO_TO_PED_STATE(peds[0], PED_STATE_RECORDING_PLAYBACK)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_RECORDING_PLAYBACK
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vehicle.VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicle.VehicleIndex)
REMOVE_VEHICLE_RECORDING(vehicle.iRecordingNumber, sVehicleRecordingsFile)
GO_TO_PED_STATE(peds[0], PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
REPEAT 2 i
IF DOES_ENTITY_EXIST(peds[i].PedIndex)
peds[i].fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(peds[i].PedIndex, PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(peds[i].PedIndex)
SWITCH peds[i].iProgress
CASE 0
IF ( peds[i].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(peds[i].PedIndex, CA_USE_COVER, FALSE)
SET_PED_COMBAT_ATTRIBUTES(peds[i].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(peds[i].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_ACCURACY(peds[i].PedIndex, 2)
SET_PED_SHOOT_RATE(peds[i].PedIndex, 125)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(peds[i].PedIndex, 250.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[i].PedIndex, FALSE)
peds[i].bHasTask = TRUE
ENDIF
IF fPlaybackTime >= 85000.0
IF ( peds[i].fDistanceToTargetPed > 300.0 )
SET_PED_AS_NO_LONGER_NEEDED(peds[i].PedIndex)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDREPEAT
CLEANUP_PED_GROUP(peds, FALSE, TRUE)
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF NOT DOES_ENTITY_EXIST(peds[0].PedIndex)
AND NOT DOES_ENTITY_EXIST(peds[1].PedIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
ENDIF
ENDIF
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
CLEANUP_PED_GROUP(peds, FALSE, FALSE, FALSE)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_FIFTH_RIVER_COP_CAR(VEH_STRUCT &vehicle, PED_STRUCT &peds[], FLOAT fPlaybackTime)
INT i
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE)
DRAW_DEBUG_VEHICLE_RECORDING_INFO(vehicle.VehicleIndex, 1.0)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(peds[0].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(peds[0].eState), 1.25)
REPEAT 2 i
DRAW_DEBUG_TEXT_ABOVE_ENTITY(peds[i].PedIndex, GET_STRING_FROM_FLOAT(peds[i].fDistanceToTargetPed), 1.5)
ENDREPEAT
ENDIF
#ENDIF
SWITCH peds[0].eState
CASE PED_STATE_IDLE
IF NOT DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF ( fPlaybackTime >= 60000.0 )
REQUEST_MODEL(POLICE3)
REQUEST_MODEL(S_M_Y_COP_01)
IF HAS_MODEL_LOADED(POLICE3)
AND HAS_MODEL_LOADED(S_M_Y_COP_01)
IF fPlaybackTime >= 62000.0
vehicle.VehicleIndex = CREATE_VEHICLE(POLICE3, vehicle.vPosition, vehicle.fHeading)
peds[0].PedIndex = CREATE_PED(PEDTYPE_COP, S_M_Y_COP_01, <<693.4204, -2529.8364, 11.4264>>, 115.3417)
peds[1].PedIndex = CREATE_PED(PEDTYPE_COP, S_M_Y_COP_01, <<691.3856, -2529.0046, 11.4266>>, 103.4375)
//give weapons to cop peds
GIVE_WEAPON_TO_PED(peds[0].PedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO)
GIVE_WEAPON_TO_PED(peds[1].PedIndex, WEAPONTYPE_PUMPSHOTGUN, INFINITE_AMMO)
SET_PED_TARGET_LOSS_RESPONSE(peds[0].PedIndex, TLR_SEARCH_FOR_TARGET)
SET_PED_TARGET_LOSS_RESPONSE(peds[1].PedIndex, TLR_SEARCH_FOR_TARGET)
SET_VEHICLE_SIREN(vehicle.VehicleIndex, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(POLICE3)
SET_MODEL_AS_NO_LONGER_NEEDED(S_M_Y_COP_01)
peds[0].iProgress = 0
peds[0].bHasTask = FALSE
peds[1].iProgress = 0
peds[1].bHasTask = FALSE
GO_TO_PED_STATE(peds[0], PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
REPEAT 2 i
IF DOES_ENTITY_EXIST(peds[i].PedIndex)
peds[i].fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(peds[i].PedIndex, PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(peds[i].PedIndex)
SWITCH peds[i].iProgress
CASE 0
IF ( peds[i].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(peds[i].PedIndex, CA_USE_COVER, FALSE)
SET_PED_ACCURACY(peds[i].PedIndex, 2)
SET_PED_SHOOT_RATE(peds[i].PedIndex, 125)
SET_PED_COMBAT_ATTRIBUTES(peds[i].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(peds[i].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_RANGE(peds[i].PedIndex, CR_NEAR)
SET_PED_COMBAT_MOVEMENT(peds[i].PedIndex, CM_WILLADVANCE)
SET_COMBAT_FLOAT(peds[i].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(peds[i].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
//SET_PED_ANGLED_DEFENSIVE_AREA(peds[i].PedIndex, <<674.837952,-2546.900879,6.932896>>, <<685.186707,-2535.064453,13.635417>>, 24.000000)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(peds[i].PedIndex, 250.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[i].PedIndex, FALSE)
peds[i].bHasTask = TRUE
ENDIF
IF fPlaybackTime >= 85000.0
IF ( peds[i].fDistanceToTargetPed > 300.0 )
SET_PED_AS_NO_LONGER_NEEDED(peds[i].PedIndex)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDREPEAT
CLEANUP_PED_GROUP(peds, FALSE, TRUE)
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF NOT DOES_ENTITY_EXIST(peds[0].PedIndex)
AND NOT DOES_ENTITY_EXIST(peds[1].PedIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
ENDIF
ENDIF
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
CLEANUP_PED_GROUP(peds, FALSE, FALSE, FALSE)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_FIRST_HILL_COP_CAR(VEH_STRUCT &vehicle, PED_STRUCT &peds[], FLOAT fPlaybackTime)
INT i
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE)
DRAW_DEBUG_VEHICLE_RECORDING_INFO(vehicle.VehicleIndex, 1.0)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(peds[0].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(peds[0].eState), 1.25)
REPEAT 2 i
DRAW_DEBUG_TEXT_ABOVE_ENTITY(peds[i].PedIndex, GET_STRING_FROM_FLOAT(peds[i].fDistanceToTargetPed), 1.5)
ENDREPEAT
ENDIF
#ENDIF
SWITCH peds[0].eState
CASE PED_STATE_IDLE
IF NOT DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF ( fPlaybackTime >= 85000.0 )
REQUEST_MODEL(POLICE3)
REQUEST_MODEL(S_M_Y_COP_01)
IF HAS_MODEL_LOADED(POLICE3)
AND HAS_MODEL_LOADED(S_M_Y_COP_01)
vehicle.VehicleIndex = CREATE_VEHICLE(POLICE3, vehicle.vPosition, vehicle.fHeading)
peds[0].PedIndex = CREATE_PED_INSIDE_VEHICLE(vehicle.VehicleIndex, PEDTYPE_COP, S_M_Y_COP_01, VS_DRIVER)
peds[1].PedIndex = CREATE_PED_INSIDE_VEHICLE(vehicle.VehicleIndex, PEDTYPE_COP, S_M_Y_COP_01, VS_FRONT_RIGHT)
SET_ENTITY_LOAD_COLLISION_FLAG(peds[0].PedIndex, TRUE)
SET_ENTITY_LOAD_COLLISION_FLAG(peds[1].PedIndex, TRUE)
SET_ENTITY_LOAD_COLLISION_FLAG(vehicle.VehicleIndex, TRUE)
GIVE_WEAPON_TO_PED(peds[0].PedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO)
GIVE_WEAPON_TO_PED(peds[1].PedIndex, WEAPONTYPE_PUMPSHOTGUN, INFINITE_AMMO)
SET_PED_TARGET_LOSS_RESPONSE(peds[0].PedIndex, TLR_SEARCH_FOR_TARGET)
SET_PED_TARGET_LOSS_RESPONSE(peds[1].PedIndex, TLR_SEARCH_FOR_TARGET)
SET_VEHICLE_SIREN(vehicle.VehicleIndex, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(POLICE3)
SET_MODEL_AS_NO_LONGER_NEEDED(S_M_Y_COP_01)
peds[0].iProgress = 0
peds[0].bHasTask = FALSE
peds[0].iTimer = GET_GAME_TIMER()
peds[1].iProgress = 0
peds[1].bHasTask = FALSE
peds[1].iTimer = GET_GAME_TIMER()
SET_CREATE_RANDOM_COPS(TRUE)
SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), TRUE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_CRUISING, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_PULLED_OVER, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_BOAT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, TRUE)
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0.1)
GO_TO_PED_STATE(peds[0], PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
IF HAS_TIME_PASSED(3000, peds[0].iTimer)
AND HAS_TIME_PASSED(3000, peds[1].iTimer)
REPEAT 2 i
IF DOES_ENTITY_EXIST(peds[i].PedIndex)
peds[i].fDistanceToTargetPed = GET_DISTANCE_BETWEEN_PEDS(peds[i].PedIndex, PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(peds[i].PedIndex)
SWITCH peds[i].iProgress
CASE 0
IF ( peds[i].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(peds[i].PedIndex, CA_USE_COVER, FALSE)
SET_PED_ACCURACY(peds[i].PedIndex, 1)
SET_PED_SHOOT_RATE(peds[i].PedIndex, 50)
SET_PED_COMBAT_ATTRIBUTES(peds[i].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(peds[i].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_RANGE(peds[i].PedIndex, CR_NEAR)
SET_PED_COMBAT_MOVEMENT(peds[i].PedIndex, CM_WILLADVANCE)
SET_COMBAT_FLOAT(peds[i].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(peds[i].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(peds[i].PedIndex, 500.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[i].PedIndex, FALSE)
peds[i].bHasTask = TRUE
ENDIF
IF ( peds[i].bHasTask = TRUE )
IF peds[i].fDistanceToTargetPed > 600.0
SET_PED_AS_NO_LONGER_NEEDED(peds[i].PedIndex)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDREPEAT
ENDIF
CLEANUP_PED_GROUP(peds, FALSE, TRUE)
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF NOT DOES_ENTITY_EXIST(peds[0].PedIndex)
AND NOT DOES_ENTITY_EXIST(peds[1].PedIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
ENDIF
ENDIF
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
CLEANUP_PED_GROUP(peds, FALSE, FALSE, FALSE)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL IS_MISSION_STAGE_SPEEDOPHILE_RIDE_COMPLETED(INT &iStageProgress)
MANAGE_LAMAR_IN_SPEEDOPHILE(psLamar, vsSpeedophiles[psLamar.ePedVehicle], PLAYER_PED_ID())
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
MANAGE_PLAYER_PED_IN_SPEEDOPHILE(PLAYER_PED_ID(), psFranklin, vsSpeedophiles[psFranklin.ePedVehicle], vsSpeedophiles[psLamar.ePedVehicle])
MANAGE_OTHER_PLAYER_PED_IN_SPEEDOPHILE(GET_OTHER_PLAYER_PED_INDEX(), psTrevor, vsSpeedophiles[psTrevor.ePedVehicle], PLAYER_PED_ID(), vsSpeedophiles[psLamar.ePedVehicle], FALSE)
IF ( bDisplayBuddyBlips = TRUE )
IF NOT DOES_BLIP_EXIST(psLamar.BlipIndex)
psLamar.BlipIndex = CREATE_BLIP_FOR_ENTITY(psLamar.PedIndex, FALSE)
ENDIF
IF NOT DOES_BLIP_EXIST(psTrevor.BlipIndex)
psTrevor.BlipIndex = CREATE_BLIP_FOR_ENTITY(GET_PED_INDEX(CHAR_TREVOR), FALSE)
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("FRA1_FDLLT")
AND NOT HAS_LABEL_BEEN_TRIGGERED("FRA1_TDLLF")
IF ( psLamar.fDistanceToTargetPed > 75.0 )
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
IF IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
CLEAR_PRINTS()
ENDIF
PRINT_GOD_TEXT_ADVANCED("FRA1_FDLLT", DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
ENDIF
ELSE
IF DOES_BLIP_EXIST(psLamar.BlipIndex)
REMOVE_BLIP(psLamar.BlipIndex)
ENDIF
IF DOES_BLIP_EXIST(psTrevor.BlipIndex)
REMOVE_BLIP(psTrevor.BlipIndex)
ENDIF
ENDIF
IF NOT IS_PED_SITTING_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex)
bAllowHotSwap = FALSE
ELSE
bAllowHotSwap = TRUE
ENDIF
BREAK
CASE CHAR_TREVOR
MANAGE_PLAYER_PED_IN_SPEEDOPHILE(PLAYER_PED_ID(), psFranklin, vsSpeedophiles[psTrevor.ePedVehicle], vsSpeedophiles[psLamar.ePedVehicle])
MANAGE_OTHER_PLAYER_PED_IN_SPEEDOPHILE(GET_OTHER_PLAYER_PED_INDEX(), psTrevor, vsSpeedophiles[psFranklin.ePedVehicle], PLAYER_PED_ID(), vsSpeedophiles[psLamar.ePedVehicle], FALSE)
IF ( bDisplayBuddyBlips = TRUE )
IF NOT DOES_BLIP_EXIST(psLamar.BlipIndex)
psLamar.BlipIndex = CREATE_BLIP_FOR_ENTITY(psLamar.PedIndex, FALSE)
ENDIF
IF NOT DOES_BLIP_EXIST(psFranklin.BlipIndex)
psFranklin.BlipIndex = CREATE_BLIP_FOR_ENTITY(GET_PED_INDEX(CHAR_FRANKLIN), FALSE)
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("FRA1_FDLLT")
AND NOT HAS_LABEL_BEEN_TRIGGERED("FRA1_TDLLF")
IF ( psLamar.fDistanceToTargetPed > 75.0 )
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
IF IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
CLEAR_PRINTS()
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(1.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
PRINT_GOD_TEXT_ADVANCED("FRA1_TDLLF", DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
ENDIF
ELSE
IF DOES_BLIP_EXIST(psLamar.BlipIndex)
REMOVE_BLIP(psLamar.BlipIndex)
ENDIF
IF DOES_BLIP_EXIST(psFranklin.BlipIndex)
REMOVE_BLIP(psFranklin.BlipIndex)
ENDIF
ENDIF
IF NOT IS_PED_SITTING_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex)
bAllowHotSwap = FALSE
ELSE
bAllowHotSwap = TRUE
ENDIF
BREAK
ENDSWITCH
MANAGE_FILM_CREW_PEDS_AFTER_JACK()
MANAGE_MISSION_TRAIN(sMissionTrain.iProgress, vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime)
MANAGE_FIRST_RIVER_COP_CAR(vsRiverCopCars[0], psRiverCopCar0Cops, vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime)
MANAGE_SECOND_RIVER_COP_CAR(vsRiverCopCars[1], psRiverCopCar1Cops, vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime)
MANAGE_THIRD_RIVER_COP_CAR(vsRiverCopCars[2], psRiverCopCar2Cops, vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime)
MANAGE_FOURTH_RIVER_COP_CAR(vsRiverCopCars[3], psRiverCopCar3Cops, vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime)
MANAGE_FIFTH_RIVER_COP_CAR(vsRiverCopCars[4], psRiverCopCar4Cops, vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime)
MANAGE_COP_HELICOPTER_IN_CHASE(psSwat[0], vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime, vsSpeedophiles[psLamar.ePedVehicle].fPlaybackSpeed)
MANAGE_LEFT_ENEMY_CAR_DURING_SPEEDOPHILE_RIDE(vsEnemyLeftChaseCar.iProgress, vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime, vsSpeedophiles[psLamar.ePedVehicle].fPlaybackSpeed)
MANAGE_CONVERSATIONS_DURING_SPEEDOPHILE_RIDE(iConversationProgress)
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_1_APPROACH_RIVER")
STOP_AUDIO_SCENE("FRANKLIN_1_APPROACH_RIVER")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_1_JETSKI_START")
IF ( vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime > 27000.0)
STOP_AUDIO_SCENE("FRANKLIN_1_JETSKI_START")
ENDIF
ENDIF
//handle blips for vehicle
SWITCH iStageProgress
CASE 0
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex)
MODIFY_VEHICLE_TOP_SPEED(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex, -15.0)
ENDIF
BREAK
CASE CHAR_TREVOR
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex)
MODIFY_VEHICLE_TOP_SPEED(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex, -15.0)
ENDIF
BREAK
ENDSWITCH
OVERRIDE_WATER_SETTINGS(TRUE, 3.0, fOverrideStrength)
REMOVE_ANIM_DICT("missfra1")
REMOVE_ANIM_DICT("missfra1mcs_2_crew_react")
iStageProgress++
BREAK
CASE 1
IF NOT IS_STRING_NULL_OR_EMPTY(sLabelFLAMAR) AND NOT HAS_LABEL_BEEN_TRIGGERED(sLabelFLAMAR)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF IS_SCREEN_FADED_IN()
PRINT_GOD_TEXT_ADVANCED(sLabelFLAMAR, DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF ( vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime >= 74500.0 )
OR IS_ANY_PED_IN_ANGLED_AREA_LOCATE(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR), psLamar.PedIndex, << 732.77, -2621.94, -1.72>>, << 731.85, -2562.83, 16.46>>, 36.0)
IF NOT IS_SELECTOR_CAM_ACTIVE()
bAllowHotswap = FALSE
FailFlags[MISSION_FAIL_BUDDIES_LEFT_BEHIND] = FALSE
FailFlags[MISSION_FAIL_SPEEDOPHILE_DEAD] = FALSE
FailFlags[MISSION_FAIL_SPEEDOPHILE_UNDRIVABLE] = FALSE
GO_TO_PED_STATE(psLamar, PED_STATE_ENDING_RECORDING_PLAYBACK)
GO_TO_PED_STATE(psTrevor, PED_STATE_ENDING_RECORDING_PLAYBACK)
GO_TO_PED_STATE(psFranklin, PED_STATE_FLEE_COPS_ON_FOOT)
RETURN TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC MANAGE_CONVERSATIONS_DURING_LOSE_COPS()
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_SRCLEAR")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_SRCLEAR", CONV_PRIORITY_VERY_HIGH)
SET_LABEL_AS_TRIGGERED("F1_SRCLEAR", TRUE)
ENDIF
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ELSE
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
bSplitUpConversationFinished = TRUE
ENDIF
ENDIF
IF ( bCopsChaseFinished = FALSE ) //scripted cops chase is in progress
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//play conversation for Franklin chatting with Trevor when close on speedophiles
IF IS_PED_SITTING_IN_THIS_VEHICLE(GET_PED_INDEX(CHAR_TREVOR), vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex)
AND IS_PED_SITTING_IN_THIS_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsSpeedophiles[psTrevor.ePedVehicle].VehicleIndex)
OR IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsSpeedophiles[psFranklin.ePedVehicle].VehicleIndex)
IF ( psTrevor.fDistanceToTargetPed < 10.0 )
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFTJR1")
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFTJR1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCFTJR1", TRUE)
ENDIF
ELSE
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFTJR2")
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFTJR2", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCFTJR2", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_TREVOR))
AND DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_FRANKLIN))
IF NOT IS_ENTITY_DEAD(GET_PED_INDEX(CHAR_TREVOR))
AND NOT IS_ENTITY_DEAD(GET_PED_INDEX(CHAR_FRANKLIN))
IF IS_PED_CLIMBING(GET_PED_INDEX(CHAR_TREVOR)) OR IS_PED_CLIMBING(GET_PED_INDEX(CHAR_FRANKLIN))
IF IS_ENTITY_AT_COORD(GET_PED_INDEX(CHAR_TREVOR), <<767.280884,-2921.152832,3.528324>>, << 14.0, 18.0, 6.0 >>)
AND IS_ENTITY_AT_COORD(GET_PED_INDEX(CHAR_FRANKLIN), <<767.280884,-2921.152832,3.528324>>, << 14.0, 18.0, 6.0 >>)
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFCUL")
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCTCUL")
VECTOR vTrevorsPosition, vFranklinsPosition
vTrevorsPosition = GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_TREVOR))
vFranklinsPosition = GET_ENTITY_COORDS(GET_PED_INDEX(CHAR_FRANKLIN))
IF IS_PED_CLIMBING(GET_PED_INDEX(CHAR_FRANKLIN))
IF ( vFranklinsPosition.Z > vTrevorsPosition.Z )
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFCUL", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCFCUL", TRUE)
ENDIF
ENDIF
ENDIF
IF IS_PED_CLIMBING(GET_PED_INDEX(CHAR_TREVOR))
IF ( vFranklinsPosition.Z < vTrevorsPosition.Z )
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCTCUL", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCTCUL", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH ePlayerBuddy
CASE PLAYER_BUDDY_LAMAR //player is escaping cops with Lamar
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCLJF") //Lamar joins Franklin
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCLJT")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCLJF", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCLJF", TRUE)
psLamar.iPedConversationTimer = GET_GAME_TIMER()
ENDIF
BREAK
CASE CHAR_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCLJT", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCLJT", TRUE)
psLamar.iPedConversationTimer = GET_GAME_TIMER()
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ELSE
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCLJFR") //Franklin responds to Lamar joining
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCLJTR") //Trevor responds to Lamar joining
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCLJFR", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCLJFR", TRUE)
psLamar.iPedConversationTimer = GET_GAME_TIMER()
ENDIF
BREAK
CASE CHAR_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCLJTR", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCLJTR", TRUE)
psLamar.iPedConversationTimer = GET_GAME_TIMER()
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCLNC") //Lamar says they need a car
IF HAS_TIME_PASSED(10000, psLamar.iPedConversationTimer)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND NOT IS_PED_IN_ANY_VEHICLE(psLamar.PedIndex)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCLNC", CONV_PRIORITY_MEDIUM)
psLamar.iPedConversationTimer = GET_GAME_TIMER()
iNeedCarBuddyReminders++
IF ( iNeedCarBuddyReminders = 2 )
SET_LABEL_AS_TRIGGERED("F1_LCLNC", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCLNCR") //Lamar says they need to move
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFSOFR") //Franklin says to stay on him
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCTSOTR") //Trevor says to stay on him
IF HAS_LABEL_BEEN_TRIGGERED("F1_LCLNC")
IF HAS_TIME_PASSED(15000, psLamar.iPedConversationTimer)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND NOT IS_PED_IN_ANY_VEHICLE(psLamar.PedIndex)
SWITCH GET_RANDOM_INT_IN_RANGE(0, 2)
CASE 0
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCLNCR", CONV_PRIORITY_MEDIUM)
psLamar.iPedConversationTimer = GET_GAME_TIMER()
iNeedCarBuddyReminders++
IF ( iNeedCarBuddyReminders >= 7 )
SET_LABEL_AS_TRIGGERED("F1_LCLNCR", TRUE)
ENDIF
ENDIF
BREAK
CASE 1
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFSOFR", CONV_PRIORITY_MEDIUM)
psLamar.iPedConversationTimer = GET_GAME_TIMER()
iNeedCarBuddyReminders++
IF ( iNeedCarBuddyReminders >= 7 )
SET_LABEL_AS_TRIGGERED("F1_LCFSOFR", TRUE)
ENDIF
ENDIF
BREAK
CASE CHAR_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCTSOTR", CONV_PRIORITY_MEDIUM)
psLamar.iPedConversationTimer = GET_GAME_TIMER()
iNeedCarBuddyReminders++
IF ( iNeedCarBuddyReminders >= 7 )
SET_LABEL_AS_TRIGGERED("F1_LCTSOTR", TRUE)
ENDIF
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFSOF") //Franklin says a line to remind buddy to come with him when entering a vehicle
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCTSOT") //Trevor says a line to remind buddy to come with him when entering a vehicle
IF NOT ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psLamar.PedIndex)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFSOF", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCFSOF", TRUE)
ENDIF
BREAK
CASE CHAR_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCTSOT", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCTSOT", TRUE)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCLSLC") //Lamar says to lose the cops initially
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psLamar.PedIndex)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCLSLC", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCLSLC", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCLFC1") //Lamar and Franklin chat when losing cops 1
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCLTC1") //Lamar and Trevor chat when losing cops 1
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psLamar.PedIndex)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCLFC1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCLFC1", TRUE)
ENDIF
BREAK
CASE CHAR_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCLTC1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCLTC1", TRUE)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCLFC2") //Lamar and Franklin chat when losing cops 2
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCLTC2") //Lamar and Trevor chat when losing cops 2
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psLamar.PedIndex)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCLFC2", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCLFC2", TRUE)
psLamar.iPedConversationTimer = GET_GAME_TIMER()
ENDIF
BREAK
CASE CHAR_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCLTC2", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCLTC2", TRUE)
psLamar.iPedConversationTimer = GET_GAME_TIMER()
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCLFC3") //Lamar and Franklin chat when losing cops 3
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCLTC3") //Lamar and Trevor chat when losing cops 3
IF HAS_TIME_PASSED(20000, psLamar.iPedConversationTimer)
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psLamar.PedIndex)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCLFC3", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCLFC3", TRUE)
ENDIF
BREAK
CASE CHAR_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCLTC3", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCLTC3", TRUE)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_CHAT1") //Lamar and Franklin chat when losing cops F1_CHAT1
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_CHAT6") //Lamar and Trevor chat when losing cops F1_CHAT6
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psLamar.PedIndex)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_CHAT1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_CHAT1", TRUE)
ENDIF
BREAK
CASE CHAR_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_CHAT6", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_CHAT6", TRUE)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_CHAT2") //Lamar and Franklin chat when losing cops F1_CHAT2
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_CHAT7") //Lamar and Trevor chat when losing cops F1_CHAT6
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psLamar.PedIndex)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_CHAT2", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_CHAT2", TRUE)
ENDIF
BREAK
CASE CHAR_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_CHAT7", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_CHAT7", TRUE)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_CHAT3") //Lamar and Franklin chat when losing cops F1_CHAT3
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_CHAT8") //Lamar and Trevor chat when losing cops F1_CHAT8
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psLamar.PedIndex)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_CHAT3", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_CHAT3", TRUE)
ENDIF
BREAK
CASE CHAR_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_CHAT8", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_CHAT8", TRUE)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_CHAT4") //Lamar and Franklin chat when losing cops F1_CHAT4
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_CHAT9") //Lamar and Trevor chat when losing cops F1_CHAT9
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psLamar.PedIndex)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_CHAT4", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_CHAT4", TRUE)
ENDIF
BREAK
CASE CHAR_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_CHAT9", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_CHAT9", TRUE)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_STRETCH") //Lamar and Franklin chat when losing cops STRETCH
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psLamar.PedIndex)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_STRETCH", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_STRETCH", TRUE)
ENDIF
BREAK
CASE CHAR_TREVOR
SET_LABEL_AS_TRIGGERED("F1_STRETCH", TRUE)
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_CHAT5") //Lamar and Franklin chat when losing cops F1_CHAT4
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_CHAT10") //Lamar and Trevor chat when losing cops F1_CHAT9
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psLamar.PedIndex)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_CHAT5", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_CHAT5", TRUE)
bRandomConversationAllowed = TRUE
iLoseCopsReminderCount = 0
iLoseCopsReminderTime = GET_RANDOM_INT_IN_RANGE(12000, 15001)
psLamar.iPedConversationTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iLoseCopsReminderTime: ", iLoseCopsReminderTime, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iLoseCopsReminderCount: ", iLoseCopsReminderCount, ".")
#ENDIF
ENDIF
BREAK
CASE CHAR_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_CHAT10", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_CHAT10", TRUE)
bRandomConversationAllowed = TRUE
iLoseCopsReminderCount = 0
iLoseCopsReminderTime = GET_RANDOM_INT_IN_RANGE(12000, 15001)
psLamar.iPedConversationTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iLoseCopsReminderTime: ", iLoseCopsReminderTime, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iLoseCopsReminderCount: ", iLoseCopsReminderCount, ".")
#ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bRandomConversationAllowed = TRUE ) //Lamar reminds to lose the cops randomly
IF HAS_TIME_PASSED(iLoseCopsReminderTime, psLamar.iPedConversationTimer)
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psLamar.PedIndex)
IF NOT ARE_PLAYER_FLASHING_STARS_ABOUT_TO_DROP(PLAYER_ID()) //player not wanted level cooldown
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCLSLC_2") //reuse one more line from F1_LCLSLC
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCLSLC", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCLSLC_2", TRUE)
iLoseCopsReminderCount++
iLoseCopsReminderTime = iLoseCopsReminderTime + (iLoseCopsReminderCount * GET_RANDOM_INT_IN_RANGE(8000, 10001))
psLamar.iPedConversationTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iLoseCopsReminderTime: ", iLoseCopsReminderTime, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iLoseCopsReminderCount: ", iLoseCopsReminderCount, ".")
#ENDIF
ENDIF
ELSE //play random reminder root F1_LCLRLC
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCLRLC", CONV_PRIORITY_MEDIUM)
iLoseCopsReminderCount++
iLoseCopsReminderTime = iLoseCopsReminderTime + (iLoseCopsReminderCount * GET_RANDOM_INT_IN_RANGE(5000, 7501))
psLamar.iPedConversationTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iLoseCopsReminderTime: ", iLoseCopsReminderTime, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iLoseCopsReminderCount: ", iLoseCopsReminderCount, ".")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PLAYER_BUDDY_TREVOR //player is escaping cops with Trevor
CASE PLAYER_BUDDY_FRANKLIN //player is escaping cops with Franklin
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCTJF") //Trevor joins Franklin(player)
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFJT") //Franklin joins Trevor(player)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH ePlayerBuddy
CASE PLAYER_BUDDY_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCTJF", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCTJF", TRUE)
psTrevor.iPedConversationTimer = GET_GAME_TIMER()
ENDIF
BREAK
CASE PLAYER_BUDDY_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFJT", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCFJT", TRUE)
psTrevor.iPedConversationTimer = GET_GAME_TIMER()
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCTNC") //Trevor says they need a car
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFNC") //Franklin says they need a car
IF HAS_TIME_PASSED(10000, psTrevor.iPedConversationTimer)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT IS_PED_IN_ANY_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN))
AND NOT IS_PED_IN_ANY_VEHICLE(GET_PED_INDEX(CHAR_TREVOR))
SWITCH ePlayerBuddy
CASE PLAYER_BUDDY_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCTNC", CONV_PRIORITY_MEDIUM)
psTrevor.iPedConversationTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("F1_LCTNC", TRUE)
ENDIF
BREAK
CASE PLAYER_BUDDY_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFNC", CONV_PRIORITY_MEDIUM)
psTrevor.iPedConversationTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("F1_LCFNC", TRUE)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCTNCR") //Trevor says they need to move
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFNCR") //Franklin says they need to move
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFSOFR") //Franklin says to stay on him
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCTSOTR") //Trevor says to stay on him
IF HAS_LABEL_BEEN_TRIGGERED("F1_LCTNC")
OR HAS_LABEL_BEEN_TRIGGERED("F1_LCFNC")
IF HAS_TIME_PASSED(15000, psTrevor.iPedConversationTimer)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT IS_PED_IN_ANY_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN))
AND NOT IS_PED_IN_ANY_VEHICLE(GET_PED_INDEX(CHAR_TREVOR))
SWITCH GET_RANDOM_INT_IN_RANGE(0, 2)
CASE 0
SWITCH ePlayerBuddy
CASE PLAYER_BUDDY_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCTNCR", CONV_PRIORITY_MEDIUM)
psTrevor.iPedConversationTimer = GET_GAME_TIMER()
iNeedCarBuddyReminders++
IF ( iNeedCarBuddyReminders >= 5 )
SET_LABEL_AS_TRIGGERED("F1_LCTNCR", TRUE)
ENDIF
ENDIF
BREAK
CASE PLAYER_BUDDY_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFNCR", CONV_PRIORITY_MEDIUM)
psTrevor.iPedConversationTimer = GET_GAME_TIMER()
iNeedCarBuddyReminders++
IF ( iNeedCarBuddyReminders >= 5 )
SET_LABEL_AS_TRIGGERED("F1_LCFNCR", TRUE)
ENDIF
ENDIF
BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFSOFR", CONV_PRIORITY_MEDIUM)
psTrevor.iPedConversationTimer = GET_GAME_TIMER()
iNeedCarBuddyReminders++
IF ( iNeedCarBuddyReminders >= 5 )
SET_LABEL_AS_TRIGGERED("F1_LCFSOFR", TRUE)
ENDIF
ENDIF
BREAK
CASE CHAR_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCTSOTR", CONV_PRIORITY_MEDIUM)
psTrevor.iPedConversationTimer = GET_GAME_TIMER()
iNeedCarBuddyReminders++
IF ( iNeedCarBuddyReminders >= 5 )
SET_LABEL_AS_TRIGGERED("F1_LCTSOTR", TRUE)
ENDIF
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFSOF") //Franklin says a line to remind buddy to come with him when entering a vehicle
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCTSOT") //Trevor says a line to remind buddy to come with him when entering a vehicle
IF NOT ARE_PEDS_IN_THE_SAME_VEHICLE(GET_PED_INDEX(CHAR_TREVOR), GET_PED_INDEX(CHAR_FRANKLIN))
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFSOF", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCFSOF", TRUE)
ENDIF
BREAK
CASE CHAR_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCTSOT", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCTSOT", TRUE)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCTSLC") //Trevor says to lose the cops initially
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFSLC") //Franklin says to lose the cops initially
IF ARE_PEDS_IN_THE_SAME_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR))
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH ePlayerBuddy
CASE PLAYER_BUDDY_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCTSLC", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCTSLC", TRUE)
psTrevor.iPedConversationTimer = GET_GAME_TIMER()
ENDIF
BREAK
CASE PLAYER_BUDDY_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFSLC", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCFSLC", TRUE)
psTrevor.iPedConversationTimer = GET_GAME_TIMER()
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ELSE
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFTC1") //Franklin and Trevor chat when losing cops 1
IF ARE_PEDS_IN_THE_SAME_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR))
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFTC1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCFTC1", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFTC2") //Franklin and Trevor chat when losing cops 1
IF ARE_PEDS_IN_THE_SAME_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR))
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFTC2", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCFTC2", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFTC3") //Franklin and Trevor chat when losing cops 1
IF ARE_PEDS_IN_THE_SAME_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR))
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFTC3", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCFTC3", TRUE)
bRandomConversationAllowed = TRUE
iLoseCopsReminderCount = 0
iLoseCopsReminderTime = GET_RANDOM_INT_IN_RANGE(12000, 15001)
psTrevor.iPedConversationTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iLoseCopsReminderTime: ", iLoseCopsReminderTime, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iLoseCopsReminderCount: ", iLoseCopsReminderCount, ".")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bRandomConversationAllowed = TRUE ) //Lamar reminds to lose the cops randomly
IF HAS_TIME_PASSED(iLoseCopsReminderTime, psTrevor.iPedConversationTimer)
IF ARE_PEDS_IN_THE_SAME_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR))
IF NOT ARE_PLAYER_FLASHING_STARS_ABOUT_TO_DROP(PLAYER_ID()) //player not wanted level cooldown
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH ePlayerBuddy
CASE PLAYER_BUDDY_TREVOR
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCTSLC_2") //reuse one more line from F1_LCTSLC
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCTSLC", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCTSLC_2", TRUE)
iLoseCopsReminderCount++
iLoseCopsReminderTime = iLoseCopsReminderTime + (iLoseCopsReminderCount * GET_RANDOM_INT_IN_RANGE(8000, 10001))
psTrevor.iPedConversationTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iLoseCopsReminderTime: ", iLoseCopsReminderTime, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iLoseCopsReminderCount: ", iLoseCopsReminderCount, ".")
#ENDIF
ENDIF
ELSE //play random reminder root F1_LCTRLC
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCTRLC", CONV_PRIORITY_MEDIUM)
iLoseCopsReminderCount++
iLoseCopsReminderTime = iLoseCopsReminderTime + (iLoseCopsReminderCount * GET_RANDOM_INT_IN_RANGE(5000, 7501))
psTrevor.iPedConversationTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iLoseCopsReminderTime: ", iLoseCopsReminderTime, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iLoseCopsReminderCount: ", iLoseCopsReminderCount, ".")
#ENDIF
ENDIF
ENDIF
BREAK
CASE PLAYER_BUDDY_FRANKLIN
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFSLC_2") //reuse one more line from F1_LCFSLC
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFSLC", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCFSLC_2", TRUE)
iLoseCopsReminderCount++
iLoseCopsReminderTime = iLoseCopsReminderTime + (iLoseCopsReminderCount * GET_RANDOM_INT_IN_RANGE(8000, 10001))
psTrevor.iPedConversationTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iLoseCopsReminderTime: ", iLoseCopsReminderTime, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iLoseCopsReminderCount: ", iLoseCopsReminderCount, ".")
#ENDIF
ENDIF
ELSE
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFRLC", CONV_PRIORITY_MEDIUM)
iLoseCopsReminderCount++
iLoseCopsReminderTime = iLoseCopsReminderTime + (iLoseCopsReminderCount * GET_RANDOM_INT_IN_RANGE(5000, 7501))
psTrevor.iPedConversationTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iLoseCopsReminderTime: ", iLoseCopsReminderTime, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iLoseCopsReminderCount: ", iLoseCopsReminderCount, ".")
#ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ELSE //scripted cops chase has finished
SWITCH ePlayerBuddy
CASE PLAYER_BUDDY_LAMAR
IF ( bBuddyDroppedOff = FALSE ) //buddy not delivered to drop off location yet
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCLCL") //Lamar says cops were lost
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCLCL", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCLCL", TRUE)
ENDIF
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION() //stop any ongoing conversation
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFDL1") //Lamar chats with Franklin after losing cops 1
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCTDL1") //Lamar chats with Trevor after losing cops 1
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
AND ( HAS_LABEL_BEEN_TRIGGERED(sLabelGTLAMH) OR IS_STRING_NULL_OR_EMPTY(sLabelGTLAMH) )
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psLamar.PedIndex)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFDL1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCFDL1", TRUE)
ENDIF
BREAK
CASE CHAR_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCTDL1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCTDL1", TRUE)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFDL2") //Lamar chats with Franklin after losing cops 2
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
AND ( HAS_LABEL_BEEN_TRIGGERED(sLabelGTLAMH) OR IS_STRING_NULL_OR_EMPTY(sLabelGTLAMH) )
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psLamar.PedIndex)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFDL2", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCFDL2", TRUE)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE //buddy delivered to drop off location
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCLSD") //Lamar says he'll get out here, after arriving at drop off
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psLamar.PedIndex)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCLSD", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCLSD", TRUE)
ENDIF
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ELSE
SET_LABEL_AS_TRIGGERED("F1_LCLSD", TRUE)
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFDLE")
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCTDLE")
IF HAS_LABEL_BEEN_TRIGGERED("F1_LCLSD")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFDLE", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCFDLE", TRUE)
ENDIF
BREAK
CASE CHAR_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCTDLE", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCTDLE", TRUE)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
bDropOffConversationFinished = TRUE
ENDIF
ENDIF
ENDIF
BREAK
CASE PLAYER_BUDDY_TREVOR
CASE PLAYER_BUDDY_FRANKLIN
IF ( bBuddyDroppedOff = FALSE ) //buddy not delivered to drop off location yet
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCTCL") //Trevor says cops were lost
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFCL") //Franklin says cops were lost
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
SWITCH ePlayerBuddy
CASE PLAYER_BUDDY_TREVOR
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCTCL", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCTCL", TRUE)
ENDIF
BREAK
CASE PLAYER_BUDDY_FRANKLIN
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFCL", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCFCL", TRUE)
ENDIF
BREAK
ENDSWITCH
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION() //stop any ongoing conversation
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFTD1") //Franklin and Trevor chat after losing cops 1
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
AND ( ( HAS_LABEL_BEEN_TRIGGERED(sLabelGTFRAH) OR IS_STRING_NULL_OR_EMPTY(sLabelGTFRAH) ) OR
( HAS_LABEL_BEEN_TRIGGERED(sLabelGTTREH) OR IS_STRING_NULL_OR_EMPTY(sLabelGTTREH) ) )
IF ARE_PEDS_IN_THE_SAME_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR))
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFTD1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCFTD1", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCTSD") //Trevor says he'll get out here, after arriving at drop off
AND NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFSD") //Franklin says he'll get out here, after arriving at drop off
SWITCH ePlayerBuddy
CASE PLAYER_BUDDY_TREVOR
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vTrevorsDropOffPosition) < 75.0
IF ARE_PEDS_IN_THE_SAME_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR))
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCTSD", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCTSD", TRUE)
ENDIF
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ELSE
SET_LABEL_AS_TRIGGERED("F1_LCTSD", TRUE)
ENDIF
ENDIF
BREAK
CASE PLAYER_BUDDY_FRANKLIN
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vFranklinsDropOffPosition) < 75.0
IF ARE_PEDS_IN_THE_SAME_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR))
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFSD", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCFSD", TRUE)
ENDIF
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ELSE
SET_LABEL_AS_TRIGGERED("F1_LCFSD", TRUE)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ELSE //buddy delivered to drop off location
IF NOT HAS_LABEL_BEEN_TRIGGERED("F1_LCFTDE")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_LCFTDE", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("F1_LCFTDE", TRUE)
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
bDropOffConversationFinished = TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC
PROC MANAGE_GETAWAY_CARS(INT &iProgress)
SWITCH iProgress
CASE 0 //initialise array with getaway cars information
vsGetawayCars[0].vPosition = << 1114.05, -2512.10, 32.14 >> //parked for Lamar
vsGetawayCars[0].fHeading = 20.0221
vsGetawayCars[0].ModelName = BALLER
vsGetawayCars[1].vPosition = <<1129.3522, -2510.1978, 32.2125>>
vsGetawayCars[1].fHeading = 190.3422
vsGetawayCars[1].ModelName = BALLER
vsGetawayCars[2].vPosition = <<1150.1798, -2509.4131, 32.3467>>
vsGetawayCars[2].fHeading = 14.0235
vsGetawayCars[2].ModelName = BALLER
vsGetawayCars[3].vPosition = << 769.01, -2944.49, 4.83 >> //parked for Trevor/Franklin
vsGetawayCars[3].fHeading = 296.0139
vsGetawayCars[3].ModelName = BALLER
vsGetawayCars[4].vPosition = <<781.2610, -2957.3347, 4.8006>>
vsGetawayCars[4].fHeading = 249.0547
vsGetawayCars[4].ModelName = BALLER
vsGetawayCars[5].vPosition = <<769.4281, -2974.8413, 4.8384>>
vsGetawayCars[5].fHeading = 296.4401
vsGetawayCars[5].ModelName = BALLER
SETTIMERA(0)
iProgress++
BREAK
CASE 1
IF TIMERA() > 250
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsGetawayCars[0], FALSE, FALSE, NO_CHARACTER, FALSE, -1, -1, -1, 0, 0 #IF IS_DEBUG_BUILD, "GC 0" #ENDIF)
SETTIMERA(0)
iProgress++
ENDIF
ENDIF
BREAK
CASE 2
IF TIMERA() > 250
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsGetawayCars[1], FALSE, FALSE, NO_CHARACTER, FALSE, -1, -1, -1, 0, 0 #IF IS_DEBUG_BUILD, "GC 1" #ENDIF)
SETTIMERA(0)
iProgress++
ENDIF
ENDIF
BREAK
CASE 3
IF TIMERA() > 250
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsGetawayCars[2], FALSE, FALSE, NO_CHARACTER, FALSE, -1, -1, -1, 0, 0 #IF IS_DEBUG_BUILD, "GC 2" #ENDIF)
SETTIMERA(0)
iProgress++
ENDIF
ENDIF
BREAK
CASE 4
IF TIMERA() > 250
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsGetawayCars[3], FALSE, FALSE, NO_CHARACTER, FALSE, -1, -1, -1, 0, 0 #IF IS_DEBUG_BUILD, "GC 3" #ENDIF)
SETTIMERA(0)
iProgress++
ENDIF
ENDIF
BREAK
CASE 5
IF TIMERA() > 250
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsGetawayCars[4], FALSE, FALSE, NO_CHARACTER, FALSE, -1, -1, -1, 0, 0 #IF IS_DEBUG_BUILD, "GC 4" #ENDIF)
SETTIMERA(0)
iProgress++
ENDIF
ENDIF
BREAK
CASE 6
IF TIMERA() > 250
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsGetawayCars[5], FALSE, FALSE, NO_CHARACTER, FALSE, -1, -1, -1, 0, 0 #IF IS_DEBUG_BUILD, "GC 5" #ENDIF)
SETTIMERA(0)
iProgress++
ENDIF
ENDIF
BREAK
CASE 7
CLEANUP_VEHICLE_GROUP(vsGetawayCars, FALSE, TRUE)
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL IS_MISSION_STAGE_LOSE_COPS_COMPLETED(INT &iStageProgress)
MANAGE_CONVERSATIONS_DURING_LOSE_COPS()
MANAGE_GETAWAY_CARS(iGetawayCarsProgress)
MANAGE_LAMAR_IN_SPEEDOPHILE(psLamar, vsSpeedophiles[psLamar.ePedVehicle], PLAYER_PED_ID())
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
MANAGE_PLAYER_PED_IN_SPEEDOPHILE(PLAYER_PED_ID(), psFranklin, vsSpeedophiles[psFranklin.ePedVehicle], vsSpeedophiles[psLamar.ePedVehicle])
MANAGE_OTHER_PLAYER_PED_IN_SPEEDOPHILE(GET_OTHER_PLAYER_PED_INDEX(), psTrevor, vsSpeedophiles[psTrevor.ePedVehicle], PLAYER_PED_ID(), vsSpeedophiles[psLamar.ePedVehicle], TRUE)
BREAK
CASE CHAR_TREVOR
MANAGE_PLAYER_PED_IN_SPEEDOPHILE(PLAYER_PED_ID(), psFranklin, vsSpeedophiles[psTrevor.ePedVehicle], vsSpeedophiles[psLamar.ePedVehicle])
MANAGE_OTHER_PLAYER_PED_IN_SPEEDOPHILE(GET_OTHER_PLAYER_PED_INDEX(), psTrevor, vsSpeedophiles[psFranklin.ePedVehicle], PLAYER_PED_ID(), vsSpeedophiles[psLamar.ePedVehicle], TRUE)
BREAK
ENDSWITCH
IF bCopsChaseFinished = TRUE
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
ENDIF
ENDIF
MANAGE_COP_BOAT(psBoatCops[0])
MANAGE_FIRST_RIVER_COP_CAR(vsRiverCopCars[0], psRiverCopCar0Cops, vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime)
MANAGE_SECOND_RIVER_COP_CAR(vsRiverCopCars[1], psRiverCopCar1Cops, vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime)
MANAGE_THIRD_RIVER_COP_CAR(vsRiverCopCars[2], psRiverCopCar2Cops, vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime)
MANAGE_FOURTH_RIVER_COP_CAR(vsRiverCopCars[3], psRiverCopCar3Cops, vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime)
MANAGE_FIFTH_RIVER_COP_CAR(vsRiverCopCars[4], psRiverCopCar4Cops, vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime)
MANAGE_FIRST_HILL_COP_CAR(vsHillCopCars[0], psHillCopCar0Cops, vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime)
MANAGE_COP_HELICOPTER_IN_CHASE(psSwat[0], vsSpeedophiles[psLamar.ePedVehicle].fPlaybackTime, vsSpeedophiles[psLamar.ePedVehicle].fPlaybackSpeed)
SWITCH ePlayerBuddy //update blips for buddies in lose cops stage
CASE PLAYER_BUDDY_LAMAR //update Lamar's blip
UPDATE_TRIGGERED_LABEL(sLabelGTLAMH)
IF bCopsChaseFinished = FALSE AND NOT ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psLamar.PedIndex)
IF NOT DOES_BLIP_EXIST(psLamar.BlipIndex)
psLamar.BlipIndex = CREATE_BLIP_FOR_PED(psLamar.PedIndex, FALSE)
ENDIF
ELSE
IF DOES_BLIP_EXIST(psLamar.BlipIndex)
REMOVE_BLIP(psLamar.BlipIndex)
ENDIF
ENDIF
BREAK
CASE PLAYER_BUDDY_FRANKLIN //update Franklin's blip
UPDATE_TRIGGERED_LABEL(sLabelGTFRAH)
IF bCopsChaseFinished = FALSE AND NOT ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), GET_PED_INDEX(CHAR_FRANKLIN))
IF NOT DOES_BLIP_EXIST(psFranklin.BlipIndex)
psFranklin.BlipIndex = CREATE_BLIP_FOR_PED(GET_PED_INDEX(CHAR_FRANKLIN), FALSE)
ENDIF
ELSE
IF DOES_BLIP_EXIST(psFranklin.BlipIndex)
REMOVE_BLIP(psFranklin.BlipIndex)
ENDIF
ENDIF
BREAK
CASE PLAYER_BUDDY_TREVOR //update Trevor's blip
UPDATE_TRIGGERED_LABEL(sLabelGTTREH)
IF bCopsChaseFinished = FALSE AND NOT ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), GET_PED_INDEX(CHAR_TREVOR))
IF NOT DOES_BLIP_EXIST(psTrevor.BlipIndex)
psTrevor.BlipIndex = CREATE_BLIP_FOR_PED(GET_PED_INDEX(CHAR_TREVOR), FALSE)
ENDIF
ELSE
IF DOES_BLIP_EXIST(psTrevor.BlipIndex)
REMOVE_BLIP(psTrevor.BlipIndex)
ENDIF
ENDIF
BREAK
ENDSWITCH
SWITCH iStageProgress
CASE 0
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF NOT HAS_LABEL_BEEN_TRIGGERED("LOSE_WANTED")
IF HAS_LABEL_BEEN_TRIGGERED("F1_SRCLEAR")
IF ( bSplitUpConversationFinished = TRUE )
IF IS_SCREEN_FADED_IN()
PRINT_GOD_TEXT_ADVANCED("LOSE_WANTED", DEFAULT_GOD_TEXT_TIME, TRUE)
//remove blips for vehicles and peds
INT i
REPEAT 3 i
IF DOES_BLIP_EXIST(vsSpeedophiles[i].BlipIndex)
REMOVE_BLIP(vsSpeedophiles[i].BlipIndex)
ENDIF
ENDREPEAT
IF NOT IS_AUDIO_SCENE_ACTIVE("FRANKLIN_1_JETSKI_SPLIT_UP")
START_AUDIO_SCENE("FRANKLIN_1_JETSKI_SPLIT_UP")
ENDIF
OVERRIDE_WATER_SETTINGS(FALSE, 15.0)
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(FRA1_COP_LOSS_TIME)
ePlayerBuddy = PLAYER_BUDDY_NONE
bCopsChaseFinished = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH ePlayerBuddy
CASE PLAYER_BUDDY_FRANKLIN
FailFlags[MISSION_FAIL_FRANKLIN_LEFT_BEHIND] = TRUE
IF NOT HAS_LABEL_BEEN_TRIGGERED("FRA1_ECFRA")
IF HAS_LABEL_BEEN_TRIGGERED("F1_LCFJT")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_GOD_TEXT_ADVANCED("FRA1_ECFRA", DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CMN_FLEAVE")
IF psTrevor.fDistanceToTargetPed > BUDDY_SEPARATION_DIST
PRINT_GOD_TEXT_ADVANCED("CMN_FLEAVE", DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
ENDIF
BREAK
CASE PLAYER_BUDDY_TREVOR
FailFlags[MISSION_FAIL_TREVOR_LEFT_BEHIND] = TRUE
IF NOT HAS_LABEL_BEEN_TRIGGERED("FRA1_ECTRE")
IF HAS_LABEL_BEEN_TRIGGERED("F1_LCTJF")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_GOD_TEXT_ADVANCED("FRA1_ECTRE", DEFAULT_GOD_TEXT_TIME, TRUE)
SET_STRIPCLUB_GLOBAL_FORCE_CREATE_FRONT_BOUNCER(TRUE)
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CMN_TLEAVE")
IF psTrevor.fDistanceToTargetPed > BUDDY_SEPARATION_DIST
PRINT_GOD_TEXT_ADVANCED("CMN_TLEAVE", DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
ENDIF
BREAK
CASE PLAYER_BUDDY_LAMAR
FailFlags[MISSION_FAIL_LAMAR_LEFT_BEHIND] = TRUE
IF NOT HAS_LABEL_BEEN_TRIGGERED("FRA1_ECLAM")
IF HAS_LABEL_BEEN_TRIGGERED("F1_LCLJFR")
OR HAS_LABEL_BEEN_TRIGGERED("F1_LCLJTR")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_GOD_TEXT_ADVANCED("FRA1_ECLAM", DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CMN_LLEAVE")
IF psLamar.fDistanceToTargetPed > BUDDY_SEPARATION_DIST
PRINT_GOD_TEXT_ADVANCED("CMN_LLEAVE", DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
ENDIF
BREAK
ENDSWITCH
ELSE
TRIGGER_MUSIC_EVENT("FRA1_STOP_TRACK")
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_1_JETSKI_SPLIT_UP")
STOP_AUDIO_SCENE("FRANKLIN_1_JETSKI_SPLIT_UP")
ENDIF
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED()
ALLOW_DIALOGUE_IN_WATER(FALSE)
bCopsChaseFinished = TRUE
iStageProgress++
ENDIF
ENDIF
BREAK
CASE 1
SWITCH ePlayerBuddy
CASE PLAYER_BUDDY_FRANKLIN
CASE PLAYER_BUDDY_TREVOR
CASE PLAYER_BUDDY_LAMAR
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player has a buddy after losing cops.")
#ENDIF
iStageProgress++
BREAK
CASE PLAYER_BUDDY_NONE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player has no buddy after losing cops.")
#ENDIF
RETURN TRUE
BREAK
ENDSWITCH
BREAK
CASE 2 //have player drop off buddy at destination
SWITCH ePlayerBuddy
CASE PLAYER_BUDDY_FRANKLIN
IF HAS_LABEL_BEEN_TRIGGERED("F1_LCFCL")
IS_PLAYER_AT_LOCATION_WITH_BUDDY_ANY_MEANS(sLocatesData, vFranklinsDropOffPosition, DEFAULT_LOCATES_SIZE_VECTOR(), TRUE, GET_PED_INDEX(CHAR_FRANKLIN), sLabelGTFRAH, "CMN_FLEAVE", FALSE, TRUE)
//do the check to progress the stage here
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
//both peds in vehicle angled area
IF ARE_PEDS_IN_THE_SAME_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR))
IF IS_ENTITY_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_TREVOR), <<-20.488831,-1459.062012,28.607000>>, <<-11.658115,-1458.320557,32.486198>>, 8.0)
AND IS_ENTITY_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_FRANKLIN), <<-20.488831,-1459.062012,28.607000>>, <<-11.658115,-1458.320557,32.486198>>, 8.0)
IF IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
SETTIMERA(0) //start backup timer in case the conversations are busted by streaming
bBuddyDroppedOff = TRUE
iStageProgress++
ENDIF
ENDIF
ELSE
IF IS_ENTITY_AT_COORD(GET_PED_INDEX(CHAR_TREVOR), <<-18.035868,-1457.587769,31.472479>>, << 10.0, 10.0, 3.0 >>)
AND IS_ENTITY_AT_COORD(GET_PED_INDEX(CHAR_FRANKLIN), <<-18.035868,-1457.587769,31.472479>>, << 10.0, 10.0, 3.0 >>)
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
SETTIMERA(0) //start backup timer in case the conversations are busted by streaming
bBuddyDroppedOff = TRUE
iStageProgress++
ENDIF
ELSE
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
SETTIMERA(0) //start backup timer in case the conversations are busted by streaming
bBuddyDroppedOff = TRUE
iStageProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PLAYER_BUDDY_TREVOR
IF HAS_LABEL_BEEN_TRIGGERED("F1_LCTCL")
IS_PLAYER_AT_LOCATION_WITH_BUDDY_ANY_MEANS(sLocatesData, vTrevorsDropOffPosition, DEFAULT_LOCATES_SIZE_VECTOR(), TRUE, GET_PED_INDEX(CHAR_TREVOR), sLabelGTTREH, "CMN_TLEAVE", FALSE, TRUE)
//do the check to progress the stage here
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
//both peds in vehicle angled area
IF ARE_PEDS_IN_THE_SAME_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN), GET_PED_INDEX(CHAR_TREVOR))
IF IS_ENTITY_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_TREVOR), <<130.302841,-1311.455444,26.953234>>, <<143.630798,-1303.390259,30.950567>>, 8.0)
AND IS_ENTITY_IN_ANGLED_AREA(GET_PED_INDEX(CHAR_FRANKLIN), <<130.302841,-1311.455444,26.953234>>, <<143.630798,-1303.390259,30.950567>>, 8.0)
IF IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
SETTIMERA(0) //start backup timer in case the conversations are busted by streaming
bBuddyDroppedOff = TRUE
iStageProgress++
ENDIF
ENDIF
ELSE
IF IS_ENTITY_AT_COORD(GET_PED_INDEX(CHAR_TREVOR), <<135.962570,-1306.711182,29.997814>>, << 8.0, 8.0, 3.0 >>)
AND IS_ENTITY_AT_COORD(GET_PED_INDEX(CHAR_FRANKLIN), <<135.962570,-1306.711182,29.997814>>, << 8.0, 8.0, 3.0 >>)
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
SETTIMERA(0) //start backup timer in case the conversations are busted by streaming
bBuddyDroppedOff = TRUE
iStageProgress++
ENDIF
ELSE
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
SETTIMERA(0) //start backup timer in case the conversations are busted by streaming
bBuddyDroppedOff = TRUE
iStageProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PLAYER_BUDDY_LAMAR
IF HAS_LABEL_BEEN_TRIGGERED("F1_LCLCL")
IS_PLAYER_AT_LOCATION_WITH_BUDDY_ANY_MEANS(sLocatesData, vLamarsDropOffPosition, DEFAULT_LOCATES_SIZE_VECTOR(), TRUE, psLamar.PedIndex, sLabelGTLAMH, "CMN_LLEAVE", FALSE, TRUE)
//do the check to progress the stage here
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
//both peds in vehicle angled area
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psLamar.PedIndex)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-61.234806,-1464.389771,30.094234>>, <<-50.740864,-1462.935547,32.909306>>, 8.0)
AND IS_ENTITY_IN_ANGLED_AREA(psLamar.PedIndex, <<-61.234806,-1464.389771,30.094234>>, <<-50.740864,-1462.935547,32.909306>>, 8.0)
IF IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
SETTIMERA(0) //start backup timer in case the conversations are busted by streaming
bBuddyDroppedOff = TRUE
iStageProgress++
ENDIF
ENDIF
ELSE
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-58.462658,-1461.084106,32.958130>>, << 8.0, 8.0, 3.0 >>)
AND IS_ENTITY_AT_COORD(psLamar.PedIndex, <<-58.462658,-1461.084106,32.958130>>, << 8.0, 8.0, 3.0 >>)
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
SETTIMERA(0) //start backup timer in case the conversations are busted by streaming
bBuddyDroppedOff = TRUE
iStageProgress++
ENDIF
ELSE
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
SETTIMERA(0) //start backup timer in case the conversations are busted by streaming
bBuddyDroppedOff = TRUE
iStageProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
BREAK
CASE 3
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()), 3.0)
IF ( bDropOffConversationFinished = TRUE )
SWITCH ePlayerBuddy
CASE PLAYER_BUDDY_LAMAR
SEQUENCE_INDEX LamarSequenceIndex
CLEAR_SEQUENCE_TASK(LamarSequenceIndex)
OPEN_SEQUENCE_TASK(LamarSequenceIndex)
TASK_LEAVE_ANY_VEHICLE(NULL, 0)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -64.65, -1451.78, 31.12 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3)
CLOSE_SEQUENCE_TASK(LamarSequenceIndex)
TASK_PERFORM_SEQUENCE(psLamar.PedIndex, LamarSequenceIndex)
CLEAR_SEQUENCE_TASK(LamarSequenceIndex)
BREAK
CASE PLAYER_BUDDY_TREVOR
SEQUENCE_INDEX TrevorSequenceIndex
CLEAR_SEQUENCE_TASK(TrevorSequenceIndex)
OPEN_SEQUENCE_TASK(TrevorSequenceIndex)
TASK_LEAVE_ANY_VEHICLE(NULL, 0)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<129.25, -1299.28, 28.23>>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3)
CLOSE_SEQUENCE_TASK(TrevorSequenceIndex)
TASK_PERFORM_SEQUENCE(GET_PED_INDEX(CHAR_TREVOR), TrevorSequenceIndex)
CLEAR_SEQUENCE_TASK(TrevorSequenceIndex)
BREAK
CASE PLAYER_BUDDY_FRANKLIN
SEQUENCE_INDEX FranklinSequenceIndex
CLEAR_SEQUENCE_TASK(FranklinSequenceIndex)
OPEN_SEQUENCE_TASK(FranklinSequenceIndex)
TASK_LEAVE_ANY_VEHICLE(NULL, 0)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-14.0385, -1437.2465, 30.1235>>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3)
CLOSE_SEQUENCE_TASK(FranklinSequenceIndex)
TASK_PERFORM_SEQUENCE(GET_PED_INDEX(CHAR_FRANKLIN), FranklinSequenceIndex)
CLEAR_SEQUENCE_TASK(FranklinSequenceIndex)
BREAK
ENDSWITCH
iStageProgress++
ENDIF
ENDIF
ELSE
IF ( bDropOffConversationFinished = TRUE )
iStageProgress++
ENDIF
ENDIF
BREAK
CASE 4
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
DISABLE_PLAYER_VEHICLE_CONTROLS_THIS_FRAME()
ENDIF
SWITCH ePlayerBuddy
CASE PLAYER_BUDDY_LAMAR
IF NOT IS_PED_IN_ANY_VEHICLE(psLamar.PedIndex)
RETURN TRUE
ENDIF
BREAK
CASE PLAYER_BUDDY_TREVOR
IF NOT IS_PED_IN_ANY_VEHICLE(GET_PED_INDEX(CHAR_TREVOR))
RETURN TRUE
ENDIF
BREAK
CASE PLAYER_BUDDY_FRANKLIN
IF NOT IS_PED_IN_ANY_VEHICLE(GET_PED_INDEX(CHAR_FRANKLIN))
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_DROPOFF_LAMAR_COMPLETED(INT &iStageProgress)
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
DISABLE_PLAYER_VEHICLE_CONTROLS_THIS_FRAME()
ENDIF
IF IS_REPLAY_RECORDING()
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
ENDIF
SWITCH iStageProgress
CASE 0
IF NOT DOES_CAM_EXIST(ScriptedCamera)
STOP_FIRE_IN_RANGE(<< -64.65, -1451.78, 31.12 >>, 20.0)
REMOVE_DECALS_IN_RANGE(<< -64.65, -1451.78, 31.12 >>, 20.0)
REMOVE_PARTICLE_FX_IN_RANGE(<< -64.65, -1451.78, 31.12 >>, 20.0)
CLEAR_AREA_OF_PEDS(<< -64.65, -1451.78, 31.12 >>, 10.0)
CLEAR_AREA_OF_COPS(<< -64.65, -1451.78, 31.12 >>, 1000.0)
CLEAR_AREA_OF_VEHICLES(<< -64.65, -1451.78, 31.12 >>, 10.0)
CLEAR_AREA_OF_PROJECTILES(<< -64.65, -1451.78, 31.12 >>, 10.0)
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
SET_CAM_PARAMS(ScriptedCamera, <<-68.575203,-1461.094849,33.279221>>,<<-4.170227,-0.026384,-32.343029>>,44.888512)
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.125)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
iStageProgress++
BREAK
CASE 1
IF DOES_CAM_EXIST(ScriptedCamera)
IF IS_CAM_RENDERING(ScriptedCamera)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
SET_VEHICLE_DOORS_SHUT(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
ENDIF
ENDIF
//if last player vehicle is in the cutscene area and would interfere with cutscene entities
IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE()) AND IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE(), TRUE)
IF IS_ENTITY_AT_COORD(GET_PLAYERS_LAST_VEHICLE(), <<-63.822353,-1455.467651,33.114697>>, << 4.0, 5.0, 3.0 >>)
IF NOT IS_ENTITY_A_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
SET_ENTITY_AS_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
ENDIF
STOP_VEHICLE_FIRE(GET_PLAYERS_LAST_VEHICLE())
CLEAR_AREA(<<-53.1256, -1457.9814, 30.9968>>, 5.0, TRUE)
SET_ENTITY_COORDS(GET_PLAYERS_LAST_VEHICLE(), <<-53.1256, -1457.9814, 30.9968>>)
SET_ENTITY_HEADING(GET_PLAYERS_LAST_VEHICLE(),276.0446)
SET_VEHICLE_DOORS_SHUT(GET_PLAYERS_LAST_VEHICLE(), TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(GET_PLAYERS_LAST_VEHICLE())
SET_VEHICLE_ENGINE_ON(GET_PLAYERS_LAST_VEHICLE(), FALSE, TRUE)
ENDIF
ENDIF
//if player needs to be repositioned from the scripted cutscene area
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-63.822353,-1455.467651,33.114697>>, << 4.0, 5.0, 3.0 >>)
IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE()) AND IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE(), TRUE)
IF IS_ENTITY_AT_COORD(GET_PLAYERS_LAST_VEHICLE(), <<-64.584755,-1461.101929,31.494101>>, << 1.25, 1.25, 1.5 >>)
IF NOT IS_ENTITY_A_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
SET_ENTITY_AS_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
ENDIF
STOP_VEHICLE_FIRE(GET_PLAYERS_LAST_VEHICLE())
CLEAR_AREA(<<-53.1256, -1457.9814, 30.9968>>, 5.0, TRUE)
SET_ENTITY_COORDS(GET_PLAYERS_LAST_VEHICLE(), <<-53.1256, -1457.9814, 30.9968>>)
SET_ENTITY_HEADING(GET_PLAYERS_LAST_VEHICLE(),276.0446)
SET_VEHICLE_DOORS_SHUT(GET_PLAYERS_LAST_VEHICLE(), TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(GET_PLAYERS_LAST_VEHICLE())
SET_VEHICLE_ENGINE_ON(GET_PLAYERS_LAST_VEHICLE(), FALSE, TRUE)
ENDIF
ENDIF
CLEAR_AREA(<<-64.4999, -1461.2111, 30.9891>>, 5.0, TRUE)
WARP_PED(PLAYER_PED_ID(), <<-64.4999, -1461.2111, 30.9891>>, 244.9519, FALSE, FALSE, FALSE)
ENDIF
ENDIF
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
IF NOT IS_PED_INJURED(psLamar.PedIndex)
IF IS_PED_GROUP_MEMBER(psLamar.PedIndex, PLAYER_GROUP_ID())
REMOVE_PED_FROM_GROUP(psLamar.PedIndex)
ENDIF
CLEAR_PED_TASKS_IMMEDIATELY(psLamar.PedIndex)
WARP_PED(psLamar.PedIndex, <<-62.8937, -1460.6669, 31.1184>>, 13.6490, FALSE, FALSE, FALSE)
FORCE_PED_MOTION_STATE(psLamar.PedIndex, MS_ON_FOOT_WALK)
TASK_FOLLOW_NAV_MESH_TO_COORD(psLamar.PedIndex, << -64.65, -1451.78, 31.12 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psLamar.PedIndex, TRUE)
ENDIF
psLamar.iTimer = GET_GAME_TIMER()
iStageProgress++
ENDIF
ENDIF
BREAK
CASE 2
IF DOES_CAM_EXIST(ScriptedCamera)
IF IS_CAM_RENDERING(ScriptedCamera)
IF HAS_TIME_PASSED(7000, psLamar.iTimer)
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
DESTROY_ALL_CAMS()
DESTROY_CAM(ScriptedCamera)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
IF DOES_ENTITY_EXIST(psLamar.PedIndex)
DELETE_PED(psLamar.PedIndex)
ENDIF
ePlayerBuddy = PLAYER_BUDDY_LAMAR
iStageProgress++
ELIF HAS_TIME_PASSED(iLamarEntryFlashTime, psLamar.iTimer)
IF ( IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON )
OR ( NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON )
IF ( bFirstPersonFlashPlayed = FALSE )
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bFirstPersonFlashPlayed = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
IF NOT ANIMPOSTFX_IS_RUNNING("CamPushInNeutral")
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_DROPOFF_TREVOR_COMPLETED(INT &iStageProgress)
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
DISABLE_PLAYER_VEHICLE_CONTROLS_THIS_FRAME()
ENDIF
IF IS_REPLAY_RECORDING()
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
ENDIF
SWITCH iStageProgress
CASE 0
REQUEST_ANIM_DICT("missfra1enter_club")
REQUEST_MODEL(osStripClubDoorDummy.ModelName)
PIN_INTERIOR_IN_MEMORY(GET_INTERIOR_AT_COORDS(osStripClubDoorDummy.vPosition))
IF HAS_ANIM_DICT_LOADED("missfra1enter_club")
AND HAS_MODEL_LOADED(osStripClubDoorDummy.ModelName)
AND IS_INTERIOR_READY(GET_INTERIOR_AT_COORDS(osStripClubDoorDummy.vPosition))
iStageProgress++
ENDIF
BREAK
CASE 1
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iTrevorEntrySceneID)
STOP_FIRE_IN_RANGE(osStripClubDoorDummy.vPosition, 20.0)
REMOVE_DECALS_IN_RANGE(osStripClubDoorDummy.vPosition, 20.0)
REMOVE_PARTICLE_FX_IN_RANGE(osStripClubDoorDummy.vPosition, 20.0)
CLEAR_AREA_OF_PEDS(osStripClubDoorDummy.vPosition, 10.0)
CLEAR_AREA_OF_COPS(osStripClubDoorDummy.vPosition, 1000.0)
CLEAR_AREA_OF_VEHICLES(osStripClubDoorDummy.vPosition, 10.0)
CLEAR_AREA_OF_PROJECTILES(osStripClubDoorDummy.vPosition, 10.0)
iTrevorEntrySceneID = CREATE_SYNCHRONIZED_SCENE(osStripClubDoorDummy.vPosition, <<0.0, 0.0, 29.0>>)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iTrevorEntrySceneID, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(GET_PED_INDEX(CHAR_TREVOR))
SET_CURRENT_PED_WEAPON(GET_PED_INDEX(CHAR_TREVOR), WEAPONTYPE_UNARMED)
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(GET_PED_INDEX(CHAR_TREVOR), TRUE)
SET_FORCE_FOOTSTEP_UPDATE(GET_PED_INDEX(CHAR_TREVOR), TRUE)
TASK_SYNCHRONIZED_SCENE(GET_PED_INDEX(CHAR_TREVOR), iTrevorEntrySceneID, "missfra1enter_club", "trevor_enter_club",
INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_PED_INDEX(CHAR_TREVOR))
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_STRIPCLUB_F))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_STRIPCLUB_F), 1.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_STRIPCLUB_F), DOORSTATE_LOCKED, FALSE, TRUE)
ENDIF
CREATE_MODEL_HIDE(osStripClubDoorDummy.vPosition, 1.0, osStripClubDoorDummy.ModelName, FALSE)
osStripClubDoorDummy.ObjectIndex = CREATE_OBJECT(osStripClubDoorDummy.ModelName, osStripClubDoorDummy.vPosition)
PLAY_SYNCHRONIZED_ENTITY_ANIM(osStripClubDoorDummy.ObjectIndex, iTrevorEntrySceneID, "trevor_enter_club_door", "missfra1enter_club", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(osStripClubDoorDummy.ObjectIndex)
DESTROY_ALL_CAMS()
ScriptedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
PLAY_SYNCHRONIZED_CAM_ANIM(ScriptedCamera, iTrevorEntrySceneID, "trevor_enter_club_cam", "missfra1enter_club")
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(osStripClubDoorDummy.ModelName)
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 2
IF IS_SYNCHRONIZED_SCENE_RUNNING(iTrevorEntrySceneID)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
SET_VEHICLE_DOORS_SHUT(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
ENDIF
ENDIF
//if last player vehicle is in the cutscene area and would interfere with cutscene entities
IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE()) AND IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE(), TRUE)
IF IS_ENTITY_IN_ANGLED_AREA(GET_PLAYERS_LAST_VEHICLE(), <<128.619202,-1298.313599,27.232681>>, <<132.460739,-1305.096802,32.193935>>, 6.000000)
IF NOT IS_ENTITY_A_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
SET_ENTITY_AS_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
ENDIF
STOP_VEHICLE_FIRE(GET_PLAYERS_LAST_VEHICLE())
CLEAR_AREA(<<136.4794, -1307.4880, 27.9153>>, 5.0, TRUE)
SET_ENTITY_COORDS(GET_PLAYERS_LAST_VEHICLE(), <<136.4794, -1307.4880, 27.9153>>)
SET_ENTITY_HEADING(GET_PLAYERS_LAST_VEHICLE(), 300.4910)
SET_VEHICLE_DOORS_SHUT(GET_PLAYERS_LAST_VEHICLE(), TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(GET_PLAYERS_LAST_VEHICLE())
SET_VEHICLE_ENGINE_ON(GET_PLAYERS_LAST_VEHICLE(), FALSE, TRUE)
ENDIF
ENDIF
//if player needs to be repositioned from the scripted cutscene area
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<128.619202,-1298.313599,27.232681>>, <<132.460739,-1305.096802,32.193935>>, 6.000000)
IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE()) AND IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE(), TRUE)
IF IS_ENTITY_AT_COORD(GET_PLAYERS_LAST_VEHICLE(), <<137.777435,-1310.892578,28.581730>>, << 1.25, 1.25, 1.5 >>)
IF NOT IS_ENTITY_A_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
SET_ENTITY_AS_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
ENDIF
STOP_VEHICLE_FIRE(GET_PLAYERS_LAST_VEHICLE())
CLEAR_AREA(<<136.4794, -1307.4880, 27.9153>>, 5.0, TRUE)
SET_ENTITY_COORDS(GET_PLAYERS_LAST_VEHICLE(), <<136.4794, -1307.4880, 27.9153>>)
SET_ENTITY_HEADING(GET_PLAYERS_LAST_VEHICLE(), 300.4910)
SET_VEHICLE_DOORS_SHUT(GET_PLAYERS_LAST_VEHICLE(), TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(GET_PLAYERS_LAST_VEHICLE())
SET_VEHICLE_ENGINE_ON(GET_PLAYERS_LAST_VEHICLE(), FALSE, TRUE)
ENDIF
ENDIF
CLEAR_AREA(<<137.7463, -1310.9183, 28.0845>>, 5.0, TRUE)
WARP_PED(PLAYER_PED_ID(), <<137.7463, -1310.9183, 28.0845>>, 245.5865, FALSE, FALSE, FALSE)
ENDIF
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 3
IF DOES_CAM_EXIST(ScriptedCamera)
IF IS_SYNCHRONIZED_SCENE_RUNNING(iTrevorEntrySceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iTrevorEntrySceneID) >= 0.99
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
DESTROY_ALL_CAMS()
DESTROY_CAM(ScriptedCamera)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
REMOVE_ANIM_DICT("missfra1enter_club")
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
DELETE_PED(psTrevor.PedIndex)
ENDIF
IF DOES_ENTITY_EXIST(osStripClubDoorDummy.ObjectIndex)
DELETE_OBJECT(osStripClubDoorDummy.ObjectIndex)
REMOVE_MODEL_HIDE(osStripClubDoorDummy.vPosition, 1.0, osStripClubDoorDummy.ModelName)
ENDIF
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_STRIPCLUB_F))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_STRIPCLUB_F), 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_STRIPCLUB_F), DOORSTATE_FORCE_LOCKED_THIS_FRAME, FALSE, TRUE)
ENDIF
UNPIN_INTERIOR(GET_INTERIOR_AT_COORDS(osStripClubDoorDummy.vPosition))
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
ePlayerBuddy = PLAYER_BUDDY_TREVOR
iStageProgress++
ELIF GET_SYNCHRONIZED_SCENE_PHASE(iTrevorEntrySceneID) >= fTrevorEntryFlashPhase
IF ( IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON )
OR ( NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON )
IF ( bFirstPersonFlashPlayed = FALSE )
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bFirstPersonFlashPlayed = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 4
IF NOT ANIMPOSTFX_IS_RUNNING("CamPushInNeutral")
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_DROPOFF_FRANKLIN_COMPLETED(INT &iStageProgress)
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
DISABLE_PLAYER_VEHICLE_CONTROLS_THIS_FRAME()
ENDIF
IF IS_REPLAY_RECORDING()
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
ENDIF
SWITCH iStageProgress
CASE 0
REQUEST_MODEL(osFranklinsDoorDummy.ModelName)
REQUEST_ANIM_DICT("misstimelapse@franklinold_home")
IF HAS_MODEL_LOADED(osFranklinsDoorDummy.ModelName)
AND HAS_ANIM_DICT_LOADED("misstimelapse@franklinold_home")
iStageProgress++
ENDIF
BREAK
CASE 1
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iFranklinEntrySceneID)
STOP_FIRE_IN_RANGE(<<-14.862, -1441.208, 31.180>>, 20.0)
REMOVE_DECALS_IN_RANGE(<<-14.862, -1441.208, 31.180>>, 20.0)
REMOVE_PARTICLE_FX_IN_RANGE(<<-14.862, -1441.208, 31.180>>, 20.0)
CLEAR_AREA_OF_PEDS(<<-14.862, -1441.208, 31.180>>, 10.0)
CLEAR_AREA_OF_COPS(<<-14.862, -1441.208, 31.180>>, 1000.0)
CLEAR_AREA_OF_VEHICLES(<<-14.862, -1441.208, 31.180>>, 10.0)
CLEAR_AREA_OF_PROJECTILES(<<-14.862, -1441.208, 31.180>>, 100.0)
iFranklinEntrySceneID = CREATE_SYNCHRONIZED_SCENE(<<-14.862, -1441.208, 31.180>>, <<0.000, 0.000, 180.000>>)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iFranklinEntrySceneID, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(GET_PED_INDEX(CHAR_FRANKLIN))
SET_CURRENT_PED_WEAPON(GET_PED_INDEX(CHAR_FRANKLIN), WEAPONTYPE_UNARMED)
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(GET_PED_INDEX(CHAR_FRANKLIN), TRUE)
SET_FORCE_FOOTSTEP_UPDATE(GET_PED_INDEX(CHAR_FRANKLIN), TRUE)
TASK_SYNCHRONIZED_SCENE(GET_PED_INDEX(CHAR_FRANKLIN), iFranklinEntrySceneID, "misstimelapse@franklinold_home", "franklin_enters_old_home",
INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_PED_INDEX(CHAR_FRANKLIN))
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_F_HOUSE_SC_F))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_F_HOUSE_SC_F), 1.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_F_HOUSE_SC_F), DOORSTATE_LOCKED, FALSE, TRUE)
ENDIF
CREATE_MODEL_HIDE(osFranklinsDoorDummy.vPosition, 1.0, osFranklinsDoorDummy.ModelName, FALSE)
osFranklinsDoorDummy.ObjectIndex = CREATE_OBJECT(osFranklinsDoorDummy.ModelName, osFranklinsDoorDummy.vPosition)
PLAY_SYNCHRONIZED_ENTITY_ANIM(osFranklinsDoorDummy.ObjectIndex, iFranklinEntrySceneID, "franklin_enters_old_home_door", "misstimelapse@franklinold_home", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(osFranklinsDoorDummy.ObjectIndex)
DESTROY_ALL_CAMS()
ScriptedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
PLAY_SYNCHRONIZED_CAM_ANIM(ScriptedCamera, iFranklinEntrySceneID, "franklin_enters_old_home_cam_fra1", "misstimelapse@franklinold_home")
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(osFranklinsDoorDummy.ModelName)
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 2
IF IS_SYNCHRONIZED_SCENE_RUNNING(iFranklinEntrySceneID)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
SET_VEHICLE_DOORS_SHUT(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
ENDIF
ENDIF
//if last player vehicle is in the cutscene area and would interfere with cutscene entities
IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE()) AND IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE(), TRUE)
IF IS_ENTITY_AT_COORD(GET_PLAYERS_LAST_VEHICLE(), <<-14.230108,-1445.700317,31.646164>>, << 4.0, 4.0, 3.0 >>)
IF NOT IS_ENTITY_A_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
SET_ENTITY_AS_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
ENDIF
STOP_VEHICLE_FIRE(GET_PLAYERS_LAST_VEHICLE())
CLEAR_AREA(<< -19.1293, -1455.2057, 29.5073 >>, 5.0, TRUE)
SET_ENTITY_COORDS(GET_PLAYERS_LAST_VEHICLE(), << -19.1293, -1455.2057, 29.5073 >>)
SET_ENTITY_HEADING(GET_PLAYERS_LAST_VEHICLE(), 94.6991)
SET_VEHICLE_DOORS_SHUT(GET_PLAYERS_LAST_VEHICLE(), TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(GET_PLAYERS_LAST_VEHICLE())
SET_VEHICLE_ENGINE_ON(GET_PLAYERS_LAST_VEHICLE(), FALSE, TRUE)
ENDIF
ENDIF
//if player needs to be repositioned from the scripted cutscene area
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-14.230108,-1445.700317,31.646164>>, << 4.0, 4.0, 3.0 >>)
IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE()) AND IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE(), TRUE)
IF IS_ENTITY_AT_COORD(GET_PLAYERS_LAST_VEHICLE(), <<-13.969899,-1455.114258,29.966293>>, << 1.25, 1.25, 1.5 >>)
IF NOT IS_ENTITY_A_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
SET_ENTITY_AS_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
ENDIF
STOP_VEHICLE_FIRE(GET_PLAYERS_LAST_VEHICLE())
CLEAR_AREA(<< -19.1293, -1455.2057, 29.5073 >>, 5.0, TRUE)
SET_ENTITY_COORDS(GET_PLAYERS_LAST_VEHICLE(), << -19.1293, -1455.2057, 29.5073 >>)
SET_ENTITY_HEADING(GET_PLAYERS_LAST_VEHICLE(), 94.6991)
SET_VEHICLE_DOORS_SHUT(GET_PLAYERS_LAST_VEHICLE(), TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(GET_PLAYERS_LAST_VEHICLE())
SET_VEHICLE_ENGINE_ON(GET_PLAYERS_LAST_VEHICLE(), FALSE, TRUE)
ENDIF
ENDIF
CLEAR_AREA(<<-13.9080, -1455.1030, 29.4679>>, 5.0, TRUE)
WARP_PED(PLAYER_PED_ID(), <<-13.9080, -1455.1030, 29.4679>>, 359.4438, FALSE, FALSE, FALSE)
ENDIF
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 3
IF DOES_CAM_EXIST(ScriptedCamera)
IF IS_SYNCHRONIZED_SCENE_RUNNING(iFranklinEntrySceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iFranklinEntrySceneID) >= 0.99
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
DESTROY_ALL_CAMS()
DESTROY_CAM(ScriptedCamera)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
REMOVE_ANIM_DICT("misstimelapse@franklinold_home")
IF DOES_ENTITY_EXIST(psFranklin.PedIndex)
DELETE_PED(psFranklin.PedIndex)
ENDIF
IF DOES_ENTITY_EXIST(osFranklinsDoorDummy.ObjectIndex)
DELETE_OBJECT(osFranklinsDoorDummy.ObjectIndex)
REMOVE_MODEL_HIDE(osFranklinsDoorDummy.vPosition, 1.0, osFranklinsDoorDummy.ModelName)
ENDIF
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_F_HOUSE_SC_F))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_F_HOUSE_SC_F), 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_F_HOUSE_SC_F), DOORSTATE_FORCE_LOCKED_THIS_FRAME, FALSE, TRUE)
ENDIF
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
SET_PLAYER_PED_CAN_ENTER_SAVEHOUSE(CHAR_TREVOR, SAVEHOUSE_FRANKLIN_SC, FALSE)
ePlayerBuddy = PLAYER_BUDDY_FRANKLIN
iStageProgress++
ELIF GET_SYNCHRONIZED_SCENE_PHASE(iFranklinEntrySceneID) >= fFranklinEntryFlashPhase
IF ( IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON )
OR ( NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON )
IF ( bFirstPersonFlashPlayed = FALSE )
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bFirstPersonFlashPlayed = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 4
IF NOT ANIMPOSTFX_IS_RUNNING("CamPushInNeutral")
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_END_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
WARP_PED(PLAYER_PED_ID(), psFranklin.vPosition, psFranklin.fHeading, FALSE, FALSE, FALSE)
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), psFranklin.vPosition, INFINITE_TASK_TIME, FALSE, 0, TRUE, TRUE, EndCoverPointIndex, FALSE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
WAIT(500)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(125.120 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(5.0)
iStageProgress++
ENDIF
BREAK
CASE 1
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iStageProgress++
BREAK
CASE 2
IF IS_SCREEN_FADED_IN()
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
//debug stages
#IF IS_DEBUG_BUILD
FUNC BOOL IS_MISSION_STAGE_DEBUG_PLAYBACK_CHASE_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
//used for playback and set piece recording
INITIALISE_UBER_PLAYBACK(sVehicleRecordingsFile, vsSpeedophiles[1].iRecordingNumber)
INITIALISE_UBER_ARRAY()
iStageProgress++
BREAK
CASE 1
//used for playback and set piece recording
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[1].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsSpeedophiles[1].VehicleIndex)
CREATE_ALL_WAITING_UBER_CARS()
UPDATE_UBER_PLAYBACK(vsSpeedophiles[1].VehicleIndex, 1.0)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(SetPieceCarID[0])
IF NOT IS_ENTITY_DEAD(SetPieceCarID[0])
SET_ENTITY_COLLISION(SetPieceCarID[0], FALSE)
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_DEBUG_RECORD_CHASE_COMPLETED(INT &iStageProgress)
IF DOES_ENTITY_EXIST(osCamera.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osCamera.ObjectIndex)
SET_ENTITY_COORDS(osCamera.ObjectIndex, vPropCameraPosition)
SET_ENTITY_ROTATION(osCamera.ObjectIndex, vPropCameraRotation)
ENDIF
ENDIF
SWITCH iStageProgress
CASE 0
IF ( bStartOnAccelerateToggle = TRUE )
IF IS_BUTTON_JUST_PRESSED(PAD1, RIGHTSHOULDER2)
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[0].VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsSpeedophiles[0].VehicleIndex)
AND NOT IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(vsSpeedophiles[0].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[0].VehicleIndex, vsSpeedophiles[0].iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[1].VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsSpeedophiles[1].VehicleIndex)
AND NOT IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(vsSpeedophiles[1].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[1].VehicleIndex, vsSpeedophiles[1].iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsSpeedophiles[2].VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsSpeedophiles[2].VehicleIndex)
AND NOT IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(vsSpeedophiles[2].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsSpeedophiles[2].VehicleIndex, vsSpeedophiles[2].iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ENDIF
//ghosts
IF IS_VEHICLE_DRIVEABLE(vsGhosts[0].VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsGhosts[0].VehicleIndex)
AND NOT IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(vsGhosts[0].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsGhosts[0].VehicleIndex, vsGhosts[0].iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsGhosts[1].VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsGhosts[1].VehicleIndex)
AND NOT IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(vsGhosts[1].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsGhosts[1].VehicleIndex, vsGhosts[1].iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsGhosts[2].VehicleIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsGhosts[2].VehicleIndex)
AND NOT IS_PLAYBACK_USING_AI_GOING_ON_FOR_VEHICLE(vsGhosts[2].VehicleIndex)
START_PLAYBACK_RECORDED_VEHICLE(vsGhosts[2].VehicleIndex, vsGhosts[2].iRecordingNumber, sVehicleRecordingsFile)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
#ENDIF
//|============================= END MISSION STAGES FUNCTIONS ============================|
//|=================================== MAIN SCRIPT LOOP ==================================|
SCRIPT
SET_MISSION_FLAG (TRUE)
//check for death or arrest
IF HAS_FORCE_CLEANUP_OCCURRED()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Force cleanup occurred in stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eMissionStage), ".")
#ENDIF
STORE_FAIL_WEAPON(GET_PED_INDEX(CHAR_FRANKLIN), ENUM_TO_INT(SELECTOR_PED_FRANKLIN))
STORE_FAIL_WEAPON(GET_PED_INDEX(CHAR_TREVOR), ENUM_TO_INT(SELECTOR_PED_TREVOR))
Mission_Flow_Mission_Force_Cleanup()
MISSION_CLEANUP()
TERMINATE_THIS_THREAD()
ENDIF
#IF IS_DEBUG_BUILD
CREATE_DEBUG_MISSION_STAGE_MENU()
CREATE_DEBUG_WIDGETS()
#ENDIF
IF IS_REPLAY_IN_PROGRESS()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission replay is in progress.")
#ENDIF
SET_MISSION_STAGE_FOR_REPLAY(eMissionStage, Get_Replay_Mid_Mission_Stage())
eFranklinsFailWeapon = GET_FAIL_WEAPON(ENUM_TO_INT(SELECTOR_PED_FRANKLIN))
eTrevorsFailWeapon = GET_FAIL_WEAPON(ENUM_TO_INT(SELECTOR_PED_TREVOR))
bReplayFlag = TRUE
//handle shitskip message
IF ( g_bShitSkipAccepted = TRUE )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Shitskip accepted by the player.")
#ENDIF
eMissionStage = GET_NEXT_MISSION_STAGE_FOR_SHITSKIP(eMissionStage)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Shitskip changed mission stage to ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eMissionStage), ".")
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Shitskip not triggered.")
#ENDIF
ENDIF
ELSE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_DRIVE_TO_DEAL), "DRIVE TO DEAL", FALSE)
ENDIF
IF IS_REPEAT_PLAY_ACTIVE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Repeat play is active.")
#ENDIF
IF NOT IS_REPLAY_IN_PROGRESS()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Repeat play is active and mission replay is not in progress.")
#ENDIF
eMissionStage = MISSION_STAGE_CUTSCENE_INTRO
bReplayFlag = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting local replay flag to TRUE for stage loading.")
#ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission stage is ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eMissionStage), " for repeat play and no mission replay.")
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Repeat play is active and mission replay is in progress.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission stage is ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eMissionStage), " for repeat play and mission replay.")
#ENDIF
ENDIF
ENDIF
WHILE TRUE
//check each frame for hotswap if it is allowed
IF ( bAllowHotSwap = TRUE )
RUN_HOTSWAP(sSelectorPeds, sCamDetails)
ENDIF
//check each frame if mission is failed due to fail conditions
//check only if mission stage loading has finished
IF ( bLoadingFlag = TRUE )
RUN_FAIL_CHECKS(eMissionStage, eMissionFail)
ENDIF
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_HoodSafari")
IF iReplayCameraWarpTimer > GET_GAME_TIMER()
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2229916
ENDIF
SWITCH eMissionStage
CASE MISSION_STAGE_CUTSCENE_INTRO
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.5)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5)
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_INTRO_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_DRIVE_TO_DEAL
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_DRIVE_TO_DEAL
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_DRIVE_TO_DEAL_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_CUTSCENE_DEAL
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_DEAL
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0)
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_DEAL_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_GROVE_STREET_SHOOTOUT
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_GROVE_STREET_SHOOTOUT
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0)
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_GROVE_STREET_SHOOTOUT_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_SPEEDOPHILE_RIDE
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_RUN_TO_SPEEDOPHILES
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0)
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_RUN_TO_SPEEDOPHILES_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_SPEEDOPHILE_RIDE
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_SPEEDOPHILE_RIDE
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_SPEEDOPHILE_RIDE_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_LOSE_COPS
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_LOSE_COPS
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_LOSE_COPS_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
SWITCH ePlayerBuddy
CASE PLAYER_BUDDY_LAMAR
eMissionStage = MISSION_STAGE_CUTSCENE_DROPOFF_LAMAR
BREAK
CASE PLAYER_BUDDY_TREVOR
eMissionStage = MISSION_STAGE_CUTSCENE_DROPOFF_TREVOR
BREAK
CASE PLAYER_BUDDY_FRANKLIN
eMissionStage = MISSION_STAGE_CUTSCENE_DROPOFF_FRANKLIN
BREAK
CASE PLAYER_BUDDY_NONE
eMissionStage = MISSION_STAGE_PASSED
BREAK
ENDSWITCH
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_DROPOFF_LAMAR
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
ENDIF
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_DROPOFF_LAMAR_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_PASSED
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_DROPOFF_TREVOR
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
ENDIF
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_DROPOFF_TREVOR_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_PASSED
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_DROPOFF_FRANKLIN
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
ENDIF
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_DROPOFF_FRANKLIN_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_PASSED
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_END
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_END_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_PASSED
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_PASSED
SWITCH ePlayerBuddy
CASE PLAYER_BUDDY_NONE
CASE PLAYER_BUDDY_LAMAR
g_ePostFranklin1Switch = POST_FRANKLIN1_0_ESCAPEPOLICEALONE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting g_ePostFranklin1Switch to value POST_FRANKLIN1_0_ESCAPEPOLICEALONE.")
#ENDIF
BREAK
CASE PLAYER_BUDDY_TREVOR
g_ePostFranklin1Switch = POST_FRANKLIN1_1_TREVORSTRIPCLUB
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting g_ePostFranklin1Switch to value POST_FRANKLIN1_1_TREVORSTRIPCLUB.")
#ENDIF
BREAK
CASE PLAYER_BUDDY_FRANKLIN
g_ePostFranklin1Switch = POST_FRANKLIN1_2_FRANK
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting g_ePostFranklin1Switch to value POST_FRANKLIN1_2_FRANK.")
#ENDIF
BREAK
ENDSWITCH
MISSION_FLOW_MISSION_PASSED()
MISSION_CLEANUP()
TERMINATE_THIS_THREAD()
BREAK
CASE MISSION_STAGE_FAILED
//store fail weapons for Franklin and Trevor
STORE_FAIL_WEAPON(GET_PED_INDEX(CHAR_FRANKLIN), ENUM_TO_INT(SELECTOR_PED_FRANKLIN))
STORE_FAIL_WEAPON(GET_PED_INDEX(CHAR_TREVOR), ENUM_TO_INT(SELECTOR_PED_TREVOR))
SET_MISSION_FAILED_WITH_REASON(eMissionFail)
CLEAR_HELP()
CLEAR_PRINTS()
KILL_ANY_CONVERSATION()
TRIGGER_MUSIC_EVENT("FRA1_MISSION_FAIL")
WHILE NOT GET_MISSION_FLOW_SAFE_TO_CLEANUP()
WAIT(0)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Waiting for GET_MISSION_FLOW_SAFE_TO_CLEANUP() to return TRUE.")
#ENDIF
ENDWHILE
MISSION_CLEANUP()
TERMINATE_THIS_THREAD()
BREAK
#IF IS_DEBUG_BUILD
CASE MISSION_STAGE_DEBUG_PLAYBACK_CHASE
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_DEBUG_PLAYBACK_CHASE_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_PASSED
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_DEBUG_RECORD_CHASE
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_DEBUG_RECORD_CHASE_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_PASSED
ENDIF
ENDIF
BREAK
#ENDIF
ENDSWITCH
#IF IS_DEBUG_BUILD //handle debug functionality
RUN_DEBUG_PASS_AND_FAIL_CHECK(eMissionStage, eMissionFail) //handle key_f and key_s presses
RUN_DEBUG_MISSION_STAGE_MENU(iReturnStage, eMissionStage, bSkipFlag, bStageResetFlag) //handle z-skip menu
RUN_DEBUG_SKIPS(eMissionStage, bSkipFlag, bStageResetFlag) //handle j-skip and p-skip
RUN_DEBUG_WIDGETS(eMissionStage) //handle rag widgets
RUN_DEBUG_INFORMATION_DISPLAY() //handle drawing of debug information
#ENDIF
WAIT(0)
ENDWHILE
ENDSCRIPT