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

18771 lines
653 KiB
Python
Executable File

//|=======================================================================================|
//| Author: Lukasz Bogaj / Bobby Wright Date: 29/06/2011 |
//|=======================================================================================|
//| MICHAEL1.sc |
//| BURY THE HATCHET |
//| |
//|=======================================================================================|
//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_ped.sch"
USING "commands_pad.sch"
USING "commands_misc.sch"
USING "commands_fire.sch"
USING "commands_path.sch"
USING "commands_audio.sch"
USING "commands_script.sch"
USING "commands_player.sch"
USING "commands_camera.sch"
USING "commands_object.sch"
USING "commands_graphics.sch"
USING "commands_cutscene.sch"
USING "commands_itemsets.sch"
USING "commands_interiors.sch"
USING "commands_streaming.sch"
USING "commands_recording.sch"
//Script headers
USING "script_misc.sch"
USING "script_ped.sch"
USING "script_maths.sch"
USING "script_blips.sch"
USING "script_player.sch"
USING "script_buttons.sch"
USING "script_drawing.sch"
//Public headers
USING "flow_public_core_override.sch"
USING "flow_public_game.sch"
USING "replay_public.sch"
USING "locates_public.sch"
USING "emergency_call.sch"
USING "taxi_functions.sch"
USING "cutscene_public.sch"
USING "selector_public.sch"
USING "carsteal_public.sch"
USING "dialogue_public.sch"
USING "cellphone_public.sch"
USING "player_ped_public.sch"
USING "vehicle_gen_public.sch"
USING "achievement_public.sch"
USING "mission_stat_public.sch"
USING "cheat_controller_public.sch"
USING "CompletionPercentage_public.sch"
//Debug headers
#IF IS_DEBUG_BUILD
USING "script_debug.sch"
USING "select_mission_stage.sch"
USING "scripted_cam_editor_public.sch"
#ENDIF
//|===================================== ENUMS & STRUCTS =================================|
/// PURPOSE: Specifies stages of the mission
ENUM MISSION_STAGES
MISSION_STAGE_CUTSCENE_INTRO = 0, //Intro cutscene
MISSION_STAGE_GET_TO_AIRPORT = 1, //Michael and Trevor race to their specific airports
MISSION_STAGE_FLY_TO_NORTH_YANKTON = 2, //Trevor flies to North Yankton from countryside airport, used on retry or skip
MISSION_STAGE_CUTSCENE_AIRPORT = 3, //Cutscene showing Michael at airport terminal
MISSION_STAGE_GET_TO_GRAVEYARD = 4, //Michael drives to the graveyard
MISSION_STAGE_GET_TO_GRAVE = 5, //Michael walks to the grave
MISSION_STAGE_CUTSCENE_GRAVEYARD = 6, //Cutscene at the graveyard
MISSION_STAGE_GRAVEYARD_SHOOTOUT = 7, //Shootout at the graveyard
MISSION_STAGE_CUTSCENE_KIDNAPPED = 8, //Cutscene showing Michael getting kidnapped by the triads
MISSION_STAGE_FLY_HOME = 9, //Trevor flies back home
MISSION_STAGE_END = 10, //End of mission
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_MICHAELS_CAR_UNDRIVABLE, //Michael's car undrivable
MISSION_FAIL_MICHAELS_CAR_DEAD, //Michael's car destroyed
MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND, //Michael's car left behind
MISSION_FAIL_GRAVEYARD_NOT_REACHED, //Michael did not reach the graveyard, drove off route to graveyard
MISSION_FAIL_GRAVE_NOT_REACHED, //Michael did not reach the grave
MISSION_FAIL_GRAVEYARD_ABANDONED, //Michael left the graveyard area during the shootout
MISSION_FAIL_TREVORS_CAR_UNDRIVABLE, //Trevor's car undrivable
MISSION_FAIL_TREVORS_CAR_DEAD, //Trevor's car destroyed
MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND, //Trevor's car left behind
MISSION_FAIL_TREVORS_PLANE_UNDRIVABLE, //Trevor's plane undrivable
MISSION_FAIL_TREVORS_PLANE_DEAD, //Trevor's plane destroyed
MISSION_FAIL_MICHAEL_DEAD, //Michael dead
MISSION_FAIL_TREVOR_DEAD, //Trevor dead
MISSION_FAIL_FORCE_FAIL, //Debug forced fail
MAX_MISSION_FAILS
ENDENUM
/// PURPOSE: Specifies mission checkpoints.
ENUM MID_MISSION_STAGES
MID_MISSION_STAGE_GET_TO_AIRPORT = 0, //Checkpoint at MISSION_STAGE_GET_TO_AIRPORT
MID_MISSION_STAGE_FLY_TO_NORTH_YANKTON = 1, //Checkpoint at MISSION_STAGE_FLY_TO_NORTH_YANKTON
MID_MISSION_STAGE_GET_TO_GRAVEYARD = 2, //Checkpoint at MISSION_STAGE_GET_TO_GRAVEYARD
MID_MISSION_STAGE_GET_TO_GRAVE = 3, //Checkpoint at MISSION_STAGE_GET_TO_GRAVE
MID_MISSION_STAGE_GRAVEYARD_SHOOTOUT = 4, //Checkpoint at MISSION_STAGE_GRAVEYARD_SHOOTOUT
MID_MISSION_STAGE_FLY_HOME = 5 //Checkpoint at MISSION_STAGE_FLY_HOME
ENDENUM
HASH_ENUM GRAVEYARD_GATES
GRAVEYARD_GATE_WEST_L, //0
GRAVEYARD_GATE_WEST_R, //1
GRAVEYARD_GATE_EAST_L, //2
GRAVEYARD_GATE_EAST_R, //3
GRAVEYARD_GATE_SOUTH_L, //4
GRAVEYARD_GATE_SOUTH_R //5
ENDENUM
ENUM ENEMY_STATES
ENEMY_STATE_IDLE = 0,
ENEMY_STATE_SCRIPTED_ENTRY,
ENEMY_STATE_PATROLLING,
ENEMY_STATE_INVESTIGATING,
ENEMY_STATE_MOVING_TO_LOCATION,
ENEMY_STATE_STANDING_AT_LOCATION,
ENEMY_STATE_PERFORMING_ENEMY_ACTION,
ENEMY_STATE_WAITING_FOR_TARGET,
ENEMY_STATE_GO_TO_COORD,
ENEMY_STATE_FOLLOW_WAYPOINT_RECORDING,
ENEMY_STATE_SNIPING,
ENEMY_STATE_COMBAT
ENDENUM
ENUM DETECTED_LOCATIONS
DL_NOT_DETECTED = 0,
DL_START_AREA = 1,
DL_MIDDLE_AREA_01 = 2,
DL_MIDDLE_AREA_02 = 3,
DL_CHURCH_AREA = 4,
DL_PARKING_LOT = 5
ENDENUM
ENUM PED_CLEANUP_REASONS
PED_CLEANUP_NO_CLEANUP = 0,
PED_CLEANUP_KILLED_BY_PLAYER_AS_MICHAEL = 1,
PED_CLEANUP_KILLED_BY_VEHICLE = 2
ENDENUM
/// PURPOSE: Specifies details of mission peds.
STRUCT PED_STRUCT
PED_INDEX PedIndex //Ped Index
BLIP_INDEX BlipIndex //Ped's Blip Index
VECTOR vPosition //Ped's start location
FLOAT fHeading //Ped's start heading
MODEL_NAMES ModelName //Ped's model
VECTOR vDestination //Ped's current destination vector
INT iTimer //Ped's timer
INT iConversationTimer
INT iConversationProgress
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
BOOL bCreated //Has this enemy been created
BOOL bHasTask
BOOL bFallingBack
BOOL bSearching
INT iProgress //Enemy progress counter
INT iTimer //Enemy timer
INT iConversationTimer
ENEMY_STATES eState
PED_CLEANUP_REASONS eCleanupReason
INT iPatrolNode
BOOL bReversing
VECTOR vAimPosition
INT iWaypointProgress
#IF IS_DEBUG_BUILD
TEXT_LABEL_31 sDebugName
#ENDIF
ENDSTRUCT
/// PURPOSE: Specifies details of mission vehicles used by player or other peds.
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
INT iProgress //Vehicle progress, used for set pieces
INT iTimer //Vehicle timer
FLOAT fPlaybackSpeed //Vehicle recording playback speed
BOOL bDriverDead //Vehicle Driver dead
BOOL bAutoDriveActive //Is vehicle currently using auto drive (used after hot swap)
BOOL bSmoking
ENDSTRUCT
/// PURPOSE: Specifies details of mission specific objects.
STRUCT OBJECT_STRUCT
OBJECT_INDEX ObjectIndex //Object index
MODEL_NAMES ModelName //Object model
VECTOR vPosition //Object postion
VECTOR vRotation //Object rotation
ENDSTRUCT
/// PURPOSE: Specifies details of mission trains.
STRUCT TRAIN_STRUCT
VEHICLE_INDEX VehicleIndex
PED_INDEX PedIndex
INT iConfiguration
VECTOR vPosition
MODEL_NAMES ModelName1
MODEL_NAMES ModelName2
MODEL_NAMES ModelName3
MODEL_NAMES ModelName4
INT iProgress
ENDSTRUCT
/// PURPOSE: Specifies details of locates used in mission.
STRUCT LOCATE_STRUCT
VECTOR vPosition //Locate position
VECTOR vSize //Locate size
ENDSTRUCT
/// PURPOSE: Specifies details of script created coverpoints to use for 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 bTaken //Indicates if this coverpoint is already being moved to by another ped
PED_INDEX TakenPedIndex //Points at ped who is currently moving to this coverpoint
ENDSTRUCT
/// PURPOSE: Specifies details of spheres used for extra bullets to frag tombstones in the graveyard.
STRUCT TOMBSTONE_STRUCT
VECTOR vPosition //Tombstone position
VECTOR vShootSphereCenter //Center of the sphere used for extra bullets
FLOAT fShootSphereRadius //Radius of the sphere used for extra bullets
ENDSTRUCT
/// PURPOSE: Specifies details of gate props used to block player's exit from the graveyard area.
STRUCT GATE_STRUCT
GRAVEYARD_GATES eHashEnum //Door hash enum
VECTOR vPosition //Door position
MODEL_NAMES ModelName //Door model
BOOL bClosed //Specifies if door is closed (open ratio i 0.0)
ENDSTRUCT
/// PURPOSE: Specifies details of nodes used to check if player is not driving off route when driving to Ludendorff Cemetery
STRUCT ROADNODE_STRUCT
VECTOR vPosition
BOOL bCurrent
BOOL bVisited
BOOL bInVehicleOnly
FLOAT fAllowedDistance
FLOAT fFailDistance
ENDSTRUCT
//|======================================= CONSTANTS =====================================|
CONST_INT MAX_MODELS 6
CONST_INT MAX_CAR_RECORDINGS 6
CONST_INT MAX_GRAVEYARD_GATES 6
CONST_INT CHINESEGOON1SPEAKERID 3
CONST_INT CHINESEGOON2SPEAKERID 4
CONST_INT CHINESEGOON3SPEAKERID 5
CONST_INT CHINESEGOON4SPEAKERID 6
CONST_INT CHINESEGOON5SPEAKERID 7
STRING CHINESEGOON1VOICENAME = "MCH1CHIN1"
STRING CHINESEGOON2VOICENAME = "MCH1CHIN2"
STRING CHINESEGOON3VOICENAME = "MCH1CHIN3"
STRING CHINESEGOON4VOICENAME = "MCH1CHIN4"
STRING CHINESEGOON5VOICENAME = "MCH1CHIN5"
STRING NUMBERPLATES = "LB080984"
CONST_INT ABANDON_CAR_WARNING_RANGE 25 //30
CONST_INT ABANDON_CAR_FAIL_RANGE 90
TWEAK_FLOAT TRIGGER_CALL_RANGE 6200.0
TWEAK_FLOAT PEDMOVE_SLOWRUN 1.65
TWEAK_FLOAT PEDMOVE_SLOWWALK 0.70
TWEAK_FLOAT fFirstTrainSpeed 16.0
TWEAK_INT iCameraInterpolationTimer 2750
TWEAK_FLOAT fFirstRecordingEndTime 6300.0
TWEAK_FLOAT fSecondRecordingStartTime 1500.0
TWEAK_FLOAT fSecondRecordingEndTime 8200.0
TWEAK_FLOAT fPlaneRecordingSkipTime 500.0 //9000.0
TWEAK_INT iInterpTime 3000
TWEAK_INT iCutsceneTime 8000
STRING sVehicleRecordingsFile = "michaelone"
MODEL_NAMES mnEnemy = G_M_M_CHICOLD_01
MODEL_NAMES mnEnemyVan = BURRITO5
VECTOR vInteriorPosition = << -802.46, 173.03, 71.84 >> //room: V_Michael_G_Lounge
VECTOR vGravePosition = << 3259.89, -4573.24, 117.09 >>
VECTOR vShootoutStartPosition = << 3264.36, -4569.73, 117.07 >>
VECTOR vFlightBackDestination = << 1655.24, 3237.49, 39.55 >>//<< 1705.61, 3250.92, 40.01 >> //runway //<< 1731.52, 3310.17, 40.22 >> //hangar //<< 250.0, 2000.0, 40.0 >> //map center
VECTOR vZero = << 0.0, 0.0, 0.0 >>
VECTOR vGlobalFlightOffset = << -800.0, 350.0, 0.0 >> //<< 800.0 , 800.0, 20.0>>
VECTOR vLocalPlaneOffset = << 0.0, 0.0, 0.0 >> //<< -2.0, 0.0, -1.0 >>
VECTOR vFirstTrainPosition = << 3854.3, -4896.99, 111.58 >>
VECTOR vParticleFXPosition = << 0.0, -0.250, 1.200 >>
VECTOR vParticleFXRotation = << 0.0, 0.0, 0.0 >>
VECTOR vStreamTriggerPosition1 = << 5258.50, -5119.35, 83.92 >> //<< 5398.48, -5122.27, 84.26 >>
VECTOR vStreamTriggerPosition2 = << 3851.85, -5014.12, 104.46 >> //<< 3957.56, -5042.42, 109.03 >>
VECTOR vStreamTriggerPosition3 = << 3222.89, -4708.41, 111.88 >> //<< 3217.52, -4769.19, 110.82 >>
//used for vehicle tyre popping for burrito van
VECTOR vFrontLeftOffset = <<-1.0500, 1.8000, -0.4000>>
VECTOR vFrontRightOffset = <<1.0500, 1.8000, -0.4000>>
VECTOR vRearLeftOffset = <<-1.0500, -1.9500, -0.4000>>
VECTOR vRearRightOffset = <<1.0500, -1.9500, -0.4000>>
VECTOR vFrontLeftDamageOffset = <<-1.0000, 2.3500, 0.0500>>
VECTOR vFrontRightDamageOffset = <<1.0000, 2.3500, 0.0500>>
VECTOR vRearLeftDamageOffset = <<-1.1000, -2.3500, -0.0500>>
VECTOR vRearRightDamageOffset = <<1.1000, -2.3500, -0.0500>>
VECTOR vGraveyardDefAreaPosisiton1 = <<3264.078857,-4670.798340,111.055817>>
VECTOR vGraveyardDefAreaPosistion2 = <<3266.365723,-4562.407227,121.417885>>
CONST_FLOAT fGraveyardDefAreaWidth 48.0
TWEAK_FLOAT fFocusPushHintFOV 30.0
TWEAK_FLOAT fFocusPushSideOffset 0.010
TWEAK_FLOAT fFocusPushVerticalOffset -0.025
TWEAK_FLOAT fFocusPushFollowDistanceScalar 0.400
TWEAK_FLOAT fFocusPushBaseOrbitPitchOffset -4.0
TWEAK_FLOAT fParticleFXTriggerPhase 0.445
TWEAK_INT iFirstPersonFXTime 2500
//|======================================= VARIABLES =====================================|
MISSION_STAGES eMissionStage = MISSION_STAGE_CUTSCENE_INTRO
MISSION_FAILS eMissionFail = MISSION_FAIL_EMPTY
DETECTED_LOCATIONS eDetectedLocation = DL_NOT_DETECTED
WEAPON_TYPE eMichaelsFailWeapon = WEAPONTYPE_INVALID
//mission peds
PED_STRUCT psBrad
PED_STRUCT psTrevor
PED_STRUCT psMichael
//mission vehicles
VEH_STRUCT vsMichaelsCar
VEH_STRUCT vsTrevorsCar
VEH_STRUCT vsTrevorsPlane
VEH_STRUCT vsCutsceneCar
VEHICLE_SETUP_STRUCT TrevorsVehicleData
TRAIN_STRUCT tsTrain
OBJECT_STRUCT osGolfBall
OBJECT_STRUCT osPropShovel
OBJECT_STRUCT osPropPickaxe
OBJECT_STRUCT osPropCoffin
//structs and variables for hot swap
SELECTOR_PED_STRUCT sSelectorPeds
//locates header data
LOCATES_HEADER_DATA sLocatesData
//conversation struct
structPedsForConversation sMichael1Conversation
//mission locates
LOCATE_STRUCT sLocateFlight
REL_GROUP_HASH rgEnemies
//progress counters
INT iStageSetupProgress
INT iMichaelStageProgress
INT iTrevorStageProgress
INT iMissionStageProgress
//conversation flags and timers
INT iSnowStuckTimer
INT iEnemyConversationTimer
INT iMichaelRandomConversationDelay
INT iEnemyRandomConversationDelay
BOOL bShootingConversationFlag
BOOL bPlayVanExitConversation
BOOL bPlayVanOpenConversation
BOOL bStartSearching
BOOL bEnemiesBlockedByTrain
BOOL bSkipFlag
BOOL bReplayFlag
BOOL bLoadingFlag
BOOL bCutsceneSkipped
BOOL bStageReplayInProgress
BOOL bWeaponsHelpDisplayed
BOOL bMichaelsWeaponsStored
BOOL bSnowOn
BOOL bProloguePedComponentsActive
BOOL bPrologueMapActive
BOOL bPrologueGraveIPLSwapped
BOOL bTrevorFlightActive
INT iMichaelsObjectiveTimer
BOOL bTaxiLocationSet
BOOL bShouldDisplayMichaelsObjective
BOOL bMichaelTrevorPhoneCallTriggered
BOOL bCoverpointsCreated
BOOL bVehiclePlaybackInterrupted
BOOL bGameplayCameraSet
BOOL bCutsceneTriggeredByTrevor
BOOL bCutsceneTriggeredByMichael
BOOL bSafeToStartMichaelsCall
BOOL bCamViewModeContextChanged
BOOL bFirstPersonFXTriggered
BOOL bPlayerDroveOffRoute
BOOL bPlayerUsedAlternativePath
BOOL bMusicEventTrevorPlaneTriggered
BOOL bMusicEventArrivedChurchTriggered
BOOL bMusicEventShootoutStartTriggered
BOOL bMusicEventFirstTwoDeadTriggered
BOOL bMusicEventFirstVanTriggered
BOOL bMusicEventAlertedTriggered
BOOL bMusicEventTrainTriggered
BOOL bMusicEventKidnappedTriggered
BOOL bMusicEventReadyToFlyTriggered
//enemy waves
BOOL bPlayerDetected
BOOL bDetectedConversationPlaying
BOOL bFirstEnemyWaveSpawned
BOOL bSecondEnemyWaveSpawned
BOOL bThirdEnemyWaveSpawned
BOOL bFourthEnemyWaveSpawned
BOOL bFifthEnemyWaveSpawned
BOOL bFifthEnemyWaveIgnored
BOOL bFirstEnemyReinforcementWaveSpawned
BOOL bSecondEnemyReinforcementWaveSpawned
//BOOL bThirdEnemyReinforcementWaveSpawned
INT iSecondEnemyReinforcementDelayTimer
INT iThirdEnemyReinforcementDelayTimer
BOOL bOpenGateTriggered
BOOL bSmoothCloseGateTriggered
BOOL bTrevorsCarSetAsVehicleGenVehicle
INT iLoadSceneTimer
INT iLeadInTimer
BOOL bLeadInTiggered
BOOL bPlayerPedScriptTaskInterrupted
INT iGateCloseProgress
INT iRainOnPlaneSoundID
INT iTrainBellsSoundID
INT iChurchBellsSoundID
INT iChurchBellsProgress
//asset request counters
INT iModelsRequested
INT iRecordingsRequested
INT iFirstVanTriggerTimer
INT iPlayerMichaelKills
INT iWeatherTypeTimer
BOOL bWeatherTypeOvercastSet
BOOL bWeatherTypeRainSet
BOOL bWeatherTypeThunderSet
BOOL bRenderBlips
INT bRenderBlipsTimer
FLOAT fDistanceToDestination
TEXT_LABEL sLabelGTLC = "MCH1_GTLC"
TEXT_LABEL sLabelTOBJ1 = "MCH1_GT_T1"
TEXT_LABEL sLabelTGETBCK1 = "CMN_TGETBCK"
TEXT_LABEL sLabelTOBJ2 = "MCH1_GT_T3"
TEXT_LABEL sLabelTGETIN2 = "CMN_GENGETINPL"
TEXT_LABEL sLabelTGETBCK2 = "CMN_GENGETBCKPL"
//cutscene camera
CAMERA_INDEX ScriptedCamera
//tombstone fragging
PED_INDEX TombstoneShooterPed //ped index of the ped to shoot extra bullets
INT iEnemyTombstoneShootTimer //timer used to check if extra bullets should be fired
OBJECT_INDEX WeaponMichaelObjectIndex
OBJECT_INDEX WeaponEnemyObjectIndex
INT iHealthPickupPlacementFlags
INT iPistolPickupPlacementFlags
INT iRiflePickupPlacementFlags
PICKUP_INDEX HealthPickup
PICKUP_INDEX PistolPickup
PICKUP_INDEX RiflePickup
INT iPlaneSceneID = -1
INT iBradCadaverScene = -1
INT iBradCadaverProgress
INT iTrevorDriveOutProgress
//BOOL bShouldUseDefaultTrevorsCar
INT iCutsceneTriggerTimer
BOOL bCutsceneTimeTrigger
BOOL bCutsceneProximityTrigger
BOOL bPTFXStarted
BOOL bTextMessageSent
BOOL bDamageDecalApplied, bDirtDecalApplied
INT iSendTextMessageTimer
BOOL bStartFlashBackStream
INT iFlashbackStreamProgress
INT iFlashbackSubtitleProgress
BOOL bReplayStopEventTriggered, bReplayStartEventTriggered
INT iCarTrackedPoint = -1
INT iNMBlockingObject01 = -1 //blocks the right side train tracks nav mesh in graveyard
INT iNMBlockingObject02 = -1 //blocks the right gate nav mesh in graveyard
INT iNMBlockingObject03 = -1 //blocks the back gate nav mesh in graveyard
INT iNMBlockingObject04 = -1 //blocks the left gate nav mesh in graveyard
INT iNMBlockingObject05 = -1 //blocks the left side train tracks nav mesh in graveyard
INT iNMBlockingObject06 = -1 //blocks the road to the graveyard
INT iNMBlockingObject07 = -1 //blocks the uncovered grave, hopefully should stop peds falling into the grave
INT iBlockVehicleFirstPersonCameraTimer = 0 //used to block first person vehicle camera for limited time, see B*2031566
BOOL bBlockVehicleFirstPersonCamera = FALSE
//|========================================= ARRAYS ======================================|
//text printing
INT iTriggeredTextHashes[30]
INT iNumTextHashesStored
BOOL FailFlags[MAX_MISSION_FAILS]
//asset arrays
MODEL_NAMES MissionModels[MAX_MODELS]
INT MissionRecordings[MAX_CAR_RECORDINGS]
ROADNODE_STRUCT sRoadNodes[59]
ENEMY_STRUCT esVanEnemies[4]
ENEMY_STRUCT esWallEnemies[2]
ENEMY_STRUCT esMiddleEnemies[3]
ENEMY_STRUCT esChurchEnemies[2]
ENEMY_STRUCT esExitEnemies[5]
ENEMY_STRUCT esSideVanEnemies[2]
ENEMY_STRUCT esSideVanBackupEnemies[2]
ENEMY_STRUCT esRunners[2]
ENEMY_STRUCT esVan4Enemies[4]
ENEMY_STRUCT esSideEnemies[3]
ENEMY_STRUCT esFirstReinforcementEnemies[2]
ENEMY_STRUCT esSecondReinforcementEnemies[2]
ENEMY_STRUCT esThirdReinforcementEnemies[2]
VEH_STRUCT vsEnemyVans[5]
//scripted coverpints and positions for shootout
COVERPOINT_STRUCT csCoverpoints[36]
TOMBSTONE_STRUCT FraggableTombstones[3]
GATE_STRUCT Gates[MAX_GRAVEYARD_GATES]
//|========================= 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
iMichaelStageProgress = 0
iTrevorStageProgress = 0
iMissionStageProgress = 0
psMichael.iTimer = 0
psTrevor.iTimer = 0
psMichael.iConversationTimer = 0
psTrevor.iConversationTimer = 0
psMichael.iConversationProgress = 0
psTrevor.iConversationProgress = 0
tsTrain.iProgress = 0
iSnowStuckTimer = 0
iEnemyConversationTimer = 0
iMichaelRandomConversationDelay = 0
iEnemyRandomConversationDelay = 0
bShootingConversationFlag = FALSE
bPlayVanOpenConversation = FALSE
bPlayVanExitConversation = FALSE
bStartSearching = FALSE
bEnemiesBlockedByTrain = FALSE
bPrologueGraveIPLSwapped = FALSE
bPlayerDetected = FALSE
bDetectedConversationPlaying = FALSE
bFirstEnemyWaveSpawned = FALSE
bSecondEnemyWaveSpawned = FALSE
bThirdEnemyWaveSpawned = FALSE
bFourthEnemyWaveSpawned = FALSE
bFifthEnemyWaveSpawned = FALSE
bFifthEnemyWaveIgnored = FALSE
bFirstEnemyReinforcementWaveSpawned = FALSE
bSecondEnemyReinforcementWaveSpawned= FALSE
//bThirdEnemyReinforcementWaveSpawned = FALSE
iSecondEnemyReinforcementDelayTimer = 0
iThirdEnemyReinforcementDelayTimer = 0
iEnemyTombstoneShootTimer = 0
iMichaelsObjectiveTimer = 0
bTaxiLocationSet = FALSE
bShouldDisplayMichaelsObjective = FALSE
bMichaelTrevorPhoneCallTriggered = FALSE
bVehiclePlaybackInterrupted = FALSE
bCutsceneSkipped = FALSE
bStageReplayInProgress = FALSE
bOpenGateTriggered = FALSE
bSmoothcloseGateTriggered = FALSE
iGateCloseProgress = 0
iChurchBellsProgress = 0
iLoadSceneTimer = 0
bSafeToStartMichaelsCall = FALSE
bPlayerDroveOffRoute = FALSE
bPlayerUsedAlternativePath = FALSE
sLabelGTLC = "MCH1_GTLC"
sLabelTOBJ1 = "MCH1_GT_T1"
sLabelTGETBCK1 = "CMN_TGETBCK"
sLabelTOBJ2 = "MCH1_GT_T3"
sLabelTGETIN2 = "CMN_GENGETINPL"
sLabelTGETBCK2 = "CMN_GENGETBCKPL"
eDetectedLocation = DL_NOT_DETECTED
bMusicEventTrevorPlaneTriggered = FALSE
bMusicEventShootoutStartTriggered = FALSE
bMusicEventArrivedChurchTriggered = FALSE
bMusicEventFirstTwoDeadTriggered = FALSE
bMusicEventFirstVanTriggered = FALSE
bMusicEventAlertedTriggered = FALSE
bMusicEventTrainTriggered = FALSE
bMusicEventKidnappedTriggered = FALSE
bMusicEventReadyToFlyTriggered = FALSE
iFirstVanTriggerTimer = 0
iWeatherTypeTimer = 0
bWeatherTypeOvercastSet = FALSE
bWeatherTypeRainSet = FALSE
bWeatherTypeThunderSet = FALSE
iLeadInTimer = 0
bLeadInTiggered = FALSE
bPlayerPedScriptTaskInterrupted = FALSE
bRenderBlips = FALSE
bRenderBlipsTimer = 0
bTrevorFlightActive = FALSE
fDistanceToDestination = 0.0
iTrevorDriveOutProgress = 0
//bShouldUseDefaultTrevorsCar = FALSE
iBradCadaverProgress = 0
iSendTextMessageTimer = 0
iCutsceneTriggerTimer = 0
bCutsceneTimeTrigger = FALSE
bCutsceneProximityTrigger = FALSE
bPTFXStarted = FALSE
bStartFlashBackStream = FALSE
iFlashbackStreamProgress = 0
iFlashbackSubtitleProgress = 0
bReplayStopEventTriggered = FALSE
bReplayStartEventTriggered = FALSE
bFirstPersonFXTriggered = FALSE
bCamViewModeContextChanged = FALSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission flags and progress counters are reset.")
#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
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 REMOVE_PED_WEAPONS_LEAVING_ONE(PED_INDEX PedIndex, WEAPON_TYPE eWeaponToLeave, INT iMinBulletCount = 100)
IF DOES_ENTITY_EXIST(PedIndex)
IF NOT IS_ENTITY_DEAD(PedIndex)
INT iWeaponSlot
WEAPON_SLOT eWeaponSlot
FOR iWeaponSlot = 0 TO ENUM_TO_INT(NUM_WEAPONSLOTS)-1
eWeaponSlot = GET_PLAYER_PED_WEAPON_SLOT_FROM_INT(iWeaponSlot)
IF ( eWeaponSlot != WEAPONSLOT_INVALID )
WEAPON_TYPE eCurrentWeaponType
eCurrentWeaponType = GET_PED_WEAPONTYPE_IN_SLOT(PedIndex, eWeaponSlot)
IF ( eCurrentWeaponType != eWeaponToLeave )
AND ( eCurrentWeaponType != WEAPONTYPE_UNARMED )
AND ( eCurrentWeaponType != WEAPONTYPE_INVALID )
SET_PED_AMMO(PedIndex, eCurrentWeaponType, 0)
REMOVE_WEAPON_FROM_PED(PedIndex, eCurrentWeaponType)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing ped weapon ", GET_WEAPON_NAME(eCurrentWeaponType), ".")
#ENDIF
ENDIF
ENDIF
ENDFOR
//remove dlc weapons
INT iDLCWeaponIndex
INT iDLCWeapons = GET_NUM_DLC_WEAPONS()
scrShopWeaponData weaponData
REPEAT iDLCWeapons iDLCWeaponIndex
IF GET_DLC_WEAPON_DATA(iDLCWeaponIndex, weaponData)
WEAPON_TYPE eCurrentWeaponType = INT_TO_ENUM(WEAPON_TYPE, weaponData.m_nameHash)
IF ( eCurrentWeaponType != eWeaponToLeave )
AND ( eCurrentWeaponType != WEAPONTYPE_INVALID )
AND ( eCurrentWeaponType != WEAPONTYPE_UNARMED )
SET_PED_AMMO(PedIndex, eCurrentWeaponType, 0)
REMOVE_WEAPON_FROM_PED(PedIndex, eCurrentWeaponType)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing ped DLC weapon ", GET_WEAPON_NAME(eCurrentWeaponType), ".")
#ENDIF
ENDIF
ENDIF
ENDREPEAT
//check if player has a pistol
IF HAS_PED_GOT_WEAPON(PedIndex, eWeaponToLeave)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped has weapon ", GET_WEAPON_NAME(eWeaponToLeave), ".")
#ENDIF
INT iAmmo = GET_AMMO_IN_PED_WEAPON(PedIndex, eWeaponToLeave)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped has got ", iAmmo, " bullets in weapon ", GET_WEAPON_NAME(eWeaponToLeave), ".")
#ENDIF
IF ( iAmmo < iMinBulletCount )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped has got less than ", iMinBulletCount, " bullets in weapon ", GET_WEAPON_NAME(eWeaponToLeave), ".")
#ENDIF
INT iBulletCountDifference
iBulletCountDifference = iMinBulletCount - iAmmo
ADD_AMMO_TO_PED(PedIndex, eWeaponToLeave, iBulletCountDifference)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding ", iBulletCountDifference, " bullets to ped weapon ", GET_WEAPON_NAME(eWeaponToLeave), ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped has now got ", GET_AMMO_IN_PED_WEAPON(PedIndex, eWeaponToLeave), " bullets in weapon ", GET_WEAPON_NAME(eWeaponToLeave), ".")
#ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped does not have weapon ", GET_WEAPON_NAME(eWeaponToLeave), ".")
#ENDIF
GIVE_WEAPON_TO_PED(PedIndex, eWeaponToLeave, iMinBulletCount, FALSE, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Giving ped weapon ", GET_WEAPON_NAME(eWeaponToLeave), " with ", iMinBulletCount, " bullets.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SET_CUTSCENE_TRIGGER_FLAG_FOR_PLAYER_PED_ENUM(enumCharacterList ePlayerPedCharacter, BOOL &bMichaelTriggerFlag, BOOL &bTrevorTriggerFlag)
IF ( ePlayerPedCharacter = CHAR_MICHAEL )
bMichaelTriggerFlag = TRUE
bTrevorTriggerFlag = FALSE
ELIF ( ePlayerPedCharacter = CHAR_TREVOR )
bMichaelTriggerFlag = FALSE
bTrevorTriggerFlag = TRUE
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting graveyard cutscene trigger flags bMichaelTriggerFlag to ", bMichaelTriggerFlag,
" and bTrevorTriggerFlag to ", bTrevorTriggerFlag, " due to debug skips, shit skip or mission replay.")
#ENDIF
ENDPROC
/// 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(MISSION_STAGES eStage)
IF eStage = MISSION_STAGE_END
RETURN MISSION_STAGE_END
ENDIF
IF eStage = MISSION_STAGE_GET_TO_AIRPORT
RETURN MISSION_STAGE_CUTSCENE_AIRPORT
ENDIF
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:
/// Performs a screen fade in with a wait for a specified time.
/// PARAMS:
/// iTime - Duration of the fade in miliseconds.
PROC DO_SAFE_SCREEN_FADE_IN(INT iTime)
IF NOT IS_SCREEN_FADED_IN()
DO_SCREEN_FADE_IN(iTime)
WHILE NOT IS_SCREEN_FADED_IN()
WAIT(0)
ENDWHILE
ENDIF
ENDPROC
/// PURPOSE:
/// Performs a screen fade out with a wait for a specified time.
/// PARAMS:
/// iTime - Duration of the fade in miliseconds.
PROC DO_SAFE_SCREEN_FADE_OUT(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:
/// Stops an active mocap cutscene and waits until it has finished.
PROC DO_SAFE_STOP_CUTSCENE()
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 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
PROC START_CUTSCENE_AT_COORDS_WITH_HEADING(VECTOR vPosition, FLOAT fHeading)
SET_CUTSCENE_TRIGGER_AREA(vZero, 0.0, fHeading, 0.0)
START_CUTSCENE_AT_COORDS(vPosition)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting cutscene at ", vPosition, ", ", fHeading, ".")
#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 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
PROC PRINT_FAKE_SUBTITLE(STRING sLabel, INT iDuration = DEFAULT_GOD_TEXT_TIME)
FORCE_NEXT_MESSAGE_TO_PREVIOUS_BRIEFS_LIST(PREVIOUS_BRIEF_FORCE_DIALOGUE)
IF GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 1
CLEAR_PRINTS()
PRINT(sLabel, iDuration, 1)
ENDIF
ENDPROC
PROC DISPLAY_TEXT_ON_BLACK_SCREEN(STRING sText)
FLOAT fFontHeight
IF GET_CURRENT_LANGUAGE() = LANGUAGE_CHINESE
OR GET_CURRENT_LANGUAGE() = LANGUAGE_JAPANESE
OR GET_CURRENT_LANGUAGE() = LANGUAGE_KOREAN
OR GET_CURRENT_LANGUAGE() = LANGUAGE_CHINESE_SIMPLIFIED
SET_TEXT_SCALE(0.675, 0.675) //150% larger font for korean, japanese and chinese
fFontHeight = GET_RENDERED_CHARACTER_HEIGHT(0.675)
ELSE //all other languages
SET_TEXT_SCALE(0.45, 0.45)
fFontHeight = GET_RENDERED_CHARACTER_HEIGHT(0.45)
ENDIF
SET_TEXT_CENTRE(TRUE)
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_AFTER_FADE)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT(sText)
END_TEXT_COMMAND_DISPLAY_TEXT(0.5, 0.5 - (fFontHeight / 2))
RESET_SCRIPT_GFX_ALIGN()
HIDE_LOADING_ON_FADE_THIS_FRAME()
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME()
ENDPROC
PROC SMOOTH_LOCK_GRAVEYARD_GATE(INT i, FLOAT fSpeed = 0.2, FLOAT fTolerance = 0.01)
IF ( Gates[i].bClosed = FALSE )
FLOAT fOpenRatio
fOpenRatio = DOOR_SYSTEM_GET_OPEN_RATIO(ENUM_TO_INT(Gates[i].eHashEnum))
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_COORDS(Gates[i].vPosition, GET_STRING_FROM_FLOAT(fOpenRatio), 1.0)
#ENDIF
IF fOpenRatio <= -fTolerance
OR fOpenRatio >= fTolerance
IF fOpenRatio > 0.0
fOpenRatio -= fSpeed
ELIF fOpenRatio < 0.0
fOpenRatio += fSpeed
ENDIF
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(Gates[i].eHashEnum), fOpenRatio, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(Gates[i].eHashEnum), DOORSTATE_LOCKED, FALSE, TRUE)
CLEAR_AREA_OF_OBJECTS(Gates[i].vPosition, 2.0)
ELSE
fOpenRatio = 0.0
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(Gates[i].eHashEnum), fOpenRatio, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(Gates[i].eHashEnum), DOORSTATE_LOCKED, FALSE, TRUE)
Gates[i].bClosed = TRUE
ENDIF
ENDIF
ENDPROC
PROC REGISTER_GRAVEYARD_GATE(INT i)
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(Gates[i].eHashEnum))
ADD_DOOR_TO_SYSTEM(ENUM_TO_INT(Gates[i].eHashEnum), Gates[i].ModelName, Gates[i].vPosition, FALSE, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding door ", i, " with int ", ENUM_TO_INT(Gates[i].eHashEnum), " to system with model ",
GET_MODEL_NAME_FOR_DEBUG(Gates[i].ModelName), " at coordinates ", Gates[i].vPosition, ".")
#ENDIF
ENDIF
ENDPROC
PROC UNREGISTER_GRAVEYARD_GATE(INT i)
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(Gates[i].eHashEnum))
REMOVE_DOOR_FROM_SYSTEM(ENUM_TO_INT(Gates[i].eHashEnum))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing door ", i, " with int ", ENUM_TO_INT(Gates[i].eHashEnum), " from system with model ",
GET_MODEL_NAME_FOR_DEBUG(Gates[i].ModelName), " at coordinates ", Gates[i].vPosition, ".")
#ENDIF
ENDIF
ENDPROC
PROC LOCK_GRAVEYARD_GATE(INT i)
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(Gates[i].eHashEnum))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(Gates[i].eHashEnum), 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(Gates[i].eHashEnum), DOORSTATE_LOCKED, FALSE, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Locking door ", i, " with int ", ENUM_TO_INT(Gates[i].eHashEnum), " with model ",
GET_MODEL_NAME_FOR_DEBUG(Gates[i].ModelName), " at coordinates ", Gates[i].vPosition, ".")
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Door ", i, " with int ", ENUM_TO_INT(Gates[i].eHashEnum), " with model ",
GET_MODEL_NAME_FOR_DEBUG(Gates[i].ModelName), " at coordinates ", Gates[i].vPosition, " is not registered with door system.")
#ENDIF
ENDIF
ENDPROC
PROC UNLOCK_GRAVEYARD_GATE(INT i)
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(Gates[i].eHashEnum))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(Gates[i].eHashEnum), 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(Gates[i].eHashEnum), DOORSTATE_UNLOCKED, FALSE, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Unlocking door ", i, " with int ", ENUM_TO_INT(Gates[i].eHashEnum), " with model ",
GET_MODEL_NAME_FOR_DEBUG(Gates[i].ModelName), " at coordinates ", Gates[i].vPosition, ".")
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Door ", i, " with int ", ENUM_TO_INT(Gates[i].eHashEnum), " with model ",
GET_MODEL_NAME_FOR_DEBUG(Gates[i].ModelName), " at coordinates ", Gates[i].vPosition, " is not registered with door system.")
#ENDIF
ENDIF
ENDPROC
PROC REGISTER_GRAVEYARD_GATES()
INT i = 0
FOR i = 0 TO ( MAX_GRAVEYARD_GATES - 1 )
REGISTER_GRAVEYARD_GATE(i)
ENDFOR
ENDPROC
PROC UNREGISTER_GRAVEYARD_GATES()
INT i = 0
FOR i = 0 TO ( MAX_GRAVEYARD_GATES - 1 )
UNREGISTER_GRAVEYARD_GATE(i)
ENDFOR
ENDPROC
PROC LOCK_GRAVEYARD_GATES()
INT i = 0
FOR i = 0 TO ( MAX_GRAVEYARD_GATES - 1 )
LOCK_GRAVEYARD_GATE(i)
ENDFOR
ENDPROC
PROC UNLOCK_GRAVEYARD_GATES()
INT i = 0
FOR i = 0 TO ( MAX_GRAVEYARD_GATES - 1 )
UNLOCK_GRAVEYARD_GATE(i)
ENDFOR
ENDPROC
PROC RUN_GRAVEYARD_GATES_CHECK(MISSION_STAGES eStage, BOOL bOpenTriggered, BOOL bCloseTriggered, INT &iGateProgress)
SWITCH eStage
CASE MISSION_STAGE_GET_TO_GRAVEYARD
CASE MISSION_STAGE_GET_TO_GRAVE
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
// IF NOT IS_CUTSCENE_PLAYING()
// ENDIF
BREAK
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
SWITCH iGateProgress
CASE 0
LOCK_GRAVEYARD_GATE(0)
LOCK_GRAVEYARD_GATE(1)
iGateProgress++
BREAK
CASE 1
IF ( bOpenTriggered = TRUE )
UNLOCK_GRAVEYARD_GATE(0)
UNLOCK_GRAVEYARD_GATE(1)
Gates[0].bClosed = FALSE
Gates[1].bClosed = FALSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Unlocking doors for smooth locking.")
#ENDIF
iGateProgress++
ENDIF
BREAK
CASE 2
IF ( bCloseTriggered = TRUE )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Running smooth locking.")
#ENDIF
SMOOTH_LOCK_GRAVEYARD_GATE(0, 0.075, 0.05)
SMOOTH_LOCK_GRAVEYARD_GATE(1, 0.075, 0.05)
IF ( Gates[0].bClosed = TRUE )
AND ( Gates[1].bClosed = TRUE )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Smooth locking is done.")
#ENDIF
iGateProgress++
ENDIF
ENDIF
BREAK
CASE 3
LOCK_GRAVEYARD_GATE(0)
LOCK_GRAVEYARD_GATE(1)
iGateProgress++
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDPROC
PROC ADD_NAVMESH_BLOCKING_OBJECTS()
IF ( iNMBlockingObject01 = -1)
iNMBlockingObject01 = ADD_NAVMESH_BLOCKING_OBJECT(<< 3242.716, -4707.644, 112.0 >>, << 18.144, 14.964, 5.0 >>, 0.0)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding nav mesh blocking object iNMBlockingObject01.")
#ENDIF
ENDIF
IF ( iNMBlockingObject02 = -1)
iNMBlockingObject02 = ADD_NAVMESH_BLOCKING_OBJECT(<< 3294.783, -4613.386, 112.0 >>, << 4.200, 6.294, 5.0 >>, 0.0)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding nav mesh blocking object iNMBlockingObject02.")
#ENDIF
ENDIF
IF ( iNMBlockingObject03 = -1)
iNMBlockingObject03 = ADD_NAVMESH_BLOCKING_OBJECT(<< 3263.877, -4560.729, 118.000 >>, << 6.650, 6.000, 5.0 >>, 0.0)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding nav mesh blocking object iNMBlockingObject03.")
#ENDIF
ENDIF
IF ( iNMBlockingObject04 = -1)
iNMBlockingObject04 = ADD_NAVMESH_BLOCKING_OBJECT(<< 3238.994, -4592.786, 115.000 >>, << 6.650, 6.000, 5.0 >>, 0.0)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding nav mesh blocking object iNMBlockingObject04.")
#ENDIF
ENDIF
IF ( iNMBlockingObject05 = -1)
iNMBlockingObject05 = ADD_NAVMESH_BLOCKING_OBJECT(<< 3198.355, -4706.313, 112.000 >>, << 12.179, 14.115, 5.0 >>, 0.0)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding nav mesh blocking object iNMBlockingObject05.")
#ENDIF
ENDIF
IF ( iNMBlockingObject06 = -1)
iNMBlockingObject06 = ADD_NAVMESH_BLOCKING_OBJECT(<< 3214.000, -4765.436, 112.000 >>, << 64.0, 32.0, 8.0 >>, 0.0)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding nav mesh blocking object iNMBlockingObject06.")
#ENDIF
ENDIF
IF ( iNMBlockingObject07 = -1)
iNMBlockingObject07 = ADD_NAVMESH_BLOCKING_OBJECT(<< 3259.800, -4573.900, 117.300 >>, << 2.5, 4.0, 2.0 >>, 0.0)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding nav mesh blocking object iNMBlockingObject07.")
#ENDIF
ENDIF
ENDPROC
PROC REMOVE_NAVMESH_BLOCKING_OBJECTS()
IF ( iNMBlockingObject01 != -1)
REMOVE_NAVMESH_BLOCKING_OBJECT(iNMBlockingObject01)
iNMBlockingObject01 = -1
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing nav mesh blocking object iNMBlockingObject01.")
#ENDIF
ENDIF
IF ( iNMBlockingObject02 != -1)
REMOVE_NAVMESH_BLOCKING_OBJECT(iNMBlockingObject02)
iNMBlockingObject02 = -1
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing nav mesh blocking object iNMBlockingObject02.")
#ENDIF
ENDIF
IF ( iNMBlockingObject03 != -1)
REMOVE_NAVMESH_BLOCKING_OBJECT(iNMBlockingObject03)
iNMBlockingObject03 = -1
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing nav mesh blocking object iNMBlockingObject03.")
#ENDIF
ENDIF
IF ( iNMBlockingObject04 != -1)
REMOVE_NAVMESH_BLOCKING_OBJECT(iNMBlockingObject04)
iNMBlockingObject04 = -1
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing nav mesh blocking object iNMBlockingObject04.")
#ENDIF
ENDIF
IF ( iNMBlockingObject05 != -1)
REMOVE_NAVMESH_BLOCKING_OBJECT(iNMBlockingObject05)
iNMBlockingObject05 = -1
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing nav mesh blocking object iNMBlockingObject05.")
#ENDIF
ENDIF
IF ( iNMBlockingObject06 != -1)
REMOVE_NAVMESH_BLOCKING_OBJECT(iNMBlockingObject06)
iNMBlockingObject06 = -1
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing nav mesh blocking object iNMBlockingObject06.")
#ENDIF
ENDIF
IF ( iNMBlockingObject07 != -1)
REMOVE_NAVMESH_BLOCKING_OBJECT(iNMBlockingObject07)
iNMBlockingObject07 = -1
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing nav mesh blocking object iNMBlockingObject07.")
#ENDIF
ENDIF
ENDPROC
PROC CREATE_TRACKED_POINT_FOR_COORD(INT &iTrackedPoint, VECTOR vPosition, FLOAT fRadius)
IF ( iTrackedPoint = -1 )
iTrackedPoint = CREATE_TRACKED_POINT()
SET_TRACKED_POINT_INFO(iTrackedPoint, vPosition, fRadius)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating tracked point with id ", iTrackedPoint, " for coord ", vPosition, " and radius ", fRadius, ".")
#ENDIF
ENDIF
ENDPROC
PROC CLEANUP_TRACKED_POINT(INT &iTrackedPoint)
IF ( iTrackedPoint != -1 )
DESTROY_TRACKED_POINT(iTrackedPoint)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Destroying tracked point with id ", iTrackedPoint, ".")
#ENDIF
iTrackedPoint = -1
ENDIF
ENDPROC
FUNC BOOL DOES_TRACKED_POINT_EXIST(INT iTrackedPoint)
RETURN iTrackedPoint != -1
ENDFUNC
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 )
AND ( sArray[i].bTaken = FALSE )
//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
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_GET_CLOSEST_COVERPOINT_FOR_PED() Setting coverpoint at index ", iClosestCoverpoint, " as taken.")
#ENDIF
sArray[iClosestCoverpoint].bTaken = TRUE
sArray[iClosestCoverpoint].TakenPedIndex = PedIndex
#IF IS_DEBUG_BUILD
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PedIndex), sArray[iClosestCoverpoint].vPosition, 0, 255, 0)
#ENDIF
RETURN TRUE
ENDFUNC
FUNC INT GET_NUMBER_OF_PEDS_FROM_RELATIONSHIP_GROUP_FOR_PED(PED_INDEX PedIndex, REL_GROUP_HASH rgHash, BOOL bCheckEntitiesOnScreen = FALSE)
PED_INDEX pedArray[16]
INT i = 0
INT iNumber = 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 ( bCheckEntitiesOnScreen = TRUE )
IF IS_ENTITY_ON_SCREEN(pedArray[i])
IF ( GET_PED_RELATIONSHIP_GROUP_HASH(pedArray[i]) = rgHash )
iNumber++
ENDIF
ENDIF
ELSE
IF ( GET_PED_RELATIONSHIP_GROUP_HASH(pedArray[i]) = rgHash )
iNumber++
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
ENDIF
// #IF IS_DEBUG_BUILD
// PRINTLN(GET_THIS_SCRIPT_NAME(), ": GET_NUMBER_OF_PEDS_FROM_RELATIONSHIP_GROUP_FOR_PED() returning ", iNumber, ".")
// #ENDIF
RETURN iNumber
ENDFUNC
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
FUNC PED_INDEX GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_BETWEEN_PED_AND_COORD(PED_INDEX PedIndex, REL_GROUP_HASH rgHash, VECTOR vCoordinates
#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)
//find nearby peds and sort them closest distance from specified ped
//put the found ped indexes in the array
GET_PED_NEARBY_PEDS(PedIndex, pedArray, PEDTYPE_ANIMAL)
VECTOR vPedCoords = GET_ENTITY_COORDS(PedIndex)
FOR i = 0 TO ( COUNT_OF(pedArray) - 1 )
IF DOES_ENTITY_EXIST(pedArray[i])
IF NOT IS_PED_INJURED(pedArray[i])
//first ped that is in the specified relationship group should be the closest one
//because GET_PED_NEARBY_PEDS sorts peds by distance
IF ( GET_PED_RELATIONSHIP_GROUP_HASH(pedArray[i]) = rgHash )
IF ( GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(pedArray[i]), vCoordinates) < GET_DISTANCE_BETWEEN_COORDS(vPedCoords, vCoordinates) )
#IF IS_DEBUG_BUILD
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PedIndex), GET_ENTITY_COORDS(pedArray[i]), iRed, iGreen, iBlue)
// PRINTSTRING(GET_THIS_SCRIPT_NAME())PRINTSTRING(": GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_BETWEEN_PED_AND_COORD() Found closest ped in relationship group ")
// IF (rgHash = rgEnemies)
// PRINTSTRING("ENEMIES")
// ENDIF
// PRINTSTRING(" between specified ped and coordinates ")
// PRINTSTRING(GET_STRING_FROM_VECTOR(vCoordinates))
// PRINTSTRING(" at coordinates ")PRINTSTRING(GET_STRING_FROM_VECTOR(GET_ENTITY_COORDS(pedArray[i])))
// PRINTSTRING(".")PRINTNL()
#ENDIF
RETURN pedArray[i]
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
ENDIF
//if no peds were found,
//or if peds are not in the specified relationship group
// #IF IS_DEBUG_BUILD
// PRINTLN(GET_THIS_SCRIPT_NAME(), ": GET_CLOSEST_PED_BETWEEN_PED_AND_COORD() No peds found between specified ped and coordinates ", vCoordinates, ".")
// #ENDIF
RETURN NULL
ENDFUNC
FUNC BOOL HAS_PED_DAMAGED_ENTITY(PED_INDEX PedIndex, ENTITY_INDEX EntityIndex)
IF NOT IS_PED_INJURED(PedIndex)
IF DOES_ENTITY_EXIST(EntityIndex)
IF NOT IS_ENTITY_DEAD(EntityIndex)
RETURN HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(EntityIndex, PedIndex, TRUE)
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL HAS_PED_DAMAGED_VEHICLES(PED_INDEX PedIndex, VEH_STRUCT &vsArray[])
INT i = 0
BOOL bReturn = FALSE
FOR i = 0 TO ( COUNT_OF(vsArray) - 1 )
IF HAS_PED_DAMAGED_ENTITY(PedIndex, vsArray[i].VehicleIndex)
bReturn = TRUE
ENDIF
ENDFOR
RETURN bReturn
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_PLAYER_SHOOTING_AT_ANY_PEDS(PED_INDEX PedIndex)
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF NOT IS_PED_INJURED(PedIndex)
IF IS_PED_SHOOTING(PedIndex)
IF HAS_PLAYER_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
RETURN TRUE
ENDIF
ELSE
//reset the flag is player is not shooting
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
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_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
/// PURPOSE:
/// Shoots an extra bullet from specified ped's weapon at sphere specified by coordinates and radius if this ped is firing.
/// PARAMS:
/// PedIndex - PED_INDEX of ped to shoot the bullet.
/// vCoordinates - Specifies coordinates to shoot the bullet at.
/// fRadius - Specifies the radius of the sphere where the bullet will randomly fly after being fired. Use 0.0 for precise shot at specified coord.
/// iDamage - Specifies the damage the bullet should cause.
PROC SHOOT_BULLET_FROM_PED_WEAPON_AT_COORDS(PED_INDEX PedIndex, VECTOR vCoordinates, FLOAT fRadius, INT iDamage)
IF DOES_ENTITY_EXIST(PedIndex)
IF NOT IS_PED_INJURED(PedIndex)
IF IS_PED_SHOOTING(PedIndex)
WEAPON_TYPE CurrentWeapon
IF GET_CURRENT_PED_WEAPON(PedIndex, CurrentWeapon)
ENTITY_INDEX WeaponIndex = GET_CURRENT_PED_WEAPON_ENTITY_INDEX(PedIndex)
VECTOR vFinalCoordinates = << vCoordinates.X + GET_RANDOM_FLOAT_IN_RANGE(-fRadius, fRadius), vCoordinates.Y + GET_RANDOM_FLOAT_IN_RANGE(-fRadius, fRadius), vCoordinates.Z + GET_RANDOM_FLOAT_IN_RANGE(-fRadius, fRadius) >>
SHOOT_SINGLE_BULLET_BETWEEN_COORDS(GET_ENTITY_COORDS(WeaponIndex), vFinalCoordinates, iDamage, TRUE, CurrentWeapon, PedIndex)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(WeaponIndex), vFinalCoordinates, 255, 255, 0)
#ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
DRAW_DEBUG_SPHERE(vCoordinates, fRadius, 255, 255, 0, 64)
#ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_PED_AT_FRAGGABLE_TOMBSTONE_POSITION(PED_INDEX PedIndex, TOMBSTONE_STRUCT &TombstonesArray[], FLOAT fRadius, INT &iOutTombstone)
INT i = 0
IF NOT IS_PED_INJURED(PedIndex)
FOR i = 0 TO ( COUNT_OF(TombstonesArray) - 1 )
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PedIndex), TombstonesArray[i].vPosition) < fRadius
iOutTombstone = i
RETURN TRUE
ENDIF
ENDFOR
ENDIF
RETURN FALSE
ENDFUNC
PROC RUN_TOMBSTONES_FRAG_CHECK(PED_INDEX PedIndex, PED_INDEX &EnemyPed, INT &iTimer, INT iTimeBetweenChecks, FLOAT fRadius)
IF NOT IS_PED_INJURED(PedIndex)
IF IS_PED_IN_COVER(PedIndex)
OR IS_PED_DUCKING(PedIndex)
INT iCurrentTombstone = 0
//if is ped at one of the specified tombstone fraggable points
IF IS_PED_AT_FRAGGABLE_TOMBSTONE_POSITION(PedIndex, FraggableTombstones, fRadius, iCurrentTombstone)
IF NOT DOES_ENTITY_EXIST(EnemyPed)
OR ( DOES_ENTITY_EXIST(EnemyPed) AND HAS_TIME_PASSED(iTimeBetweenChecks, iTimer) )
EnemyPed = GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(PedIndex, rgEnemies, 0, TRUE #IF IS_DEBUG_BUILD, 255, 255, 0 #ENDIF)
iTimer = GET_GAME_TIMER()
ENDIF
SHOOT_BULLET_FROM_PED_WEAPON_AT_COORDS(EnemyPed, FraggableTombstones[iCurrentTombstone].vShootSphereCenter,
FraggableTombstones[iCurrentTombstone].fShootSphereRadius, 100)
ELSE
EnemyPed = NULL
iTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDPROC
/// 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
/// 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
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Warping ped to coordinates ", vNewPosition, " and heading ", fNewHeading, ".")
#ENDIF
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
/// 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[], VECTOR vStartPosition)
//player's start cover point
sArray[0].vPosition = << 3256.5776, -4575.2520, 117.2670 >>
sArray[0].fHeading = 180.0
sArray[0].CoverpointUsage = COVUSE_WALLTONEITHER
sArray[0].CoverpointHeight = COVHEIGHT_LOW
sArray[0].CoverpointArc = COVARC_90
sArray[0].bActive = FALSE
sArray[0].bStationary = FALSE
//enemy in mocap coverpoint
sArray[1].vPosition = << 3265.5886, -4590.6963, 116.0538 >>
sArray[1].fHeading = 356.8507
sArray[1].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[1].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[1].CoverpointArc = COVARC_90
sArray[1].bActive = FALSE
sArray[1].bStationary = FALSE
sArray[2].vPosition = << 3252.2168, -4600.8184, 115.6129 >>
sArray[2].fHeading = 358.2709
sArray[2].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[2].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[2].CoverpointArc = COVARC_90
sArray[2].bActive = TRUE
sArray[2].bStationary = FALSE
sArray[3].vPosition = << 3263.4075, -4671.8623, 112.9176 >>
sArray[3].fHeading = 343.1592
sArray[3].CoverpointUsage = COVUSE_WALLTONEITHER
sArray[3].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[3].CoverpointArc = COVARC_90
sArray[3].bActive = TRUE
sArray[3].bStationary = FALSE
sArray[4].vPosition = << 3259.5498, -4670.3813, 113.0985 >>
sArray[4].fHeading = 333.0004
sArray[4].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[4].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[4].CoverpointArc = COVARC_90
sArray[4].bActive = TRUE
sArray[4].bStationary = FALSE
sArray[5].vPosition = << 3284.39, -4619.99, 115.01 >>
sArray[5].fHeading = 333.0004
sArray[5].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[5].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[5].CoverpointArc = COVARC_180
sArray[5].bActive = TRUE
sArray[5].bStationary = TRUE
sArray[6].vPosition = << 3281.66, -4627.20, 114.88 >>
sArray[6].fHeading = 333.0004
sArray[6].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[6].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[6].CoverpointArc = COVARC_180
sArray[6].bActive = TRUE
sArray[6].bStationary = TRUE
sArray[7].vPosition = << 3266.56, -4624.87, 115.22 >>
sArray[7].fHeading = 333.0004
sArray[7].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[7].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[7].CoverpointArc = COVARC_180
sArray[7].bActive = TRUE
sArray[7].bStationary = TRUE
sArray[8].vPosition = << 3272.55, -4634.51, 114.69 >>
sArray[8].fHeading = 333.0004
sArray[8].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[8].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[8].CoverpointArc = COVARC_180
sArray[8].bActive = TRUE
sArray[8].bStationary = TRUE
sArray[9].vPosition = <<3275.6057, -4655.5288, 113.0920>>
sArray[9].fHeading = 0.0
sArray[9].CoverpointUsage = COVUSE_WALLTONEITHER
sArray[9].CoverpointHeight = COVHEIGHT_LOW
sArray[9].CoverpointArc = COVARC_90
sArray[9].bActive = TRUE
sArray[9].bStationary = FALSE
sArray[10].vPosition = << 3270.9761, -4639.2290, 113.7132 >>
sArray[10].fHeading = 0.0
sArray[10].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[10].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[10].CoverpointArc = COVARC_90
sArray[10].bActive = TRUE
sArray[10].bStationary = FALSE
sArray[11].vPosition = << 3274.2800, -4639.3032, 113.7452 >>
sArray[11].fHeading = 0.0
sArray[11].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[11].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[11].CoverpointArc = COVARC_90
sArray[11].bActive = TRUE
sArray[11].bStationary = FALSE
sArray[12].vPosition = <<3269.2097, -4627.7412, 114.8999>>
sArray[12].fHeading = 0.0
sArray[12].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[12].CoverpointHeight = COVHEIGHT_LOW
sArray[12].CoverpointArc = COVARC_90
sArray[12].bActive = TRUE
sArray[12].bStationary = FALSE
sArray[13].vPosition = <<3275.9355, -4617.3945, 115.1056>>
sArray[13].fHeading = 0.0
sArray[13].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[13].CoverpointHeight = COVHEIGHT_LOW
sArray[13].CoverpointArc = COVARC_90
sArray[13].bActive = TRUE
sArray[13].bStationary = FALSE
sArray[14].vPosition = << 3278.8743, -4629.7856, 115.0547 >>
sArray[14].fHeading = 89.5197
sArray[14].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[14].CoverpointHeight = COVHEIGHT_LOW
sArray[14].CoverpointArc = COVARC_90
sArray[14].bActive = TRUE
sArray[14].bStationary = FALSE
sArray[15].vPosition = << 3255.8416, -4685.8252, 111.9065 >>
sArray[15].fHeading = 346.2400
sArray[15].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[15].CoverpointHeight = COVHEIGHT_LOW
sArray[15].CoverpointArc = COVARC_90
sArray[15].bActive = TRUE
sArray[15].bStationary = FALSE
sArray[16].vPosition = << 3256.8000, -4692.0205, 111.8840 >>
sArray[16].fHeading = 310.2977
sArray[16].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[16].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[16].CoverpointArc = COVARC_180
sArray[16].bActive = TRUE
sArray[16].bStationary = FALSE
sArray[17].vPosition = <<3281.5632, -4665.9849, 113.1895>>
sArray[17].fHeading = 0.0
sArray[17].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[17].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[17].CoverpointArc = COVARC_90
sArray[17].bActive = TRUE
sArray[17].bStationary = FALSE
sArray[18].vPosition = << 3251.7041, -4684.2788, 112.0217 >>
sArray[18].fHeading = 336.7272
sArray[18].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[18].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[18].CoverpointArc = COVARC_0TO45
sArray[18].bActive = FALSE
sArray[18].bStationary = TRUE
sArray[19].vPosition = << 3262.1086, -4691.1997, 112.0502 >>
sArray[19].fHeading = 34.5997
sArray[19].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[19].CoverpointHeight = COVHEIGHT_LOW
sArray[19].CoverpointArc = COVARC_180
sArray[19].bActive = TRUE
sArray[19].bStationary = FALSE
sArray[20].vPosition = <<3281.5667, -4649.8442, 113.5098>>
sArray[20].fHeading = 0.0
sArray[20].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[20].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[20].CoverpointArc = COVARC_90
sArray[20].bActive = TRUE
sArray[20].bStationary = FALSE
sArray[21].vPosition = <<3275.0962, -4659.8999, 113.0035>>
sArray[21].fHeading = 0.0
sArray[21].CoverpointUsage = COVUSE_WALLTONEITHER
sArray[21].CoverpointHeight = COVHEIGHT_LOW
sArray[21].CoverpointArc = COVARC_90
sArray[21].bActive = TRUE
sArray[21].bStationary = FALSE
sArray[22].vPosition = <<3265.5234, -4657.7856, 113.0917>>
sArray[22].fHeading = 0.0
sArray[22].CoverpointUsage = COVUSE_WALLTONEITHER
sArray[22].CoverpointHeight = COVHEIGHT_LOW
sArray[22].CoverpointArc = COVARC_90
sArray[22].bActive = TRUE
sArray[22].bStationary = FALSE
sArray[23].vPosition = << 3246.5354, -4679.5972, 112.1638 >>
sArray[23].fHeading = 341.1975
sArray[23].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[23].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[23].CoverpointArc = COVARC_90
sArray[23].bActive = TRUE
sArray[23].bStationary = FALSE
sArray[24].vPosition = << 3248.0078, -4680.0767, 112.3925 >>
sArray[24].fHeading = 337.8813
sArray[24].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[24].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[24].CoverpointArc = COVARC_90
sArray[24].bActive = TRUE
sArray[24].bStationary = FALSE
sArray[25].vPosition = << 3240.0486, -4665.3052, 114.2898 >>
sArray[25].fHeading = 0.0
sArray[25].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[25].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[25].CoverpointArc = COVARC_90
sArray[25].bActive = TRUE
sArray[25].bStationary = FALSE
sArray[26].vPosition = << 3231.7991, -4681.4941, 111.9197 >>
sArray[26].fHeading = 272.3667
sArray[26].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[26].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[26].CoverpointArc = COVARC_90
sArray[26].bActive = TRUE
sArray[26].bStationary = FALSE
sArray[27].vPosition = <<3258.3953, -4608.1440, 115.4520>>
sArray[27].fHeading = 4.3189
sArray[27].CoverpointUsage = COVUSE_WALLTOLEFT
sArray[27].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[27].CoverpointArc = COVARC_90
sArray[27].bActive = TRUE
sArray[27].bStationary = FALSE
sArray[28].vPosition = << 3266.5139, -4616.4390, 115.0480 >>
sArray[28].fHeading = 3.0096
sArray[28].CoverpointUsage = COVUSE_WALLTONEITHER
sArray[28].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[28].CoverpointArc = COVARC_90
sArray[28].bActive = TRUE
sArray[28].bStationary = FALSE
sArray[29].vPosition = <<3213.1648, -4715.6494, 111.8129>> //<<3213.2832, -4715.4478, 111.8368>>
sArray[29].fHeading = 295.1623
sArray[29].CoverpointUsage = COVUSE_WALLTONEITHER
sArray[29].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[29].CoverpointArc = COVARC_90
sArray[29].bActive = FALSE
sArray[29].bStationary = FALSE
sArray[30].vPosition = <<3265.4260, -4586.9629, 117.0842>>
sArray[30].fHeading = 180.0
sArray[30].CoverpointUsage = COVUSE_WALLTONEITHER
sArray[30].CoverpointHeight = COVHEIGHT_LOW
sArray[30].CoverpointArc = COVARC_90
sArray[30].bActive = FALSE
sArray[30].bStationary = FALSE
//3262.43, -4586.83, 117.20
sArray[31].vPosition = << 3262.45, -4586.90, 117.11 >>
sArray[31].fHeading = 180.0
sArray[31].CoverpointUsage = COVUSE_WALLTONEITHER
sArray[31].CoverpointHeight = COVHEIGHT_LOW
sArray[31].CoverpointArc = COVARC_90
sArray[31].bActive = FALSE
sArray[31].bStationary = FALSE
sArray[32].vPosition = <<3274.1230, -4635.4863, 114.7559>>
sArray[32].fHeading = 180.0
sArray[32].CoverpointUsage = COVUSE_WALLTONEITHER
sArray[32].CoverpointHeight = COVHEIGHT_LOW
sArray[32].CoverpointArc = COVARC_90
sArray[32].bActive = FALSE
sArray[32].bStationary = FALSE
sArray[33].vPosition = <<3271.0203, -4635.4619, 114.6817>>
sArray[33].fHeading = 180.0
sArray[33].CoverpointUsage = COVUSE_WALLTONEITHER
sArray[33].CoverpointHeight = COVHEIGHT_LOW
sArray[33].CoverpointArc = COVARC_90
sArray[33].bActive = FALSE
sArray[33].bStationary = FALSE
sArray[34].vPosition = <<3260.0383, -4669.2715, 112.8813>>
sArray[34].fHeading = 161.3189
sArray[34].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[34].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[34].CoverpointArc = COVARC_90
sArray[34].bActive = FALSE
sArray[34].bStationary = FALSE
sArray[35].vPosition = <<3233.0288, -4681.5645, 112.2276>>
sArray[35].fHeading = 92.2093
sArray[35].CoverpointUsage = COVUSE_WALLTORIGHT
sArray[35].CoverpointHeight = COVHEIGHT_TOOHIGH
sArray[35].CoverpointArc = COVARC_90
sArray[35].bActive = FALSE
sArray[35].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)
ENDIF
//save the distance from start of the shootout corrdinates
sArray[i].fDistance = VDIST2(vStartPosition, sArray[i].vPosition)
sArray[i].bTaken = FALSE
sArray[i].TakenPedIndex = NULL
ENDFOR
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted coverpoints.")
#ENDIF
ENDPROC
PROC REMOVE_COVERPOINTS(COVERPOINT_STRUCT &sArray[])
INT i = 0
FOR i = 0 TO ( COUNT_OF(sArray) - 1 )
REMOVE_COVER_POINT(sArray[i].CoverpointIndex)
ENDFOR
ENDPROC
PROC INITIALISE_FRAGGABLE_TOMBSTONES(TOMBSTONE_STRUCT &tArray[])
tArray[0].vPosition = << 3256.42, -4575.27, 117.15 >>
tArray[0].vShootSphereCenter = << 3256.39, -4575.69, 118.25 >>
tArray[0].fShootSphereRadius = 0.35
tArray[1].vPosition = << 3254.7119, -4575.1860, 117.1567 >>
tArray[1].vShootSphereCenter = << 3254.68, -4576.13, 118.15 >>
tArray[1].fShootSphereRadius = 0.35
tArray[2].vPosition = << 3252.7468, -4575.3774, 117.1567 >>
tArray[2].vShootSphereCenter = << 3252.76, -4576.09, 118.15 >>
tArray[2].fShootSphereRadius = 0.35
ENDPROC
/// PURPOSE:
/// Requests IPLs for prologue map
PROC REQUEST_PROLOGUE_IPLS(#IF IS_DEBUG_BUILD BOOL bPrintOutput = FALSE #ENDIF)
REQUEST_IPL("prologue01")
REQUEST_IPL("prologue01c")
REQUEST_IPL("prologue01d")
REQUEST_IPL("prologue01e")
REQUEST_IPL("prologue01f")
REQUEST_IPL("prologue01g")
REQUEST_IPL("prologue01h")
REQUEST_IPL("prologue01i")
REQUEST_IPL("prologue01j")
REQUEST_IPL("prologue01k")
REQUEST_IPL("prologue01z")
REQUEST_IPL("prologue02")
REQUEST_IPL("prologue03")
REQUEST_IPL("prologue03b")
REQUEST_IPL("prologue04")
REQUEST_IPL("prologue04b")
REQUEST_IPL("prologue05")
REQUEST_IPL("prologue05b")
REQUEST_IPL("prologue06")
REQUEST_IPL("prologue06b")
REQUEST_IPL("prologuerd")
REQUEST_IPL("prologuerdb")
REQUEST_IPL("prologue_occl")
REQUEST_IPL("prologue_m2_door") //cash depot door
REQUEST_IPL("prologue06_pannel")//cash depot panel covering blood decal
REQUEST_IPL("prologue_LODLights") REMOVE_IPL_FROM_REMOVAL_LIST("prologue_LODLights")
REQUEST_IPL("prologue_DistantLights") REMOVE_IPL_FROM_REMOVAL_LIST("prologue_DistantLights")
#IF IS_DEBUG_BUILD
IF ( bPrintOutput = TRUE )
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requesting prologue IPLs.")
ENDIF
#ENDIF
ENDPROC
PROC REQUEST_PROLOGUE_GRAVE_IPL(BOOL bGraveCovered)
IF ( bGraveCovered = TRUE )
REQUEST_IPL("prologue03_grv_cov")
ELSE
REQUEST_IPL("prologue03_grv_dug")
REQUEST_IPL("prologue_grv_torch")
ENDIF
ENDPROC
PROC REMOVE_PROLOGUE_GRAVE_IPL(BOOL bGraveCovered)
IF ( bGraveCovered = TRUE )
REMOVE_IPL("prologue03_grv_cov")
ELSE
REMOVE_IPL("prologue03_grv_dug")
REMOVE_IPL("prologue_grv_torch")
ENDIF
ENDPROC
/// PURPOSE:
/// Removes IPLs for prologue map
PROC REMOVE_ALL_PROLOGUE_IPLS()
REMOVE_IPL("prologue01")
REMOVE_IPL("prologue01c")
REMOVE_IPL("prologue01d")
REMOVE_IPL("prologue01e")
REMOVE_IPL("prologue01f")
REMOVE_IPL("prologue01g")
REMOVE_IPL("prologue01h")
REMOVE_IPL("prologue01i")
REMOVE_IPL("prologue01j")
REMOVE_IPL("prologue01k")
REMOVE_IPL("prologue01z")
REMOVE_IPL("prologue02")
REMOVE_IPL("prologue03")
REMOVE_IPL("prologue03b")
REMOVE_IPL("prologue04")
REMOVE_IPL("prologue04b")
REMOVE_IPL("prologue05")
REMOVE_IPL("prologue05b")
REMOVE_IPL("prologue06")
REMOVE_IPL("prologue06b")
REMOVE_IPL("prologuerd")
REMOVE_IPL("prologuerdb")
REMOVE_IPL("prologue_occl")
REMOVE_IPL("prologue_m2_door") //cash depot door
REMOVE_IPL("prologue06_pannel") //cash depot panel covering blood decal
REMOVE_IPL_WHEN_SCREEN_IS_FADED_OUT("prologue_LODLights")
REMOVE_IPL_WHEN_SCREEN_IS_FADED_OUT("prologue_DistantLights")
//remove grave IPLs
REMOVE_IPL("prologue03_grv_cov") //grave covered up
REMOVE_IPL("prologue03_grv_dug") //grave dug up
REMOVE_IPL("prologue_grv_torch") //grave torch
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing prologue IPLs.")
#ENDIF
ENDPROC
FUNC BOOL ARE_PROLOGUE_IPLS_ACTIVE(#IF IS_DEBUG_BUILD BOOL bPrintOutput = FALSE #ENDIF)
IF IS_IPL_ACTIVE("prologue01")
AND IS_IPL_ACTIVE("prologue01c")
AND IS_IPL_ACTIVE("prologue01d")
AND IS_IPL_ACTIVE("prologue01e")
AND IS_IPL_ACTIVE("prologue01f")
AND IS_IPL_ACTIVE("prologue01g")
AND IS_IPL_ACTIVE("prologue01h")
AND IS_IPL_ACTIVE("prologue01i")
AND IS_IPL_ACTIVE("prologue01j")
AND IS_IPL_ACTIVE("prologue01k")
AND IS_IPL_ACTIVE("prologue01z")
AND IS_IPL_ACTIVE("prologue02")
AND IS_IPL_ACTIVE("prologue03")
AND IS_IPL_ACTIVE("prologue03b")
AND IS_IPL_ACTIVE("prologue04")
AND IS_IPL_ACTIVE("prologue04b")
AND IS_IPL_ACTIVE("prologue05")
AND IS_IPL_ACTIVE("prologue05b")
AND IS_IPL_ACTIVE("prologue06")
AND IS_IPL_ACTIVE("prologue06b")
AND IS_IPL_ACTIVE("prologuerd")
AND IS_IPL_ACTIVE("prologuerdb")
AND IS_IPL_ACTIVE("prologue_occl")
AND IS_IPL_ACTIVE("prologue_m2_door")
AND IS_IPL_ACTIVE("prologue06_pannel")
AND IS_IPL_ACTIVE("prologue_LODLights")
AND IS_IPL_ACTIVE("prologue_DistantLights")
#IF IS_DEBUG_BUILD
IF ( bPrintOutput = TRUE )
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested prologue IPLs are active.")
ENDIF
#ENDIF
RETURN TRUE
ELSE
REQUEST_PROLOGUE_IPLS(#IF IS_DEBUG_BUILD bPrintOutput #ENDIF)
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_PROLOGUE_GRAVE_IPL_ACTIVE(BOOL bGraveCovered)
IF ( bGraveCovered = TRUE AND IS_IPL_ACTIVE("prologue03_grv_cov"))
OR ( bGraveCovered = FALSE AND IS_IPL_ACTIVE("prologue03_grv_dug") AND IS_IPL_ACTIVE("prologue_grv_torch") )
RETURN TRUE
ELSE
REQUEST_PROLOGUE_GRAVE_IPL(bGraveCovered)
ENDIF
RETURN FALSE
ENDFUNC
PROC INITIALISE_ROADNODES(ROADNODE_STRUCT &sArray[])
INT i
FOR i = 0 TO ( COUNT_OF(sArray) - 1 )
sArray[i].bCurrent = FALSE
sArray[i].bVisited = FALSE
sArray[i].bInVehicleOnly = FALSE
sArray[i].fAllowedDistance = 30.0
sArray[i].fFailDistance = 65.0
ENDFOR
sArray[0].vPosition = << 5389.9370, -5119.8447, 77.2221 >>
sArray[0].fAllowedDistance = 60.0
sArray[0].fFailDistance = 75.0
sArray[1].vPosition = << 5345.9414, -5119.0063, 77.5530 >>
sArray[2].vPosition = << 5296.8979, -5117.0566, 77.7141 >>
sArray[3].vPosition = << 5247.0103, -5118.9624, 78.1801 >>
sArray[4].vPosition = << 5204.3687, -5109.8389, 80.1127 >>
sArray[5].vPosition = << 5159.1436, -5099.8164, 82.9601 >>
sArray[6].vPosition = << 5108.6816, -5096.3379, 85.0854 >>
sArray[7].vPosition = << 5062.9180, -5100.3804, 86.1269 >>
sArray[8].vPosition = << 5015.0063, -5099.8042, 87.3856 >>
sArray[9].vPosition = << 4969.4209, -5094.0811, 89.0202 >>
sArray[10].vPosition = << 4919.6489, -5074.7393, 92.9304 >>
sArray[11].vPosition = << 4870.7705, -5078.6123, 93.9856 >>
sArray[12].vPosition = << 4832.3604, -5084.3633, 99.4540 >>
sArray[13].vPosition = << 4785.0508, -5086.8774, 105.334 >>
sArray[14].vPosition = << 4738.4673, -5080.2607, 105.8345 >>
sArray[15].vPosition = << 4686.5527, -5076.7695, 104.6976 >>
sArray[16].vPosition = << 4647.9287, -5081.8486, 104.5225 >>
sArray[17].vPosition = << 4602.0444, -5065.8916, 107.5456 >>
sArray[18].vPosition = << 4565.0513, -5069.5972, 109.6650 >>
sArray[19].vPosition = << 4536.7461, -5087.0767, 109.5740 >>
sArray[20].vPosition = << 4509.1904, -5097.9014, 109.6287 >>
sArray[21].vPosition = << 4456.6255, -5103.6973, 110.0983 >>
sArray[22].vPosition = << 4424.8999, -5098.8540, 109.9986 >>
sArray[23].vPosition = << 4396.0020, -5093.2793, 110.1756 >>
sArray[24].vPosition = << 4353.3970, -5084.6865, 110.0036 >>
sArray[25].vPosition = << 4320.7988, -5079.9478, 109.9395 >>
sArray[26].vPosition = << 4291.6147, -5075.3096, 109.5563 >>
sArray[27].vPosition = << 4267.0718, -5073.1646, 109.8080 >>
sArray[28].vPosition = << 4226.2935, -5070.5444, 109.8746 >>
sArray[29].vPosition = << 4174.7227, -5066.4771, 109.3556 >>
sArray[30].vPosition = << 4143.5771, -5062.4434, 108.4574 >>
sArray[31].vPosition = << 4093.8284, -5059.8164, 107.4577 >>
sArray[32].vPosition = << 4052.0479, -5055.2261, 107.6872 >>
sArray[32].fFailDistance = 75.0
sArray[33].vPosition = << 4004.2981, -5049.7749, 108.2748 >>
sArray[33].fFailDistance = 75.0
sArray[34].vPosition = << 3964.8726, -5042.9771, 108.9244 >>
sArray[34].fFailDistance = 80.0
sArray[35].vPosition = << 3917.5972, -5032.8413, 109.8531 >>
sArray[35].fFailDistance = 80.0
sArray[36].vPosition = << 3878.2581, -5020.6216, 110.4011 >>
sArray[36].fFailDistance = 80.0
sArray[37].vPosition = << 3833.2644, -5007.9419, 110.8658 >>
sArray[37].fFailDistance = 80.0
sArray[38].vPosition = << 3794.0808, -4991.2241, 110.7152 >>
sArray[38].fFailDistance = 80.0
sArray[39].vPosition = << 3760.8127, -4980.0356, 110.1112 >>
sArray[39].fFailDistance = 80.0
sArray[40].vPosition = << 3732.6055, -4965.3408, 110.3322 >>
sArray[40].fFailDistance = 80.0
sArray[41].vPosition = << 3693.6980, -4948.2495, 110.6774 >>
sArray[41].fFailDistance = 80.0
sArray[42].vPosition = << 3671.0850, -4935.0083, 110.6896 >>
sArray[42].fFailDistance = 80.0
sArray[43].vPosition = << 3627.5833, -4914.8174, 110.6058 >>
sArray[44].vPosition = << 3590.4031, -4898.1479, 110.6681 >>
sArray[45].vPosition = << 3553.3826, -4885.2036, 110.7241 >>
sArray[46].vPosition = << 3524.9050, -4873.6226, 110.7502 >>
sArray[47].vPosition = << 3481.6187, -4862.8203, 110.7855 >>
sArray[48].vPosition = << 3447.1887, -4856.9600, 110.7985 >>
sArray[49].vPosition = << 3415.6260, -4851.4873, 110.8072 >>
sArray[50].vPosition = << 3387.0598, -4848.4624, 110.7909 >>
sArray[51].vPosition = << 3343.5305, -4845.6938, 110.8147 >>
sArray[52].vPosition = << 3313.5476, -4842.9521, 110.8140 >>
sArray[53].vPosition = << 3270.7791, -4839.1641, 110.8142 >>
sArray[54].vPosition = << 3242.1299, -4837.0957, 110.8146 >>
sArray[55].vPosition = << 3212.8823, -4833.6548, 110.8150 >>
sArray[55].fAllowedDistance = 25.0
sArray[55].fFailDistance = 50.0
sArray[56].vPosition = << 3214.8853, -4805.0098, 110.8144 >>
sArray[56].fAllowedDistance = 35.0
sArray[56].fFailDistance = 55.0
sArray[57].vPosition = << 3217.2200, -4777.5288, 110.8147 >>
sArray[58].vPosition = << 3220.8281, -4727.3423, 111.2513 >>
sArray[58].bInVehicleOnly = TRUE
ENDPROC
FUNC BOOL CAN_GET_CLOSEST_ROADNODE_FOR_PED(PED_INDEX PedIndex, ROADNODE_STRUCT &sArray[], ROADNODE_STRUCT &sResult
#IF IS_DEBUG_BUILD, BOOL bPrintOutput = FALSE #ENDIF)
INT i = 0
FLOAT fShortestDistance = 1000.0
FLOAT fCurrentDistance = 0.0
INT iClosestRoadNode = -1
IF NOT IS_PED_INJURED(PedIndex)
FOR i = 0 TO ( COUNT_OF(sArray) - 1 )
IF ( sArray[i].bVisited = FALSE ) //check only road nodes not yet visited
fCurrentDistance = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PedIndex), sArray[i].vPosition)
IF ( fCurrentDistance < fShortestDistance)
fShortestDistance = fCurrentDistance
iClosestRoadNode = i
sArray[i].bCurrent = TRUE
IF ( i > 0 )
IF ( sArray[i - 1].bCurrent = TRUE )
sArray[i - 1].bCurrent = FALSE
sArray[i - 1].bVisited = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
ENDIF
IF ( iClosestRoadNode = -1 )
#IF IS_DEBUG_BUILD
IF ( bPrintOutput = TRUE )
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_GET_CLOSEST_ROADNODE_FOR_PED() No road nodes found.")
ENDIF
#ENDIF
RETURN FALSE
ENDIF
#IF IS_DEBUG_BUILD
IF ( bPrintOutput = TRUE )
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_GET_CLOSEST_ROADNODE_FOR_PED() Found closest road node from road nodes array at index ", iClosestRoadNode, ".")
ENDIF
#ENDIF
sResult = sArray[iClosestRoadNode]
#IF IS_DEBUG_BUILD
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PedIndex), sArray[iClosestRoadNode].vPosition, 0, 255, 0)
#ENDIF
RETURN TRUE
ENDFUNC
PROC RUN_ROADNODES_CHECK(PED_INDEX PedIndex #IF IS_DEBUG_BUILD, BOOL bPrintOutput = FALSE #ENDIF)
IF NOT IS_PED_INJURED(PedIndex)
ROADNODE_STRUCT sCurrentRoadNode
IF CAN_GET_CLOSEST_ROADNODE_FOR_PED(PedIndex, sRoadNodes, sCurrentRoadNode #IF IS_DEBUG_BUILD, bPrintOutput #ENDIF)
FLOAT fDistanceToCurrentRoadNode = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PedIndex), sCurrentRoadNode.vPosition)
//check if player should fail the mission for driving far away from current road node
IF ( fDistanceToCurrentRoadNode > sCurrentRoadNode.fFailDistance )
IF ( sCurrentRoadNode.bInVehicleOnly = TRUE )
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip) //if player is in the mission car
OR IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) //or if player is in any other car (used to push mission car around), fix for B*1713614
bPlayerDroveOffRoute = TRUE
ENDIF
ELSE
bPlayerDroveOffRoute = TRUE //this will cause a fail in run_fail_checks() proc
ENDIF
ELIF ( fDistanceToCurrentRoadNode > sCurrentRoadNode.fAllowedDistance ) //warn the player about driving too far away
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip) //if player is in the car
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GBRLC")
IF IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
CLEAR_PRINTS()
ENDIF
PRINT_GOD_TEXT_ADVANCED("MCH1_GBRLC")
ENDIF
ENDIF
ELSE
//IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
// IF HAS_LABEL_BEEN_TRIGGERED("MCH1_GBRLC")
// SET_LABEL_AS_TRIGGERED("MCH1_GBRLC", FALSE)
// ENDIF
//ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// 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 ", 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:
/// 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
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 MISCELLANEOUS PROCEDURES & FUNCTIONS ======================|
//|============================== CLEANUP PROCEDURES & FUNCTIONS =========================|
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 = PLAYER_PED_ID() )
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", sDebugName, " cleaned up with reason PED_CLEANUP_KILLED_BY_PLAYER_AS_MICHAEL.")
#ENDIF
RETURN PED_CLEANUP_KILLED_BY_PLAYER_AS_MICHAEL
ENDIF
ENDIF
ELIF IS_ENTITY_A_VEHICLE(SourceOfDeathEntity)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", sDebugName, " cleaned up with reason PED_CLEANUP_KILLED_BY_VEHICLE.")
#ENDIF
RETURN PED_CLEANUP_KILLED_BY_VEHICLE
ENDIF
ENDIF
ENDIF
RETURN PED_CLEANUP_NO_CLEANUP
ENDFUNC
PROC UPDATE_PLAYER_KILL_COUNTERS(PED_CLEANUP_REASONS eCleanupReason, INT &iPlayerKillsAsMichael)
SWITCH eCleanupReason
CASE PED_CLEANUP_KILLED_BY_PLAYER_AS_MICHAEL
iPlayerKillsAsMichael++
INFORM_MISSION_STATS_OF_INCREMENT(MIC1_KILLS) //increment mission stat
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": **************************** UPDATE_PLAYER_KILL_COUNTERS ******************************")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player kills as Michael: ", iPlayerKillsAsMichael, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": ***************************************************************************************")
#ENDIF
ENDPROC
PROC CLEANUP_ENEMY_PED(ENEMY_STRUCT &enemy, BOOL bDelete = FALSE, BOOL bDeathOnly = TRUE, BOOL bKeepTask = TRUE)
IF ( bDelete = FALSE )
IF DOES_ENTITY_EXIST(enemy.PedIndex)
IF ( bDeathOnly = TRUE )
IF IS_PED_INJURED(enemy.PedIndex)
enemy.eCleanupReason = GET_PED_CLEANUP_REASON(enemy.PedIndex #IF IS_DEBUG_BUILD, enemy.sDebugName #ENDIF)
UPDATE_PLAYER_KILL_COUNTERS(enemy.eCleanupReason, iPlayerMichaelKills)
REMOVE_PED_DEFENSIVE_AREA(enemy.PedIndex)
SET_PED_AS_NO_LONGER_NEEDED(enemy.PedIndex)
IF DOES_BLIP_EXIST(enemy.BlipIndex)
REMOVE_BLIP(enemy.BlipIndex)
ENDIF
IF IS_ITEMSET_VALID(enemy.ItemsetIndex)
DESTROY_ITEMSET(enemy.ItemsetIndex)
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
CLEANUP_AI_PED_BLIP(enemy.EnemyBlipData)
enemy.bCreated = FALSE
enemy.bFallingBack = FALSE
enemy.bHasTask = FALSE
enemy.bSearching = FALSE
enemy.bReversing = FALSE
enemy.iTimer = 0
enemy.iProgress = 0
enemy.iWaypointProgress = 0
enemy.iConversationTimer = 0
enemy.eCleanupReason = PED_CLEANUP_NO_CLEANUP
ENDIF
ENDPROC
/// PURPOSE:
/// Handles removing dead enemy peds from a specified enemy ped array by setting them as no longer needed.
/// Deletes the peds no matter of their health state if bDelete is set to TRUE.
/// PARAMS:
/// array - Array of enemy peds to cleanup.
/// bDelete - If set to TRUE this will delete the peds no matter if they are dead or alive.
/// bDeathOnly - IF set to TRUE this will set peds as no longer needed, when bDelete is FALSE. Use for mission cleanup.
/// bKeepTask - IF set to TRUE this will make peds keep their tasks. Use for mission cleanup.
PROC CLEANUP_ENEMY_GROUP(ENEMY_STRUCT &array[], BOOL bDelete = FALSE, BOOL bDeathOnly = TRUE, BOOL bKeepTask = TRUE)
INT i = 0
FOR i = 0 TO ( COUNT_OF(array) - 1 )
CLEANUP_ENEMY_PED(array[i], bDelete, bDeathOnly, bKeepTask)
IF ( bDelete = TRUE )
array[i].bCreated = FALSE
ENDIF
ENDFOR
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.
/// bBlipOnly - If set to TRUE this will remove dead or undriveable vehicle blip only.
PROC CLEANUP_ENEMY_VEHICLES(VEH_STRUCT &vsArray[], BOOL bDelete = FALSE, BOOL bDeathOnly = TRUE, BOOL bBlipOnly = FALSE)
INT i = 0
FOR i = 0 TO ( COUNT_OF(vsArray) - 1 )
IF ( bDelete = TRUE )
IF DOES_ENTITY_EXIST(vsArray[i].VehicleIndex)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
IF GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) = vsArray[i].VehicleIndex
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
ENDIF
ENDIF
ENDIF
DELETE_VEHICLE(vsArray[i].VehicleIndex)
ENDIF
IF DOES_BLIP_EXIST(vsArray[i].BlipIndex)
REMOVE_BLIP(vsArray[i].BlipIndex)
ENDIF
vsArray[i].iProgress = 0
vsArray[i].bSmoking = FALSE
vsArray[i].bDriverDead = FALSE
vsArray[i].bAutoDriveActive = FALSE
ELIF ( bDelete = FALSE )
IF DOES_ENTITY_EXIST(vsArray[i].VehicleIndex)
IF ( bDeathOnly = TRUE )
IF ( bBlipOnly = FALSE )
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsArray[i].VehicleIndex)
ENDIF
IF DOES_BLIP_EXIST(vsArray[i].BlipIndex)
REMOVE_BLIP(vsArray[i].BlipIndex)
ENDIF
ELIF ( bDeathOnly = FALSE )
IF DOES_BLIP_EXIST(vsArray[i].BlipIndex)
REMOVE_BLIP(vsArray[i].BlipIndex)
ENDIF
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsArray[i].VehicleIndex)
vsArray[i].iProgress = 0
vsArray[i].bDriverDead = FALSE
vsArray[i].bAutoDriveActive = FALSE
ENDIF
ENDIF
ENDIF
ENDFOR
ENDPROC
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 RUN_MISSION_STAGE_CLEANUP(MISSION_STAGES eStage)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting mission stage cleanup.")
#ENDIF
KILL_PHONE_CONVERSATION()
HANG_UP_AND_PUT_AWAY_PHONE(TRUE)
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
REMOVE_CUTSCENE()
IF ( bReplayStartEventTriggered = TRUE )
REPLAY_STOP_EVENT()
ENDIF
IF ( bProloguePedComponentsActive = TRUE ) //set non prologue clothes on player peds
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_MICHAEL))
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
RESTORE_PLAYER_PED_VARIATIONS(GET_PED_INDEX(CHAR_MICHAEL))
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_TREVOR))
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
RESTORE_PLAYER_PED_VARIATIONS(GET_PED_INDEX(CHAR_TREVOR))
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Restoring default player ped component variations.")
#ENDIF
bProloguePedComponentsActive = FALSE
ENDIF
//general stage cleanup
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF NOT IS_PED_INJURED(psTrevor.PedIndex)
DELETE_PED(psTrevor.PedIndex)
ENDIF
IF DOES_BLIP_EXIST(psTrevor.BlipIndex)
REMOVE_BLIP(psTrevor.BlipIndex)
ENDIF
IF DOES_BLIP_EXIST(psMichael.BlipIndex)
REMOVE_BLIP(psMichael.BlipIndex)
ENDIF
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
DELETE_VEHICLE(vsMichaelsCar.VehicleIndex)
ENDIF
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
DELETE_VEHICLE(vsTrevorsCar.VehicleIndex)
ENDIF
IF DOES_ENTITY_EXIST(vsTrevorsPlane.VehicleIndex)
DELETE_VEHICLE(vsTrevorsPlane.VehicleIndex)
ENDIF
IF DOES_BLIP_EXIST(vsMichaelsCar.BlipIndex)
REMOVE_BLIP(vsMichaelsCar.BlipIndex)
ENDIF
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF NOT IS_PED_INJURED(psMichael.PedIndex)
DELETE_PED(psMichael.PedIndex)
ENDIF
IF DOES_BLIP_EXIST(psMichael.BlipIndex)
REMOVE_BLIP(psMichael.BlipIndex)
ENDIF
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
DELETE_VEHICLE(vsMichaelsCar.VehicleIndex)
ENDIF
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
DELETE_VEHICLE(vsTrevorsCar.VehicleIndex)
ENDIF
IF DOES_ENTITY_EXIST(vsTrevorsPlane.VehicleIndex)
DELETE_VEHICLE(vsTrevorsPlane.VehicleIndex)
ENDIF
IF DOES_BLIP_EXIST(vsTrevorsCar.BlipIndex)
REMOVE_BLIP(vsTrevorsCar.BlipIndex)
ENDIF
IF DOES_BLIP_EXIST(vsTrevorsPlane.BlipIndex)
REMOVE_BLIP(vsTrevorsPlane.BlipIndex)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psBrad.PedIndex)
DELETE_PED(psBrad.PedIndex)
ENDIF
IF DOES_ENTITY_EXIST(vsCutsceneCar.VehicleIndex)
DELETE_VEHICLE(vsCutsceneCar.VehicleIndex)
ENDIF
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
SET_FRONTEND_RADIO_ACTIVE(TRUE)
IF DOES_ENTITY_EXIST(tsTrain.VehicleIndex)
AND DOES_ENTITY_EXIST(tsTrain.PedIndex)
DELETE_PED(tsTrain.PedIndex)
DELETE_MISSION_TRAIN(tsTrain.VehicleIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Deleted mission train.")
#ENDIF
ENDIF
DISABLE_CELLPHONE(FALSE)
DISABLE_TAXI_HAILING(FALSE)
//reset this flag for skips
bGameplayCameraSet = FALSE
CLEANUP_MISSION_OBJECT(osGolfBall, TRUE)
CLEANUP_MISSION_OBJECT(osPropCoffin, TRUE)
CLEANUP_MISSION_OBJECT(osPropShovel, TRUE)
CLEANUP_MISSION_OBJECT(osPropPickaxe, TRUE)
CLEANUP_TRACKED_POINT(iCarTrackedPoint)
REMOVE_ANIM_DICT("dead")
REMOVE_ANIM_DICT("missmic1ig_2")
REMOVE_ANIM_DICT("missmic1ig_3_patrol")
REMOVE_ANIM_DICT("missmic1ig_zero_hit_wheel")
REMOVE_ANIM_DICT("missmic1leadinoutmic_1_mcs_2")
//specific stage cleanup
SWITCH eStage
CASE MISSION_STAGE_GET_TO_GRAVEYARD
CASE MISSION_STAGE_GET_TO_GRAVE
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
CLEANUP_ENEMY_GROUP(esWallEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esVanEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esMiddleEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esChurchEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esSideVanEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esSideVanBackupEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esExitEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esRunners, TRUE)
CLEANUP_ENEMY_GROUP(esVan4Enemies, TRUE)
CLEANUP_ENEMY_GROUP(esSideEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esFirstReinforcementEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esSecondReinforcementEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esThirdReinforcementEnemies, TRUE)
CLEANUP_ENEMY_VEHICLES(vsEnemyVans, TRUE)
//reset stats for headshots
RESET_MISSION_STATS_ENTITY_WATCH()
REMOVE_COVERPOINTS(csCoverpoints)
bCoverpointsCreated = FALSE
//remove the tombstones
REMOVE_IPL("prologue03b")
SET_MODEL_AS_NO_LONGER_NEEDED(mnEnemy)
IF DOES_ENTITY_EXIST(WeaponMichaelObjectIndex)
DELETE_OBJECT(WeaponMichaelObjectIndex)
ENDIF
IF DOES_ENTITY_EXIST(WeaponEnemyObjectIndex)
DELETE_OBJECT(WeaponEnemyObjectIndex)
ENDIF
BREAK
ENDSWITCH
IF DOES_PICKUP_EXIST(HealthPickup)
REMOVE_PICKUP(HealthPickup)
ENDIF
IF DOES_PICKUP_EXIST(PistolPickup)
REMOVE_PICKUP(PistolPickup)
ENDIF
IF DOES_PICKUP_EXIST(RiflePickup)
REMOVE_PICKUP(RiflePickup)
ENDIF
//music score stop & cleanup
TRIGGER_MUSIC_EVENT("MIC1_FAIL")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggering music event MIC1_FAIL.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping score music.")
#ENDIF
CANCEL_MUSIC_EVENT("MIC1_ARRIVED_CHURCH")
CANCEL_MUSIC_EVENT("MIC1_SHOOTOUT_START")
CANCEL_MUSIC_EVENT("MIC1_1ST_VAN")
CANCEL_MUSIC_EVENT("MIC1_ALERTED")
CANCEL_MUSIC_EVENT("MIC1_KIDNAPPED")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Cancelling music events.")
#ENDIF
STOP_STREAM()
STOP_AUDIO_SCENES()
STOP_SOUND(iTrainBellsSoundID)
STOP_SOUND(iChurchBellsSoundID)
STOP_SOUND(iRainOnPlaneSoundID)
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Prologue_Sounds")
RELEASE_NAMED_SCRIPT_AUDIO_BANK("SCRIPT\\FBI_HEIST_3B_SHOOTOUT")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished mission stage cleanup.")
#ENDIF
ENDPROC
/// PURPOSE:
/// Handles cleaning up when mission ends.
PROC MISSION_CLEANUP()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting mission cleanup.")
#ENDIF
CLEAR_PRINTS()
CLEAR_HELP(TRUE)
KILL_FACE_TO_FACE_CONVERSATION()
KILL_ANY_CONVERSATION()
CLEANUP_MODEL_ARRAY(MissionModels, iModelsRequested)
CLEANUP_CARREC_ARRAY(sVehicleRecordingsFile, MissionRecordings, iRecordingsRequested)
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DESTROY_ALL_CAMS()
IF ( bReplayStartEventTriggered = TRUE )
REPLAY_STOP_EVENT()
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PLAYER_ANGRY(PLAYER_PED_ID(), FALSE)
STOP_PED_SPEAKING(PLAYER_PED_ID(), FALSE)
ENDIF
IF ( bProloguePedComponentsActive = TRUE ) //set non prologue clothes on player peds
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_MICHAEL))
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
//RESTORE_PLAYER_PED_VARIATIONS(GET_PED_INDEX(CHAR_MICHAEL))
RESTORE_MISSION_START_OUTFIT()
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_TREVOR))
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
RESTORE_PLAYER_PED_VARIATIONS(GET_PED_INDEX(CHAR_TREVOR))
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Restoring default player ped component variations.")
#ENDIF
bProloguePedComponentsActive = FALSE
ENDIF
IF DOES_ENTITY_EXIST(psBrad.PedIndex)
IF NOT IS_ENTITY_DEAD(psBrad.PedIndex)
SET_PED_KEEP_TASK(psBrad.PedIndex, TRUE)
SET_PED_AS_NO_LONGER_NEEDED(psBrad.PedIndex)
ENDIF
ENDIF
//clear mission vehicles
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vsMichaelsCar.VehicleIndex, TRUE)
IF IS_ENTITY_A_MISSION_ENTITY(vsMichaelsCar.VehicleIndex)
AND DOES_ENTITY_BELONG_TO_THIS_SCRIPT(vsMichaelsCar.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsMichaelsCar.VehicleIndex)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsTrevorsCar.VehicleIndex)
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vsTrevorsCar.VehicleIndex, TRUE)
IF ( bTrevorsCarSetAsVehicleGenVehicle = FALSE )
IF IS_ENTITY_A_MISSION_ENTITY(vsTrevorsCar.VehicleIndex)
AND DOES_ENTITY_BELONG_TO_THIS_SCRIPT(vsTrevorsCar.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsTrevorsCar.VehicleIndex)
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsTrevorsPlane.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsTrevorsPlane.VehicleIndex)
IF IS_ENTITY_A_MISSION_ENTITY(vsTrevorsPlane.VehicleIndex)
AND DOES_ENTITY_BELONG_TO_THIS_SCRIPT(vsTrevorsPlane.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsTrevorsPlane.VehicleIndex)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(tsTrain.VehicleIndex)
IF NOT IS_ENTITY_DEAD(tsTrain.VehicleIndex)
IF IS_SCREEN_FADED_OUT()
DELETE_MISSION_TRAIN(tsTrain.VehicleIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Deleting mission train.")
#ENDIF
ELSE
SET_MISSION_TRAIN_AS_NO_LONGER_NEEDED(tsTrain.VehicleIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting mission train as no longer needed.")
#ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsCutsceneCar.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsCutsceneCar.VehicleIndex)
ENDIF
//clear blips
IF DOES_BLIP_EXIST(psMichael.BlipIndex)
REMOVE_BLIP(psMichael.BlipIndex)
ENDIF
IF DOES_BLIP_EXIST(psTrevor.BlipIndex)
REMOVE_BLIP(psTrevor.BlipIndex)
ENDIF
IF DOES_BLIP_EXIST(vsMichaelsCar.BlipIndex)
REMOVE_BLIP(vsMichaelsCar.BlipIndex)
ENDIF
IF DOES_BLIP_EXIST(vsTrevorsCar.BlipIndex)
REMOVE_BLIP(vsTrevorsCar.BlipIndex)
ENDIF
IF DOES_BLIP_EXIST(vsTrevorsPlane.BlipIndex)
REMOVE_BLIP(vsTrevorsPlane.BlipIndex)
ENDIF
CLEANUP_ENEMY_GROUP(esVanEnemies, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_ENEMY_GROUP(esMiddleEnemies, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_ENEMY_GROUP(esWallEnemies, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_ENEMY_GROUP(esChurchEnemies, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_ENEMY_GROUP(esSideVanBackupEnemies, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_ENEMY_GROUP(esSideVanEnemies, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_ENEMY_GROUP(esExitEnemies, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_ENEMY_GROUP(esVan4Enemies, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_ENEMY_GROUP(esRunners, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_ENEMY_GROUP(esSideEnemies, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_ENEMY_GROUP(esFirstReinforcementEnemies, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_ENEMY_GROUP(esSecondReinforcementEnemies, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_ENEMY_GROUP(esThirdReinforcementEnemies, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_ENEMY_VEHICLES(vsEnemyVans, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_MISSION_OBJECT(osGolfBall, FALSE)
CLEANUP_MISSION_OBJECT(osPropCoffin, FALSE)
CLEANUP_MISSION_OBJECT(osPropShovel, FALSE)
CLEANUP_MISSION_OBJECT(osPropPickaxe, FALSE)
CLEANUP_TRACKED_POINT(iCarTrackedPoint)
IF DOES_PICKUP_EXIST(HealthPickup)
REMOVE_PICKUP(HealthPickup)
ENDIF
IF DOES_PICKUP_EXIST(PistolPickup)
REMOVE_PICKUP(PistolPickup)
ENDIF
IF DOES_PICKUP_EXIST(RiflePickup)
REMOVE_PICKUP(RiflePickup)
ENDIF
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
SET_FRONTEND_RADIO_ACTIVE(TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL), FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_TREVOR), FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(TAXI, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(ASEA2, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(MESA2, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(POLICEOLD1, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(POLICEOLD2, FALSE)
SET_PED_MODEL_IS_SUPPRESSED(mnEnemy, FALSE)
//enable the car gen on mission cleanup
DISABLE_VEHICLE_GEN_ON_MISSION(FALSE)
DISABLE_CELLPHONE(FALSE)
DISABLE_TAXI_HAILING(FALSE)
SET_MAX_WANTED_LEVEL(5)
SET_CREATE_RANDOM_COPS(TRUE)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
//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)
STOP_SOUND(iTrainBellsSoundID)
RELEASE_SOUND_ID(iTrainBellsSoundID)
STOP_SOUND(iChurchBellsSoundID)
RELEASE_SOUND_ID(iChurchBellsSoundID)
STOP_SOUND(iRainOnPlaneSoundID)
RELEASE_SOUND_ID(iRainOnPlaneSoundID)
SET_ROADS_IN_ANGLED_AREA(<<5526.240234,-5137.229980,61.789253>>, <<3679.326660,-4973.879395,125.082840>>, 192.0, FALSE, FALSE)
SET_ROADS_IN_ANGLED_AREA(<<3691.211426,-4941.240234,94.593681>>, <<3511.115479,-4869.191406,126.762108>>, 16.0, FALSE, FALSE)
SET_ROADS_IN_ANGLED_AREA(<<3510.004395,-4865.810059,94.695572>>, <<3204.424316,-4833.816895,126.815216>>, 16.0, FALSE, FALSE)
SET_ROADS_IN_ANGLED_AREA(<<3186.533691,-4832.797852,109.814827>>, <<3202.187256,-4833.993164,114.814995>>, 16.0, FALSE, FALSE) //road leading down into town
REMOVE_PTFX_ASSET()
REMOVE_ANIM_DICT("missmic1ig_2")
REMOVE_ANIM_DICT("missmic1ig_3_patrol")
REMOVE_ANIM_DICT("missmic1ig_zero_hit_wheel")
REMOVE_ANIM_DICT("missmic1leadinoutmic_1_mcs_2")
SET_USER_RADIO_CONTROL_ENABLED(TRUE)
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Prologue_Sounds")
RELEASE_NAMED_SCRIPT_AUDIO_BANK("SCRIPT\\FBI_HEIST_3B_SHOOTOUT")
RELEASE_SCRIPT_AUDIO_BANK()
STOP_STREAM()
STOP_AUDIO_SCENES()
//music score stop & cleanup
TRIGGER_MUSIC_EVENT("MIC1_FAIL")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggering music event MIC1_FAIL.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping score music.")
#ENDIF
CANCEL_MUSIC_EVENT("MIC1_ARRIVED_CHURCH")
CANCEL_MUSIC_EVENT("MIC1_SHOOTOUT_START")
CANCEL_MUSIC_EVENT("MIC1_1ST_VAN")
CANCEL_MUSIC_EVENT("MIC1_ALERTED")
CANCEL_MUSIC_EVENT("MIC1_KIDNAPPED")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Cancelling music events.")
#ENDIF
IF ( bWeatherTypeOvercastSet = TRUE )
OR ( bWeatherTypeRainSet = TRUE )
OR ( bWeatherTypeThunderSet = TRUE )
CLEAR_WEATHER_TYPE_PERSIST()
ENDIF
SET_PLAYER_PED_DATA_IN_CUTSCENES(TRUE, TRUE)
REMOVE_NAVMESH_BLOCKING_OBJECTS()
REMOVE_SCENARIO_BLOCKING_AREAS()
RELEASE_SUPPRESSED_EMERGENCY_CALLS()
LOCK_AUTOMATIC_DOOR_OPEN(AUTODOOR_MICHAEL_MANSION_GATE, FALSE)
SET_RANDOM_TRAINS(TRUE)
SET_ALLOW_STREAM_PROLOGUE_NODES(FALSE)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
RESET_WORLD_BOUNDARY_FOR_PLAYER()
REMOVE_ALL_COVER_BLOCKING_AREAS()
IF IS_CHEAT_DISABLED(CHEAT_TYPE_SUPER_JUMP)
DISABLE_CHEAT(CHEAT_TYPE_SUPER_JUMP, FALSE)
ENDIF
IF IS_CHEAT_DISABLED(CHEAT_TYPE_SPAWN_VEHICLE)
DISABLE_CHEAT(CHEAT_TYPE_SPAWN_VEHICLE, FALSE)
ENDIF
IF IS_CHEAT_DISABLED(CHEAT_TYPE_ADVANCE_WEATHER)
DISABLE_CHEAT(CHEAT_TYPE_ADVANCE_WEATHER, FALSE)
ENDIF
SET_AMBIENT_VEHICLE_NEON_ENABLED(TRUE)
SET_AUDIO_FLAG("DisableReplayScriptStreamRecording", FALSE)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting audio flag DisableReplayScriptStreamRecording to false.")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished mission cleanup.")
#ENDIF
ENDPROC
PROC PROLOGUE_MAP_CLEANUP()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting prologue map cleanup.")
#ENDIF
UNLOCK_GRAVEYARD_GATES()
UNREGISTER_GRAVEYARD_GATES()
REMOVE_ALL_PROLOGUE_IPLS()
SET_MINIMAP_IN_PROLOGUE_AND_HANDLE_STATIC_BLIPS(FALSE)
IF ( bSnowOn = TRUE )
//clear weather type
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
CLEAR_WEATHER_TYPE_PERSIST()
UNLOAD_ALL_CLOUD_HATS()
ELIF ( bSnowOn = FALSE )
CLEAR_WEATHER_TYPE_PERSIST()
ENDIF
CLEAR_TIMECYCLE_MODIFIER()
DISABLE_MOON_CYCLE_OVERRIDE()
SET_AMBIENT_VEHICLE_NEON_ENABLED(TRUE)
DELETE_ALL_TRAINS()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished prologue map cleanup.")
#ENDIF
ENDPROC
//|============================ END CLEANUP PROCEDURES & FUNCTIONS =======================|
//|======================= DEBUG VARIABLES, PROCEDURES & FUNCTIONS =======================|
#IF IS_DEBUG_BUILD
//mission skip menu variables
MissionStageMenuTextStruct SkipMenu[11]
INT iReturnStage
BOOL bStageResetFlag
//debug widgets veriables
WIDGET_GROUP_ID Michael1Widgets
BOOL bResetGameplayHint = FALSE
BOOL bSnowToggle = FALSE
BOOL bApplyForceToggle = FALSE
BOOL bEnableApplyForceWidget = FALSE
BOOL bPrintDebugOutput = FALSE
BOOL bDrawDebugLinesAndSpheres
BOOL bDrawDebugStates
BOOL bDrawDebugCoverpoints
VECTOR vApplyForceWidgetForce
VECTOR vApplyForceWidgetOffset
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_GET_TO_AIRPORT
RETURN "MISSION_STAGE_GET_TO_AIRPORT"
BREAK
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
RETURN "MISSION_STAGE_FLY_TO_NORTH_YANKTON"
BREAK
CASE MISSION_STAGE_CUTSCENE_AIRPORT
RETURN "MISSION_STAGE_CUTSCENE_AIRPORT"
BREAK
CASE MISSION_STAGE_GET_TO_GRAVEYARD
RETURN "MISSION_STAGE_GET_TO_GRAVEYARD"
BREAK
CASE MISSION_STAGE_GET_TO_GRAVE
RETURN "MISSION_STAGE_GET_TO_GRAVE"
BREAK
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
RETURN "MISSION_STAGE_CUTSCENE_GRAVEYARD"
BREAK
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
RETURN "MISSION_STAGE_GRAVEYARD_SHOOTOUT"
BREAK
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
RETURN "MISSION_STAGE_CUTSCENE_KIDNAPPED"
BREAK
CASE MISSION_STAGE_FLY_HOME
RETURN "MISSION_STAGE_FLY_HOME"
BREAK
CASE MISSION_STAGE_END
RETURN "MISSION_STAGE_END"
BREAK
ENDSWITCH
RETURN "INCORRECT_MISSION_STAGE"
ENDFUNC
FUNC STRING GET_MISSION_FAIL_NAME_FOR_DEBUG(MISSION_FAILS eFailReason)
SWITCH eFailReason
CASE MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE
RETURN "MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE"
BREAK
CASE MISSION_FAIL_MICHAELS_CAR_DEAD
RETURN "MISSION_FAIL_MICHAELS_CAR_DEAD"
BREAK
CASE MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND
RETURN "MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND"
BREAK
CASE MISSION_FAIL_GRAVEYARD_ABANDONED
RETURN "MISSION_FAIL_GRAVEYARD_ABANDONED"
BREAK
CASE MISSION_FAIL_GRAVEYARD_NOT_REACHED
RETURN "MISSION_FAIL_GRAVEYARD_NOT_REACHED"
BREAK
CASE MISSION_FAIL_GRAVE_NOT_REACHED
RETURN "MISSION_FAIL_GRAVE_NOT_REACHED"
BREAK
CASE MISSION_FAIL_TREVORS_CAR_UNDRIVABLE
RETURN "MISSION_FAIL_TREVORS_CAR_UNDRIVABLE"
BREAK
CASE MISSION_FAIL_TREVORS_CAR_DEAD
RETURN "MISSION_FAIL_TREVORS_CAR_DEAD"
BREAK
CASE MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND
RETURN "MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND"
BREAK
CASE MISSION_FAIL_TREVORS_PLANE_UNDRIVABLE
RETURN "MISSION_FAIL_TREVORS_PLANE_UNDRIVABLE"
BREAK
CASE MISSION_FAIL_TREVORS_PLANE_DEAD
RETURN "MISSION_FAIL_TREVORS_PLANE_DEAD"
BREAK
CASE MISSION_FAIL_MICHAEL_DEAD
RETURN "MISSION_FAIL_MICHAEL_DEAD"
BREAK
CASE MISSION_FAIL_TREVOR_DEAD
RETURN "MISSION_FAIL_TREVOR_DEAD"
BREAK
CASE MISSION_FAIL_FORCE_FAIL
RETURN "MISSION_FAIL_FORCE_FAIL"
BREAK
ENDSWITCH
RETURN "INCORRECT_MISSION_FAIL"
ENDFUNC
PROC CREATE_DEBUG_WIDGETS()
IF NOT DOES_WIDGET_GROUP_EXIST(Michael1Widgets)
Michael1Widgets = START_WIDGET_GROUP("Mission: Michael1")
ADD_WIDGET_BOOL("Print debug output", bPrintDebugOutput)
ADD_WIDGET_BOOL("Toggle snow", bSnowToggle)
START_WIDGET_GROUP("Focus push")
ADD_WIDGET_BOOL("bResetGameplayHint", bResetGameplayHint)
ADD_WIDGET_FLOAT_SLIDER("fFocusPushHintFOV", fFocusPushHintFOV, 1.0, 60.0, 1.0)
ADD_WIDGET_FLOAT_SLIDER("fFocusPushSideOffset", fFocusPushSideOffset, -10.0, 10.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("fFocusPushVerticalOffset", fFocusPushVerticalOffset, -10.0, 10.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("fFocusPushFollowDistanceScalar", fFocusPushFollowDistanceScalar, -10.0, 10.0, 0.1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Shovel PTFX")
ADD_WIDGET_FLOAT_SLIDER("fParticleFXTriggerPhase", fParticleFXTriggerPhase, 0.0, 1.0, 0.1)
ADD_WIDGET_VECTOR_SLIDER("vParticleFXPosition", vParticleFXPosition, -10.0, 10.0, 1.0)
ADD_WIDGET_VECTOR_SLIDER("vParticleFXRotation", vParticleFXRotation, -10.0, 10.0, 1.0)
STOP_WIDGET_GROUP()
ADD_WIDGET_FLOAT_SLIDER("fPlaneRecordingSkipTime", fPlaneRecordingSkipTime, 0.0, 10000.0, 1.0)
ADD_WIDGET_VECTOR_SLIDER("Flight global offset", vGlobalFlightOffset, -1000, 1000, 1.0)
ADD_WIDGET_VECTOR_SLIDER("Flight plane offset", vLocalPlaneOffset, -1000, 1000, 1.0)
ADD_WIDGET_VECTOR_SLIDER("vFirstTrainPosition", vFirstTrainPosition, -10000, 10000, 1.0)
ADD_WIDGET_FLOAT_SLIDER("fFirstTrainSpeed", fFirstTrainSpeed, 0.0, 20.0, 1.0)
START_WIDGET_GROUP("Flight locate settings")
ADD_WIDGET_VECTOR_SLIDER("Position", sLocateFlight.vPosition, 0.0, 10000.0, 10.0)
ADD_WIDGET_VECTOR_SLIDER("Size", sLocateFlight.vSize, 0.0, 5000.0, 1.0)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Vehicle Damage")
ADD_WIDGET_BOOL("Enable widget", bEnableApplyForceWidget)
ADD_WIDGET_BOOL("Apply force", bApplyForceToggle)
ADD_WIDGET_VECTOR_SLIDER("Force", vApplyForceWidgetForce, 0.0, 100.0, 1.0)
ADD_WIDGET_VECTOR_SLIDER("Offset", vApplyForceWidgetOffset, -10.0, 10, 0.1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Flight cutscene")
ADD_WIDGET_INT_SLIDER("iInterpTime", iInterpTime, 0, 10000, 1)
ADD_WIDGET_INT_SLIDER("iCutsceneTime", iCutsceneTime, 0, 10000, 1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Arival cutscenes")
ADD_WIDGET_INT_SLIDER("iCameraInterpolationTimer", iCameraInterpolationTimer, 0, 5000, 1)
ADD_WIDGET_FLOAT_SLIDER("fFirstRecordingEndTime", fFirstRecordingEndTime, 0, 20000.0, 1.0)
ADD_WIDGET_FLOAT_SLIDER("fSecondRecordingStartTime", fSecondRecordingStartTime, 0, 20000.0, 1.0)
ADD_WIDGET_FLOAT_SLIDER("fSecondRecordingEndTime", fSecondRecordingEndTime, 0, 20000.0, 1.0)
STOP_WIDGET_GROUP()
ADD_WIDGET_INT_SLIDER("iFirstPersonFXTime", iFirstPersonFXTime, 0, 10000, 100)
STOP_WIDGET_GROUP()
SET_LOCATES_HEADER_WIDGET_GROUP(Michael1Widgets)
ENDIF
ENDPROC
PROC DELETE_DEBUG_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(Michael1Widgets)
DELETE_WIDGET_GROUP(Michael1Widgets)
ENDIF
ENDPROC
PROC CREATE_DEBUG_MISSION_STAGE_MENU()
SkipMenu[0].sTxtLabel = "CUT - INTRO - MIC_1_INT"
SkipMenu[1].sTxtLabel = "GET TO AIRPORT"
SkipMenu[2].sTxtLabel = "FLY TO NORTH YANKTON"
SkipMenu[3].sTxtLabel = "CUT - AIRPORT - MIC_1_MCS_1"
SkipMenu[4].sTxtLabel = "GET TO GRAVEYARD"
SkipMenu[5].sTxtLabel = "GET TO GRAVE"
SkipMenu[6].sTxtLabel = "CUT - GRAVEYARD - MIC_1_MCS_2"
SkipMenu[7].sTxtLabel = "GRAVEYARD SHOOTOUT"
SkipMenu[8].sTxtLabel = "CUT - KIDNAPPED - MIC_1_MCS_3"
SkipMenu[9].sTxtLabel = "FLY HOME"
SkipMenu[10].sTxtLabel = "END"
ENDPROC
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, "MICHAEL 1")
DO_SAFE_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
DO_SAFE_STOP_CUTSCENE()
CLEAR_PRINTS()
CLEAR_HELP()
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting player ped invincible for debug skip.")
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
RUN_MISSION_STAGE_CLEANUP(eStage)
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
CLEAR_TRIGGERED_LABELS()
eStage = INT_TO_ENUM(MISSION_STAGES, iSelectedStage)
IF ( eStage = MISSION_STAGE_CUTSCENE_GRAVEYARD )
SET_CUTSCENE_TRIGGER_FLAG_FOR_PLAYER_PED_ENUM(GET_CURRENT_PLAYER_PED_ENUM(), bCutsceneTriggeredByMichael, bCutsceneTriggeredByTrevor)
ENDIF
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current mission stage changed to ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), " via mission stage menu.")
bResetStage = FALSE
bSkipActive = TRUE
RESET_MISSION_FLAGS()
ENDIF
ENDPROC
PROC RUN_DEBUG_WIDGETS(MISSION_STAGES eStage)
INT i = 0
IF ( bEnableApplyForceWidget = TRUE )
ENTITY_INDEX entityFocus = GET_FOCUS_ENTITY_INDEX()
IF NOT IS_ENTITY_DEAD(entityFocus)
AND IS_ENTITY_A_VEHICLE(entityFocus)
VEHICLE_INDEX vehicleFocus = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(entityFocus)
IF IS_VEHICLE_DRIVEABLE(vehicleFocus)
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehicleFocus, vApplyForceWidgetOffset), 0.125, 255, 0, 0)
IF ( bApplyForceToggle = TRUE )
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicleFocus)
STOP_PLAYBACK_RECORDED_VEHICLE(vehicleFocus)
ENDIF
APPLY_FORCE_TO_ENTITY(vehicleFocus, APPLY_TYPE_IMPULSE, vApplyForceWidgetForce, vApplyForceWidgetOffset, 0, TRUE, TRUE, TRUE)
bApplyForceToggle = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bPrologueMapActive = TRUE )
//control snow toggle
IF ( bSnowToggle = TRUE )
IF bSnowOn = FALSE
SET_WEATHER_TYPE_NOW_PERSIST("SNOWLIGHT") //gives clear sky
UNLOAD_ALL_CLOUD_HATS()
LOAD_CLOUD_HAT("Snowy 01")
bSnowOn = TRUE
ELIF bSnowOn = TRUE
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
CLEAR_WEATHER_TYPE_PERSIST()
UNLOAD_ALL_CLOUD_HATS()
bSnowOn = FALSE
ENDIF
bSnowToggle = FALSE
ENDIF
ENDIF
SWITCH eStage
CASE MISSION_STAGE_GET_TO_GRAVEYARD
CASE MISSION_STAGE_GET_TO_GRAVE
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
IF ( bDrawDebugLinesAndSpheres = TRUE )
FOR i = 0 TO ( COUNT_OF(sRoadNodes) - 1 )
IF ( sRoadNodes[i].bCurrent = TRUE )
DRAW_DEBUG_SPHERE(sRoadNodes[i].vPosition, 1.0, 0, 255, 0)
ELIF ( sRoadNodes[i].bVisited = TRUE )
DRAW_DEBUG_SPHERE(sRoadNodes[i].vPosition, 1.0, 255, 0, 0)
ELSE
DRAW_DEBUG_SPHERE(sRoadNodes[i].vPosition, 1.0, 0, 0, 255)
ENDIF
DRAW_DEBUG_TEXT(GET_STRING_FROM_INT(i), << sRoadNodes[i].vPosition.x, sRoadNodes[i].vPosition.y, sRoadNodes[i].vPosition.z + 1.5>>)
ENDFOR
DRAW_DEBUG_SPHERE(vStreamTriggerPosition1, 0.5, 255, 255, 255)
DRAW_DEBUG_TEXT("STREAM 1", << vStreamTriggerPosition1.x, vStreamTriggerPosition1.y, vStreamTriggerPosition1.z + 1.5>>)
DRAW_DEBUG_SPHERE(vStreamTriggerPosition2, 0.5, 255, 255, 255)
DRAW_DEBUG_TEXT("STREAM 2", << vStreamTriggerPosition2.x, vStreamTriggerPosition2.y, vStreamTriggerPosition2.z + 1.5>>)
DRAW_DEBUG_SPHERE(vStreamTriggerPosition3, 0.5, 255, 255, 255)
DRAW_DEBUG_TEXT("STREAM 3", << vStreamTriggerPosition3.x, vStreamTriggerPosition3.y, vStreamTriggerPosition3.z + 1.5>>)
IF ( bDrawDebugCoverpoints = 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>>)
IF ( csCoverpoints[i].bTaken = TRUE )
DRAW_DEBUG_TEXT("TAKEN", << csCoverpoints[i].vPosition.x, csCoverpoints[i].vPosition.y, csCoverpoints[i].vPosition.z + 0.55>>)
ENDIF
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
FOR i = 0 TO ( COUNT_OF(FraggableTombstones) - 1 )
DRAW_DEBUG_SPHERE(FraggableTombstones[i].vPosition, 1.25, 255, 255, 0, 64)
DRAW_DEBUG_TEXT(GET_STRING_FROM_INT(i), << FraggableTombstones[i].vPosition.x, FraggableTombstones[i].vPosition.y, FraggableTombstones[i].vPosition.z + 0.5>>)
ENDFOR
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC RUN_DEBUG_PASS_AND_FAIL_CHECK(MISSION_STAGES &eStage, MISSION_FAILS &eFailReason)
IF IS_KEYBOARD_KEY_PRESSED (KEY_S)
//force player to be Trevor on s-pass, since mission can be normally only completed as Trevor
IF GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_TREVOR
IF ( bMichaelsWeaponsStored = FALSE )
STORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling STORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID()).")
#ENDIF
REMOVE_PED_WEAPONS_LEAVING_ONE(PLAYER_PED_ID(), WEAPONTYPE_PISTOL)
bMichaelsWeaponsStored = TRUE
ENDIF
WHILE NOT SET_CURRENT_SELECTOR_PED(SELECTOR_PED_TREVOR)
WAIT(0)
ENDWHILE
ENDIF
eStage = MISSION_STAGE_PASSED
ENDIF
IF IS_KEYBOARD_KEY_PRESSED (KEY_F)
eStage = MISSION_STAGE_FAILED
eFailReason = MISSION_FAIL_FORCE_FAIL
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_SAFE_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
DO_SAFE_STOP_CUTSCENE()
CLEAR_PRINTS()
CLEAR_HELP()
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting player ped invincible for debug j-skip.")
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
RUN_MISSION_STAGE_CLEANUP(eStage)
iCurrentStage++
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
//If playing as Trevor, J-skip on get to airport should take you to the fly plane stage.
IF eStage = MISSION_STAGE_FLY_TO_NORTH_YANKTON
IF ( GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_TREVOR )
iCurrentStage++
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
ENDIF
ENDIF
IF ( eStage = MISSION_STAGE_CUTSCENE_GRAVEYARD )
SET_CUTSCENE_TRIGGER_FLAG_FOR_PLAYER_PED_ENUM(GET_CURRENT_PLAYER_PED_ENUM(), bCutsceneTriggeredByMichael, bCutsceneTriggeredByTrevor)
ENDIF
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current mission stage changed to ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), " via J skip.")
bResetStage = FALSE
bSkipActive = TRUE
RESET_MISSION_FLAGS()
ENDIF
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
IF eStage <> MISSION_STAGE_CUTSCENE_INTRO
DO_SAFE_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
DO_SAFE_STOP_CUTSCENE()
CLEAR_PRINTS()
CLEAR_HELP()
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting player ped invincible for debug p-skip.")
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
RUN_MISSION_STAGE_CLEANUP(eStage)
//handle normal p-skip
IF ( bResetStage = FALSE )
iCurrentStage--
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
IF eStage = MISSION_STAGE_CUTSCENE_AIRPORT
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR )
iCurrentStage--
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
ENDIF
ENDIF
IF eStage = MISSION_STAGE_FLY_TO_NORTH_YANKTON
IF ( GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_TREVOR )
iCurrentStage--
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
ENDIF
ENDIF
IF ( eStage = MISSION_STAGE_CUTSCENE_GRAVEYARD )
SET_CUTSCENE_TRIGGER_FLAG_FOR_PLAYER_PED_ENUM(GET_CURRENT_PLAYER_PED_ENUM(), bCutsceneTriggeredByMichael, bCutsceneTriggeredByTrevor)
ENDIF
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current mission stage changed to ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), " via P skip.")
//handle p-skip stage reset
ELIF ( bResetStage = TRUE )
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current mission stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), " reset via P skip.")
ENDIF
bResetStage = FALSE
bSkipActive = TRUE
RESET_MISSION_FLAGS()
ENDIF
ENDIF
ENDPROC
FUNC STRING GET_ENEMY_STATE_NAME_FOR_DEBUG(ENEMY_STATES eState)
SWITCH eState
CASE ENEMY_STATE_IDLE
RETURN "ENEMY_STATE_IDLE"
BREAK
CASE ENEMY_STATE_SCRIPTED_ENTRY
RETURN "ENEMY_STATE_SCRIPTED_ENTRY"
BREAK
CASE ENEMY_STATE_PATROLLING
RETURN "ENEMY_STATE_PATROLLING"
BREAK
CASE ENEMY_STATE_INVESTIGATING
RETURN "ENEMY_STATE_INVESTIGATING"
BREAK
CASE ENEMY_STATE_MOVING_TO_LOCATION
RETURN "ENEMY_STATE_MOVING_TO_LOCATION"
BREAK
CASE ENEMY_STATE_STANDING_AT_LOCATION
RETURN "ENEMY_STATE_STANDING_AT_LOCATION"
BREAK
CASE ENEMY_STATE_PERFORMING_ENEMY_ACTION
RETURN "ENEMY_STATE_PERFORMING_ENEMY_ACTION"
BREAK
CASE ENEMY_STATE_WAITING_FOR_TARGET
RETURN "ENEMY_STATE_WAITING_FOR_TARGET"
BREAK
CASE ENEMY_STATE_GO_TO_COORD
RETURN "ENEMY_STATE_GO_TO_COORD"
BREAK
CASE ENEMY_STATE_FOLLOW_WAYPOINT_RECORDING
RETURN "ENEMY_STATE_FOLLOW_WAYPOINT_RECORDING"
BREAK
CASE ENEMY_STATE_SNIPING
RETURN "ENEMY_STATE_SNIPING"
BREAK
CASE ENEMY_STATE_COMBAT
RETURN "ENEMY_STATE_COMBAT"
BREAK
ENDSWITCH
RETURN "INVALID_ENEMY_STATE"
ENDFUNC
FUNC STRING GET_DETECTED_LOCATION_NAME_FOR_DEBUG(DETECTED_LOCATIONS eLocation)
SWITCH eLocation
CASE DL_NOT_DETECTED
RETURN "DL_NOT_DETECTED"
BREAK
CASE DL_START_AREA
RETURN "DL_START_AREA"
BREAK
CASE DL_MIDDLE_AREA_01
RETURN "DL_MIDDLE_AREA_01"
BREAK
CASE DL_MIDDLE_AREA_02
RETURN "DL_MIDDLE_AREA_02"
BREAK
CASE DL_CHURCH_AREA
RETURN "DL_CHURCH_AREA"
BREAK
CASE DL_PARKING_LOT
RETURN "DL_PARKING_LOT"
BREAK
ENDSWITCH
RETURN "INVALID_SPOTTED_LOCATION"
ENDFUNC
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
ENDPROC
#ENDIF
//|===================== END DEBUG VARIABLES, PROCEDURES & FUNCTIONS =====================|
//|======================== CAR RECORDING PROCEDURES & FUNCTIONS =========================|
//Author: Ross Wallace
//PURPOSE: Returns the percentage progress of a car recording...
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 += iPercentage
SET_VEHICLE_NAME_DEBUG(VehicleIndex, debugName)
IF ( bPrintRecordingTime = TRUE )
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
#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: Playback not going on for vehicle.")
#ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE: 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)
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
//|====================== END CAR RECORDING PROCEDURES & FUNCTIONS =======================|
//|==================================== 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_GET_TO_AIRPORT)
eStage = MISSION_STAGE_GET_TO_AIRPORT
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_FLY_TO_NORTH_YANKTON)
eStage = MISSION_STAGE_FLY_TO_NORTH_YANKTON
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_GRAVEYARD)
eStage = MISSION_STAGE_GET_TO_GRAVEYARD
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_GRAVE)
eStage = MISSION_STAGE_GET_TO_GRAVE
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_GRAVEYARD_SHOOTOUT)
eStage = MISSION_STAGE_GRAVEYARD_SHOOTOUT
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_FLY_HOME)
eStage = MISSION_STAGE_FLY_HOME
ENDIF
bStageReplayInProgress = TRUE
#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:
/// Initialise arrays for peds, vehicles, objects etc for a specified stage.
/// PARAMS:
/// eStage - Mission stage to initialise arrays for.
PROC INITIALISE_ARRAYS_FOR_MISSION_STAGE(MISSION_STAGES eStage)
//Michael's ped details, identical for every mission stage
psMichael.ModelName = GET_PLAYER_PED_MODEL(CHAR_MICHAEL)
//Trevor's ped details, identical for every mission stage
psTrevor.ModelName = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Initialising arrays for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
Gates[0].eHashEnum = GRAVEYARD_GATE_WEST_L
Gates[0].vPosition = <<3293.6226, -4611.3037, 116.7559>>
Gates[0].ModelName = prop_cs_gravyard_gate_l
Gates[1].eHashEnum = GRAVEYARD_GATE_WEST_R
Gates[1].vPosition = <<3293.2231, -4615.0601, 116.7540>>
Gates[1].ModelName = prop_cs_gravyard_gate_r
Gates[2].eHashEnum = GRAVEYARD_GATE_EAST_L
Gates[2].vPosition = <<3239.1865, -4594.8237, 117.7705>>
Gates[2].ModelName = prop_cs_gravyard_gate_l
Gates[3].eHashEnum = GRAVEYARD_GATE_EAST_R
Gates[3].vPosition = <<3239.9766, -4591.1299, 117.7685>>
Gates[3].ModelName = prop_cs_gravyard_gate_r
Gates[4].eHashEnum = GRAVEYARD_GATE_SOUTH_L
Gates[4].vPosition = <<3262.5972, -4561.6587, 119.0779>>
Gates[4].ModelName = prop_cs_gravyard_gate_l
Gates[5].eHashEnum = GRAVEYARD_GATE_SOUTH_R
Gates[5].vPosition = <<3266.3745, -4561.6631, 119.0760>>
Gates[5].ModelName = prop_cs_gravyard_gate_r
SWITCH eStage
CASE MISSION_STAGE_CUTSCENE_INTRO
psTrevor.vPosition = <<-802.4639, 173.0358, 71.8447>>
psTrevor.fHeading = 288.8440
psTrevor.vDestination = << 1733.6469, 3306.0200, 40.2261 >>
psMichael.vPosition = <<-802.4639, 173.0358, 71.8447>>
psMichael.fHeading = 288.8440
psMichael.vDestination = << -1033.20, -2731.17, 19.05 >>
vsMichaelsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
vsMichaelsCar.vPosition = <<-829.2751, 176.4524, 69.8634>>
vsMichaelsCar.fHeading = 151.8630
vsMichaelsCar.iRecordingNumber = 003
vsTrevorsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_TREVOR)
vsTrevorsCar.vPosition = << -825.8718, 157.3143, 69.4619 >>
vsTrevorsCar.fHeading = 90.0
vsTrevorsCar.iRecordingNumber = 001
vsTrevorsPlane.ModelName = CUBAN800
vsTrevorsPlane.vPosition = <<1731.8021, 3308.9109, 40.2237>>
vsTrevorsPlane.fHeading = 194.8553
vsTrevorsPlane.iRecordingNumber = 002
sLocateFlight.vPosition = <<-3841.2847, 5020.6064, 174.8651>>//<< 4390.0, 8850.0, 900.0 >>
sLocateFlight.vSize = << 0.5, 0.5, 0.5 >>
BREAK
CASE MISSION_STAGE_GET_TO_AIRPORT
psTrevor.vPosition = <<-818.0981, 158.3042, 69.7868>>
psTrevor.fHeading = 109.1361
psTrevor.vDestination = << 1733.6469, 3306.0200, 40.2261 >>
psMichael.vPosition = <<-813.9473, 179.2056, 71.1592>>
psMichael.fHeading = 111.3824
psMichael.vDestination = << -1033.20, -2731.17, 19.05 >>
vsMichaelsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
vsMichaelsCar.vPosition = <<-829.2751, 176.4524, 69.8634>>
vsMichaelsCar.fHeading = 151.8630
vsMichaelsCar.iRecordingNumber = 003
vsTrevorsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_TREVOR)
vsTrevorsCar.vPosition = << -825.8718, 157.3143, 69.4619 >>
vsTrevorsCar.fHeading = 90.0
vsTrevorsCar.iRecordingNumber = 001
vsTrevorsPlane.ModelName = CUBAN800
vsTrevorsPlane.vPosition = <<1731.8021, 3308.9109, 40.2237>>
vsTrevorsPlane.fHeading = 194.8553
vsTrevorsPlane.iRecordingNumber = 002
sLocateFlight.vPosition = <<-3841.2847, 5020.6064, 174.8651>>//<< 4390.0, 8850.0, 900.0 >>
sLocateFlight.vSize = << 0.5, 0.5, 0.5 >>
osGolfBall.vPosition = sLocateFlight.vPosition
osGolfBall.vRotation = << 0.0, 0.0, 0.0 >>
osGolfBall.ModelName = PROP_GOLF_BALL
BREAK
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
psTrevor.vPosition = << 1746.7969, 3291.4446, 40.1072 >>
psTrevor.fHeading = 55.8571
psTrevor.vDestination = << 1733.6469, 3306.0200, 40.2261 >>
psMichael.vPosition = << -826.91, 176.45, 69.97 >>
psMichael.fHeading = 129.1458
psMichael.vDestination = << -1033.20, -2731.17, 19.05 >>
vsMichaelsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
vsMichaelsCar.vPosition = << -828.4514, 177.0704, 69.9859 >>
vsMichaelsCar.fHeading = 147.0378
vsMichaelsCar.iRecordingNumber = 003
vsTrevorsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_TREVOR)
vsTrevorsCar.vPosition = << 1747.3265, 3294.0227, 40.1071 >>
vsTrevorsCar.fHeading = 84.1211
vsTrevorsCar.iRecordingNumber = 001
vsTrevorsPlane.ModelName = CUBAN800
vsTrevorsPlane.vPosition = <<1731.8021, 3308.9109, 40.2237>>
vsTrevorsPlane.fHeading = 194.8553
vsTrevorsPlane.iRecordingNumber = 002
sLocateFlight.vPosition = <<-3841.2847, 5020.6064, 174.8651>>//<< 4390.0, 8850.0, 900.0 >>
sLocateFlight.vSize = << 0.5, 0.5, 0.5 >>
osGolfBall.vPosition = sLocateFlight.vPosition
osGolfBall.vRotation = << 0.0, 0.0, 0.0 >>
osGolfBall.ModelName = PROP_GOLF_BALL
BREAK
CASE MISSION_STAGE_CUTSCENE_AIRPORT
psMichael.vPosition = << -1033.3214, -2727.2915, 19.1813 >>
psMichael.fHeading = 239.5299
psMichael.vDestination = << 0.0, 0.0, 0.0 >>
psTrevor.vPosition = << -1012.2794, -2738.5303, 19.1873 >>
psTrevor.fHeading = 329.2714
psTrevor.vDestination = << 0.0, 0.0, 0.0 >>
vsMichaelsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
vsMichaelsCar.vPosition = << -1033.4814, -2728.8206, 19.1441 >>
vsMichaelsCar.fHeading = 239.6801
vsTrevorsPlane.ModelName = CUBAN800
vsTrevorsPlane.vPosition = <<1731.8021, 3308.9109, 40.2237>>
vsTrevorsPlane.fHeading = 194.8553
BREAK
CASE MISSION_STAGE_GET_TO_GRAVEYARD
psMichael.vPosition = << 5482.5986, -5125.9849, 77.4370 >>
psMichael.fHeading = 264.8607
psMichael.vDestination = << 3216.8445, -4682.9536, 111.7127 >>
psTrevor.vPosition = << 3259.5271, -4571.6938, 117.1567 >>
psTrevor.fHeading = 181.5470
vsMichaelsCar.ModelName = ASEA2
vsMichaelsCar.vPosition = << 5575.9858, -5130.2427, 79.5043 >>
vsMichaelsCar.fHeading = 86.0572
vsMichaelsCar.iRecordingNumber = 005
vsTrevorsCar.ModelName = MESA2
vsTrevorsCar.vPosition = <<3257.9006, -4689.8130, 111.8699>>
vsTrevorsCar.fHeading = 278.2631
tsTrain.iConfiguration = 9
tsTrain.vPosition = vFirstTrainPosition
tsTrain.ModelName1 = FREIGHT
tsTrain.ModelName2 = FREIGHTCAR
tsTrain.ModelName3 = FREIGHTGRAIN
tsTrain.ModelName4 = S_M_M_TRUCKER_01
BREAK
CASE MISSION_STAGE_GET_TO_GRAVE
psMichael.vPosition = <<3216.5117, -4688.0327, 111.6721>>
psMichael.fHeading = 268.5004
psTrevor.vPosition = << 3259.5271, -4571.6938, 117.1567 >>
psTrevor.fHeading = 181.5470
vsMichaelsCar.ModelName = ASEA2
vsMichaelsCar.vPosition = << 3212.0027, -4689.3232, 111.6762 >>
vsMichaelsCar.fHeading = 225.1631
vsTrevorsCar.ModelName = MESA2
vsTrevorsCar.vPosition = <<3257.9006, -4689.8130, 111.8699>>
vsTrevorsCar.fHeading = 278.2631
osPropShovel.vPosition = <<3259.5710, -4572.7739, 116.1162>>
osPropShovel.vRotation = <<-91.0000, -38.0000, 0.0000>>
osPropShovel.ModelName = PROP_LD_SHOVEL
osPropPickaxe.vPosition = <<3259.2451, -4573.0298, 116.8103>>
osPropPickaxe.vRotation = <<158.0000, 0.0000, 77.4000>>
osPropPickaxe.ModelName = PROP_TOOL_PICKAXE
osPropCoffin.vPosition = <<3259.7339, -4573.8970, 115.8785>>
osPropCoffin.vRotation = <<5.0000, 0.0000, -180.0000>>
osPropCoffin.ModelName = PROP_COFFIN_02
BREAK
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
psBrad.vPosition = <<3240.7776, -4559.6108, 116.9483>>
psBrad.fHeading = 92.2719
psBrad.ModelName = CS_BRADCADAVER
psMichael.vPosition = << 3258.16, -4572.49, 117.16 >>
psMichael.fHeading = 180.0
psMichael.vDestination = << 0.0, 0.0, 0.0 >>
psTrevor.vPosition = << 3257.53, -4574.04, 117.16 >>
psTrevor.fHeading = 0.0
psTrevor.vDestination = << 0.0, 0.0, 0.0 >>
vsMichaelsCar.ModelName = ASEA2
vsMichaelsCar.vPosition = << 3211.3403, -4688.4854, 111.7328 >>
vsMichaelsCar.fHeading = 222.9433
vsTrevorsCar.ModelName = MESA2
vsTrevorsCar.vPosition = <<3257.9006, -4689.8130, 111.8699>>
vsTrevorsCar.fHeading = 278.2631
osPropShovel.vPosition = <<3259.5710, -4572.7739, 116.1162>>
osPropShovel.vRotation = <<-91.0000, -38.0000, 0.0000>>
osPropShovel.ModelName = PROP_LD_SHOVEL
osPropPickaxe.vPosition = <<3259.2451, -4573.0298, 116.8103>>
osPropPickaxe.vRotation = <<158.0000, 0.0000, 77.4000>>
osPropPickaxe.ModelName = PROP_TOOL_PICKAXE
osPropCoffin.vPosition = <<3259.7339, -4573.8970, 115.8785>>
osPropCoffin.vRotation = <<5.0000, 0.0000, -180.0000>>
osPropCoffin.ModelName = PROP_COFFIN_02
BREAK
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
psBrad.vPosition = <<3240.7776, -4559.6108, 116.9483>>
psBrad.fHeading = 92.2719
psBrad.ModelName = CS_BRADCADAVER
psMichael.vPosition = << 3256.4697, -4575.1128, 117.1567 >>
psMichael.fHeading = 273.8974
psMichael.vDestination = << 3248.886230, -4687.962891, 114.841042 >>
vsMichaelsCar.ModelName = ASEA2
vsMichaelsCar.vPosition = << 3211.3403, -4688.4854, 111.7328 >>
vsMichaelsCar.fHeading = 222.9433
osPropShovel.vPosition = <<3259.5710, -4572.7739, 116.1162>>
osPropShovel.vRotation = <<-91.0000, -38.0000, 0.0000>>
osPropShovel.ModelName = PROP_LD_SHOVEL
osPropPickaxe.vPosition = <<3259.2451, -4573.0298, 116.8103>>
osPropPickaxe.vRotation = <<158.0000, 0.0000, 77.4000>>
osPropPickaxe.ModelName = PROP_TOOL_PICKAXE
osPropCoffin.vPosition = <<3259.7339, -4573.8970, 115.8785>>
osPropCoffin.vRotation = <<5.0000, 0.0000, -180.0000>>
osPropCoffin.ModelName = PROP_COFFIN_02
vsEnemyVans[0].vPosition = << 3304.86, -4641.48, 113.08 >>
vsEnemyVans[0].fHeading = 27.521
vsEnemyVans[0].ModelName = mnEnemyVan
vsEnemyVans[0].iRecordingNumber = 012
vsEnemyVans[1].vPosition = << 3242.78, -4673.15, 113.18 >>
vsEnemyVans[1].fHeading = 53.3085
vsEnemyVans[1].ModelName = mnEnemyVan
vsEnemyVans[1].iRecordingNumber = 013
vsEnemyVans[2].vPosition = << 3259.67, -4690.98, 112.69 >>
vsEnemyVans[2].fHeading = 303.13
vsEnemyVans[2].ModelName = mnEnemyVan
vsEnemyVans[3].vPosition = << 3254.34, -4683.82, 112.67 >>
vsEnemyVans[3].fHeading = 249.15
vsEnemyVans[3].ModelName = mnEnemyVan
vsEnemyVans[4].vPosition = << 3235.7214, -4835.2661, 110.8135 >>
vsEnemyVans[4].fHeading = 84.1679
vsEnemyVans[4].ModelName = mnEnemyVan
vsEnemyVans[4].iRecordingNumber = 015
tsTrain.iConfiguration = 23
tsTrain.vPosition = << 3154.38, -4698.16, 111.63 >>
tsTrain.ModelName1 = FREIGHT
tsTrain.ModelName2 = FREIGHTCAR
tsTrain.ModelName3 = FREIGHTCONT1
tsTrain.ModelName4 = S_M_M_TRUCKER_01
BREAK
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
psMichael.vPosition = << 3217.3970, -4687.5581, 111.7128 >>
psMichael.fHeading = 94.6391
vsMichaelsCar.ModelName = ASEA2
vsMichaelsCar.vPosition = << 3211.3403, -4688.4854, 111.7328 >>
vsMichaelsCar.fHeading = 222.9433
BREAK
CASE MISSION_STAGE_FLY_HOME
psTrevor.vPosition = <<-4568.2949, 4981.7153, 136.7620>> //<< 3382.9780, 8102.7705, 21.5856 >>
psTrevor.fHeading = 259.5159 //143.8278
vsTrevorsPlane.ModelName = CUBAN800
vsTrevorsPlane.vPosition = <<-4568.2949, 4981.7153, 136.7620>> //<< 3382.9780, 8102.7705, 21.5856 >>
vsTrevorsPlane.fHeading = 259.5159 //143.8278
vsTrevorsPlane.iRecordingNumber = 008 //006
vsTrevorsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_TREVOR)
vsTrevorsCar.vPosition = << 1747.3265, 3294.0227, 40.1071 >>
vsTrevorsCar.fHeading = 84.1211
BREAK
CASE MISSION_STAGE_END
psTrevor.vPosition = <<1725.0645, 3304.4546, 40.2237>>
psTrevor.fHeading = 345.1909
vsTrevorsPlane.ModelName = CUBAN800
vsTrevorsPlane.vPosition = <<1732.3759, 3306.6619, 40.2237>>
vsTrevorsPlane.fHeading = 14.8253
vsTrevorsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_TREVOR)
vsTrevorsCar.vPosition = << 1747.3265, 3294.0227, 40.1071 >>
vsTrevorsCar.fHeading = 84.1211
BREAK
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_GET_TO_AIRPORT
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
//
BREAK
CASE CHAR_TREVOR
IF NOT DOES_ENTITY_EXIST(vsTrevorsPlane.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsTrevorsPlane.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
BREAK
ENDSWITCH
BREAK
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF NOT DOES_ENTITY_EXIST(psTrevor.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psTrevor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF NOT DOES_ENTITY_EXIST(psMichael.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psTrevor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(vsTrevorsPlane.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsTrevorsPlane.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_AIRPORT
//
BREAK
CASE MISSION_STAGE_GET_TO_GRAVEYARD
REQUEST_PTFX_ASSET()
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF NOT DOES_ENTITY_EXIST(psMichael.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psMichael.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsMichaelsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsTrevorsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
ADD_CARREC_REQUEST_TO_ARRAY(004, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
ADD_CARREC_REQUEST_TO_ARRAY(005, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
BREAK
CASE MISSION_STAGE_GET_TO_GRAVE
REQUEST_PTFX_ASSET()
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsMichaelsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsTrevorsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsMichaelsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
BREAK
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
REQUEST_PTFX_ASSET()
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsMichaelsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF NOT DOES_ENTITY_EXIST(psMichael.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psMichael.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
ENDIF
ADD_MODEL_REQUEST_TO_ARRAY(mnEnemy, MissionModels, MAX_MODELS, iModelsRequested)
ADD_MODEL_REQUEST_TO_ARRAY(mnEnemyVan, MissionModels, MAX_MODELS, iModelsRequested)
ADD_CARREC_REQUEST_TO_ARRAY(vsEnemyVans[0].iRecordingNumber, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
ADD_CARREC_REQUEST_TO_ARRAY(vsEnemyVans[1].iRecordingNumber, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
ADD_CARREC_REQUEST_TO_ARRAY(vsEnemyVans[4].iRecordingNumber, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
BREAK
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
REQUEST_PTFX_ASSET()
IF NOT DOES_ENTITY_EXIST(psMichael.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psMichael.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsMichaelsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
BREAK
CASE MISSION_STAGE_FLY_HOME
IF NOT DOES_ENTITY_EXIST(psTrevor.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psTrevor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(vsTrevorsPlane.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsTrevorsPlane.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
ADD_CARREC_REQUEST_TO_ARRAY(vsTrevorsPlane.iRecordingNumber, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
BREAK
CASE MISSION_STAGE_END
IF NOT DOES_ENTITY_EXIST(psTrevor.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psTrevor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(vsTrevorsPlane.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsTrevorsPlane.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
BREAK
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_VEHICLE_STUCK_IN_SNOW_TIMER_UP(VEHICLE_INDEX VehicleIndex, INT &iStuckTimer, INT iStuckTime)
IF DOES_ENTITY_EXIST(VehicleIndex)
IF NOT IS_ENTITY_DEAD(VehicleIndex)
MATERIAL_NAMES eLastMaterialName = GET_LAST_MATERIAL_HIT_BY_ENTITY(VehicleIndex)
#IF IS_DEBUG_BUILD
SWITCH eLastMaterialName
CASE GENERAL_SNOW_LOOSE
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, "GENERAL_SNOW_LOOSE", 1.0)
BREAK
CASE GENERAL_SNOW_COMPACT
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, "GENERAL_SNOW_COMPACT", 1.0)
BREAK
CASE GENERAL_SNOW_DEEP
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, "GENERAL_SNOW_DEEP", 1.0)
BREAK
CASE GENERAL_SNOW_TARMAC
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, "GENERAL_SNOW_TARMAC", 1.0)
BREAK
ENDSWITCH
#ENDIF
SWITCH eLastMaterialName
CASE GENERAL_SNOW_LOOSE
CASE GENERAL_SNOW_COMPACT
CASE GENERAL_SNOW_DEEP
CASE GENERAL_SNOW_TARMAC
IF ( NOT IS_VEHICLE_STOPPED(VehicleIndex) AND GET_ENTITY_SPEED(VehicleIndex) < 2.0 )
OR ( IS_VEHICLE_STOPPED(VehicleIndex) AND ( ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_VEH_ACCELERATE) * 255.0) >=250 OR ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_VEH_BRAKE) * 255.0) >=250 ))
IF ( iStuckTimer = 0 )
iStuckTimer = GET_GAME_TIMER()
ELSE
IF HAS_TIME_PASSED(iStuckTime, iStuckTimer)
RETURN TRUE
ENDIF
ENDIF
ELSE
iStuckTimer = 0
ENDIF
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, GET_STRING_FROM_INT(CLAMP_INT(iStuckTime - ( GET_GAME_TIMER() - iStuckTimer ), 0, iStuckTime)), 1.25)
#ENDIF
BREAK
DEFAULT
iStuckTimer = 0
BREAK
ENDSWITCH
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_VEHICLE_PERMANENTLY_STUCK_WITH_TIMERS(VEHICLE_INDEX &veh, INT iRoofTime = ROOF_TIME, INT iJammedTime = 30000,
INT iHungUpTime = 15000, INT iSideTime = 20000)
IF IS_VEHICLE_DRIVEABLE(veh)
IF IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_ON_ROOF, iRoofTime)
OR IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_JAMMED, iJammedTime)
OR IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_HUNG_UP, iHungUpTime)
OR IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_ON_SIDE, iSideTime)
RETURN TRUE
ENDIF
ENDIF
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()
AND NOT IS_SELECTOR_CAM_ACTIVE()
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF ( FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE] = TRUE )
IF IS_VEHICLE_PERMANENTLY_STUCK(vsMichaelsCar.VehicleIndex)
eFail = MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE
eStage = MISSION_STAGE_FAILED
ENDIF
IF ( eStage = MISSION_STAGE_GET_TO_GRAVEYARD )
IF IS_VEHICLE_STUCK_IN_SNOW_TIMER_UP(vsMichaelsCar.VehicleIndex, iSnowStuckTimer, 4000)
eFail = MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = TRUE )
IF NOT IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex, TRUE)
eFail = MISSION_FAIL_MICHAELS_CAR_DEAD
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND] = TRUE )
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
IF ( eStage = MISSION_STAGE_GRAVEYARD_SHOOTOUT )
IF NOT IS_ENTITY_IN_ANGLED_AREA_LOCATE(PLAYER_PED_ID(), << 3263.05, -4704.67, 104.67 >>,
<< 3267.14, -4561.37, 132.76 >>, 64.0 #IF IS_DEBUG_BUILD, "CarParkAreaLocate" #ENDIF)
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex) > ABANDON_CAR_FAIL_RANGE
eFail = MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3165.779785,-4700.698242,113.623360>>, << 16.0, 16.0,3.0 >>) //train tracks check
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3287.108887,-4719.235840,113.776268>>, << 16.0, 16.0,3.0 >>) //train tracks check
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<3257.560059,-4712.962891,111.171898>>, <<3273.731201,-4714.457520,116.705261>>, 18.0)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<3229.477539,-4768.596680,110.500343>>, <<3308.396484,-4775.955078,124.718132>>, 100.000000)
eFail = MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ELSE
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_MICHAEL))
IF GET_DISTANCE_BETWEEN_ENTITIES(GET_PED_INDEX(CHAR_MICHAEL), vsMichaelsCar.VehicleIndex) > ABANDON_CAR_FAIL_RANGE
eFail = MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_GRAVEYARD_NOT_REACHED] = TRUE )
IF ( eStage = MISSION_STAGE_GET_TO_GRAVEYARD )
IF ( bPlayerDroveOffRoute = TRUE )
eFail = MISSION_FAIL_GRAVEYARD_NOT_REACHED
eStage = MISSION_STAGE_FAILED
ENDIF
//fix for B*1713614, extra checks if player tries to get further into north yankton town
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<3122.884277,-4705.447754,110.703247>>, <<3107.735596,-4895.832520,130.591019>>, 64.000000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<3165.752686,-4756.501465,110.109207>>, <<3167.850830,-4733.836914,119.107994>>, 32.000000)
eFail = MISSION_FAIL_GRAVEYARD_NOT_REACHED
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_GRAVE_NOT_REACHED] = TRUE )
IF ( eStage = MISSION_STAGE_GET_TO_GRAVE )
IF NOT IS_ENTITY_IN_ANGLED_AREA_LOCATE(PLAYER_PED_ID(), << 3263.05, -4704.67, 104.67 >>,
<< 3267.14, -4561.37, 132.76 >>, 64.0 #IF IS_DEBUG_BUILD, "CarParkAreaLocate" #ENDIF)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vsMichaelsCar.vPosition) > ABANDON_CAR_FAIL_RANGE
eFail = MISSION_FAIL_GRAVE_NOT_REACHED
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), << 3165.78, -4700.70, 113.62 >>, << 16.0, 16.0,3.0 >>) //train tracks check
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), << 3287.11, -4719.23, 113.77 >>, << 16.0, 16.0,3.0 >>) //train tracks check
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << 3257.56, -4712.96, 111.17 >>, << 3273.73, -4714.45, 116.70 >>, 18.0)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<3229.477539,-4768.596680,110.500343>>, <<3308.396484,-4775.955078,124.718132>>, 100.000000)
eFail = MISSION_FAIL_GRAVE_NOT_REACHED
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_GRAVEYARD_ABANDONED] = TRUE )
IF ( eStage = MISSION_STAGE_GRAVEYARD_SHOOTOUT )
IF NOT IS_ENTITY_IN_LOCATE(PLAYER_PED_ID(), <<3255.412842,-4628.320801,125.917946>>,
<< 58.0, 78.0, 16.0 >> #IF IS_DEBUG_BUILD, "GraveyardLocate" #ENDIF)
eFail = MISSION_FAIL_GRAVEYARD_ABANDONED
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
IF ( FailFlags[MISSION_FAIL_TREVORS_CAR_UNDRIVABLE] = TRUE )
IF IS_VEHICLE_PERMANENTLY_STUCK(vsTrevorsCar.VehicleIndex)
eFail = MISSION_FAIL_TREVORS_CAR_UNDRIVABLE
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_TREVORS_CAR_DEAD] = TRUE )
IF NOT IS_VEHICLE_DRIVEABLE(vsTrevorsCar.VehicleIndex, TRUE)
eFail = MISSION_FAIL_TREVORS_CAR_DEAD
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND] = TRUE )
IF IS_VEHICLE_DRIVEABLE(vsTrevorsCar.VehicleIndex)
IF GET_DISTANCE_BETWEEN_ENTITIES(GET_PED_INDEX(CHAR_TREVOR), vsTrevorsCar.VehicleIndex) > 100
eFail = MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsTrevorsPlane.VehicleIndex)
IF ( FailFlags[MISSION_FAIL_TREVORS_PLANE_UNDRIVABLE] = TRUE )
IF IS_VEHICLE_PERMANENTLY_STUCK_WITH_TIMERS(vsTrevorsPlane.VehicleIndex)
eFail = MISSION_FAIL_TREVORS_PLANE_UNDRIVABLE
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_TREVORS_PLANE_DEAD] = TRUE )
IF NOT IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex, TRUE)
eFail = MISSION_FAIL_TREVORS_PLANE_DEAD
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psMichael.PedIndex)
IF ( FailFlags[MISSION_FAIL_MICHAEL_DEAD] = TRUE )
IF IS_PED_INJURED(psMichael.PedIndex)
eFail = MISSION_FAIL_MICHAEL_DEAD
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
IF ( FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE )
IF IS_PED_INJURED(psTrevor.PedIndex)
eFail = MISSION_FAIL_TREVOR_DEAD
eStage = MISSION_STAGE_FAILED
ENDIF
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, BOOL bPlayerInPrologue)
SWITCH eFailReason
CASE MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE //Michael's car is undriveable
IF ( bPlayerInPrologue = FALSE )
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_MCUND")
ELSE
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_CUND")
ENDIF
BREAK
CASE MISSION_FAIL_MICHAELS_CAR_DEAD //Michael's car is destroyed
IF ( bPlayerInPrologue = FALSE )
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_MDEST")
ELSE
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_GENDEST")
ENDIF
BREAK
CASE MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND //Michael's car is left behind
IF ( bPlayerInPrologue = FALSE )
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_MCLEFT")
ELSE
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_CLEFT")
ENDIF
BREAK
CASE MISSION_FAIL_GRAVEYARD_ABANDONED //Cemetery is abandoned
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_CLEFT")
BREAK
CASE MISSION_FAIL_GRAVEYARD_NOT_REACHED //Cemetery is not reached
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_FTRC")
BREAK
CASE MISSION_FAIL_GRAVE_NOT_REACHED //Grave is not reached
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_FTRG")
BREAK
CASE MISSION_FAIL_TREVORS_CAR_UNDRIVABLE //Trevor's car is undriveable
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_TCUND")
BREAK
CASE MISSION_FAIL_TREVORS_CAR_DEAD //Trevor's car is destroyed
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_TDEST")
BREAK
CASE MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND //Trevor's car left behind
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_TCLEFT")
BREAK
CASE MISSION_FAIL_TREVORS_PLANE_UNDRIVABLE //Trevor's plane is undriveable
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_PUND")
BREAK
CASE MISSION_FAIL_TREVORS_PLANE_DEAD //Trevor's plane is destroyed
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_PDEAD")
BREAK
CASE MISSION_FAIL_MICHAEL_DEAD //Michael is dead
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_MDIED")
BREAK
CASE MISSION_FAIL_TREVOR_DEAD //Trevor is dead
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_TDIED")
BREAK
CASE MISSION_FAIL_FORCE_FAIL //Debug forced fail
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_FAIL")
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission failed with reason ", GET_MISSION_FAIL_NAME_FOR_DEBUG(eFailReason), ".")
#ENDIF
ENDPROC
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_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, TRUE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_WillFlyThroughWindscreen, bCanFlyThroughWindscreen)
SET_PED_CONFIG_FLAG(PedIndex, PCF_KeepRelationshipGroupAfterCleanUp, bKeepRelGroupOnCleanup)
SET_PED_CAN_BE_TARGETTED(PedIndex, bCanBeTargetted)
SET_PED_AS_ENEMY(PedIndex, bIsEnemy)
IF relGroupHash != RELGROUPHASH_NO_RELATIONSHIP
SET_PED_RELATIONSHIP_GROUP_HASH(PedIndex, relGroupHash)
ENDIF
ENDIF
ENDIF
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
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
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
/// 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
#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_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_THIS_MODEL_A_HELI(vsVehicle.ModelName)
OR IS_THIS_MODEL_A_PLANE(vsVehicle.ModelName)
SET_VEHICLE_ENGINE_CAN_DEGRADE(vsVehicle.VehicleIndex, 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)
//delete all previous instances of player ped vehicle in the world
DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES(eCharacter)
//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
PROC SET_VEHICLE_AS_MISSION_CRITICAL(VEH_STRUCT &vehicle, BOOL bMissionCritical)
SET_VEHICLE_HAS_STRONG_AXLES(vehicle.VehicleIndex, bMissionCritical)
//limit damage that can be done to the vehicle
SET_VEHICLE_CAN_LEAK_OIL(vehicle.VehicleIndex, NOT bMissionCritical)
SET_VEHICLE_CAN_LEAK_PETROL(vehicle.VehicleIndex, NOT bMissionCritical)
//make the vehicle not attach to tow truck if mission critical
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vehicle.VehicleIndex, NOT bMissionCritical)
IF IS_THIS_MODEL_A_CAR(vehicle.ModelName)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vehicle.VehicleIndex, SC_DOOR_FRONT_LEFT, NOT bMissionCritical)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vehicle.VehicleIndex, SC_DOOR_FRONT_RIGHT, NOT bMissionCritical)
ENDIF
ENDPROC
/// PURPOSE:
/// Creates an object and returns TRUE if such object was created successfully.
/// PARAMS:
/// osObject - OBJECT_STRUCT containing model, position and rotation of the object.
/// bFreezeObject - Specify if this object's position should be frozen.
/// RETURNS:
/// TRUE if object was created, FALSE if otherwise.
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_MODEL_AS_NO_LONGER_NEEDED(osObject.ModelName)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(osObject.ObjectIndex)
#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
RETURN FALSE
ENDFUNC
FUNC BOOL HAS_MISSION_TRAIN_BEEN_CREATED(TRAIN_STRUCT &sTrain, FLOAT fSpeed, BOOL bDirectionFlag = FALSE)
IF NOT DOES_ENTITY_EXIST(sTrain.VehicleIndex)
REQUEST_MODEL(sTrain.ModelName1)
REQUEST_MODEL(sTrain.ModelName2)
REQUEST_MODEL(sTrain.ModelName3)
REQUEST_MODEL(sTrain.ModelName4)
IF HAS_MODEL_LOADED(sTrain.ModelName1)
AND HAS_MODEL_LOADED(sTrain.ModelName2)
AND HAS_MODEL_LOADED(sTrain.ModelName3)
AND HAS_MODEL_LOADED(sTrain.ModelName4)
sTrain.VehicleIndex = CREATE_MISSION_TRAIN(sTrain.iConfiguration, sTrain.vPosition, bDirectionFlag)
sTrain.PedIndex = CREATE_PED_INSIDE_VEHICLE(sTrain.VehicleIndex, PEDTYPE_MISSION, sTrain.ModelName4)
SET_TRAIN_SPEED(sTrain.VehicleIndex, fSpeed)
SET_TRAIN_CRUISE_SPEED(sTrain.VehicleIndex, fSpeed)
SET_CAN_AUTO_VAULT_ON_ENTITY(sTrain.VehicleIndex, FALSE)
SET_CAN_CLIMB_ON_ENTITY(sTrain.VehicleIndex, FALSE)
SET_PED_CONFIG_FLAG(sTrain.PedIndex, PCF_GetOutBurningVehicle, TRUE)
SET_PED_CONFIG_FLAG(sTrain.PedIndex, PCF_GetOutUndriveableVehicle, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sTrain.PedIndex, TRUE)
INT i
FOR i = 0 TO 12
VEHICLE_INDEX CarriageVehicleIndex
CarriageVehicleIndex = GET_TRAIN_CARRIAGE(sTrain.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(sTrain.ModelName1)
SET_MODEL_AS_NO_LONGER_NEEDED(sTrain.ModelName2)
SET_MODEL_AS_NO_LONGER_NEEDED(sTrain.ModelName3)
SET_MODEL_AS_NO_LONGER_NEEDED(sTrain.ModelName4)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created mission train with configuration ", sTrain.iConfiguration, " at coordinates ", sTrain.vPosition, ".")
#ENDIF
RETURN TRUE
ENDIF
ELSE
IF IS_VEHICLE_DRIVEABLE(sTrain.VehicleIndex)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC SET_PED_PROPERTIES_AFTER_HOTSWAP(PED_STRUCT &psPed, PED_INDEX ped, BOOL bCreateBlip, REL_GROUP_HASH relGroupHash)
IF NOT IS_PED_INJURED(ped)
psPed.PedIndex = ped
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psPed.PedIndex, TRUE)
SET_PED_CAN_BE_TARGETTED(psPed.PedIndex, FALSE)
SET_PED_AS_ENEMY(psPed.PedIndex, FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(psPed.PedIndex, relGroupHash)
IF ( bCreateBlip = TRUE )
IF NOT DOES_BLIP_EXIST(psPed.BlipIndex)
psPed.BlipIndex = CREATE_BLIP_FOR_ENTITY(psPed.PedIndex, FALSE)
ENDIF
ENDIF
//set the ped timer to current game timer when the hotswap happens
psPed.iTimer = GET_GAME_TIMER()
ENDIF
ENDPROC
/// PURPOSE:
/// Use for blocking first person camera for a limited time, see B*2031566
PROC UPDATE_FIRST_PERSON_VEHICLE_CAMERA_BLOCKING()
IF ( bBlockVehicleFirstPersonCamera = TRUE )
//block first person vehicle camera
DISABLE_CINEMATIC_BONNET_CAMERA_THIS_UPDATE()
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_NEXT_CAMERA)
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_BEHIND)
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_VEH_LOOK_BEHIND)
//check timer
IF ( iBlockVehicleFirstPersonCameraTimer != 0 )
IF HAS_TIME_PASSED(2000, iBlockVehicleFirstPersonCameraTimer)
bBlockVehicleFirstPersonCamera = FALSE
ELIF HAS_TIME_PASSED(1700, iBlockVehicleFirstPersonCameraTimer)
IF ( bFirstPersonFXTriggered = FALSE )
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bFirstPersonFXTriggered = TRUE
ENDIF
ENDIF
ENDIF
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.")
#ENDIF
//clear the screen of any text displayed before mission started
CLEAR_PRINTS()
CLEAR_HELP()
//loads the mission text
REQUEST_ADDITIONAL_TEXT("MCH1", MISSION_TEXT_SLOT)
REQUEST_ADDITIONAL_TEXT("MCH1AUD", MISSION_DIALOGUE_TEXT_SLOT)
WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
OR NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_DIALOGUE_TEXT_SLOT)
WAIT(0)
ENDWHILE
//suppress Michael's and Trevor's cars for the duration of the mission
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL), TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_TREVOR), TRUE)
SET_PED_MODEL_IS_SUPPRESSED(mnEnemy, TRUE)
ADD_RELATIONSHIP_GROUP("ENEMIES", rgEnemies)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE,rgEnemies,RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE,RELGROUPHASH_PLAYER,rgEnemies)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE,RELGROUPHASH_PLAYER,RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE,rgEnemies,rgEnemies)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, FALSE)
ENDIF
IF IS_REPLAY_IN_PROGRESS() OR IS_REPEAT_PLAY_ACTIVE()
DISABLE_VEHICLE_GEN_ON_MISSION(TRUE)
DELETE_VEHICLE_GEN_VEHICLE(VEHGEN_MICHAEL_SAVEHOUSE)
ENDIF
iTrainBellsSoundID = GET_SOUND_ID()
iRainOnPlaneSoundID = GET_SOUND_ID()
iChurchBellsSoundID = GET_SOUND_ID()
#IF IS_DEBUG_BUILD
IF IS_REPLAY_START_VEHICLE_AVAILABLE()
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player replay start vehicle model is ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_START_VEHICLE_MODEL()), ".")
ENDIF
#ENDIF
#IF IS_DEBUG_BUILD
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player replay checkpoint vehicle model is ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
ENDIF
#ENDIF
IF ( bStageReplayed = FALSE )
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
//
BREAK
CASE CHAR_TREVOR
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(MIC1_STARTING_CHAR)
BREAK
ENDSWITCH
ENDIF
CREATE_SCENARIO_BLOCKING_AREA(<< 1415.83, 3108.05, 41.00 >>, << 48.0, 16.0, 2.0 >>)
ADD_COVER_BLOCKING_AREA(<<3278.639160 - 0.1, -4629.158691 - 0.1, 115.868752 - 1.5>>,
<<3278.639160 + 0.1, -4629.158691 + 0.1, 115.868752 + 1.5>>, TRUE, TRUE, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished initial mission loading.")
#ENDIF
iSetupProgress++
ENDIF
//run this each time new mission stage needs to be loaded
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
bStageLoaded = FALSE
//initialise arrays for peds, vehicles and objects
INITIALISE_ARRAYS_FOR_MISSION_STAGE(eStage)
//cleanup the asset arrays so that they are ready to be populated with assets needed for the stage being loaded
CLEANUP_MODEL_ARRAY(MissionModels, iModelsRequested)
CLEANUP_CARREC_ARRAY(sVehicleRecordingsFile, MissionRecordings, iRecordingsRequested)
//clear triggered text labels
CLEAR_TRIGGERED_LABELS()
iSetupProgress++
ENDIF
//handle player positioning when current stage is being skipped to or played normally
//fade in the screen if it was faded out due to skipping
IF ( iSetupProgress = 2 )
//stage was skipped to or is being replayed
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_MICHAEL )
WARP_PED(PLAYER_PED_ID(), psMichael.vPosition, psMichael.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 ( bStageSkippedTo )
//pin the interior at player start position for stages starting in interiors or requiring interiors
IF ( eStage = MISSION_STAGE_CUTSCENE_INTRO )
OR ( eStage = MISSION_STAGE_GET_TO_AIRPORT AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL )
WHILE NOT IS_INTERIOR_READY(GET_INTERIOR_AT_COORDS(vInteriorPosition))
PIN_INTERIOR_IN_MEMORY(GET_INTERIOR_AT_COORDS(vInteriorPosition))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Pinning interior at coordinates ", vInteriorPosition, " in memory.")
#ENDIF
WAIT(0)
ENDWHILE
ENDIF
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())
STOP_PED_SPEAKING(PLAYER_PED_ID(), FALSE)
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
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
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
bDirtDecalApplied = FALSE
bDamageDecalApplied = FALSE
bWeaponsHelpDisplayed = FALSE
bBlockVehicleFirstPersonCamera = FALSE
iBlockVehicleFirstPersonCameraTimer = 0
SWITCH eStage
CASE MISSION_STAGE_CUTSCENE_INTRO
CASE MISSION_STAGE_GET_TO_AIRPORT
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
CASE MISSION_STAGE_CUTSCENE_AIRPORT
CASE MISSION_STAGE_FLY_HOME
CASE MISSION_STAGE_END
REMOVE_ALL_PROLOGUE_IPLS()
BREAK
CASE MISSION_STAGE_GET_TO_GRAVEYARD
CASE MISSION_STAGE_GET_TO_GRAVE
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
REQUEST_PROLOGUE_IPLS()
REQUEST_PROLOGUE_GRAVE_IPL(FALSE)
BREAK
ENDSWITCH
ENDIF
IF ( bStageReplayed = TRUE )
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL )
START_REPLAY_SETUP(psMichael.vPosition, psMichael.fHeading)
ELIF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR )
START_REPLAY_SETUP(psTrevor.vPosition, psTrevor.fHeading)
ENDIF
ENDIF
//request assets needed for current stage
BUILD_REQUEST_BANK_FOR_MISSION_STAGE(eStage)
iSetupProgress++
ENDIF
//handle loading of mission models that have been requested in the previous stage in BUILD_REQUEST_BANK_FOR_MISSION_STAGE()
IF ( iSetupProgress = 3)
IF ARE_REQUESTED_MODELS_LOADED(MissionModels, iModelsRequested)
IF ARE_REQUESTED_CARRECS_LOADED(sVehicleRecordingsFile, MissionRecordings, iRecordingsRequested)
iSetupProgress++
ENDIF
ENDIF
ENDIF
//handle creating vehicles/peds and setting up fail flags
//run this each time new mission stage needs to be loaded
//THIS SETUP SECTION ASSUMES THAT ALL REQUIRED ASSETS HAVE BEEN ALREADY LOADED TO MEMORY IN PREVIOUS SETUP SECTIONS
IF ( iSetupProgress = 4 )
SET_FAIL_FLAGS(FALSE)
SWITCH eStage
CASE MISSION_STAGE_CUTSCENE_INTRO
iSetupProgress++
BREAK
CASE MISSION_STAGE_GET_TO_AIRPORT
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL //when playing as Michael
IF HAS_MISSION_PED_BEEN_CREATED(psTrevor, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_TREVOR, FALSE, FALSE, FALSE, vsMichaelsCar.VehicleIndex)//vsTrevorsCar.VehicleIndex)
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
FailFlags[MISSION_FAIL_TREVORS_CAR_DEAD] = TRUE
FailFlags[MISSION_FAIL_TREVORS_CAR_UNDRIVABLE] = TRUE
IF ( bStageReplayed = TRUE ) //if this is a mission replay
AND IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE() //and snapshot vehicle data exists
AND IS_THIS_MODEL_A_CAR(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay checkpoint vehicle is available for stage replay for player ped Michael.")
#ENDIF
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex) //create replay start vehicle
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
IF HAS_MODEL_LOADED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
vsMichaelsCar.VehicleIndex = CREATE_REPLAY_CHECKPOINT_VEHICLE(vsMichaelsCar.vPosition, vsMichaelsCar.fHeading)
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex, TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsMichaelsCar.VehicleIndex, "RC_Michaels_Car")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay checkpoint vehicle for player ped Michael with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
#ENDIF
ENDIF
ELSE
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = FALSE
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE] = FALSE
FailFlags[MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND] = FALSE
iSetupProgress++
ENDIF
ENDIF
ELSE //create Michael's default car
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL)
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = FALSE
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE] = FALSE
FailFlags[MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND] = FALSE
iSetupProgress++
ENDIF
ENDIF
ENDIF
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsPlane, FALSE, FALSE, NO_CHARACTER, TRUE, 1)
FailFlags[MISSION_FAIL_TREVORS_PLANE_DEAD] = TRUE
FailFlags[MISSION_FAIL_TREVORS_PLANE_UNDRIVABLE] = TRUE
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL) //create default Michael's car
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = FALSE
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE] = FALSE
FailFlags[MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND] = FALSE
SET_VEHICLE_AS_RESTRICTED(vsMichaelsCar.VehicleIndex, 0) //set it as restricted so that if Trevor
//takes it will be deleted on mission cleanup
//so that only 1 instance of Michael's car exists
//in the world
IF ( bStageReplayed = TRUE ) //if this is a mission replay
AND IS_REPLAY_START_VEHICLE_AVAILABLE() //and snapshot vehicle data exists
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay start vehicle is available for stage replay for player ped Trevor.")
#ENDIF
IF NOT DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex) //create replay start vehicle
REQUEST_REPLAY_START_VEHICLE_MODEL()
IF HAS_MODEL_LOADED(GET_REPLAY_START_VEHICLE_MODEL())
vsTrevorsCar.VehicleIndex = CREATE_REPLAY_START_VEHICLE(vsTrevorsCar.vPosition, vsTrevorsCar.fHeading)
SET_VEHICLE_DOORS_SHUT(vsTrevorsCar.VehicleIndex, TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(vsTrevorsCar.VehicleIndex)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_START_VEHICLE_MODEL())
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsTrevorsCar.VehicleIndex, "RS_Trevors_Car")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay start vehicle for player ped Trevor with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_START_VEHICLE_MODEL()), ".")
#ENDIF
ENDIF
ELSE
IF IS_VEHICLE_DRIVEABLE(vsTrevorsCar.VehicleIndex)
FailFlags[MISSION_FAIL_TREVORS_CAR_DEAD] = FALSE
FailFlags[MISSION_FAIL_TREVORS_CAR_UNDRIVABLE] = FALSE
FailFlags[MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND] = FALSE
iSetupProgress++
ENDIF
ENDIF
ELSE //create Trevor's default car
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsCar, TRUE, FALSE, CHAR_TREVOR)
FailFlags[MISSION_FAIL_TREVORS_CAR_DEAD] = FALSE
FailFlags[MISSION_FAIL_TREVORS_CAR_UNDRIVABLE] = FALSE
FailFlags[MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND] = FALSE
iSetupProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
IF HAS_MISSION_OBJECT_BEEN_CREATED(osGolfBall, TRUE)
IF DOES_ENTITY_EXIST(osGolfBall.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osGolfBall.ObjectIndex)
SET_ENTITY_HEADING(osGolfBall.ObjectIndex, 315.0)
SET_ENTITY_VISIBLE(osGolfBall.ObjectIndex, FALSE)
SET_ENTITY_COLLISION(osGolfBall.ObjectIndex, FALSE)
ENDIF
ENDIF
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsPlane, FALSE, FALSE, NO_CHARACTER, TRUE, 1)
FailFlags[MISSION_FAIL_TREVORS_PLANE_DEAD] = TRUE
FailFlags[MISSION_FAIL_TREVORS_PLANE_UNDRIVABLE] = TRUE
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
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
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsCar, TRUE, FALSE, CHAR_TREVOR)
FailFlags[MISSION_FAIL_TREVORS_CAR_DEAD] = FALSE
FailFlags[MISSION_FAIL_TREVORS_CAR_UNDRIVABLE] = FALSE
FailFlags[MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND] = FALSE
iSetupProgress++
ENDIF
ENDIF
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF ( bStageReplayed = TRUE ) //if this is a mission replay
AND IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE() //and snapshot vehicle data exists
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay checkpoint vehicle is available for stage replay for player ped Trevor.")
#ENDIF
IF NOT DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex) //create replay checkpoint vehicle
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
IF HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
vsTrevorsCar.VehicleIndex = CREATE_REPLAY_CHECKPOINT_VEHICLE(vsTrevorsCar.vPosition, vsTrevorsCar.fHeading)
SET_VEHICLE_DOORS_SHUT(vsTrevorsCar.VehicleIndex, TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(vsTrevorsCar.VehicleIndex)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsTrevorsCar.VehicleIndex, "RS_Trevors_Car")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay checkpoint vehicle for player ped Trevor with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
#ENDIF
ENDIF
ELSE
IF IS_VEHICLE_DRIVEABLE(vsTrevorsCar.VehicleIndex)
FailFlags[MISSION_FAIL_TREVORS_CAR_DEAD] = FALSE
FailFlags[MISSION_FAIL_TREVORS_CAR_UNDRIVABLE] = FALSE
FailFlags[MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND] = FALSE
iSetupProgress++
ENDIF
ENDIF
ELSE //create Trevor's default car
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsCar, TRUE, FALSE, CHAR_TREVOR)
FailFlags[MISSION_FAIL_TREVORS_CAR_DEAD] = FALSE
FailFlags[MISSION_FAIL_TREVORS_CAR_UNDRIVABLE] = FALSE
FailFlags[MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND] = FALSE
iSetupProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_AIRPORT
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
iSetupProgress++
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
iSetupProgress++
ENDIF
BREAK
CASE MISSION_STAGE_GET_TO_GRAVEYARD
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, FALSE, FALSE, NO_CHARACTER, TRUE, -1, 86, 0)
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = TRUE
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE] = TRUE
FailFlags[MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND] = TRUE
FailFlags[MISSION_FAIL_GRAVEYARD_NOT_REACHED] = TRUE
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
SET_VEH_RADIO_STATION(vsMichaelsCar.VehicleIndex, "OFF")
SET_VEHICLE_RADIO_ENABLED(vsMichaelsCar.VehicleIndex, FALSE)
SET_VEHICLE_NUMBER_PLATE_TEXT(vsMichaelsCar.VehicleIndex, NUMBERPLATES)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsMichaelsCar.VehicleIndex, TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsMichaelsCar.VehicleIndex, TRUE)
ENDIF
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsCar, FALSE, FALSE, NO_CHARACTER)
FailFlags[MISSION_FAIL_TREVORS_CAR_DEAD] = FALSE //TRUE
FailFlags[MISSION_FAIL_TREVORS_CAR_UNDRIVABLE] = FALSE //TRUE
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
iSetupProgress++
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF HAS_MISSION_PED_BEEN_CREATED(psMichael, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_MICHAEL, FALSE, FALSE, FALSE, vsMichaelsCar.VehicleIndex)
sSelectorPeds.pedID[SELECTOR_PED_MICHAEL] = psMichael.PedIndex
FailFlags[MISSION_FAIL_MICHAEL_DEAD] = TRUE
iSetupProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_GET_TO_GRAVE
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, FALSE, FALSE, NO_CHARACTER, TRUE, -1, 86, 0)
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = TRUE
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE] = TRUE
FailFlags[MISSION_FAIL_GRAVE_NOT_REACHED] = TRUE
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
SET_VEH_RADIO_STATION(vsMichaelsCar.VehicleIndex, "OFF")
SET_VEHICLE_RADIO_ENABLED(vsMichaelsCar.VehicleIndex, FALSE)
SET_VEHICLE_NUMBER_PLATE_TEXT(vsMichaelsCar.VehicleIndex, NUMBERPLATES)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsMichaelsCar.VehicleIndex, TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsMichaelsCar.VehicleIndex, FALSE)
ENDIF
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsCar, FALSE, FALSE, NO_CHARACTER)
IF IS_VEHICLE_DRIVEABLE(vsTrevorsCar.VehicleIndex)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsTrevorsCar.VehicleIndex, FALSE)
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
FailFlags[MISSION_FAIL_MICHAEL_DEAD] = TRUE
iSetupProgress++
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF HAS_MISSION_PED_BEEN_CREATED(psMichael, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_MICHAEL, FALSE, FALSE, FALSE)
sSelectorPeds.pedID[SELECTOR_PED_MICHAEL] = psMichael.PedIndex
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
FailFlags[MISSION_FAIL_MICHAEL_DEAD] = TRUE
iSetupProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, FALSE, FALSE, NO_CHARACTER, TRUE, -1, 86, 0)
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = TRUE
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE] = TRUE
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
SET_VEH_RADIO_STATION(vsMichaelsCar.VehicleIndex, "OFF")
SET_VEHICLE_RADIO_ENABLED(vsMichaelsCar.VehicleIndex, FALSE)
SET_VEHICLE_NUMBER_PLATE_TEXT(vsMichaelsCar.VehicleIndex, NUMBERPLATES)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsMichaelsCar.VehicleIndex, TRUE)
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
FailFlags[MISSION_FAIL_MICHAEL_DEAD] = TRUE
iSetupProgress++
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF HAS_MISSION_PED_BEEN_CREATED(psMichael, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_MICHAEL)
sSelectorPeds.pedID[SELECTOR_PED_MICHAEL] = psMichael.PedIndex
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
FailFlags[MISSION_FAIL_MICHAEL_DEAD] = TRUE
iSetupProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
IF ( bCoverpointsCreated = FALSE )
CREATE_COVERPOINTS(csCoverpoints, vShootoutStartPosition)
INITIALISE_FRAGGABLE_TOMBSTONES(FraggableTombstones)
bCoverpointsCreated = TRUE
ENDIF
iPlayerMichaelKills = 0
IF HAS_MISSION_OBJECT_BEEN_CREATED(osPropCoffin, TRUE)
AND HAS_MISSION_OBJECT_BEEN_CREATED(osPropShovel, TRUE)
AND HAS_MISSION_OBJECT_BEEN_CREATED(osPropPickaxe, TRUE)
AND HAS_MISSION_PED_BEEN_CREATED(psBrad, FALSE, RELGROUPHASH_NO_RELATIONSHIP, FALSE, NO_CHARACTER, FALSE, FALSE, FALSE)
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, FALSE, FALSE, NO_CHARACTER, TRUE, -1, 86, 0)
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = TRUE
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE] = TRUE
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
SET_VEH_RADIO_STATION(vsMichaelsCar.VehicleIndex, "OFF")
SET_VEHICLE_RADIO_ENABLED(vsMichaelsCar.VehicleIndex, FALSE)
SET_VEHICLE_NUMBER_PLATE_TEXT(vsMichaelsCar.VehicleIndex, NUMBERPLATES)
SET_VEHICLE_UNDRIVEABLE(vsMichaelsCar.VehicleIndex, TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsMichaelsCar.VehicleIndex, TRUE)
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
iSetupProgress++
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF HAS_MISSION_PED_BEEN_CREATED(psMichael, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_MICHAEL)
sSelectorPeds.pedID[SELECTOR_PED_MICHAEL] = psMichael.PedIndex
FailFlags[MISSION_FAIL_MICHAEL_DEAD] = TRUE
iSetupProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, FALSE, FALSE, NO_CHARACTER, TRUE, -1, 86, 0)
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = TRUE
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE] = TRUE
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
SET_VEH_RADIO_STATION(vsMichaelsCar.VehicleIndex, "OFF")
SET_VEHICLE_RADIO_ENABLED(vsMichaelsCar.VehicleIndex, FALSE)
SET_VEHICLE_NUMBER_PLATE_TEXT(vsMichaelsCar.VehicleIndex, NUMBERPLATES)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsMichaelsCar.VehicleIndex, TRUE)
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
iSetupProgress++
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF HAS_MISSION_PED_BEEN_CREATED(psMichael, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_MICHAEL)
sSelectorPeds.pedID[SELECTOR_PED_MICHAEL] = psMichael.PedIndex
FailFlags[MISSION_FAIL_MICHAEL_DEAD] = TRUE
iSetupProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_FLY_HOME
CASE MISSION_STAGE_END
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsPlane, FALSE, FALSE, NO_CHARACTER, TRUE, 1)
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsTrevorsPlane.VehicleIndex, TRUE)
ENDIF
FailFlags[MISSION_FAIL_TREVORS_PLANE_DEAD] = TRUE
FailFlags[MISSION_FAIL_TREVORS_PLANE_UNDRIVABLE] = TRUE
SWITCH eStage
CASE MISSION_STAGE_FLY_HOME
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
FREEZE_ENTITY_POSITION(vsTrevorsPlane.VehicleIndex, TRUE)
ENDIF
BREAK
CASE MISSION_STAGE_END
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
SET_HELI_BLADES_FULL_SPEED(vsTrevorsPlane.VehicleIndex)
SET_VEHICLE_ENGINE_ON(vsTrevorsPlane.VehicleIndex, TRUE, TRUE)
ENDIF
ENDIF
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
SWITCH GET_PLAYER_CHARACTER_AT_MISSION_START()
CASE CHAR_MICHAEL
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission started as Michael.")
BREAK
CASE CHAR_TREVOR
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission started as Trevor.")
BREAK
ENDSWITCH
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player playing as Michael.")
BREAK
CASE CHAR_TREVOR
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player playing as Trevor.")
BREAK
ENDSWITCH
IF IS_REPLAY_START_VEHICLE_AVAILABLE()
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay start vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_START_VEHICLE_MODEL()), " is available for stage.")
ENDIF
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay checkpoint vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), " is available for stage.")
ENDIF
IF ( TrevorsVehicleData.eModel <> DUMMY_MODEL_FOR_SCRIPT )
PRINTLN(GET_THIS_SCRIPT_NAME(), ": TrevorsVehicleData.eModel is model ", GET_MODEL_NAME_FOR_DEBUG(TrevorsVehicleData.eModel), ".")
ENDIF
#ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF HAS_MISSION_PED_BEEN_CREATED(psTrevor, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_TREVOR, FALSE, FALSE, FALSE, vsTrevorsPlane.VehicleIndex)
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = psTrevor.PedIndex
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
IF GET_PLAYER_CHARACTER_AT_MISSION_START() = CHAR_TREVOR AND IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay checkpoint vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), " is available for stage.")
#ENDIF
IF NOT DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex) //create replay checkpoint saved vehicle
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
IF HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
CLEAR_AREA(vsTrevorsCar.vPosition, 10.0, TRUE)
vsTrevorsCar.VehicleIndex = CREATE_REPLAY_CHECKPOINT_VEHICLE(vsTrevorsCar.vPosition, vsTrevorsCar.fHeading)
SET_VEHICLE_DOORS_SHUT(vsTrevorsCar.VehicleIndex, TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(vsTrevorsCar.VehicleIndex)
IF IS_THIS_MODEL_A_HELI(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vsTrevorsCar.VehicleIndex, TRUE)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsTrevorsCar.VehicleIndex, "RS_Trevors_Car")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay checkpoint vehicle for player ped Trevor with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
#ENDIF
ENDIF
ELSE
iSetupProgress++
ENDIF
ELIF GET_PLAYER_CHARACTER_AT_MISSION_START() = CHAR_MICHAEL AND IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay checkpoint vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), " is available for stage.")
#ENDIF
IF NOT DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex) //create replay checkpoint saved vehicle
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
IF HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
CLEAR_AREA(vsTrevorsCar.vPosition, 10.0, TRUE)
vsTrevorsCar.VehicleIndex = CREATE_REPLAY_CHECKPOINT_VEHICLE(vsTrevorsCar.vPosition, vsTrevorsCar.fHeading)
SET_VEHICLE_DOORS_SHUT(vsTrevorsCar.VehicleIndex, TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(vsTrevorsCar.VehicleIndex)
IF IS_THIS_MODEL_A_HELI(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vsTrevorsCar.VehicleIndex, TRUE)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsTrevorsCar.VehicleIndex, "RS_Trevors_Car")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay checkpoint vehicle for player ped Trevor with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
#ENDIF
ENDIF
ELSE
iSetupProgress++
ENDIF
ELSE
IF ( TrevorsVehicleData.eModel = DUMMY_MODEL_FOR_SCRIPT AND HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsCar, TRUE, FALSE, CHAR_TREVOR) )
OR ( TrevorsVehicleData.eModel <> DUMMY_MODEL_FOR_SCRIPT )
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsTrevorsCar.VehicleIndex)
IF IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(vsTrevorsCar.VehicleIndex))
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vsTrevorsCar.VehicleIndex, TRUE)
ENDIF
ENDIF
ENDIF
iSetupProgress++
ENDIF
ENDIF
ENDIF
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF GET_PLAYER_CHARACTER_AT_MISSION_START() = CHAR_TREVOR AND IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay checkpoint vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), " is available for stage.")
#ENDIF
IF NOT DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex) //create replay checkpoint saved vehicle
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
IF HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
CLEAR_AREA(vsTrevorsCar.vPosition, 10.0, TRUE)
vsTrevorsCar.VehicleIndex = CREATE_REPLAY_CHECKPOINT_VEHICLE(vsTrevorsCar.vPosition, vsTrevorsCar.fHeading)
SET_VEHICLE_DOORS_SHUT(vsTrevorsCar.VehicleIndex, TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(vsTrevorsCar.VehicleIndex)
IF IS_THIS_MODEL_A_HELI(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vsTrevorsCar.VehicleIndex, TRUE)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsTrevorsCar.VehicleIndex, "RS_Trevors_Car")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay checkpoint vehicle for player ped Trevor with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
#ENDIF
ENDIF
ELSE
iSetupProgress++
ENDIF
ELIF GET_PLAYER_CHARACTER_AT_MISSION_START() = CHAR_MICHAEL AND IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay checkpoint vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), " is available for stage.")
#ENDIF
IF NOT DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex) //create replay checkpoint saved vehicle
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
IF HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
CLEAR_AREA(vsTrevorsCar.vPosition, 10.0, TRUE)
vsTrevorsCar.VehicleIndex = CREATE_REPLAY_CHECKPOINT_VEHICLE(vsTrevorsCar.vPosition, vsTrevorsCar.fHeading)
SET_VEHICLE_DOORS_SHUT(vsTrevorsCar.VehicleIndex, TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(vsTrevorsCar.VehicleIndex)
IF IS_THIS_MODEL_A_HELI(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vsTrevorsCar.VehicleIndex, TRUE)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsTrevorsCar.VehicleIndex, "RS_Trevors_Car")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay checkpoint vehicle for player ped Trevor with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
#ENDIF
ENDIF
ELSE
iSetupProgress++
ENDIF
ELSE
IF ( TrevorsVehicleData.eModel = DUMMY_MODEL_FOR_SCRIPT AND HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsCar, TRUE, FALSE, CHAR_TREVOR) )
OR ( TrevorsVehicleData.eModel <> DUMMY_MODEL_FOR_SCRIPT )
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsTrevorsCar.VehicleIndex)
IF IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(vsTrevorsCar.VehicleIndex))
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vsTrevorsCar.VehicleIndex, TRUE)
ENDIF
ENDIF
ENDIF
iSetupProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
//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 )
bTrevorFlightActive = FALSE
SWITCH eStage
CASE MISSION_STAGE_CUTSCENE_INTRO
//
BREAK
CASE MISSION_STAGE_GET_TO_AIRPORT
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
LOCK_AUTOMATIC_DOOR_OPEN(AUTODOOR_MICHAEL_MANSION_GATE, TRUE)
BREAK
CASE CHAR_TREVOR
EXTEND_WORLD_BOUNDARY_FOR_PLAYER(sLocateFlight.vPosition)
LOCK_AUTOMATIC_DOOR_OPEN(AUTODOOR_MICHAEL_MANSION_GATE, TRUE)
BREAK
ENDSWITCH
BREAK
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
bTrevorFlightActive = TRUE
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. Setting Michael player ped as no longer needed.")
#ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
ENDIF
ENDIF
ENDIF
EXTEND_WORLD_BOUNDARY_FOR_PLAYER(sLocateFlight.vPosition)
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_AIRPORT
//
BREAK
CASE MISSION_STAGE_GET_TO_GRAVEYARD
CASE MISSION_STAGE_GET_TO_GRAVE
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
IF MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Performing script controlled hotswap to Michael for mission stage being loaded. Setting Trevor player ped as no longer needed.")
#ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Deleting Trevor ped.")
#ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_FLY_HOME
CASE MISSION_STAGE_END
bTrevorFlightActive = 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. Setting Michael player ped as no longer needed.")
#ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
ENDIF
ENDIF
ENDIF
SWITCH eStage
CASE MISSION_STAGE_FLY_HOME
EXTEND_WORLD_BOUNDARY_FOR_PLAYER(vsTrevorsPlane.vPosition + vGlobalFlightOffset)
BREAK
ENDSWITCH
BREAK
ENDSWITCH
iSetupProgress++
ENDIF
//handle the prologue minimap display, weather and dispatch services depending on current mission stage
//run this each time new mission stage needs to be loaded
IF ( iSetupProgress = 6 )
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
SWITCH eStage
//mission is in san andreas map
CASE MISSION_STAGE_CUTSCENE_INTRO
CASE MISSION_STAGE_GET_TO_AIRPORT
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
CASE MISSION_STAGE_CUTSCENE_AIRPORT
CASE MISSION_STAGE_FLY_HOME
CASE MISSION_STAGE_END
SET_PLAYER_PED_DATA_IN_CUTSCENES(TRUE, TRUE)
//if prologue map is active, which means mission stages are skipped backwards
//then remove the prologue IPLs
IF ( bPrologueMapActive = TRUE )
UNLOCK_GRAVEYARD_GATES()
UNREGISTER_GRAVEYARD_GATES()
REMOVE_ALL_PROLOGUE_IPLS()
SET_ROADS_IN_ANGLED_AREA(<<5526.240234,-5137.229980,61.789253>>, <<3679.326660,-4973.879395,125.082840>>, 192.0, FALSE, FALSE)
SET_ROADS_IN_ANGLED_AREA(<<3691.211426,-4941.240234,94.593681>>, <<3511.115479,-4869.191406,126.762108>>, 16.0, FALSE, FALSE)
SET_ROADS_IN_ANGLED_AREA(<<3510.004395,-4865.810059,94.695572>>, <<3204.424316,-4833.816895,126.815216>>, 16.0, FALSE, FALSE)
SET_ROADS_IN_ANGLED_AREA(<<3186.533691,-4832.797852,109.814827>>, <<3202.187256,-4833.993164,114.814995>>, 16.0, FALSE, FALSE) //road leading down into town
CLEAR_TIMECYCLE_MODIFIER()
DISABLE_MOON_CYCLE_OVERRIDE()
SET_AMBIENT_VEHICLE_NEON_ENABLED(TRUE)
RELEASE_SUPPRESSED_EMERGENCY_CALLS()
IF DOES_PICKUP_EXIST(HealthPickup)
REMOVE_PICKUP(HealthPickup)
ENDIF
IF IS_CHEAT_DISABLED(CHEAT_TYPE_SUPER_JUMP)
DISABLE_CHEAT(CHEAT_TYPE_SUPER_JUMP, FALSE)
ENDIF
IF IS_CHEAT_DISABLED(CHEAT_TYPE_SPAWN_VEHICLE)
DISABLE_CHEAT(CHEAT_TYPE_SPAWN_VEHICLE, FALSE)
ENDIF
IF IS_CHEAT_DISABLED(CHEAT_TYPE_ADVANCE_WEATHER)
DISABLE_CHEAT(CHEAT_TYPE_ADVANCE_WEATHER, FALSE)
ENDIF
bPrologueMapActive = FALSE
ENDIF
SET_RANDOM_TRAINS(TRUE) //allow random trains when not in prologue map
SET_ALLOW_STREAM_PROLOGUE_NODES(FALSE) //turn streaming of prologue vehicle nodes off
SET_MINIMAP_IN_PROLOGUE_AND_HANDLE_STATIC_BLIPS(FALSE) //turn prologue minimap off
//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)
//set non prologue multipliers
SET_MAX_WANTED_LEVEL(5)
SET_CREATE_RANDOM_COPS(TRUE)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_VEHICLE_MODEL_IS_SUPPRESSED(ASEA2, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(MESA2, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(TAXI, FALSE)
//turn snow off if it is snowing
IF ( bSnowOn = TRUE )
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
CLEAR_WEATHER_TYPE_PERSIST()
UNLOAD_ALL_CLOUD_HATS()
bSnowOn = FALSE
ENDIF
SET_MAPDATACULLBOX_ENABLED("prologue", FALSE)
#IF USE_TU_CHANGES
SET_MAPDATACULLBOX_ENABLED("Prologue_Main", FALSE)
#ENDIF
IF ( bProloguePedComponentsActive = TRUE ) //set non prologue clothes on player peds
OR ( bStageSkippedTo = TRUE )
OR ( bStageReplayed = TRUE )
SWITCH eStage
CASE MISSION_STAGE_FLY_HOME
CASE MISSION_STAGE_END
RESTORE_PLAYER_PED_VARIATIONS(GET_PED_INDEX(CHAR_TREVOR))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Restoring player ped variations.")
#ENDIF
BREAK
DEFAULT
RESTORE_MISSION_START_OUTFIT()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Restoring default player ped component variations.")
#ENDIF
BREAK
ENDSWITCH
bProloguePedComponentsActive = FALSE
ENDIF
IF ( eStage = MISSION_STAGE_FLY_HOME )
SET_CLOCK_TIME(6, 15, 0)
//SET_WEATHER_TYPE_NOW("THUNDER")
SET_WEATHER_TYPE_NOW("OVERCAST")
ENDIF
//enable vehicle radios
SET_FRONTEND_RADIO_ACTIVE(TRUE)
SET_USER_RADIO_CONTROL_ENABLED(TRUE)
STOP_AUDIO_SCENE("MIC1_RADIO_DISABLE")
SET_AMBIENT_ZONE_LIST_STATE("ZL_YANKTON_ZONE_KILL_LIST", TRUE, TRUE)
SET_AMBIENT_ZONE_LIST_STATE("ZONE_LIST_YANKTON", FALSE, TRUE)
REMOVE_NAVMESH_BLOCKING_OBJECTS()
IF ( bStageSkippedTo = TRUE ) //on debug skip unblock player ped weapons and restore them
IF ( bMichaelsWeaponsStored = TRUE )
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID()).")
#ENDIF
BREAK
CASE CHAR_TREVOR
RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT_FOR_CHAR(CHAR_MICHAEL)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT_FOR_CHAR(CHAR_MICHAEL).")
#ENDIF
BREAK
ENDSWITCH
bMichaelsWeaponsStored = FALSE
ENDIF
ENDIF
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_F_L))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_F_L), 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_F_L), DOORSTATE_FORCE_UNLOCKED_THIS_FRAME, FALSE, TRUE)
g_eCurrentDoorState[DOORNAME_M_MANSION_F_L] = DOORSTATE_FORCE_UNLOCKED_THIS_FRAME //set state for building controller to pick up
ENDIF
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_F_R))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_F_R), 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_F_R), DOORSTATE_FORCE_UNLOCKED_THIS_FRAME, FALSE, TRUE)
g_eCurrentDoorState[DOORNAME_M_MANSION_F_R] = DOORSTATE_FORCE_UNLOCKED_THIS_FRAME //set state for building controller to pick up
ENDIF
BREAK
//mission is in north yankton map
CASE MISSION_STAGE_GET_TO_GRAVEYARD
CASE MISSION_STAGE_GET_TO_GRAVE
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
SET_PLAYER_PED_DATA_IN_CUTSCENES(FALSE, TRUE)
IF ( bPrologueMapActive = FALSE )
IF NOT IS_REPLAY_BEING_SET_UP()
REQUEST_PROLOGUE_IPLS()
REQUEST_PROLOGUE_GRAVE_IPL(FALSE)
ENDIF
REGISTER_GRAVEYARD_GATES()
LOCK_GRAVEYARD_GATES()
SET_ROADS_IN_ANGLED_AREA(<<5526.240234,-5137.229980,61.789253>>, <<3679.326660,-4973.879395,125.082840>>, 192.0, FALSE, TRUE)
SET_ROADS_IN_ANGLED_AREA(<<3691.211426,-4941.240234,94.593681>>, <<3511.115479,-4869.191406,126.762108>>, 16.0, FALSE, TRUE)
SET_ROADS_IN_ANGLED_AREA(<<3510.004395,-4865.810059,94.695572>>, <<3204.424316,-4833.816895,126.815216>>, 16.0, FALSE, TRUE)
SET_ROADS_IN_ANGLED_AREA(<<3186.533691,-4832.797852,109.814827>>, <<3202.187256,-4833.993164,114.814995>>, 16.0, FALSE, TRUE) //road leading down into town
SUPPRESS_EMERGENCY_CALLS()
SWITCH eStage
CASE MISSION_STAGE_GET_TO_GRAVEYARD
SET_CLOCK_TIME(22, 0, 0)
BREAK
CASE MISSION_STAGE_GET_TO_GRAVE
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
SET_CLOCK_TIME(0, 0, 0)
BREAK
ENDSWITCH
//handle taking away weapons from Michael and leaving him only with a pistol for North Yankton stages
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
IF ( bMichaelsWeaponsStored = FALSE )
IF NOT bStageReplayInProgress
STORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling STORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID()).")
#ENDIF
ENDIF
REMOVE_PED_WEAPONS_LEAVING_ONE(PLAYER_PED_ID(), WEAPONTYPE_PISTOL)
bMichaelsWeaponsStored = TRUE
ENDIF
BREAK
CASE CHAR_TREVOR
//
BREAK
ENDSWITCH
IF NOT DOES_PICKUP_EXIST(HealthPickup) //create health pickup in the graveyard
iHealthPickupPlacementFlags = 0
SET_BIT(iHealthPickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
SET_BIT(iHealthPickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_UPRIGHT))
SET_BIT(iHealthPickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
HealthPickup = CREATE_PICKUP_ROTATE(PICKUP_HEALTH_STANDARD, << 3243.380 , -4647.380, 114.975 >>,
<< 0.0, 0.0, 94.5 >>, iHealthPickupPlacementFlags)
ENDIF
DISABLE_CHEAT(CHEAT_TYPE_SUPER_JUMP, TRUE)
DISABLE_CHEAT(CHEAT_TYPE_SPAWN_VEHICLE, TRUE)
DISABLE_CHEAT(CHEAT_TYPE_ADVANCE_WEATHER, TRUE)
ENABLE_MOON_CYCLE_OVERRIDE(0.5)
SET_AMBIENT_VEHICLE_NEON_ENABLED(FALSE)
bPrologueMapActive = TRUE
ENDIF
SWITCH eStage
CASE MISSION_STAGE_GET_TO_GRAVEYARD
CLEAR_TIMECYCLE_MODIFIER()
BREAK
CASE MISSION_STAGE_GET_TO_GRAVE
SET_TRANSITION_TIMECYCLE_MODIFIER("graveyard_shootout", 30.0)
BREAK
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
SET_TIMECYCLE_MODIFIER("graveyard_shootout")
ENDIF
BREAK
ENDSWITCH
SWITCH eStage
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
SPECIAL_ABILITY_FILL_METER(PLAYER_ID(), TRUE)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_SHOOTING)
IF NOT DOES_PICKUP_EXIST(PistolPickup) //create pistol pickup in the graveyard, Trevor throws pistol in the cutscene
iPistolPickupPlacementFlags = 0
SET_BIT(iPistolPickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
SET_BIT(iPistolPickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_UPRIGHT))
SET_BIT(iPistolPickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
PistolPickup = CREATE_PICKUP_ROTATE(PICKUP_WEAPON_PISTOL, <<3258.7891, -4575.3062, 117.2570>>,
<<-88.2000, 65.8800, 0.0000>>, iPistolPickupPlacementFlags, 12)
ENDIF
IF NOT DOES_PICKUP_EXIST(RiflePickup) //create rifle pickup in the graveyard
iRiflePickupPlacementFlags = 0
SET_BIT(iRiflePickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
SET_BIT(iRiflePickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_UPRIGHT))
SET_BIT(iRiflePickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
RiflePickup = CREATE_PICKUP_ROTATE(PICKUP_WEAPON_ASSAULTRIFLE, <<3265.8049, -4591.3149, 116.1286>>,
<<-70.2000, -14.4000, -28.8000>>, iRiflePickupPlacementFlags, 50)
ENDIF
BREAK
ENDSWITCH
SET_RANDOM_TRAINS(FALSE) //allow random trains when not in prologue map
SET_ALLOW_STREAM_PROLOGUE_NODES(TRUE) //turn streaming of prologue vehicle nodes off
SET_MINIMAP_IN_PROLOGUE_AND_HANDLE_STATIC_BLIPS(TRUE) //turn prologue minimap off
//disable dispatch services
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, FALSE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, FALSE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
//set prologue multipliers
SET_MAX_WANTED_LEVEL(0)
SET_CREATE_RANDOM_COPS(FALSE)
SET_WANTED_LEVEL_MULTIPLIER(0.0)
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
ENDIF
//suppress the prologue specific vehicles and peds
SET_VEHICLE_MODEL_IS_SUPPRESSED(ASEA2, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(MESA2, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(POLICEOLD1, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(POLICEOLD2, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(TAXI, TRUE)
//turn snow on if it is not snowing
//set the time once only
IF ( bSnowOn = FALSE )
CLEAR_WEATHER_TYPE_PERSIST()
SET_WEATHER_TYPE_NOW_PERSIST("SNOWLIGHT")
UNLOAD_ALL_CLOUD_HATS()
LOAD_CLOUD_HAT("Snowy 01")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting weather type to SNOWLIGHT.")
#ENDIF
bSnowOn = TRUE
ENDIF
SET_MAPDATACULLBOX_ENABLED("prologue", TRUE)
#IF USE_TU_CHANGES
SET_MAPDATACULLBOX_ENABLED("Prologue_Main", TRUE)
#ENDIF
IF ( bProloguePedComponentsActive = FALSE ) //set prologue clothes on player peds
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_MICHAEL))
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_OUTFIT, OUTFIT_P0_LUDENDORFF, FALSE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_TREVOR))
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_OUTFIT, OUTFIT_P2_LUDENDORFF, FALSE)
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting prologue player ped component variations.")
#ENDIF
bProloguePedComponentsActive = TRUE
ENDIF
SWITCH eStage
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
IF ( bDamageDecalApplied = FALSE )
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
APPLY_PED_DAMAGE_DECAL(PLAYER_PED_ID(), PDZ_HEAD, 0.621, 0.755, 55.084, 0.01, 1.0, 1, TRUE, "bruise")
bDamageDecalApplied = TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
//disable vehicle radios in prologue
SET_FRONTEND_RADIO_ACTIVE(FALSE)
SET_USER_RADIO_CONTROL_ENABLED(FALSE)
IF NOT IS_AUDIO_SCENE_ACTIVE("MIC1_RADIO_DISABLE")
START_AUDIO_SCENE("MIC1_RADIO_DISABLE")
ENDIF
SET_AMBIENT_ZONE_LIST_STATE("ZL_YANKTON_ZONE_KILL_LIST", FALSE, TRUE)
SET_AMBIENT_ZONE_LIST_STATE("ZONE_LIST_YANKTON", TRUE, TRUE)
ADD_NAVMESH_BLOCKING_OBJECTS()
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
DELETE_ALL_TRAINS()
ENDIF
BREAK
ENDSWITCH
iSetupProgress++
ENDIF
//make sure prologue IPLs are loaded when going to prologue map
IF ( iSetupProgress = 7 )
IF ( bPrologueMapActive = TRUE )
REQUEST_PTFX_ASSET()
IF HAS_PTFX_ASSET_LOADED()
AND ARE_PROLOGUE_IPLS_ACTIVE()
AND IS_PROLOGUE_GRAVE_IPL_ACTIVE(FALSE)
AND REQUEST_SCRIPT_AUDIO_BANK("ICE_FOOTSTEPS")
AND REQUEST_SCRIPT_AUDIO_BANK("SNOW_FOOTSTEPS")
AND REQUEST_SCRIPT_AUDIO_BANK("SCRIPT\\FBI_HEIST_3B_SHOOTOUT")
iSetupProgress++
ENDIF
ELIF ( bPrologueMapActive = FALSE )
REMOVE_PTFX_ASSET()
RELEASE_SCRIPT_AUDIO_BANK()
RELEASE_NAMED_SCRIPT_AUDIO_BANK("SCRIPT\\FBI_HEIST_3B_SHOOTOUT")
iSetupProgress++
ENDIF
ENDIF
//handle setup peds for dialogue, taxi hailing, cellphone
IF ( iSetupProgress = 8 )
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 0) //Michael
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 2) //Trevor
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 3) //Chinese Goon 1 /Dave Norton (phone call)
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 4) //Chinese Goon 2 /Ron (phone call)
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 5) //Chinese Goon 3 /Cheng senior (phone call)
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 6) //Chinese Goon 4
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 7) //Chinese Goon 5
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 8) //Air traffic control
SET_AUDIO_FLAG("DisableReplayScriptStreamRecording", FALSE)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting audio flag DisableReplayScriptStreamRecording to false.")
SWITCH eStage
CASE MISSION_STAGE_GET_TO_AIRPORT
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 0, PLAYER_PED_ID(), "MICHAEL")
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 2, NULL, "TREVOR")
BREAK
CASE CHAR_TREVOR
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 2, PLAYER_PED_ID(), "TREVOR")
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 0, NULL, "MICHAEL")
BREAK
ENDSWITCH
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 3, NULL, "DAVE")
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 4, NULL, "NERVOUSRON")
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 8, NULL, "MCH1AIRTRAFFIC")
DISABLE_CELLPHONE(FALSE)
DISABLE_TAXI_HAILING(FALSE)
BREAK
CASE MISSION_STAGE_GET_TO_GRAVEYARD
CASE MISSION_STAGE_GET_TO_GRAVE
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 0, PLAYER_PED_ID(), "MICHAEL")
ENDIF
DISABLE_CELLPHONE(FALSE)
DISABLE_TAXI_HAILING(TRUE)
SET_AUDIO_FLAG("DisableReplayScriptStreamRecording", TRUE)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting audio flag DisableReplayScriptStreamRecording to true.")
BREAK
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 0, PLAYER_PED_ID(), "MICHAEL")
ENDIF
DISABLE_CELLPHONE(FALSE)
DISABLE_TAXI_HAILING(TRUE)
BREAK
CASE MISSION_STAGE_FLY_HOME
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 2, PLAYER_PED_ID(), "TREVOR")
ENDIF
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 5, NULL, "CHENGSR")
DISABLE_CELLPHONE(FALSE)
DISABLE_TAXI_HAILING(TRUE)
BREAK
CASE MISSION_STAGE_END
DISABLE_CELLPHONE(FALSE)
DISABLE_TAXI_HAILING(FALSE)
BREAK
ENDSWITCH
iSetupProgress++
ENDIF
IF ( iSetupProgress = 9 )
//stage was skipped to or is being replayed
IF ( bStageSkippedTo = TRUE )
OR ( bStageReplayed = TRUE )
SWITCH eStage
CASE MISSION_STAGE_GET_TO_AIRPORT
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
iSetupProgress++
BREAK
CASE CHAR_TREVOR
REQUEST_WAYPOINT_RECORDING("mic1_tdrive")
IF GET_IS_WAYPOINT_RECORDING_LOADED("mic1_tdrive")
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, VS_DRIVER)
ENDIF
CLEAR_AREA_OF_PEDS(<<-857.8701, 172.5816, 67.0251>>, 10.0)
CLEAR_AREA_OF_VEHICLES(<<-857.8701, 172.5816, 67.0251>>, 10.0)
SET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex, <<-857.8701, 172.5816, 67.0251>>)
SET_ENTITY_HEADING(vsMichaelsCar.VehicleIndex, 355.2254)
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(vsMichaelsCar.VehicleIndex)
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, TRUE, TRUE)
SET_VEHICLE_FORWARD_SPEED(vsMichaelsCar.VehicleIndex, 10.0)
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, "mic1_tdrive", DRIVINGMODE_AVOIDCARS_RECKLESS, 0, EWAYPOINT_START_FROM_CLOSEST_POINT)
iSetupProgress++
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
BREAK
DEFAULT
iSetupProgress++
BREAK
ENDSWITCH
ELSE
iSetupProgress++
ENDIF
ENDIF
//handle player positioning when current stage is being skipped to replayed
//fade in the screen if it was faded out due to skipping
IF ( iSetupProgress = 10 )
//stage was skipped to or is being replayed
IF ( bStageSkippedTo = TRUE )
OR ( bStageReplayed = TRUE )
IF ( bStageReplayed = FALSE )
VECTOR vPlayerCoords = GET_ENTITY_COORDS(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling LOAD_SCENE() at coordinates ", vPlayerCoords, " for mission replay or stage skip. This might take a while to load.")
#ENDIF
LOAD_SCENE(vPlayerCoords)
WAIT(1000) //add wait to hide any load scene freezes
ELSE
END_REPLAY_SETUP(NULL, VS_DRIVER, FALSE)
ENDIF
//put player in vehicle
SWITCH eStage
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
WARP_PED(PLAYER_PED_ID(), << 3256.5776, -4575.2520, 117.2670 >>, 267.6326, FALSE, FALSE, FALSE)
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), csCoverpoints[0].vPosition, -1, TRUE, 0, TRUE, TRUE, csCoverpoints[0].CoverpointIndex)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), TRUE)
//check for Michaels's fail weapon
IF ( eMichaelsFailWeapon = WEAPONTYPE_INVALID )
OR ( eMichaelsFailWeapon = WEAPONTYPE_UNARMED )
eMichaelsFailWeapon = GET_BEST_PED_WEAPON(PLAYER_PED_ID(), TRUE)
IF ( eMichaelsFailWeapon = WEAPONTYPE_INVALID )
OR ( eMichaelsFailWeapon = WEAPONTYPE_UNARMED )
eMichaelsFailWeapon = WEAPONTYPE_PISTOL //if fail weapon is invalid or unarmed, give scripted weapon
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Michael's fail weapon is on stage retry is ", GET_WEAPON_NAME(eMichaelsFailWeapon), ".")
#ENDIF
INT iAmmo
IF ( GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), eMichaelsFailWeapon) < GET_MAX_AMMO_IN_CLIP(PLAYER_PED_ID(), eMichaelsFailWeapon) )
iAmmo = GET_MAX_AMMO_IN_CLIP(PLAYER_PED_ID(), eMichaelsFailWeapon) * 2
ENDIF
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), eMichaelsFailWeapon, iAmmo, TRUE)
WAIT(500)
BREAK
//put player ped into vehicle
CASE MISSION_STAGE_CUTSCENE_AIRPORT
CASE MISSION_STAGE_GET_TO_GRAVEYARD
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
SET_PED_INTO_VEHICLE(GET_PED_INDEX(CHAR_MICHAEL), vsMichaelsCar.VehicleIndex, VS_DRIVER)
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, TRUE, TRUE)
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_FLY_HOME
CASE MISSION_STAGE_END
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
IF NOT IS_PED_SITTING_IN_VEHICLE(GET_PED_INDEX(CHAR_TREVOR), vsTrevorsPlane.VehicleIndex)
SET_PED_INTO_VEHICLE(GET_PED_INDEX(CHAR_TREVOR), vsTrevorsPlane.VehicleIndex, VS_DRIVER)
ENDIF
SET_VEHICLE_ENGINE_ON(vsTrevorsPlane.VehicleIndex, TRUE, TRUE)
ENDIF
ENDIF
BREAK
ENDSWITCH
IF ( bStageSkippedTo = TRUE )
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing player ped invincibility for mission stage being skipped to.")
#ENDIF
ENDIF
IF ( eStage = MISSION_STAGE_GRAVEYARD_SHOOTOUT )
IF ( bGameplayCameraSet = FALSE )
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-16.536800)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-45.0000)
ELSE
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-16.536800)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-72.373550)
ENDIF
bGameplayCameraSet = TRUE
ENDIF
ELSE
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
ENDIF
//handle music for skips/retry/replay of mission stages
SWITCH eStage
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
TRIGGER_MUSIC_EVENT("MIC1_SHOOTOUT_RT")
BREAK
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
TRIGGER_MUSIC_EVENT("MIC1_SKIPPED_TO_KIDNAP")
BREAK
CASE MISSION_STAGE_FLY_HOME
TRIGGER_MUSIC_EVENT("MIC1_FLY_HOME_RT")
BREAK
ENDSWITCH
SWITCH eStage
CASE MISSION_STAGE_GET_TO_AIRPORT
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PLAYER_ANGRY(PLAYER_PED_ID(), TRUE)
ENDIF
BREAK
DEFAULT
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PLAYER_ANGRY(PLAYER_PED_ID(), FALSE)
ENDIF
BREAK
ENDSWITCH
//handle fade in for each mission stage
//some stages start with or require a fade out
SWITCH eStage
CASE MISSION_STAGE_CUTSCENE_INTRO
CASE MISSION_STAGE_CUTSCENE_AIRPORT
CASE MISSION_STAGE_GET_TO_GRAVEYARD
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
CASE MISSION_STAGE_FLY_HOME
//do not fade in, mission stage will handle a fade in from fade out
#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
//fade in
#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(DEFAULT_FADE_TIME)
ENDIF
BREAK
ENDSWITCH
ENDIF
iSetupProgress++
ENDIF
//handle setting of mid-mission replay checkpoints
IF ( iSetupProgress = 11 )
SWITCH eStage
CASE MISSION_STAGE_GET_TO_AIRPORT
//don't store replay checkpoint vehicle here, the replay start vehicle can be used here
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_AIRPORT), "GET TO AIRPORT", FALSE, FALSE, NULL, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_AIRPORT), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
//store replay checkpoint vehicle here
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_FLY_TO_NORTH_YANKTON), "FLY TO NORTH YANKTON", FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_FLY_TO_NORTH_YANKTON), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
CASE MISSION_STAGE_GET_TO_GRAVEYARD
//don't store replay checkpoint vehicle here
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_GRAVEYARD), "GET TO GRAVEYARD", FALSE, FALSE, NULL, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_GRAVEYARD), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
CASE MISSION_STAGE_GET_TO_GRAVE
//don't store replay checkpoint vehicle here
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_GRAVE), "GET TO GRAVE", FALSE, FALSE, NULL, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_GRAVE), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
//don't store replay checkpoint vehicle here
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_GRAVEYARD_SHOOTOUT), "GRAVEYARD SHOOTOUT", FALSE, FALSE, NULL, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_GRAVEYARD_SHOOTOUT), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
CASE MISSION_STAGE_FLY_HOME
//don't store replay checkpoint vehicle here
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_FLY_HOME), "FLY HOME", TRUE, FALSE, NULL, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_FLY_HOME), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
ENDSWITCH
iSetupProgress++
ENDIF
//print the message only once per mission stage
IF ( iSetupProgress = 12 )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished mission stage loading for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
bStageLoaded = TRUE
bStageReplayed = FALSE
bStageSkippedTo = FALSE
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
iSetupProgress++
ENDIF
IF ( iSetupProgress = 13 )
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
//|============================ COMBAT PROCEDURES & FUNCTIONS ============================|
FUNC PED_INDEX CREATE_ENEMY_PED(MODEL_NAMES modelName, VECTOR vPosition, FLOAT fHeading, REL_GROUP_HASH group,
WEAPON_TYPE eWeaponType = WEAPONTYPE_UNARMED, WEAPONCOMPONENT_TYPE eWeaponComponent = WEAPONCOMPONENT_INVALID,
BOOL bDucking = FALSE, INT iHealth = 200, INT iArmour = 0)
PED_INDEX PedIndex = CREATE_PED(PEDTYPE_MISSION, modelName, vPosition, fHeading)
SET_PED_COMPONENT_VARIATION(PedIndex, PED_COMP_HAIR, 1, 0)
//enemy health and armor
SET_PED_MAX_HEALTH(PedIndex, iHealth)
SET_ENTITY_HEALTH(PedIndex, iHealth)
ADD_ARMOUR_TO_PED(PedIndex, iArmour)
SET_PED_DIES_WHEN_INJURED(PedIndex, TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(PedIndex, group)
SET_PED_AS_ENEMY(PedIndex, TRUE)
SET_PED_TARGET_LOSS_RESPONSE(PedIndex, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_ENABLE_TACTICAL_POINTS_WHEN_DEFENSIVE, TRUE)
//enemy weapons
GIVE_WEAPON_TO_PED(PedIndex, eWeaponType, INFINITE_AMMO, TRUE)
SET_CURRENT_PED_WEAPON(PedIndex, eWeaponType, TRUE)
SET_PED_INFINITE_AMMO(PedIndex, TRUE, eWeaponType)
IF ( eWeaponComponent <> WEAPONCOMPONENT_INVALID )
GIVE_WEAPON_COMPONENT_TO_PED(PedIndex, eWeaponType, eWeaponComponent)
ENDIF
SET_PED_DUCKING(PedIndex, bDucking)
//disable ped being able to climb
SET_PED_PATH_CAN_USE_CLIMBOVERS(PedIndex, FALSE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_DisableHurt, TRUE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_KeepRelationshipGroupAfterCleanUp, TRUE)
SET_COMBAT_FLOAT(PedIndex, CCF_TIME_TO_INVALIDATE_INJURED_TARGET, 30.0)
//add ped to be watched by headshot stat
INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(PedIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created enemy ped with model ", GET_MODEL_NAME_FOR_DEBUG(modelName), " at coordinates ", vPosition, ".")
#ENDIF
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, WEAPONCOMPONENT_TYPE eWeaponComponent = WEAPONCOMPONENT_INVALID,
INT iHealth = 200, INT iArmour = 0)
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, eWeaponComponent, FALSE, iHealth, iArmour)
SET_PED_INTO_VEHICLE(ped, vehicleIndex, eSeat)
ENDIF
RETURN ped
ENDFUNC
PROC SET_ENEMY_PED_PROPERTIES(PED_INDEX PedIndex, REL_GROUP_HASH group, WEAPON_TYPE eWeaponType = WEAPONTYPE_UNARMED, BOOL bCanClimb = FALSE,
INT iHealth = 200, INT iArmour = 0, BOOL bKeepRelGroupOnCleanup = TRUE)
IF DOES_ENTITY_EXIST(PedIndex)
IF NOT IS_PED_INJURED(PedIndex)
SET_ENTITY_AS_MISSION_ENTITY(PedIndex, TRUE)
GIVE_WEAPON_TO_PED(PedIndex, eWeaponType, INFINITE_AMMO, FALSE)
SET_PED_INFINITE_AMMO(PedIndex, TRUE, eWeaponType)
SET_PED_MAX_HEALTH(PedIndex, iHealth)
SET_ENTITY_HEALTH(PedIndex, iHealth)
ADD_ARMOUR_TO_PED(PedIndex, iArmour)
SET_PED_DIES_WHEN_INJURED(PedIndex, TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(PedIndex, group)
SET_PED_AS_ENEMY(PedIndex, TRUE)
SET_PED_TARGET_LOSS_RESPONSE(PedIndex, TLR_NEVER_LOSE_TARGET)
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_USE_VEHICLE, FALSE)
//disable ped being able to climb
SET_PED_PATH_CAN_USE_CLIMBOVERS(PedIndex, bCanClimb)
SET_PED_CONFIG_FLAG(PedIndex, PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_KeepRelationshipGroupAfterCleanUp, bKeepRelGroupOnCleanup)
//add ped to be watched by headshot stat
INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(PedIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Set enemy ped properties.")
#ENDIF
ENDIF
ENDIF
ENDPROC
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)
TASK_STAND_STILL(esEnemies[i].PedIndex, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esEnemies[i].PedIndex, TRUE)
IF ( bAddBlips = TRUE )
esEnemies[i].BlipIndex = CREATE_BLIP_FOR_ENTITY(esEnemies[i].PedIndex, TRUE)
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)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Initialised enemy ped with debug name ", tlDebugName, ".")
ENDIF
#ENDIF
ENDIF
ENDFOR
ENDPROC
PROC ADD_BLIPS_FOR_ENEMY_GROUP(ENEMY_STRUCT &esEnemies[])
INT i = 0
FOR i = 0 TO ( COUNT_OF(esEnemies) - 1 )
IF DOES_ENTITY_EXIST(esEnemies[i].PedIndex)
IF NOT IS_PED_INJURED(esEnemies[i].PedIndex)
IF NOT DOES_BLIP_EXIST(esEnemies[i].BlipIndex)
esEnemies[i].BlipIndex = CREATE_BLIP_FOR_ENTITY(esEnemies[i].PedIndex, TRUE)
ENDIF
ENDIF
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)
ELSE
CLEANUP_AI_PED_BLIP(array[i].EnemyBlipData)
ENDIF
ENDFOR
ENDPROC
PROC BLOCK_WEAPON_FIRE_FOR_ENEMY_GROUP(ENEMY_STRUCT &array[])
INT i
FOR i = 0 TO ( COUNT_OF(array) - 1 )
IF DOES_ENTITY_EXIST(array[i].PedIndex)
IF NOT IS_ENTITY_DEAD(array[i].PedIndex)
SET_PED_RESET_FLAG(array[i].PedIndex, PRF_BlockWeaponFire, TRUE)
ENDIF
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)
ENDIF
ENDPROC
PROC SET_PED_COMBAT_MOVEMENT_VALUES(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
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 SET_PED_SHOOTING_PROPERTIES(PED_INDEX PedIndex, INT iAccuracy, INT iShootRate = 100, 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_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
FUNC INT GET_NUMBER_OF_ENEMIES_ALIVE(ENEMY_STRUCT &esArray[])
INT i = 0
INT iEnemiesAlive = 0
FOR i = 0 TO ( COUNT_OF(esArray) - 1 )
IF DOES_ENTITY_EXIST(esArray[i].PedIndex)
IF NOT IS_PED_INJURED(esArray[i].PedIndex)
iEnemiesAlive++
ENDIF
ENDIF
ENDFOR
RETURN iEnemiesAlive
ENDFUNC
FUNC INT GET_NUMBER_OF_ENEMIES_DEAD(ENEMY_STRUCT &esArray[])
INT i = 0
INT iEnemiesDead = 0
FOR i = 0 TO (COUNT_OF(esArray) - 1)
IF ( esArray[i].bCreated = TRUE )
IF DOES_ENTITY_EXIST(esArray[i].PedIndex)
IF IS_PED_INJURED(esArray[i].PedIndex)
OR IS_ENTITY_DEAD(esArray[i].PedIndex)
iEnemiesDead++
ENDIF
ELSE
iEnemiesDead++
ENDIF
ENDIF
ENDFOR
RETURN iEnemiesDead
ENDFUNC
/// PURPOSE:
/// Checks if all enemy peds in specified group are dead.
/// If this group has not been created yet, it will be treated as dead.
/// PARAMS:
/// esArray - Enemy ped array to check.
/// RETURNS:
/// TRUE if all created enemy peds from specified group are dead, or if the peds have not yet been created.
/// FALSE if otherwise.
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
ENDIF
ENDFOR
RETURN TRUE
ENDFUNC
PROC GO_TO_ENEMY_STATE(ENEMY_STRUCT &enemy, ENEMY_STATES eNewEnemyState)
enemy.bHasTask = FALSE
enemy.eState = eNewEnemyState
#IF IS_DEBUG_BUILD
IF NOT IS_STRING_NULL_OR_EMPTY(enemy.sDebugName)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Sending enemy ped with debug name ", enemy.sDebugName, " to state ", GET_ENEMY_STATE_NAME_FOR_DEBUG(eNewEnemyState), ".")
ENDIF
#ENDIF
ENDPROC
FUNC BOOL IS_ENEMY_IN_ENEMY_STATE(ENEMY_STRUCT &enemy, ENEMY_STATES eEnemyState)
IF DOES_ENTITY_EXIST(enemy.PedIndex)
IF NOT IS_PED_INJURED(enemy.PedIndex)
IF ( enemy.eState = eEnemyState )
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC VEHICLE_INDEX CREATE_ENEMY_VEHICLE(VEH_STRUCT &sVehicle, INT iHealth = 1000, BOOL bCreateBlip = FALSE, BOOL bConsideredByPlayer = FALSE, BOOL bDriveable = TRUE, BOOL bCanBeTargetted = FALSE,
LOCK_STATE eLockState = VEHICLELOCK_UNLOCKED, INT iColour1 = -1, INT iColour2 = -1,
BOOL bFrozen = FALSE #IF IS_DEBUG_BUILD, STRING sDebugName = NULL #ENDIF)
VEHICLE_INDEX VehicleIndex = CREATE_VEHICLE(sVehicle.ModelName, sVehicle.vPosition, sVehicle.fHeading)
//vehicle health
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_UNDRIVEABLE(VehicleIndex, NOT bDriveable)
SET_VEHICLE_CAN_BE_TARGETTED(VehicleIndex, bCanBeTargetted)
SET_VEHICLE_DOORS_LOCKED(VehicleIndex, eLockState)
//disable radio
SET_VEHICLE_RADIO_ENABLED(VehicleIndex, FALSE)
IF ( bCreateBlip = TRUE )
IF NOT DOES_BLIP_EXIST(sVehicle.BlipIndex)
sVehicle.BlipIndex = CREATE_BLIP_FOR_VEHICLE(VehicleIndex, TRUE)
ENDIF
ENDIF
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
IF ( bFrozen = TRUE )
FREEZE_ENTITY_POSITION(VehicleIndex, bFrozen)
SET_VEHICLE_STAYS_FROZEN_WHEN_CLEANED_UP(VehicleIndex, bFrozen)
ENDIF
#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
PROC COMBAT_SEQUENCE_GO_TO_COMBAT(PED_INDEX PedIndex, FLOAT fRange = 100.0)
IF NOT IS_PED_INJURED(PedIndex)
SEQUENCE_INDEX SequenceIndex
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, fRange)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
ENDIF
ENDPROC
PROC COMBAT_SEQUENCE_GO_TO_COORD_THEN_COMBAT(PED_INDEX PedIndex, VECTOR vDestination, FLOAT fMoveSpeed, INT iTime = DEFAULT_TIME_BEFORE_WARP, BOOL bUseNavmesh = TRUE,
FLOAT fRange = 100.0, 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, iTime, fRadius, eNavigationFlags)
ELSE
TASK_GO_STRAIGHT_TO_COORD(NULL, vDestination, fMoveSpeed, iTime)
ENDIF
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, fRange)
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 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, FALSE)
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)
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)
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)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, vDestination, EntityIndex, fMoveSpeed, bShootWhileMoving, fTargetDistance, fSlowDistance, bUseNavmesh)
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_COVER_WHILE_AIMING_THEN_COMBAT(PED_INDEX PedIndex, VECTOR vDestination, FLOAT fMoveSpeed,
BOOL bAimAtHatedPeds, VECTOR vAimPosition, ENTITY_INDEX EntityIndex = NULL,
BOOL bShootWhileMoving = FALSE, INT iTimeInCover = 1000, BOOL bCanPeekAndAim = FALSE,
BOOL bForceFaceDirection = FALSE, BOOL bForceFaceLeft = FALSE,
BOOL bAimShootAfterStopped = FALSE, 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, FALSE)
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)
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)
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)
ELSE
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, vDestination, EntityIndex, fMoveSpeed, bShootWhileMoving, fTargetDistance, fSlowDistance, bUseNavmesh)
ENDIF
ENDIF
IF ( bAimShootAfterStopped = TRUE )
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
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, vDestination, iTimeInCover, bCanPeekAndAim, 1.5, bForceFaceDirection, bForceFaceLeft, NULL, TRUE)
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
//|========================== END COMBAT PROCEDURES & FUNCTIONS ==========================|
//|=============================== MISSION STAGES FUNCTIONS ==============================|
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_INTRO_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL )
IF HAS_REQUESTED_CUTSCENE_LOADED("mic_1_int", CS_SECTION_1 | CS_SECTION_2 | CS_SECTION_3 | CS_SECTION_4)
REGISTER_ENTITY_FOR_CUTSCENE(psTrevor.PedIndex, "Trevor", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_TREVOR))
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ELSE
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
//Michael's variations
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
ENDIF
ENDIF
ELIF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR )
//Activate multihead blinders early
SET_MULTIHEAD_SAFE(TRUE,TRUE)
IF HAS_REQUESTED_CUTSCENE_LOADED("mic_1_int", CS_SECTION_2 | CS_SECTION_3 | CS_SECTION_4 | CS_SECTION_5)
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[0])
IF NOT IS_ENTITY_DEAD(g_sTriggerSceneAssets.ped[0])
SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.ped[0], TRUE, TRUE)
psMichael.PedIndex = g_sTriggerSceneAssets.ped[0]
SET_MISSION_PED_PROPERTIES(psMichael.PedIndex, RELGROUPHASH_PLAYER, FALSE, TRUE, FALSE, FALSE)
#IF IS_DEBUG_BUILD
SET_PED_NAME_DEBUG(psMichael.PedIndex, "TS_Michael")
#ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(psMichael.PedIndex, "Michael", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY, PLAYER_ZERO)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.veh[0])
IF IS_VEHICLE_DRIVEABLE(g_sTriggerSceneAssets.veh[0])
SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.veh[0], TRUE, TRUE)
vsMichaelsCar.VehicleIndex = g_sTriggerSceneAssets.veh[0]
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, TRUE, TRUE)
SET_VEHICLE_LIGHTS(vsMichaelsCar.VehicleIndex, SET_VEHICLE_LIGHTS_ON)
SET_VEHICLE_USE_PLAYER_LIGHT_SETTINGS(vsMichaelsCar.VehicleIndex, TRUE)
SET_VEHICLE_DOORS_LOCKED(vsMichaelsCar.VehicleIndex, VEHICLELOCK_UNLOCKED)
REGISTER_ENTITY_FOR_CUTSCENE(vsMichaelsCar.VehicleIndex, "Michaels_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, TAILGATER)
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsMichaelsCar.VehicleIndex, "TS_Michaels_Car")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Registering trigger scene vehicle for intro cutscene as Michaels_car.")
#ENDIF
ELSE
SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.veh[0], TRUE, TRUE)
DELETE_VEHICLE(g_sTriggerSceneAssets.veh[0])
CLEAR_AREA(vsMichaelsCar.vPosition, 10.0, TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(vsMichaelsCar.VehicleIndex, "Michaels_car", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, TAILGATER)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Registering Michaels_car to be created by the cutscene due to trigger scene vehcile being undriveable.")
#ENDIF
ENDIF
ELSE
IF IS_REPLAY_START_VEHICLE_AVAILABLE()
AND GET_REPLAY_VEHICLE_OWNER(TRUE) = CHAR_TREVOR
AND DOES_ENTITY_EXIST(GET_MISSION_START_VEHICLE_INDEX())
AND IS_VEHICLE_DRIVEABLE(GET_MISSION_START_VEHICLE_INDEX(), TRUE)
IF IS_VEHICLE_A_PLAYER_PERSONAL_VEHICLE(GET_MISSION_START_VEHICLE_INDEX(), CHAR_MICHAEL)
SET_ENTITY_AS_MISSION_ENTITY(GET_MISSION_START_VEHICLE_INDEX(), TRUE, TRUE)
vsMichaelsCar.VehicleIndex = GET_MISSION_START_VEHICLE_INDEX()
SET_VEHICLE_AS_MISSION_CRITICAL(vsMichaelsCar, TRUE)
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, TRUE, TRUE)
SET_VEHICLE_LIGHTS(vsMichaelsCar.VehicleIndex, SET_VEHICLE_LIGHTS_ON)
SET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex, GET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
SET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
SET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 2.5)
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT)
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT)
ENDIF
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT)
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT)
ENDIF
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_LEFT)
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_LEFT)
ENDIF
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT)
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(vsMichaelsCar.VehicleIndex, "Michaels_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, TAILGATER)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Registering Trevor's mission start vehicle with intro cutscene as it was player CHAR_MICHAEL personal vehicle.")
#ENDIF
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(vsMichaelsCar.VehicleIndex, "Michaels_car", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, TAILGATER)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Registering Michaels_car to be created by the cutscene due to trigger scene vehicle not existing and CHAR_TREVOR mission start vehicle not being CHAR_MICHAEL personal vehicle.")
#ENDIF
ENDIF
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(vsMichaelsCar.VehicleIndex, "Michaels_car", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, TAILGATER)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Registering Michaels_car to be created by the cutscene due to trigger scene vehicle not existing and mission start vehicle not existing.")
#ENDIF
ENDIF
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
START_CUTSCENE(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ELSE
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
//Trevor's variations
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", PLAYER_PED_ID())
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 IS_VEHICLE_GEN_AVAILABLE(VEHGEN_MICHAEL_SAVEHOUSE)
AND DOES_ENTITY_EXIST(GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MICHAEL_SAVEHOUSE))
AND IS_VEHICLE_DRIVEABLE(GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MICHAEL_SAVEHOUSE), TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Vehicle gen vehicle VEHGEN_MICHAEL_SAVEHOUSE is available for mission use.")
#ENDIF
IF NOT DOES_ENTITY_BELONG_TO_THIS_SCRIPT(GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MICHAEL_SAVEHOUSE))
SET_ENTITY_AS_MISSION_ENTITY(GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MICHAEL_SAVEHOUSE), TRUE, TRUE)
vsMichaelsCar.VehicleIndex = GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MICHAEL_SAVEHOUSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting vehicle gen vehicle VEHGEN_MICHAEL_SAVEHOUSE as mission entity.")
#ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 2.5)
SET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex, GET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
SET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
SET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT)
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT)
ENDIF
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT)
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT)
ENDIF
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_LEFT)
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_LEFT)
ENDIF
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT)
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT)
ENDIF
SET_VEHICLE_AS_MISSION_CRITICAL(vsMichaelsCar, TRUE)
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, FALSE, TRUE)
SET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex, vsMichaelsCar.vPosition)
SET_ENTITY_HEADING(vsMichaelsCar.VehicleIndex, vsMichaelsCar.fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
ENDIF
ENDIF
IF IS_REPLAY_START_VEHICLE_AVAILABLE()
SWITCH GET_REPLAY_VEHICLE_OWNER(TRUE)
CASE CHAR_MICHAEL
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay start vehicle is available for player ped CHAR_MICHAEL.")
#ENDIF
IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE()) AND IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE(), TRUE)
IF IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE()))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Last player CHAR_MICHAEL vehicle is model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE())), " which is allowed for mission.")
#ENDIF
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF NOT IS_ENTITY_A_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
SET_ENTITY_AS_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
ENDIF
vsMichaelsCar.VehicleIndex = GET_PLAYERS_LAST_VEHICLE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting last player CHAR_MICHAEL vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE())), " as mission entity.")
#ENDIF
SET_VEHICLE_AS_MISSION_CRITICAL(vsMichaelsCar, TRUE)
SET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex, GET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
SET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
SET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 2.5)
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT)
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT)
ENDIF
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT)
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT)
ENDIF
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_LEFT)
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_LEFT)
ENDIF
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT)
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT)
ENDIF
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex, TRUE)
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, FALSE, TRUE)
SET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex, vsMichaelsCar.vPosition)
SET_ENTITY_HEADING(vsMichaelsCar.VehicleIndex, vsMichaelsCar.fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
ELSE
DELETE_VEHICLE_GEN_VEHICLE(VEHGEN_MISSION_VEH)
SET_VEHICLE_DOORS_SHUT(GET_PLAYERS_LAST_VEHICLE(), TRUE)
SET_VEHICLE_ENGINE_ON(GET_PLAYERS_LAST_VEHICLE(), FALSE, TRUE)
SET_ENTITY_COORDS(GET_PLAYERS_LAST_VEHICLE(), vsTrevorsCar.vPosition)
SET_ENTITY_HEADING(GET_PLAYERS_LAST_VEHICLE(), vsTrevorsCar.fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(GET_PLAYERS_LAST_VEHICLE())
SET_MISSION_VEHICLE_GEN_VEHICLE(GET_PLAYERS_LAST_VEHICLE(), vsTrevorsCar.vPosition, vsTrevorsCar.fHeading)
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_MISSION_VEH)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting last player CHAR_MICHAEL vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE())), " as mission vehicle gen vehicle.")
#ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Last player CHAR_MICHAEL vehicle is model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE())), " which is not allowed for mission.")
#ENDIF
ENDIF
ENDIF
BREAK
CASE CHAR_TREVOR
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay start vehicle is available for player ped CHAR_TREVOR.")
#ENDIF
IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE())
AND IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE(), TRUE)
AND NOT IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE()))
AND NOT IS_THIS_MODEL_A_PLANE(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE()))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Last player CHAR_TREVOR vehicle is model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE())), " which is allowed for mission.")
#ENDIF
IF NOT IS_VEHICLE_A_PLAYER_PERSONAL_VEHICLE(GET_PLAYERS_LAST_VEHICLE(), CHAR_MICHAEL)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Last player CHAR_TREVOR vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE())), " is not a personal vehicle of ped CHAR_MICHAEL.")
#ENDIF
IF NOT IS_ENTITY_A_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
SET_ENTITY_AS_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
ENDIF
SET_ENTITY_HEALTH(GET_PLAYERS_LAST_VEHICLE(), GET_ENTITY_HEALTH(GET_PLAYERS_LAST_VEHICLE()) + 500)
SET_VEHICLE_ENGINE_HEALTH(GET_PLAYERS_LAST_VEHICLE(), GET_VEHICLE_ENGINE_HEALTH(GET_PLAYERS_LAST_VEHICLE()) + 500)
SET_VEHICLE_PETROL_TANK_HEALTH(GET_PLAYERS_LAST_VEHICLE(), GET_VEHICLE_PETROL_TANK_HEALTH(GET_PLAYERS_LAST_VEHICLE()) + 500)
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(GET_PLAYERS_LAST_VEHICLE()), 2.5)
IF IS_VEHICLE_TYRE_BURST(GET_PLAYERS_LAST_VEHICLE(), SC_WHEEL_CAR_FRONT_LEFT)
SET_VEHICLE_TYRE_FIXED(GET_PLAYERS_LAST_VEHICLE(), SC_WHEEL_CAR_FRONT_LEFT)
ENDIF
IF IS_VEHICLE_TYRE_BURST(GET_PLAYERS_LAST_VEHICLE(), SC_WHEEL_CAR_FRONT_RIGHT)
SET_VEHICLE_TYRE_FIXED(GET_PLAYERS_LAST_VEHICLE(), SC_WHEEL_CAR_FRONT_RIGHT)
ENDIF
IF IS_VEHICLE_TYRE_BURST(GET_PLAYERS_LAST_VEHICLE(), SC_WHEEL_CAR_REAR_LEFT)
SET_VEHICLE_TYRE_FIXED(GET_PLAYERS_LAST_VEHICLE(), SC_WHEEL_CAR_REAR_LEFT)
ENDIF
IF IS_VEHICLE_TYRE_BURST(GET_PLAYERS_LAST_VEHICLE(), SC_WHEEL_CAR_REAR_RIGHT)
SET_VEHICLE_TYRE_FIXED(GET_PLAYERS_LAST_VEHICLE(), SC_WHEEL_CAR_REAR_RIGHT)
ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Last player CHAR_TREVOR vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE())), " is a personal vehicle of ped CHAR_MICHAEL.")
#ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(vsMichaelsCar.VehicleIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Overriding replay checkpoint vehicle with vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(vsMichaelsCar.VehicleIndex)), ".")
#ENDIF
ENDIF
DISABLE_VEHICLE_GEN_ON_MISSION(TRUE)
//DELETE_VEHICLE_GEN_VEHICLE(VEHGEN_MICHAEL_SAVEHOUSE)
LOCK_AUTOMATIC_DOOR_OPEN(AUTODOOR_MICHAEL_MANSION_GATE, TRUE)
CLEAR_AREA(psMichael.vPosition, 25.0, TRUE)
CLEAR_AREA_OF_PEDS(psMichael.vPosition, 250.0)
CLEAR_AREA_OF_VEHICLES(psMichael.vPosition, 250.0)
CLEAR_AREA_OF_PROJECTILES(psMichael.vPosition, 250.0)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE)
ENDIF
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 2
//create player peds by extracting them from mocap cutscene
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL )
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
#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 vehicles during mocap cutscene
IF IS_CUTSCENE_PLAYING()
//create Michael's car for the mission
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
IF IS_REPLAY_START_VEHICLE_AVAILABLE()
AND DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE())
AND IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE())
AND IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE()))
vsMichaelsCar.VehicleIndex = GET_PLAYERS_LAST_VEHICLE()
IF NOT IS_ENTITY_A_MISSION_ENTITY(vsMichaelsCar.VehicleIndex)
SET_ENTITY_AS_MISSION_ENTITY(vsMichaelsCar.VehicleIndex)
ENDIF
SET_VEHICLE_AS_MISSION_CRITICAL(vsMichaelsCar, TRUE)
SET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex, vsMichaelsCar.vPosition)
SET_ENTITY_HEADING(vsMichaelsCar.VehicleIndex, vsMichaelsCar.fHeading)
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex)
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
SET_VEHICLE_DOORS_LOCKED(vsMichaelsCar.VehicleIndex, VEHICLELOCK_UNLOCKED)
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsMichaelsCar.VehicleIndex, "RS_Michaels_Car")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Using player's replay start vehicle as Michael's mission vehicle for player to use.")
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating Michael's car during intro cutscene for player to use.")
#ENDIF
HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL, TRUE, -1, -1, -1 #IF IS_DEBUG_BUILD, "M_Michaels_Car" #ENDIF)
ENDIF
BREAK
CASE CHAR_TREVOR
IF DOES_CUTSCENE_ENTITY_EXIST("Michaels_car")
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Michaels_car"))
vsMichaelsCar.VehicleIndex = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Michaels_car"))
SET_VEHICLE_AS_MISSION_CRITICAL(vsMichaelsCar, TRUE)
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, TRUE, TRUE)
SET_VEHICLE_LIGHTS(vsMichaelsCar.VehicleIndex, SET_VEHICLE_LIGHTS_ON)
SET_VEHICLE_USE_PLAYER_LIGHT_SETTINGS(vsMichaelsCar.VehicleIndex, TRUE)
SET_VEHICLE_DOORS_LOCKED(vsMichaelsCar.VehicleIndex, VEHICLELOCK_UNLOCKED)
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsMichaelsCar.VehicleIndex, "CS_Michaels_Car")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created vehicle Michaels_car from the cutscene.")
#ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ELSE
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
REQUEST_VEHICLE_HIGH_DETAIL_MODEL(vsMichaelsCar.VehicleIndex)
ENDIF
ENDIF
//create Trevor's car parked in the back of the driveway
IF NOT DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
//don't create Trevor's car when player is Michael
BREAK
CASE CHAR_TREVOR
IF IS_REPLAY_START_VEHICLE_AVAILABLE() AND GET_REPLAY_VEHICLE_OWNER(TRUE) = CHAR_TREVOR
AND DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE()) AND IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE())
vsTrevorsCar.VehicleIndex = GET_PLAYERS_LAST_VEHICLE()
IF NOT IS_ENTITY_A_MISSION_ENTITY(vsTrevorsCar.VehicleIndex)
SET_ENTITY_AS_MISSION_ENTITY(vsTrevorsCar.VehicleIndex)
ENDIF
SET_VEHICLE_AS_MISSION_CRITICAL(vsTrevorsCar, TRUE)
SET_ENTITY_COORDS(vsTrevorsCar.VehicleIndex, vsTrevorsCar.vPosition)
SET_ENTITY_HEADING(vsTrevorsCar.VehicleIndex, vsTrevorsCar.fHeading)
SET_VEHICLE_DOORS_SHUT(vsTrevorsCar.VehicleIndex)
SET_VEHICLE_ON_GROUND_PROPERLY(vsTrevorsCar.VehicleIndex)
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsTrevorsCar.VehicleIndex, "RS_Trevors_Car")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Using player's replay start vehicle as Trevor's mission vehicle for player to use.")
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating Trevor's car during intro cutscene for player to use.")
#ENDIF
HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsCar, TRUE, FALSE, CHAR_TREVOR, TRUE, -1, -1, -1 #IF IS_DEBUG_BUILD, "M_Trevors_Car" #ENDIF)
ENDIF
BREAK
ENDSWITCH
ELSE
IF NOT IS_ENTITY_DEAD(vsTrevorsCar.VehicleIndex)
REQUEST_VEHICLE_HIGH_DETAIL_MODEL(vsTrevorsCar.VehicleIndex)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_car")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Michaels_car.")
#ENDIF
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
//don't do anything when playing mission as Michael
BREAK
CASE CHAR_TREVOR
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, TRUE, TRUE)
SET_VEHICLE_FORWARD_SPEED(vsMichaelsCar.VehicleIndex, 10.0)
SET_VEHICLE_DOORS_LOCKED(vsMichaelsCar.VehicleIndex, VEHICLELOCK_UNLOCKED)
ENDIF
BREAK
ENDSWITCH
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Michael.")
#ENDIF
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF ( bCutsceneSkipped = FALSE )
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
WARP_PED(PLAYER_PED_ID(), <<-808.4427, 177.8966, 71.3801>>, 18.2986, FALSE, TRUE, FALSE)
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -809.27, 179.55, 71.15 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -811.32, 180.11, 71.15 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -813.92, 179.22, 71.16 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_STOP_EXACTLY, 111.3824)
ELSE
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -809.27, 179.55, 71.15 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -811.32, 180.11, 71.15 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -813.17, 179.48, 71.16 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -813.92, 179.22, 71.16 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_SUPPRESS_EXACT_STOP)
ENDIF
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_RUN, FALSE, FAUS_CUTSCENE_EXIT)
ELSE
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
WARP_PED(PLAYER_PED_ID(), <<-813.9473, 179.2056, 71.1592>>, 111.3824, FALSE, TRUE, FALSE)
ENDIF
ENDIF
BREAK
CASE CHAR_TREVOR
//
BREAK
ENDSWITCH
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
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
IF NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
SET_PED_INTO_VEHICLE(psTrevor.PedIndex, vsMichaelsCar.VehicleIndex, VS_DRIVER)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE CHAR_TREVOR
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON
bBlockVehicleFirstPersonCamera = TRUE //start blocking first person vehicle camera
iBlockVehicleFirstPersonCameraTimer = GET_GAME_TIMER() //start first person vehicle camera blocking timer, see B*2031566
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF GET_IS_WAYPOINT_RECORDING_LOADED("mic1_tdrive")
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, VS_DRIVER)
ENDIF
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, TRUE, TRUE)
SET_VEHICLE_FORWARD_SPEED(vsMichaelsCar.VehicleIndex, 10.0)
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, "mic1_tdrive",
DRIVINGMODE_AVOIDCARS_RECKLESS, 0, EWAYPOINT_START_FROM_CLOSEST_POINT)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA(TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_CAMERA() returned true for camera.")
#ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
ENDIF
IF HAS_CUTSCENE_FINISHED()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Intro mocap cutscene has finished.")
#ENDIF
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL AND HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL) )
OR ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR AND HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsCar, TRUE, FALSE, CHAR_TREVOR) AND HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL) )
IF IS_INTERIOR_READY(GET_INTERIOR_AT_COORDS(vInteriorPosition))
UNPIN_INTERIOR(GET_INTERIOR_AT_COORDS(vInteriorPosition))
ENDIF
REPLAY_STOP_EVENT()
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
REPLAY_RECORD_BACK_FOR_TIME(0.0, 15.0, REPLAY_IMPORTANCE_HIGHEST)
ELSE
REPLAY_RECORD_BACK_FOR_TIME(0.0, 7.0, REPLAY_IMPORTANCE_HIGHEST)
ENDIF
MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_MISSION_MICHAEL_1)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
RETURN TRUE
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
REQUEST_WAYPOINT_RECORDING("mic1_tdrive")
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Handles cell phone conversations for Michael and Trevor when they drive to the airports.
/// PARAMS:
/// iMichaelProgress -
/// iTrevorProgress -
PROC MANAGE_CONVERSATIONS_DURING_AIRPORT_RIDE(INT &iMichaelProgress, INT &iTrevorProgress)
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
SWITCH iMichaelProgress
CASE 0
//IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
psMichael.iConversationTimer = GET_GAME_TIMER()
iMichaelProgress++
//ENDIF
BREAK
CASE 1
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_TTMC")
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
IF NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
IF IS_PED_IN_ANY_VEHICLE(psTrevor.PedIndex)
IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY(PLAYER_PED_ID(), GET_VEHICLE_PED_IS_USING(psTrevor.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(sMichael1Conversation, "MCH1AUD", "MCH1_TTMC", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("MCH1_TTMC", TRUE)
ENDIF
ELSE
IF NOT IS_AMBIENT_SPEECH_PLAYING(PLAYER_PED_ID())
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), "MCH1_AEAA", "MICHAEL", SPEECH_PARAMS_FORCE_NORMAL)
SET_LABEL_AS_TRIGGERED("MCH1_TTMC", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
SET_LABEL_AS_TRIGGERED("MCH1_TTMC", TRUE)
ENDIF
ENDIF
IF ( bMichaelTrevorPhoneCallTriggered = FALSE )
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
//IF HAS_TIME_PASSED(10000, psMichael.iConversationTimer)
IF NOT DOES_ENTITY_EXIST(psTrevor.PedIndex) //when Trevor is removed
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF NOT DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_TREVOR))
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 2) //remove Trevor from dialogue
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 2, NULL, "TREVOR") //add Trevor for dialogue with ped index null
ENDIF
IF PLAYER_CALL_CHAR_CELLPHONE(sMichael1Conversation, CHAR_TREVOR, "MCH1AUD", "MCH1_CP01M", CONV_PRIORITY_VERY_HIGH)
REQUEST_ANIM_DICT("missmic1ig_zero_hit_wheel")
bMichaelTrevorPhoneCallTriggered = TRUE
iMichaelProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
psMichael.iConversationTimer = GET_GAME_TIMER()
iMichaelProgress++
ENDIF
BREAK
CASE 3
REQUEST_ANIM_DICT("missmic1ig_zero_hit_wheel")
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF HAS_ANIM_DICT_LOADED("missmic1ig_zero_hit_wheel")
IF HAS_TIME_PASSED(2000, psMichael.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 CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_MSHIT", CONV_PRIORITY_MEDIUM)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())))
TASK_PLAY_ANIM(PLAYER_PED_ID(), "missmic1ig_zero_hit_wheel", "michael_hit_wheel",
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_SECONDARY | AF_UPPERBODY)
ENDIF
ENDIF
ENDIF
iMichaelProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 4
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
psMichael.iConversationTimer = GET_GAME_TIMER()
iMichaelProgress++
ENDIF
BREAK
CASE 5
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF HAS_TIME_PASSED(3500, psMichael.iConversationTimer)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF PLAYER_CALL_CHAR_CELLPHONE(sMichael1Conversation, CHAR_DAVE, "MCH1AUD", "MCH1_CP02", CONV_PRIORITY_VERY_HIGH)
REMOVE_ANIM_DICT("missmic1ig_zero_hit_wheel")
iMichaelProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
//check for locates header destination blip
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
ELSE //destination blip does not exist, player is out of the vehicle or wanted
//handle wanted level dialogue when it gets added
// 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 CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_WNTD", CONV_PRIORITY_HIGH)
// bConversationPaused = TRUE
// 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
SWITCH iTrevorProgress
CASE 0
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip) //this blip will exist but will not be displayed
IF NOT IS_PED_INJURED(PLAYER_PED_ID()) //player as Trevor can now use any vehicle
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
OR ( GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), psTrevor.vPosition) > 100.0 )
psTrevor.iConversationTimer = GET_GAME_TIMER()
iTrevorProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF ( bMichaelTrevorPhoneCallTriggered = FALSE )
IF ( bSafeToStartMichaelsCall = TRUE )
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
OR ( GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), psTrevor.vPosition) > 100.0 )
IF HAS_TIME_PASSED(10000, psTrevor.iConversationTimer)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF NOT DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_MICHAEL))
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 0) //remove Michael from dialogue
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 0, NULL, "MICHAEL") //add Michael for dialogue with ped index null
ENDIF
IF CHAR_CALL_PLAYER_CELLPHONE_FORCE_ANSWER(sMichael1Conversation, CHAR_MICHAEL, "MCH1AUD", "MCH1_CP01T", CONV_PRIORITY_VERY_HIGH)
bMichaelTrevorPhoneCallTriggered = TRUE
iTrevorProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELIF ( bMichaelTrevorPhoneCallTriggered = TRUE )
iTrevorProgress++
ENDIF
BREAK
CASE 2
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
psTrevor.iConversationTimer = GET_GAME_TIMER()
iTrevorProgress++
ENDIF
BREAK
CASE 3
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
OR ( GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), psTrevor.vPosition) > 100.0 )
//check if the player is not too close to the airport, so that the phone call with Ron makes sense
//and not in the plane already
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<1738.423584,3291.455322,40.149773>>, << 500.0, 500.0, 50.0 >>)
AND NOT IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
IF HAS_TIME_PASSED(5000, psTrevor.iConversationTimer)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF PLAYER_CALL_CHAR_CELLPHONE(sMichael1Conversation, CHAR_RON, "MCH1AUD", "MCH1_CP03", CONV_PRIORITY_VERY_HIGH)
iTrevorProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ELSE //if player is too close to the airport on in the plane already, then skip the conversation with Ron completely
iTrevorProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC
FUNC BOOL IS_PLAYER_IN_CONTROL_OF_VEHICLE(VEHICLE_INDEX VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), VehicleIndex)
INT iXValue, iYValue
iXValue = ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_VEH_MOVE_LR) * 255.0)
iYValue = ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_VEH_MOVE_UD) * 255.0)
IF (iXValue < -50 OR iXValue > 50)
OR (iYValue < -50 OR iYValue > 50)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_AIM)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_EXIT)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_HORN)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_BRAKE)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ATTACK)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_HANDBRAKE)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_DUCK)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
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 MANAGE_TREVOR_DRIVING_OUT(PED_STRUCT &ped, INT &iProgress)
IF DOES_ENTITY_EXIST(ped.PedIndex)
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
SWITCH iProgress
CASE 0
REQUEST_WAYPOINT_RECORDING("mic1_tdrive")
IF GET_IS_WAYPOINT_RECORDING_LOADED("mic1_tdrive")
IF NOT IS_PED_IN_VEHICLE(ped.PedIndex, vsMichaelsCar.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
SET_PED_INTO_VEHICLE(ped.PedIndex, vsMichaelsCar.VehicleIndex, VS_DRIVER)
ENDIF
ENDIF
CLEAR_AREA_OF_PROJECTILES(vsMichaelsCar.vPosition, 5.0)
SET_PED_CONFIG_FLAG(ped.PedIndex, PCF_GetOutBurningVehicle, FALSE)
SET_PED_CONFIG_FLAG(ped.PedIndex, PCF_GetOutUndriveableVehicle, FALSE)
CREATE_TRACKED_POINT_FOR_COORD(iCarTrackedPoint, vsMichaelsCar.vPosition, 4.5)
ped.iTimer = GET_GAME_TIMER()
iProgress++
ENDIF
BREAK
CASE 1
IF HAS_TIME_PASSED(15000, ped.iTimer)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << -818.93, 180.14, 70.23 >>, << -817.07, 175.22, 75.23 >>, 3.5) //front door exterior
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << -791.74, 177.00, 71.33 >>, << -799.15, 174.12, 75.83 >>, 3.0) //garden side door
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << -806.57, 185.56, 71.26 >>, << -805.63, 183.03, 73.85 >>, 1.8) //garage door corridor, start Trevor earlier if player is trying to reach garage
OR NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << -817.04, 172.44,68.58 >>, << -791.70, 182.09, 79.83 >>, 18.0) //house
OR ( IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << -818.52, 177.49, 71.02 >>, << -796.41, 186.11, 75.10 >>, 6.5)
AND DOES_TRACKED_POINT_EXIST(iCarTrackedPoint) AND IS_TRACKED_POINT_VISIBLE(iCarTrackedPoint) ) //front hall interior player can see the car
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
IF NOT IS_PED_IN_VEHICLE(ped.PedIndex, vsMichaelsCar.VehicleIndex)
SET_PED_INTO_VEHICLE(ped.PedIndex, vsMichaelsCar.VehicleIndex, VS_DRIVER)
ENDIF
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, TRUE, TRUE)
IF IS_PED_RUNNING(PLAYER_PED_ID())
OR IS_PED_SPRINTING(PLAYER_PED_ID())
SET_VEHICLE_FORWARD_SPEED(vsMichaelsCar.VehicleIndex, 15.0)
ELSE
SET_VEHICLE_FORWARD_SPEED(vsMichaelsCar.VehicleIndex, 12.5)
ENDIF
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(ped.PedIndex, vsMichaelsCar.VehicleIndex, "mic1_tdrive", DRIVINGMODE_AVOIDCARS_RECKLESS)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, TRUE)
CLEANUP_TRACKED_POINT(iCarTrackedPoint)
TRACK_VEHICLE_FOR_IMPOUND(vsMichaelsCar.VehicleIndex, CHAR_MICHAEL) // Send this to Michael's impound when deleted
vsMichaelsCar.bAutoDriveActive = FALSE //use this flag to control the michael's house gate
iProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF GET_SCRIPT_TASK_STATUS(ped.PedIndex, SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) = PERFORMING_TASK
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(vsMichaelsCar.VehicleIndex, GET_STRING_FROM_INT(GET_VEHICLE_WAYPOINT_PROGRESS(vsMichaelsCar.VehicleIndex)), 1.0)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(vsMichaelsCar.VehicleIndex, GET_STRING_FROM_FLOAT(GET_ENTITY_SPEED(vsMichaelsCar.VehicleIndex)), 2.0)
#ENDIF
IF GET_VEHICLE_WAYPOINT_PROGRESS(vsMichaelsCar.VehicleIndex) >= 10
OR IS_ENTITY_AT_COORD(vsMichaelsCar.VehicleIndex,<<-845.781982,159.075562,67.057610>>, << 1.5, 3.0, 2.0 >>)
bShouldDisplayMichaelsObjective = TRUE
ENDIF
IF GET_VEHICLE_WAYPOINT_PROGRESS(vsMichaelsCar.VehicleIndex) >= 45 //50
OR ( GET_VEHICLE_WAYPOINT_PROGRESS(vsMichaelsCar.VehicleIndex) >= 35 AND GET_DISTANCE_BETWEEN_PEDS(ped.PedIndex, PLAYER_PED_ID()) > 25.0 )
IF NOT IS_ENTITY_ON_SCREEN(vsMichaelsCar.VehicleIndex)
OR IS_ENTITY_OCCLUDED(vsMichaelsCar.VehicleIndex)
DELETE_PED(ped.PedIndex)
DELETE_VEHICLE(vsMichaelsCar.VehicleIndex)
REMOVE_WAYPOINT_RECORDING("mic1_tdrive")
ELSE
TASK_VEHICLE_MISSION_PED_TARGET(ped.PedIndex, vsMichaelsCar.VehicleIndex, PLAYER_PED_ID(), MISSION_FLEE, 20.0, DRIVINGMODE_AVOIDCARS_RECKLESS, 1000.0, 10.0)
SET_PED_KEEP_TASK(ped.PedIndex, TRUE)
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsMichaelsCar.VehicleIndex)
REMOVE_WAYPOINT_RECORDING("mic1_tdrive")
ENDIF
ENDIF
//fix for B*1815090
//delete Trevor when he is off screen if the player is using a vehicle to chase after him
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT DOES_TRACKED_POINT_EXIST(iCarTrackedPoint)
CREATE_TRACKED_POINT_FOR_COORD(iCarTrackedPoint, GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 4.0)
ELSE
SET_TRACKED_POINT_INFO(iCarTrackedPoint, GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 4.0)
ENDIF
IF ( GET_VEHICLE_WAYPOINT_PROGRESS(vsMichaelsCar.VehicleIndex) >= 17 AND GET_DISTANCE_BETWEEN_PEDS(ped.PedIndex, PLAYER_PED_ID()) > 35.0 )
IF DOES_TRACKED_POINT_EXIST(iCarTrackedPoint) AND NOT IS_TRACKED_POINT_VISIBLE(iCarTrackedPoint)
DELETE_PED(ped.PedIndex)
DELETE_VEHICLE(vsMichaelsCar.VehicleIndex)
REMOVE_WAYPOINT_RECORDING("mic1_tdrive")
CLEANUP_TRACKED_POINT(iCarTrackedPoint)
ENDIF
ENDIF
//fix for B*1956131 and B*1956140
//delete Trevor's car earlier if player is trying to use a bike
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())))
IF ( GET_VEHICLE_WAYPOINT_PROGRESS(vsMichaelsCar.VehicleIndex) >= 10 )
IF DOES_TRACKED_POINT_EXIST(iCarTrackedPoint) AND NOT IS_TRACKED_POINT_VISIBLE(iCarTrackedPoint)
DELETE_PED(ped.PedIndex)
DELETE_VEHICLE(vsMichaelsCar.VehicleIndex)
REMOVE_WAYPOINT_RECORDING("mic1_tdrive")
CLEANUP_TRACKED_POINT(iCarTrackedPoint)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_MISSION_STAGE_GET_TO_AIRPORT_COMPLETED(INT &iStageProgress)
//don't use locates header J skip
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
MANAGE_CONVERSATIONS_DURING_AIRPORT_RIDE(psMichael.iConversationProgress, psTrevor.iConversationProgress)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
ENDIF
IF IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()
OR IS_PLAYER_CHANGING_CLOTHES() //check if player changed clothes before cutscene
IF HAS_THIS_CUTSCENE_LOADED("mic_1_mcs_1")
OR HAS_CUTSCENE_LOADED()
OR IS_CUTSCENE_ACTIVE()
REMOVE_CUTSCENE() //remove cutscene from memory if player changed clothes
#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(<< -1037.0256, -2735.8008, 19.1693 >>, GET_ENTITY_COORDS(PLAYER_PED_ID())) < DEFAULT_CUTSCENE_LOAD_DIST
//request mocap cutscene for Michael
REQUEST_CUTSCENE("mic_1_mcs_1")
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) //Michael's variations
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting cutscene ped components for cutscene ped Michael from player ped.")
#ENDIF
ENDIF
ELSE
IF HAS_THIS_CUTSCENE_LOADED("mic_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
ENDIF
ENDIF
MANAGE_TREVOR_DRIVING_OUT(psTrevor, iTrevorDriveOutProgress)
SWITCH iStageProgress
CASE 0
SET_VEHICLE_GENERATOR_AREA_OF_INTEREST(<< -1039.57, -2664.37, 12.83 >>, 30.0)
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_1_MIC_DRIVE_TO_AIRPORT")
START_AUDIO_SCENE("MI_1_MIC_DRIVE_TO_AIRPORT")
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK
SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_RUN)
IF ( bPlayerPedScriptTaskInterrupted = FALSE )
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_SPRINT)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_JUMP)
OR (ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_LR) * 255.0) < -20 OR ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_LR) * 255.0) > 20)
OR (ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_UD) * 255.0) < -20 OR ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_UD) * 255.0) > 20)
CLEAR_PED_TASKS(PLAYER_PED_ID())
bPlayerPedScriptTaskInterrupted = TRUE
ENDIF
ENDIF
ENDIF
IF ( bShouldDisplayMichaelsObjective = FALSE )
IF ( iMichaelsObjectiveTimer = 0 )
iMichaelsObjectiveTimer = GET_GAME_TIMER()
ELSE
IF HAS_TIME_PASSED(7500, iMichaelsObjectiveTimer)
bShouldDisplayMichaelsObjective = TRUE
ENDIF
ENDIF
ENDIF
IF ( bShouldDisplayMichaelsObjective = TRUE )
IS_PLAYER_AT_LOCATION_ANY_MEANS(sLocatesData, << -1037.8436, -2655.3862, 12.8312 >>, << 0.25, 0.25, LOCATE_SIZE_HEIGHT >>, TRUE, "MCH1_GTLSIA", TRUE)
ENDIF
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF ( bTaxiLocationSet = FALSE )
SET_TAXI_DROPOFF_LOCATION_FOR_BLIP(sLocatesData.LocationBlip, <<-1051.6487, -2712.0117, 12.7057>>, 241.7918)
bTaxiLocationSet = TRUE
ENDIF
//player can drive or walk into the parking lot locates
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1047.949463,-2649.732422,12.331177>>, <<-1027.131958,-2661.605469,15.981733>>, 7.0)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1037.549438,-2680.126465,12.481735>>, <<-1047.742188,-2670.507324,15.831176>>, 7.0)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1057.455078,-2653.344482,12.331177>>, <<-1047.972046,-2671.035645,15.831175>>, 7.0)
iStageProgress++
ENDIF
//player can only be on foot in this bigger locate
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-962.393799,-2736.521484,11.818534>>, <<-1083.925415,-2666.653564,28.817842>>, 78.0)
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
iStageProgress++
ENDIF
ENDIF
ENDIF
IF IS_INTERIOR_READY(GET_INTERIOR_AT_COORDS(vInteriorPosition)) //unpin the interior if it is pinned and player is away from it
IF ( GET_DISTANCE_BETWEEN_COORDS(psMichael.vPosition, GET_ENTITY_COORDS(PLAYER_PED_ID()), TRUE) > 50.0 )
UNPIN_INTERIOR(GET_INTERIOR_AT_COORDS(vInteriorPosition))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Unpinning interior at coordinates ", vInteriorPosition, " in memory.")
#ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
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()), 4.0)
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
iStageProgress++
ENDIF
ELSE
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
iStageProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF IS_AUDIO_SCENE_ACTIVE("MI_1_MIC_DRIVE_TO_AIRPORT")
STOP_AUDIO_SCENE("MI_1_MIC_DRIVE_TO_AIRPORT")
ENDIF
IS_PLAYER_AT_LOCATION_ANY_MEANS(sLocatesData, << -1037.63, -2737.48, 19.17 >>, << 0.25, 0.25, LOCATE_SIZE_HEIGHT>>, TRUE, "", TRUE)
//print objective to walk to terminal
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GTTE")
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
PRINT_GOD_TEXT_ADVANCED("MCH1_GTTE", DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
ENDIF
ENDIF
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF DOES_BLIP_HAVE_GPS_ROUTE(sLocatesData.LocationBlip)
IF GET_DISTANCE_BETWEEN_COORDS(GET_BLIP_COORDS(sLocatesData.LocationBlip), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 100.0
SET_BLIP_ROUTE(sLocatesData.LocationBlip, FALSE)
ENDIF
ELSE
IF GET_DISTANCE_BETWEEN_COORDS(GET_BLIP_COORDS(sLocatesData.LocationBlip), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 110.0
SET_BLIP_ROUTE(sLocatesData.LocationBlip, TRUE)
ENDIF
ENDIF
ENDIF
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1026.306519,-2741.366699,18.669733>>, <<-1046.329590,-2730.003174,23.169733>>, 18.0)
iStageProgress++
ENDIF
ELSE
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1046.410645,-2736.281982,18.670202>>, <<-1032.384521,-2744.483154,23.170202>>, 17.0)
iStageProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
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()), 4.0)
KILL_ANY_CONVERSATION()
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID())
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
iStageProgress++
ENDIF
ENDIF
ELSE
KILL_ANY_CONVERSATION()
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
iStageProgress++
ENDIF
ENDIF
BREAK
CASE 4
IF NOT DOES_CAM_EXIST(ScriptedCamera)
//create animated camera for establishing shot
DESTROY_ALL_CAMS()
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
SET_CAM_PARAMS(ScriptedCamera, <<-1011.717896,-2738.015137,22.563950>>, <<-0.092603,-0.004846,82.387924>>, 39.955357)
SET_CAM_PARAMS(ScriptedCamera, <<-1012.978027,-2737.459717,22.562250>>, <<0.573072,-0.004846,83.246178>>, 39.955357,
5000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.2)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
psMichael.iTimer = GET_GAME_TIMER()
//task the player to walk to cutscene start coords
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), << -1038.07, -2738.51, 19.17 >>, PEDMOVE_WALK)
ENDIF
ELSE
IF IS_CAM_RENDERING(ScriptedCamera)
IF HAS_TIME_PASSED(4000, psMichael.iTimer)
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), << -1038.07, -2738.51, 19.17 >>, << 2.0, 2.0, 2.0 >>)
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsMichaelsCar.VehicleIndex)
ENDIF
REMOVE_ANIM_DICT("missmic1ig_zero_hit_wheel")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
BREAK
CASE CHAR_TREVOR
FLOAT fDistanceToBlip
VECTOR vOffsetToBlip
VECTOR vPlayerPosition
vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID())
UPDATE_TRIGGERED_LABEL(sLabelTOBJ1)
UPDATE_TRIGGERED_LABEL(sLabelTOBJ2)
UPDATE_TRIGGERED_LABEL(sLabelTGETBCK1)
UPDATE_TRIGGERED_LABEL(sLabelTGETBCK2)
UPDATE_TRIGGERED_LABEL(sLabelTGETIN2)
SWITCH iStageProgress
CASE 0
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_1_TREV_DRIVE_TO_PLANE")
START_AUDIO_SCENE("MI_1_TREV_DRIVE_TO_PLANE")
ENDIF
IF ( psTrevor.iTimer = 0 )
psTrevor.iTimer = GET_GAME_TIMER()
ENDIF
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) = PERFORMING_TASK
IF ( bPlayerPedScriptTaskInterrupted = FALSE )
IF ( psTrevor.iTimer != 0 )
IF HAS_TIME_PASSED(3000, psTrevor.iTimer)
IF IS_PLAYER_IN_CONTROL_OF_VEHICLE(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
CLEAR_PED_TASKS(PLAYER_PED_ID())
bPlayerPedScriptTaskInterrupted = TRUE
ENDIF
ENDIF
IF HAS_TIME_PASSED(10000, psTrevor.iTimer)
CLEAR_PED_TASKS(PLAYER_PED_ID())
bPlayerPedScriptTaskInterrupted = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//need locates header stuff here
IS_PLAYER_AT_LOCATION_ANY_MEANS(sLocatesData, << 1743.932739, 3289.193848, 40.1 >>, << 0.25, 0.25, LOCATE_SIZE_HEIGHT >>, TRUE, sLabelTOBJ1, TRUE)
IF ( bSafeToStartMichaelsCall = FALSE )
//if player is close enough to the desert airport destination (far enough from Michael's house)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<1743.932739,3289.193848,42.103081>>) < 3800.0
bSafeToStartMichaelsCall = TRUE
ELSE
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(PLAYER_PED_ID(), GET_STRING_FROM_FLOAT(GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<1743.932739,3289.193848,42.103081>>)), 1.25)
#ENDIF
ENDIF
ENDIF
//if player walks into the countryside airport locate with car being outside the locate
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<1743.932739,3289.193848,42.103081>>,<<18.000000,12.000000,2.000000>>)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<1739.666504,3280.869141,39.093464>>, <<1726.727661,3328.008057,44.226074>>, 28.0)
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
FailFlags[MISSION_FAIL_TREVORS_CAR_UNDRIVABLE] = FALSE
FailFlags[MISSION_FAIL_TREVORS_CAR_DEAD] = FALSE
FailFlags[MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND] = FALSE
psTrevor.iTimer = GET_GAME_TIMER()
bTrevorFlightActive = TRUE
//set checkpoint reached and store mid mission snapshot vehicle
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_FLY_TO_NORTH_YANKTON), "FLY TO NORTH YANKTON", FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_FLY_TO_NORTH_YANKTON), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eMissionStage), ".")
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player's replay checkpoint vehicle model is ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
ENDIF
#ENDIF
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF (GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) <> vsTrevorsCar.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
IF IS_PED_SITTING_IN_VEHICLE_SEAT(PLAYER_PED_ID(), GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()), VS_DRIVER)
VEHICLE_INDEX TrevorsVehicleIndex
TrevorsVehicleIndex = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(TrevorsVehicleIndex)
IF NOT IS_ENTITY_DEAD(TrevorsVehicleIndex)
IF IS_VEHICLE_DRIVEABLE(TrevorsVehicleIndex)
GET_VEHICLE_SETUP(TrevorsVehicleIndex, TrevorsVehicleData)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Saving vehicle setup for player vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(TrevorsVehicleData.eModel), " for mid-mission checkpoint.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 1
IF IS_AUDIO_SCENE_ACTIVE("MI_1_TREV_DRIVE_TO_PLANE")
STOP_AUDIO_SCENE("MI_1_TREV_DRIVE_TO_PLANE")
ENDIF
//check if player as Trevor is in Trevor's plane
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
//use locates header to take care of the objective and text and blips
IS_PLAYER_AT_LOCATION_IN_VEHICLE(sLocatesData, sLocateFlight.vPosition, sLocateFlight.vSize, FALSE, vsTrevorsPlane.VehicleIndex, sLabelTOBJ2, sLabelTGETIN2, sLabelTGETBCK2, TRUE)
//remove Trevor's plane blip if it exists from previous stage
//when Trevor was driving to the plane
IF DOES_BLIP_EXIST(sLocatesData.vehicleBlip)
IF DOES_BLIP_EXIST(vsTrevorsPlane.BlipIndex)
REMOVE_BLIP(vsTrevorsPlane.BlipIndex)
ENDIF
ENDIF
//move on when player gets inside the plane
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
REPLAY_RECORD_BACK_FOR_TIME(10.0, 3.0, REPLAY_IMPORTANCE_HIGHEST)
TRIGGER_MUSIC_EVENT("MIC1_TREVOR_PLANE")
START_AUDIO_SCENE("MI_1_TREV_FLY_TO_LUDENDORFF")
iStageProgress++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player as Trevor entered the plane.")
#ENDIF
ENDIF
ENDIF
//if by any chance Trevor is performing a sequence which was not cleared during the hotswap call of CLEAR_PED_TASKS
//and now player is unable to control Trevor because he is performing a sequnce, then clear it
//this can for example happen when ped is playing animation of getting in/out of a vehicle
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
IF GET_SCRIPT_TASK_STATUS(psTrevor.PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK
CLEAR_PED_TASKS(psTrevor.PedIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Clearing Trevor player ped tasks. Trevor ped was performing a sequence while being the current player ped enum.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
//check if player as Trevor is in Trevor's plane
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
IF DOES_BLIP_EXIST(sLocatesData.vehicleBlip)
//remove collision flag for the plane entity
SET_ENTITY_LOAD_COLLISION_FLAG(vsTrevorsPlane.VehicleIndex, FALSE)
ENDIF
IF ( bWeatherTypeOvercastSet = FALSE )
SET_WEATHER_TYPE_OVERTIME_PERSIST("OVERCAST", 60.0)
iWeatherTypeTimer = GET_GAME_TIMER()
bWeatherTypeOvercastSet = TRUE
ENDIF
IF ( bWeatherTypeRainSet = FALSE )
IF ( bWeatherTypeOvercastSet = TRUE)
IF ( iWeatherTypeTimer <> 0 AND HAS_TIME_PASSED(60000, iWeatherTypeTimer) )
SET_WEATHER_TYPE_OVERTIME_PERSIST("RAIN", 35.0)
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
PLAY_SOUND_FROM_ENTITY(iRainOnPlaneSoundID, "MIC_1_RAIN_ON_PLANE_MASTER", vsTrevorsPlane.VehicleIndex)
ENDIF
iWeatherTypeTimer = GET_GAME_TIMER()
bWeatherTypeRainSet = TRUE
ENDIF
ENDIF
ENDIF
IF ( bWeatherTypeThunderSet = FALSE )
IF ( bWeatherTypeRainSet = TRUE)
IF ( iWeatherTypeTimer <> 0 AND HAS_TIME_PASSED(35000, iWeatherTypeTimer) )
SET_WEATHER_TYPE_OVERTIME_PERSIST("THUNDER", 35.0)
bWeatherTypeThunderSet = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF NOT DOES_BLIP_EXIST(sLocatesData.vehicleBlip)
//add collision flag for the plane entity
SET_ENTITY_LOAD_COLLISION_FLAG(vsTrevorsPlane.VehicleIndex, TRUE)
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(osGolfBall.ObjectIndex)
IF HAS_MISSION_OBJECT_BEEN_CREATED(osGolfBall, TRUE)
SET_ENTITY_HEADING(osGolfBall.ObjectIndex, 315.0)
SET_ENTITY_VISIBLE(osGolfBall.ObjectIndex, FALSE)
SET_ENTITY_COLLISION(osGolfBall.ObjectIndex, FALSE)
ENDIF
ENDIF
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
fDistanceToBlip = GET_DISTANCE_BETWEEN_COORDS(GET_BLIP_COORDS(sLocatesData.LocationBlip), vPlayerPosition)
IF DOES_ENTITY_EXIST(osGolfBall.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osGolfBall.ObjectIndex)
vOffsetToBlip = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(osGolfBall.ObjectIndex, vPlayerPosition)
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(vsTrevorsPlane.VehicleIndex, GET_STRING_FROM_FLOAT(fDistanceToBlip), 1.25)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(vsTrevorsPlane.VehicleIndex, GET_STRING_FROM_FLOAT(vOffsetToBlip.y), 2.0)
DRAW_DEBUG_SPHERE(GET_BLIP_COORDS(sLocatesData.LocationBlip), 500, 0, 0, 255, 128)
#ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_TRON")
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF fDistanceToBlip > 0 AND fDistanceToBlip < 2200
SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER(CHAR_RON, "MCH1_TRON", TXTMSG_UNLOCKED, TXTMSG_CRITICAL)
SET_LABEL_AS_TRIGGERED("MCH1_TRON", TRUE)
ENDIF
ENDIF
ENDIF
IF IS_PLAYER_AT_LOCATION_IN_VEHICLE(sLocatesData, << sLocateFlight.vPosition.x, sLocateFlight.vPosition.y, vPlayerPosition.z >>, sLocateFlight.vSize, FALSE, vsTrevorsPlane.VehicleIndex, sLabelTOBJ2, sLabelTGETIN2, sLabelTGETBCK2, TRUE)
OR ( DOES_BLIP_EXIST(sLocatesData.LocationBlip) AND vOffsetToBlip.y > 0 AND fDistanceToBlip > 0 AND fDistanceToBlip < 500 ) //plane in front of blip
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
TRIGGER_MUSIC_EVENT("MIC1_FLIGHT_ARRIVING")
iStageProgress++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player as Trevor entered the North Yankton flight locate.")
#ENDIF
ENDIF
ENDIF
//stop Trevor's plane recording playback when player is playing as Trevor
//switch off Trevor's plane invincibility
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsTrevorsPlane.VehicleIndex)
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
STOP_PLAYBACK_RECORDED_VEHICLE(vsTrevorsPlane.VehicleIndex)
SET_ENTITY_INVINCIBLE(vsTrevorsPlane.VehicleIndex, FALSE)
SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(vsTrevorsPlane.VehicleIndex, TRUE)
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
//remove Michael's car
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
DELETE_VEHICLE(vsMichaelsCar.VehicleIndex)
ENDIF
//remove Trevor's car
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
DELETE_VEHICLE(vsTrevorsCar.VehicleIndex)
ENDIF
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
CLEANUP_MISSION_OBJECT(osGolfBall, TRUE)
//also remove Trevor's plane on fade out
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsTrevorsPlane.VehicleIndex)
ENDIF
IF NOT HAS_SOUND_FINISHED(iRainOnPlaneSoundID)
STOP_SOUND(iRainOnPlaneSoundID)
ENDIF
REMOVE_CUTSCENE()
bCutsceneTriggeredByTrevor = TRUE
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME_LONG)
iStageProgress++
BREAK
CASE 4
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
IF IS_SCREEN_FADED_OUT() AND NOT IS_SCREEN_FADING_OUT()
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_FLY_TO_NORTH_YANKTON_COMPLETED(INT &iTrevorProgress)
//don't use locates header J skip
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
FLOAT fDistanceToBlip
VECTOR vOffsetToBlip
VECTOR vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID())
SWITCH iTrevorProgress
CASE 0
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
IF DOES_BLIP_EXIST(sLocatesData.vehicleBlip)
//remove collision flag for the plane entity
SET_ENTITY_LOAD_COLLISION_FLAG(vsTrevorsPlane.VehicleIndex, FALSE)
ENDIF
IF ( bMusicEventTrevorPlaneTriggered = FALSE )
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
IF TRIGGER_MUSIC_EVENT("MIC1_TREVOR_PLANE")
START_AUDIO_SCENE("MI_1_TREV_FLY_TO_LUDENDORFF")
bMusicEventTrevorPlaneTriggered = TRUE
ENDIF
ENDIF
ENDIF
IF ( bWeatherTypeOvercastSet = FALSE )
SET_WEATHER_TYPE_OVERTIME_PERSIST("OVERCAST", 60.0)
iWeatherTypeTimer = GET_GAME_TIMER()
bWeatherTypeOvercastSet = TRUE
ENDIF
IF ( bWeatherTypeRainSet = FALSE )
IF ( bWeatherTypeOvercastSet = TRUE)
IF ( iWeatherTypeTimer <> 0 AND HAS_TIME_PASSED(60000, iWeatherTypeTimer) )
SET_WEATHER_TYPE_OVERTIME_PERSIST("RAIN", 35.0)
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
PLAY_SOUND_FROM_ENTITY(iRainOnPlaneSoundID, "MIC_1_RAIN_ON_PLANE_MASTER", vsTrevorsPlane.VehicleIndex)
ENDIF
iWeatherTypeTimer = GET_GAME_TIMER()
bWeatherTypeRainSet = TRUE
ENDIF
ENDIF
ENDIF
IF ( bWeatherTypeThunderSet = FALSE )
IF ( bWeatherTypeRainSet = TRUE)
IF ( iWeatherTypeTimer <> 0 AND HAS_TIME_PASSED(35000, iWeatherTypeTimer) )
SET_WEATHER_TYPE_OVERTIME_PERSIST("THUNDER", 35.0)
bWeatherTypeThunderSet = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF NOT DOES_BLIP_EXIST(sLocatesData.vehicleBlip)
//add collision flag for the plane entity
SET_ENTITY_LOAD_COLLISION_FLAG(vsTrevorsPlane.VehicleIndex, TRUE)
ENDIF
ENDIF
ENDIF
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
fDistanceToBlip = GET_DISTANCE_BETWEEN_COORDS(GET_BLIP_COORDS(sLocatesData.LocationBlip), vPlayerPosition)
IF DOES_ENTITY_EXIST(osGolfBall.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osGolfBall.ObjectIndex)
vOffsetToBlip = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(osGolfBall.ObjectIndex, vPlayerPosition)
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(vsTrevorsPlane.VehicleIndex, GET_STRING_FROM_FLOAT(fDistanceToBlip), 1.25)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(vsTrevorsPlane.VehicleIndex, GET_STRING_FROM_FLOAT(vOffsetToBlip.y), 2.0)
DRAW_DEBUG_SPHERE(GET_BLIP_COORDS(sLocatesData.LocationBlip), 500, 0, 0, 255, 128)
#ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_TRON")
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF fDistanceToBlip > 0 AND fDistanceToBlip < 2200
SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER(CHAR_RON, "MCH1_TRON", TXTMSG_UNLOCKED, TXTMSG_CRITICAL)
SET_LABEL_AS_TRIGGERED("MCH1_TRON", TRUE)
ENDIF
ENDIF
ENDIF
IF IS_PLAYER_AT_LOCATION_IN_VEHICLE(sLocatesData, << sLocateFlight.vPosition.x, sLocateFlight.vPosition.y, vPlayerPosition.z >> , sLocateFlight.vSize, FALSE, vsTrevorsPlane.VehicleIndex, "MCH1_GT_T3", "CMN_GENGETINPL", "CMN_GENGETBCKPL", TRUE)
OR ( DOES_BLIP_EXIST(sLocatesData.LocationBlip) AND vOffsetToBlip.y > 0 AND fDistanceToBlip > 0 AND fDistanceToBlip < 500 ) //plane in front of blip
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
TRIGGER_MUSIC_EVENT("MIC1_FLIGHT_ARRIVING")
IF NOT IS_PED_INJURED(psMichael.PedIndex)
CLEAR_PED_TASKS(psMichael.PedIndex)
SET_PED_AS_NO_LONGER_NEEDED(psMichael.PedIndex)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsMichaelsCar.VehicleIndex)
ENDIF
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
CLEAR_PED_TASKS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SET_PED_AS_NO_LONGER_NEEDED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
ENDIF
IF DOES_BLIP_EXIST(psMichael.BlipIndex)
REMOVE_BLIP(psMichael.BlipIndex)
ENDIF
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
CLEANUP_MISSION_OBJECT(osGolfBall, TRUE)
//also remove Trevor's plane on fade out
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsTrevorsPlane.VehicleIndex)
ENDIF
bCutsceneTriggeredByTrevor = TRUE
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME_LONG)
iTrevorProgress++
ENDIF
BREAK
CASE 1
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
IF IS_SCREEN_FADED_OUT() AND NOT IS_SCREEN_FADING_OUT()
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_AIRPORT_COMPLETED(INT &iMichaelProgress, INT &iTrevorProgress)
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
SWITCH iMichaelProgress
CASE 0
IF HAS_REQUESTED_CUTSCENE_LOADED("mic_1_mcs_1")
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(vsCutsceneCar.VehicleIndex, "Chinese_Goon_Car", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, ORACLE2)
CLEAR_PRINTS()
CLEAR_HELP()
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, TRUE, FALSE) //make sure the cutscene fades out at the end
iMichaelProgress++
ELSE
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
//Michael's variations
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
ENDIF
ENDIF
BREAK
CASE 1 //fade screen in if screen was faded out due to shit skip or debug skip
IF IS_CUTSCENE_PLAYING()
SUPPRESS_RESTRICTED_AREA_WANTED_LEVEL(AC_AIRPORT_AIRSIDE) //this will stop player from being wanted for being at the airport
IF DOES_CAM_EXIST(ScriptedCamera)
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
ENDIF
VEHICLE_INDEX LastPlayerVehicleIndex
LastPlayerVehicleIndex = GET_PLAYERS_LAST_VEHICLE()
IF DOES_ENTITY_EXIST(LastPlayerVehicleIndex)
IF NOT IS_ENTITY_DEAD(LastPlayerVehicleIndex)
IF GET_DISTANCE_BETWEEN_COORDS(psMichael.vPosition, GET_ENTITY_COORDS(LastPlayerVehicleIndex)) < 15.0
IF ( LastPlayerVehicleIndex <> vsMichaelsCar.VehicleIndex )
SET_ENTITY_AS_MISSION_ENTITY(LastPlayerVehicleIndex)
ENDIF
SET_ENTITY_COORDS(LastPlayerVehicleIndex, vsMichaelsCar.vPosition)
SET_ENTITY_HEADING(LastPlayerVehicleIndex, vsMichaelsCar.fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(LastPlayerVehicleIndex)
SET_VEHICLE_DOORS_SHUT(LastPlayerVehicleIndex, TRUE)
SET_VEHICLE_ENGINE_ON(LastPlayerVehicleIndex, FALSE, TRUE)
ENDIF
ENDIF
ENDIF
//clear area when starting the cutscene
//CLEAR_AREA(psMichael.vPosition, 25.0, TRUE)
STOP_FIRE_IN_RANGE(psMichael.vPosition, 25.0)
CLEAR_AREA_OF_VEHICLES(psMichael.vPosition, 25.0)
CLEAR_AREA_OF_PROJECTILES(psMichael.vPosition, 25.0)
REMOVE_PARTICLE_FX_IN_RANGE(psMichael.vPosition, 25.0)
//clear area of peds that could run into the cutscene area, see B*1799643
CLEAR_AREA_OF_PEDS(<< -1035.41455, -2743.94922, 19.16928 >>, 6.0)
CLEAR_AREA_OF_PEDS(<< -1035.51782, -2739.14380, 19.16928 >>, 3.5)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE)
ENDIF
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iMichaelProgress++
ENDIF
BREAK
CASE 2
VEHICLE_INDEX LastPlayerVehicleIndex
LastPlayerVehicleIndex = GET_PLAYERS_LAST_VEHICLE()
IF DOES_ENTITY_EXIST(LastPlayerVehicleIndex)
IF ( LastPlayerVehicleIndex <> vsMichaelsCar.VehicleIndex )
IF IS_ENTITY_A_MISSION_ENTITY(LastPlayerVehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(LastPlayerVehicleIndex)
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(vsCutsceneCar.VehicleIndex)
IF DOES_CUTSCENE_ENTITY_EXIST("Chinese_Goon_Car")
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Chinese_Goon_Car"))
vsCutsceneCar.VehicleIndex = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Chinese_Goon_Car"))
SET_VEHICLE_ENGINE_ON(vsCutsceneCar.VehicleIndex, TRUE, TRUE)
SET_VEHICLE_LIGHTS(vsCutsceneCar.VehicleIndex, SET_VEHICLE_LIGHTS_ON)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created vehicle Chinese_Goon_Car in the cutscene.")
#ENDIF
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Chinese_Goon_Car")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Chinese_Goon_Car.")
#ENDIF
IF DOES_ENTITY_EXIST(vsCutsceneCar.VehicleIndex)
DELETE_VEHICLE(vsCutsceneCar.VehicleIndex)
ENDIF
ENDIF
IF HAS_CUTSCENE_FINISHED()
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsMichaelsCar.VehicleIndex)
ENDIF
IF DOES_ENTITY_EXIST(vsCutsceneCar.VehicleIndex)
DELETE_VEHICLE(vsCutsceneCar.VehicleIndex)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
iMichaelProgress++
ELSE
//if cutscene is skipped keep the screen faded out
//it will be faded in during the next stage
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
ENDIF
//start requesting prologue IPLs
REQUEST_PROLOGUE_IPLS(#IF IS_DEBUG_BUILD bPrintDebugOutput #ENDIF)
REQUEST_PROLOGUE_GRAVE_IPL(FALSE)
ENDIF
BREAK
CASE 3
//This is a hacky fix for 2834796 where the warning message forces a fade-in
IF NOT IS_SCREEN_FADING_OUT() OR NOT IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_OUT(0)
ENDIF
IF IS_SCREEN_FADED_OUT()
IF ARE_PROLOGUE_IPLS_ACTIVE()
AND IS_PROLOGUE_GRAVE_IPL_ACTIVE(FALSE)
REPLAY_STOP_EVENT()
RETURN TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF IS_SCREEN_FADED_OUT()
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
SWITCH iTrevorProgress
CASE 0
//start requesting prologue IPLs
REQUEST_PROLOGUE_IPLS(#IF IS_DEBUG_BUILD TRUE #ENDIF)
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
ENDIF
iTrevorProgress++
BREAK
CASE 1
IF ARE_PROLOGUE_IPLS_ACTIVE(#IF IS_DEBUG_BUILD TRUE #ENDIF)
AND IS_PROLOGUE_GRAVE_IPL_ACTIVE(TRUE)
REPLAY_STOP_EVENT()
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC MANAGE_MISSION_TRAIN_DURING_DRIVE_TO_GRAVEYARD(INT &iProgress)
SWITCH iProgress
CASE 0
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<4363.457031,-5083.799805,109.941292>>,<<32.000000,164.000000,8.000000>>)
iProgress++
ENDIF
BREAK
CASE 1
IF REQUEST_SCRIPT_AUDIO_BANK("Prologue_Train_Sounds")
AND HAS_MISSION_TRAIN_BEEN_CREATED(tsTrain, fFirstTrainSpeed, FALSE)
IF HAS_SOUND_FINISHED(iTrainBellsSoundID)
PLAY_SOUND_FROM_COORD(iTrainBellsSoundID, "Train_Bell", << 3882.67, -5017.19, 113.72 >>, "Prologue_Sounds")
ENDIF
iProgress++
ENDIF
BREAK
CASE 2
IF DOES_ENTITY_EXIST(tsTrain.VehicleIndex)
AND DOES_ENTITY_EXIST(tsTrain.PedIndex)
IF IS_ENTITY_AT_COORD(tsTrain.VehicleIndex, << 3960.78, -5569.91, 110.00 >>, << 10.0, 10.0, 10.0 >>)
DELETE_PED(tsTrain.PedIndex)
DELETE_MISSION_TRAIN(tsTrain.VehicleIndex)
IF NOT HAS_SOUND_FINISHED(iTrainBellsSoundID)
STOP_SOUND(iTrainBellsSoundID)
ENDIF
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Prologue_Train_Sounds")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Deleted mission train.")
#ENDIF
iProgress++
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_WEAPONS_HELP_TEXT()
IF ( bWeaponsHelpDisplayed = FALSE )
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_HWEAP")
IF IS_HUD_COMPONENT_ACTIVE(NEW_HUD_WEAPON_WHEEL)
PRINT_HELP("MCH1_HWEAP", DEFAULT_HELP_TEXT_TIME)
SET_LABEL_AS_TRIGGERED("MCH1_HWEAP", TRUE)
bWeaponsHelpDisplayed = TRUE
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_FLASHBACK_STREAM(INT &iProgress)
IF ( bStartFlashBackStream = TRUE )
SWITCH iProgress
CASE 0
IF NOT IS_STREAM_PLAYING()
IF IS_AUDIO_SCENE_ACTIVE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
STOP_AUDIO_SCENE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
ENDIF
IF LOAD_STREAM("FLASHBACK_01", "MICHAEL1_FLASHBACK_SOUNDSET")
IF IS_PED_SITTING_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vStreamTriggerPosition1, << 42.0, 128.0, 8.0 >>)
PLAY_STREAM_FRONTEND()
iFlashbackSubtitleProgress = 0
SET_LABEL_AS_TRIGGERED("FLASHBACK_01", TRUE)
START_AUDIO_SCENE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
iProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF NOT IS_STREAM_PLAYING()
IF IS_AUDIO_SCENE_ACTIVE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
STOP_AUDIO_SCENE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
ENDIF
IF LOAD_STREAM("FLASHBACK_02", "MICHAEL1_FLASHBACK_SOUNDSET")
IF IS_PED_SITTING_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vStreamTriggerPosition2, << 132.0, 196.0, 16.0 >>)
PLAY_STREAM_FRONTEND()
iFlashbackSubtitleProgress = 10
SET_LABEL_AS_TRIGGERED("FLASHBACK_02", TRUE)
START_AUDIO_SCENE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
iProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF NOT IS_STREAM_PLAYING()
IF IS_AUDIO_SCENE_ACTIVE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
STOP_AUDIO_SCENE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
ENDIF
IF LOAD_STREAM("FLASHBACK_03", "MICHAEL1_FLASHBACK_SOUNDSET")
IF IS_PED_SITTING_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vStreamTriggerPosition3, << 72.0, 72.0, 16.0 >>)
PLAY_STREAM_FRONTEND()
iFlashbackSubtitleProgress = 20
SET_LABEL_AS_TRIGGERED("FLASHBACK_03", TRUE)
START_AUDIO_SCENE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
iProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
SWITCH iFlashbackSubtitleProgress
CASE 0
IF HAS_LABEL_BEEN_TRIGGERED("FLASHBACK_01")
IF IS_STREAM_PLAYING()
IF GET_STREAM_PLAY_TIME() >= 100
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
PRINT_FAKE_SUBTITLE("MCH1_FLASH1", 10000)
ENDIF
iFlashbackSubtitleProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF IS_STREAM_PLAYING()
IF GET_STREAM_PLAY_TIME() >= 10300
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
PRINT_FAKE_SUBTITLE("MCH1_FLASH2", DEFAULT_GOD_TEXT_TIME)
ENDIF
iFlashbackSubtitleProgress++
ENDIF
ENDIF
BREAK
CASE 2
IF IS_STREAM_PLAYING()
IF GET_STREAM_PLAY_TIME() >= 13500
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
PRINT_FAKE_SUBTITLE("MCH1_FLASH3", 10000)
ENDIF
iFlashbackSubtitleProgress++
ENDIF
ENDIF
BREAK
CASE 3
IF IS_STREAM_PLAYING()
IF GET_STREAM_PLAY_TIME() >= 23000
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
PRINT_FAKE_SUBTITLE("MCH1_FLASH4", DEFAULT_GOD_TEXT_TIME)
ENDIF
iFlashbackSubtitleProgress++
ENDIF
ENDIF
BREAK
CASE 4
IF IS_STREAM_PLAYING()
IF GET_STREAM_PLAY_TIME() >= 26500
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
PRINT_FAKE_SUBTITLE("MCH1_FLASH5", 10000)
ENDIF
iFlashbackSubtitleProgress++
ENDIF
ENDIF
BREAK
CASE 5
IF IS_STREAM_PLAYING()
IF GET_STREAM_PLAY_TIME() >= 36500
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
PRINT_FAKE_SUBTITLE("MCH1_FLASH6", 10000)
ENDIF
iFlashbackSubtitleProgress++
ENDIF
ENDIF
BREAK
CASE 6
IF IS_STREAM_PLAYING()
IF GET_STREAM_PLAY_TIME() >= 42300
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
PRINT_FAKE_SUBTITLE("MCH1_FLASH7", 5000)
iFlashbackSubtitleProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 10
IF HAS_LABEL_BEEN_TRIGGERED("FLASHBACK_02")
IF IS_STREAM_PLAYING()
IF GET_STREAM_PLAY_TIME() >= 100
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
PRINT_FAKE_SUBTITLE("MCH1_FLASH8", DEFAULT_GOD_TEXT_TIME)
ENDIF
iFlashbackSubtitleProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 11
IF IS_STREAM_PLAYING()
IF GET_STREAM_PLAY_TIME() >= 7500
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
PRINT_FAKE_SUBTITLE("MCH1_FLASH9", DEFAULT_GOD_TEXT_TIME)
ENDIF
iFlashbackSubtitleProgress++
ENDIF
ENDIF
BREAK
CASE 12
IF IS_STREAM_PLAYING()
IF GET_STREAM_PLAY_TIME() >= 12500
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
PRINT_FAKE_SUBTITLE("MCH1_FLASH10", 10000)
ENDIF
iFlashbackSubtitleProgress++
ENDIF
ENDIF
BREAK
CASE 13
IF IS_STREAM_PLAYING()
IF GET_STREAM_PLAY_TIME() >= 22600
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
PRINT_FAKE_SUBTITLE("MCH1_FLASH11", 4300)
ENDIF
iFlashbackSubtitleProgress++
ENDIF
ENDIF
BREAK
CASE 20
IF HAS_LABEL_BEEN_TRIGGERED("FLASHBACK_03")
IF IS_STREAM_PLAYING()
IF GET_STREAM_PLAY_TIME() >= 100
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
PRINT_FAKE_SUBTITLE("MCH1_FLASH12", DEFAULT_GOD_TEXT_TIME)
ENDIF
iFlashbackSubtitleProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 21
IF IS_STREAM_PLAYING()
IF GET_STREAM_PLAY_TIME() >= 4000
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
PRINT_FAKE_SUBTITLE("MCH1_FLASH13", DEFAULT_GOD_TEXT_TIME)
ENDIF
iFlashbackSubtitleProgress++
ENDIF
ENDIF
BREAK
CASE 22
IF IS_STREAM_PLAYING()
IF GET_STREAM_PLAY_TIME() >= 7500
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
PRINT_FAKE_SUBTITLE("MCH1_FLASH14", 4500)
ENDIF
iFlashbackSubtitleProgress++
ENDIF
ENDIF
BREAK
ENDSWITCH
IF IS_STREAM_PLAYING()
IF NOT IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex) AND bMusicEventArrivedChurchTriggered = FALSE //if not in mission vehicle and not arrived at church yet
STOP_STREAM()
STOP_AUDIO_SCENE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
IF IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH1")
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH2")
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH3")
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH4")
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH5")
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH6")
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH7")
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH8")
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH9")
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH10")
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH11")
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH12")
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH13")
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH14")
CLEAR_PRINTS()
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Fix for B*1713614, disable jumpin and climbing in norty yankton locates that allowed player to escape playable map area.
PROC DISABLE_JUMPING_AND_CLIMBING_TO_STOP_MAP_ESCAPE()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3198.784912,-4801.354004,115.809845>>,<<5.000000,5.000000,5.000000>>)
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3187.924316,-4756.938965,115.639969>>,<<20.000000,46.000000,5.000000>>)
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_DisablePlayerAutoVaulting, TRUE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_MISSION_STAGE_GET_TO_GRAVEYARD_COMPLETED(INT &iStageProgress)
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
IF DOES_CAM_EXIST(ScriptedCamera)
HIDE_HUD_AND_RADAR_THIS_FRAME()
ENDIF
IF ( GET_CLOCK_HOURS() < 22 )
OR ( GET_CLOCK_HOURS() = 23 AND GET_CLOCK_MINUTES() = 59)
SET_CLOCK_TIME(0, 0, 0)
ENDIF
MANAGE_WEAPONS_HELP_TEXT()
UPDATE_TRIGGERED_LABEL(sLabelGTLC)
MANAGE_FLASHBACK_STREAM(iFlashbackStreamProgress)
MANAGE_MISSION_TRAIN_DURING_DRIVE_TO_GRAVEYARD(tsTrain.iProgress)
DISABLE_JUMPING_AND_CLIMBING_TO_STOP_MAP_ESCAPE() //fix for B*1713614
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_VEHICLE_RECORDING_INFO(vsMichaelsCar.VehicleIndex, 1.0)
ENDIF
#ENDIF
SWITCH iStageProgress
CASE 0
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_1_MIC_DRIVE_TO_GRAVEYARD")
START_AUDIO_SCENE("MI_1_MIC_DRIVE_TO_GRAVEYARD")
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
STOP_PED_SPEAKING(PLAYER_PED_ID(), TRUE)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, VS_DRIVER)
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, TRUE, TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
MODIFY_VEHICLE_TOP_SPEED(vsMichaelsCar.VehicleIndex, -20.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
ENDIF
INITIALISE_ROADNODES(sRoadNodes)
DISABLE_CELLPHONE(TRUE)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
ENDIF
iStageProgress++
BREAK
CASE 1 //create scripted camera for Ludendorff arrival
//create scripted camera for graveyard arrival
IF NOT DOES_CAM_EXIST(ScriptedCamera)
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
SET_CAM_PARAMS(ScriptedCamera,<<5442.244141,-5127.124023,78.327057>>,<<-0.382159,-0.560862,56.809986>>,41.604355)
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.1)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted camera.")
#ENDIF
//SET_FRONTEND_RADIO_ACTIVE(FALSE)
ENDIF
IF DOES_CAM_EXIST(ScriptedCamera)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
iStageProgress++
ENDIF
BREAK
CASE 2
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_START(<< 5442.24, -5127.12, 78.24 >>, << -0.84, 0.55, -0.01>>, 128.0)
iLoadSceneTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_START().")
#ENDIF
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Load scene timer: ", GET_GAME_TIMER() - iLoadSceneTimer, ".")
#ENDIF
IF IS_NEW_LOAD_SCENE_LOADED()
OR HAS_TIME_PASSED(10000, iLoadSceneTimer)
#IF IS_DEBUG_BUILD
IF HAS_TIME_PASSED(10000, iLoadSceneTimer)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP() due to iLoadSceneTimer timeout.")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP() due to IS_NEW_LOAD_SCENE_LOADED() returning TRUE.")
ENDIF
#ENDIF
NEW_LOAD_SCENE_STOP()
iStageProgress++
ENDIF
BREAK
CASE 3
//start rendering the interpolating camera
IF DOES_CAM_EXIST(ScriptedCamera)
IF NOT IS_CAM_RENDERING(ScriptedCamera)
SET_CAM_PARAMS(ScriptedCamera,<<5442.244141,-5127.124023,78.327057>>,<<-0.382159,-0.560862,56.809986>>,41.604355)
SET_CAM_PARAMS(ScriptedCamera,<<5442.244141,-5127.124023,78.086525>>,<<-0.382159,-0.560862,56.809986>>,41.604355, 6000,
GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
REPLAY_RECORD_BACK_FOR_TIME(0.0, 15.0, REPLAY_IMPORTANCE_HIGHEST)
ENDIF
ENDIF
CLEAR_AREA_OF_VEHICLES(<< 5433.34, -5122.94, 77.07 >>, 60.0)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
//start vehicle recording playback
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vsMichaelsCar, sVehicleRecordingsFile, 0.75, FALSE, 3750)
TRIGGER_MUSIC_EVENT("MIC1_DRIVE_TO_GRAVEYARD")
bStartFlashBackStream = TRUE
iStageProgress++
BREAK
CASE 4
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsMichaelsCar.VehicleIndex)
IF GET_TIME_POSITION_IN_RECORDING(vsMichaelsCar.VehicleIndex) >= fFirstRecordingEndTime
//destroy scripted camera
IF DOES_CAM_EXIST(ScriptedCamera)
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON
SETTIMERA(0)
SETTIMERB(0)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": TIMERA is ", TIMERA(), ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": TIMERB is ", TIMERB(), ".")
bFirstPersonFXTriggered = FALSE
bCamViewModeContextChanged = TRUE
SET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE, CAM_VIEW_MODE_THIRD_PERSON_MEDIUM)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_CAM_ACTIVE(ScriptedCamera, FALSE)
RENDER_SCRIPT_CAMS(FALSE, TRUE, iCameraInterpolationTimer)
DESTROY_CAM(ScriptedCamera)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
//SET_FRONTEND_RADIO_ACTIVE(TRUE)
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
vsMichaelsCar.iRecordingNumber = 004 //change the recording number for the next recording needed
DISABLE_CELLPHONE(FALSE)
iStageProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 5
//disable default first person flash and handle one manually
DISABLE_FIRST_PERSON_FLASH_EFFECT_THIS_UPDATE()
//disable player camera control when camera is interpolating from script camera to gameplay camera
IF IS_INTERPOLATING_FROM_SCRIPT_CAMS()
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_BEHIND)
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_VEH_LOOK_BEHIND)
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_LR)
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_UD)
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_NEXT_CAMERA)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": TIMERA is ", TIMERA(), ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": TIMERB is ", TIMERB(), ".")
IF ( bCamViewModeContextChanged = TRUE )
IF ( bFirstPersonFXTriggered = FALSE )
IF TIMERA() > iFirstPersonFXTime
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bFirstPersonFXTriggered = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF ( bCamViewModeContextChanged = TRUE )
SET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE, CAM_VIEW_MODE_FIRST_PERSON)
bCamViewModeContextChanged = FALSE
ENDIF
ENDIF
//check for playback interruption from player controls
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsMichaelsCar.VehicleIndex)
IF ( bVehiclePlaybackInterrupted = FALSE )
IF GET_TIME_POSITION_IN_RECORDING(vsMichaelsCar.VehicleIndex) >= 10250.0
STOP_PLAYBACK_RECORDED_VEHICLE(vsMichaelsCar.VehicleIndex)
ENDIF
IF IS_PLAYER_IN_CONTROL_OF_VEHICLE(vsMichaelsCar.VehicleIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vsMichaelsCar.VehicleIndex)
CLEAR_PED_TASKS(PLAYER_PED_ID())
bVehiclePlaybackInterrupted = TRUE
ENDIF
ENDIF
ENDIF
//display locates stuff and objective
IS_PLAYER_AT_LOCATION_IN_VEHICLE(sLocatesData, psMichael.vDestination, << 0.25, 0.25, LOCATE_SIZE_HEIGHT >>, TRUE, vsMichaelsCar.VehicleIndex, sLabelGTLC, "CMN_GENGETIN", "CMN_GENGETBCK", TRUE)
RUN_ROADNODES_CHECK(PLAYER_PED_ID() #IF IS_DEBUG_BUILD, bPrintDebugOutput #ENDIF)
PREPARE_MUSIC_EVENT("MIC1_ARRIVED_CHURCH")
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF IS_ENTITY_AT_COORD(vsMichaelsCar.VehicleIndex, << 3219.976563, -4706.303223, 112.876556 >>, << 18.0, 20.0, 2.0 >>)
//create scripted camera for graveyard arrival
IF NOT DOES_CAM_EXIST(ScriptedCamera)
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
SET_CAM_PARAMS(ScriptedCamera, <<3212.395996,-4728.643555,113.433495>>,<<7.027314,0.084961,-27.492634>>,33.441017)
SET_CAM_PARAMS(ScriptedCamera, <<3213.253906,-4726.994629,113.662704>>,<<7.027314,0.084961,-27.492634>>,33.441017, 10000,
GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.1)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted camera.")
#ENDIF
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
REPLAY_RECORD_BACK_FOR_TIME(8.0, 15.0, REPLAY_IMPORTANCE_HIGHEST)
//SET_FRONTEND_RADIO_ACTIVE(FALSE)
ENDIF
IF DOES_CAM_EXIST(ScriptedCamera)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vsMichaelsCar, sVehicleRecordingsFile, 1.0, FALSE, fSecondRecordingStartTime)
DISABLE_CELLPHONE(TRUE)
KILL_FACE_TO_FACE_CONVERSATION()
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_START()
iStageProgress++
ENDIF
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
CLEAR_AREA_OF_PROJECTILES(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 5.0)
REMOVE_PARTICLE_FX_IN_RANGE(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 5.0)
ENDIF
ENDIF
CLEAR_AREA(<< 3223.31, -4703.96, 111.83 >>, 10.0, TRUE)
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex, TRUE)
SET_ENTITY_INVINCIBLE(vsMichaelsCar.VehicleIndex, TRUE)
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, VS_DRIVER)
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3236.007568,-4682.933105,113.858047>>,<<36.000000,16.000000,3.000000>>)
AND IS_ENTITY_AT_COORD(vsMichaelsCar.VehicleIndex, <<3236.007568,-4682.933105,113.858047>>,<<36.000000,16.000000,3.000000>>)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID())
ENDIF
IF PREPARE_MUSIC_EVENT("MIC1_ARRIVED_CHURCH")
IF TRIGGER_MUSIC_EVENT("MIC1_ARRIVED_CHURCH")
ENDIF
ENDIF
KILL_FACE_TO_FACE_CONVERSATION()
iStageProgress = 9 //skip to the last case of this stage
ENDIF
REQUEST_VEHICLE_RECORDING(vsMichaelsCar.iRecordingNumber, sVehicleRecordingsFile)
BREAK
CASE 6
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
IF ( bMusicEventArrivedChurchTriggered = FALSE)
IF PREPARE_MUSIC_EVENT("MIC1_ARRIVED_CHURCH")
IF ( GET_TIME_POSITION_IN_RECORDING(vsMichaelsCar.VehicleIndex) > 3750.0 )
IF TRIGGER_MUSIC_EVENT("MIC1_ARRIVED_CHURCH")
bMusicEventArrivedChurchTriggered = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsMichaelsCar.VehicleIndex)
IF GET_TIME_POSITION_IN_RECORDING(vsMichaelsCar.VehicleIndex) >= fSecondRecordingEndTime
STOP_PLAYBACK_RECORDED_VEHICLE(vsMichaelsCar.VehicleIndex)
SET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex, << 3212.0027, -4689.3232, 111.6762 >>)
SET_ENTITY_HEADING(vsMichaelsCar.VehicleIndex, 225.1631)
SET_VEHICLE_LIGHTS(vsMichaelsCar.VehicleIndex, FORCE_VEHICLE_LIGHTS_OFF)
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
psMichael.iTimer = GET_GAME_TIMER()
iStageProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 7
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
IF HAS_TIME_PASSED(1000, psMichael.iTimer)
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
IF DOES_CAM_EXIST(ScriptedCamera)
SET_CAM_PARAMS(ScriptedCamera, <<3209.035889,-4688.779297,113.423576>>,<<-1.887575,-0.000000,-81.365829>>,54.466209)
SET_CAM_PARAMS(ScriptedCamera, <<3209.035889,-4688.779297,113.423576>>,<<-1.887575,-0.000000,-78.470566>>,54.466209, 3000,
GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.1)
ENDIF
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_LEAVE_VEHICLE(NULL, vsMichaelsCar.VehicleIndex)
TASK_TURN_PED_TO_FACE_COORD(NULL, << 3255.48, -4685.06, 113.11 >>)
TASK_LOOK_AT_COORD(NULL, << 3255.48, -4685.06, 113.11 >>, 3000)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_END()
psMichael.iTimer = GET_GAME_TIMER()
bFirstPersonFXTriggered = FALSE
iStageProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 8
IF DOES_CAM_EXIST(ScriptedCamera)
IF HAS_TIME_PASSED(1500, psMichael.iTimer)
iStageProgress++
ELIF HAS_TIME_PASSED(1200, psMichael.iTimer)
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
IF ( bFirstPersonFXTriggered = FALSE )
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bFirstPersonFXTriggered = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 9 //other cases reference this value, update them as well, when this value changes
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
SET_ENTITY_INVINCIBLE(vsMichaelsCar.VehicleIndex, FALSE)
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
DISABLE_CELLPHONE(FALSE)
bCutsceneTriggeredByMichael = TRUE
STOP_AUDIO_SCENE("MI_1_MIC_DRIVE_TO_GRAVEYARD")
IF NOT IS_STREAM_PLAYING()
STOP_AUDIO_SCENE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
ENDIF
iStageProgress++
BREAK
CASE 10
IF DOES_CAM_EXIST(ScriptedCamera)
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(45.0)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ELSE
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP()
ENDIF
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
DESTROY_CAM(ScriptedCamera)
DESTROY_ALL_CAMS()
ENDIF
CLEAR_PED_TASKS(PLAYER_PED_ID())
STOP_PED_SPEAKING(PLAYER_PED_ID(), FALSE)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
IF DOES_ENTITY_EXIST(tsTrain.VehicleIndex)
AND DOES_ENTITY_EXIST(tsTrain.PedIndex)
DELETE_PED(tsTrain.PedIndex)
DELETE_MISSION_TRAIN(tsTrain.VehicleIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Deleted mission train.")
#ENDIF
ENDIF
IF NOT HAS_SOUND_FINISHED(iTrainBellsSoundID)
STOP_SOUND(iTrainBellsSoundID)
ENDIF
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Prologue_Train_Sounds")
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC MANAGE_GAMEPLAY_HINT()
IF NOT IS_GAMEPLAY_HINT_ACTIVE()
SET_GAMEPLAY_HINT_FOV(fFocusPushHintFOV)
SET_GAMEPLAY_ENTITY_HINT(psTrevor.PedIndex, << 0.0, 0.0, 1.0>>, TRUE, -1, 2500)
SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(fFocusPushSideOffset)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(fFocusPushVerticalOffset)
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(fFocusPushFollowDistanceScalar)
SET_GAMEPLAY_HINT_BASE_ORBIT_PITCH_OFFSET(fFocusPushBaseOrbitPitchOffset)
ELSE
#IF IS_DEBUG_BUILD
IF ( bResetGameplayHint = TRUE )
STOP_GAMEPLAY_HINT(TRUE)
bResetGameplayHint = FALSE
ENDIF
#ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_MISSION_STAGE_GET_TO_GRAVE_COMPLETED(INT &iStageProgress)
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
IF ( GET_CLOCK_HOURS() < 22 )
OR ( GET_CLOCK_HOURS() = 23 AND GET_CLOCK_MINUTES() = 59)
SET_CLOCK_TIME(0, 0, 0)
ENDIF
MANAGE_WEAPONS_HELP_TEXT()
DISABLE_JUMPING_AND_CLIMBING_TO_STOP_MAP_ESCAPE() //fix for B*1713614
IF GET_DISTANCE_BETWEEN_COORDS(vGravePosition, GET_ENTITY_COORDS(PLAYER_PED_ID())) < 75.0
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("mic_1_mcs_2", CS_SECTION_3 | CS_SECTION_4 | CS_SECTION_5)
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
//Michael's variation
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
//Trevor's variation
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
IF NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Trevor", psTrevor.PedIndex, GET_PLAYER_PED_MODEL(CHAR_TREVOR))
ENDIF
ELSE
SET_CUTSCENE_PED_OUTFIT("Trevor", GET_PLAYER_PED_MODEL(CHAR_TREVOR), OUTFIT_P2_LUDENDORFF)
ENDIF
//Chinese gunman's variations
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_gunman", PED_COMP_HAIR, 1, 0)
ENDIF
ELSE
IF HAS_THIS_CUTSCENE_LOADED("mic_1_mcs_2")
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
ENDIF
SWITCH iStageProgress
CASE 0
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_1_MIC_WALK_TO_GRAVEYARD")
IF IS_STREAM_PLAYING() STOP_STREAM() ENDIF
START_AUDIO_SCENE("MI_1_MIC_WALK_TO_GRAVEYARD")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
IF NOT IS_STREAM_PLAYING()
STOP_AUDIO_SCENE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
ENDIF
ENDIF
IF NOT DOES_BLIP_EXIST(psMichael.BlipIndex)
psMichael.BlipIndex = ADD_BLIP_FOR_COORD(vGravePosition)
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GRAVE")
IF DOES_BLIP_EXIST(psMichael.BlipIndex)
PRINT_GOD_TEXT_ADVANCED("MCH1_GRAVE", DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GBTLC")
IF DOES_BLIP_EXIST(psMichael.BlipIndex)
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << 3263.05, -4704.67, 104.67 >>, << 3267.14, -4561.37, 132.76 >>, 64.0)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vsMichaelsCar.vPosition) > ABANDON_CAR_WARNING_RANGE
CLEAR_PRINTS()
PRINT_GOD_TEXT_ADVANCED("MCH1_GBTLC", DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
IF NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
REQUEST_PTFX_ASSET()
SET_PED_RESET_FLAG(psTrevor.PedIndex, PRF_DisableFriendlyGunReactAudio, TRUE)
IF NOT DOES_ENTITY_EXIST(osPropShovel.ObjectIndex)
HAS_MISSION_OBJECT_BEEN_CREATED(osPropShovel, FALSE)
ENDIF
IF DOES_ENTITY_EXIST(osPropShovel.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osPropShovel.ObjectIndex)
IF NOT IS_ENTITY_ATTACHED(osPropShovel.ObjectIndex)
ATTACH_ENTITY_TO_ENTITY(osPropShovel.ObjectIndex, psTrevor.PedIndex,
GET_PED_BONE_INDEX(psTrevor.PedIndex, BONETAG_PH_R_HAND),vZero, vZero)
ENDIF
ENDIF
ENDIF
IF HAS_PTFX_ASSET_LOADED()
IF DOES_ENTITY_EXIST(osPropShovel.ObjectIndex) AND NOT IS_ENTITY_DEAD(osPropShovel.ObjectIndex)
IF DOES_ENTITY_EXIST(psTrevor.PedIndex) AND NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
IF IS_ENTITY_ATTACHED_TO_ENTITY(osPropShovel.ObjectIndex, psTrevor.PedIndex)
IF IS_ENTITY_PLAYING_ANIM(psTrevor.PedIndex, "missmic1leadinoutmic_1_mcs_2", "_leadin_trevor")
IF GET_ENTITY_ANIM_CURRENT_TIME(psTrevor.PedIndex, "missmic1leadinoutmic_1_mcs_2", "_leadin_trevor") <= 0.1
bPTFXStarted = FALSE
ENDIF
IF GET_ENTITY_ANIM_CURRENT_TIME(psTrevor.PedIndex, "missmic1leadinoutmic_1_mcs_2", "_leadin_trevor") >= fParticleFXTriggerPhase
IF ( bPTFXStarted = FALSE )
IF START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("cs_mich1_spade_dirt_throw", psTrevor.PedIndex,
vParticleFXPosition, vParticleFXRotation)
bPTFXStarted = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_ENTITY_PLAYING_ANIM(psTrevor.PedIndex, "missmic1leadinoutmic_1_mcs_2", "_leadin_trevor")
REQUEST_ANIM_DICT("missmic1leadinoutmic_1_mcs_2")
IF HAS_ANIM_DICT_LOADED("missmic1leadinoutmic_1_mcs_2")
TASK_PLAY_ANIM_ADVANCED(psTrevor.PedIndex, "missmic1leadinoutmic_1_mcs_2", "_leadin_trevor",
vGravePosition, << 0.0, 0.0, 137.88 >>, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1,
AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE)
ENDIF
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<3240.262695,-4574.430176,115.941917>>, <<3294.226807,-4574.134766,120.941917>>, 31.0)//28.0)
bLeadInTiggered = TRUE
IF ( iLeadInTimer = 0 )
iLeadInTimer = GET_GAME_TIMER()
ENDIF
ENDIF
IF ( bLeadInTiggered = TRUE )
MANAGE_GAMEPLAY_HINT()
UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE)
IF IS_ENTITY_PLAYING_ANIM(psTrevor.PedIndex, "missmic1leadinoutmic_1_mcs_2", "_leadin_trevor")
IF HAS_TIME_PASSED(3000, iLeadIntimer)
IF GET_ENTITY_ANIM_CURRENT_TIME(psTrevor.PedIndex, "missmic1leadinoutmic_1_mcs_2", "_leadin_trevor") > 0.75
bCutsceneTriggeredByMichael = TRUE
REMOVE_ANIM_DICT("missmic1leadinoutmic_1_mcs_2")
IF DOES_BLIP_EXIST(psMichael.BlipIndex)
REMOVE_BLIP(psMichael.BlipIndex)
ENDIF
STOP_AUDIO_SCENE("MI_1_MIC_DRIVE_TO_GRAVEYARD")
STOP_AUDIO_SCENE("MI_1_MIC_WALK_TO_GRAVEYARD")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF HAS_MISSION_PED_BEEN_CREATED(psTrevor, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_TREVOR)
SET_ENTITY_LOD_DIST(psTrevor.PedIndex, 150)
SET_PED_LOD_MULTIPLIER(psTrevor.PedIndex, 5.0)
STOP_PED_SPEAKING(psTrevor.PedIndex, TRUE)
SET_PED_CONFIG_FLAG(psTrevor.PedIndex, PCF_CannotBeTargeted, TRUE)
SET_PED_CONFIG_FLAG(psTrevor.PedIndex, PCF_DisableExplosionReactions, TRUE)
SET_PED_COMP_ITEM_CURRENT_SP(psTrevor.PedIndex, COMP_TYPE_OUTFIT, OUTFIT_P2_LUDENDORFF, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psTrevor.PedIndex, TRUE)
IF ( bDirtDecalApplied = FALSE )
CLEAR_PED_DECORATIONS_LEAVE_SCARS(psTrevor.PedIndex)//fix for B*2018060
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_HEAD, 0.590, 0.720, 25.0, 1.0, 1.0, 0, TRUE, "basic_dirt_skin")
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_HEAD, 0.400, 0.440, 30.0, 1.0, 1.0, 1, TRUE, "basic_dirt_skin")
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_RIGHT_ARM, 0.400, 0.120, 30.0, 0.6, 1.0, 1, TRUE, "basic_dirt_skin")
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_LEFT_ARM, 0.480, 0.120, 30.0, 0.6, 1.0, 1, TRUE, "basic_dirt_skin")
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_TORSO, 0.644, 0.407, 30.0, 1.0, 1.0, 6, TRUE, "basic_dirt_cloth")
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_TORSO, 0.860, 0.632, 90.0, 1.0, 1.0, 6, TRUE, "basic_dirt_cloth")
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_LEFT_LEG, 0.775, 0.550, 0.0, 1.0, 1.0, 0, TRUE, "basic_dirt_cloth")
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_RIGHT_LEG, 0.415, 0.750, 36.0, 1.0, 1.0, 1, TRUE, "basic_dirt_cloth")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Applying basic_dirt_cloth and basic_dirt_skin damage decal to Trevor ped before mocap cutscene.")
#ENDIF
bDirtDecalApplied = TRUE
ENDIF
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_GRAVEYARD_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
STOP_AUDIO_SCENE("MI_1_MIC_DRIVE_TO_GRAVEYARD")
STOP_AUDIO_SCENE("MI_1_MIC_WALK_TO_GRAVEYARD")
STOP_AUDIO_SCENE("MI_1_TREV_FLY_TO_LUDENDORFF")
IF ( bCutsceneTriggeredByMichael = TRUE )
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("mic_1_mcs_2", CS_SECTION_3 | CS_SECTION_4 | CS_SECTION_5)
//go straight to cutscene start
iStageProgress = 3
ELIF ( bCutsceneTriggeredByTrevor = TRUE )
CLEAR_HELP()
CLEAR_PRINTS()
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS(PLAYER_PED_ID())
WARP_PED(PLAYER_PED_ID(), psMichael.vPosition, psMichael.fHeading, FALSE, FALSE, FALSE)
ENDIF
IF NOT IS_PED_INJURED(psTrevor.PedIndex)
CLEAR_PED_TASKS(psTrevor.PedIndex)
WARP_PED(psTrevor.PedIndex, psTrevor.vPosition, psTrevor.fHeading, FALSE, FALSE, FALSE)
ENDIF
SETTIMERA(0)
iStageProgress++
ENDIF
BREAK
CASE 1
IF ( bCutsceneTriggeredByTrevor = TRUE )
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
DISPLAY_TEXT_ON_BLACK_SCREEN("MH1_SETTING")
IF ( TIMERA() > 5000 )
iStageProgress++
ENDIF
ENDIF
BREAK
CASE 2 //make sure weapons are loaded and in hand of the peds before they get registered for the cutscene
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
DISPLAY_TEXT_ON_BLACK_SCREEN("MH1_SETTING")
REMOVE_PROLOGUE_GRAVE_IPL(FALSE)
REQUEST_PROLOGUE_GRAVE_IPL(TRUE)
REQUEST_WEAPON_ASSET(WEAPONTYPE_PISTOL)
IF IS_PROLOGUE_GRAVE_IPL_ACTIVE(TRUE)
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_PISTOL)
IPL_GROUP_SWAP_START("prologue03_grv_cov", "prologue03_grv_dug")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting prologue IPLs swap for prologue03_grv_cov to prologue03_grv_dug by calling IPL_GROUP_SWAP_START().")
#ENDIF
iStageProgress++
ENDIF
BREAK
CASE 3
IF ( bCutsceneTriggeredByMichael = TRUE )
IF HAS_REQUESTED_CUTSCENE_LOADED("mic_1_mcs_2", CS_SECTION_3 | CS_SECTION_4 | CS_SECTION_5)
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
IF NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psTrevor.PedIndex, "Trevor", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(osPropShovel.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osPropShovel.ObjectIndex)
IF IS_ENTITY_ATTACHED(osPropShovel.ObjectIndex)
DETACH_ENTITY(osPropShovel.ObjectIndex)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(osPropShovel.ObjectIndex, "MIC1_Shovel", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY, osPropShovel.ModelName)
ENDIF
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(osPropShovel.ObjectIndex, "MIC1_Shovel", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osPropShovel.ModelName)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(psBrad.PedIndex, "Dead_Brad", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, CS_BRADCADAVER)
REGISTER_ENTITY_FOR_CUTSCENE(osPropPickaxe.ObjectIndex, "MIC1_PickAxe", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osPropPickaxe.ModelName)
REGISTER_ENTITY_FOR_CUTSCENE(osPropCoffin.ObjectIndex, "Coffin", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osPropCoffin.ModelName)
REGISTER_ENTITY_FOR_CUTSCENE(esWallEnemies[0].PedIndex, "Chinese_gunman", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, mnEnemy)
WeaponMichaelObjectIndex = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, FALSE)
IF HAS_PED_GOT_WEAPON_COMPONENT(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, WEAPONCOMPONENT_AT_PI_SUPP_02)
REMOVE_WEAPON_COMPONENT_FROM_WEAPON_OBJECT(WeaponMichaelObjectIndex, WEAPONCOMPONENT_AT_PI_SUPP_02)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing WEAPONCOMPONENT_AT_PI_SUPP_02 from player weapon WEAPONTYPE_PISTOL for cutscene.")
#ENDIF
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(WeaponMichaelObjectIndex, "FBI_Agent_1_Gun", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
CLEAR_HELP()
CLEAR_PRINTS()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
START_CUTSCENE()
bPrologueGraveIPLSwapped = TRUE
iStageProgress++
ENDIF
ELIF ( bCutsceneTriggeredByTrevor = TRUE )
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
DISPLAY_TEXT_ON_BLACK_SCREEN("MH1_SETTING") //display the text on black for one more frame until the cutscene is active
IF HAS_REQUESTED_CUTSCENE_LOADED("mic_1_mcs_2")
AND IS_PROLOGUE_GRAVE_IPL_ACTIVE(TRUE)
AND IPL_GROUP_SWAP_IS_READY()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(psTrevor.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psTrevor.PedIndex, "Trevor", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(psTrevor.PedIndex, "Trevor", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, psTrevor.ModelName)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(psBrad.PedIndex, "Dead_Brad", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, CS_BRADCADAVER)
REGISTER_ENTITY_FOR_CUTSCENE(osPropShovel.ObjectIndex, "MIC1_Shovel", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osPropShovel.ModelName)
REGISTER_ENTITY_FOR_CUTSCENE(osPropPickaxe.ObjectIndex, "MIC1_PickAxe", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osPropPickaxe.ModelName)
REGISTER_ENTITY_FOR_CUTSCENE(osPropCoffin.ObjectIndex, "Coffin", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osPropCoffin.ModelName)
REGISTER_ENTITY_FOR_CUTSCENE(esWallEnemies[0].PedIndex, "Chinese_gunman", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, mnEnemy)
WeaponMichaelObjectIndex = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, FALSE)
IF HAS_PED_GOT_WEAPON_COMPONENT(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, WEAPONCOMPONENT_AT_PI_SUPP_02)
REMOVE_WEAPON_COMPONENT_FROM_WEAPON_OBJECT(WeaponMichaelObjectIndex, WEAPONCOMPONENT_AT_PI_SUPP_02)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing WEAPONCOMPONENT_AT_PI_SUPP_02 from player weapon WEAPONTYPE_PISTOL for cutscene.")
#ENDIF
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(WeaponMichaelObjectIndex, "FBI_Agent_1_Gun", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
CLEAR_HELP()
CLEAR_PRINTS()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
START_CUTSCENE(CUTSCENE_PLAYER_FP_FLASH_MICHAEL)
iStageProgress++
ENDIF
ENDIF
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
//Michael's variation
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
//Trevor's variation
SET_CUTSCENE_PED_OUTFIT("Trevor", GET_PLAYER_PED_MODEL(CHAR_TREVOR), OUTFIT_P2_LUDENDORFF)
//Chinese gunman's variations
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_gunman", PED_COMP_HAIR, 1, 0)
ENDIF
BREAK
CASE 4
IF IS_CUTSCENE_PLAYING()
STOP_GAMEPLAY_HINT(TRUE)
CLEAR_AREA(psMichael.vPosition, 250.0, TRUE)
CLEAR_AREA_OF_VEHICLES(psMichael.vPosition, 250.0)
//destroy scripted camera
IF DOES_CAM_EXIST(ScriptedCamera)
SET_CAM_ACTIVE(ScriptedCamera, FALSE)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DESTROY_CAM(ScriptedCamera)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
//SET_FRONTEND_RADIO_ACTIVE(TRUE)
ENDIF
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
DELETE_VEHICLE(vsTrevorsCar.VehicleIndex)
ENDIF
//reposition Michael's car
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
SET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex, vsMichaelsCar.vPosition)
SET_ENTITY_HEADING(vsMichaelsCar.VehicleIndex, vsMichaelsCar.fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, FALSE, TRUE)
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex, TRUE)
SET_VEHICLE_ENGINE_CAN_DEGRADE(vsMichaelsCar.VehicleIndex, FALSE)
SET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex, GET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
SET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
SET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 2.5)
ENDIF
ENDIF
TRIGGER_MUSIC_EVENT("MIC1_GRAVE_CS")
SET_CLOCK_TIME(0, 0, 0)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(5.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ENDIF
BREAK
CASE 5
IF ( bCutsceneTriggeredByTrevor = TRUE )
IF ( bPrologueGraveIPLSwapped = FALSE )
IF ( GET_CUTSCENE_TIME() >= 24634 )
REQUEST_IPL("prologue_grv_torch")
IPL_GROUP_SWAP_FINISH()
bPrologueGraveIPLSwapped = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Swapping prologue IPLs prologue03_grv_cov for prologue03_grv_dug by calling IPL_GROUP_SWAP_FINISH().")
#ENDIF
IF ( bDirtDecalApplied = FALSE )
IF NOT IS_PED_INJURED(psTrevor.PedIndex)
CLEAR_PED_DECORATIONS_LEAVE_SCARS(psTrevor.PedIndex)//fix for B*2018060
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_HEAD, 0.590, 0.720, 25.0, 1.0, 1.0, 0, TRUE, "basic_dirt_skin")
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_HEAD, 0.400, 0.440, 30.0, 1.0, 1.0, 1, TRUE, "basic_dirt_skin")
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_RIGHT_ARM, 0.400, 0.120, 30.0, 0.6, 1.0, 1, TRUE, "basic_dirt_skin")
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_LEFT_ARM, 0.480, 0.120, 30.0, 0.6, 1.0, 1, TRUE, "basic_dirt_skin")
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_TORSO, 0.644, 0.407, 30.0, 1.0, 1.0, 6, TRUE, "basic_dirt_cloth")
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_TORSO, 0.860, 0.632, 90.0, 1.0, 1.0, 6, TRUE, "basic_dirt_cloth")
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_LEFT_LEG, 0.775, 0.550, 0.0, 1.0, 1.0, 0, TRUE, "basic_dirt_cloth")
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_RIGHT_LEG, 0.415, 0.750, 36.0, 1.0, 1.0, 1, TRUE, "basic_dirt_cloth")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Applying basic_dirt_cloth and basic_dirt_skin damage decal to Trevor ped during mocap cutscene.")
#ENDIF
ENDIF
bDirtDecalApplied = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bDamageDecalApplied = FALSE )
IF IS_CUTSCENE_PLAYING()
IF ( GET_CUTSCENE_TIME() > 173000 )
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
APPLY_PED_DAMAGE_DECAL(PLAYER_PED_ID(), PDZ_HEAD, 0.621, 0.755, 55.084, 0.01, 1.0, 1, TRUE, "bruise")
bDamageDecalApplied = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bMusicEventShootoutStartTriggered = FALSE )
IF IS_CUTSCENE_PLAYING()
IF ( GET_CUTSCENE_TIME() > 160000 )
IF PREPARE_MUSIC_EVENT("MIC1_SHOOTOUT_START")
IF ( GET_CUTSCENE_TIME() > 170500 )
IF ( bMusicEventShootoutStartTriggered = FALSE )
IF TRIGGER_MUSIC_EVENT("MIC1_SHOOTOUT_START")
bMusicEventShootoutStartTriggered = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
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"))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created ped Trevor in the cutscene.")
#ENDIF
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(psBrad.PedIndex)
IF DOES_CUTSCENE_ENTITY_EXIST("Dead_Brad")
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Dead_Brad"))
psBrad.PedIndex = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Dead_Brad"))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created ped Dead_Brad in the cutscene.")
#ENDIF
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(osPropShovel.ObjectIndex)
IF DOES_CUTSCENE_ENTITY_EXIST("MIC1_Shovel")
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("MIC1_Shovel"))
osPropShovel.ObjectIndex = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("MIC1_Shovel"))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created object MIC1_Shovel in the cutscene.")
#ENDIF
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(osPropPickaxe.ObjectIndex)
IF DOES_CUTSCENE_ENTITY_EXIST("MIC1_PickAxe")
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("MIC1_PickAxe"))
osPropPickaxe.ObjectIndex = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("MIC1_PickAxe"))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created object MIC1_PickAxe in the cutscene.")
#ENDIF
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(osPropCoffin.ObjectIndex)
IF DOES_CUTSCENE_ENTITY_EXIST("Coffin")
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Coffin"))
osPropCoffin.ObjectIndex = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Coffin"))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created object Coffin in the cutscene.")
#ENDIF
ENDIF
ENDIF
ENDIF
//create enemy ped during the mocap cutscene
IF NOT DOES_ENTITY_EXIST(esWallEnemies[0].PedIndex)
IF DOES_CUTSCENE_ENTITY_EXIST("Chinese_gunman")
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Chinese_gunman"))
esWallEnemies[0].PedIndex = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Chinese_gunman"))
SET_ENEMY_PED_PROPERTIES(esWallEnemies[0].PedIndex, rgEnemies, WEAPONTYPE_PISTOL)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Set up properites for enemy ped 'Chinese_gunman' in the cutscene.")
#ENDIF
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Dead_Brad")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Dead_Brad.")
#ENDIF
IF NOT IS_PED_INJURED(psBrad.PedIndex)
IF HAS_ANIM_DICT_LOADED("dead")
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iBradCadaverScene)
iBradCadaverScene = CREATE_SYNCHRONIZED_SCENE(<< 3258.899, -4574.090, 115.350 >>, << 173.880, 51.480, 5.040 >>, EULER_XYZ)
TASK_SYNCHRONIZED_SCENE(psBrad.PedIndex, iBradCadaverScene, "dead", "dead_g", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, RBF_BULLET_IMPACT | RBF_PLAYER_IMPACT | RBF_MELEE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psBrad.PedIndex)
STOP_PED_SPEAKING(psBrad.PedIndex, TRUE)
SET_ENTITY_INVINCIBLE(psBrad.PedIndex, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psBrad.PedIndex, TRUE)
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 DOES_ENTITY_EXIST(psTrevor.PedIndex)
DELETE_PED(psTrevor.PedIndex)
ENDIF
IF NOT DOES_PICKUP_EXIST(PistolPickup)
iPistolPickupPlacementFlags = 0
SET_BIT(iPistolPickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
SET_BIT(iPistolPickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_UPRIGHT))
SET_BIT(iPistolPickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
PistolPickup = CREATE_PICKUP_ROTATE(PICKUP_WEAPON_PISTOL, <<3258.7891, -4575.3062, 117.2570>>,
<<-88.2000, 65.8800, 0.0000>>, iPistolPickupPlacementFlags)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Michael.")
#ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
WARP_PED(PLAYER_PED_ID(), << 3256.5776, -4575.2520, 117.2670 >>, 267.6326, FALSE, FALSE, FALSE)
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), csCoverpoints[0].vPosition, -1, TRUE, 0, TRUE, TRUE, csCoverpoints[0].CoverpointIndex)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), TRUE)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("FBI_Agent_1_Gun")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for FBI_Agent_1_Gun.")
#ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
GIVE_WEAPON_OBJECT_TO_PED(WeaponMichaelObjectIndex, PLAYER_PED_ID())
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-16.536800)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-45.0000)
ELSE
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-16.536800)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-72.373550)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Chinese_gunman")
IF NOT IS_PED_INJURED(esWallEnemies[0].PedIndex)
WARP_PED(esWallEnemies[0].PedIndex, csCoverpoints[1].vPosition, csCoverpoints[1].fHeading, FALSE, FALSE, FALSE)
SET_CURRENT_PED_WEAPON(esWallEnemies[0].PedIndex, WEAPONTYPE_PISTOL, TRUE)
TASK_PUT_PED_DIRECTLY_INTO_COVER(esWallEnemies[0].PedIndex, csCoverpoints[1].vPosition, -1, FALSE, 0, TRUE, TRUE, csCoverpoints[1].CoverpointIndex)
FORCE_PED_AI_AND_ANIMATION_UPDATE(esWallEnemies[0].PedIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Enemy ped is put directly into cover in position ", csCoverpoints[1].vPosition, " when CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for 'Chinese_gunman'.")
#ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("MIC1_Shovel")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for MIC1_Shovel.")
#ENDIF
IF DOES_ENTITY_EXIST(osPropShovel.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osPropShovel.ObjectIndex)
SET_ENTITY_COORDS_NO_OFFSET(osPropShovel.ObjectIndex, osPropShovel.vPosition)
SET_ENTITY_ROTATION(osPropShovel.ObjectIndex, osPropShovel.vRotation)
FREEZE_ENTITY_POSITION(osPropShovel.ObjectIndex, TRUE)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("MIC1_PickAxe")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for MIC1_PickAxe.")
#ENDIF
IF DOES_ENTITY_EXIST(osPropPickaxe.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osPropPickaxe.ObjectIndex)
SET_ENTITY_COORDS_NO_OFFSET(osPropPickaxe.ObjectIndex, osPropPickaxe.vPosition)
SET_ENTITY_ROTATION(osPropPickaxe.ObjectIndex, osPropPickaxe.vRotation)
FREEZE_ENTITY_POSITION(osPropPickaxe.ObjectIndex, TRUE)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Coffin")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Coffin.")
#ENDIF
IF DOES_ENTITY_EXIST(osPropCoffin.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osPropCoffin.ObjectIndex)
SET_ENTITY_COORDS_NO_OFFSET(osPropCoffin.ObjectIndex, osPropCoffin.vPosition)
SET_ENTITY_ROTATION(osPropCoffin.ObjectIndex, osPropCoffin.vRotation)
FREEZE_ENTITY_POSITION(osPropCoffin.ObjectIndex, TRUE)
ENDIF
ENDIF
ENDIF
IF HAS_CUTSCENE_FINISHED()
IF HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_PISTOL)
AND ( bCoverpointsCreated = TRUE )
AND IS_PROLOGUE_GRAVE_IPL_ACTIVE(FALSE)
IF ( bCutsceneSkipped = TRUE )
IF ( bDamageDecalApplied = FALSE )
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
APPLY_PED_DAMAGE_DECAL(PLAYER_PED_ID(), PDZ_HEAD, 0.621, 0.755, 55.084, 0.01, 1.0, 1, TRUE, "bruise")
bDamageDecalApplied = TRUE
ENDIF
ENDIF
WAIT(2000) //wait until player ped is in low cover pose to hide any pops from standing still into low cover
ENDIF
IF ( bCutsceneSkipped = TRUE ) //set the gameplay camera relative pitch and heading again after skip
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PED_IN_COVER(PLAYER_PED_ID())
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-16.536800)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-45.0000)
ENDIF
ENDIF
ENDIF
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
psMichael.iTimer = GET_GAME_TIMER()
IF ( bCutsceneSkipped = FALSE )
TRIGGER_MUSIC_EVENT("MIC1_GAMEPLAY_STARTS")
ELSE
CANCEL_MUSIC_EVENT("MIC1_SHOOTOUT_START")
TRIGGER_MUSIC_EVENT("MIC1_ARGUE_CS_SKIP")
ENDIF
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
DELETE_VEHICLE(vsTrevorsCar.VehicleIndex)
ENDIF
IF DOES_ENTITY_EXIST(WeaponMichaelObjectIndex)
DELETE_OBJECT(WeaponMichaelObjectIndex)
ENDIF
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
DELETE_PED(psTrevor.PedIndex)
ENDIF
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
REPLAY_STOP_EVENT()
REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
RETURN TRUE
ENDIF
ELSE
REQUEST_ANIM_DICT("dead")
REQUEST_WEAPON_ASSET(WEAPONTYPE_PISTOL)
//create coverpoints during cutscene
IF ( bCoverpointsCreated = FALSE )
CREATE_COVERPOINTS(csCoverpoints, vShootoutStartPosition)
INITIALISE_FRAGGABLE_TOMBSTONES(FraggableTombstones)
bCoverpointsCreated = TRUE
ENDIF
//if cutscene is skipped take control of the fade
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(), ": Cutscene was skipped by the player.")
#ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC MANAGE_CONVERSATIONS_DURING_SHOOTOUT(INT &iConversationProgress, INT &iConversationTimer, INT &iEnemyTimer, INT &iMichaelTime,
INT &iEnemyTime, BOOL &bShootingConversationPlayed)
PED_INDEX ClosestEnemyPed
FLOAT fDistanceToClosestEnemyPed
INT i, k
INT iEnemySpeakerID
STRING sEnemyVoiceName
STRING sEnemyConversationRoot
SWITCH iConversationProgress
CASE 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
ClosestEnemyPed = GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(PLAYER_PED_ID(), rgEnemies)
IF ( ClosestEnemyPed <> NULL )
AND NOT IS_PED_SITTING_IN_ANY_VEHICLE(ClosestEnemyPed)
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON4SPEAKERID, ClosestEnemyPed, CHINESEGOON4VOICENAME)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSGCB", CONV_PRIORITY_MEDIUM)
iMichaelTime = 5000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
iConversationTimer = GET_GAME_TIMER()
iEnemyTimer = GET_GAME_TIMER()
bShootingConversationPlayed = FALSE
iConversationProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSMA")
IF ( GET_NUMBER_OF_ENEMIES_DEAD(esWallEnemies) >=2 )
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(sMichael1Conversation, "MCH1AUD", "MCH1_GSMA", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("MCH1_GSMA", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSS08")
IF DOES_ENTITY_EXIST(vsEnemyVans[0].VehicleIndex)
IF DOES_ENTITY_EXIST(esVanEnemies[0].PedIndex)
OR DOES_ENTITY_EXIST(esVanEnemies[1].PedIndex)
OR DOES_ENTITY_EXIST(esVanEnemies[2].PedIndex)
OR DOES_ENTITY_EXIST(esVanEnemies[3].PedIndex)
IF ( bSmoothCloseGateTriggered = TRUE )
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, 4)
IF NOT IS_PED_INJURED(esVanEnemies[i].PedIndex)
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
ENDFOR
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON4SPEAKERID, esVanEnemies[i].PedIndex, CHINESEGOON4VOICENAME)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSS08", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("MCH1_GSS08", TRUE)
iConversationTimer = GET_GAME_TIMER()
iEnemyTimer = GET_GAME_TIMER()
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
iEnemyTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//play dialogue for enemies exiting the van
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSGR2")
AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSGR3")
AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSGR4")
IF ( bPlayVanOpenConversation = TRUE )
IF DOES_ENTITY_EXIST(esVanEnemies[0].PedIndex) //check if any of the peds in van exists
OR DOES_ENTITY_EXIST(esVanEnemies[1].PedIndex)
OR DOES_ENTITY_EXIST(esVanEnemies[2].PedIndex)
OR DOES_ENTITY_EXIST(esVanEnemies[3].PedIndex)
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, 4) //select random ped exiting the van
IF NOT IS_PED_INJURED(esVanEnemies[i].PedIndex) //check if selected ped is not injured
SWITCH i
CASE 0
iEnemySpeakerID = CHINESEGOON2SPEAKERID
sEnemyVoiceName = CHINESEGOON2VOICENAME
sEnemyConversationRoot = "MCH1_GSGR2"
BREAK
CASE 1
iEnemySpeakerID = CHINESEGOON2SPEAKERID
sEnemyVoiceName = CHINESEGOON2VOICENAME
sEnemyConversationRoot = "MCH1_GSGR2"
BREAK
CASE 2
iEnemySpeakerID = CHINESEGOON4SPEAKERID
sEnemyVoiceName = CHINESEGOON4VOICENAME
sEnemyConversationRoot = "MCH1_GSGR3"
BREAK
CASE 3
iEnemySpeakerID = CHINESEGOON4SPEAKERID
sEnemyVoiceName = CHINESEGOON4VOICENAME
sEnemyConversationRoot = "MCH1_GSGR4"
BREAK
ENDSWITCH
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
ENDFOR
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, iEnemySpeakerID, esVanEnemies[i].PedIndex, sEnemyVoiceName)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", sEnemyConversationRoot, CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED(sEnemyConversationRoot, TRUE)
iConversationTimer = GET_GAME_TIMER()
iEnemyTimer = GET_GAME_TIMER()
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//play dialogue for enemy ped who exited the van and is calling out for the player
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSGCA")
IF HAS_LABEL_BEEN_TRIGGERED("MCH1_GSGR2")
OR HAS_LABEL_BEEN_TRIGGERED("MCH1_GSGR3")
OR HAS_LABEL_BEEN_TRIGGERED("MCH1_GSGR4")
IF ( bPlayVanExitConversation = TRUE)
IF DOES_ENTITY_EXIST(esVanEnemies[2].PedIndex)
IF NOT IS_PED_INJURED(esVanEnemies[2].PedIndex)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
ENDFOR
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON4SPEAKERID, esVanEnemies[2].PedIndex, CHINESEGOON4VOICENAME)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSGCA", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("MCH1_GSGCA", TRUE)
iConversationTimer = GET_GAME_TIMER()
iEnemyTimer = GET_GAME_TIMER()
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
IF ( bReplayStopEventTriggered = FALSE )
IF ( bReplayStartEventTriggered = TRUE )
REPLAY_STOP_EVENT()
bReplayStopEventTriggered = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//play dialogue for more enemies running from behind church
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSM04")
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3262.183105,-4629.664551,116.845070>>, << 30.0, 2.0, 3.0 >>)
IF ( esExitEnemies[COUNT_OF(esExitEnemies) - 1].bCreated = TRUE )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSM04", CONV_PRIORITY_HIGH)
SET_LABEL_AS_TRIGGERED("MCH1_GSM04", TRUE)
iConversationTimer = GET_GAME_TIMER()
iEnemyTimer = GET_GAME_TIMER()
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
iEnemyTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//play dialogue for enemies blocked by the train when they arrive
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSGBA")
IF ( bEnemiesBlockedByTrain = TRUE )
IF DOES_ENTITY_EXIST(esVan4Enemies[0].PedIndex)
OR DOES_ENTITY_EXIST(esVan4Enemies[1].PedIndex)
OR DOES_ENTITY_EXIST(esVan4Enemies[2].PedIndex)
OR DOES_ENTITY_EXIST(esVan4Enemies[3].PedIndex)
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, 4)
IF NOT IS_PED_INJURED(esVan4Enemies[i].PedIndex)
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
ENDFOR
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON5SPEAKERID, esVan4Enemies[i].PedIndex, CHINESEGOON5VOICENAME)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSGBA", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("MCH1_GSGBA", TRUE)
iConversationTimer = GET_GAME_TIMER()
iEnemyTimer = GET_GAME_TIMER()
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bPlayerDetected = FALSE ) //player not detected by enemies
//play van exit conversations for enemies
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_MOVE1")
IF ( bPlayVanExitConversation = TRUE)
IF DOES_ENTITY_EXIST(esVanEnemies[2].PedIndex)
IF NOT IS_PED_INJURED(esVanEnemies[2].PedIndex)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
ENDFOR
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON1SPEAKERID, esVanEnemies[2].PedIndex, CHINESEGOON1VOICENAME)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_MOVE1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("MCH1_MOVE1", TRUE)
iConversationTimer = GET_GAME_TIMER()
iEnemyTimer = GET_GAME_TIMER()
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//play dialogue when middle enemies are spawned
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_MOVE3")
IF ( bSecondEnemyWaveSpawned = TRUE )
IF DOES_ENTITY_EXIST(esMiddleEnemies[0].PedIndex)
OR DOES_ENTITY_EXIST(esMiddleEnemies[1].PedIndex)
OR DOES_ENTITY_EXIST(esMiddleEnemies[2].PedIndex)
i = GET_RANDOM_INT_IN_RANGE(0, 3)
IF NOT IS_PED_INJURED(esMiddleEnemies[i].PedIndex)
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
ENDFOR
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON3SPEAKERID, esMiddleEnemies[i].PedIndex, CHINESEGOON3VOICENAME)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_MOVE3", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("MCH1_MOVE3", TRUE)
iConversationTimer = GET_GAME_TIMER()
iEnemyTimer = GET_GAME_TIMER()
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
iEnemyTime = 4000 + GET_RANDOM_INT_IN_RANGE(0, 2001)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//play enemy searching dialogue
IF ( esMiddleEnemies[1].bSearching = TRUE )
IF DOES_ENTITY_EXIST(esMiddleEnemies[1].PedIndex)
IF NOT IS_PED_INJURED(esMiddleEnemies[1].PedIndex)
IF (esMiddleEnemies[1].iConversationTimer != 0)
IF HAS_TIME_PASSED(7500, esMiddleEnemies[1].iConversationTimer)
IF NOT IS_PED_INJURED(esMiddleEnemies[1].PedIndex)
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
ENDFOR
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON3SPEAKERID, esMiddleEnemies[1].PedIndex, CHINESEGOON3VOICENAME)
ENDIF
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_SURR3", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
esMiddleEnemies[1].iConversationTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ELSE
esMiddleEnemies[1].iConversationTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_TIME_PASSED(iEnemyTime, iEnemyTimer)
ClosestEnemyPed = GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(PLAYER_PED_ID(), rgEnemies, GET_RANDOM_INT_IN_RANGE(0, 4))
IF ( ClosestEnemyPed <> NULL )
AND NOT IS_PED_SITTING_IN_ANY_VEHICLE(ClosestEnemyPed)
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
ENDFOR
IF ( GET_NUMBER_OF_PEDS_FROM_RELATIONSHIP_GROUP_FOR_PED(PLAYER_PED_ID(), rgEnemies, FALSE) >= 1 )
SWITCH GET_RANDOM_INT_IN_RANGE(0,4)
CASE 0
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON1SPEAKERID, ClosestEnemyPed, CHINESEGOON1VOICENAME)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_MOVE1", CONV_PRIORITY_MEDIUM)
iEnemyTimer = GET_GAME_TIMER()
iEnemyTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
bShootingConversationPlayed = FALSE
ENDIF
BREAK
CASE 1
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON1SPEAKERID, ClosestEnemyPed, CHINESEGOON1VOICENAME)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_SURR1", CONV_PRIORITY_MEDIUM)
iEnemyTimer = GET_GAME_TIMER()
iEnemyTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
bShootingConversationPlayed = FALSE
ENDIF
BREAK
CASE 2
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON2SPEAKERID, ClosestEnemyPed, CHINESEGOON2VOICENAME)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_MOVE2", CONV_PRIORITY_MEDIUM)
iEnemyTimer = GET_GAME_TIMER()
iEnemyTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
bShootingConversationPlayed = FALSE
ENDIF
BREAK
CASE 3
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON2SPEAKERID, ClosestEnemyPed, CHINESEGOON2VOICENAME)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_SURR2", CONV_PRIORITY_MEDIUM)
iEnemyTimer = GET_GAME_TIMER()
iEnemyTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
bShootingConversationPlayed = FALSE
ENDIF
BREAK
ENDSWITCH
ENDIF
ELSE
iEnemyTimer = GET_GAME_TIMER()
iEnemyTime = 2000 + GET_RANDOM_INT_IN_RANGE(0, 1001)
bShootingConversationPlayed = FALSE
ENDIF
ENDIF
ENDIF
ELSE //player detected by enemies
//play dialogue for enemies spotting Michael
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_SPOT1")
AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_SPOT2")
AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_SPOT3")
AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_SPOT4")
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)
IF ( ClosestEnemyPed <> NULL )
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
ENDFOR
SWITCH GET_RANDOM_INT_IN_RANGE(1, 4)
CASE 1
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON1SPEAKERID, ClosestEnemyPed, CHINESEGOON1VOICENAME)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_SPOT1", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
SET_LABEL_AS_TRIGGERED("MCH1_SPOT1", TRUE)
iConversationTimer = GET_GAME_TIMER()
iEnemyTimer = GET_GAME_TIMER()
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
bDetectedConversationPlaying = TRUE
ENDIF
BREAK
CASE 2
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON2SPEAKERID, ClosestEnemyPed, CHINESEGOON2VOICENAME)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_SPOT2", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
SET_LABEL_AS_TRIGGERED("MCH1_SPOT2", TRUE)
iConversationTimer = GET_GAME_TIMER()
iEnemyTimer = GET_GAME_TIMER()
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
bDetectedConversationPlaying = TRUE
ENDIF
BREAK
CASE 3
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON3SPEAKERID, ClosestEnemyPed, CHINESEGOON3VOICENAME)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_SPOT3", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
SET_LABEL_AS_TRIGGERED("MCH1_SPOT3", TRUE)
iConversationTimer = GET_GAME_TIMER()
iEnemyTimer = GET_GAME_TIMER()
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
bDetectedConversationPlaying = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
TEXT_LABEL_23 CurrentConversationRoot
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot)
IF ARE_STRINGS_EQUAL(CurrentConversationRoot, "MCH1_SPOT1")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "MCH1_SPOT2")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "MCH1_SPOT3")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "MCH1_SPOT4")
bDetectedConversationPlaying = TRUE
ELSE
bDetectedConversationPlaying = FALSE
ENDIF
ELSE
bDetectedConversationPlaying = FALSE
ENDIF
ELSE
bDetectedConversationPlaying = FALSE
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_SURROUND")
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)
IF ( ClosestEnemyPed <> NULL )
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
ENDFOR
SWITCH GET_RANDOM_INT_IN_RANGE(1, 4)
CASE 1
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON1SPEAKERID, ClosestEnemyPed, CHINESEGOON1VOICENAME)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_SURR1", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
SET_LABEL_AS_TRIGGERED("MCH1_SURROUND", TRUE)
iConversationTimer = GET_GAME_TIMER()
iEnemyTimer = GET_GAME_TIMER()
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
bDetectedConversationPlaying = TRUE
ENDIF
BREAK
CASE 2
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON2SPEAKERID, ClosestEnemyPed, CHINESEGOON2VOICENAME)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_SURR2", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
SET_LABEL_AS_TRIGGERED("MCH1_SURROUND", TRUE)
iConversationTimer = GET_GAME_TIMER()
iEnemyTimer = GET_GAME_TIMER()
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
bDetectedConversationPlaying = TRUE
ENDIF
BREAK
CASE 3
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON3SPEAKERID, ClosestEnemyPed, CHINESEGOON3VOICENAME)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_SURR3", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
SET_LABEL_AS_TRIGGERED("MCH1_SURROUND", TRUE)
iConversationTimer = GET_GAME_TIMER()
iEnemyTimer = GET_GAME_TIMER()
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
bDetectedConversationPlaying = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//play Michael's shooting dialogue
IF ( bShootingConversationPlayed = FALSE )
//check for number of alive enemies
IF ( GET_NUMBER_OF_PEDS_FROM_RELATIONSHIP_GROUP_FOR_PED(PLAYER_PED_ID(), rgEnemies, FALSE) > 0 )
IF IS_PLAYER_SHOOTING_AT_ANY_PEDS(PLAYER_PED_ID())
SWITCH GET_RANDOM_INT_IN_RANGE(0, 4) //play shooting conversation with 75% chance
CASE 0
CASE 1
CASE 2
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSM02", CONV_PRIORITY_HIGH)
iConversationTimer = GET_GAME_TIMER()
iMichaelTime = 9000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
bShootingConversationPlayed = TRUE
ENDIF
BREAK
DEFAULT
//play no conversation, 25% chance
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
//play Michael's random dialogue
IF HAS_TIME_PASSED(iMichaelTime, iConversationTimer)
ClosestEnemyPed = GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(PLAYER_PED_ID(), rgEnemies) //get closest enemy
IF ( ClosestEnemyPed <> NULL ) //if the closest enemy ped exists
fDistanceToClosestEnemyPed = GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), ClosestEnemyPed) //get distance to enemy
IF ( fDistanceToClosestEnemyPed < 35.0 ) //do a distance check
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSM01", CONV_PRIORITY_MEDIUM)
iConversationTimer = GET_GAME_TIMER()
iMichaelTime = 9000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
bShootingConversationPlayed = FALSE
ENDIF
ELSE
iConversationTimer = GET_GAME_TIMER() //if distance check failed
iMichaelTime = 4000 + GET_RANDOM_INT_IN_RANGE(0, 2001) //reset conversation timers and flags
bShootingConversationPlayed = FALSE //set time amount between checks to be lower than usual
ENDIF
ELSE
iConversationTimer = GET_GAME_TIMER()
iMichaelTime = 9000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
bShootingConversationPlayed = FALSE
ENDIF
ENDIF
//play enemy random dialogue
IF HAS_TIME_PASSED(iEnemyTime, iEnemyTimer)
IF ( GET_NUMBER_OF_PEDS_FROM_RELATIONSHIP_GROUP_FOR_PED(PLAYER_PED_ID(), rgEnemies, FALSE) = 1 ) //one enemy is alive
ClosestEnemyPed = GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(PLAYER_PED_ID(), rgEnemies)
SWITCH GET_RANDOM_INT_IN_RANGE(0, 4)
CASE 0 //Chinese Goon 1 is the last enemy remaining
iEnemySpeakerID = CHINESEGOON1SPEAKERID
sEnemyVoiceName = CHINESEGOON1VOICENAME
sEnemyConversationRoot = "MCH1_GSGL1"
BREAK
CASE 1 //Chinese Goon 2 is the last enemy remaining
iEnemySpeakerID = CHINESEGOON2SPEAKERID
sEnemyVoiceName = CHINESEGOON2VOICENAME
sEnemyConversationRoot = "MCH1_GSGL2"
BREAK
CASE 2 //Chinese Goon 3 is the last enemy remaining, actual voice name 4
iEnemySpeakerID = CHINESEGOON4SPEAKERID
sEnemyVoiceName = CHINESEGOON4VOICENAME
sEnemyConversationRoot = "MCH1_GSGL3"
BREAK
CASE 3 //Chinese Goon 4 is the last enemy remaining
iEnemySpeakerID = CHINESEGOON4SPEAKERID
sEnemyVoiceName = CHINESEGOON4VOICENAME
sEnemyConversationRoot = "MCH1_GSGL4"
BREAK
ENDSWITCH
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
ENDFOR
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, iEnemySpeakerID, ClosestEnemyPed, sEnemyVoiceName)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", sEnemyConversationRoot, CONV_PRIORITY_MEDIUM)
iEnemyTimer = GET_GAME_TIMER()
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
bShootingConversationPlayed = FALSE
ENDIF
ELSE //multiple enemies are alive
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, 2) //randomly play enemy shouting to themselves or enemy shouting to Michael
CASE 0 //enemies shout to themselves in Mandarin
SWITCH GET_RANDOM_INT_IN_RANGE(0, 5)
CASE 0 //Chinese Goon 1 attacks and shouts to other goons in Mandarin
iEnemySpeakerID = CHINESEGOON1SPEAKERID
sEnemyVoiceName = CHINESEGOON1VOICENAME
sEnemyConversationRoot = "MCH1_GSGA1"
BREAK
CASE 1 //Chinese Goon 2 attacks and shouts to other goons in Mandarin
iEnemySpeakerID = CHINESEGOON2SPEAKERID
sEnemyVoiceName = CHINESEGOON2VOICENAME
sEnemyConversationRoot = "MCH1_GSGA2"
BREAK
CASE 2 //Chinese Goon 3 attacks and shouts to other goons in Mandarin, actual vaoice name is 4
iEnemySpeakerID = CHINESEGOON4SPEAKERID
sEnemyVoiceName = CHINESEGOON4VOICENAME
sEnemyConversationRoot = "MCH1_GSGA3"
BREAK
CASE 3 //Chinese Goon 4 attacks and shouts to other goons in Mandarin
iEnemySpeakerID = CHINESEGOON4SPEAKERID
sEnemyVoiceName = CHINESEGOON4VOICENAME
sEnemyConversationRoot = "MCH1_GSGA4"
BREAK
CASE 4 //Chinese Goon 5 attacks and shouts to to other goons in Mandarin, train is blocking them
IF ( bEnemiesBlockedByTrain = TRUE )
iEnemySpeakerID = CHINESEGOON5SPEAKERID
sEnemyVoiceName = CHINESEGOON5VOICENAME
sEnemyConversationRoot = "MCH1_GSGA5"
ELSE
iEnemySpeakerID = CHINESEGOON4SPEAKERID
sEnemyVoiceName = CHINESEGOON4VOICENAME
sEnemyConversationRoot = "MCH1_GSGA4"
ENDIF
BREAK
ENDSWITCH
BREAK
CASE 1 //enemies shout to Michael
SWITCH GET_RANDOM_INT_IN_RANGE(0, 5)
CASE 0 //Chinese Goon 1 shouts to Michael
iEnemySpeakerID = CHINESEGOON1SPEAKERID
sEnemyVoiceName = CHINESEGOON1VOICENAME
sEnemyConversationRoot = "MCH1_GSGS1"
BREAK
CASE 1 //Chinese Goon 2 shouts to Michael
iEnemySpeakerID = CHINESEGOON2SPEAKERID
sEnemyVoiceName = CHINESEGOON2VOICENAME
sEnemyConversationRoot = "MCH1_GSGS2"
BREAK
CASE 2 //Chinese Goon 3 shouts to Michael, actual voice name is 4
iEnemySpeakerID = CHINESEGOON4SPEAKERID
sEnemyVoiceName = CHINESEGOON4VOICENAME
sEnemyConversationRoot = "MCH1_GSGS3"
BREAK
CASE 3 //Chinese Goon 4 shouts to Michael
iEnemySpeakerID = CHINESEGOON4SPEAKERID
sEnemyVoiceName = CHINESEGOON4VOICENAME
sEnemyConversationRoot = "MCH1_GSGS4"
BREAK
CASE 4 //Chinese Goon 5 shouts to Michael, train is blocking them
IF ( bEnemiesBlockedByTrain = TRUE )
iEnemySpeakerID = CHINESEGOON5SPEAKERID
sEnemyVoiceName = CHINESEGOON5VOICENAME
sEnemyConversationRoot = "MCH1_GSGS5"
ELSE
iEnemySpeakerID = CHINESEGOON4SPEAKERID
sEnemyVoiceName = CHINESEGOON4VOICENAME
sEnemyConversationRoot = "MCH1_GSGS4"
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
ENDFOR
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, iEnemySpeakerID, ClosestEnemyPed, sEnemyVoiceName)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", sEnemyConversationRoot, CONV_PRIORITY_MEDIUM)
iEnemyTimer = GET_GAME_TIMER()
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
bShootingConversationPlayed = FALSE
ENDIF
ELSE
iEnemyTimer = GET_GAME_TIMER()
iEnemyTime = 5000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
bShootingConversationPlayed = FALSE
ENDIF
ENDIF
ENDIF
//play dialogue for spotting the second van
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSM05_1")
IF DOES_ENTITY_EXIST(vsEnemyVans[1].VehicleIndex) AND NOT IS_ENTITY_DEAD(vsEnemyVans[1].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyVans[1].VehicleIndex)
IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY_IN_FRONT(PLAYER_PED_ID(), vsEnemyVans[1].VehicleIndex)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSM05", CONV_PRIORITY_MEDIUM)
iConversationTimer = GET_GAME_TIMER()
iMichaelTime = 9000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
SET_LABEL_AS_TRIGGERED("MCH1_GSM05_1", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//play dialogue for spotting the third van
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSM05_2")
IF DOES_ENTITY_EXIST(vsEnemyVans[4].VehicleIndex) AND NOT IS_ENTITY_DEAD(vsEnemyVans[4].VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyVans[4].VehicleIndex)
IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY_IN_FRONT(PLAYER_PED_ID(), vsEnemyVans[4].VehicleIndex)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSM05", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("MCH1_GSM05_2", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSM06")
IF DOES_ENTITY_EXIST(vsEnemyVans[4].VehicleIndex) AND NOT IS_ENTITY_DEAD(vsEnemyVans[4].VehicleIndex)
IF DOES_ENTITY_EXIST(tsTrain.VehicleIndex) AND NOT IS_ENTITY_DEAD(tsTrain.VehicleIndex)
IF IS_VEHICLE_STOPPED(vsEnemyVans[4].VehicleIndex)
IF IS_ENTITY_AT_COORD(tsTrain.VehicleIndex, <<3245.581543,-4715.378906,115.788742>>,<<128.000000,32.000000,6.000000>>)
AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3227.010742,-4693.197754,115.645851>>,<<28.000000,22.000000,6.000000>>)
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSM06", CONV_PRIORITY_MEDIUM)
iConversationTimer = GET_GAME_TIMER()
iMichaelTime = 9000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
SET_LABEL_AS_TRIGGERED("MCH1_GSM06", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_CHURCH_BELL_SOUNDS(INT &iProgress)
IF NOT REQUEST_AMBIENT_AUDIO_BANK("CHURCH_BELL")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Loading ambient audio bank CHURCH_BELL.")
#ENDIF
ELSE
SWITCH iProgress
CASE 0
iProgress++
BREAK
CASE 1
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3259.471436,-4664.254395,116.152191>>,<<36.000000,30.000000,5.000000>>)
PLAY_SOUND_FROM_COORD(iChurchBellsSoundID, "RING", << 3243.52, -4665.81, 126.0 >>, "CHURCH_BELL_SOUNDSET")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing sound RING.")
#ENDIF
iProgress++
ENDIF
BREAK
CASE 2
IF NOT HAS_SOUND_FINISHED(iChurchBellsSoundID)
SET_VARIABLE_ON_SOUND(iChurchBellsSoundID, "CHURCH_BELL_RING_COUNT", 0.0)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Sound playing, setting variable.")
#ENDIF
ELSE
iProgress++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Sound finished.")
#ENDIF
ENDIF
BREAK
ENDSWITCH
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 IS_VEHICLE_DRIVEABLE(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)
// DRAW_DEBUG_TEXT(GET_STRING_FROM_VECTOR(vDamageOffset),GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vDamageOffset), 255, 0, 0)
//
// SWITCH eVehicleWheel
//
// CASE SC_WHEEL_CAR_FRONT_LEFT
// DRAW_DEBUG_TEXT("FRONT LEFT", GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vWheelOffset))
// BREAK
//
// CASE SC_WHEEL_CAR_FRONT_RIGHT
// DRAW_DEBUG_TEXT("FRONT RIGHT", GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vWheelOffset))
// BREAK
//
// CASE SC_WHEEL_CAR_REAR_LEFT
// DRAW_DEBUG_TEXT("REAR LEFT", GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vWheelOffset))
// BREAK
//
// CASE SC_WHEEL_CAR_REAR_RIGHT
// DRAW_DEBUG_TEXT("REAR RIGHT", GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vWheelOffset))
// BREAK
//
// ENDSWITCH
ENDIF
#ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC CHECK_VEHICLE_FOR_DRIVING_INTO_LOCATE(VEH_STRUCT &sVehicle, PED_INDEX PedIndex, VECTOR vLocatePosition, VECTOR vLocateSize)
IF NOT IS_PED_INJURED(PedIndex)
IF DOES_ENTITY_EXIST(sVehicle.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(sVehicle.VehicleIndex)
IF NOT IS_ENTITY_DEAD(sVehicle.VehicleIndex)
IF ( sVehicle.bSmoking = FALSE ) //use this flag to mark vehicle as no longer usable by player
//make the vehicle look like undriveable when it is driven into a locate
IF IS_PED_IN_VEHICLE(PedIndex, sVehicle.VehicleIndex)
IF IS_ENTITY_AT_COORD(sVehicle.VehicleIndex, vLocatePosition, vLocateSize)
SET_VEHICLE_ENGINE_HEALTH(sVehicle.VehicleIndex, 50)
SET_VEHICLE_ENGINE_ON(sVehicle.VehicleIndex, FALSE, TRUE)
SET_VEHICLE_UNDRIVEABLE(sVehicle.VehicleIndex, TRUE)
sVehicle.bSmoking = TRUE //use this flag to mark vehicle as no longer usable by player
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC UPDATE_VEHICLE_DAMAGE_FROM_PED(VEHICLE_INDEX VehicleIndex, PED_INDEX PedIndex, INT iExplodeHealth, INT iSmokeHealth, BOOL &bSmokingFlag,
VECTOR vDistanceFromVehicle, VECTOR vForce, VECTOR vForceOffset, BOOL bApplyForceDuringPlayback = FALSE,
FLOAT fStartPlaybackPercentage = 0.0, FLOAT fEndPlaybackPercentage = 100.0)
IF NOT IS_PED_INJURED(PedIndex)
IF DOES_ENTITY_EXIST(VehicleIndex)
IF NOT IS_ENTITY_DEAD(VehicleIndex)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, GET_STRING_FROM_INT(GET_ENTITY_HEALTH(VehicleIndex)), 2.15)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, GET_STRING_FROM_FLOAT(GET_VEHICLE_ENGINE_HEALTH(VehicleIndex)), 1.95)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, GET_STRING_FROM_FLOAT(GET_VEHICLE_PETROL_TANK_HEALTH(VehicleIndex)), 1.75)
#ENDIF
IF ( GET_ENTITY_HEALTH(VehicleIndex) = 0 )
IF NOT IS_ENTITY_AT_ENTITY(PedIndex, VehicleIndex, vDistanceFromVehicle)
EXPLODE_VEHICLE(VehicleIndex)
ELSE
SET_VEHICLE_ENGINE_HEALTH(VehicleIndex, -100)
SET_VEHICLE_PETROL_TANK_HEALTH(VehicleIndex, -100)
ENDIF
ELIF ( GET_ENTITY_HEALTH(VehicleIndex) < iExplodeHealth )
//only player can damage it below certain health to make it explode
IF IS_PED_SHOOTING_AT_ENTITY(PedIndex, VehicleIndex)
IF NOT IS_ENTITY_AT_ENTITY(PedIndex, VehicleIndex, vDistanceFromVehicle)
IF ( bApplyForceDuringPlayback = TRUE )
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(VehicleIndex)
FLOAT fPlaybackPercentage
fPlaybackPercentage = GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(VehicleIndex)
IF ( fPlaybackPercentage > fStartPlaybackPercentage AND fPlaybackPercentage < fEndPlaybackPercentage )
STOP_PLAYBACK_RECORDED_VEHICLE(VehicleIndex)
APPLY_FORCE_TO_ENTITY(VehicleIndex, APPLY_TYPE_IMPULSE, vForce, vForceOffset, 0, TRUE, TRUE, TRUE)
ENDIF
ENDIF
ENDIF
EXPLODE_VEHICLE(VehicleIndex)
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(VehicleIndex)
REPLAY_RECORD_BACK_FOR_TIME(3, 0, REPLAY_IMPORTANCE_HIGH)
ELSE
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
ELIF ( GET_ENTITY_HEALTH(VehicleIndex) < iSmokeHealth )
IF ( bSmokingFlag = FALSE )
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(VehicleIndex)
SET_VEHICLE_ENGINE_HEALTH(VehicleIndex, 50)
SET_VEHICLE_UNDRIVEABLE(VehicleIndex, TRUE)
bSmokingFlag = TRUE
ENDIF
ENDIF
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)
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 #IF IS_DEBUG_BUILD, bPrintDebugOutput #ENDIF)
PED_INDEX DriverPedIndex
DriverPedIndex = GET_PED_IN_VEHICLE_SEAT(VehicleIndex, VS_DRIVER)
IF DOES_ENTITY_EXIST(DriverPedIndex)
IF IS_PED_INJURED(DriverPedIndex)
bDriverDead = TRUE
STOP_PLAYBACK_RECORDED_VEHICLE(VehicleIndex)
ENDIF
ENDIF
RETURN TRUE
ELSE
IF ( bDriverDead = TRUE )
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Checks if one enemy ped should
/// PARAMS:
/// esEnemy1 - Enemy ped to replace the other enemy ped when esEnemy2 dies.
/// esEnemy2 - Enemy ped to check for death.
/// RETURNS:
/// TRUE if both enemy peds were created, one esEnemy2 has died, while esEnemy1 is alive.
FUNC BOOL SHOULD_ENEMY_REPLACE_DEAD_ENEMY(ENEMY_STRUCT esEnemy, ENEMY_STRUCT esDeadEnemy)
//only run this if both enemies were created
//and if the enemy is not already replacing another dead ped
IF ( esDeadEnemy.bCreated = TRUE )
AND ( esEnemy.bCreated = TRUE )
AND ( esEnemy.iProgress = 0 )
IF IS_PED_INJURED(esDeadEnemy.PedIndex)
AND NOT IS_PED_INJURED(esEnemy.PedIndex)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC MANAGE_PARKED_ENEMY_VEHICLES(INT &iProgress)
SWITCH iProgress
CASE 0
REQUEST_MODEL(mnEnemy)
REQUEST_MODEL(mnEnemyVan)
iProgress++
BREAK
CASE 1 //create parked vans
REQUEST_MODEL(mnEnemy)
REQUEST_MODEL(mnEnemyVan)
IF HAS_MODEL_LOADED(mnEnemy)
AND HAS_MODEL_LOADED(mnEnemyVan)
vsEnemyVans[2].VehicleIndex = CREATE_ENEMY_VEHICLE(vsEnemyVans[2], 1000, FALSE, TRUE, TRUE, FALSE, VEHICLELOCK_UNLOCKED, -1, -1, FALSE #IF IS_DEBUG_BUILD,"EnemyVan 2" #ENDIF)
vsEnemyVans[3].VehicleIndex = CREATE_ENEMY_VEHICLE(vsEnemyVans[3], 800, FALSE, TRUE, TRUE, FALSE, VEHICLELOCK_UNLOCKED, -1, -1, FALSE #IF IS_DEBUG_BUILD, "EnemyVan 3" #ENDIF)
iProgress++
ENDIF
BREAK
ENDSWITCH
// UPDATE_VEHICLE_DAMAGE_FROM_PED(vsEnemyVans[2].VehicleIndex, PLAYER_PED_ID(), 250, 475, vsEnemyVans[2].bSmoking,
// <<10.0, 10.0, 3.0>>, <<0.0, 0.0, 5.0>>, <<0.0, -1.5, 0.0>>, TRUE, 45.0, 70.0)
CHECK_VEHICLE_FOR_DRIVING_INTO_LOCATE(vsEnemyVans[2], PLAYER_PED_ID(), <<3222.843506,-4688.635742,114.212746>>, << 12.0, 16.0, 3.0 >>)
UPDATE_VEHICLE_DAMAGE_FROM_PED(vsEnemyVans[3].VehicleIndex, PLAYER_PED_ID(), 300, 475, vsEnemyVans[3].bSmoking,
<<10.0, 10.0, 3.0>>, <<0.0, 0.0, 5.0>>, <<0.0, -1.5, 0.0>>, TRUE, 45.0, 70.0)
CHECK_VEHICLE_FOR_DRIVING_INTO_LOCATE(vsEnemyVans[3], PLAYER_PED_ID(), <<3222.843506,-4688.635742,114.212746>>,<< 12.0, 16.0, 3.0 >>)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[2].VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT, vFrontRightOffset, 0.8, FALSE, TRUE, vFrontRightDamageOffset, 150.0)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[2].VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT, vFrontLeftOffset, 0.8, FALSE, TRUE, vFrontLeftDamageOffset, 150.0)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[2].VehicleIndex, SC_WHEEL_CAR_REAR_LEFT, vRearLeftOffset, 0.8, FALSE, TRUE, vRearLeftDamageOffset, 150.0)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[2].VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT, vRearRightOffset, 0.8, FALSE, TRUE, vRearRightDamageOffset, 150.0)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[3].VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT, vFrontRightOffset, 0.8, FALSE, TRUE, vFrontRightDamageOffset, 150.0)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[3].VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT, vFrontLeftOffset, 0.8, FALSE, TRUE, vFrontLeftDamageOffset, 150.0)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[3].VehicleIndex, SC_WHEEL_CAR_REAR_LEFT, vRearLeftOffset, 0.8, FALSE, TRUE, vRearLeftDamageOffset, 150.0)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[3].VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT, vRearRightOffset, 0.8, FALSE, TRUE, vRearRightDamageOffset, 150.0)
ENDPROC
PROC MANAGE_MISSION_TRAIN(INT &iProgress)
SWITCH iProgress
CASE 0
IF HAS_MISSION_TRAIN_BEEN_CREATED(tsTrain, 8.0, FALSE)
iProgress++
ENDIF
BREAK
CASE 1
IF DOES_ENTITY_EXIST(tsTrain.VehicleIndex)
AND DOES_ENTITY_EXIST(tsTrain.PedIndex)
IF HAS_SOUND_FINISHED(iTrainBellsSoundID)
IF REQUEST_SCRIPT_AUDIO_BANK("Prologue_Train_Sounds")
PLAY_SOUND_FROM_COORD(iTrainBellsSoundID, "Train_Bell", << 3217.51, -4702.84, 115.13 >>, "Prologue_Sounds")
ENDIF
ENDIF
IF IS_ENTITY_AT_COORD(tsTrain.VehicleIndex, <<4297.463867,-4725.532715,120.312271>>, << 10.0, 10.0, 10.0 >>)
DELETE_PED(tsTrain.PedIndex)
DELETE_MISSION_TRAIN(tsTrain.VehicleIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Deleted mission train.")
#ENDIF
IF NOT HAS_SOUND_FINISHED(iTrainBellsSoundID)
STOP_SOUND(iTrainBellsSoundID)
ENDIF
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Prologue_Train_Sounds")
iProgress++
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_FIRST_ENEMY_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL bPreviousEnemyWaveSpawned)
//create enemy wave when locate is reached
IF ( bCurrentEnemyWaveSpawned = FALSE )
IF ( bPreviousEnemyWaveSpawned = TRUE )
IF HAS_MODEL_LOADED(mnEnemy)
//create first wall enemies
IF NOT DOES_ENTITY_EXIST(esWallEnemies[0].PedIndex)
esWallEnemies[0].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3265.4900, -4590.8828, 115.9832 >>, 94.4126, rgEnemies, WEAPONTYPE_PISTOL)
ENDIF
esWallEnemies[1].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3262.19, -4593.96, 115.82 >>, 0.0, rgEnemies, WEAPONTYPE_ASSAULTRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
INITIALISE_ENEMY_GROUP(esWallEnemies, FALSE #IF IS_DEBUG_BUILD, "Wall " #ENDIF)
SET_PED_COMBAT_PROPERTIES(esWallEnemies[0].PedIndex, CM_DEFENSIVE, CAL_POOR, CR_FAR, CA_USE_COVER)
SET_PED_DEFENSIVE_AREA_ANGLED(esWallEnemies[0].PedIndex, <<3264.836914,-4590.833496,115.385437>>, <<3265.977295,-4590.834961,118.236443>>, 1.0)
SET_PED_PREFERRED_COVERPOINT(esWallEnemies[0].PedIndex, esWallEnemies[0].ItemsetIndex, csCoverpoints[1].CoverpointIndex)
SET_PED_COVER_PROPERTIES(esWallEnemies[0].PedIndex, TRUE, TRUE, FALSE, FALSE, 5.0, FALSE, 0.0, -1.0)
SET_PED_SHOOTING_PROPERTIES(esWallEnemies[0].PedIndex, 3)
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esWallEnemies[0].PedIndex, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esWallEnemies[0].PedIndex, 100.0)
esWallEnemies[0].iTimer = GET_GAME_TIMER()
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esWallEnemies[1].PedIndex, << 3264.27, -4585.25, 117.07 >>, PEDMOVE_RUN, FALSE, << 3256.55, -4575.72, 118.63 >>,
PLAYER_PED_ID(), FALSE, FALSE, FALSE, 1750, FIRING_TYPE_CONTINUOUS)
SET_PED_COMBAT_PROPERTIES(esWallEnemies[1].PedIndex, CM_WILLADVANCE, CAL_POOR, CR_NEAR, CA_AGGRESSIVE)
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_SHOOTING_PROPERTIES(esWallEnemies[1].PedIndex, 3, 100, FIRING_PATTERN_BURST_FIRE)
esWallEnemies[1].iTimer = GET_GAME_TIMER()
bCurrentEnemyWaveSpawned = TRUE
ENDIF
ENDIF
ELSE //wave is spawned, keep updating enemy behaviours
//update the first goon, who was in the cutscene
IF NOT IS_PED_INJURED(esWallEnemies[0].PedIndex)
SWITCH esWallEnemies[0].iProgress
CASE 0
IF HAS_TIME_PASSED(10000, esWallEnemies[0].iTimer)
OR IS_PED_INJURED(esWallEnemies[1].PedIndex)
esWallEnemies[0].bHasTask = FALSE
esWallEnemies[0].iProgress++
ENDIF
BREAK
CASE 1 //make the enemy peek more from cover
IF ( esWallEnemies[0].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_COVER_PROPERTIES(esWallEnemies[0].PedIndex, TRUE, TRUE, FALSE, FALSE, 10.0, FALSE, 0.0, 1.0, 5.0)
esWallEnemies[0].iTimer = GET_GAME_TIMER()
esWallEnemies[0].bHasTask = TRUE
ENDIF
IF HAS_TIME_PASSED(18000, esWallEnemies[0].iTimer)
esWallEnemies[0].bHasTask = FALSE
esWallEnemies[0].iProgress++
ENDIF
BREAK
CASE 2
IF ( esWallEnemies[0].bHasTask = FALSE )
REMOVE_PED_DEFENSIVE_AREA(esWallEnemies[0].PedIndex)
SET_PED_COMBAT_PROPERTIES(esWallEnemies[0].PedIndex, CM_WILLADVANCE, CAL_POOR, CR_NEAR, CA_AGGRESSIVE)
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COVER_PROPERTIES(esWallEnemies[0].PedIndex, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esWallEnemies[0].PedIndex, 100.0)
esWallEnemies[0].iTimer = GET_GAME_TIMER()
esWallEnemies[0].bHasTask = TRUE
ENDIF
IF HAS_TIME_PASSED(10000, esWallEnemies[0].iTimer)
esWallEnemies[0].bHasTask = FALSE
esWallEnemies[0].iProgress++
ENDIF
BREAK
CASE 3 //make the enemy more aggressive
IF ( esWallEnemies[0].bHasTask = FALSE )
REMOVE_PED_DEFENSIVE_AREA(esWallEnemies[0].PedIndex)
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[0].PedIndex, CA_CAN_FLANK, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[0].PedIndex, CA_AGGRESSIVE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_COMBAT_RANGE(esWallEnemies[0].PedIndex, CR_NEAR)
SET_PED_COMBAT_MOVEMENT(esWallEnemies[0].PedIndex, CM_WILLADVANCE)
SET_PED_SHOOTING_PROPERTIES(esWallEnemies[0].PedIndex, 3, 125, FIRING_PATTERN_BURST_FIRE)
esWallEnemies[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
//update the second goon, the one who charges at the player initially
IF NOT IS_PED_INJURED(esWallEnemies[1].PedIndex)
SWITCH esWallEnemies[1].iProgress
CASE 0
IF HAS_TIME_PASSED(6000, esWallEnemies[1].iTimer)
OR IS_PED_IN_COMBAT(esWallEnemies[1].PedIndex)
esWallEnemies[1].bHasTask = FALSE
esWallEnemies[1].iProgress++
ENDIF
BREAK
CASE 1 //make the enemy move to the left
IF ( esWallEnemies[1].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esWallEnemies[1].PedIndex, 100.0)
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[1].PedIndex, CA_OPEN_COMBAT_WHEN_DEFENSIVE_AREA_IS_REACHED, TRUE)
SET_PED_COMBAT_PROPERTIES(esWallEnemies[1].PedIndex, CM_WILLADVANCE, CAL_AVERAGE, CR_NEAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_COMBAT_MOVEMENT_VALUES(esWallEnemies[1].PedIndex, 1.0, 1.0)
SET_PED_DEFENSIVE_AREA_SPHERE(esWallEnemies[1].PedIndex, << 3267.71, -4577.71, 117.21 >>, 1.25)
SET_PED_COVER_PROPERTIES(esWallEnemies[1].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, FALSE, 0.0, 2.0)
SET_PED_SHOOTING_PROPERTIES(esWallEnemies[1].PedIndex, 3, 125, FIRING_PATTERN_BURST_FIRE)
esWallEnemies[1].iTimer = GET_GAME_TIMER()
esWallEnemies[1].bHasTask = TRUE
ENDIF
IF HAS_TIME_PASSED(15000, esWallEnemies[1].iTimer)
esWallEnemies[1].bHasTask = FALSE
esWallEnemies[1].iProgress++
ENDIF
BREAK
CASE 2 //make the enemy more aggressive
IF ( esWallEnemies[1].bHasTask = FALSE )
REMOVE_PED_DEFENSIVE_AREA(esWallEnemies[1].PedIndex)
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[1].PedIndex, CA_CAN_FLANK, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[1].PedIndex, CA_AGGRESSIVE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_COMBAT_RANGE(esWallEnemies[1].PedIndex, CR_NEAR)
SET_PED_COMBAT_MOVEMENT(esWallEnemies[1].PedIndex, CM_WILLADVANCE)
SET_PED_SHOOTING_PROPERTIES(esWallEnemies[1].PedIndex, 3, 150, FIRING_PATTERN_BURST_FIRE)
esWallEnemies[1].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
CLEANUP_ENEMY_GROUP(esWallEnemies)
IF ( GET_NUMBER_OF_ENEMIES_DEAD(esWallEnemies) = 2 )
IF ( iFirstVanTriggerTimer = 0 )
iFirstVanTriggerTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Staring van trigger timer.")
#ENDIF
ENDIF
ENDIF
ENDIF
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esWallEnemies)
ENDPROC
PROC MANAGE_SECOND_ENEMY_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL bPreviousEnemyWaveSpawned, INT iAliveEnemiesCountToTriggerWave)
//create enemy wave when locate is reached
IF ( bCurrentEnemyWaveSpawned = FALSE )
IF ( bPreviousEnemyWaveSpawned = TRUE )
IF IS_ENTITY_IN_LOCATE(PLAYER_PED_ID(), << 3267.560303, -4588.922363, 118.005730 >>, << 30.0, 3.5, 2.0 >> #IF IS_DEBUG_BUILD, "SecondWaveTriggerLocate" #ENDIF)
OR ( iFirstVanTriggerTimer != 0 AND HAS_TIME_PASSED(26000, iFirstVanTriggerTimer) )
OR ( GET_NUMBER_OF_ENEMIES_ALIVE(esWallEnemies) <= iAliveEnemiesCountToTriggerWave )
//create middle enemies
esMiddleEnemies[0].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3270.1250, -4642.8452, 113.1802 >>, 5.9782, rgEnemies, WEAPONTYPE_ASSAULTRIFLE, WEAPONCOMPONENT_INVALID, TRUE)
esMiddleEnemies[1].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3275.9019, -4645.0601, 113.2832 >>, 359.8844, rgEnemies, WEAPONTYPE_ASSAULTRIFLE, WEAPONCOMPONENT_AT_AR_FLSH, TRUE)
esMiddleEnemies[2].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3268.3623, -4654.7510, 113.0602 >>, 359.9476, rgEnemies, WEAPONTYPE_ASSAULTRIFLE, WEAPONCOMPONENT_INVALID, TRUE)
INITIALISE_ENEMY_GROUP(esMiddleEnemies, FALSE #IF IS_DEBUG_BUILD, "Middle " #ENDIF)
SET_PED_SEEING_RANGE(esMiddleEnemies[0].PedIndex, 20.0)
SET_PED_SEEING_RANGE(esMiddleEnemies[1].PedIndex, 15.0)
SET_PED_SEEING_RANGE(esMiddleEnemies[2].PedIndex, 20.0)
GO_TO_ENEMY_STATE(esMiddleEnemies[0], ENEMY_STATE_SCRIPTED_ENTRY)
GO_TO_ENEMY_STATE(esMiddleEnemies[1], ENEMY_STATE_SCRIPTED_ENTRY)
GO_TO_ENEMY_STATE(esMiddleEnemies[2], ENEMY_STATE_SCRIPTED_ENTRY)
bCurrentEnemyWaveSpawned = TRUE
ENDIF
ENDIF
ELSE //wave is spawned, keep updating enemy behaviours
//block enemy weapon fire until the 'player detected' conversation plays out
IF ( bPlayerDetected = FALSE )
BLOCK_WEAPON_FIRE_FOR_ENEMY_GROUP(esMiddleEnemies)
ELIF ( bPlayerDetected = TRUE )
IF ( bDetectedConversationPlaying = TRUE )
BLOCK_WEAPON_FIRE_FOR_ENEMY_GROUP(esMiddleEnemies)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(esMiddleEnemies[0].PedIndex)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(esMiddleEnemies[0].PedIndex, GET_ENEMY_STATE_NAME_FOR_DEBUG(esMiddleEnemies[0].eState), 1.25)
#ENDIF
SWITCH esMiddleEnemies[0].eState
CASE ENEMY_STATE_SCRIPTED_ENTRY
SWITCH esMiddleEnemies[0].iProgress
CASE 0
esMiddleEnemies[0].iTimer = GET_GAME_TIMER()
esMiddleEnemies[0].iProgress++
BREAK
CASE 1
IF ( esMiddleEnemies[0].bHasTask = FALSE )
IF HAS_TIME_PASSED(5000, esMiddleEnemies[0].iTimer)
COMBAT_SEQUENCE_GO_TO_COVER_WHILE_AIMING_THEN_COMBAT(esMiddleEnemies[0].PedIndex, << 3276.90, -4617.48, 115.02 >>, PEDMOVE_SLOWRUN, FALSE, << 3273.65, -4590.99, 117.19 >>, NULL, FALSE, -1)
SET_PED_COMBAT_PROPERTIES(esMiddleEnemies[0].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_COMBAT_ATTRIBUTES(esMiddleEnemies[0].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_DEFENSIVE_AREA_SPHERE(esMiddleEnemies[0].PedIndex, << 3276.90, -4617.48, 115.02 >>, 2.75)
SET_PED_COVER_PROPERTIES(esMiddleEnemies[0].PedIndex, TRUE, TRUE, FALSE, FALSE, 6.0, FALSE, 0.0, 3.0)
SET_PED_SHOOTING_PROPERTIES(esMiddleEnemies[0].PedIndex, 4)
esMiddleEnemies[0].bHasTask = TRUE
ENDIF
ENDIF
IF ( esMiddleEnemies[0].bFallingBack = FALSE )
IF ( bPlayerUsedAlternativePath = TRUE )
esMiddleEnemies[0].bHasTask = FALSE
esMiddleEnemies[0].iProgress = 100
esMiddleEnemies[0].bFallingBack = TRUE
ENDIF
ENDIF
BREAK
CASE 100
IF ( esMiddleEnemies[0].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esMiddleEnemies[0].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esMiddleEnemies[0].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_ANGLED(esMiddleEnemies[0].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
SET_PED_COMBAT_MOVEMENT_VALUES(esMiddleEnemies[0].PedIndex, 0.8, 0.25)
SET_PED_COVER_PROPERTIES(esMiddleEnemies[0].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
esMiddleEnemies[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
IF IS_PED_IN_COMBAT(esMiddleEnemies[0].PedIndex)
OR ( bPlayerDetected = TRUE )
GO_TO_ENEMY_STATE(esMiddleEnemies[0], ENEMY_STATE_COMBAT)
ENDIF
BREAK
CASE ENEMY_STATE_COMBAT
IF ( esMiddleEnemies[0].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esMiddleEnemies[0].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esMiddleEnemies[0].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_COMBAT_ATTRIBUTES(esMiddleEnemies[0].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esMiddleEnemies[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_DEFENSIVE_AREA_SPHERE(esMiddleEnemies[0].PedIndex, << 3276.90, -4617.48, 115.02 >>, 2.75)
SET_PED_COVER_PROPERTIES(esMiddleEnemies[0].PedIndex, TRUE, TRUE, FALSE, FALSE, 6.0, FALSE, 0.0, 3.0)
SET_PED_SHOOTING_PROPERTIES(esMiddleEnemies[0].PedIndex, 4)
SET_PED_VISUAL_FIELD_PROPERTIES(esMiddleEnemies[0].PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esMiddleEnemies[0].PedIndex, FALSE)
bPlayerDetected = TRUE
esMiddleEnemies[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
IF NOT IS_PED_INJURED(esMiddleEnemies[1].PedIndex)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(esMiddleEnemies[1].PedIndex, GET_ENEMY_STATE_NAME_FOR_DEBUG(esMiddleEnemies[1].eState), 1.25)
#ENDIF
SWITCH esMiddleEnemies[1].eState
CASE ENEMY_STATE_SCRIPTED_ENTRY
SWITCH esMiddleEnemies[1].iProgress
CASE 0
esMiddleEnemies[1].iTimer = GET_GAME_TIMER()
esMiddleEnemies[1].iProgress++
BREAK
CASE 1
IF ( esMiddleEnemies[1].bHasTask = FALSE )
IF HAS_TIME_PASSED(5000, esMiddleEnemies[1].iTimer)
COMBAT_SEQUENCE_GO_TO_COVER_WHILE_AIMING_THEN_COMBAT(esMiddleEnemies[1].PedIndex, << 3269.19, -4627.51, 114.85 >>, PEDMOVE_SLOWRUN, FALSE, << 3273.65, -4590.99, 117.19 >>, NULL, FALSE, -1)
SET_PED_COMBAT_PROPERTIES(esMiddleEnemies[1].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_COMBAT_ATTRIBUTES(esMiddleEnemies[1].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_DEFENSIVE_AREA_SPHERE(esMiddleEnemies[1].PedIndex,<< 3269.19, -4627.51, 114.85 >>, 3.0)
SET_PED_COVER_PROPERTIES(esMiddleEnemies[1].PedIndex, TRUE, FALSE, TRUE, FALSE, 7.0, FALSE, 0.0, 3.0)
SET_PED_SHOOTING_PROPERTIES(esMiddleEnemies[1].PedIndex, 4)
esMiddleEnemies[1].bHasTask = TRUE
ENDIF
ENDIF
IF ( bStartSearching = TRUE )
GO_TO_ENEMY_STATE(esMiddleEnemies[1], ENEMY_STATE_FOLLOW_WAYPOINT_RECORDING)
ENDIF
IF ( esMiddleEnemies[1].bFallingBack = FALSE )
IF ( bPlayerUsedAlternativePath = TRUE )
esMiddleEnemies[1].bHasTask = FALSE
esMiddleEnemies[1].iProgress = 100
esMiddleEnemies[1].bFallingBack = TRUE
ENDIF
ENDIF
BREAK
CASE 100
IF ( esMiddleEnemies[1].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esMiddleEnemies[1].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esMiddleEnemies[1].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_ANGLED(esMiddleEnemies[1].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
SET_PED_COMBAT_MOVEMENT_VALUES(esMiddleEnemies[1].PedIndex, 0.9, 0.1)
SET_PED_COVER_PROPERTIES(esMiddleEnemies[1].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
esMiddleEnemies[1].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
IF IS_PED_IN_COMBAT(esMiddleEnemies[1].PedIndex)
OR ( bPlayerDetected = TRUE )
GO_TO_ENEMY_STATE(esMiddleEnemies[1], ENEMY_STATE_COMBAT)
ENDIF
BREAK
CASE ENEMY_STATE_FOLLOW_WAYPOINT_RECORDING
SET_PED_RESET_FLAG(esMiddleEnemies[1].PedIndex, PRF_UseHeadOrientationForPerception, TRUE)
IF ( esMiddleEnemies[1].bHasTask = FALSE )
REQUEST_WAYPOINT_RECORDING("mic1_c")
REQUEST_ANIM_DICT("missmic1ig_3_patrol")
IF GET_IS_WAYPOINT_RECORDING_LOADED("mic1_c")
AND HAS_ANIM_DICT_LOADED("missmic1ig_3_patrol")
INT iClostestWaypoint
IF WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT("mic1_c", GET_ENTITY_COORDS(esMiddleEnemies[1].PedIndex), iClostestWaypoint)
AND ( iClostestWaypoint > 30 ) //this makes enemy walk in a loop forever starting from waypoint 33 in the route
TASK_FOLLOW_WAYPOINT_RECORDING(esMiddleEnemies[1].PedIndex, "mic1_c", 32, EWAYPOINT_TURN_TO_FACE_WAYPOINT_HEADING_AT_END)
ELSE //this makes enemy walk to the start waypoint in the route
TASK_FOLLOW_WAYPOINT_RECORDING(esMiddleEnemies[1].PedIndex, "mic1_c", 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_TURN_TO_FACE_WAYPOINT_HEADING_AT_END)
ENDIF
esMiddleEnemies[1].iWaypointProgress = 0
esMiddleEnemies[1].bSearching = TRUE
esMiddleEnemies[1].bHasTask = TRUE
ENDIF
ENDIF
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(esMiddleEnemies[1].PedIndex)
AND NOT IS_ENTITY_PLAYING_ANIM(esMiddleEnemies[1].PedIndex, "missmic1ig_3_patrol", "search_walk_fwd_b")
IF ( esMiddleEnemies[1].iWaypointProgress != 0 )
IF ( esMiddleEnemies[1].iWaypointProgress != GET_PED_WAYPOINT_PROGRESS(esMiddleEnemies[1].PedIndex) )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Progress: ", GET_PED_WAYPOINT_PROGRESS(esMiddleEnemies[1].PedIndex))
PRINTLN(GET_THIS_SCRIPT_NAME(), ": enemy.iWaypointProgress: ", esMiddleEnemies[1].iWaypointProgress)
#ENDIF
INT iTotalPoints
VECTOR vNodeVector
IF WAYPOINT_RECORDING_GET_NUM_POINTS("mic1_c", iTotalPoints)
IF ( esMiddleEnemies[1].iWaypointProgress < iTotalPoints )
IF WAYPOINT_RECORDING_GET_COORD("mic1_c", esMiddleEnemies[1].iWaypointProgress + 3, vNodeVector)
TASK_PLAY_ANIM(esMiddleEnemies[1].PedIndex, "missmic1ig_3_patrol", "search_walk_fwd_b",
WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_SECONDARY | AF_LOOPING |
AF_TAG_SYNC_IN | AF_TAG_SYNC_OUT | AF_TAG_SYNC_CONTINUOUS | AF_UPPERBODY)
esMiddleEnemies[1].iWaypointProgress = GET_PED_WAYPOINT_PROGRESS(esMiddleEnemies[1].PedIndex)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
esMiddleEnemies[1].iWaypointProgress = GET_PED_WAYPOINT_PROGRESS(esMiddleEnemies[1].PedIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Progress: ", GET_PED_WAYPOINT_PROGRESS(esMiddleEnemies[1].PedIndex))
PRINTLN(GET_THIS_SCRIPT_NAME(), ": enemy.iWaypointProgress: ", esMiddleEnemies[1].iWaypointProgress)
#ENDIF
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(esMiddleEnemies[1].PedIndex, SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) = FINISHED_TASK
GO_TO_ENEMY_STATE(esMiddleEnemies[1], ENEMY_STATE_FOLLOW_WAYPOINT_RECORDING)
ENDIF
ENDIF
IF IS_PED_IN_COMBAT(esMiddleEnemies[1].PedIndex)
OR ( bPlayerDetected = TRUE )
CLEAR_PED_SECONDARY_TASK(esMiddleEnemies[1].PedIndex)
GO_TO_ENEMY_STATE(esMiddleEnemies[1], ENEMY_STATE_COMBAT)
ENDIF
BREAK
CASE ENEMY_STATE_COMBAT
IF ( esMiddleEnemies[1].bHasTask = FALSE )
CLEAR_PED_SECONDARY_TASK(esMiddleEnemies[1].PedIndex)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esMiddleEnemies[1].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esMiddleEnemies[1].PedIndex, CM_WILLADVANCE, CAL_AVERAGE, CR_NEAR, CA_USE_COVER)
SET_PED_COMBAT_ATTRIBUTES(esMiddleEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esMiddleEnemies[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
REMOVE_PED_DEFENSIVE_AREA(esMiddleEnemies[1].PedIndex)
SET_PED_SHOOTING_PROPERTIES(esMiddleEnemies[1].PedIndex, 4, 100, FIRING_PATTERN_BURST_FIRE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esMiddleEnemies[1].PedIndex, FALSE)
SET_PED_VISUAL_FIELD_PROPERTIES(esMiddleEnemies[1].PedIndex)
bPlayerDetected = TRUE
esMiddleEnemies[1].bSearching = FALSE
esMiddleEnemies[1].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
IF NOT IS_PED_INJURED(esMiddleEnemies[2].PedIndex)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(esMiddleEnemies[2].PedIndex, GET_ENEMY_STATE_NAME_FOR_DEBUG(esMiddleEnemies[2].eState), 1.25)
#ENDIF
SWITCH esMiddleEnemies[2].eState
CASE ENEMY_STATE_SCRIPTED_ENTRY
SWITCH esMiddleEnemies[2].iProgress
CASE 0
esMiddleEnemies[2].iTimer = GET_GAME_TIMER()
esMiddleEnemies[2].iProgress++
BREAK
CASE 1
IF ( esMiddleEnemies[2].bHasTask = FALSE )
IF HAS_TIME_PASSED(5000, esMiddleEnemies[2].iTimer)
COMBAT_SEQUENCE_GO_TO_COVER_WHILE_AIMING_THEN_COMBAT(esMiddleEnemies[2].PedIndex, << 3279.21, -4628.83, 114.92 >>, PEDMOVE_SLOWRUN, FALSE, << 3273.65, -4590.99, 117.19 >>, NULL, FALSE, -1)
SET_PED_COMBAT_PROPERTIES(esMiddleEnemies[2].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_COMBAT_ATTRIBUTES(esMiddleEnemies[2].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_DEFENSIVE_AREA_SPHERE(esMiddleEnemies[2].PedIndex, << 3279.21, -4628.83, 114.92 >>, 3.0)
SET_PED_COVER_PROPERTIES(esMiddleEnemies[2].PedIndex, TRUE, FALSE, TRUE, FALSE, 5.0, FALSE, 0.0, 2.5)
SET_PED_SHOOTING_PROPERTIES(esMiddleEnemies[2].PedIndex, 4)
esMiddleEnemies[2].bHasTask = TRUE
ENDIF
ENDIF
IF ( esMiddleEnemies[2].bFallingBack = FALSE )
IF ( bPlayerUsedAlternativePath = TRUE )
esMiddleEnemies[2].bHasTask = FALSE
esMiddleEnemies[2].iProgress = 100
esMiddleEnemies[2].bFallingBack = TRUE
ENDIF
ENDIF
BREAK
CASE 100
IF ( esMiddleEnemies[2].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esMiddleEnemies[2].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esMiddleEnemies[2].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_ANGLED(esMiddleEnemies[2].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
SET_PED_COMBAT_MOVEMENT_VALUES(esMiddleEnemies[2].PedIndex, 0.9, 0.1)
SET_PED_COVER_PROPERTIES(esMiddleEnemies[2].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
esMiddleEnemies[2].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
IF IS_PED_IN_COMBAT(esMiddleEnemies[2].PedIndex)
OR ( bPlayerDetected = TRUE )
GO_TO_ENEMY_STATE(esMiddleEnemies[2], ENEMY_STATE_COMBAT)
ENDIF
BREAK
CASE ENEMY_STATE_COMBAT
IF ( esMiddleEnemies[2].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esMiddleEnemies[2].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esMiddleEnemies[2].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_COMBAT_ATTRIBUTES(esMiddleEnemies[2].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esMiddleEnemies[2].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_DEFENSIVE_AREA_SPHERE(esMiddleEnemies[2].PedIndex, << 3279.21, -4628.83, 114.92 >>, 3.0)
SET_PED_COVER_PROPERTIES(esMiddleEnemies[2].PedIndex, TRUE, FALSE, TRUE, FALSE, 5.0, FALSE, 0.0, 2.5)
SET_PED_SHOOTING_PROPERTIES(esMiddleEnemies[2].PedIndex, 4)
SET_PED_VISUAL_FIELD_PROPERTIES(esMiddleEnemies[2].PedIndex)
esMiddleEnemies[2].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
CLEANUP_ENEMY_GROUP(esMiddleEnemies)
ENDIF
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esMiddleEnemies)
ENDPROC
PROC MANAGE_THIRD_ENEMY_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL bPreviousEnemyWaveSpawned)
//create enemy wave when locate is reached
IF ( bCurrentEnemyWaveSpawned = FALSE )
IF ( bPreviousEnemyWaveSpawned = TRUE )
IF IS_ENTITY_IN_LOCATE(PLAYER_PED_ID(), << 3264.409424, -4611.560547, 117.022507 >>, << 30.0, 3.0, 2.0 >> #IF IS_DEBUG_BUILD, "ThirdWaveLocate" #ENDIF)
//OR ( GET_NUMBER_OF_ENEMIES_DEAD(esMiddleEnemies) + GET_NUMBER_OF_ENEMIES_DEAD(esVanEnemies) >= 6 )
esRunners[0].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3266.25, -4642.72, 113.23 >>, 324.2408, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
esRunners[1].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3274.37, -4640.03, 113.66 >>, 0.0, rgEnemies, WEAPONTYPE_PISTOL)
INITIALISE_ENEMY_GROUP(esRunners, FALSE #IF IS_DEBUG_BUILD, "Runners " #ENDIF)
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esRunners[0].PedIndex, << 3271.2998, -4631.0703, 114.7037 >>, PEDMOVE_RUN, FALSE, vZero, PLAYER_PED_ID(), TRUE)
SET_PED_COMBAT_PROPERTIES(esRunners[0].PedIndex, CM_WILLADVANCE, CAL_POOR, CR_NEAR, CA_AGGRESSIVE)
SET_PED_COMBAT_ATTRIBUTES(esRunners[0].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esRunners[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esRunners[0].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_SHOOTING_PROPERTIES(esRunners[0].PedIndex, 4, 50, FIRING_PATTERN_FULL_AUTO)
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esRunners[1].PedIndex, << 3273.3306, -4623.3579, 114.7698 >>, PEDMOVE_RUN, FALSE, vZero, PLAYER_PED_ID(), TRUE)
SET_PED_COMBAT_PROPERTIES(esRunners[1].PedIndex, CM_WILLADVANCE, CAL_POOR, CR_NEAR, CA_AGGRESSIVE)
SET_PED_COMBAT_ATTRIBUTES(esRunners[1].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esRunners[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esRunners[1].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_SHOOTING_PROPERTIES(esRunners[1].PedIndex, 4)
esChurchEnemies[0].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3285.61, -4651.54, 112.84 >>, 0.0, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
esChurchEnemies[1].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3279.87, -4671.24, 112.83 >>, 0.0, rgEnemies, WEAPONTYPE_ASSAULTRIFLE, WEAPONCOMPONENT_INVALID, TRUE)
INITIALISE_ENEMY_GROUP(esChurchEnemies, FALSE #IF IS_DEBUG_BUILD, "Church " #ENDIF)
COMBAT_SEQUENCE_GO_TO_COMBAT(esChurchEnemies[0].PedIndex)
SET_PED_COMBAT_PROPERTIES(esChurchEnemies[0].PedIndex, CM_DEFENSIVE, CAL_POOR, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_COMBAT_ATTRIBUTES(esChurchEnemies[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esChurchEnemies[0].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_DEFENSIVE_AREA_ANGLED(esChurchEnemies[0].PedIndex, <<3282.731934,-4650.353516,112.839226>>, <<3278.938232,-4650.336426,115.636375>>, 2.0)
SET_PED_COVER_PROPERTIES(esChurchEnemies[0].PedIndex, TRUE, TRUE, FALSE, TRUE, 6.0, FALSE, 0.0, 3.0)
//SET_PED_PREFERRED_COVERPOINT(esChurchEnemies[0].PedIndex, esChurchEnemies[0].ItemsetIndex, csCoverpoints[20].CoverpointIndex)
SET_PED_SHOOTING_PROPERTIES(esChurchEnemies[0].PedIndex, 3)
COMBAT_SEQUENCE_GO_TO_COORD_THEN_COMBAT(esChurchEnemies[1].PedIndex, << 3277.91, -4670.24, 112.87 >>, PEDMOVE_WALK, -1)
SET_PED_COMBAT_PROPERTIES(esChurchEnemies[1].PedIndex, CM_DEFENSIVE, CAL_POOR, CR_FAR, CA_USE_COVER)
SET_PED_COMBAT_ATTRIBUTES(esChurchEnemies[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esChurchEnemies[1].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_DEFENSIVE_AREA_SPHERE(esChurchEnemies[1].PedIndex, <<3277.91, -4670.24, 112.87>>, 2.0)
SET_PED_SHOOTING_PROPERTIES(esChurchEnemies[1].PedIndex, 4)
bCurrentEnemyWaveSpawned = TRUE
ENDIF
ENDIF
ELSE //wave is spawned, keep updating enemy behaviours
//update the first runner ped charging at the player
IF NOT IS_PED_INJURED(esRunners[0].PedIndex)
IF ( esRunners[0].bFallingBack = FALSE )
IF ( bPlayerUsedAlternativePath = TRUE )
esRunners[0].bHasTask = FALSE
esRunners[0].iProgress = 100
esRunners[0].bFallingBack = TRUE
ENDIF
ENDIF
SWITCH esRunners[0].iProgress
CASE 0
IF IS_PED_IN_COMBAT(esRunners[0].PedIndex) //if the enemy ped is done with the combat sequence and is now in combat
esRunners[0].bHasTask = FALSE
esRunners[0].iProgress++
ENDIF
BREAK
CASE 1 //make the runner enemy go to ai combat and try to seek cover
IF ( esRunners[0].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esRunners[0].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esRunners[0].PedIndex, CM_WILLRETREAT, CAL_POOR, CR_MEDIUM, CA_USE_COVER)
SET_PED_SHOOTING_PROPERTIES(esRunners[0].PedIndex, 4)
esRunners[0].bHasTask = TRUE
ENDIF
BREAK
CASE 100 //make the enemy fall back to the parking lot
IF ( esRunners[0].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esRunners[0].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esRunners[0].PedIndex, CM_DEFENSIVE, CAL_POOR, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_ANGLED(esRunners[0].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
SET_PED_COMBAT_MOVEMENT_VALUES(esRunners[0].PedIndex, 0.5, 0.0)
esRunners[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
//update the second runner ped charging at the player
IF NOT IS_PED_INJURED(esRunners[1].PedIndex)
IF ( esRunners[1].bFallingBack = FALSE )
IF ( bPlayerUsedAlternativePath = TRUE )
esRunners[1].bHasTask = FALSE
esRunners[1].iProgress = 100
esRunners[1].bFallingBack = TRUE
ENDIF
ENDIF
SWITCH esRunners[1].iProgress
CASE 0
IF IS_PED_IN_COMBAT(esRunners[1].PedIndex)
esRunners[1].bHasTask = FALSE
esRunners[1].iProgress++
ENDIF
BREAK
CASE 1 //make the runner enemy go to ai combat and try to seek cover
IF ( esRunners[1].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esRunners[1].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esRunners[1].PedIndex, CM_WILLRETREAT, CAL_POOR, CR_MEDIUM, CA_USE_COVER)
SET_PED_SHOOTING_PROPERTIES(esRunners[1].PedIndex, 4)
esRunners[1].bHasTask = TRUE
ENDIF
BREAK
CASE 100 //make the enemy fall back to the parking lot
IF ( esRunners[1].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esRunners[1].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esRunners[1].PedIndex, CM_DEFENSIVE, CAL_POOR, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_ANGLED(esRunners[1].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
SET_PED_COMBAT_MOVEMENT_VALUES(esRunners[1].PedIndex, 0.5, 0.0)
esRunners[1].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
IF NOT IS_PED_INJURED(esChurchEnemies[0].PedIndex)
IF ( esChurchEnemies[0].bFallingBack = FALSE )
IF ( bPlayerUsedAlternativePath = TRUE )
esChurchEnemies[0].bHasTask = FALSE
esChurchEnemies[0].iProgress = 100
esChurchEnemies[0].bFallingBack = TRUE
ENDIF
ENDIF
SWITCH esChurchEnemies[0].iProgress
CASE 100
IF ( esChurchEnemies[0].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esChurchEnemies[0].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esChurchEnemies[0].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_ANGLED(esChurchEnemies[0].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
SET_PED_COMBAT_MOVEMENT_VALUES(esChurchEnemies[0].PedIndex, 0.5, 0.0)
SET_PED_COVER_PROPERTIES(esChurchEnemies[0].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
//SET_PED_PREFERRED_COVERPOINT(esChurchEnemies[0].PedIndex, esChurchEnemies[0].ItemsetIndex, csCoverpoints[26].CoverpointIndex)
esChurchEnemies[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
IF NOT IS_PED_INJURED(esChurchEnemies[1].PedIndex)
IF ( esChurchEnemies[1].bFallingBack = FALSE )
IF ( bPlayerUsedAlternativePath = TRUE )
esChurchEnemies[1].bHasTask = FALSE
esChurchEnemies[1].iProgress = 100
esChurchEnemies[1].bFallingBack = TRUE
ENDIF
ENDIF
SWITCH esChurchEnemies[1].iProgress
CASE 100
IF ( esChurchEnemies[1].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esChurchEnemies[1].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esChurchEnemies[1].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_ANGLED(esChurchEnemies[1].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
SET_PED_COMBAT_MOVEMENT_VALUES(esChurchEnemies[1].PedIndex, 0.5, 0.0)
SET_PED_COVER_PROPERTIES(esChurchEnemies[1].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
esChurchEnemies[1].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
CLEANUP_ENEMY_GROUP(esRunners)
CLEANUP_ENEMY_GROUP(esChurchEnemies)
ENDIF
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esRunners)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esChurchEnemies)
ENDPROC
PROC MANAGE_FOURTH_ENEMY_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL bPreviousEnemyWaveSpawned, INT iAliveEnemiesCountToTriggerWave)
//create enemy wave when locate is reached
IF ( bCurrentEnemyWaveSpawned = FALSE )
IF ( bPreviousEnemyWaveSpawned = TRUE )
IF IS_ENTITY_IN_LOCATE(PLAYER_PED_ID(), <<3262.183105,-4629.664551,116.845070>>, << 30.0, 2.0, 3.0 >> #IF IS_DEBUG_BUILD, "FourthWaveLocate" #ENDIF)
OR ( ( GET_NUMBER_OF_ENEMIES_ALIVE(esRunners) + GET_NUMBER_OF_ENEMIES_ALIVE(esChurchEnemies) ) <= iAliveEnemiesCountToTriggerWave )
esExitEnemies[0].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3253.03, -4672.16, 113.57 >>, 0.0, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
esExitEnemies[1].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3253.27, -4686.10, 111.96 >>, 341.08, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
esExitEnemies[2].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3257.50, -4695.39, 111.85 >>, 345.48, rgEnemies, WEAPONTYPE_PUMPSHOTGUN)
esExitEnemies[3].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3251.4146, -4686.4194, 111.8743 >>, 350.8474, rgEnemies, WEAPONTYPE_PUMPSHOTGUN)
esExitEnemies[4].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3261.0928, -4693.9453, 111.8941 >>, 0.7368, rgEnemies, WEAPONTYPE_ASSAULTRIFLE, WEAPONCOMPONENT_INVALID, TRUE)
INITIALISE_ENEMY_GROUP(esExitEnemies, FALSE #IF IS_DEBUG_BUILD, "Exit " #ENDIF)
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esExitEnemies[0].PedIndex, << 3272.56, -4664.50, 112.84 >>, PEDMOVE_RUN, FALSE, vZero, PLAYER_PED_ID(), TRUE)
SET_PED_SHOOTING_PROPERTIES(esExitEnemies[0].PedIndex, 3)
SET_PED_COMBAT_ATTRIBUTES(esExitEnemies[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
COMBAT_SEQUENCE_GO_TO_COMBAT(esExitEnemies[1].PedIndex)
SET_PED_COMBAT_PROPERTIES(esExitEnemies[1].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_SPHERE(esExitEnemies[1].PedIndex, << 3256.53, -4686.60, 111.91 >>, 3.0)
SET_PED_COVER_PROPERTIES(esExitEnemies[1].PedIndex, TRUE, FALSE, TRUE, FALSE, 0.0, FALSE)
SET_PED_SHOOTING_PROPERTIES(esExitEnemies[1].PedIndex, 4)
SET_PED_COMBAT_ATTRIBUTES(esExitEnemies[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
COMBAT_SEQUENCE_GO_TO_COMBAT(esExitEnemies[2].PedIndex)
SET_PED_COMBAT_PROPERTIES(esExitEnemies[2].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_USE_COVER)
SET_PED_DEFENSIVE_AREA_SPHERE(esExitEnemies[2].PedIndex, << 3255.64, -4692.65, 111.84 >>, 3.0)
SET_PED_COVER_PROPERTIES(esExitEnemies[2].PedIndex, TRUE, TRUE, FALSE, FALSE, 0.0, FALSE)
SET_PED_SHOOTING_PROPERTIES(esExitEnemies[2].PedIndex, 3)
SET_PED_COMBAT_ATTRIBUTES(esExitEnemies[2].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
COMBAT_SEQUENCE_GO_TO_COMBAT(esExitEnemies[3].PedIndex)
SET_PED_COMBAT_PROPERTIES(esExitEnemies[3].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_SPHERE(esExitEnemies[3].PedIndex, << 3263.23, -4672.08, 112.81 >>, 1.5)
SET_PED_COVER_PROPERTIES(esExitEnemies[3].PedIndex, TRUE, TRUE, FALSE, FALSE, 0.0, FALSE)
SET_PED_SHOOTING_PROPERTIES(esExitEnemies[3].PedIndex, 4)
SET_PED_COMBAT_ATTRIBUTES(esExitEnemies[3].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
COMBAT_SEQUENCE_GO_TO_COMBAT(esExitEnemies[4].PedIndex)
SET_PED_COMBAT_PROPERTIES(esExitEnemies[4].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_SPHERE(esExitEnemies[4].PedIndex, << 3261.49, -4691.44, 112.03 >>, 3.0)
SET_PED_COVER_PROPERTIES(esExitEnemies[4].PedIndex, TRUE, FALSE, TRUE, FALSE, 0.0, FALSE)
SET_PED_SHOOTING_PROPERTIES(esExitEnemies[4].PedIndex, 3)
SET_PED_COMBAT_ATTRIBUTES(esExitEnemies[4].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
bCurrentEnemyWaveSpawned = TRUE
ENDIF
ENDIF
ELSE //wave is spawned, keep updating enemy behaviours
IF NOT IS_PED_INJURED(esExitEnemies[0].PedIndex)
IF ( esExitEnemies[0].bFallingBack = FALSE )
IF ( bPlayerUsedAlternativePath = TRUE )
esExitEnemies[0].bHasTask = FALSE
esExitEnemies[0].iProgress = 100
esExitEnemies[0].bFallingBack = TRUE
ENDIF
ENDIF
SWITCH esExitEnemies[0].iProgress
CASE 100
IF ( esExitEnemies[0].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esExitEnemies[0].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esExitEnemies[0].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_ANGLED(esExitEnemies[0].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
SET_PED_COMBAT_MOVEMENT_VALUES(esExitEnemies[0].PedIndex, 0.5, 0.0)
SET_PED_COVER_PROPERTIES(esExitEnemies[0].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
esExitEnemies[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
IF NOT IS_PED_INJURED(esExitEnemies[1].PedIndex)
IF ( esExitEnemies[1].bFallingBack = FALSE )
IF ( bPlayerUsedAlternativePath = TRUE )
esExitEnemies[1].bHasTask = FALSE
esExitEnemies[1].iProgress = 100
esExitEnemies[1].bFallingBack = TRUE
ENDIF
ENDIF
SWITCH esExitEnemies[1].iProgress
CASE 0
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3257.505371,-4658.068848,116.680290>>,<<36.0,10.0,4.0>>)
//OR ( GET_NUMBER_OF_ENEMIES_ALIVE(esChurchEnemies) + GET_NUMBER_OF_ENEMIES_ALIVE(esSideVanEnemies) < 3 )
esExitEnemies[1].bHasTask = FALSE
esExitEnemies[1].iProgress++
ENDIF
BREAK
CASE 1
IF ( esExitEnemies[1].bHasTask = FALSE )
COMBAT_SEQUENCE_GO_TO_COMBAT(esExitEnemies[1].PedIndex)
SET_PED_COMBAT_PROPERTIES(esExitEnemies[1].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, CA_CAN_CHARGE)
SET_PED_COVER_PROPERTIES(esExitEnemies[1].PedIndex, TRUE, FALSE, TRUE, FALSE, 7.5, FALSE, 0.0, 2.5, 5.5)
SET_PED_SHOOTING_PROPERTIES(esExitEnemies[1].PedIndex, 4)
esExitEnemies[1].bHasTask = TRUE
ENDIF
BREAK
CASE 100
IF ( esExitEnemies[1].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esExitEnemies[1].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esExitEnemies[1].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_ANGLED(esExitEnemies[1].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
SET_PED_COMBAT_MOVEMENT_VALUES(esExitEnemies[1].PedIndex, 0.5, 0.0)
SET_PED_COVER_PROPERTIES(esExitEnemies[1].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
esExitEnemies[1].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
IF NOT IS_PED_INJURED(esExitEnemies[2].PedIndex)
IF ( esExitEnemies[2].bFallingBack = FALSE )
IF ( bPlayerUsedAlternativePath = TRUE )
esExitEnemies[2].bHasTask = FALSE
esExitEnemies[2].iProgress = 100
esExitEnemies[2].bFallingBack = TRUE
ENDIF
ENDIF
SWITCH esExitEnemies[2].iProgress
CASE 0
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3257.505371,-4658.068848,116.680290>>,<<36.0,10.0,4.0>>)
//OR ( GET_NUMBER_OF_ENEMIES_ALIVE(esChurchEnemies) + GET_NUMBER_OF_ENEMIES_ALIVE(esSideVanEnemies) < 3 )
esExitEnemies[2].bHasTask = FALSE
esExitEnemies[2].iProgress++
ENDIF
BREAK
CASE 1
IF ( esExitEnemies[2].bHasTask = FALSE )
COMBAT_SEQUENCE_GO_TO_COMBAT(esExitEnemies[2].PedIndex)
SET_PED_COMBAT_PROPERTIES(esExitEnemies[2].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, CA_CAN_CHARGE)
SET_PED_COVER_PROPERTIES(esExitEnemies[2].PedIndex, TRUE, TRUE, FALSE, FALSE, 9.0, FALSE, 0.0, 3.0, 4.0)
SET_PED_SHOOTING_PROPERTIES(esExitEnemies[2].PedIndex, 3)
esExitEnemies[2].bHasTask = TRUE
ENDIF
BREAK
CASE 100
IF ( esExitEnemies[2].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esExitEnemies[2].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esExitEnemies[2].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_ANGLED(esExitEnemies[2].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
SET_PED_COMBAT_MOVEMENT_VALUES(esExitEnemies[2].PedIndex, 0.5, 0.0)
SET_PED_COVER_PROPERTIES(esExitEnemies[2].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
REMOVE_PED_PREFERRED_COVERPOINT(esExitEnemies[2].PedIndex, esExitEnemies[2].ItemsetIndex)
esExitEnemies[2].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
IF NOT IS_PED_INJURED(esExitEnemies[3].PedIndex)
IF ( esExitEnemies[3].bFallingBack = FALSE )
IF ( bPlayerUsedAlternativePath = TRUE )
esExitEnemies[3].bHasTask = FALSE
esExitEnemies[3].iProgress = 100
esExitEnemies[3].bFallingBack = TRUE
ENDIF
ENDIF
SWITCH esExitEnemies[3].iProgress
CASE 0
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3257.505371,-4658.068848,116.680290>>,<<36.0,10.0,4.0>>)
OR ( GET_NUMBER_OF_ENEMIES_ALIVE(esChurchEnemies) + GET_NUMBER_OF_ENEMIES_ALIVE(esSideVanEnemies) < 3 )
esExitEnemies[3].bHasTask = FALSE
esExitEnemies[3].iProgress++
ENDIF
BREAK
CASE 1
IF ( esExitEnemies[3].bHasTask = FALSE )
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esExitEnemies[3].PedIndex, << 3263.08, -4665.64, 112.71 >>, PEDMOVE_RUN, FALSE, vZero, PLAYER_PED_ID(), FALSE)
SET_PED_COMBAT_PROPERTIES(esExitEnemies[3].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER)
SET_PED_COMBAT_ATTRIBUTES(esExitEnemies[3].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esExitEnemies[3].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COVER_PROPERTIES(esExitEnemies[3].PedIndex, TRUE, FALSE, FALSE, FALSE, 0.0, FALSE)
SET_PED_SHOOTING_PROPERTIES(esExitEnemies[3].PedIndex, 4)
esExitEnemies[3].bHasTask = TRUE
ENDIF
BREAK
CASE 100
IF ( esExitEnemies[3].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esExitEnemies[3].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esExitEnemies[3].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_ANGLED(esExitEnemies[3].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
SET_PED_COMBAT_MOVEMENT_VALUES(esExitEnemies[3].PedIndex, 0.5, 0.0)
SET_PED_COVER_PROPERTIES(esExitEnemies[3].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
esExitEnemies[3].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
IF NOT IS_PED_INJURED(esExitEnemies[4].PedIndex)
IF ( esExitEnemies[4].bFallingBack = FALSE )
IF ( bPlayerUsedAlternativePath = TRUE )
esExitEnemies[4].bHasTask = FALSE
esExitEnemies[4].iProgress = 100
esExitEnemies[4].bFallingBack = TRUE
ENDIF
ENDIF
SWITCH esExitEnemies[4].iProgress
CASE 0
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3257.505371,-4658.068848,116.680290>>,<<36.0,10.0,4.0>>)
OR ( GET_NUMBER_OF_ENEMIES_ALIVE(esChurchEnemies) + GET_NUMBER_OF_ENEMIES_ALIVE(esSideVanEnemies) < 3 )
esExitEnemies[4].bHasTask = FALSE
esExitEnemies[4].iProgress++
ENDIF
BREAK
CASE 1
IF ( esExitEnemies[4].bHasTask = FALSE )
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esExitEnemies[4].PedIndex, << 3261.90, -4680.61, 111.95 >>, PEDMOVE_RUN, FALSE, vZero, PLAYER_PED_ID(), TRUE)
SET_PED_COMBAT_PROPERTIES(esExitEnemies[4].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_COMBAT_ATTRIBUTES(esExitEnemies[4].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_DEFENSIVE_AREA_SPHERE(esExitEnemies[4].PedIndex, << 3268.94, -4663.72, 112.88 >>, 4.0)
SET_PED_COVER_PROPERTIES(esExitEnemies[4].PedIndex, TRUE, FALSE, FALSE, FALSE, 0.0, FALSE)
SET_PED_SHOOTING_PROPERTIES(esExitEnemies[4].PedIndex, 3)
esExitEnemies[4].bHasTask = TRUE
ENDIF
BREAK
CASE 100
IF ( esExitEnemies[4].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esExitEnemies[4].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esExitEnemies[4].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_ANGLED(esExitEnemies[4].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
SET_PED_COMBAT_MOVEMENT_VALUES(esExitEnemies[4].PedIndex, 0.5, 0.0)
SET_PED_COVER_PROPERTIES(esExitEnemies[4].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
esExitEnemies[4].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
CLEANUP_ENEMY_GROUP(esExitEnemies)
ENDIF
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esExitEnemies)
ENDPROC
PROC MANAGE_FIFTH_ENEMY_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL&bCurrentEnemyWaveIgnored, BOOL bPreviousEnemyWaveSpawned)
//check if locate ignoring this enemy wave was reached
IF ( bCurrentEnemyWaveIgnored = FALSE )
IF IS_ENTITY_IN_ANGLED_AREA_LOCATE(PLAYER_PED_ID(), <<3294.089111,-4665.589844,112.151215>>,
<<3222.692383,-4659.922852,117.261169>>, 16.0 #IF IS_DEBUG_BUILD, "IgnoreFifthWaveLocate" #ENDIF)
bCurrentEnemyWaveIgnored = TRUE
ENDIF
ENDIF
//create enemy wave when locate is reached
IF ( bCurrentEnemyWaveSpawned = FALSE )
IF ( bPreviousEnemyWaveSpawned = TRUE )
IF ( bCurrentEnemyWaveIgnored = FALSE ) //create this enemy wave when locate for ignoring was not reached by player
AND IS_ENTITY_IN_ANGLED_AREA_LOCATE(PLAYER_PED_ID(), <<3238.833984,-4639.374023,113.510277>>,
<<3234.517334,-4652.879395,118.686172>>, 14.0 #IF IS_DEBUG_BUILD, "FifthWaveLocate" #ENDIF)
esSideEnemies[0].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3240.9082, -4665.7764, 114.6382 >>, 0.0, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
esSideEnemies[1].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3244.5220, -4672.7925, 113.1723 >>, 48.64, rgEnemies, WEAPONTYPE_PUMPSHOTGUN)
esSideEnemies[2].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3231.5359, -4684.4063, 111.6351 >>, 306.53, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
INITIALISE_ENEMY_GROUP(esSideEnemies, FALSE #IF IS_DEBUG_BUILD, "Side " #ENDIF)
SET_PED_COMBAT_PROPERTIES(esSideEnemies[0].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[0].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[0].PedIndex, CA_DISABLE_SEEK_DUE_TO_LINE_OF_SIGHT, FALSE)
SET_PED_DEFENSIVE_AREA_ANGLED(esSideEnemies[0].PedIndex, <<3239.528320,-4665.080566,113.577934>>, <<3240.278564,-4665.159180,116.508667>>, 1.0)
SET_PED_PREFERRED_COVERPOINT(esSideEnemies[0].PedIndex, esSideEnemies[0].ItemsetIndex, csCoverpoints[25].CoverpointIndex)
SET_PED_COVER_PROPERTIES(esSideEnemies[0].PedIndex, TRUE, TRUE, FALSE, FALSE, 8.0, FALSE, 0.0, 1.0, 4.5)
SET_PED_SHOOTING_PROPERTIES(esSideEnemies[0].PedIndex, 15)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esSideEnemies[0].PedIndex, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSideEnemies[0].PedIndex, 100.0)
esSideEnemies[0].iTimer = GET_GAME_TIMER()
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esSideEnemies[1].PedIndex, << 3237.66, -4665.48, 113.57 >>, PEDMOVE_RUN,
FALSE, vZero, PLAYER_PED_ID(), FALSE, FALSE, TRUE, 1000, FIRING_TYPE_CONTINUOUS)
SET_PED_COMBAT_PROPERTIES(esSideEnemies[1].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_NEAR, CA_AGGRESSIVE)
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[1].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[1].PedIndex, CA_DISABLE_SEEK_DUE_TO_LINE_OF_SIGHT, FALSE)
SET_PED_SHOOTING_PROPERTIES(esSideEnemies[1].PedIndex, 15, 125, FIRING_PATTERN_FULL_AUTO)
SET_PED_COMBAT_PROPERTIES(esSideEnemies[2].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_NEAR, CA_AGGRESSIVE)
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[2].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[2].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[2].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[2].PedIndex, CA_DISABLE_SEEK_DUE_TO_LINE_OF_SIGHT, FALSE)
SET_PED_SHOOTING_PROPERTIES(esSideEnemies[2].PedIndex, 15, 125, FIRING_PATTERN_FULL_AUTO)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esSideEnemies[2].PedIndex, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSideEnemies[2].PedIndex, 100.0)
bCurrentEnemyWaveSpawned = TRUE
ENDIF
ENDIF
ELSE //wave is spawned, keep updating enemy behaviours
CLEANUP_ENEMY_GROUP(esSideEnemies)
ENDIF
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esSideEnemies)
ENDPROC
PROC MANAGE_FIRST_ENEMY_REINFORCEMENT_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL bMainEnemyWaveSpawned)
IF ( bCurrentEnemyWaveSpawned = FALSE )
IF ( bMainEnemyWaveSpawned = FALSE )
IF ( GET_NUMBER_OF_ENEMIES_DEAD(esMiddleEnemies) + GET_NUMBER_OF_ENEMIES_DEAD(esVanEnemies) + GET_NUMBER_OF_ENEMIES_DEAD(esWallEnemies) >= 8 )
esFirstReinforcementEnemies[0].PedIndex = CREATE_ENEMY_PED(mnEnemy, <<3265.5913, -4642.5308, 113.3619>>, 341.20, rgEnemies, WEAPONTYPE_ASSAULTRIFLE, WEAPONCOMPONENT_AT_AR_FLSH, TRUE)
esFirstReinforcementEnemies[1].PedIndex = CREATE_ENEMY_PED(mnEnemy, <<3284.5649, -4651.4722, 113.3171>>, 6.62, rgEnemies, WEAPONTYPE_PUMPSHOTGUN, WEAPONCOMPONENT_INVALID, TRUE)
INITIALISE_ENEMY_GROUP(esFirstReinforcementEnemies, FALSE #IF IS_DEBUG_BUILD, "1st " #ENDIF)
bCurrentEnemyWaveSpawned = TRUE
ENDIF
ENDIF
ELSE //wave is spawned, keep updating enemy behaviours
IF DOES_ENTITY_EXIST(esFirstReinforcementEnemies[0].PedIndex)
IF NOT IS_ENTITY_DEAD(esFirstReinforcementEnemies[0].PedIndex)
SWITCH esFirstReinforcementEnemies[0].iProgress
CASE 0
IF ( esFirstReinforcementEnemies[0].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(esFirstReinforcementEnemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esFirstReinforcementEnemies[0].PedIndex, CA_AGGRESSIVE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esFirstReinforcementEnemies[0].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(esFirstReinforcementEnemies[0].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_RANGE(esFirstReinforcementEnemies[0].PedIndex, CR_NEAR)
SET_PED_COMBAT_MOVEMENT(esFirstReinforcementEnemies[0].PedIndex, CM_WILLADVANCE)
SET_PED_SHOOTING_PROPERTIES(esFirstReinforcementEnemies[0].PedIndex, 3)
SET_COMBAT_FLOAT(esFirstReinforcementEnemies[0].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(esFirstReinforcementEnemies[0].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esFirstReinforcementEnemies[0].PedIndex, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esFirstReinforcementEnemies[0].PedIndex, FALSE)
esFirstReinforcementEnemies[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esFirstReinforcementEnemies[1].PedIndex)
IF NOT IS_ENTITY_DEAD(esFirstReinforcementEnemies[1].PedIndex)
SWITCH esFirstReinforcementEnemies[1].iProgress
CASE 0
IF ( esFirstReinforcementEnemies[1].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(esFirstReinforcementEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esFirstReinforcementEnemies[1].PedIndex, CA_AGGRESSIVE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esFirstReinforcementEnemies[1].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(esFirstReinforcementEnemies[1].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_RANGE(esFirstReinforcementEnemies[1].PedIndex, CR_NEAR)
SET_PED_COMBAT_MOVEMENT(esFirstReinforcementEnemies[1].PedIndex, CM_WILLADVANCE)
SET_PED_SHOOTING_PROPERTIES(esFirstReinforcementEnemies[1].PedIndex, 4)
SET_COMBAT_FLOAT(esFirstReinforcementEnemies[1].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(esFirstReinforcementEnemies[1].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esFirstReinforcementEnemies[1].PedIndex, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esFirstReinforcementEnemies[1].PedIndex, FALSE)
esFirstReinforcementEnemies[1].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
CLEANUP_ENEMY_GROUP(esFirstReinforcementEnemies)
ENDIF
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esFirstReinforcementEnemies)
ENDPROC
PROC MANAGE_SECOND_ENEMY_REINFORCEMENT_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL bPreviousEnemyWaveSpawned, BOOL bMainEnemyWaveSpawned)
IF ( bCurrentEnemyWaveSpawned = FALSE )
IF ( bMainEnemyWaveSpawned = FALSE)
AND ( bPreviousEnemyWaveSpawned = TRUE )
IF ( GET_NUMBER_OF_ENEMIES_DEAD(esFirstReinforcementEnemies) >= 1 )
IF iSecondEnemyReinforcementDelayTimer = 0
iSecondEnemyReinforcementDelayTimer = GET_GAME_TIMER()
ELSE
IF HAS_TIME_PASSED(3000, iSecondEnemyReinforcementDelayTimer)
esSecondReinforcementEnemies[0].PedIndex = CREATE_ENEMY_PED(mnEnemy, <<3283.0278, -4639.9214, 114.3816>>, 7.6314, rgEnemies, WEAPONTYPE_ASSAULTRIFLE, WEAPONCOMPONENT_AT_AR_FLSH, TRUE)
esSecondReinforcementEnemies[1].PedIndex = CREATE_ENEMY_PED(mnEnemy, <<3261.2634, -4645.3687, 112.9646>>, 352.95, rgEnemies, WEAPONTYPE_PISTOL, WEAPONCOMPONENT_INVALID, TRUE)
INITIALISE_ENEMY_GROUP(esSecondReinforcementEnemies, FALSE #IF IS_DEBUG_BUILD, "2nd " #ENDIF)
bCurrentEnemyWaveSpawned = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE //wave is spawned, keep updating enemy behaviours
IF DOES_ENTITY_EXIST(esSecondReinforcementEnemies[0].PedIndex)
IF NOT IS_ENTITY_DEAD(esSecondReinforcementEnemies[0].PedIndex)
SWITCH esSecondReinforcementEnemies[0].iProgress
CASE 0
IF ( esSecondReinforcementEnemies[0].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(esSecondReinforcementEnemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esSecondReinforcementEnemies[0].PedIndex, CA_AGGRESSIVE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esSecondReinforcementEnemies[0].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(esSecondReinforcementEnemies[0].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_RANGE(esSecondReinforcementEnemies[0].PedIndex, CR_NEAR)
SET_PED_COMBAT_MOVEMENT(esSecondReinforcementEnemies[0].PedIndex, CM_WILLADVANCE)
SET_PED_SHOOTING_PROPERTIES(esSecondReinforcementEnemies[0].PedIndex, 3)
SET_COMBAT_FLOAT(esSecondReinforcementEnemies[0].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(esSecondReinforcementEnemies[0].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSecondReinforcementEnemies[0].PedIndex, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esSecondReinforcementEnemies[0].PedIndex, FALSE)
esSecondReinforcementEnemies[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esSecondReinforcementEnemies[1].PedIndex)
IF NOT IS_ENTITY_DEAD(esSecondReinforcementEnemies[1].PedIndex)
SWITCH esSecondReinforcementEnemies[1].iProgress
CASE 0
IF ( esSecondReinforcementEnemies[1].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(esSecondReinforcementEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esSecondReinforcementEnemies[1].PedIndex, CA_AGGRESSIVE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esSecondReinforcementEnemies[1].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(esSecondReinforcementEnemies[1].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_RANGE(esSecondReinforcementEnemies[1].PedIndex, CR_NEAR)
SET_PED_COMBAT_MOVEMENT(esSecondReinforcementEnemies[1].PedIndex, CM_WILLADVANCE)
SET_PED_SHOOTING_PROPERTIES(esSecondReinforcementEnemies[1].PedIndex, 4)
SET_COMBAT_FLOAT(esSecondReinforcementEnemies[1].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(esSecondReinforcementEnemies[1].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSecondReinforcementEnemies[1].PedIndex, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esSecondReinforcementEnemies[1].PedIndex, FALSE)
esSecondReinforcementEnemies[1].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
CLEANUP_ENEMY_GROUP(esSecondReinforcementEnemies)
ENDIF
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esSecondReinforcementEnemies)
ENDPROC
PROC MANAGE_THIRD_ENEMY_REINFORCEMENT_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL bPreviousEnemyWaveSpawned, BOOL bMainEnemyWaveSpawned)
IF ( bCurrentEnemyWaveSpawned = FALSE )
IF ( bMainEnemyWaveSpawned = FALSE)
AND ( bPreviousEnemyWaveSpawned = TRUE )
IF ( GET_NUMBER_OF_ENEMIES_DEAD(esSecondReinforcementEnemies) >= 1 )
IF iThirdEnemyReinforcementDelayTimer = 0
iThirdEnemyReinforcementDelayTimer = GET_GAME_TIMER()
ELSE
IF HAS_TIME_PASSED(5000, iThirdEnemyReinforcementDelayTimer)
esThirdReinforcementEnemies[0].PedIndex = CREATE_ENEMY_PED(mnEnemy, <<3265.5913, -4642.5308, 113.3619>>, 341.20, rgEnemies, WEAPONTYPE_PUMPSHOTGUN, WEAPONCOMPONENT_INVALID, TRUE)
esThirdReinforcementEnemies[1].PedIndex = CREATE_ENEMY_PED(mnEnemy, <<3284.5649, -4651.4722, 113.3171>>, 6.62, rgEnemies, WEAPONTYPE_PUMPSHOTGUN, WEAPONCOMPONENT_INVALID, TRUE)
INITIALISE_ENEMY_GROUP(esThirdReinforcementEnemies, FALSE #IF IS_DEBUG_BUILD, "3rd " #ENDIF)
bCurrentEnemyWaveSpawned = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE //wave is spawned, keep updating enemy behaviours
IF DOES_ENTITY_EXIST(esThirdReinforcementEnemies[0].PedIndex)
IF NOT IS_ENTITY_DEAD(esThirdReinforcementEnemies[0].PedIndex)
SWITCH esThirdReinforcementEnemies[0].iProgress
CASE 0
IF ( esThirdReinforcementEnemies[0].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(esThirdReinforcementEnemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esThirdReinforcementEnemies[0].PedIndex, CA_AGGRESSIVE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esThirdReinforcementEnemies[0].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(esThirdReinforcementEnemies[0].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_RANGE(esThirdReinforcementEnemies[0].PedIndex, CR_NEAR)
SET_PED_COMBAT_MOVEMENT(esThirdReinforcementEnemies[0].PedIndex, CM_WILLADVANCE)
SET_PED_SHOOTING_PROPERTIES(esThirdReinforcementEnemies[0].PedIndex, 3)
SET_COMBAT_FLOAT(esThirdReinforcementEnemies[0].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(esThirdReinforcementEnemies[0].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esThirdReinforcementEnemies[0].PedIndex, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esThirdReinforcementEnemies[0].PedIndex, FALSE)
esThirdReinforcementEnemies[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esThirdReinforcementEnemies[1].PedIndex)
IF NOT IS_ENTITY_DEAD(esThirdReinforcementEnemies[1].PedIndex)
SWITCH esThirdReinforcementEnemies[1].iProgress
CASE 0
IF ( esThirdReinforcementEnemies[1].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(esThirdReinforcementEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esThirdReinforcementEnemies[1].PedIndex, CA_AGGRESSIVE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esThirdReinforcementEnemies[1].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(esThirdReinforcementEnemies[1].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_RANGE(esThirdReinforcementEnemies[1].PedIndex, CR_NEAR)
SET_PED_COMBAT_MOVEMENT(esThirdReinforcementEnemies[1].PedIndex, CM_WILLADVANCE)
SET_PED_SHOOTING_PROPERTIES(esThirdReinforcementEnemies[1].PedIndex, 4)
SET_COMBAT_FLOAT(esThirdReinforcementEnemies[1].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(esThirdReinforcementEnemies[1].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esThirdReinforcementEnemies[1].PedIndex, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esThirdReinforcementEnemies[1].PedIndex, FALSE)
esThirdReinforcementEnemies[1].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
CLEANUP_ENEMY_GROUP(esThirdReinforcementEnemies)
ENDIF
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esThirdReinforcementEnemies)
ENDPROC
PROC MANAGE_FIRST_ENEMY_VAN_AND_ENEMIES(INT &iProgress)
FLOAT fPlaybackPercentage
SWITCH iProgress
CASE 0
REQUEST_ANIM_DICT("missmic1ig_2")
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), << 3267.560303, -4588.922363, 118.005730 >>, << 30.0, 3.5, 2.0 >>)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<3287.814453,-4589.952148,116.589165>>, <<3294.002441,-4561.976074,120.122002>>, 12.0)
OR ( iFirstVanTriggerTimer != 0 AND HAS_TIME_PASSED(25000, iFirstVanTriggerTimer) )
IF HAS_MODEL_LOADED(mnEnemy)
AND HAS_MODEL_LOADED(mnEnemyVan)
//first van on recording
vsEnemyVans[0].VehicleIndex = CREATE_ENEMY_VEHICLE(vsEnemyVans[0], 800, FALSE, TRUE, TRUE, TRUE, VEHICLELOCK_UNLOCKED, 30, 2, FALSE #IF IS_DEBUG_BUILD, "EnemyVan 0" #ENDIF)
//make the van only take damage from the player initially, so that it does not take damage when smashing through the gate
SET_ENTITY_INVINCIBLE(vsEnemyVans[0].VehicleIndex, TRUE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(vsEnemyVans[0].VehicleIndex, TRUE)
SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(vsEnemyVans[0].VehicleIndex, FALSE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsEnemyVans[0].VehicleIndex, TRUE)
esVanEnemies[0].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[0].VehicleIndex, VS_DRIVER, rgEnemies, WEAPONTYPE_PISTOL)
esVanEnemies[1].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[0].VehicleIndex, VS_FRONT_RIGHT, rgEnemies, WEAPONTYPE_PISTOL, WEAPONCOMPONENT_AT_PI_FLSH)
esVanEnemies[2].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[0].VehicleIndex, VS_BACK_LEFT, rgEnemies, WEAPONTYPE_ASSAULTRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
esVanEnemies[3].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[0].VehicleIndex, VS_BACK_RIGHT, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
INITIALISE_ENEMY_GROUP(esVanEnemies, FALSE #IF IS_DEBUG_BUILD, "Van " #ENDIF)
SET_PED_SEEING_RANGE(esVanEnemies[0].PedIndex, 20.0)
SET_PED_SEEING_RANGE(esVanEnemies[1].PedIndex, 15.0)
SET_PED_SEEING_RANGE(esVanEnemies[2].PedIndex, 20.0)
SET_PED_SEEING_RANGE(esVanEnemies[3].PedIndex, 20.0)
SET_ENTITY_INVINCIBLE(esVanEnemies[0].PedIndex, TRUE)
SET_ENTITY_INVINCIBLE(esVanEnemies[1].PedIndex, TRUE)
SET_ENTITY_INVINCIBLE(esVanEnemies[2].PedIndex, TRUE)
SET_ENTITY_INVINCIBLE(esVanEnemies[3].PedIndex, TRUE)
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vsEnemyVans[0], sVehicleRecordingsFile, 1.35)
START_AUDIO_SCENE("MI_1_VAN_ARRIVES_01")
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vsEnemyVans[0].VehicleIndex, "MI_1_VAN_01")
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGH)
bReplayStartEventTriggered = TRUE
iProgress++
ENDIF
ENDIF
BREAK
CASE 1
REQUEST_ANIM_DICT("missmic1ig_2")
IF IS_VEHICLE_RECORDING_PLAYBACK_RUNNING_OR_DRIVER_DEAD(vsEnemyVans[0].VehicleIndex, fPlaybackPercentage, vsEnemyVans[0].bDriverDead)
IF ( fPlaybackPercentage > 32.0 )
AND ( fPlaybackPercentage < 48.0 )
bOpenGateTriggered = TRUE
ELIF ( fPlaybackPercentage > 48.0 )
IF ( bSmoothCloseGateTriggered = FALSE )
//make the van be damaged by anything and any ped after it has got past the gate
IF IS_VEHICLE_DRIVEABLE(vsEnemyVans[0].VehicleIndex)
SET_ENTITY_INVINCIBLE(vsEnemyVans[0].VehicleIndex, FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(vsEnemyVans[0].VehicleIndex, FALSE)
SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(vsEnemyVans[0].VehicleIndex, TRUE)
IF DOES_ENTITY_EXIST(esVanEnemies[0].PedIndex)
IF NOT IS_ENTITY_DEAD(esVanEnemies[0].PedIndex)
SET_ENTITY_INVINCIBLE(esVanEnemies[0].PedIndex, FALSE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esVanEnemies[1].PedIndex)
IF NOT IS_ENTITY_DEAD(esVanEnemies[1].PedIndex)
SET_ENTITY_INVINCIBLE(esVanEnemies[1].PedIndex, FALSE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esVanEnemies[2].PedIndex)
IF NOT IS_ENTITY_DEAD(esVanEnemies[2].PedIndex)
SET_ENTITY_INVINCIBLE(esVanEnemies[2].PedIndex, FALSE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esVanEnemies[3].PedIndex)
IF NOT IS_ENTITY_DEAD(esVanEnemies[3].PedIndex)
SET_ENTITY_INVINCIBLE(esVanEnemies[3].PedIndex, FALSE)
ENDIF
ENDIF
ENDIF
bSmoothCloseGateTriggered = TRUE
ENDIF
ENDIF
IF ( fPlaybackPercentage > 97.0 )
IF ( esVanEnemies[0].bHasTask = FALSE )
IF IS_VEHICLE_DRIVEABLE(vsEnemyVans[0].VehicleIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vsEnemyVans[0].VehicleIndex)
ENDIF
esVanEnemies[0].bHasTask = TRUE
ENDIF
ENDIF
//if driver was killed during a playback was going on
//make the peds leave the vehicle and reset the dead driver flag
//to make IS_VEHICLE_RECORDING_PLAYBACK_RUNNING_OR_DRIVER_DEAD() keep returning FALSE next frame
IF ( vsEnemyVans[0].bDriverDead = TRUE )
vsEnemyVans[0].bDriverDead = FALSE
ENDIF
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vsEnemyVans[0].VehicleIndex, PLAYER_PED_ID())
bPlayerDetected = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player damaged enemy van 0 during recording playback. Setting bPlayerDetected to TRUE.")
#ENDIF
ENDIF
ELSE
iProgress++
ENDIF
BREAK
CASE 2 //play the van exit animation
REQUEST_ANIM_DICT("missmic1ig_2")
IF HAS_ANIM_DICT_LOADED("missmic1ig_2")
IF NOT IS_ENTITY_DEAD(vsEnemyVans[0].VehicleIndex)
IF ( bPlayerDetected = FALSE )
VECTOR vVanPosition
VECTOR vVanRotation
vVanPosition = GET_ENTITY_COORDS(vsEnemyVans[0].VehicleIndex)
vVanRotation = GET_ENTITY_ROTATION(vsEnemyVans[0].VehicleIndex)
IF NOT IS_ENTITY_DEAD(esVanEnemies[0].PedIndex)
CLEAR_PED_TASKS_IMMEDIATELY(esVanEnemies[0].PedIndex)
EQUIP_PED_BEST_WEAPON(esVanEnemies[0].PedIndex, TRUE)
SET_ENTITY_NO_COLLISION_ENTITY(esVanEnemies[0].PedIndex, vsEnemyVans[0].VehicleIndex, TRUE)
TASK_PLAY_ANIM_ADVANCED(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda", vVanPosition, vVanRotation,
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1,
AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(esVanEnemies[0].PedIndex)
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[0].PedIndex, RBF_BULLET_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[0].PedIndex, RBF_PLAYER_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[0].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
GO_TO_ENEMY_STATE(esVanEnemies[0], ENEMY_STATE_SCRIPTED_ENTRY)
esVanEnemies[0].iProgress = 0
ENDIF
IF NOT IS_ENTITY_DEAD(esVanEnemies[1].PedIndex)
CLEAR_PED_TASKS_IMMEDIATELY(esVanEnemies[1].PedIndex)
EQUIP_PED_BEST_WEAPON(esVanEnemies[1].PedIndex, TRUE)
SET_ENTITY_NO_COLLISION_ENTITY(esVanEnemies[1].PedIndex, vsEnemyVans[0].VehicleIndex, TRUE)
TASK_PLAY_ANIM_ADVANCED(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb", vVanPosition, vVanRotation,
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1,
AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(esVanEnemies[1].PedIndex)
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[1].PedIndex, RBF_BULLET_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[1].PedIndex, RBF_PLAYER_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[1].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
GO_TO_ENEMY_STATE(esVanEnemies[1], ENEMY_STATE_SCRIPTED_ENTRY)
esVanEnemies[1].iProgress = 0
ENDIF
IF NOT IS_ENTITY_DEAD(esVanEnemies[2].PedIndex)
CLEAR_PED_TASKS_IMMEDIATELY(esVanEnemies[2].PedIndex)
EQUIP_PED_BEST_WEAPON(esVanEnemies[2].PedIndex, TRUE)
SET_ENTITY_NO_COLLISION_ENTITY(esVanEnemies[2].PedIndex, vsEnemyVans[0].VehicleIndex, TRUE)
TASK_PLAY_ANIM_ADVANCED(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc", vVanPosition, vVanRotation,
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1,
AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_HOLD_LAST_FRAME)
FORCE_PED_AI_AND_ANIMATION_UPDATE(esVanEnemies[2].PedIndex)
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[2].PedIndex, RBF_BULLET_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[2].PedIndex, RBF_PLAYER_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[2].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
GO_TO_ENEMY_STATE(esVanEnemies[2], ENEMY_STATE_SCRIPTED_ENTRY)
esVanEnemies[2].iProgress = 0
ENDIF
IF NOT IS_ENTITY_DEAD(esVanEnemies[3].PedIndex)
CLEAR_PED_TASKS_IMMEDIATELY(esVanEnemies[3].PedIndex)
EQUIP_PED_BEST_WEAPON(esVanEnemies[3].PedIndex, TRUE)
SET_ENTITY_NO_COLLISION_ENTITY(esVanEnemies[3].PedIndex, vsEnemyVans[0].VehicleIndex, TRUE)
TASK_PLAY_ANIM_ADVANCED(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd", vVanPosition, vVanRotation,
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1,
AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(esVanEnemies[3].PedIndex)
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[3].PedIndex, RBF_BULLET_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[3].PedIndex, RBF_PLAYER_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[3].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
GO_TO_ENEMY_STATE(esVanEnemies[3], ENEMY_STATE_SCRIPTED_ENTRY)
esVanEnemies[3].iProgress = 0
ENDIF
//lower the health a bit when enemies start coming out
SET_ENTITY_HEALTH(vsEnemyVans[0].VehicleIndex, CLAMP_INT(GET_ENTITY_HEALTH(vsEnemyVans[0].VehicleIndex) - 100, 400, 700))
//make the van no longer targetable
SET_VEHICLE_CAN_BE_TARGETTED(vsEnemyVans[0].VehicleIndex, FALSE)
ELSE
GO_TO_ENEMY_STATE(esVanEnemies[0], ENEMY_STATE_COMBAT)
GO_TO_ENEMY_STATE(esVanEnemies[1], ENEMY_STATE_COMBAT)
GO_TO_ENEMY_STATE(esVanEnemies[2], ENEMY_STATE_COMBAT)
GO_TO_ENEMY_STATE(esVanEnemies[3], ENEMY_STATE_COMBAT)
ENDIF
ENDIF
STOP_AUDIO_SCENE("MI_1_VAN_ARRIVES_01")
IF IS_VEHICLE_DRIVEABLE(vsEnemyVans[0].VehicleIndex)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vsEnemyVans[0].VehicleIndex)
ENDIF
iProgress++
ENDIF
BREAK
CASE 3 //update enemies
//block enemy weapon fire until the 'player detected' conversation plays out
IF ( bPlayerDetected = FALSE )
BLOCK_WEAPON_FIRE_FOR_ENEMY_GROUP(esVanEnemies)
ELIF ( bPlayerDetected = TRUE )
IF ( bDetectedConversationPlaying = TRUE )
BLOCK_WEAPON_FIRE_FOR_ENEMY_GROUP(esVanEnemies)
ENDIF
IF ( bReplayStopEventTriggered = FALSE )
REPLAY_STOP_EVENT()
bReplayStopEventTriggered = TRUE
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esVanEnemies[0].PedIndex)
IF NOT IS_ENTITY_DEAD(esVanEnemies[0].PedIndex)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(esVanEnemies[0].PedIndex, GET_ENEMY_STATE_NAME_FOR_DEBUG(esVanEnemies[0].eState), 1.25)
esVanEnemies[0].sDebugName = "VanEnemy 0"
#ENDIF
SWITCH esVanEnemies[0].eState
CASE ENEMY_STATE_SCRIPTED_ENTRY
SWITCH esVanEnemies[0].iProgress
CASE 0
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda")
IF HAS_ANIM_EVENT_FIRED(esVanEnemies[0].PedIndex, GET_HASH_KEY("door"))
IF NOT IS_ENTITY_DEAD(vsEnemyVans[0].VehicleIndex)
SET_VEHICLE_DOOR_OPEN(vsEnemyVans[0].VehicleIndex, SC_DOOR_FRONT_LEFT)
bPlayVanOpenConversation = TRUE
esVanEnemies[0].iProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda")
IF ( GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda") > 0.975 )
esVanEnemies[0].bHasTask = FALSE
esVanEnemies[0].iProgress++
ELSE
IF ( GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda") > 0.4 )
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[0].PedIndex, RBF_BULLET_IMPACT)
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[0].PedIndex, RBF_PLAYER_IMPACT)
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[0].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
IF ( GET_DISTANCE_BETWEEN_PEDS(esVanEnemies[0].PedIndex, PLAYER_PED_ID()) < 5.0 )
AND CAN_PED_SEE_HATED_PED(esVanEnemies[0].PedIndex, PLAYER_PED_ID())
GO_TO_ENEMY_STATE(esVanEnemies[0], ENEMY_STATE_COMBAT)
esVanEnemies[0].iProgress = 0
ENDIF
IF IS_ENTITY_TOUCHING_ENTITY(esVanEnemies[0].PedIndex, PLAYER_PED_ID())
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(esVanEnemies[0].PedIndex, PLAYER_PED_ID())
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(esVanEnemies[0].PedIndex)
GO_TO_ENEMY_STATE(esVanEnemies[0], ENEMY_STATE_COMBAT)
bPlayerDetected = TRUE //set the player detected flag to true here for other peds to react
esVanEnemies[0].iProgress = 0
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF ( esVanEnemies[0].bHasTask = FALSE )
TASK_PUT_PED_DIRECTLY_INTO_COVER(esVanEnemies[0].PedIndex, csCoverpoints[28].vPosition, -1, FALSE, 0, TRUE, TRUE, csCoverpoints[28].CoverpointIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVanEnemies[0].PedIndex, FALSE)
esVanEnemies[0].iTimer = GET_GAME_TIMER()
esVanEnemies[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
IF IS_PED_IN_COMBAT(esVanEnemies[0].PedIndex)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(esVanEnemies[0].PedIndex, PLAYER_PED_ID())
OR ( bPlayerDetected = TRUE )
IF NOT IS_ENTITY_PLAYING_ANIM(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda")
OR ( IS_ENTITY_PLAYING_ANIM(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda")
AND GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda") > 0.4 )
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[0].PedIndex, RBF_BULLET_IMPACT)
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[0].PedIndex, RBF_PLAYER_IMPACT)
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[0].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
GO_TO_ENEMY_STATE(esVanEnemies[0], ENEMY_STATE_COMBAT)
esVanEnemies[0].iProgress = 0
ENDIF
ENDIF
IF ( bPlayerDetected = FALSE )
IF DOES_ENTITY_EXIST(vsEnemyVans[0].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsEnemyVans[0].VehicleIndex)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vsEnemyVans[0].VehicleIndex, PLAYER_PED_ID())
OR IS_PED_SHOOTING_AT_AREA(PLAYER_PED_ID(), TRUE, GET_ENTITY_COORDS(vsEnemyVans[0].VehicleIndex), 4.0 #IF IS_DEBUG_BUILD, TRUE #ENDIF)
bPlayerDetected = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player shot at enemy van 0 during scripted entry state. Setting bPlayerDetected to TRUE.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE ENEMY_STATE_COMBAT
IF ( esVanEnemies[0].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esVanEnemies[0].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esVanEnemies[0].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_USE_COVER)
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[0].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_DEFENSIVE_AREA_SPHERE(esVanEnemies[0].PedIndex, << 3266.66, -4615.01, 115.07 >>, 2.75)
SET_PED_COMBAT_MOVEMENT_VALUES(esVanEnemies[0].PedIndex, 1.0, 1.0)
SET_PED_COVER_PROPERTIES(esVanEnemies[0].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, FALSE, 0.0, 2.5)
//SET_PED_PREFERRED_COVERPOINT(esVanEnemies[0].PedIndex, esVanEnemies[0].ItemsetIndex, csCoverpoints[28].CoverpointIndex)
SET_PED_SHOOTING_PROPERTIES(esVanEnemies[0].PedIndex, 4)
SET_PED_VISUAL_FIELD_PROPERTIES(esVanEnemies[0].PedIndex) //restore ped's default seeing values
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVanEnemies[0].PedIndex, FALSE)
bPlayerDetected = TRUE
esVanEnemies[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ELSE
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda")
AND GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda") > 0.399
STOP_ANIM_PLAYBACK(esVanEnemies[0].PedIndex)
SET_HIGH_FALL_TASK(esVanEnemies[0].PedIndex, 2000, 10000)
APPLY_FORCE_TO_ENTITY(esVanEnemies[0].PedIndex, APPLY_TYPE_IMPULSE, << 0.0, 5.0, 0.0 >>, << 0.0, 0.0, 0.0 >>, 0, TRUE, TRUE, FALSE)
ENDIF
IF ( bPlayerDetected = FALSE )
IF ( esVanEnemies[0].eState = ENEMY_STATE_SCRIPTED_ENTRY )
IF DOES_ENTITY_EXIST(GET_PED_SOURCE_OF_DEATH(esVanEnemies[0].PedIndex))
IF ( GET_PED_INDEX_FROM_ENTITY_INDEX(GET_PED_SOURCE_OF_DEATH(esVanEnemies[0].PedIndex)) = PLAYER_PED_ID() )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player detected for killing ", esVanEnemies[0].sDebugName, " in scripted entry state.")
#ENDIF
bPlayerDetected = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_ENTITY_PLAYING_ANIM(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda")
CLEANUP_ENEMY_PED(esVanEnemies[0])
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esVanEnemies[1].PedIndex)
IF NOT IS_ENTITY_DEAD(esVanEnemies[1].PedIndex)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(esVanEnemies[1].PedIndex, GET_ENEMY_STATE_NAME_FOR_DEBUG(esVanEnemies[1].eState), 1.25)
esVanEnemies[1].sDebugName = "VanEnemy 1"
#ENDIF
SWITCH esVanEnemies[1].eState
CASE ENEMY_STATE_SCRIPTED_ENTRY
SWITCH esVanEnemies[1].iProgress
CASE 0
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb")
IF HAS_ANIM_EVENT_FIRED(esVanEnemies[1].PedIndex, GET_HASH_KEY("door"))
IF NOT IS_ENTITY_DEAD(vsEnemyVans[0].VehicleIndex)
SET_VEHICLE_DOOR_OPEN(vsEnemyVans[0].VehicleIndex, SC_DOOR_FRONT_RIGHT)
bPlayVanOpenConversation = TRUE
esVanEnemies[1].iProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb")
IF ( GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb") > 0.95 )
esVanEnemies[1].bHasTask = FALSE
esVanEnemies[1].iProgress++
ELSE
IF ( GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb") > 0.185 )
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[1].PedIndex, RBF_BULLET_IMPACT)
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[1].PedIndex, RBF_PLAYER_IMPACT)
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[1].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
IF ( GET_DISTANCE_BETWEEN_PEDS(esVanEnemies[1].PedIndex, PLAYER_PED_ID()) < 5.0 )
AND CAN_PED_SEE_HATED_PED(esVanEnemies[1].PedIndex, PLAYER_PED_ID())
GO_TO_ENEMY_STATE(esVanEnemies[1], ENEMY_STATE_COMBAT)
esVanEnemies[1].iProgress = 0
ENDIF
IF IS_ENTITY_TOUCHING_ENTITY(esVanEnemies[1].PedIndex, PLAYER_PED_ID())
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(esVanEnemies[1].PedIndex, PLAYER_PED_ID())
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(esVanEnemies[1].PedIndex)
GO_TO_ENEMY_STATE(esVanEnemies[1], ENEMY_STATE_COMBAT)
bPlayerDetected = TRUE //set the player detected flag to true here for other peds to react
esVanEnemies[1].iProgress = 0
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
//make ped stay move to the pillar cover while aiming
IF ( esVanEnemies[1].bHasTask = FALSE )
SEQUENCE_INDEX SequenceIndex
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, csCoverpoints[2].vPosition, << 3254.10, -4587.78, 118.05 >>, PEDMOVE_SLOWWALK, FALSE, 1.0, 0.0, TRUE, ENAV_NO_STOPPING)
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, csCoverpoints[2].vPosition, -1, TRUE, 0.25, TRUE, FALSE, csCoverpoints[2].CoverpointIndex, TRUE)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(esVanEnemies[1].PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
SET_PED_COMBAT_PROPERTIES(esVanEnemies[1].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED)
SET_PED_DEFENSIVE_AREA_SPHERE(esVanEnemies[1].PedIndex, << 3252.73, -4600.65, 115.64 >>, 1.5)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVanEnemies[1].PedIndex, FALSE)
esVanEnemies[1].iTimer = GET_GAME_TIMER()
esVanEnemies[1].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
IF IS_PED_IN_COMBAT(esVanEnemies[1].PedIndex)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(esVanEnemies[1].PedIndex, PLAYER_PED_ID())
OR ( bPlayerDetected = TRUE )
IF NOT IS_ENTITY_PLAYING_ANIM(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb")
OR ( IS_ENTITY_PLAYING_ANIM(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb")
AND GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb") > 0.185 )
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[1].PedIndex, RBF_BULLET_IMPACT)
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[1].PedIndex, RBF_PLAYER_IMPACT)
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[1].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
GO_TO_ENEMY_STATE(esVanEnemies[1], ENEMY_STATE_COMBAT)
esVanEnemies[1].iProgress = 0
ENDIF
ENDIF
IF ( bPlayerDetected = FALSE )
IF DOES_ENTITY_EXIST(vsEnemyVans[0].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsEnemyVans[0].VehicleIndex)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vsEnemyVans[0].VehicleIndex, PLAYER_PED_ID())
OR IS_PED_SHOOTING_AT_AREA(PLAYER_PED_ID(), TRUE, GET_ENTITY_COORDS(vsEnemyVans[0].VehicleIndex), 4.0 #IF IS_DEBUG_BUILD, TRUE #ENDIF)
bPlayerDetected = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player shot at enemy van 0 during scripted entry state. Setting bPlayerDetected to TRUE.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE ENEMY_STATE_COMBAT
IF ( esVanEnemies[1].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esVanEnemies[1].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esVanEnemies[1].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED)
SET_PED_DEFENSIVE_AREA_SPHERE(esVanEnemies[1].PedIndex, << 3252.73, -4600.65, 115.64 >>, 1.5)
SET_PED_SHOOTING_PROPERTIES(esVanEnemies[1].PedIndex, 4)
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_COMBAT_FLOAT(esVanEnemies[1].PedIndex, CCF_BLIND_FIRE_CHANCE, 0.05)
SET_PED_VISUAL_FIELD_PROPERTIES(esVanEnemies[1].PedIndex) //restore ped's default seeing values
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVanEnemies[1].PedIndex, FALSE)
bPlayerDetected = TRUE
esVanEnemies[1].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ELSE
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb")
AND GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb") > 0.165
STOP_ANIM_PLAYBACK(esVanEnemies[1].PedIndex)
SET_HIGH_FALL_TASK(esVanEnemies[1].PedIndex, 2000, 10000)
APPLY_FORCE_TO_ENTITY(esVanEnemies[1].PedIndex, APPLY_TYPE_IMPULSE, << 0.0, 5.0, 0.0 >>, << 0.0, 0.0, 0.0 >>, 0, TRUE, TRUE, FALSE)
ENDIF
IF ( bPlayerDetected = FALSE )
IF ( esVanEnemies[1].eState = ENEMY_STATE_SCRIPTED_ENTRY )
IF DOES_ENTITY_EXIST(GET_PED_SOURCE_OF_DEATH(esVanEnemies[1].PedIndex))
IF ( GET_PED_INDEX_FROM_ENTITY_INDEX(GET_PED_SOURCE_OF_DEATH(esVanEnemies[1].PedIndex)) = PLAYER_PED_ID() )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player detected for killing ", esVanEnemies[1].sDebugName, " in scripted entry state.")
#ENDIF
bPlayerDetected = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_ENTITY_PLAYING_ANIM(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb")
CLEANUP_ENEMY_PED(esVanEnemies[1])
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esVanEnemies[2].PedIndex)
IF NOT IS_ENTITY_DEAD(esVanEnemies[2].PedIndex)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(esVanEnemies[2].PedIndex, GET_ENEMY_STATE_NAME_FOR_DEBUG(esVanEnemies[2].eState), 1.25)
esVanEnemies[2].sDebugName = "VanEnemy 2"
#ENDIF
SWITCH esVanEnemies[2].eState
CASE ENEMY_STATE_SCRIPTED_ENTRY
SWITCH esVanEnemies[2].iProgress
CASE 0
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc")
IF HAS_ANIM_EVENT_FIRED(esVanEnemies[2].PedIndex, GET_HASH_KEY("door"))
IF NOT IS_ENTITY_DEAD(vsEnemyVans[0].VehicleIndex)
SET_VEHICLE_DOOR_OPEN(vsEnemyVans[0].VehicleIndex, SC_DOOR_REAR_LEFT)
bPlayVanOpenConversation = TRUE
esVanEnemies[2].iProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc")
SET_PED_RESET_FLAG(esVanEnemies[2].PedIndex, PRF_InstantBlendToAim, TRUE)
IF ( GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc") > 0.925 )
esVanEnemies[2].bHasTask = FALSE
esVanEnemies[2].iProgress++
ELSE
IF ( GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc") > 0.585 )
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[2].PedIndex, RBF_BULLET_IMPACT)
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[2].PedIndex, RBF_PLAYER_IMPACT)
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[2].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
IF ( GET_DISTANCE_BETWEEN_PEDS(esVanEnemies[2].PedIndex, PLAYER_PED_ID()) < 5.0 )
AND CAN_PED_SEE_HATED_PED(esVanEnemies[2].PedIndex, PLAYER_PED_ID())
GO_TO_ENEMY_STATE(esVanEnemies[2], ENEMY_STATE_COMBAT)
esVanEnemies[2].iProgress = 0
ENDIF
IF IS_ENTITY_TOUCHING_ENTITY(esVanEnemies[2].PedIndex, PLAYER_PED_ID())
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(esVanEnemies[2].PedIndex, PLAYER_PED_ID())
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(esVanEnemies[2].PedIndex)
GO_TO_ENEMY_STATE(esVanEnemies[2], ENEMY_STATE_COMBAT)
bPlayerDetected = TRUE //set the player detected flag to true here for other peds to react
esVanEnemies[2].iProgress = 0
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
SET_PED_RESET_FLAG(esVanEnemies[2].PedIndex, PRF_InstantBlendToAim, TRUE)
IF ( esVanEnemies[2].bHasTask = FALSE )
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esVanEnemies[2].PedIndex, << 3260.40, -4605.49, 115.50 >>, PEDMOVE_SLOWWALK, FALSE, << 3264.06, -4588.00, 116.88 >>, NULL, FALSE, FALSE, FALSE, -1)
esVanEnemies[2].iTimer = GET_GAME_TIMER()
esVanEnemies[2].bHasTask = TRUE
ENDIF
IF HAS_TIME_PASSED(750, esVanEnemies[2].iTimer)
bPlayVanExitConversation = TRUE
ENDIF
IF HAS_TIME_PASSED(6000, esVanEnemies[2].iTimer)
GO_TO_ENEMY_STATE(esVanEnemies[2], ENEMY_STATE_STANDING_AT_LOCATION)
ENDIF
BREAK
ENDSWITCH
IF IS_PED_IN_COMBAT(esVanEnemies[2].PedIndex)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(esVanEnemies[2].PedIndex, PLAYER_PED_ID())
OR ( bPlayerDetected = TRUE )
IF NOT IS_ENTITY_PLAYING_ANIM(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc")
OR ( IS_ENTITY_PLAYING_ANIM(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc")
AND GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc") > 0.585 )
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[2].PedIndex, RBF_BULLET_IMPACT)
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[2].PedIndex, RBF_PLAYER_IMPACT)
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[2].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
GO_TO_ENEMY_STATE(esVanEnemies[2], ENEMY_STATE_COMBAT)
esVanEnemies[2].iProgress = 0
ENDIF
ENDIF
IF ( bPlayerDetected = FALSE )
IF DOES_ENTITY_EXIST(vsEnemyVans[0].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsEnemyVans[0].VehicleIndex)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vsEnemyVans[0].VehicleIndex, PLAYER_PED_ID())
OR IS_PED_SHOOTING_AT_AREA(PLAYER_PED_ID(), TRUE, GET_ENTITY_COORDS(vsEnemyVans[0].VehicleIndex), 4.0 #IF IS_DEBUG_BUILD, TRUE #ENDIF)
bPlayerDetected = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player shot at enemy van 0 during scripted entry state. Setting bPlayerDetected to TRUE.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE ENEMY_STATE_STANDING_AT_LOCATION
IF ( esVanEnemies[2].bHasTask = FALSE )
SEQUENCE_INDEX SequenceIndex
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_AIM_GUN_AT_COORD(NULL, << 3264.06, -4588.00, 116.88 >>, 5000, FALSE)
TASK_AIM_GUN_AT_COORD(NULL, << 3251.02, -4590.45, 117.24 >>, 5000, FALSE)
TASK_AIM_GUN_AT_COORD(NULL, << 3264.06, -4588.00, 116.88 >>, 5000, FALSE)
TASK_AIM_GUN_AT_COORD(NULL, << 3272.29, -4590.30, 117.61 >>, 5000, FALSE)
SET_SEQUENCE_TO_REPEAT(SequenceIndex, REPEAT_FOREVER)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(esVanEnemies[2].PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
esVanEnemies[2].iTimer = GET_GAME_TIMER()
esVanEnemies[2].bHasTask = TRUE
ENDIF
IF HAS_TIME_PASSED(10000, esVanEnemies[2].iTimer)
bStartSearching = TRUE
ENDIF
IF IS_PED_IN_COMBAT(esVanEnemies[2].PedIndex)
OR ( bPlayerDetected = TRUE )
GO_TO_ENEMY_STATE(esVanEnemies[2], ENEMY_STATE_COMBAT)
esVanEnemies[2].iProgress = 0
ENDIF
BREAK
CASE ENEMY_STATE_COMBAT
IF ( esVanEnemies[2].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esVanEnemies[2].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esVanEnemies[2].PedIndex, CM_WILLADVANCE, CAL_AVERAGE, CR_NEAR, CA_AGGRESSIVE)
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[2].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[2].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[2].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
REMOVE_PED_DEFENSIVE_AREA(esVanEnemies[2].PedIndex)
SET_PED_COVER_PROPERTIES(esVanEnemies[2].PedIndex, TRUE)
SET_PED_SHOOTING_PROPERTIES(esVanEnemies[2].PedIndex, 3)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVanEnemies[2].PedIndex, FALSE)
SET_PED_VISUAL_FIELD_PROPERTIES(esVanEnemies[2].PedIndex) //restore ped's default seeing values
bPlayerDetected = TRUE
esVanEnemies[2].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ELSE
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc")
AND GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc") > 0.51
STOP_ANIM_PLAYBACK(esVanEnemies[2].PedIndex)
SET_HIGH_FALL_TASK(esVanEnemies[2].PedIndex, 2000, 10000)
APPLY_FORCE_TO_ENTITY(esVanEnemies[2].PedIndex, APPLY_TYPE_IMPULSE, << 0.0, 5.0, 0.0 >>, << 0.0, 0.0, 0.0 >>, 0, TRUE, TRUE, FALSE)
ENDIF
IF ( bPlayerDetected = FALSE )
IF ( esVanEnemies[2].eState = ENEMY_STATE_SCRIPTED_ENTRY )
IF DOES_ENTITY_EXIST(GET_PED_SOURCE_OF_DEATH(esVanEnemies[2].PedIndex))
IF ( GET_PED_INDEX_FROM_ENTITY_INDEX(GET_PED_SOURCE_OF_DEATH(esVanEnemies[2].PedIndex)) = PLAYER_PED_ID() )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player detected for killing ", esVanEnemies[2].sDebugName, " in scripted entry state.")
#ENDIF
bPlayerDetected = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_ENTITY_PLAYING_ANIM(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc")
CLEANUP_ENEMY_PED(esVanEnemies[2])
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esVanEnemies[3].PedIndex)
IF NOT IS_ENTITY_DEAD(esVanEnemies[3].PedIndex)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(esVanEnemies[3].PedIndex, GET_ENEMY_STATE_NAME_FOR_DEBUG(esVanEnemies[3].eState), 1.25)
esVanEnemies[3].sDebugName = "VanEnemy 3"
#ENDIF
SWITCH esVanEnemies[3].eState
CASE ENEMY_STATE_SCRIPTED_ENTRY
SWITCH esVanEnemies[3].iProgress
CASE 0
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd")
IF HAS_ANIM_EVENT_FIRED(esVanEnemies[3].PedIndex, GET_HASH_KEY("door"))
IF NOT IS_ENTITY_DEAD(vsEnemyVans[0].VehicleIndex)
SET_VEHICLE_DOOR_OPEN(vsEnemyVans[0].VehicleIndex, SC_DOOR_REAR_RIGHT)
bPlayVanOpenConversation = TRUE
esVanEnemies[3].iProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd")
IF ( GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd") > 0.95 )
esVanEnemies[3].bHasTask = FALSE
esVanEnemies[3].iProgress++
ELSE
IF ( GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd") > 0.53 )
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[3].PedIndex, RBF_BULLET_IMPACT)
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[3].PedIndex, RBF_PLAYER_IMPACT)
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[3].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
IF ( GET_DISTANCE_BETWEEN_PEDS(esVanEnemies[3].PedIndex, PLAYER_PED_ID()) < 5.0 )
AND CAN_PED_SEE_HATED_PED(esVanEnemies[3].PedIndex, PLAYER_PED_ID())
GO_TO_ENEMY_STATE(esVanEnemies[3], ENEMY_STATE_COMBAT)
esVanEnemies[3].iProgress = 0
ENDIF
IF IS_ENTITY_TOUCHING_ENTITY(esVanEnemies[3].PedIndex, PLAYER_PED_ID())
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(esVanEnemies[3].PedIndex, PLAYER_PED_ID())
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(esVanEnemies[3].PedIndex)
GO_TO_ENEMY_STATE(esVanEnemies[3], ENEMY_STATE_COMBAT)
bPlayerDetected = TRUE //set the player detected flag to true here for other peds to react
esVanEnemies[3].iProgress = 0
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF ( esVanEnemies[3].bHasTask = FALSE )
TASK_PUT_PED_DIRECTLY_INTO_COVER(esVanEnemies[3].PedIndex, csCoverpoints[27].vPosition, -1, FALSE, 0, TRUE, FALSE, csCoverpoints[27].CoverpointIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVanEnemies[3].PedIndex, FALSE)
esVanEnemies[3].iTimer = GET_GAME_TIMER()
esVanEnemies[3].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
IF IS_PED_IN_COMBAT(esVanEnemies[3].PedIndex)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(esVanEnemies[3].PedIndex, PLAYER_PED_ID())
OR ( bPlayerDetected = TRUE )
IF NOT IS_ENTITY_PLAYING_ANIM(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd")
OR ( IS_ENTITY_PLAYING_ANIM(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd")
AND GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd") > 0.53 )
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[3].PedIndex, RBF_BULLET_IMPACT)
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[3].PedIndex, RBF_PLAYER_IMPACT)
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[3].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
GO_TO_ENEMY_STATE(esVanEnemies[3], ENEMY_STATE_COMBAT)
esVanEnemies[3].iProgress = 0
ENDIF
ENDIF
IF ( bPlayerDetected = FALSE )
IF DOES_ENTITY_EXIST(vsEnemyVans[0].VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsEnemyVans[0].VehicleIndex)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vsEnemyVans[0].VehicleIndex, PLAYER_PED_ID())
OR IS_PED_SHOOTING_AT_AREA(PLAYER_PED_ID(), TRUE, GET_ENTITY_COORDS(vsEnemyVans[0].VehicleIndex), 4.0 #IF IS_DEBUG_BUILD, TRUE #ENDIF)
bPlayerDetected = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player shot at enemy van 0 during scripted entry state. Setting bPlayerDetected to TRUE.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE ENEMY_STATE_COMBAT
IF ( esVanEnemies[3].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esVanEnemies[3].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esVanEnemies[3].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER)
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[3].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[3].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[3].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_DEFENSIVE_AREA_SPHERE(esVanEnemies[3].PedIndex, << 3259.12, -4608.15, 115.51 >>, 2.5)
SET_PED_COVER_PROPERTIES(esVanEnemies[3].PedIndex, TRUE, FALSE, TRUE, FALSE, 5.0, FALSE, 0.0, 2.0)
//SET_PED_PREFERRED_COVERPOINT(esVanEnemies[3].PedIndex, esVanEnemies[3].ItemsetIndex, csCoverpoints[27].CoverpointIndex)
SET_PED_SHOOTING_PROPERTIES(esVanEnemies[3].PedIndex, 3)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVanEnemies[3].PedIndex, FALSE)
SET_PED_VISUAL_FIELD_PROPERTIES(esVanEnemies[3].PedIndex) //restore ped's default seeing values
bPlayerDetected = TRUE
esVanEnemies[3].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ELSE
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd")
AND GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd") > 0.51
STOP_ANIM_PLAYBACK(esVanEnemies[3].PedIndex)
SET_HIGH_FALL_TASK(esVanEnemies[3].PedIndex, 2000, 10000)
APPLY_FORCE_TO_ENTITY(esVanEnemies[3].PedIndex, APPLY_TYPE_IMPULSE, << 0.0, 5.0, 0.0 >>, << 0.0, 0.0, 0.0 >>, 0, TRUE, TRUE, FALSE)
ENDIF
IF ( bPlayerDetected = FALSE )
IF ( esVanEnemies[3].eState = ENEMY_STATE_SCRIPTED_ENTRY )
IF DOES_ENTITY_EXIST(GET_PED_SOURCE_OF_DEATH(esVanEnemies[3].PedIndex))
IF ( GET_PED_INDEX_FROM_ENTITY_INDEX(GET_PED_SOURCE_OF_DEATH(esVanEnemies[3].PedIndex)) = PLAYER_PED_ID() )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player detected for killing ", esVanEnemies[3].sDebugName, " in scripted entry state.")
#ENDIF
bPlayerDetected = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_ENTITY_PLAYING_ANIM(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd")
CLEANUP_ENEMY_PED(esVanEnemies[3])
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
//CLEANUP_ENEMY_GROUP(esVanEnemies)
UPDATE_VEHICLE_DAMAGE_FROM_PED(vsEnemyVans[0].VehicleIndex, PLAYER_PED_ID(), 300, 400, vsEnemyVans[0].bSmoking,
<<10.0, 10.0, 3.0>>, <<0.0, 0.0, 5.0>>, <<0.0, -1.5, 0.0>>, TRUE, 45.0, 70.0)
CHECK_VEHICLE_FOR_DRIVING_INTO_LOCATE(vsEnemyVans[0], PLAYER_PED_ID(), <<3238.346680,-4687.663086,114.673004>>,<<36.0,15.0,4.0>>)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[0].VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT, vFrontRightOffset, 0.8, FALSE, TRUE, vFrontRightDamageOffset, 150.0)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[0].VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT, vFrontLeftOffset, 0.8, FALSE, TRUE, vFrontLeftDamageOffset, 150.0)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[0].VehicleIndex, SC_WHEEL_CAR_REAR_LEFT, vRearLeftOffset, 0.8, FALSE, TRUE, vRearLeftDamageOffset, 150.0)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[0].VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT, vRearRightOffset, 0.8, FALSE, TRUE, vRearRightDamageOffset, 150.0)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esVanEnemies)
ENDPROC
PROC MANAGE_SECOND_ENEMY_VAN_AND_ENEMIES(INT &iProgress)
FLOAT fPlaybackPercentage
SWITCH iProgress
CASE 0
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), << 3266.92, -4603.24, 116.83 >>, << 30.0, 3.5, 3.0 >>)
OR ( GET_NUMBER_OF_ENEMIES_DEAD(esMiddleEnemies) + GET_NUMBER_OF_ENEMIES_DEAD(esVanEnemies) >= 5 )
IF HAS_MODEL_LOADED(mnEnemy)
AND HAS_MODEL_LOADED(mnEnemyVan)
//second van on recording
vsEnemyVans[1].VehicleIndex = CREATE_ENEMY_VEHICLE(vsEnemyVans[1], 600, FALSE, TRUE, TRUE, FALSE, VEHICLELOCK_UNLOCKED, 56, 1, FALSE #IF IS_DEBUG_BUILD, "Van 1" #ENDIF)
SET_ENTITY_INVINCIBLE(vsEnemyVans[1].VehicleIndex, TRUE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(vsEnemyVans[1].VehicleIndex, TRUE)
SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(vsEnemyVans[1].VehicleIndex, FALSE)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsEnemyVans[1].VehicleIndex, TRUE)
esSideVanEnemies[0].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[1].VehicleIndex, VS_DRIVER, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
esSideVanEnemies[1].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[1].VehicleIndex, VS_FRONT_RIGHT, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
INITIALISE_ENEMY_GROUP(esSideVanEnemies, FALSE #IF IS_DEBUG_BUILD, "SideVan " #ENDIF)
//only create backup enemies if player triggered this wave based of kills of the previous wave
//commenting this backup wave for now
//IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), << 3266.92, -4603.24, 116.83 >>, << 30.0, 3.5, 3.0 >>)
//AND ( GET_NUMBER_OF_ENEMIES_DEAD(esMiddleEnemies) + GET_NUMBER_OF_ENEMIES_DEAD(esVanEnemies) >= 5 )
// esSideVanBackupEnemies[0].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[1].VehicleIndex, VS_BACK_LEFT, rgEnemies, WEAPONTYPE_PISTOL, WEAPONCOMPONENT_AT_PI_FLSH)
// esSideVanBackupEnemies[1].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[1].VehicleIndex, VS_BACK_RIGHT, rgEnemies, WEAPONTYPE_PUMPSHOTGUN)
// INITIALISE_ENEMY_GROUP(esSideVanBackupEnemies, FALSE #IF IS_DEBUG_BUILD, "SideVanBackup " #ENDIF)
//ENDIF
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vsEnemyVans[1], sVehicleRecordingsFile, 1.40, FALSE, 1750)
START_AUDIO_SCENE("MI_1_VAN_ARRIVES_02")
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vsEnemyVans[1].VehicleIndex, "MI_1_VAN_02")
bRenderBlips = FALSE
bRenderBlipsTimer = GET_GAME_TIMER()
iProgress++
ENDIF
ENDIF
BREAK
CASE 1
IF IS_VEHICLE_RECORDING_PLAYBACK_RUNNING_OR_DRIVER_DEAD(vsEnemyVans[1].VehicleIndex, fPlaybackPercentage, vsEnemyVans[1].bDriverDead)
IF ( fPlaybackPercentage > 57.5)
OR ( vsEnemyVans[1].bDriverDead = TRUE )
SET_ENTITY_INVINCIBLE(vsEnemyVans[1].VehicleIndex, FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(vsEnemyVans[1].VehicleIndex, FALSE)
SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(vsEnemyVans[1].VehicleIndex, TRUE)
ENDIF
IF ( fPlaybackPercentage > 96.0 )
OR ( vsEnemyVans[1].bDriverDead = TRUE )
IF DOES_BLIP_EXIST(vsEnemyVans[1].BlipIndex)
REMOVE_BLIP(vsEnemyVans[1].BlipIndex)
ENDIF
ENDIF
IF ( fPlaybackPercentage > 96.0 )
OR ( vsEnemyVans[1].bDriverDead = TRUE )
IF NOT IS_PED_INJURED(esSideVanEnemies[0].PedIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(esSideVanEnemies[0].PedIndex, vGraveyardDefAreaPosisiton1, vGraveyardDefAreaPosistion2, fGraveyardDefAreaWidth)
SET_PED_COMBAT_PROPERTIES(esSideVanEnemies[0].PedIndex, CM_WILLADVANCE, CAL_AVERAGE, CR_MEDIUM, CA_USE_COVER)
SET_PED_COMBAT_ATTRIBUTES(esSideVanEnemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esSideVanEnemies[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_SHOOTING_PROPERTIES(esSideVanEnemies[0].PedIndex, 4)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSideVanEnemies[0].PedIndex, 100.0)
ENDIF
IF NOT IS_PED_INJURED(esSideVanEnemies[1].PedIndex)
SET_PED_DEFENSIVE_AREA_ANGLED(esSideVanEnemies[1].PedIndex, vGraveyardDefAreaPosisiton1, vGraveyardDefAreaPosistion2, fGraveyardDefAreaWidth)
SET_PED_COMBAT_PROPERTIES(esSideVanEnemies[1].PedIndex, CM_WILLADVANCE, CAL_AVERAGE, CR_MEDIUM, CA_USE_COVER)
SET_PED_COMBAT_ATTRIBUTES(esSideVanEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esSideVanEnemies[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_SHOOTING_PROPERTIES(esSideVanEnemies[1].PedIndex, 3)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSideVanEnemies[1].PedIndex, 100.0)
ENDIF
ENDIF
IF ( vsEnemyVans[1].bDriverDead = TRUE )
vsEnemyVans[1].bDriverDead = FALSE
ENDIF
ELSE
iProgress++
ENDIF
BREAK
CASE 2 //enemies are out of the van, keep updating their combat tasks here
IF IS_AUDIO_SCENE_ACTIVE("MI_1_VAN_ARRIVES_02")
STOP_AUDIO_SCENE("MI_1_VAN_ARRIVES_02")
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsEnemyVans[1].VehicleIndex)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vsEnemyVans[1].VehicleIndex)
ENDIF
IF NOT IS_PED_INJURED(esSideVanEnemies[0].PedIndex)
IF ( esSideVanEnemies[0].bFallingBack = FALSE )
IF ( bPlayerUsedAlternativePath = TRUE )
esSideVanEnemies[0].bHasTask = FALSE
esSideVanEnemies[0].iProgress = 100
esSideVanEnemies[0].bFallingBack = TRUE
ENDIF
ENDIF
SWITCH esSideVanEnemies[0].iProgress
CASE 100
IF ( esSideVanEnemies[0].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSideVanEnemies[0].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esSideVanEnemies[0].PedIndex, CM_DEFENSIVE, CAL_AVERAGE, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_ANGLED(esSideVanEnemies[0].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
SET_PED_COMBAT_MOVEMENT_VALUES(esSideVanEnemies[0].PedIndex, 0.6, 0.25)
SET_PED_COVER_PROPERTIES(esSideVanEnemies[0].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
esSideVanEnemies[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
IF NOT IS_PED_INJURED(esSideVanEnemies[1].PedIndex)
IF ( esSideVanEnemies[1].bFallingBack = FALSE )
IF ( bPlayerUsedAlternativePath = TRUE )
esSideVanEnemies[1].bHasTask = FALSE
esSideVanEnemies[1].iProgress = 100
esSideVanEnemies[1].bFallingBack = TRUE
ENDIF
ENDIF
SWITCH esSideVanEnemies[1].iProgress
CASE 100
IF ( esSideVanEnemies[1].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSideVanEnemies[1].PedIndex, 100.0)
SET_PED_COMBAT_PROPERTIES(esSideVanEnemies[1].PedIndex, CM_DEFENSIVE, CAL_AVERAGE, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_ANGLED(esSideVanEnemies[1].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
SET_PED_COMBAT_MOVEMENT_VALUES(esSideVanEnemies[1].PedIndex, 0.75, 0.0)
SET_PED_COVER_PROPERTIES(esSideVanEnemies[1].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
esSideVanEnemies[1].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
IF DOES_ENTITY_EXIST(esSideVanBackupEnemies[0].PedIndex)
IF NOT IS_ENTITY_DEAD(esSideVanBackupEnemies[0].PedIndex)
SWITCH esSideVanBackupEnemies[0].iProgress
CASE 0
IF ( esSideVanBackupEnemies[0].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(esSideVanBackupEnemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esSideVanBackupEnemies[0].PedIndex, CA_AGGRESSIVE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esSideVanBackupEnemies[0].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(esSideVanBackupEnemies[0].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_RANGE(esSideVanBackupEnemies[0].PedIndex, CR_FAR)
SET_PED_COMBAT_MOVEMENT(esSideVanBackupEnemies[0].PedIndex, CM_WILLADVANCE)
SET_PED_SHOOTING_PROPERTIES(esSideVanBackupEnemies[0].PedIndex, 4)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSideVanBackupEnemies[0].PedIndex, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esSideVanBackupEnemies[0].PedIndex, FALSE)
esSideVanBackupEnemies[0].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(esSideVanBackupEnemies[1].PedIndex)
IF NOT IS_ENTITY_DEAD(esSideVanBackupEnemies[1].PedIndex)
SWITCH esSideVanBackupEnemies[1].iProgress
CASE 0
IF ( esSideVanBackupEnemies[1].bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(esSideVanBackupEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esSideVanBackupEnemies[1].PedIndex, CA_AGGRESSIVE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esSideVanBackupEnemies[1].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(esSideVanBackupEnemies[1].PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_RANGE(esSideVanBackupEnemies[1].PedIndex, CR_MEDIUM)
SET_PED_COMBAT_MOVEMENT(esSideVanBackupEnemies[1].PedIndex, CM_WILLADVANCE)
SET_PED_SHOOTING_PROPERTIES(esSideVanBackupEnemies[1].PedIndex, 4)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSideVanBackupEnemies[1].PedIndex, 200.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esSideVanBackupEnemies[1].PedIndex, FALSE)
esSideVanBackupEnemies[1].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
BREAK
ENDSWITCH
CLEANUP_ENEMY_GROUP(esSideVanEnemies)
CLEANUP_ENEMY_GROUP(esSideVanBackupEnemies)
UPDATE_VEHICLE_DAMAGE_FROM_PED(vsEnemyVans[1].VehicleIndex, PLAYER_PED_ID(), 300, 450, vsEnemyVans[1].bSmoking,
<<10.0, 10.0, 3.0>>, <<0.0, 0.0, 5.0>>, <<0.0, -1.5, 0.0>>)
CHECK_VEHICLE_FOR_DRIVING_INTO_LOCATE(vsEnemyVans[1], PLAYER_PED_ID(), <<3238.346680,-4687.663086,114.673004>>,<<36.0,15.0,4.0>>)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[1].VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT, vFrontRightOffset, 0.8, FALSE, TRUE, vFrontRightDamageOffset, 150.0)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[1].VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT, vFrontLeftOffset, 0.8, FALSE, TRUE, vFrontLeftDamageOffset, 150.0)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[1].VehicleIndex, SC_WHEEL_CAR_REAR_LEFT, vRearLeftOffset, 0.8, FALSE, TRUE, vRearLeftDamageOffset, 150.0)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[1].VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT, vRearRightOffset, 0.8, FALSE, TRUE, vRearRightDamageOffset, 150.0)
IF ( bRenderBlips = FALSE )
IF ( bRenderBlipsTimer <> 0 )
IF HAS_TIME_PASSED(2000, bRenderBlipsTimer)
bRenderBlips = TRUE
ENDIF
ENDIF
ENDIF
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esSideVanEnemies, bRenderBlips)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esSideVanBackupEnemies, bRenderBlips)
ENDPROC
PROC MANAGE_THIRD_ENEMY_VAN_AND_ENEMIES(INT &iProgress)
SWITCH iProgress
CASE 0
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3238.346680,-4687.663086,114.673004>>, <<36.0,15.0,4.0>>)
iProgress++
ENDIF
BREAK
CASE 1
REQUEST_MODEL(mnEnemyVan)
REQUEST_MODEL(mnEnemy)
REQUEST_VEHICLE_RECORDING(vsEnemyVans[4].iRecordingNumber, sVehicleRecordingsFile)
IF HAS_MODEL_LOADED(mnEnemyVan)
AND HAS_MODEL_LOADED(mnEnemy)
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsEnemyVans[4].iRecordingNumber, sVehicleRecordingsFile)
vsEnemyVans[4].VehicleIndex = CREATE_ENEMY_VEHICLE(vsEnemyVans[4], 950, FALSE, TRUE, TRUE, FALSE, VEHICLELOCK_UNLOCKED, -1, -1, FALSE #IF IS_DEBUG_BUILD, "EnemyVan 4" #ENDIF)
esVan4Enemies[0].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[4].VehicleIndex, VS_DRIVER, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
esVan4Enemies[1].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[4].VehicleIndex, VS_FRONT_RIGHT, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
esVan4Enemies[2].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[4].VehicleIndex, VS_BACK_LEFT, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
esVan4Enemies[3].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[4].VehicleIndex, VS_BACK_RIGHT, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
INITIALISE_ENEMY_GROUP(esVan4Enemies, FALSE #IF IS_DEBUG_BUILD, "Van4 " #ENDIF)
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vsEnemyVans[4], sVehicleRecordingsFile, 1.2, FALSE, 2750)
START_AUDIO_SCENE("MI_1_VAN_ARRIVES_03")
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vsEnemyVans[4].VehicleIndex, "MI_1_VAN_03")
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsEnemyVans[4].VehicleIndex, TRUE)
iProgress++
ENDIF
BREAK
CASE 2
IF ( GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(vsEnemyVans[4].VehicleIndex) > 98.0 )
IF DOES_BLIP_EXIST(vsEnemyVans[4].BlipIndex)
REMOVE_BLIP(vsEnemyVans[4].BlipIndex)
ENDIF
IF NOT IS_PED_INJURED(esVan4Enemies[0].PedIndex)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esVan4Enemies[0].PedIndex, 150.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVan4Enemies[0].PedIndex, FALSE)
SET_PED_COMBAT_PROPERTIES(esVan4Enemies[0].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_SPHERE(esVan4Enemies[0].PedIndex, << 3214.98, -4716.22, 111.82 >>, 2.0)
SET_PED_SHOOTING_PROPERTIES(esVan4Enemies[0].PedIndex, 3, 100, FIRING_PATTERN_FULL_AUTO)
SET_PED_COVER_PROPERTIES(esVan4Enemies[0].PedIndex, TRUE, FALSE, FALSE, FALSE)
SET_PED_PREFERRED_COVERPOINT(esVan4Enemies[0].PedIndex, esVan4Enemies[0].ItemsetIndex, csCoverpoints[29].CoverpointIndex)
ENDIF
IF NOT IS_PED_INJURED(esVan4Enemies[1].PedIndex)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esVan4Enemies[1].PedIndex, 150.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVan4Enemies[1].PedIndex, FALSE)
SET_PED_COMBAT_PROPERTIES(esVan4Enemies[1].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_SPHERE(esVan4Enemies[1].PedIndex, << 3224.99, -4716.13, 111.41 >>, 1.5)
SET_PED_SHOOTING_PROPERTIES(esVan4Enemies[1].PedIndex, 3, 100, FIRING_PATTERN_FULL_AUTO)
ENDIF
IF NOT IS_PED_INJURED(esVan4Enemies[2].PedIndex)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esVan4Enemies[2].PedIndex, 150.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVan4Enemies[2].PedIndex, FALSE)
SET_PED_COMBAT_PROPERTIES(esVan4Enemies[2].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_SPHERE(esVan4Enemies[2].PedIndex, << 3218.49, -4716.52, 111.37 >>, 2.0)
SET_PED_SHOOTING_PROPERTIES(esVan4Enemies[2].PedIndex, 4, 100, FIRING_PATTERN_FULL_AUTO)
ENDIF
IF NOT IS_PED_INJURED(esVan4Enemies[3].PedIndex)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esVan4Enemies[3].PedIndex, 150.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVan4Enemies[3].PedIndex, FALSE)
SET_PED_COMBAT_PROPERTIES(esVan4Enemies[3].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
SET_PED_DEFENSIVE_AREA_SPHERE(esVan4Enemies[3].PedIndex, << 3224.70, -4718.32, 111.37 >>, 1.5)
SET_PED_SHOOTING_PROPERTIES(esVan4Enemies[3].PedIndex, 4, 100, FIRING_PATTERN_FULL_AUTO)
ENDIF
bEnemiesBlockedByTrain = TRUE
vsEnemyVans[4].iTimer = GET_GAME_TIMER()
STOP_AUDIO_SCENE("MI_1_VAN_ARRIVES_03")
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vsEnemyVans[4].VehicleIndex)
iProgress++
ENDIF
BREAK
CASE 3
IF HAS_TIME_PASSED(34000, vsEnemyVans[4].iTimer) //40000
IF NOT IS_PED_INJURED(esVan4Enemies[0].PedIndex)
SET_PED_COMBAT_PROPERTIES(esVan4Enemies[0].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_NEAR, CA_AGGRESSIVE)
SET_PED_COMBAT_ATTRIBUTES(esVan4Enemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esVan4Enemies[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
REMOVE_PED_DEFENSIVE_AREA(esVan4Enemies[0].PedIndex)
ENDIF
IF NOT IS_PED_INJURED(esVan4Enemies[1].PedIndex)
SET_PED_COMBAT_PROPERTIES(esVan4Enemies[1].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_NEAR, CA_AGGRESSIVE)
SET_PED_COMBAT_ATTRIBUTES(esVan4Enemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esVan4Enemies[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
REMOVE_PED_DEFENSIVE_AREA(esVan4Enemies[1].PedIndex)
ENDIF
IF NOT IS_PED_INJURED(esVan4Enemies[2].PedIndex)
SET_PED_COMBAT_PROPERTIES(esVan4Enemies[2].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_NEAR, CA_AGGRESSIVE)
SET_PED_COMBAT_ATTRIBUTES(esVan4Enemies[2].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esVan4Enemies[2].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
REMOVE_PED_DEFENSIVE_AREA(esVan4Enemies[2].PedIndex)
ENDIF
IF NOT IS_PED_INJURED(esVan4Enemies[3].PedIndex)
SET_PED_COMBAT_PROPERTIES(esVan4Enemies[3].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_NEAR, CA_AGGRESSIVE)
SET_PED_COMBAT_ATTRIBUTES(esVan4Enemies[3].PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(esVan4Enemies[3].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
REMOVE_PED_DEFENSIVE_AREA(esVan4Enemies[3].PedIndex)
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Moving enemies from third van.")
#ENDIF
iProgress++
ENDIF
BREAK
ENDSWITCH
CLEANUP_ENEMY_GROUP(esVan4Enemies)
UPDATE_VEHICLE_DAMAGE_FROM_PED(vsEnemyVans[4].VehicleIndex, PLAYER_PED_ID(), 300, 500, vsEnemyVans[4].bSmoking,
<<10.0, 10.0, 3.0>>, <<0.0, 0.0, 5.0>>, <<0.0, -1.5, 0.0>>)
CHECK_VEHICLE_FOR_DRIVING_INTO_LOCATE(vsEnemyVans[4], PLAYER_PED_ID(), <<3222.843506,-4688.635742,114.212746>>, << 12.0, 16.0, 3.0 >>)
CHECK_VEHICLE_FOR_DRIVING_INTO_LOCATE(vsEnemyVans[4], PLAYER_PED_ID(), <<3217.266113,-4748.119629,112.924225>>, << 16.0, 16.0, 3.0 >>)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[4].VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT, vFrontRightOffset, 0.8, FALSE, TRUE, vFrontRightDamageOffset, 150.0)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[4].VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT, vFrontLeftOffset, 0.8, FALSE, TRUE, vFrontLeftDamageOffset, 150.0)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[4].VehicleIndex, SC_WHEEL_CAR_REAR_LEFT, vRearLeftOffset, 0.8, FALSE, TRUE, vRearLeftDamageOffset, 150.0)
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[4].VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT, vRearRightOffset, 0.8, FALSE, TRUE, vRearRightDamageOffset, 150.0)
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esVan4Enemies)
ENDPROC
PROC CHECK_PLAYER_DETECTED_LOCATION(BOOL bPlayerSpotted, DETECTED_LOCATIONS &eLocation)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF ( eLocation = DL_NOT_DETECTED )
IF ( bPlayerSpotted = TRUE )
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3267.363770,-4574.668457,119.156708>>,<<36.000000,16.000000,4.000000>>)
eLocation = DL_START_AREA
ELIF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3266.107422,-4602.592773,117.675850>>,<<36.000000,13.000000,4.000000>>)
eLocation = DL_MIDDLE_AREA_01
ELIF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3264.762207,-4626.325195,117.186195>>,<<36.000000,11.000000,4.000000>>)
eLocation = DL_MIDDLE_AREA_02
ELIF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3262.034668,-4655.088379,114.936089>>,<<36.000000,17.000000,4.000000>>)
eLocation = DL_CHURCH_AREA
ELIF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3243.011963,-4691.706055,113.654236>>,<<50.000000,20.000000,4.000000>>)
eLocation = DL_PARKING_LOT
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player detected in location ", GET_DETECTED_LOCATION_NAME_FOR_DEBUG(eLocation), ".")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC TRIGGER_MUSIC_EVENTS()
IF ( bMusicEventFirstTwoDeadTriggered = FALSE )
IF ( bMusicEventAlertedTriggered = FALSE )
IF ( GET_NUMBER_OF_ENEMIES_DEAD(esWallEnemies) = 2 )
IF TRIGGER_MUSIC_EVENT("MIC1_FIRST_TWO_DEAD")
bMusicEventFirstTwoDeadTriggered = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bMusicEventFirstVanTriggered = FALSE )
IF ( bOpenGateTriggered = TRUE )
IF PREPARE_MUSIC_EVENT("MIC1_1ST_VAN")
IF TRIGGER_MUSIC_EVENT("MIC1_1ST_VAN")
bMusicEventFirstVanTriggered = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bMusicEventAlertedTriggered = FALSE )
IF ( bPlayerDetected = TRUE )
IF HAS_LABEL_BEEN_TRIGGERED("MCH1_SPOT1")
OR HAS_LABEL_BEEN_TRIGGERED("MCH1_SPOT2")
OR HAS_LABEL_BEEN_TRIGGERED("MCH1_SPOT3")
OR HAS_LABEL_BEEN_TRIGGERED("MCH1_SPOT4")
OR HAS_LABEL_BEEN_TRIGGERED("MCH1_SURROUND")
IF PREPARE_MUSIC_EVENT("MIC1_ALERTED")
IF TRIGGER_MUSIC_EVENT("MIC1_ALERTED")
STOP_AUDIO_SCENE("MI_1_SHOOTOUT_STEALTH")
START_AUDIO_SCENE("MI_1_SHOOTOUT_ENEMIES_ALERTED")
bMusicEventAlertedTriggered = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bMusicEventTrainTriggered = FALSE )
IF ( bEnemiesBlockedByTrain = TRUE )
IF TRIGGER_MUSIC_EVENT("MIC1_TRAIN")
bMusicEventTrainTriggered = TRUE
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_BRAD_CADAVER(INT &iProgress)
IF DOES_ENTITY_EXIST(psBrad.PedIndex)
IF NOT IS_ENTITY_DEAD(psBrad.PedIndex)
SWITCH iProgress
CASE 0
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iBradCadaverScene)
REQUEST_ANIM_DICT("dead")
IF HAS_ANIM_DICT_LOADED("dead")
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iBradCadaverScene)
iBradCadaverScene = CREATE_SYNCHRONIZED_SCENE(<< 3258.899, -4574.090, 115.350 >>, << 173.880, 51.480, 5.040 >>, EULER_XYZ)
TASK_SYNCHRONIZED_SCENE(psBrad.PedIndex, iBradCadaverScene, "dead", "dead_g", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, RBF_BULLET_IMPACT | RBF_PLAYER_IMPACT | RBF_MELEE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psBrad.PedIndex)
STOP_PED_SPEAKING(psBrad.PedIndex, TRUE)
SET_ENTITY_INVINCIBLE(psBrad.PedIndex, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psBrad.PedIndex, TRUE)
ENDIF
ENDIF
ELSE
SET_RAGDOLL_BLOCKING_FLAGS(psBrad.PedIndex, RBF_FIRE)
SET_RAGDOLL_BLOCKING_FLAGS(psBrad.PedIndex, RBF_MELEE)
SET_RAGDOLL_BLOCKING_FLAGS(psBrad.PedIndex, RBF_EXPLOSION)
SET_RAGDOLL_BLOCKING_FLAGS(psBrad.PedIndex, RBF_PLAYER_BUMP)
SET_RAGDOLL_BLOCKING_FLAGS(psBrad.PedIndex, RBF_BULLET_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(psBrad.PedIndex, RBF_PLAYER_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(psBrad.PedIndex, RBF_IMPACT_OBJECT)
iProgress++
ENDIF
BREAK
CASE 1
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_MISSION_STAGE_GRAVEYARD_SHOOTOUT_COMPLETED(INT &iStageProgress)
//don't use locates header J skip
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
SET_CLOCK_TIME(0, 0, 0)
SET_PICKUP_AMMO_AMOUNT_SCALER(3.0)
//using locates header display player objective and check if player made it to the graveyard entrance
IF ( iStageProgress < 40 )
IF NOT DOES_BLIP_EXIST(vsMichaelsCar.BlipIndex)
vsMichaelsCar.BlipIndex = CREATE_BLIP_FOR_VEHICLE(vsMichaelsCar.VehicleIndex)
PRINT_GOD_TEXT_ADVANCED("CMN_GENGETIN")
ENDIF
IF ( bPlayerUsedAlternativePath = FALSE )
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<3276.662598,-4691.776367,112.158768>>, <<3218.352783,-4637.393066,120.542297>>, 16.000000)
bPlayerUsedAlternativePath = TRUE
ENDIF
ENDIF
IF IS_ENTITY_IN_LOCATE(PLAYER_PED_ID(), <<3238.346680,-4687.663086,114.673004>>,<<36.0,15.0,4.0>> #IF IS_DEBUG_BUILD, "GraveyardEntranceLocate" #ENDIF)
//set the fail flag for abandoning the car
FailFlags[MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND] = TRUE
//unset the fail for leaving the graveyard, distance to car check will now take over checking for fails
FailFlags[MISSION_FAIL_GRAVEYARD_ABANDONED] = FALSE
iStageProgress = 40
ENDIF
ENDIF
RUN_TOMBSTONES_FRAG_CHECK(PLAYER_PED_ID(), TombstoneShooterPed, iEnemyTombstoneShootTimer, 4000, 1.25)
MANAGE_FIRST_ENEMY_WAVE(bFirstEnemyWaveSpawned, TRUE)
MANAGE_SECOND_ENEMY_WAVE(bSecondEnemyWaveSpawned, bFirstEnemyWaveSpawned, -1)
MANAGE_THIRD_ENEMY_WAVE(bThirdEnemyWaveSpawned, bSecondEnemyWaveSpawned)
MANAGE_FOURTH_ENEMY_WAVE(bFourthEnemyWaveSpawned, bThirdEnemyWaveSpawned, -1)
MANAGE_FIFTH_ENEMY_WAVE(bFifthEnemyWaveSpawned, bFifthEnemyWaveIgnored, TRUE)
MANAGE_FIRST_ENEMY_REINFORCEMENT_WAVE(bFirstEnemyReinforcementWaveSpawned, bThirdEnemyWaveSpawned)
MANAGE_SECOND_ENEMY_REINFORCEMENT_WAVE(bSecondEnemyReinforcementWaveSpawned, bFirstEnemyReinforcementWaveSpawned, bThirdEnemyWaveSpawned)
//MANAGE_THIRD_ENEMY_REINFORCEMENT_WAVE(bThirdEnemyReinforcementWaveSpawned, bSecondEnemyReinforcementWaveSpawned, bThirdEnemyWaveSpawned)
MANAGE_FIRST_ENEMY_VAN_AND_ENEMIES(vsEnemyVans[0].iProgress)
MANAGE_SECOND_ENEMY_VAN_AND_ENEMIES(vsEnemyVans[1].iProgress)
MANAGE_THIRD_ENEMY_VAN_AND_ENEMIES(vsEnemyVans[4].iProgress)
TRIGGER_MUSIC_EVENTS()
MANAGE_CHURCH_BELL_SOUNDS(iChurchBellsProgress)
MANAGE_PARKED_ENEMY_VEHICLES(vsEnemyVans[2].iProgress)
CHECK_PLAYER_DETECTED_LOCATION(bPlayerDetected, eDetectedLocation)
MANAGE_CONVERSATIONS_DURING_SHOOTOUT(psMichael.iConversationProgress, psMichael.iConversationTimer, iEnemyConversationTimer,
iMichaelRandomConversationDelay, iEnemyRandomConversationDelay, bShootingConversationFlag)
CLEANUP_ENEMY_VEHICLES(vsEnemyVans, FALSE, TRUE, TRUE)
MANAGE_WEAPONS_HELP_TEXT()
MANAGE_BRAD_CADAVER(iBradCadaverProgress)
SWITCH iStageProgress
CASE 0
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_1_SHOOTOUT_STEALTH")
START_AUDIO_SCENE("MI_1_SHOOTOUT_STEALTH")
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
//IF NOT IS_PED_IN_COVER(PLAYER_PED_ID())
// TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), csCoverpoints[0].vPosition, -1, TRUE, 0, TRUE, TRUE, csCoverpoints[0].CoverpointIndex)
// FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
//ENDIF
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
ENDIF
IF ( bGameplayCameraSet = FALSE )
//SET_GAMEPLAY_CAM_RELATIVE_PITCH(-16.536800)
//SET_GAMEPLAY_CAM_RELATIVE_HEADING(-72.373550)
bGameplayCameraSet = TRUE
ENDIF
FailFlags[MISSION_FAIL_GRAVEYARD_ABANDONED] = TRUE
SETTIMERB(0)
psMichael.iTimer = GET_GAME_TIMER()
iStageProgress++
BREAK
CASE 1
IF ( TIMERB() > 5000 )
#IF IS_DEBUG_BUILD
bStageResetFlag = TRUE
#ENDIF
iStageProgress++
ENDIF
BREAK
CASE 40
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_RTC")
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << 3263.05, -4704.67, 104.67 >>, << 3267.14, -4561.37, 132.76 >>, 64.0)
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex) > ABANDON_CAR_WARNING_RANGE
CLEAR_PRINTS()
PRINT_GOD_TEXT_ADVANCED("MCH1_RTC", DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
ENDIF
ENDIF
//if in the target vehicle only
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, TRUE)
DISABLE_PLAYER_VEHICLE_DRIVING_CONTROLS_THIS_FRAME()
IF DOES_BLIP_EXIST(vsMichaelsCar.BlipIndex)
REMOVE_BLIP(vsMichaelsCar.BlipIndex)
ENDIF
ELSE
IF NOT DOES_BLIP_EXIST(vsMichaelsCar.BlipIndex)
vsMichaelsCar.BlipIndex = CREATE_BLIP_FOR_VEHICLE(vsMichaelsCar.VehicleIndex)
ENDIF
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_1_GET_TO_CAR")
START_AUDIO_SCENE("MI_1_GET_TO_CAR")
ENDIF
MANAGE_MISSION_TRAIN(tsTrain.iProgress)
//if player enters the carreaches the car
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
//Speed up the multihead blinders
SET_MULTIHEAD_SAFE(TRUE)
IF ( bCutsceneTimeTrigger = FALSE )
IF ( iCutsceneTriggerTimer = 0)
iCutsceneTriggerTimer = GET_GAME_TIMER()
ELSE
IF HAS_TIME_PASSED(1000, iCutsceneTriggerTimer)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggering mic_1_mcs_3 cutscene due to timer trigger.")
#ENDIF
bCutsceneTimeTrigger = TRUE
ENDIF
ENDIF
ENDIF
IF ( bCutsceneProximityTrigger = FALSE )
PED_INDEX ClosestPedIndex
ClosestPedIndex = GET_PED_CLOSEST_PED_FROM_RELATIONSHIP_GROUP(PLAYER_PED_ID(), rgEnemies)
IF DOES_ENTITY_EXIST(ClosestPedIndex)
IF NOT IS_ENTITY_DEAD(ClosestPedIndex)
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), ClosestPedIndex) < 5.0
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggering mic_1_mcs_3 cutscene due to proximity trigger.")
#ENDIF
bCutsceneProximityTrigger = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
OR bCutsceneProximityTrigger = TRUE OR bCutsceneTimeTrigger = TRUE
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION()
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF DOES_BLIP_EXIST(vsMichaelsCar.BlipIndex)
REMOVE_BLIP(vsMichaelsCar.BlipIndex)
ENDIF
IF ( bCoverpointsCreated = TRUE )
REMOVE_COVERPOINTS(csCoverpoints)
bCoverpointsCreated = FALSE
ENDIF
STOP_SOUND(iChurchBellsSoundID)
REMOVE_ANIM_DICT("dead")
REMOVE_ANIM_DICT("missmic1ig_2")
IF IS_AUDIO_SCENE_ACTIVE("MI_1_GET_TO_CAR")
STOP_AUDIO_SCENE("MI_1_GET_TO_CAR")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_1_SHOOTOUT_ENEMIES_ALERTED")
STOP_AUDIO_SCENE("MI_1_SHOOTOUT_ENEMIES_ALERTED")
ENDIF
RELEASE_NAMED_SCRIPT_AUDIO_BANK("SCRIPT\\FBI_HEIST_3B_SHOOTOUT")
CLEANUP_MISSION_OBJECT(osPropCoffin, TRUE)
CLEANUP_MISSION_OBJECT(osPropShovel, TRUE)
CLEANUP_MISSION_OBJECT(osPropPickaxe, TRUE)
IF DOES_ENTITY_EXIST(psBrad.PedIndex)
DELETE_PED(psBrad.PedIndex)
ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
REQUEST_CUTSCENE("mic_1_mcs_3")
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
SET_CUTSCENE_PED_COMPONENT_VARIATION("Left_Gun", PED_COMP_HAIR, 1, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Kneeling_Gunman", PED_COMP_HAIR, 1, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_HEAD, 0, 0) //(head)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_HAIR, 0, 0) //(hair)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_TORSO, 1, 0) //(uppr)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_LEG, 1, 0) //(lowr)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_HAND, 1, 0) //(hand)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_FEET, 1, 0) //(feet)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_JBIB, 1, 0) //(jbib)
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_KIDNAPPED_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
IF HAS_REQUESTED_CUTSCENE_LOADED("mic_1_mcs_3")
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
// IF IS_VEHICLE_DOOR_DAMAGED(vsMichaelsCar.VehicleIndex, SC_DOOR_FRONT_LEFT)
// SET_VEHICLE_DOOR_CONTROL(vsMichaelsCar.VehicleIndex, SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0)
// ENDIF
// IF IS_VEHICLE_DOOR_DAMAGED(vsMichaelsCar.VehicleIndex, SC_DOOR_FRONT_RIGHT)
// SET_VEHICLE_DOOR_CONTROL(vsMichaelsCar.VehicleIndex, SC_DOOR_FRONT_RIGHT, DT_DOOR_INTACT, 0.0)
// ENDIF
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, FALSE, TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(vsMichaelsCar.VehicleIndex, "Chinese_Goon_Car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
CLEAR_PRINTS()
CLEAR_HELP()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
//clear area when starting the cutscene
CLEAR_AREA(psMichael.vPosition, 100.0, TRUE)
CLEAR_AREA_OF_VEHICLES(psMichael.vPosition, 100.0)
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, TRUE, FALSE) //make sure cutscene ends with a fade
iStageProgress++
ELSE
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
SET_CUTSCENE_PED_COMPONENT_VARIATION("Left_Gun", PED_COMP_HAIR, 1, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Kneeling_Gunman", PED_COMP_HAIR, 1, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_HEAD, 0, 0) //(head)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_HAIR, 0, 0) //(hair)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_TORSO, 1, 0) //(uppr)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_LEG, 1, 0) //(lowr)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_HAND, 1, 0) //(hand)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_FEET, 1, 0) //(feet)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_JBIB, 1, 0) //(jbib)
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_ENEMY_GROUP(esVanEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esMiddleEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esWallEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esChurchEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esSideVanEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esSideVanBackupEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esExitEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esVan4Enemies, TRUE)
CLEANUP_ENEMY_GROUP(esRunners, TRUE)
CLEANUP_ENEMY_GROUP(esSideEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esFirstReinforcementEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esSecondReinforcementEnemies, TRUE)
CLEANUP_ENEMY_GROUP(esThirdReinforcementEnemies, TRUE)
CLEANUP_ENEMY_VEHICLES(vsEnemyVans, TRUE)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 2
IF ( bMusicEventKidnappedTriggered = FALSE )
IF PREPARE_MUSIC_EVENT("MIC1_KIDNAPPED")
IF TRIGGER_MUSIC_EVENT("MIC1_KIDNAPPED")
bMusicEventKidnappedTriggered = TRUE
ENDIF
ENDIF
ENDIF
IF ( bMusicEventReadyToFlyTriggered = FALSE )
IF IS_CUTSCENE_PLAYING()
IF ( GET_CUTSCENE_TIME() > 4500 )
IF TRIGGER_MUSIC_EVENT("MIC1_READY_TO_FLY")
bMusicEventReadyToFlyTriggered = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("asea")
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, FALSE, TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, VS_DRIVER)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
ENDIF
ENDIF
IF HAS_CUTSCENE_FINISHED()
REPLAY_STOP_EVENT()
//start rendering from scripted camera early so that map streams in
IF DOES_CAM_EXIST(ScriptedCamera)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
iStageProgress++
ELSE
//create scripted camera in advance
IF NOT DOES_CAM_EXIST(ScriptedCamera)
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
SET_CAM_PARAMS(ScriptedCamera, <<3157.128906,7499.776855,5.372416>>,<<11.137081,-0.000000,145.805832>>,59.407524)
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.25)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted camera.")
#ENDIF
ENDIF
ENDIF
BREAK
CASE 3
IF IS_SCREEN_FADED_OUT()
//delete train when screen is faded out if the train exists
IF DOES_ENTITY_EXIST(tsTrain.VehicleIndex)
AND DOES_ENTITY_EXIST(tsTrain.PedIndex)
DELETE_PED(tsTrain.PedIndex)
DELETE_MISSION_TRAIN(tsTrain.VehicleIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Deleted mission train.")
#ENDIF
ENDIF
IF NOT HAS_SOUND_FINISHED(iTrainBellsSoundID)
STOP_SOUND(iTrainBellsSoundID)
ENDIF
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Prologue_Train_Sounds")
//warp player ped out of the car
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
ENDIF
//delete player's car
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
DELETE_VEHICLE(vsMichaelsCar.VehicleIndex)
ENDIF
ENDIF
UNLOCK_GRAVEYARD_GATES()
UNREGISTER_GRAVEYARD_GATES()
RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID()).")
#ENDIF
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC MANAGE_CONVERSATIONS_DURING_FLIGHT_HOME(INT &iTrevorProgress)
SWITCH iTrevorProgress
CASE 0
IF IS_PED_SITTING_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
IF ( fDistanceToDestination != 0 AND fDistanceToDestination < TRIGGER_CALL_RANGE )
psTrevor.iConversationTimer = GET_GAME_TIMER()
iTrevorProgress++
ENDIF
ENDIF
BREAK
CASE 1
IF IS_PED_SITTING_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
IF CHAR_CALL_PLAYER_CELLPHONE_FORCE_ANSWER(sMichael1Conversation, CHAR_CHENGSR, "MCH1AUD",
PICK_STRING(bStageReplayInProgress, "MCH1_CP04", "MCH1_CP04b"), CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("MCH1_CP04", TRUE)
REPLAY_RECORD_BACK_FOR_TIME(1.0, 12.0, REPLAY_IMPORTANCE_HIGHEST)
iTrevorProgress++
ENDIF
ENDIF
BREAK
CASE 2
IF HAS_LABEL_BEEN_TRIGGERED("MCH1_CP04")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
psTrevor.iConversationTimer = GET_GAME_TIMER()
iTrevorProgress++
ENDIF
IF WAS_LAST_CELLPHONE_CALL_INTERRUPTED()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Last phone call was interrupted.")
#ENDIF
ENDIF
ENDIF
BREAK
CASE 3
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
iTrevorProgress++
ENDIF
BREAK
CASE 4
ADD_CONTACT_TO_PHONEBOOK(CHAR_CHENGSR, TREVOR_BOOK, TRUE)
iTrevorProgress++
BREAK
CASE 5
IF ( bTextMessageSent = FALSE )
IF ( iSendTextMessageTimer = 0 )
iSendTextMessageTimer = GET_GAME_TIMER()
ELSE
IF HAS_TIME_PASSED(16000, iSendTextMessageTimer)
SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER(CHAR_LAMAR, "MIC1_END", TXTMSG_UNLOCKED, TXTMSG_CRITICAL)
bTextMessageSent = TRUE
iSendTextMessageTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL IS_MISSION_STAGE_FLY_HOME_COMPLETED(INT &iStageProgress)
//don't use locates header J skip
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
SWITCH iStageProgress
CASE 0
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_1_FLY_PRE_PHONECALL")
START_AUDIO_SCENE("MI_1_FLY_PRE_PHONECALL")
ENDIF
IF NOT DOES_CAM_EXIST(ScriptedCamera)
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
SET_CAM_PARAMS(ScriptedCamera, <<3157.128906,7499.776855,5.372416>> + vGlobalFlightOffset, <<11.137081,-0.000000,145.805832>>,59.407524)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted camera.")
#ENDIF
ENDIF
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
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
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
SET_HELI_BLADES_FULL_SPEED(vsTrevorsPlane.VehicleIndex)
SET_VEHICLE_ENGINE_ON(vsTrevorsPlane.VehicleIndex, TRUE, TRUE)
FREEZE_ENTITY_POSITION(vsTrevorsPlane.VehicleIndex, TRUE)
ENDIF
bTextMessageSent = FALSE
iStageProgress++
BREAK
CASE 1
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_START(GET_CAM_COORD(ScriptedCamera), GET_ENTITY_FORWARD_VECTOR(vsTrevorsPlane.VehicleIndex), 4500.0)
iLoadSceneTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_START().")
#ENDIF
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Load scene timer: ", GET_GAME_TIMER() - iLoadSceneTimer, ".")
#ENDIF
IF IS_NEW_LOAD_SCENE_LOADED()
OR HAS_TIME_PASSED(10000, iLoadSceneTimer)
#IF IS_DEBUG_BUILD
IF HAS_TIME_PASSED(10000, iLoadSceneTimer)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP() due to iLoadSceneTimer timeout.")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP() due to IS_NEW_LOAD_SCENE_LOADED() returning TRUE.")
ENDIF
#ENDIF
NEW_LOAD_SCENE_STOP()
REPLAY_RECORD_BACK_FOR_TIME(0.0, 12.0, REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ENDIF
ENDIF
BREAK
CASE 2 //scene visible in camera should be streamed in by now
REQUEST_ANIM_DICT("missmic1")
IF HAS_ANIM_DICT_LOADED("missmic1")
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
FREEZE_ENTITY_POSITION(vsTrevorsPlane.VehicleIndex, FALSE)
START_PLAYBACK_RECORDED_VEHICLE(vsTrevorsPlane.VehicleIndex, vsTrevorsPlane.iRecordingNumber, sVehicleRecordingsFile)
SET_GLOBAL_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(vsTrevorsPlane.VehicleIndex, vGlobalFlightOffset)
SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(vsTrevorsPlane.VehicleIndex, vLocalPlaneOffset)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsTrevorsPlane.VehicleIndex, fPlaneRecordingSkipTime)
SET_PLAYBACK_SPEED(vsTrevorsPlane.VehicleIndex, 0.9)
SET_VEHICLE_ENGINE_ON(vsTrevorsPlane.VehicleIndex, TRUE, TRUE)
SET_HELI_BLADES_FULL_SPEED(vsTrevorsPlane.VehicleIndex)
CONTROL_LANDING_GEAR(vsTrevorsPlane.VehicleIndex, LGC_RETRACT_INSTANT)
ENDIF
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iPlaneSceneID)
iPlaneSceneID = CREATE_SYNCHRONIZED_SCENE(<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iPlaneSceneID, vsTrevorsPlane.VehicleIndex, 0)
DESTROY_ALL_CAMS()
ScriptedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
PLAY_SYNCHRONIZED_CAM_ANIM(ScriptedCamera, iPlaneSceneID, "trevor_plane_cam", "missmic1")
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_AIRCRAFT) = CAM_VIEW_MODE_FIRST_PERSON
bCamViewModeContextChanged = TRUE
SET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_AIRCRAFT, CAM_VIEW_MODE_THIRD_PERSON_MEDIUM)
ENDIF
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
psTrevor.iTimer = GET_GAME_TIMER()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME_LONG)
iStageProgress++
ENDIF
BREAK
CASE 3
#IF IS_DEBUG_BUILD
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsTrevorsPlane.VehicleIndex)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(vsTrevorsPlane.VehicleIndex, GET_STRING_FROM_FLOAT(GET_TIME_POSITION_IN_RECORDING(vsTrevorsPlane.VehicleIndex)), 1.25)
ENDIF
ENDIF
#ENDIF
DISABLE_PLAYER_VEHICLE_CONTROLS_THIS_FRAME()
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_NEXT_CAMERA)
DISABLE_FIRST_PERSON_FLASH_EFFECT_THIS_UPDATE()
IF HAS_TIME_PASSED(iCutsceneTime, psTrevor.iTimer)
RENDER_SCRIPT_CAMS(FALSE, TRUE, iInterpTime, FALSE) //interpolate back to gameplay camera from animated camera
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
IF bStageReplayInProgress = FALSE
IF bCamViewModeContextChanged = FALSE
ANIMPOSTFX_PLAY("SwitchSceneTrevor", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "Hit_1", "LONG_PLAYER_SWITCH_SOUNDS")
ENDIF
ENDIF
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(MIC1_LANDING_TIME)
bWeatherTypeThunderSet = FALSE
bWeatherTypeOvercastSet = FALSE
bFirstPersonFXTriggered = FALSE
SETTIMERA(0)
iStageProgress++
ENDIF
BREAK
CASE 4
IF ( bWeatherTypeOvercastSet = FALSE )
SET_WEATHER_TYPE_OVERTIME_PERSIST("EXTRASUNNY", 60.0)
iWeatherTypeTimer = GET_GAME_TIMER()
bWeatherTypeOvercastSet = TRUE
ENDIF
fDistanceToDestination = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vFlightBackDestination)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_ABOVE_ENTITY(PLAYER_PED_ID(), GET_STRING_FROM_FLOAT(fDistanceToDestination), 0.5, 255, 255, 255)
#ENDIF
//disable player camera control when camera is interpolating from script camera to gameplay camera
IF IS_INTERPOLATING_FROM_SCRIPT_CAMS()
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_BEHIND)
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_VEH_LOOK_BEHIND)
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_LR)
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_UD)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_NEXT_CAMERA)
IF ( bCamViewModeContextChanged = TRUE )
IF ( bFirstPersonFXTriggered = FALSE )
IF TIMERA() > iInterpTime - 300
ANIMPOSTFX_PLAY("CamPushInTrevor", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bFirstPersonFXTriggered = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF ( bCamViewModeContextChanged = TRUE )
SET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_AIRCRAFT, CAM_VIEW_MODE_FIRST_PERSON)
bCamViewModeContextChanged = FALSE
ENDIF
ENDIF
MANAGE_CONVERSATIONS_DURING_FLIGHT_HOME(psTrevor.iConversationProgress)
IS_PLAYER_AT_LOCATION_IN_VEHICLE(sLocatesData, vFlightBackDestination, DEFAULT_LOCATES_SIZE_VECTOR(), TRUE, vsTrevorsPlane.VehicleIndex, "MCH1_GT_T8", sLabelTGETIN2, sLabelTGETBCK2, TRUE)
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsTrevorsPlane.VehicleIndex)
IF ( bVehiclePlaybackInterrupted = FALSE )
IF ( GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(vsTrevorsPlane.VehicleIndex) > 98.0 )
STOP_PLAYBACK_RECORDED_VEHICLE(vsTrevorsPlane.VehicleIndex)
ENDIF
IF IS_PLAYER_IN_CONTROL_OF_VEHICLE(vsTrevorsPlane.VehicleIndex)
STOP_PLAYBACK_RECORDED_VEHICLE(vsTrevorsPlane.VehicleIndex)
CLEAR_PED_TASKS(PLAYER_PED_ID())
bVehiclePlaybackInterrupted = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<1719.452637,3254.324951,40.144505>>, <<1048.329956,3073.852295,50.704060>>, 34.0)
AND IS_ENTITY_IN_ANGLED_AREA(vsTrevorsPlane.VehicleIndex, <<1719.452637,3254.324951,40.144505>>, <<1048.329956,3073.852295,50.704060>>, 34.0)
IF ( GET_ENTITY_HEIGHT_ABOVE_GROUND(vsTrevorsPlane.VehicleIndex) < 2.0 )
IF ( GET_ENTITY_SPEED(vsTrevorsPlane.VehicleIndex) < 10.0 )
OR IS_VEHICLE_STOPPED(vsTrevorsPlane.VehicleIndex)
iStageProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 5
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vsTrevorsPlane.VehicleIndex, 6.0)
REPLAY_RECORD_BACK_FOR_TIME(10.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
DESTROY_ALL_CAMS()
TRIGGER_MUSIC_EVENT("MIC1_FLIGHT_LANDED")
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED()
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_END_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vsTrevorsCar.VehicleIndex)
IF IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(vsTrevorsCar.VehicleIndex))
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vsTrevorsCar.VehicleIndex, FALSE)
ENDIF
SET_MISSION_VEHICLE_GEN_VEHICLE(vsTrevorsCar.VehicleIndex, vsTrevorsCar.vPosition, vsTrevorsCar.fHeading)
bTrevorsCarSetAsVehicleGenVehicle = TRUE
WAIT(1)
ENDIF
ENDIF
IF ( bTextMessageSent = FALSE )
SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER(CHAR_LAMAR, "MIC1_END", TXTMSG_UNLOCKED, TXTMSG_CRITICAL)
bTextMessageSent = TRUE
ENDIF
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
//|============================= END MISSION STAGES FUNCTIONS ============================|
//|=================================== MAIN SCRIPT LOOP ==================================|
SCRIPT
SET_MISSION_FLAG (TRUE)
//check for death or arrest
IF HAS_FORCE_CLEANUP_OCCURRED()
STORE_FAIL_WEAPON(GET_PED_INDEX(CHAR_MICHAEL), ENUM_TO_INT(SELECTOR_PED_MICHAEL))
Mission_Flow_Mission_Force_Cleanup()
MISSION_CLEANUP()
IF ( bPrologueMapActive = TRUE ) //call the delayed cleanup of prologue assets/settings
SET_CLEANUP_TO_RUN_ON_RESPAWN(RCI_MICHAEL1) //any changes to this script prologue cleanup
//should be updated in RUN_RCI_MICHAEL1() from respawn_cleanup_data.sch
g_RestoreSnapshotWeaponsOnDeath = TRUE
RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT_FOR_CHAR(CHAR_MICHAEL)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID()).")
#ENDIF
ENDIF
TERMINATE_THIS_THREAD()
ENDIF
//create debug widgets and skip menu
#IF IS_DEBUG_BUILD
CREATE_DEBUG_MISSION_STAGE_MENU()
CREATE_DEBUG_WIDGETS()
#ENDIF
//handle mission replay
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())
eMichaelsFailWeapon = GET_FAIL_WEAPON(ENUM_TO_INT(SELECTOR_PED_MICHAEL))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Michael's fail weapon from GET_FAIL_WEAPON() is ", GET_WEAPON_NAME(eMichaelsFailWeapon), ".")
#ENDIF
bReplayFlag = TRUE
//handle shitskip message
IF ( g_bShitSkipAccepted = TRUE )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Shitskip accepted by the player.")
#ENDIF
SWITCH eMissionStage //check current mission stage when shit skip is accepted
CASE MISSION_STAGE_GET_TO_AIRPORT //if replaying and shit skipping MISSION_STAGE_GET_TO_AIRPORT
SWITCH GET_PLAYER_CHARACTER_AT_MISSION_START() //check character who started the mission
CASE CHAR_TREVOR //if mission was started as Trevor
eMissionStage = MISSION_STAGE_FLY_TO_NORTH_YANKTON //change stage to MISSION_STAGE_FLY_TO_NORTH_YANKTON
BREAK
CASE CHAR_MICHAEL
eMissionStage = GET_NEXT_MISSION_STAGE(eMissionStage)
BREAK
ENDSWITCH
BREAK
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
SWITCH GET_PLAYER_CHARACTER_AT_MISSION_START() //check character who started the mission
CASE CHAR_TREVOR //if mission was started as Trevor
eMissionStage = MISSION_STAGE_CUTSCENE_GRAVEYARD //change stage to MISSION_STAGE_FLY_TO_NORTH_YANKTON
BREAK
CASE CHAR_MICHAEL
eMissionStage = GET_NEXT_MISSION_STAGE(eMissionStage)
BREAK
ENDSWITCH
BREAK
DEFAULT
eMissionStage = GET_NEXT_MISSION_STAGE(eMissionStage)
BREAK
ENDSWITCH
#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
//if mission is being replayed or shit skipped to stage MISSION_STAGE_CUTSCENE_GRAVEYARD
IF ( eMissionStage = MISSION_STAGE_CUTSCENE_GRAVEYARD )
SET_CUTSCENE_TRIGGER_FLAG_FOR_PLAYER_PED_ENUM(GET_PLAYER_CHARACTER_AT_MISSION_START(), bCutsceneTriggeredByMichael, bCutsceneTriggeredByTrevor)
ENDIF
ELSE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_AIRPORT), "GET TO AIRPORT", 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
//loop forever until mission is passed or failed
WHILE TRUE
//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
IF ( bPrologueMapActive = TRUE )
RUN_GRAVEYARD_GATES_CHECK(eMissionStage, bOpenGateTriggered, bSmoothCloseGateTriggered, iGateCloseProgress)
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
IF IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())))
IF NOT DOES_ENTITY_EXIST(g_MissionStatSingleSpeedWatchEntity)
OR (IS_ENTITY_A_VEHICLE(g_MissionStatSingleSpeedWatchEntity) AND GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(g_MissionStatSingleSpeedWatchEntity) != GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_BuryTheHatchet")
SWITCH eMissionStage
CASE MISSION_STAGE_CUTSCENE_INTRO
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
UPDATE_FIRST_PERSON_VEHICLE_CAMERA_BLOCKING()
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_INTRO_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_GET_TO_AIRPORT
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_GET_TO_AIRPORT
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5)
ENDIF
BREAK
CASE CHAR_TREVOR
IF IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_DISTRICT_NAME)
ENDIF
BREAK
ENDSWITCH
UPDATE_FIRST_PERSON_VEHICLE_CAMERA_BLOCKING()
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_GET_TO_AIRPORT_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_CUTSCENE_AIRPORT
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON //this stage can only be reached on a retry or debug skip
IF IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_DISTRICT_NAME)
ENDIF
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_FLY_TO_NORTH_YANKTON_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
REPLAY_RECORD_BACK_FOR_TIME(8.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
eMissionStage = MISSION_STAGE_CUTSCENE_AIRPORT
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_AIRPORT
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_AIRPORT_COMPLETED(iMichaelStageProgress, iTrevorStageProgress)
RESET_MISSION_FLAGS()
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
eMissionStage = MISSION_STAGE_GET_TO_GRAVEYARD
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
eMissionStage = MISSION_STAGE_CUTSCENE_GRAVEYARD
bCutsceneTriggeredByMichael = FALSE
bCutsceneTriggeredByTrevor = TRUE
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_GET_TO_GRAVEYARD
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5)
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_GET_TO_GRAVEYARD_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_GET_TO_GRAVE
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_GET_TO_GRAVE
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_GET_TO_GRAVE_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_CUTSCENE_GRAVEYARD
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_GRAVEYARD_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_GRAVEYARD_SHOOTOUT
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_GRAVEYARD_SHOOTOUT_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_CUTSCENE_KIDNAPPED
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_KIDNAPPED_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_FLY_HOME
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_FLY_HOME
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_DISTRICT_NAME)
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_FLY_HOME_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_END
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
AWARD_ACHIEVEMENT_FOR_MISSION(ACH03) // The Not-So Shallow Grave
MISSION_FLOW_MISSION_PASSED()
MISSION_CLEANUP()
IF ( bPrologueMapActive = TRUE )
PROLOGUE_MAP_CLEANUP() //remove prologue map if active
ENDIF
TERMINATE_THIS_THREAD()
BREAK
CASE MISSION_STAGE_FAILED
STORE_FAIL_WEAPON(GET_PED_INDEX(CHAR_MICHAEL), ENUM_TO_INT(SELECTOR_PED_MICHAEL))
SET_MISSION_FAILED_WITH_REASON(eMissionFail, bPrologueMapActive)
CLEAR_HELP()
CLEAR_PRINTS()
KILL_ANY_CONVERSATION()
IF NOT IS_REPEAT_PLAY_ACTIVE()
REMOVE_CONTACT_FROM_INDIVIDUAL_PHONEBOOK(CHAR_CHENGSR, TREVOR_BOOK)
ENDIF
TRIGGER_MUSIC_EVENT("MIC1_FAIL") //stop all music
IF IS_STREAM_PLAYING() STOP_STREAM() ENDIF //stop flashback stream if it is playing
IF ( bPlayerDroveOffRoute = TRUE ) //if player failed for going off route
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID()) //stop the player when going off route
BRING_VEHICLE_TO_HALT(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()), 10.0, 5) //to the graveyard
ENDIF
ENDIF
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
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
IF ( bPrologueMapActive = TRUE )
RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID()) //restore weapons stroed in snapshot
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<-1039.6115, -2740.5698, 19.1693>>, 328.9699) //warp Michael to airport terminal
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID()).")
#ENDIF
ENDIF
BREAK
CASE CHAR_TREVOR
IF ( bTrevorFlightActive = TRUE )
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<1782.9651, 3314.9270, 40.4374>>, 341.4644) //warp Trevor near countryside air
ENDIF
BREAK
ENDSWITCH
MISSION_CLEANUP()
IF ( bPrologueMapActive = TRUE )
PROLOGUE_MAP_CLEANUP() //remove prologue map if active
ENDIF
TERMINATE_THIS_THREAD()
BREAK
ENDSWITCH
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID(), MIC1_DAMAGE)
IF DOES_ENTITY_EXIST(vsTrevorsPlane.VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(vsTrevorsPlane.VehicleIndex, MIC1_PLANE_DAMAGE)
ELSE
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL, MIC1_PLANE_DAMAGE)
ENDIF
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND (IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))) OR IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))))
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), MIC1_CAR_DAMAGE)
ELSE
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL, MIC1_CAR_DAMAGE)
ENDIF
ENDIF
#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