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

15041 lines
506 KiB
Python
Executable File

//|=======================================================================================|
//| Author: Lukasz Bogaj / Jim McMahon Date: 09/01/2012 |
//|=======================================================================================|
//| CARSTEAL3.sc |
//| DEEP INSIDE |
//| |
//|=======================================================================================|
/*| Security peds ambient speech
//generic
PROVOKE_TRESPASS
CHALLENGE_THREATEN
CHALLENGE_ACCEPTED_GENERIC
PROVOKE_STARING
GENERIC_HI
GENERIC_HOWS_IT_GOING
OVER_THERE
//mission specific
MOVE_AWAY_WARNING
DRAW_GUN
STOP_THE_CAR
MOVE_AWAY_FROM_THE_CAR
GET_OUT_OF_THE_CAR
FREEZE
COVER_ME
NEEDED_ON_SET
GENERIC_SHOCKED_HIGH
//mission voice names
A_M_M_GENERICMALE_01_WHITE_MINI_01
A_M_M_GENERICMALE_01_WHITE_MINI_02
A_M_M_GENERICMALE_01_WHITE_MINI_03
A_M_M_GENERICMALE_01_WHITE_MINI_04
*/
//|==================================== INCLUDE FILES ====================================|
//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
USING "rage_builtins.sch"
USING "globals.sch"
//Commands headers
USING "commands_pad.sch"
USING "commands_fire.sch"
USING "commands_misc.sch"
USING "commands_clock.sch"
USING "commands_script.sch"
USING "commands_object.sch"
USING "commands_player.sch"
USING "commands_entity.sch"
USING "commands_camera.sch"
USING "commands_graphics.sch"
USING "commands_streaming.sch"
USING "commands_interiors.sch"
USING "commands_shapetest.sch"
USING "commands_recording.sch"
//Script headers
USING "script_ped.sch"
USING "script_misc.sch"
USING "script_blips.sch"
USING "script_player.sch"
//Public headers
USING "shop_public.sch"
USING "replay_public.sch"
USING "taxi_functions.sch"
USING "locates_public.sch"
USING "dialogue_public.sch"
USING "selector_public.sch"
USING "cutscene_public.sch"
USING "carsteal_public.sch"
USING "weapons_public.sch"
USING "cellphone_public.sch"
USING "mission_stat_public.sch"
USING "building_control_public.sch"
USING "flow_public_core.sch"
USING "flow_public_core_override.sch"
//Other headers
USING "area_checks.sch"
USING "emergency_call.sch"
USING "jb700_gadgets.sch"
//Debug headers
#IF IS_DEBUG_BUILD
USING "script_debug.sch"
USING "select_mission_stage.sch"
#ENDIF
//|===================================== ENUMS & STRUCTS ==================================|
/// PURPOSE: Specifies stages of the mission.
ENUM MISSION_STAGES
MISSION_STAGE_GET_TO_ACTOR = 0, //Franklin knocks out movie star to steal his suit or steals the car
MISSION_STAGE_CUTSCENE_TRAILER = 1, //Franklin drags the body of the movie star into the trailer
MISSION_STAGE_GET_TO_CAR = 2, //Franklin gets to the target car and steals it
MISSION_STAGE_ESCAPE_FILM_SET = 3, //Franklin drives the stolen car out of the film set and loses the security
MISSION_STAGE_DELIVER_CAR = 4, //Franklin drives the stolen car to the garage
MISSION_STAGE_CUTSCENE_END = 5, //Franklin delivers the stolen car to the garage and meets Devin
MISSION_STAGE_EJECTOR_TEST = 6,
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_CAR_DEAD, //Mission car destroyed
MISSION_FAIL_CAR_UNDRIVABLE, //Mission car undrivable
MISSION_FAIL_CAR_LEFT_BEHIND, //Mission car left behind
MISSION_FAIL_STUDIO_LEFT_BEHIND, //Film studio left behind
MISSION_FAIL_COPS_AT_GARAGE, //Player arrived at the garage with cops around
MISSION_FAIL_ACTRESS_AT_GARAGE, //Player arrived at the garage with actress in the mission car
MISSION_FAIL_SECURITY_AT_GARAGE, //Player arrived at the garage security around
MISSION_FAIL_DEVIN_DEAD, //Devin died
MISSION_FAIL_DEVIN_ATTACKED, //Devin attacked
MISSION_FAIL_FORCE_FAIL, //Debug forced fail
MAX_MISSION_FAILS
ENDENUM
/// PURPOSE: Specifies mid-mission checkpoints for mission retry.
ENUM MID_MISSION_STAGES
MID_MISSION_STAGE_GET_TO_ACTOR = 0, //Checkpoint at MISSION_STAGE_GET_TO_ACTOR
MID_MISSION_STAGE_GET_TO_CAR = 1, //Checkpoint at MISSION_STAGE_GET_TO_CAR
MID_MISSION_STAGE_ESCAPE_FILM_SET = 2, //Checkpoint at MISSION_STAGE_ESCAPE_FILM_SET
MID_MISSION_STAGE_DELIVER_CAR = 3 //Checkpoint at MISSION_STAGE_DELIVER_CAR
ENDENUM
/// PURPOSE: Specifies ped behaviour states.
ENUM PED_STATES
PED_STATE_IDLE = 0,
PED_STATE_DEAD,
PED_STATE_ARGUING,
PED_STATE_MOVING_TO_LOCATION,
PED_STATE_STANDING_AT_LOCATION,
PED_STATE_PLAYING_ANIM_1,
PED_STATE_PLAYING_ANIM_2,
PED_STATE_PLAYING_ANIM_3,
PED_STATE_PLAYING_ANIM_4,
PED_STATE_STARTING_SCENARIO,
PED_STATE_STARTING_SCENARIO_WARP,
PED_STATE_USING_SCENARIO,
PED_STATE_BLOCKING_PLAYER,
PED_STATE_JACKING_PLAYER,
PED_STATE_WATCHING_PLAYER,
PED_STATE_STUNNED,
PED_STATE_SITTING_IN_CAR,
PED_STATE_BEING_EJECTED,
PED_STATE_BEING_STEALTH_KILLED,
PED_STATE_FLEEING,
PED_STATE_IMMOBILIZED,
PED_STATE_INTIMIDATION,
PED_STATE_COMBAT_AIMING,
PED_STATE_COMBAT_AIMING_PED,
PED_STATE_COMBAT_ON_FOOT,
PED_STATE_COMBAT_DEFENSIVE,
PED_STATE_ENTERING_VEHICLE,
PED_STATE_COMBAT_FROM_CAR_SHOOTING,
PED_STATE_COMBAT_FROM_CAR_NO_SHOOTING
ENDENUM
ENUM PED_CLEANUP_REASONS
PED_CLEANUP_NO_CLEANUP = 0,
PED_CLEANUP_LOST = 1,
PED_CLEANUP_KILLED_BY_PLAYER_STEALTH = 2,
PED_CLEANUP_KILLED_BY_PLAYER_TAKEDOWN = 3,
PED_CLEANUP_KILLED_BY_PLAYER_LETHAL = 4,
PED_CLEANUP_KILLED_BY_PLAYER_VEHICLE = 5,
PED_CLEANUP_KILLED_BY_SCRIPT = 6
ENDENUM
ENUM FILM_CREW_PEDS
FCP_DIRECTOR = 0, //Film director
FCP_GRIP_1 = 1, //Grip next to the director
FCP_GRIP_2 = 2,
FCP_GRIP_3 = 3,
FCP_GRIP_4 = 4,
FCP_GRIP_5 = 5,
MAX_FILM_CREW_PEDS
ENDENUM
ENUM MELTDOWN_SCENE_PEDS
MSP_ACTORA = 0,
MSP_ACTORB = 1,
MSP_CAMERAMAN = 2,
MSP_BOOMMAN = 3,
MSP_DIRECTOR = 4,
MAX_MELTDOWN_SCENE_PEDS
ENDENUM
HASH_ENUM STUDIO_GATES_HASH_ENUM
DOORHASH_STUDIO_SIDE_GATE_L,
DOORHASH_STUDIO_SIDE_GATE_R,
DOORHASH_GARAGE_FRONT
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
INT iConversationTimer //Ped's conversation timer
INT iConversationCounter
INT iProgress
INT iTimer //Ped's timer
INT iLOSTimer
INT iCleanupAttempts
BOOL bCanSeeTargetPed
BOOL bHasTask
PED_STATES eState
PED_CLEANUP_REASONS eCleanupReason
FLOAT fDistanceToTarget
#IF IS_DEBUG_BUILD
TEXT_LABEL_31 sDebugName
#ENDIF
ENDSTRUCT
/// PURPOSE: Specifies details of mission vehicles.
STRUCT VEH_STRUCT
VEHICLE_INDEX VehicleIndex //Vehicle index
BLIP_INDEX BlipIndex //Vehicle blip
VECTOR vPosition //Vehicle postion
FLOAT fHeading //Vehicle heading
MODEL_NAMES ModelName //Vehicle model
INT iProgress
INT iTimer
VECTOR vOffset
VECTOR vTargetPosition
FLOAT fTargetHeading
BOOL bImmobilized
BOOL bAutoDriveActive
BOOL bLineOfSightToTarget
ENDSTRUCT
/// PURPOSE: Specifies details of mission objects
STRUCT OBJECT_STRUCT
OBJECT_INDEX ObjectIndex //Object index
VECTOR vPosition //Object position
VECTOR vRotation //Object rotation
MODEL_NAMES ModelName //Object model
ENDSTRUCT
/// PURPOSE: Specifies ped postion and heading
STRUCT LOCATION_STRUCT
VECTOR vPosition
FLOAT fHeading
ENDSTRUCT
//|======================================= CONSTANTS =====================================|
CONST_INT MAX_MODELS 8
CONST_INT MAX_CAR_RECORDINGS 6
CONST_INT MAX_ANIMATIONS 2
CONST_INT ABANDON_STUDIO_FAIL_RANGE 225
CONST_INT ABANDON_VEHICLE_FAIL_RANGE 100
TWEAK_FLOAT BLIP_SLIDE_AMOUNT 1.0
TWEAK_FLOAT fEjectScenePhase 0.575
MODEL_NAMES mnSecurityCar = SCHAFTER2
MODEL_NAMES mnSecurityPed = S_M_M_SECURITY_01
MODEL_NAMES mnSpike = PROP_TYRE_SPIKE_01
VECTOR vInteriorPosition = << 479.88, -1318.57, 28.20 >>//<< 480.51, -1318.31, 28.20 >> //garage interior coordinates
VECTOR vFilmSetCenterPosition = << -1187.46, -501.22, 35.42 >> //film set center coordinates
VECTOR vFilmCrewPedsScenePosition = << -1178.52, -509.19, 34.56 >>
VECTOR vFilmCrewPedsSceneRotation = << 0.0, 0.0, 3.24 >>
VECTOR vEjectorSeatSecondaryForce = << 0.0, -2.5, 1.0 >>
VECTOR vMeltdownScenePosition = << -1130.828, -451.637, 34.620 >>
VECTOR vMeltdownSceneRotation = << 1.000, -0.000, -128.000 >>
VECTOR vEjectorSeatPtfxOffset = << 0.0, -0.4, 0.75 >>
VECTOR vEjectorSeatPtfxRotation = << 0.0, 0.0, 0.0 >>
TEXT_LABEL sLabelDCAR = "CAR4_DCAR"
TEXT_LABEL sLabelGENGETIN = "CMN_GENGETIN"
TEXT_LABEL sLabelGENGETBCK = "CMN_GENGETBCK"
STRING SECURITY1VOICENAME = "A_M_M_GENERICMALE_01_WHITE_MINI_01"
STRING SECURITY2VOICENAME = "A_M_M_GENERICMALE_01_WHITE_MINI_02"
STRING SECURITY3VOICENAME = "A_M_M_GENERICMALE_01_WHITE_MINI_03"
STRING SECURITY4VOICENAME = "A_M_M_GENERICMALE_01_WHITE_MINI_04"
///used for reading bits from INT g_iCarSteal3AgentBitSet from gta5/script/dev/singleplayer/include/globals/mission_globals.sch
CONST_INT PLAYER_GOT_TUXEDO 0
CONST_INT ACTOR_KILLED 1
CONST_INT ACTOR_STEALTH_KILLED 2
CONST_INT ACTOR_IGNORED 3
CONST_INT ACTRESS_FLED_CAR 4
//|======================================= VARIABLES =====================================|
MISSION_STAGES eMissionStage = MISSION_STAGE_GET_TO_ACTOR
MISSION_FAILS eMissionFail = MISSION_FAIL_EMPTY
//relationship groups
REL_GROUP_HASH rgFilmCrew
//mission peds
PED_STRUCT psActor
PED_STRUCT psDevin
PED_STRUCT psToilet
PED_STRUCT psActress
PED_STRUCT psAssistant
//mission vehicles
VEH_STRUCT vsPlayersCar
//mission objects
OBJECT_STRUCT osPropLamp
OBJECT_STRUCT osPropChair
OBJECT_STRUCT osTrailerDoor
OBJECT_STRUCT osPropToilet
OBJECT_STRUCT osPropClipboard
OBJECT_STRUCT osPropGreenScreen
OBJECT_STRUCT osPropCamera
OBJECT_STRUCT osPropMicrophone
//player's mission location
LOCATION_STRUCT sMissionPosition
//locates header data
LOCATES_HEADER_DATA sLocatesData
JB700_GADGET_DATA CarGadgetData
//conversation struct
structPedsForConversation CST4Conversation
BLIP_INDEX DestinationBlip
//progress counters and flags for loading, skipping and replays
INT iStageSetupProgress
INT iMissionStageProgress
BOOL bSkipFlag
BOOL bReplayFlag
BOOL bLoadingFinishedFlag
INT iModelsRequested
INT iAnimationsRequested
BOOL bEndCallMessy
BOOL bCutsceneSkipped
BOOL bSecurityAlerted
BOOL bSpawnActorSecurity
BOOL bDoorBargePlayed
BOOL bDoorBargeInterrupted
BOOL bRepositionActor
BOOL bRepositionAssistant
BOOL bPlayerWearingTuxedo
BOOL bAlienWalkDisrupted
BOOL bActorSceneDisrupted
BOOL bMeltdownSceneDisrupted
BOOL bMeltdownSceneWalkedInto
BOOL bFilmCrewGripAlerted
BOOL bDirectorSceneDisrupted //has player disrupted the director and grip animations at film set
BOOL bPlayerInsideFilmStudio
BOOL bPlayerEnteredTargetVehicle
BOOL bHasOutfitChangedBeforeMission //variable for storing the state of player has changed outfit
BOOL bFilmStudioAmbientPedsBlocked
BOOL CST4_DSC_TRIGGERED
BOOL CST4_DSG_TRIGGERED
BOOL CST4_DSW_TRIGGERED
BOOL CST4_DSG_PLAYING_TRIGGERED
BOOL CST4_DBRAN_1_TRIGGERED
BOOL CST4_DBRAN_2_TRIGGERED
BOOL CST4_DBRAN_3_TRIGGERED
BOOL CST4_DBRAN_4_TRIGGERED
BOOL CST4_DBRAN_5_TRIGGERED
BOOL CST4_DSCAR_TRIGGERED
BOOL CST4_DSSET1_TRIGGERED
BOOL CST4_DSSET2_TRIGGERED
BOOL CST4_DCHAT1_TRIGGERED
BOOL CST4_DCHAT2_TRIGGERED
FLOAT fDistanceFromPlayerToTargetVehicle
INT iFilmCrewProgress
//INT iAlienSceneProgress
INT iDeadActorProgress
INT iToiletSceneProgress
INT iMeltdownSceneProgress
INT iMeltdownDialogueProgress
INT iWalkingAliensProgress
INT iSetSecurityProgress
INT iSetSecurityAlertTimer
INT iGateSecurityProgress
INT iActorSecurityProgress
INT iMeltdownSecurityProgress
INT iDirectorAndGripProgress
INT iDirectorFleeShoutsCounter
INT iDirectorFranklinShoutsCounter
BOOL bChaseStarted
BOOL bChaseFinished
BOOL bChaseInProgress
INT iSecurityChaseProgress
INT iSecurityChaseDelayTimer
BOOL bSecurityInVehiclesAllowed
BOOL bStartSecurityChaseTimerDelay
VECTOR vClosestRoadNode
FLOAT fClosestRoadNodeHeading
INT iLeadInProgress
BOOL bLeadInTriggered
BOOL bSpikesAllowed
BOOL bSpikesUnlocked
INT iSpikesDelayTime
INT iSpikesDelayTimer
INT iCarStoppedTimer
//BOOL bEndPhoneCallFinished
INT iPhoneCallToDevinDelayTimer
INT iPlayerLethalKills
INT iPlayerStealthKills
INT iPlayerTakedownKills
INT iTotalSpikeHits
INT iSecurityCarsImmobilized
INT iSuccessfullSpikesHits
BOOL bCarSecurityAggressive
BOOL bActressEjected
BOOL bEjectorSeatActive
BOOL bEjectorSeatAllowed
INT iEjectorSeatTimer
INT iEjectorSeatProgress
INT iSteerBiasTimer
FLOAT fSteerBiasValue
BOOL bSteerBiasActive
BOOL bRandomConversationsAllowed
INT iActressShootConversationCounter
INT iActressSecurityConversationCounter
BOOL bMusicEventMissionStartTriggered
BOOL bMusicEventTrailerTriggered
BOOL bMusicEventDropTriggered
BOOL bMusicEventDeliverTriggered
BOOL bMusicEventSetAlertTriggered
INT iEjectSceneID = -1
INT iCarTrackedPoint = -1
INT iActorTrackedPoint = -1
INT iMeltdownSceneID = -1
INT iDeadActorSceneID = -1
INT iEjectorScreamSoundID
STRING sDirectorAnimName
WEAPON_TYPE ActorCauseOfDeathWeapon
SCENARIO_BLOCKING_INDEX ScenarioBlockingArea1
SCENARIO_BLOCKING_INDEX ScenarioBlockingArea2
BOOL bInteriorLoadSceneLoaded
BOOL bReplayRecordBackFortimeTriggered
//|========================================= ARRAYS ======================================|
BOOL FailFlags[MAX_MISSION_FAILS]
MODEL_NAMES MissionModels[MAX_MODELS]
STRING MissionAnimations[MAX_ANIMATIONS]
PED_STRUCT psAliens[2]
PED_STRUCT psSetSecurity[5]
PED_STRUCT psCarSecurity[2]
PED_STRUCT psActorSecurity[3]
PED_STRUCT psMeltdownSecurity[1]
PED_STRUCT psNorthGateSecurity[1]
PED_STRUCT psSouthGateSecurity[1]
PED_STRUCT psFilmCrew[MAX_FILM_CREW_PEDS]
PED_STRUCT psMeltdownCrew[5]
VEH_STRUCT vsSecurityCars[2]
BOOL SecuritySpawned[8]
LOCATION_STRUCT SecuritySpawnPoints[8]
INT iNumTextHashesStored
INT iTriggeredTextHashes[50]
STRING EndCallCleanRoots[9]
STRING EndCallCleanLines[9]
STRING EndCallMessyRoots[12]
STRING EndCallMessyLines[12]
//|========================= MISCELLANEOUS PROCEDURES & FUNCTIONS ========================|
/// PURPOSE:
/// Resets all mission flags and progress counters to their default values.
PROC RESET_MISSION_FLAGS()
//reset setup progress to 1, so that iSetupProgress = 0 only runs once, on initial mission load.
iStageSetupProgress = 1
iMissionStageProgress = 0
bEndCallMessy = FALSE
bCutsceneSkipped = FALSE
bDoorBargePlayed = FALSE
bDoorBargeInterrupted = FALSE
bPlayerWearingTuxedo = FALSE
bAlienWalkDisrupted = FALSE
bActorSceneDisrupted = FALSE
bFilmCrewGripAlerted = FALSE
bMeltdownSceneDisrupted = FALSE
bMeltdownSceneWalkedInto = FALSE
bDirectorSceneDisrupted = FALSE
psActor.iProgress = 0
iFilmCrewProgress = 0
//iAlienSceneProgress = 0
iDeadActorProgress = 0
iToiletSceneProgress = 0
iWalkingAliensProgress = 0
iMeltdownSceneProgress = 0
iMeltdownDialogueProgress = 0
iSetSecurityProgress = 0
iSetSecurityAlertTimer = 0
iGateSecurityProgress = 0
iActorSecurityProgress = 0
iMeltdownSecurityProgress = 0
iDirectorAndGripProgress = 0
bChaseStarted = FALSE
bChaseFinished = FALSE
bChaseInProgress = FALSE
iLeadInProgress = 0
bLeadInTriggered = FALSE
bSpikesAllowed = FALSE
bSpikesUnlocked = FALSE
iSpikesDelayTime = 0
iSpikesDelayTimer = 0
iCarStoppedTimer = 0
iTotalSpikeHits = 0
iSecurityCarsImmobilized = 0
iSuccessfullSpikesHits = 0
bRepositionActor = FALSE
bRepositionAssistant = FALSE
bSpawnActorSecurity = FALSE
bActressEjected = FALSE
bEjectorSeatActive = FALSE
bEjectorSeatAllowed = FALSE
iEjectorSeatTimer = 0
iEjectorSeatProgress = 0
iSteerBiasTimer = 0
fSteerBiasValue = 0.0
bSteerBiasActive = FALSE
iSecurityChaseProgress = 0
iSecurityChaseDelayTimer = 0
bSecurityInVehiclesAllowed = FALSE
bStartSecurityChaseTimerDelay = FALSE
// bEndPhoneCallFinished = FALSE
iPhoneCallToDevinDelayTimer = 0
iActressShootConversationCounter = 0
iActressSecurityConversationCounter = 0
bMusicEventMissionStartTriggered = FALSE
bMusicEventTrailerTriggered = FALSE
bMusicEventDropTriggered = FALSE
bMusicEventDeliverTriggered = FALSE
bMusicEventSetAlertTriggered = FALSE
bInteriorLoadSceneLoaded = FALSE
bReplayRecordBackFortimeTriggered = 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 bValue)
INT i = 0
FOR i = 0 TO ( COUNT_OF(FailFlags) - 1 )
FailFlags[i] = bValue
ENDFOR
ENDPROC
PROC KEEP_GARAGE_DOOR_SHUT()
UNREGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_HAYES_GARAGE, PLAYER_PED_ID())
IF IS_DOOR_REGISTERED_WITH_SYSTEM(g_sAutoDoorData[ENUM_TO_INT(AUTODOOR_HAYES_GARAGE)].doorID )
g_sAutoDoorData[AUTODOOR_HAYES_GARAGE].currentOpenRatio = 0.0
DOOR_SYSTEM_SET_OPEN_RATIO(g_sAutoDoorData[ENUM_TO_INT(AUTODOOR_HAYES_GARAGE)].doorID, g_sAutoDoorData[AUTODOOR_HAYES_GARAGE].currentOpenRatio, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(g_sAutoDoorData[ENUM_TO_INT(AUTODOOR_HAYES_GARAGE)].doorID, DOORSTATE_FORCE_LOCKED_THIS_FRAME, FALSE, TRUE)
ENDIF
ENDPROC
PROC REGISTER_STUDIO_GATES()
//register side gate left
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_L))
ADD_DOOR_TO_SYSTEM(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_L), PROP_BH1_03_GATE_L, <<-965.1991, -504.0431, 37.9792>>, FALSE, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding door DOORHASH_STUDIO_SIDE_GATE_L with int ", ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_L), " to system.")
#ENDIF
ENDIF
//register side gate right
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_R))
ADD_DOOR_TO_SYSTEM(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_R), PROP_BH1_03_GATE_R, <<-962.2961, -509.5990, 37.9779>>, FALSE, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding door DOORHASH_STUDIO_SIDE_GATE_R with int ", ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_R), " to system.")
#ENDIF
ENDIF
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_GARAGE_FRONT))
ADD_DOOR_TO_SYSTEM(ENUM_TO_INT(DOORHASH_GARAGE_FRONT), PROP_SC1_06_GATE_R, <<500.1759, -1320.5450, 28.2499>>)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding door DOORHASH_GARAGE_FRONT with int ", ENUM_TO_INT(DOORHASH_GARAGE_FRONT), " to system.")
#ENDIF
ENDIF
ENDPROC
PROC UNREGISTER_STUDIO_GATES()
//unregister side gate left
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_L))
REMOVE_DOOR_FROM_SYSTEM(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_L))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing door DOORHASH_STUDIO_SIDE_GATE_L with int ", ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_L), " from system.")
#ENDIF
ENDIF
//unregister side gate right
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_R))
REMOVE_DOOR_FROM_SYSTEM(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_R))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing door DOORHASH_STUDIO_SIDE_GATE_R with int ", ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_R), " from system.")
#ENDIF
ENDIF
//unregister garage main front gate
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_GARAGE_FRONT))
REMOVE_DOOR_FROM_SYSTEM(ENUM_TO_INT(DOORHASH_GARAGE_FRONT))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing door DOORHASH_GARAGE_FRONT with int ", ENUM_TO_INT(DOORHASH_GARAGE_FRONT), " from system.")
#ENDIF
ENDIF
ENDPROC
PROC LOCK_STUDIO_GATES()
//lock north gate barrier leading out
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_STUDIO_NORTH_GATE_OUT))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_STUDIO_NORTH_GATE_OUT), 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_STUDIO_NORTH_GATE_OUT), DOORSTATE_LOCKED, FALSE, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Locking door DOORHASH_STUDIO_NORTH_GATE_OUT with int ", ENUM_TO_INT(DOORHASH_STUDIO_NORTH_GATE_OUT), ".")
#ENDIF
ENDIF
//lock north gate barrier leading in
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_STUDIO_NORTH_GATE_IN))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_STUDIO_NORTH_GATE_IN), 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_STUDIO_NORTH_GATE_IN), DOORSTATE_LOCKED, FALSE, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Locking door DOORHASH_STUDIO_NORTH_GATE_IN with int ", ENUM_TO_INT(DOORHASH_STUDIO_NORTH_GATE_IN), ".")
#ENDIF
ENDIF
//lock side gate left
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_L))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_L), 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_L), DOORSTATE_LOCKED, FALSE, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Locking door DOORHASH_STUDIO_SIDE_GATE_L with int ", ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_L), ".")
#ENDIF
ENDIF
//lock side gate right
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_R))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_R), 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_R), DOORSTATE_LOCKED, FALSE, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Locking door DOORHASH_STUDIO_SIDE_GATE_R with int ", ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_R), ".")
#ENDIF
ENDIF
ENDPROC
PROC UNLOCK_STUDIO_GATES()
//unlock north gate barrier leading out
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_STUDIO_NORTH_GATE_OUT))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_STUDIO_NORTH_GATE_OUT), 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_STUDIO_NORTH_GATE_OUT), DOORSTATE_UNLOCKED, FALSE, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Unlocking door DOORHASH_STUDIO_NORTH_GATE_OUT with int ", ENUM_TO_INT(DOORHASH_STUDIO_NORTH_GATE_OUT), ".")
#ENDIF
ENDIF
//unlock north gate barrier leading in
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_STUDIO_NORTH_GATE_IN))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_STUDIO_NORTH_GATE_IN), 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_STUDIO_NORTH_GATE_IN), DOORSTATE_UNLOCKED, FALSE, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Unlocking door DOORHASH_STUDIO_NORTH_GATE_IN with int ", ENUM_TO_INT(DOORHASH_STUDIO_NORTH_GATE_IN), ".")
#ENDIF
ENDIF
//unlock side gate left
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_L))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_L), 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_L), DOORSTATE_UNLOCKED, FALSE, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Unlocking door DOORHASH_STUDIO_SIDE_GATE_L with int ", ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_L), ".")
#ENDIF
ENDIF
//unlock side gate right
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_R))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_R), 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_R), DOORSTATE_UNLOCKED, FALSE, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Unlocking door DOORHASH_STUDIO_SIDE_GATE_R with int ", ENUM_TO_INT(DOORHASH_STUDIO_SIDE_GATE_R), ".")
#ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Warps specified ped to new coordinates and sets specified ped's new heading.
/// PARAMS:
/// ped - PED_INDEX to warp.
/// vNewPosition - VECTOR coordinates specifying new ped's position.
/// fNewHeading - FLOAT specifying new ped's heading.
/// bKeepVehicle - Specifies if ped should keep vehicle they are currently in.
/// bResetGameplayCamera - Specifies if gameplay camera should be positioned behind player's back. Works only for PLAYER_PED_ID().
/// bLoadScene - Specifies if scene at new provided coordinates should be loaded. Works only for PLAYER_PED_ID().
PROC WARP_PED(PED_INDEX ped, VECTOR vNewPosition, FLOAT fNewHeading, BOOL bKeepVehicle, BOOL bResetGameplayCamera, BOOL bLoadScene)
IF NOT IS_PED_INJURED(ped)
IF ( bKeepVehicle = TRUE )
SET_PED_COORDS_KEEP_VEHICLE(ped, vNewPosition)
ELIF ( bKeepVehicle = FALSE )
SET_ENTITY_COORDS(ped, vNewPosition)
ENDIF
SET_ENTITY_HEADING(ped, fNewHeading)
IF ( ped = PLAYER_PED_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Warping player ped to coordinates ", vNewPosition, " and heading ", fNewHeading, ".")
#ENDIF
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_CLOTH_PIN_FRAMES(PLAYER_ID(), 1)
ENDIF
IF ( bResetGameplayCamera = TRUE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
ENDIF
IF ( bLoadScene = TRUE )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling LOAD_SCENE() at coordinates ", vNewPosition, ". This might take a while to load.")
#ENDIF
LOAD_SCENE(vNewPosition)
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_PED_DRIVING_VEHICLE(PED_INDEX PedIndex, VEHICLE_INDEX VehicleIndex)
IF NOT IS_PED_INJURED(PedIndex)
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
IF IS_PED_SITTING_IN_VEHICLE(PedIndex, VehicleIndex)
IF NOT IS_VEHICLE_STOPPED(VehicleIndex)
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC SET_PLAYER_PED_OUTFIT_TO_TUXEDO(BOOL bSetTuxedo)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF ( bSetTuxedo = TRUE )
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_WHITE_TUXEDO, FALSE)
SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN) //set that the player has changed clothes on mission
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting player ped outfit to OUTFIT_P1_WHITE_TUXEDO.")
#ENDIF
CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED_ID())
RESET_PED_VISIBLE_DAMAGE(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing player ped blood damage and visible damage.")
#ENDIF
ELIF ( bSetTuxedo = FALSE )
IF NOT IS_REPEAT_PLAY_ACTIVE()
RESTORE_MISSION_START_OUTFIT()
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN, bHasOutfitChangedBeforeMission) //reset that the player has changed outfit on mission to how it was at the start of the mission
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Restoring player ped mission start outfit.")
#ENDIF
ELSE
IF IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_WHITE_TUXEDO)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player current outfit is OUTFIT_P1_WHITE_TUXEDO on repeat play.")
#ENDIF
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_DEFAULT, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting player ped outfit to OUTFIT_P1_DEFAULT.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC CREATE_PED_NON_CREATION_AREA(VECTOR vPosition, VECTOR vSize)
SET_PED_NON_CREATION_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 >>)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating ped non creation area at coords ", vPosition, " with size ", vSize, ".")
#ENDIF
ENDPROC
FUNC SCENARIO_BLOCKING_INDEX CREATE_SCENARIO_BLOCKING_AREA(VECTOR vPosition, VECTOR vSize)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating scenario blocking area at coords ", vPosition, " with size ", vSize, ".")
#ENDIF
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
FUNC BOOL IS_ENTITY_IN_FILM_STUDIO(ENTITY_INDEX EntityIndex)
IF DOES_ENTITY_EXIST(EntityIndex)
IF NOT IS_ENTITY_DEAD(EntityIndex)
IF IS_ENTITY_IN_ANGLED_AREA(EntityIndex, <<-1205.642822,-531.999146,25.343176>>, <<-1074.152588,-462.691223,67.819405>>, 102.000000)
OR IS_ENTITY_IN_ANGLED_AREA(EntityIndex, <<-1200.559082,-581.003723,25.353422>>, <<-1072.527832,-462.328857,67.838409>>, 104.000000)
OR IS_ENTITY_IN_ANGLED_AREA(EntityIndex, <<-1242.769531,-537.128479,26.775068>>, <<-1177.131470,-481.667603,67.787155>>, 82.000000)
OR IS_ENTITY_IN_ANGLED_AREA(EntityIndex, <<-1182.017822,-463.759888,29.759914>>, <<-1220.528931,-491.323792,67.660599>>, 58.000000)
OR IS_ENTITY_IN_ANGLED_AREA(EntityIndex, <<-1040.278931,-524.405273,34.038719>>, <<-973.457825,-488.391327,68.321289>>, 54.000000)
OR IS_ENTITY_IN_ANGLED_AREA(EntityIndex, <<-1063.079834,-546.856323,33.529106>>, <<-1045.254883,-485.873199,68.180908>>, 55.000000)
OR IS_ENTITY_IN_ANGLED_AREA(EntityIndex, <<-1182.097900,-587.645691,25.248831>>, <<-1004.804077,-489.698608,71.056602>>, 32.000000)
OR IS_ENTITY_IN_ANGLED_AREA(EntityIndex, <<-1070.755127,-551.146790,32.089046>>, <<-1027.902588,-536.425659,67.631119>>, 28.000000)
OR IS_ENTITY_IN_ANGLED_AREA(EntityIndex, <<-1093.414185,-560.927551,31.959763>>, <<-1070.760376,-551.153198,67.088013>>, 28.000000)
OR IS_ENTITY_IN_ANGLED_AREA(EntityIndex, <<-1155.982300,-594.167358,25.453455>>, <<-1093.336792,-560.974243,66.957108>>, 28.000000)
OR IS_ENTITY_IN_ANGLED_AREA(EntityIndex, <<-1118.298340,-439.908905,34.260933>>, <<-1141.630127,-442.671783,67.496567>>, 29.000000)
OR IS_ENTITY_IN_ANGLED_AREA(EntityIndex, <<-996.248474,-533.809570,34.814335>>, <<-1021.386475,-504.800110,67.985336>>, 22.000000)
OR IS_ENTITY_IN_ANGLED_AREA(EntityIndex, <<-1014.585815,-545.387634,33.798470>>, <<-1039.673828,-487.312805,68.180908>>, 22.000000)
OR IS_ENTITY_IN_ANGLED_AREA(EntityIndex, <<-1030.172974,-483.188324,35.181511>>, <<-1017.088745,-507.492035,68.150673>>, 20.000000)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC RUN_INTERIOR_PINNING_AND_UNPINNING_CHECK(VECTOR vInteriorCoords, FLOAT fRadius)
IF ( GET_DISTANCE_BETWEEN_COORDS(vInteriorCoords, GET_ENTITY_COORDS(PLAYER_PED_ID()), TRUE) > fRadius )
//unpin the interior if it is pinned and player is away from it
IF IS_INTERIOR_READY(GET_INTERIOR_AT_COORDS(vInteriorCoords))
UNPIN_INTERIOR(GET_INTERIOR_AT_COORDS(vInteriorCoords))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Unpinning interior at coordinates ", vInteriorCoords, " in memory.")
#ENDIF
ENDIF
ELSE
//unpin the interior if it is pinned and player is away from it
IF NOT IS_INTERIOR_READY(GET_INTERIOR_AT_COORDS(vInteriorCoords))
PIN_INTERIOR_IN_MEMORY(GET_INTERIOR_AT_COORDS(vInteriorCoords))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Pinning interior at coordinates ", vInteriorCoords, " in memory.")
#ENDIF
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
PROC CLEANUP_OBJECT(OBJECT_INDEX &ObjectIndex, BOOL bDelete = FALSE, BOOL bUnfreezeObjectOnCleanup = TRUE)
IF DOES_ENTITY_EXIST(ObjectIndex)
IF IS_ENTITY_ATTACHED(ObjectIndex)
IF IS_SCREEN_FADED_OUT()
DETACH_ENTITY(ObjectIndex)
ENDIF
ENDIF
IF bUnfreezeObjectOnCleanup = TRUE
FREEZE_ENTITY_POSITION(ObjectIndex, FALSE)
ENDIF
IF ( bDelete = TRUE )
DELETE_OBJECT(ObjectIndex)
ELSE
SET_OBJECT_AS_NO_LONGER_NEEDED(ObjectIndex)
ENDIF
ENDIF
ENDPROC
PROC CLEANUP_PED(PED_STRUCT &ped, BOOL bDelete = FALSE, BOOL bDeathOnly = TRUE, BOOL bKeepTask = TRUE)
IF ( bDelete = FALSE )
IF DOES_ENTITY_EXIST(ped.PedIndex)
IF ( bDeathOnly = TRUE )
IF IS_PED_INJURED(ped.PedIndex)
IF IS_ENTITY_DEAD(ped.PedIndex)
REMOVE_PED_DEFENSIVE_AREA(ped.PedIndex)
ENDIF
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
ENDIF
ELIF ( bDeathOnly = FALSE )
IF NOT IS_PED_INJURED(ped.PedIndex)
SET_PED_KEEP_TASK(ped.PedIndex, bKeepTask)
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
ENDIF
ENDIF
ENDIF
ELIF ( bDelete = TRUE )
IF DOES_ENTITY_EXIST(ped.PedIndex)
IF IS_PED_INJURED(ped.PedIndex)
OR NOT IS_PED_INJURED(ped.PedIndex)
IF IS_ENTITY_DEAD(ped.PedIndex)
OR NOT IS_ENTITY_DEAD(ped.PedIndex)
REMOVE_PED_DEFENSIVE_AREA(ped.PedIndex)
ENDIF
DELETE_PED(ped.PedIndex)
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
ENDIF
ENDIF
ped.iTimer = 0
ped.iProgress = 0
ped.iCleanupAttempts = 0
ped.bHasTask = FALSE
ped.bCanSeeTargetPed = FALSE
ped.eState = PED_STATE_IDLE
ped.eCleanupReason = PED_CLEANUP_NO_CLEANUP
ENDIF
ENDPROC
PROC CLEANUP_PED_GROUP(PED_STRUCT &array[], BOOL bDelete = FALSE, BOOL bDeathOnly = TRUE, BOOL bKeepTask = TRUE)
INT i = 0
FOR i = 0 TO ( COUNT_OF(array) - 1 )
CLEANUP_PED(array[i], bDelete, bDeathOnly, bKeepTask)
ENDFOR
ENDPROC
FUNC PED_CLEANUP_REASONS GET_PED_CLEANUP_REASON(PED_STRUCT &ped)
IF DOES_ENTITY_EXIST(ped.PedIndex)
IF IS_ENTITY_DEAD(ped.PedIndex)
ENTITY_INDEX SourceOfDeathEntity
SourceOfDeathEntity = GET_PED_SOURCE_OF_DEATH(ped.PedIndex)
IF DOES_ENTITY_EXIST(SourceOfDeathEntity)
IF IS_ENTITY_A_PED(SourceOfDeathEntity)
PED_INDEX SourceOfDeathPed
SourceOfDeathPed = GET_PED_INDEX_FROM_ENTITY_INDEX(SourceOfDeathEntity)
IF ( SourceOfDeathPed = PLAYER_PED_ID() )
IF WAS_PED_KILLED_BY_STEALTH(ped.PedIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " cleaned up with reason PED_CLEANUP_KILLED_BY_PLAYER_STEALTH.")
#ENDIF
RETURN PED_CLEANUP_KILLED_BY_PLAYER_STEALTH
ELIF WAS_PED_KILLED_BY_TAKEDOWN(ped.PedIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " cleaned up with reason PED_CLEANUP_KILLED_BY_PLAYER_TAKEDOWN.")
#ENDIF
RETURN PED_CLEANUP_KILLED_BY_PLAYER_TAKEDOWN
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " cleaned up with reason PED_CLEANUP_KILLED_BY_PLAYER_LETHAL.")
#ENDIF
RETURN PED_CLEANUP_KILLED_BY_PLAYER_LETHAL
ENDIF
ENDIF
ELIF IS_ENTITY_A_VEHICLE(SourceOfDeathEntity)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " cleaned up with reason PED_CLEANUP_KILLED_BY_PLAYER_VEHICLE.")
#ENDIF
RETURN PED_CLEANUP_KILLED_BY_PLAYER_VEHICLE
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " cleaned up with reason PED_CLEANUP_LOST.")
#ENDIF
RETURN PED_CLEANUP_LOST
ENDIF
ELSE
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(ped.PedIndex, WEAPONTYPE_STUNGUN)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " was killed with weapon ", GET_WEAPON_NAME(WEAPONTYPE_STUNGUN), ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " cleaned up with reason PED_CLEANUP_KILLED_BY_PLAYER_STEALTH.")
#ENDIF
RETURN PED_CLEANUP_KILLED_BY_PLAYER_STEALTH
ENDIF
ped.iCleanupAttempts++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " source of death does not exist.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " had ", ped.iCleanupAttempts, " cleanup attempts .")
#ENDIF
IF ( ped.iCleanupAttempts = 10 )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " cleaned up with reason PED_CLEANUP_LOST due to cleanup attempts running out.")
#ENDIF
RETURN PED_CLEANUP_LOST
ENDIF
ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " cleaned up with reason PED_CLEANUP_NO_CLEANUP.")
#ENDIF
RETURN PED_CLEANUP_NO_CLEANUP
ENDFUNC
PROC CLEANUP_VEHICLE(VEH_STRUCT &vehicle, BOOL bDelete = FALSE, BOOL bDeathOnly = TRUE)
IF ( bDelete = FALSE )
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF ( bDeathOnly = TRUE )
IF NOT IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
OR IS_ENTITY_DEAD(vehicle.VehicleIndex)
REMOVE_VEHICLE_STUCK_CHECK(vehicle.VehicleIndex)
REMOVE_VEHICLE_UPSIDEDOWN_CHECK(vehicle.VehicleIndex)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vehicle.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
ENDIF
IF DOES_BLIP_EXIST(vehicle.BlipIndex)
REMOVE_BLIP(vehicle.BlipIndex)
ENDIF
ELIF ( bDeathOnly = FALSE )
IF NOT IS_ENTITY_DEAD(vehicle.VehicleIndex)
REMOVE_VEHICLE_STUCK_CHECK(vehicle.VehicleIndex)
REMOVE_VEHICLE_UPSIDEDOWN_CHECK(vehicle.VehicleIndex)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vehicle.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
ENDIF
IF DOES_BLIP_EXIST(vehicle.BlipIndex)
REMOVE_BLIP(vehicle.BlipIndex)
ENDIF
ENDIF
ENDIF
ELIF ( bDelete = TRUE )
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF IS_ENTITY_A_MISSION_ENTITY(vehicle.VehicleIndex)
IF IS_ENTITY_DEAD(vehicle.VehicleIndex)
OR NOT IS_ENTITY_DEAD(vehicle.VehicleIndex)
REMOVE_VEHICLE_STUCK_CHECK(vehicle.VehicleIndex)
REMOVE_VEHICLE_UPSIDEDOWN_CHECK(vehicle.VehicleIndex)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vehicle.VehicleIndex)
DELETE_VEHICLE(vehicle.VehicleIndex)
ENDIF
ENDIF
ENDIF
IF DOES_BLIP_EXIST(vehicle.BlipIndex)
REMOVE_BLIP(vehicle.BlipIndex)
ENDIF
vehicle.iProgress = 0
vehicle.bImmobilized = FALSE
vehicle.bAutoDriveActive = FALSE
vehicle.bLineOfSightToTarget = FALSE
ENDIF
ENDPROC
PROC CLEANUP_VEHICLE_GROUP(VEH_STRUCT &vsArray[], BOOL bDelete = FALSE, BOOL bDeathOnly = TRUE)
INT i = 0
FOR i = 0 TO ( COUNT_OF(vsArray) - 1 )
CLEANUP_VEHICLE(vsArray[i], bDelete, bDeathOnly)
ENDFOR
ENDPROC
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
/// 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.
/// RETURNS:
/// TRUE if the specified cutscene has loaded, FALSE if otherwise.
FUNC BOOL HAS_REQUESTED_CUTSCENE_LOADED(STRING sSceneName)
//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()
IF NOT HAS_THIS_CUTSCENE_LOADED(sSceneName)
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
ENDIF
#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
ENDIF
RETURN FALSE
ENDFUNC
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, " FALSE.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": SET_LABEL_AS_TRIGGERED(): ", iNumTextHashesStored, "/", COUNT_OF(iTriggeredTextHashes), ".")
#ENDIF
ENDIF
ENDIF
ENDPROC
PROC CLEAR_TRIGGERED_LABELS()
INT iArraySize = COUNT_OF(iTriggeredTextHashes)
INT i = 0
REPEAT iArraySize i
iTriggeredTextHashes[i] = 0
ENDREPEAT
iNumTextHashesStored = 0
ENDPROC
PROC UPDATE_TRIGGERED_LABEL(TEXT_LABEL &sLabel)
IF NOT IS_STRING_NULL_OR_EMPTY(sLabel) //if the label is not empty, which means not yet printed by locates header
IF NOT HAS_LABEL_BEEN_TRIGGERED(sLabel) //if it was not set as triggered by script
IF IS_THIS_PRINT_BEING_DISPLAYED(sLabel) //if the label was displayed on screen
SET_LABEL_AS_TRIGGERED(sLabel, TRUE) //mark it as triggered
ENDIF
ELSE //if the label was set as triggered by script,
//which means it was printed by locates header
IF NOT IS_THIS_PRINT_BEING_DISPLAYED(sLabel) //but is not currently being printed, cleared off screen or timed out
sLabel = "" //mark is as empty
ENDIF
ENDIF
ENDIF
ENDPROC
PROC PRINT_GOD_TEXT_ADVANCED(STRING sLabel, INT iDuration = DEFAULT_GOD_TEXT_TIME, BOOL bOnce = TRUE)
IF NOT HAS_LABEL_BEEN_TRIGGERED(sLabel)
PRINT(sLabel, iDuration, 1)
SET_LABEL_AS_TRIGGERED(sLabel, bOnce)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Printing god text ", sLabel, ".")
#ENDIF
ENDIF
ENDPROC
PROC PRINT_HELP_ADVANCED(STRING pTextLabel, BOOL bDisplayForever = FALSE, BOOL bPlaySound = TRUE, INT iDuration = DEFAULT_HELP_TEXT_TIME, BOOL bSetLabelAsTriggered = TRUE)
BEGIN_TEXT_COMMAND_DISPLAY_HELP(pTextLabel)
END_TEXT_COMMAND_DISPLAY_HELP(HELP_TEXT_SLOT_STANDARD, bDisplayForever, bPlaySound, iDuration)
SET_LABEL_AS_TRIGGERED(pTextLabel, bSetLabelAsTriggered)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Printing help text ", pTextLabel, ".")
#ENDIF
ENDPROC
/// PURPOSE:
/// Check is the specified time has passed using specified timer.
/// PARAMS:
/// iTimeAmount - Time to check.
/// iTimer - Timer to use.
/// RETURNS:
/// True is the specified amount of time has passed for the specified timer.
FUNC BOOL HAS_TIME_PASSED(INT iTimeAmount, INT iTimer)
INT iCurrentTime
INT iTimeDifference
iCurrentTime = GET_GAME_TIMER()
iTimeDifference = iCurrentTime - iTimeAmount
IF iTimeDifference > iTimer
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Returns 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_CUTSCENE_END
RETURN MISSION_STAGE_CUTSCENE_END
ENDIF
MISSION_STAGES eNextStage
INT iNextStage = ENUM_TO_INT(eStage) + 1
eNextStage = INT_TO_ENUM(MISSION_STAGES, iNextStage)
RETURN eNextStage
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()
//check mission car for being destroyed, undriveable, abandoned or lost
IF DOES_ENTITY_EXIST(vsPlayersCar.VehicleIndex)
IF ( FailFlags[MISSION_FAIL_CAR_UNDRIVABLE] = TRUE )
IF IS_VEHICLE_PERMANENTLY_STUCK(vsPlayersCar.VehicleIndex)
eFail = MISSION_FAIL_CAR_UNDRIVABLE
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_CAR_DEAD] = TRUE )
IF NOT IS_VEHICLE_DRIVEABLE(vsPlayersCar.VehicleIndex)
OR IS_ENTITY_ON_FIRE(vsPlayersCar.VehicleIndex)
eFail = MISSION_FAIL_CAR_DEAD
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_STUDIO_LEFT_BEHIND] = TRUE )
IF ( bPlayerInsideFilmStudio = FALSE )
IF fDistanceFromPlayerToTargetVehicle > ABANDON_STUDIO_FAIL_RANGE
eFail = MISSION_FAIL_CAR_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_CAR_LEFT_BEHIND] = TRUE )
IF IS_VEHICLE_DRIVEABLE(vsPlayersCar.VehicleIndex)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsPlayersCar.VehicleIndex)
IF ( bPlayerInsideFilmStudio = FALSE )
IF fDistanceFromPlayerToTargetVehicle > ABANDON_VEHICLE_FAIL_RANGE
eFail = MISSION_FAIL_CAR_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_SECURITY_AT_GARAGE] = TRUE )
IF IS_VEHICLE_DRIVEABLE(vsPlayersCar.VehicleIndex)
IF ( bChaseInProgress = TRUE AND bChaseFinished = FALSE )
IF IS_ENTITY_AT_COORD(vsPlayersCar.VehicleIndex, vInteriorPosition, << 20.0, 16.0, 3.0 >>)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vInteriorPosition, << 20.0, 16.0, 3.0 >>)
PED_INDEX PedIndex
PedIndex = GET_PED_CLOSEST_PED_FROM_RELATIONSHIP_GROUP(PLAYER_PED_ID(), RELGROUPHASH_SECURITY_GUARD, 0, FALSE)
IF DOES_ENTITY_EXIST(PedIndex)
IF NOT IS_ENTITY_DEAD(PedIndex)
IF IS_ENTITY_AT_COORD(PedIndex, vInteriorPosition, << 20.0, 16.0, 3.0 >>)
eFail = MISSION_FAIL_SECURITY_AT_GARAGE
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_ACTRESS_AT_GARAGE] = TRUE )
IF DOES_ENTITY_EXIST(psActress.PedIndex)
IF NOT IS_PED_INJURED(psActress.PedIndex)
IF IS_VEHICLE_DRIVEABLE(vsPlayersCar.VehicleIndex)
IF IS_PED_IN_VEHICLE(psActress.PedIndex, vsPlayersCar.VehicleIndex)
IF IS_ENTITY_AT_COORD(psActress.PedIndex, vInteriorPosition, << 20.0, 16.0, 3.0 >>)
eFail = MISSION_FAIL_ACTRESS_AT_GARAGE
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_COPS_AT_GARAGE] = TRUE )
IF IS_VEHICLE_DRIVEABLE(vsPlayersCar.VehicleIndex)
IF IS_ENTITY_AT_COORD(vsPlayersCar.VehicleIndex, vInteriorPosition, << 20.0, 16.0, 3.0 >>)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vInteriorPosition, << 20.0, 16.0, 3.0 >>)
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
PED_INDEX PedIndex
PedIndex = GET_PED_CLOSEST_PED_FROM_RELATIONSHIP_GROUP(PLAYER_PED_ID(), RELGROUPHASH_COP, 0, FALSE)
IF DOES_ENTITY_EXIST(PedIndex)
IF NOT IS_ENTITY_DEAD(PedIndex)
IF IS_ENTITY_AT_COORD(PedIndex, vInteriorPosition, << 20.0, 16.0, 3.0 >>)
eFail = MISSION_FAIL_COPS_AT_GARAGE
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_DEVIN_DEAD] = TRUE )
IF DOES_ENTITY_EXIST(psDevin.PedIndex)
IF IS_PED_INJURED(psDevin.PedIndex)
OR IS_ENTITY_DEAD(psDevin.PedIndex)
eFail = MISSION_FAIL_DEVIN_DEAD
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_DEVIN_ATTACKED] = TRUE )
IF DOES_ENTITY_EXIST(psDevin.PedIndex)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(psDevin.PedIndex, PLAYER_PED_ID(), TRUE)
OR ( IS_ENTITY_TOUCHING_ENTITY(psDevin.PedIndex, PLAYER_PED_ID()) AND IS_PED_RAGDOLL(psDevin.PedIndex))
eFail = MISSION_FAIL_DEVIN_ATTACKED
eStage = MISSION_STAGE_FAILED
ENDIF
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)
SWITCH eFailReason
CASE MISSION_FAIL_CAR_DEAD
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_GENDEST") //Mission car is destroyed
BREAK
CASE MISSION_FAIL_CAR_UNDRIVABLE
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CAR4_CUND") //Mission car is undrivable or stuck
BREAK
CASE MISSION_FAIL_CAR_LEFT_BEHIND
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CAR4_CLEFT") //Mission car is left behind
BREAK
CASE MISSION_FAIL_ACTRESS_AT_GARAGE
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CAR4_GGAR") //Player drove to the garage with the actress in the car
BREAK
CASE MISSION_FAIL_SECURITY_AT_GARAGE
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CAR4_SGAR") //Player drove to the garage tailed by security
BREAK
CASE MISSION_FAIL_COPS_AT_GARAGE
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CAR4_CGAR") //Player drove to the garage tailed by cops
BREAK
CASE MISSION_FAIL_DEVIN_DEAD
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CAR4_DDEAD")
BREAK
CASE MISSION_FAIL_DEVIN_ATTACKED
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CAR4_DATTA")
BREAK
CASE MISSION_FAIL_EMPTY
CASE MISSION_FAIL_FORCE_FAIL
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CAR4_FAIL") //Debug force fail
BREAK
ENDSWITCH
ENDPROC
//|======================= ASSET REQUESTING PROCEDURES & FUNCTIONS =======================|
/// PURPOSE:
/// Adds a model to model request array.
/// PARAMS:
/// ModelName - Model name being requested.
/// array - MODEL_NAMES array to add the requested model name to.
/// iArrayLength - Maximum length of the array.
/// iModelsAlreadyRequested - Number of models already requested in this array.
PROC ADD_MODEL_REQUEST_TO_ARRAY(MODEL_NAMES ModelName, MODEL_NAMES &array[], INT iArrayLength, INT &iModelsAlreadyRequested)
INT i = 0
BOOL bModelAlreadyRequested = FALSE
IF ( iModelsAlreadyRequested >= 0 )
IF ( iModelsAlreadyRequested <= ( iArrayLength - 1 ) )
//loop through the array (from 0 to number of models already requested)
//to see if the array already contains the model name being requested
//modify the boolean flag if the model was found in array, otherwise leave the flag unchanged
FOR i = 0 TO ( iModelsAlreadyRequested )
IF ( array[i] = ModelName )
bModelAlreadyRequested = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested model ", 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 animation dictionary to animation request array.
/// PARAMS:
/// sAnimName - Name of the animation dictionary to request.
/// array - STRING array containing requested animations.
/// iArrayLength - Maximum length of the array
/// iAnimationsAlreadyRequested - Number of animations already requested in this array.
PROC ADD_ANIMATION_REQUEST_TO_ARRAY(STRING sAnimName, STRING &array[], INT iArrayLength, INT &iAnimationsAlreadyRequested)
INT i = 0
BOOL bAnimationRequested
IF ( iAnimationsAlreadyRequested >= 0 )
IF ( iAnimationsAlreadyRequested <= (iArrayLength - 1 ) )
FOR i = 0 TO ( iAnimationsAlreadyRequested )
IF IS_STRING_NULL_OR_EMPTY(sAnimName)
AND IS_STRING_NULL_OR_EMPTY(array[i])
AND ARE_STRINGS_EQUAL(sAnimName, array[i])
bAnimationRequested = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested animation ", sAnimName, " is already in animation array.")
#ENDIF
ENDIF
ENDFOR
IF ( bAnimationRequested = FALSE )
REQUEST_ANIM_DICT(sAnimName)
array[iAnimationsAlreadyRequested] = sAnimName
iAnimationsAlreadyRequested++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested animation ", sAnimName, " and added to animation array.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Number of animations requested: ", iAnimationsAlreadyRequested, ".")
#ENDIF
ENDIF
ELSE
SCRIPT_ASSERT("Number of requested animations is greater than the length of the animation array.")
ENDIF
ELSE
SCRIPT_ASSERT("Number of requested animations is less than 0.")
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if all requested animations are loaded into memory.
/// PARAMS:
/// array - STRING array containing requested animations.
/// iAnimationsAlreadyRequested - Number of animations already requested in this array.
/// RETURNS:
/// TRUE if all requested animations from animation array are loaded into memory. FALSE if otherwise.
FUNC BOOL ARE_REQUESTED_ANIMATIONS_LOADED(STRING &array[], INT &iAnimationsAlreadyRequested)
INT i = 0
IF ( iAnimationsAlreadyRequested > 0 )
FOR i = 0 TO ( iAnimationsAlreadyRequested - 1 )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Animation dictionary in array[", i, "]: ", array[i], ".")
#ENDIF
IF NOT HAS_ANIM_DICT_LOADED(array[i])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Animation dictionary ", array[i], " is loading.")
#ENDIF
//if the animation dictionary is not loaded keep requesting it
REQUEST_ANIM_DICT(array[i])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requesting animation dictionary ", array[i], ".")
#ENDIF
RETURN FALSE
ENDIF
ENDFOR
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Animations from animation array loaded. Number of animations loaded: ", iAnimationsAlreadyRequested, ".")
#ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Cleans animation array from requested animations.
/// PARAMS:
/// array - STRING array of animations to clean.
/// iAnimationsAlreadyRequested - Number of animations already requested in this array.
PROC CLEANUP_ANIMATION_ARRAY(STRING &array[], INT &iAnimationsAlreadyRequested)
INT i = 0
STRING sNull = NULL
IF ( iAnimationsAlreadyRequested > 0 )
FOR i = 0 TO ( iAnimationsAlreadyRequested - 1 )
//brute force remove animation dictionary from memory
REMOVE_ANIM_DICT(array[i])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Animation dictionary ", array[i], " removed from memory and cleaned up from animation array.")
#ENDIF
array[i] = sNull
ENDFOR
ENDIF
iAnimationsAlreadyRequested = 0
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Animation array cleaned up. Number of requested animations set to 0.")
#ENDIF
ENDPROC
//|===================== END ASSET REQUESTING PROCEDURES & FUNCTIONS =====================|
//|======================= DEBUG VARIABLES, PROCEDURES & FUNCTIONS =======================|
#IF IS_DEBUG_BUILD
//mission skip menu and widget variables
MissionStageMenuTextStruct SkipMenu[7]
INT iReturnStage = 0
BOOL bStageResetFlag
BOOL bPrintDebugOutput
BOOL bDrawDebugLinesAndSpheres
BOOL bDrawDebugStates
BOOL bDrawDebugSpawnpoints
BOOL bDrawDebugVehicleDamageInfo
//debug widgets variables
WIDGET_GROUP_ID CarSteal4Widgets
/// PURPOSE:
/// Returns string name of the specified mission stage.
/// PARAMS:
/// eStage - Mission stage to get string name for.
/// RETURNS:
/// String name of the specified mission stage.
FUNC STRING GET_MISSION_STAGE_NAME_FOR_DEBUG(MISSION_STAGES eStage)
SWITCH eStage
CASE MISSION_STAGE_GET_TO_ACTOR
RETURN "MISSION_STAGE_GET_TO_ACTOR"
BREAK
CASE MISSION_STAGE_CUTSCENE_TRAILER
RETURN "MISSION_STAGE_CUTSCENE_TRAILER"
BREAK
CASE MISSION_STAGE_GET_TO_CAR
RETURN "MISSION_STAGE_GET_TO_CAR"
BREAK
CASE MISSION_STAGE_ESCAPE_FILM_SET
RETURN "MISSION_STAGE_ESCAPE_FILM_SET"
BREAK
CASE MISSION_STAGE_DELIVER_CAR
RETURN "MISSION_STAGE_DELIVER_CAR"
BREAK
CASE MISSION_STAGE_CUTSCENE_END
RETURN "MISSION_STAGE_CUTSCENE_END"
BREAK
ENDSWITCH
RETURN "INCORRECT_MISSION_STAGE"
ENDFUNC
/// PURPOSE:
/// Creates debug widgets for the mission.
PROC CREATE_DEBUG_WIDGETS()
CarSteal4Widgets = START_WIDGET_GROUP("Mission: Car Steal 3")
ADD_WIDGET_FLOAT_SLIDER("BLIP_SLIDE_AMOUNT", BLIP_SLIDE_AMOUNT, 0.0, 256.0, 1.0)
ADD_WIDGET_BOOL("Print debug output", bPrintDebugOutput)
START_WIDGET_GROUP("Ejector Seat")
ADD_WIDGET_FLOAT_SLIDER("fEjectScenePhase", fEjectScenePhase, 0.0, 1.0, 0.05)
ADD_WIDGET_VECTOR_SLIDER("vEjectorSeatSecondaryForce", vEjectorSeatSecondaryForce, -100.0, 100.0, 1.0)
ADD_WIDGET_VECTOR_SLIDER("vEjectorSeatPtfxOffset", vEjectorSeatPtfxOffset, -10.0, 10.0, 0.1)
ADD_WIDGET_VECTOR_SLIDER("vEjectorSeatPtfxRotation", vEjectorSeatPtfxRotation, -360.0, 360.0, 1.0)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
SET_LOCATES_HEADER_WIDGET_GROUP(CarSteal4Widgets)
ENDPROC
/// PURPOSE:
/// Deletes debug widgets for the mission.
PROC DELETE_DEBUG_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(CarSteal4Widgets)
DELETE_WIDGET_GROUP(CarSteal4Widgets)
ENDIF
ENDPROC
PROC RUN_DEBUG_WIDGETS()
IF ( bDrawDebugSpawnpoints = TRUE )
INT i
REPEAT COUNT_OF(SecuritySpawnPoints) i
DRAW_DEBUG_SPHERE(SecuritySpawnPoints[i].vPosition, 0.15, 255, 0, 0, 255)
DRAW_DEBUG_TEXT_ABOVE_COORDS(SecuritySpawnPoints[i].vPosition, GET_STRING_FROM_INT(i), 0.15)
ENDREPEAT
ENDIF
ENDPROC
/// 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()
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
PROC RUN_MISSION_STAGE_CLEANUP_FOR_DEBUG()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting mission stage cleanup.")
#ENDIF
KILL_ANY_CONVERSATION()
HANG_UP_AND_PUT_AWAY_PHONE(TRUE)
REMOVE_CUTSCENE()
STOP_AUDIO_SCENES()
TRIGGER_MUSIC_EVENT("CAR3_MISSION_FAIL")
//cleanup mission peds
CLEANUP_PED(psActor, TRUE)
CLEANUP_PED(psDevin, TRUE)
CLEANUP_PED(psToilet, TRUE)
CLEANUP_PED(psActress, TRUE)
CLEANUP_PED(psAssistant, TRUE)
CLEANUP_PED_GROUP(psAliens, TRUE)
CLEANUP_PED_GROUP(psFilmCrew, TRUE)
CLEANUP_PED_GROUP(psMeltdownCrew, TRUE)
CLEANUP_PED_GROUP(psSetSecurity, TRUE)
CLEANUP_PED_GROUP(psCarSecurity, TRUE)
CLEANUP_PED_GROUP(psActorSecurity, TRUE)
CLEANUP_PED_GROUP(psMeltdownSecurity, TRUE)
CLEANUP_PED_GROUP(psNorthGateSecurity, TRUE)
CLEANUP_PED_GROUP(psSouthGateSecurity, TRUE)
IF DOES_ENTITY_EXIST(osPropToilet.ObjectIndex)
REMOVE_MODEL_HIDE(osPropToilet.vPosition, 1.0, osPropToilet.ModelName)
ENDIF
//cleanup mission objects
CLEANUP_OBJECT(osPropLamp.ObjectIndex, TRUE)
CLEANUP_OBJECT(osPropChair.ObjectIndex, TRUE)
CLEANUP_OBJECT(osTrailerDoor.ObjectIndex, TRUE)
CLEANUP_OBJECT(osPropToilet.ObjectIndex, TRUE)
CLEANUP_OBJECT(osPropClipboard.ObjectIndex, TRUE)
CLEANUP_OBJECT(osPropCamera.ObjectIndex, TRUE)
CLEANUP_OBJECT(osPropMicrophone.ObjectIndex, TRUE)
CLEANUP_OBJECT(osPropGreenScreen.ObjectIndex, TRUE, FALSE)
//cleanup mission vehicles
CLEANUP_VEHICLE(vsPlayersCar, TRUE)
CLEANUP_VEHICLE_GROUP(vsSecurityCars, TRUE)
//cleanup mission blips
IF DOES_BLIP_EXIST(DestinationBlip)
REMOVE_BLIP(DestinationBlip)
ENDIF
CLEANUP_TRACKED_POINT(iCarTrackedPoint)
CLEANUP_TRACKED_POINT(iActorTrackedPoint)
//cleanup mission text labels
CLEAR_TRIGGERED_LABELS()
//cleanup animation dictionaries
REMOVE_ANIM_DICT("dead")
REMOVE_ANIM_DICT("misscarsteal4@actor")
REMOVE_ANIM_DICT("misscarsteal4@aliens")
REMOVE_ANIM_DICT("misscarsteal4@meltdown")
REMOVE_ANIM_DICT("missarmenian3_tryopendoor")
REMOVE_ANIM_DICT("misscarsteal4leadinoutcar_4_ext")
//cleanup jb700 spikes and reset data structs
RESET_JB700_GADGET_DATA(CarGadgetData)
CLEANUP_JB700_SPIKES(CarGadgetData, TRUE)
UNLOCK_STUDIO_GATES()
//cleanup locates header data
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
REMOVE_PTFX_ASSET()
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished mission stage cleanup.")
#ENDIF
ENDPROC
/// PURPOSE:
/// Creates debug mission stage menu.
PROC CREATE_DEBUG_MISSION_STAGE_MENU()
SkipMenu[0].sTxtLabel = "GET TO ACTOR"
SkipMenu[1].sTxtLabel = "CUT - TRAILER - CAR_4_MCS_1"
SkipMenu[2].sTxtLabel = "GET TO CAR"
SkipMenu[3].sTxtLabel = "ESCAPE FILM SET"
SkipMenu[4].sTxtLabel = "DELIVER CAR"
SkipMenu[5].sTxtLabel = "CUT - END - CAR_4_EXT"
SkipMenu[6].sTxtLabel = "DEBUG EJECTOR SEAT TEST"
ENDPROC
/// PURPOSE:
/// Checks if any of the debug pass or fail keys has been pressed to force mission end.
/// PARAMS:
/// eStage - Mission stage variable
/// eFailReason - Mission fail variable.
PROC RUN_DEBUG_PASS_AND_FAIL_CHECK(MISSION_STAGES &eStage, MISSION_FAILS &eFailReason)
IF IS_KEYBOARD_KEY_PRESSED (KEY_S)
eStage = MISSION_STAGE_PASSED
ENDIF
IF IS_KEYBOARD_KEY_PRESSED (KEY_F)
eStage = MISSION_STAGE_FAILED
eFailReason = MISSION_FAIL_FORCE_FAIL
ENDIF
ENDPROC
/// PURPOSE:
/// Controls running the debug mission stage menu.
/// PARAMS:
/// iSelectedStage - Variable that stores int value returned from the debug mission stage menu.
/// eStage - Mission stage variable.
/// bSkipActive - Skip flag.
PROC RUN_DEBUG_MISSION_STAGE_MENU(INT &iSelectedStage, MISSION_STAGES &eStage, BOOL &bSkipActive, BOOL &bResetStage)
IF LAUNCH_MISSION_STAGE_MENU(SkipMenu, iSelectedStage, ENUM_TO_INT(eStage), FALSE, "CAR STEAL 3")
DO_SAFE_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
DO_SAFE_STOP_CUTSCENE()
CLEAR_PRINTS()
CLEAR_HELP()
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
RUN_MISSION_STAGE_CLEANUP_FOR_DEBUG()
eStage = INT_TO_ENUM(MISSION_STAGES, iSelectedStage)
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_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_CUTSCENE_END
DO_SAFE_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
DO_SAFE_STOP_CUTSCENE()
CLEAR_PRINTS()
CLEAR_HELP()
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
RUN_MISSION_STAGE_CLEANUP_FOR_DEBUG()
iCurrentStage++
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
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)
DO_SAFE_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
DO_SAFE_STOP_CUTSCENE()
CLEAR_PRINTS()
CLEAR_HELP()
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
RUN_MISSION_STAGE_CLEANUP_FOR_DEBUG()
IF ( eStage <> MISSION_STAGE_GET_TO_ACTOR )
IF ( bResetStage = FALSE )
iCurrentStage--
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current mission stage changed to ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), " via P skip.")
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
ELIF ( eStage = MISSION_STAGE_GET_TO_ACTOR )
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
ENDPROC
FUNC STRING GET_PED_STATE_NAME_FOR_DEBUG(PED_STATES eState)
SWITCH eState
CASE PED_STATE_IDLE
RETURN "PED_STATE_IDLE"
BREAK
CASE PED_STATE_DEAD
RETURN "PED_STATE_DEAD"
BREAK
CASE PED_STATE_ARGUING
RETURN "PED_STATE_ARGUING"
BREAK
CASE PED_STATE_MOVING_TO_LOCATION
RETURN "PED_STATE_MOVING_TO_LOCATION"
BREAK
CASE PED_STATE_STANDING_AT_LOCATION
RETURN "PED_STATE_STANDING_AT_LOCATION"
BREAK
CASE PED_STATE_PLAYING_ANIM_1
RETURN "PED_STATE_PLAYING_ANIM_1"
BREAK
CASE PED_STATE_PLAYING_ANIM_2
RETURN "PED_STATE_PLAYING_ANIM_2"
BREAK
CASE PED_STATE_PLAYING_ANIM_3
RETURN "PED_STATE_PLAYING_ANIM_3"
BREAK
CASE PED_STATE_PLAYING_ANIM_4
RETURN "PED_STATE_PLAYING_ANIM_4"
BREAK
CASE PED_STATE_STARTING_SCENARIO
RETURN "PED_STATE_STARTING_SCENARIO"
BREAK
CASE PED_STATE_STARTING_SCENARIO_WARP
RETURN "PED_STATE_STARTING_SCENARIO_WARP"
BREAK
CASE PED_STATE_USING_SCENARIO
RETURN "PED_STATE_USING_SCENARIO"
BREAK
CASE PED_STATE_BLOCKING_PLAYER
RETURN "PED_STATE_BLOCKING_PLAYER"
BREAK
CASE PED_STATE_JACKING_PLAYER
RETURN "PED_STATE_JACKING_PLAYER"
BREAK
CASE PED_STATE_WATCHING_PLAYER
RETURN "PED_STATE_WATCHING_PLAYER"
BREAK
CASE PED_STATE_STUNNED
RETURN "PED_STATE_STUNNED"
BREAK
CASE PED_STATE_FLEEING
RETURN "PED_STATE_FLEEING"
BREAK
CASE PED_STATE_SITTING_IN_CAR
RETURN "PED_STATE_SITTING_IN_CAR"
BREAK
CASE PED_STATE_BEING_EJECTED
RETURN "PED_STATE_BEING_EJECTED"
BREAK
CASE PED_STATE_BEING_STEALTH_KILLED
RETURN "PED_STATE_BEING_STEALTH_KILLED"
BREAK
CASE PED_STATE_IMMOBILIZED
RETURN "PED_STATE_IMMOBILIZED"
BREAK
CASE PED_STATE_INTIMIDATION
RETURN "PED_STATE_INTIMIDATION"
BREAK
CASE PED_STATE_COMBAT_AIMING
RETURN "PED_STATE_COMBAT_AIMING"
BREAK
CASE PED_STATE_COMBAT_AIMING_PED
RETURN "PED_STATE_COMBAT_AIMING_PED"
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
RETURN "PED_STATE_COMBAT_ON_FOOT"
BREAK
CASE PED_STATE_COMBAT_DEFENSIVE
RETURN "PED_STATE_COMBAT_DEFENSIVE"
BREAK
CASE PED_STATE_ENTERING_VEHICLE
RETURN "PED_STATE_ENTERING_VEHICLE"
BREAK
CASE PED_STATE_COMBAT_FROM_CAR_SHOOTING
RETURN "PED_STATE_COMBAT_FROM_CAR_SHOOTING"
BREAK
CASE PED_STATE_COMBAT_FROM_CAR_NO_SHOOTING
RETURN "PED_STATE_COMBAT_FROM_CAR_NO_SHOOTING"
BREAK
DEFAULT
RETURN "INVALID_PED_STATE"
BREAK
ENDSWITCH
RETURN "INVALID_PED_STATE"
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 ( bDrawDebugSpawnpoints = FALSE)
bDrawDebugSpawnpoints = TRUE
ELSE
bDrawDebugSpawnpoints = FALSE
ENDIF
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD7)
IF ( bDrawDebugVehicleDamageInfo = FALSE)
bDrawDebugVehicleDamageInfo = TRUE
ELSE
bDrawDebugVehicleDamageInfo = FALSE
ENDIF
ENDIF
ENDPROC
PROC PRINT_GLOBAL_BIT_SET()
PRINTLN(GET_THIS_SCRIPT_NAME(), ": ******************************** GLOBAL BIT SET *********************************")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": PLAYER_GOT_TUXEDO: ", IS_BIT_SET(g_iCarSteal3AgentBitSet, PLAYER_GOT_TUXEDO), ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": ACTOR_KILLED: ", IS_BIT_SET(g_iCarSteal3AgentBitSet, ACTOR_KILLED), ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": ACTOR_STEALTH_KILLED: ", IS_BIT_SET(g_iCarSteal3AgentBitSet, ACTOR_STEALTH_KILLED), ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": ACTOR_IGNORED: ", IS_BIT_SET(g_iCarSteal3AgentBitSet, ACTOR_IGNORED), ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": ACTRESS_FLED_CAR: ", IS_BIT_SET(g_iCarSteal3AgentBitSet, ACTRESS_FLED_CAR), ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": **********************************************************************************")
ENDPROC
#ENDIF
//|===================== END DEBUG VARIABLES, PROCEDURES & FUNCTIONS =====================|
FUNC BOOL CAN_GET_CLOSEST_NTH_VEHICLE_NODE_TO_ENTITY_BETWEEN_ANGLES(ENTITY_INDEX EntityIndex, VECTOR &vCurrentClosestNodePosition,
FLOAT &fOutHeading, INT iNodeNumber, FLOAT fMinAngle,
FLOAT fMaxAngle, NODE_FLAGS eNodeFlags = NF_NONE)
///
/// Angles
/// use 0 - 90 for vehicle nodes in front of the entity
/// use 90 - 180 for vehicle nodes behind the player
IF DOES_ENTITY_EXIST(EntityIndex)
IF NOT IS_ENTITY_DEAD(EntityIndex)
VECTOR vEntityPosition
VECTOR vEntityForwardVector
VECTOR vVectorFromNodeToEntity
VECTOR vClosestNodePosition
FLOAT fClosestNodeHeading
FLOAT fAngle
INT iTotalLanes
vEntityPosition = GET_ENTITY_COORDS(EntityIndex)
vEntityForwardVector = GET_ENTITY_FORWARD_VECTOR(EntityIndex)
IF GET_NTH_CLOSEST_VEHICLE_NODE_WITH_HEADING(vEntityPosition, iNodeNumber, vClosestNodePosition, fClosestNodeHeading, iTotalLanes, eNodeFlags)
vVectorFromNodeToEntity = vClosestNodePosition - vEntityPosition
fAngle = GET_ANGLE_BETWEEN_2D_VECTORS(vVectorFromNodeToEntity.X, vVectorFromNodeToEntity.Y, vEntityForwardVector.X, vEntityForwardVector.Y)
IF ( fAngle > fMinAngle AND fAngle < fMaxAngle )
//IF NOT ARE_VECTORS_EQUAL(vCurrentClosestNodePosition, vClosestNodePosition) //not sure why this was here
vCurrentClosestNodePosition = vClosestNodePosition
fOutHeading = fClosestNodeHeading
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), "************* CAN_GET_CLOSEST_NTH_VEHICLE_NODE_TO_VEHICLE_BETWEEN_ANGLES **************")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Closest vehicle node found at ", vClosestNodePosition, " and heading ", fClosestNodeHeading , ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), "***************************************************************************************")
DRAW_DEBUG_SPHERE(vClosestNodePosition, 1.0)
#ENDIF
RETURN TRUE
//ENDIF
ENDIF
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_SPHERE(vClosestNodePosition, 0.5, 255, 0, 0, 64)
DRAW_DEBUG_SPHERE(vCurrentClosestNodePosition, 1.0, 0, 0, 255, 64)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(EntityIndex, GET_STRING_FROM_FLOAT(fAngle), 1.5)
ENDIF
#ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC STORE_ENTITY_POSITION_AND_HEADING(ENTITY_INDEX EntityIndex, VECTOR &vPosition, FLOAT &fHeading)
IF DOES_ENTITY_EXIST(EntityIndex)
IF NOT IS_ENTITY_DEAD(EntityIndex)
vPosition = GET_ENTITY_COORDS(EntityIndex)
fHeading = GET_ENTITY_HEADING(EntityIndex)
ENDIF
ENDIF
ENDPROC
PROC RESET_GLOBAL_BIT_SET()
g_iCarSteal3AgentBitSet = 0
#IF IS_DEBUG_BUILD
PRINT_GLOBAL_BIT_SET()
#ENDIF
ENDPROC
PROC SET_GLOBAL_BIT_SET(INT iBit)
SET_BIT(g_iCarSteal3AgentBitSet, iBit)
#IF IS_DEBUG_BUILD
PRINT_GLOBAL_BIT_SET()
#ENDIF
ENDPROC
PROC CLEAR_GLOBAL_BIT_SET(INT iBit)
CLEAR_BIT(g_iCarSteal3AgentBitSet, iBit)
#IF IS_DEBUG_BUILD
PRINT_GLOBAL_BIT_SET()
#ENDIF
ENDPROC
PROC UPDATE_PLAYER_KILL_COUNTERS(PED_CLEANUP_REASONS eCleanupReason, INT &iLethalKills, INT &iStealthKills, INT &iTakedownKills)
SWITCH eCleanupReason
CASE PED_CLEANUP_KILLED_BY_PLAYER_LETHAL
iLethalKills++
BREAK
CASE PED_CLEANUP_KILLED_BY_PLAYER_STEALTH
iStealthKills++
BREAK
CASE PED_CLEANUP_KILLED_BY_PLAYER_TAKEDOWN
iTakedownKills++
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": *********************** UPDATE_PLAYER_AND_BUDDY_KILL_COUNTERS *************************")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player lethal kills: ", iLethalKills, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player stealth kills: ", iStealthKills, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player takedown kills: ", iTakedownKills, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": ***************************************************************************************")
#ENDIF
ENDPROC
PROC UPDATE_JB700_SPIKE_HIT_COUNTERS(JB700_GADGET_DATA sGadgetData, VEH_STRUCT &array[])
IF sGadgetData.bSpikesHit = TRUE
IF ( iTotalSpikeHits != sGadgetData.iSpikesHits )
INT i = 0
REPEAT COUNT_OF(array) i
IF ( sGadgetData.SpikesData[sGadgetData.iSpikeHit].VehicleIndex = array[i].VehicleIndex )
array[i].bImmobilized = TRUE
iSecurityCarsImmobilized++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iSecurityCarsImmobilized: ", iSecurityCarsImmobilized, ".")
#ENDIF
ENDIF
ENDREPEAT
iTotalSpikeHits = sGadgetData.iSpikesHits
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iTotalSpikeHits: ", iTotalSpikeHits, ".")
#ENDIF
ENDIF
ENDIF
ENDPROC
PROC UPDATE_JB700_PED_DRIVE_TASK(JB700_GADGET_DATA sGadgetData, PED_INDEX PedIndex, VEHICLE_INDEX VehicleIndex, BOOL &bAutoDrive, INT &iTimer)
IF ( bAutoDrive = FALSE )
IF ( sGadgetData.bSpikesHit = TRUE )
IF IS_CINEMATIC_SHOT_ACTIVE(SHOTTYPE_CAMERA_MAN)
IF DOES_ENTITY_EXIST(sGadgetData.SpikesData[sGadgetData.iSpikeHit].VehicleIndex)
VECTOR vFleeCoords
vFleeCoords = GET_ENTITY_COORDS(sGadgetData.SpikesData[sGadgetData.iSpikeHit].VehicleIndex, FALSE)
IF IS_PED_SITTING_IN_THIS_VEHICLE(PedIndex, VehicleIndex)
TASK_VEHICLE_MISSION_COORS_TARGET(PedIndex, VehicleIndex, vFleeCoords, MISSION_FLEE, 25.0,
DF_SteerAroundObjects | DF_SteerAroundPeds | DF_SteerAroundStationaryCars |
DF_ChangeLanesAroundObstructions | DF_ForceJoinInRoadDirection |
DF_SwerveAroundAllCars, 500.0, 10.0, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting auto drive.")
#ENDIF
iTimer = 0
bAutoDrive = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
IF ( bAutoDrive = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, "AUTO DRIVE", 0.0)
ENDIF
ENDIF
#ENDIF
IF NOT IS_CINEMATIC_SHOT_ACTIVE(SHOTTYPE_CAMERA_MAN)
IF ( iTimer = 0 )
iTimer = GET_GAME_TIMER()
ENDIF
IF ( IS_PLAYER_IN_CONTROL_OF_VEHICLE(VehicleIndex) )
OR ( iTimer != 0 AND HAS_TIME_PASSED(3000, iTimer) )
CLEAR_PED_TASKS(PLAYER_PED_ID())
bAutoDrive = FALSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping auto drive.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC GO_TO_PED_STATE(PED_STRUCT &ped, PED_STATES eState)
ped.bHasTask = FALSE
ped.eState = eState
#IF IS_DEBUG_BUILD
IF NOT IS_STRING_NULL_OR_EMPTY(ped.sDebugName)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Sending ped with debug name ", ped.sDebugName, " to state ", GET_PED_STATE_NAME_FOR_DEBUG(eState), ".")
ENDIF
#ENDIF
ENDPROC
PROC CHECK_PED_LINE_OF_SIGHT_TO_PED(PED_INDEX PedIndex, PED_INDEX TargetPedIndex, BOOL &bLOSFlag, INT &iTimer, INT iTime)
IF HAS_TIME_PASSED(iTime, iTimer)
IF DOES_ENTITY_EXIST(PedIndex)
AND DOES_ENTITY_EXIST(TargetPedIndex)
IF NOT IS_ENTITY_DEAD(PedIndex)
AND NOT IS_ENTITY_DEAD(TargetPedIndex)
IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY_IN_FRONT(PedIndex, TargetPedIndex)
bLOSFlag = TRUE
#IF IS_DEBUG_BUILD
IF ( bDrawDebugLinesAndSpheres = TRUE )
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PedIndex), GET_ENTITY_COORDS(TargetPedIndex), 255, 0, 0)
ENDIF
#ENDIF
ELSE
bLOSFlag = FALSE
ENDIF
iTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MISSION_CLEANUP()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting mission cleanup.")
DELETE_DEBUG_WIDGETS()
#ENDIF
REMOVE_CUTSCENE()
SHUTDOWN_PC_SCRIPTED_CONTROLS()
CLEAR_HELP()
CLEAR_PRINTS()
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
KILL_ANY_CONVERSATION()
DISABLE_CELLPHONE(FALSE)
DISABLE_TAXI_HAILING(FALSE)
RELEASE_SUPPRESSED_EMERGENCY_CALLS()
CLEANUP_MODEL_ARRAY(MissionModels, iModelsRequested)
CLEANUP_ANIMATION_ARRAY(MissionAnimations, iAnimationsRequested)
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS(PLAYER_PED_ID())
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, TRUE)
ENDIF
//cleanup mission peds
CLEANUP_PED(psActor, FALSE, FALSE)
CLEANUP_PED(psDevin, FALSE, FALSE)
CLEANUP_PED(psToilet, FALSE, FALSE)
CLEANUP_PED(psActress, FALSE, FALSE)
CLEANUP_PED(psAssistant, FALSE, FALSE)
CLEANUP_PED_GROUP(psAliens, FALSE, FALSE)
CLEANUP_PED_GROUP(psFilmCrew, FALSE, FALSE)
CLEANUP_PED_GROUP(psMeltdownCrew, FALSE, FALSE)
CLEANUP_PED_GROUP(psSetSecurity, FALSE, FALSE)
CLEANUP_PED_GROUP(psCarSecurity, FALSE, FALSE)
CLEANUP_PED_GROUP(psActorSecurity, FALSE, FALSE)
CLEANUP_PED_GROUP(psMeltdownSecurity, FALSE, FALSE)
CLEANUP_PED_GROUP(psNorthGateSecurity, FALSE, FALSE)
CLEANUP_PED_GROUP(psSouthGateSecurity, FALSE, FALSE)
IF DOES_ENTITY_EXIST(osPropToilet.ObjectIndex)
REMOVE_MODEL_HIDE(osPropToilet.vPosition, 1.0, osPropToilet.ModelName)
ENDIF
//cleanup mission objects
CLEANUP_OBJECT(osPropLamp.ObjectIndex, FALSE)
CLEANUP_OBJECT(osPropChair.ObjectIndex, FALSE)
CLEANUP_OBJECT(osTrailerDoor.ObjectIndex, FALSE)
CLEANUP_OBJECT(osPropToilet.ObjectIndex, FALSE)
CLEANUP_OBJECT(osPropClipboard.ObjectIndex, FALSE)
CLEANUP_OBJECT(osPropCamera.ObjectIndex, FALSE)
CLEANUP_OBJECT(osPropMicrophone.ObjectIndex, FALSE)
CLEANUP_OBJECT(osPropGreenScreen.ObjectIndex, FALSE, FALSE)
//cleanup mission vehicles
CLEANUP_VEHICLE(vsPlayersCar, FALSE, FALSE)
CLEANUP_VEHICLE_GROUP(vsSecurityCars, FALSE, FALSE)
//cleanup mission blips
IF DOES_BLIP_EXIST(DestinationBlip)
REMOVE_BLIP(DestinationBlip)
ENDIF
CLEANUP_TRACKED_POINT(iCarTrackedPoint)
CLEANUP_TRACKED_POINT(iActorTrackedPoint)
//reset relationship for SECURITY_GUARD group
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_NONE, RELGROUPHASH_SECURITY_GUARD, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_NONE, RELGROUPHASH_SECURITY_GUARD, rgFilmCrew)
//remove relationship groups
REMOVE_RELATIONSHIP_GROUP(rgFilmCrew)
SET_VEHICLE_MODEL_IS_SUPPRESSED(JB700, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(mnSecurityCar, FALSE)
SET_PED_MODEL_IS_SUPPRESSED(mnSecurityPed, FALSE)
SET_PED_MODEL_IS_SUPPRESSED(U_M_M_SPYACTOR, FALSE)
SET_PED_MODEL_IS_SUPPRESSED(U_F_Y_SPYACTRESS, FALSE)
SET_PED_MODEL_IS_SUPPRESSED(U_M_M_FILMDIRECTOR, FALSE)
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
CLEAR_PED_NON_CREATION_AREA()
REMOVE_SCENARIO_BLOCKING_AREAS()
SET_IGNORE_NO_GPS_FLAG(FALSE)
REMOVE_PTFX_ASSET()
STOP_AUDIO_SCENES()
RELEASE_SCRIPT_AUDIO_BANK()
RELEASE_NAMED_SCRIPT_AUDIO_BANK("CAR_THEFT_MOVIE_LOT")
UNREGISTER_SCRIPT_WITH_AUDIO()
SET_SCENARIO_GROUP_ENABLED("MOVIE_STUDIO_SECURITY", TRUE)
UNLOCK_STUDIO_GATES()
UNREGISTER_STUDIO_GATES()
SET_MAX_WANTED_LEVEL(5) //restore default cop and wanted level settings
SET_CREATE_RANDOM_COPS(TRUE)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE) //set all shops available
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_01_AP, FALSE) //set mod shops available
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_05_ID2, FALSE)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_06_BT1, FALSE)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_07_CS1, FALSE)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_08_CS6, FALSE)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_SUPERMOD, FALSE)
CLEAR_WEATHER_TYPE_PERSIST()
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
SET_INTERIOR_CAPPED_ON_EXIT(INTERIOR_V_CHOPSHOP, TRUE)
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
ENDIF
SET_ALL_VEHICLE_GENERATORS_ACTIVE()
SET_STUNT_JUMPS_CAN_TRIGGER(TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished mission cleanup.")
#ENDIF
ENDPROC
//|========================== MISSION STAGE LOADING PROCEDURES ==========================|
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)
SET_PED_RELATIONSHIP_GROUP_HASH(PedIndex, relGroupHash)
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,
INT iColour3 = 0, INT iColour4 = 0 #IF IS_DEBUG_BUILD, STRING sDebugName = NULL #ENDIF)
//create any vehicle that can be used on a mission by player
IF ( bPlayerVehicle = FALSE )
IF NOT DOES_ENTITY_EXIST(vsVehicle.VehicleIndex)
REQUEST_MODEL(vsVehicle.ModelName)
IF HAS_MODEL_LOADED(vsVehicle.ModelName)
IF( bCarStealVehicle = TRUE )
vsVehicle.VehicleIndex = CREATE_CAR_STEAL_STRAND_CAR(vsVehicle.ModelName, vsVehicle.vPosition, vsVehicle.fHeading)
SET_HORN_ENABLED(vsVehicle.VehicleIndex, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(vsVehicle.ModelName)
ELSE
IF ( eCharacter = NO_CHARACTER )
vsVehicle.VehicleIndex = CREATE_VEHICLE(vsVehicle.ModelName, vsVehicle.vPosition, vsVehicle.fHeading)
SET_MODEL_AS_NO_LONGER_NEEDED(vsVehicle.ModelName)
ELSE //create npc vehicle based on the character enum specified
IF CREATE_NPC_VEHICLE(vsVehicle.VehicleIndex, eCharacter, vsVehicle.vPosition, vsVehicle.fHeading)
SET_MODEL_AS_NO_LONGER_NEEDED(vsVehicle.ModelName)
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsVehicle.VehicleIndex)
//set vehicle colours, if they are provided
IF ( iColour1 != -1)
AND ( iColour2 != -1 )
SET_VEHICLE_COLOURS(vsVehicle.VehicleIndex, iColour1, iColour2)
ENDIF
//set vehicle colour combination, if it is provided
IF ( iColourCombination != -1 )
SET_VEHICLE_COLOUR_COMBINATION(vsVehicle.VehicleIndex, iColourCombination)
ENDIF
SET_VEHICLE_EXTRA_COLOURS(vsVehicle.VehicleIndex, iColour3, iColour4)
SET_VEHICLE_HAS_STRONG_AXLES(vsVehicle.VehicleIndex, bMissionCritical)
//limit damage that can be done to the vehicle
SET_VEHICLE_CAN_LEAK_OIL(vsVehicle.VehicleIndex, NOT bMissionCritical)
SET_VEHICLE_CAN_LEAK_PETROL(vsVehicle.VehicleIndex, NOT bMissionCritical)
//make the vehicle not attach to tow truck if mission critical
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vsVehicle.VehicleIndex, NOT bMissionCritical)
IF IS_THIS_MODEL_A_CAR(vsVehicle.ModelName)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVehicle.VehicleIndex, SC_DOOR_FRONT_LEFT, NOT bMissionCritical)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVehicle.VehicleIndex, SC_DOOR_FRONT_RIGHT, NOT bMissionCritical)
ENDIF
SET_VEHICLE_ON_GROUND_PROPERLY(vsVehicle.VehicleIndex)
ENDIF
#IF IS_DEBUG_BUILD
IF NOT Is_String_Null_Or_Empty(sDebugName)
SET_VEHICLE_NAME_DEBUG(vsVehicle.VehicleIndex, sDebugName)
IF ( bCarStealVehicle = TRUE )
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created car steal strand vehicle ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created vehicle ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
ENDIF
ELSE
IF ( bCarStealVehicle = TRUE )
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created car steal strand vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
ENDIF
ENDIF
#ENDIF
RETURN TRUE
ENDIF
ELSE //if the vehicle exists, return true
RETURN TRUE
ENDIF
//create player specific vehicle
ELIF ( bPlayerVehicle = TRUE )
IF NOT DOES_ENTITY_EXIST(vsVehicle.VehicleIndex)
//call the player vehicle creation until it returns true
IF CREATE_PLAYER_VEHICLE(vsVehicle.VehicleIndex, eCharacter, vsVehicle.vPosition, vsVehicle.fHeading, TRUE)
SET_VEHICLE_HAS_STRONG_AXLES(vsVehicle.VehicleIndex, bMissionCritical)
//limit damage that can be done to the vehicle
SET_VEHICLE_CAN_LEAK_OIL(vsVehicle.VehicleIndex, NOT bMissionCritical)
SET_VEHICLE_CAN_LEAK_PETROL(vsVehicle.VehicleIndex, NOT bMissionCritical)
//make the vehicle not attach to tow truck if mission critical
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vsVehicle.VehicleIndex, NOT bMissionCritical)
IF IS_THIS_MODEL_A_CAR(vsVehicle.ModelName)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVehicle.VehicleIndex, SC_DOOR_FRONT_LEFT, NOT bMissionCritical)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVehicle.VehicleIndex, SC_DOOR_FRONT_RIGHT, NOT bMissionCritical)
ENDIF
#IF IS_DEBUG_BUILD
IF NOT Is_String_Null_Or_Empty(sDebugName)
SET_VEHICLE_NAME_DEBUG(vsVehicle.VehicleIndex, sDebugName)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player vehicle ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
ENDIF
#ENDIF
RETURN TRUE
ENDIF
ELSE //if the vehicle exists, return true
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// 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_INVINCIBLE(osObject.ObjectIndex, TRUE)
SET_ENTITY_ROTATION(osObject.ObjectIndex, osObject.vRotation)
SET_ENTITY_COORDS_NO_OFFSET(osObject.ObjectIndex, osObject.vPosition)
IF ( bFreezeObject = TRUE )
FREEZE_ENTITY_POSITION(osObject.ObjectIndex, bFreezeObject)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(osObject.ModelName)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created object with model ", GET_MODEL_NAME_FOR_DEBUG(osObject.ModelName), " at coordinates ", osObject.vPosition, ".")
#ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(osObject.ObjectIndex)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC PED_INDEX CREATE_ENEMY_PED(VECTOR vPosition, FLOAT fHeading, MODEL_NAMES ModelName, REL_GROUP_HASH RelHashGroup, INT iHealth = 200,
WEAPON_TYPE eWeaponType = WEAPONTYPE_UNARMED #IF IS_DEBUG_BUILD, STRING sDebugName = NULL #ENDIF)
PED_INDEX PedIndex = CREATE_PED(PEDTYPE_MISSION, ModelName, vPosition, fHeading)
SET_ENTITY_HEALTH(PedIndex, iHealth)
SET_PED_MAX_HEALTH(PedIndex, iHealth)
SET_PED_DIES_WHEN_INJURED(PedIndex, TRUE)
GIVE_WEAPON_TO_PED(PedIndex, eWeaponType, INFINITE_AMMO, FALSE)
SET_PED_INFINITE_AMMO(PedIndex, TRUE, eWeaponType)
SET_PED_RELATIONSHIP_GROUP_HASH(PedIndex, RelHashGroup)
SET_PED_TARGET_LOSS_RESPONSE(PedIndex, TLR_NEVER_LOSE_TARGET)
SET_PED_CONFIG_FLAG(PedIndex, PCF_RunFromFiresAndExplosions, TRUE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_AlwaysRespondToCriesForHelp, TRUE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_KeepRelationshipGroupAfterCleanUp, TRUE)
SET_COMBAT_FLOAT(PedIndex, CCF_TIME_TO_INVALIDATE_INJURED_TARGET, 30.0)
SET_PED_SHOULD_PLAY_IMMEDIATE_SCENARIO_EXIT(PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, TRUE)
#IF IS_DEBUG_BUILD
IF NOT Is_String_Null_Or_Empty(sDebugName)
SET_PED_NAME_DEBUG(PedIndex, sDebugName)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created enemy ped with model ", GET_MODEL_NAME_FOR_DEBUG(ModelName), " and debug name ", sDebugName, " at coordinates ", vPosition, ".")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created enemy ped with model ", GET_MODEL_NAME_FOR_DEBUG(ModelName), " at coordinates ", vPosition, ".")
ENDIF
#ENDIF
RETURN PedIndex
ENDFUNC
FUNC PED_INDEX CREATE_ENEMY_PED_IN_VEHICLE(VEHICLE_INDEX VehicleIndex, MODEL_NAMES ModelName, REL_GROUP_HASH RelHashGroup,
VEHICLE_SEAT eVehicleSeat, INT iHealth = 200, WEAPON_TYPE eWeaponType = WEAPONTYPE_UNARMED
#IF IS_DEBUG_BUILD, STRING sDebugName = NULL #ENDIF)
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
PED_INDEX PedIndex = CREATE_PED_INSIDE_VEHICLE(VehicleIndex, PEDTYPE_MISSION, ModelName, eVehicleSeat)
SET_PED_MAX_HEALTH(PedIndex, iHealth)
SET_ENTITY_HEALTH(PedIndex, iHealth)
SET_PED_DIES_WHEN_INJURED(PedIndex, TRUE)
GIVE_WEAPON_TO_PED(PedIndex, eWeaponType, INFINITE_AMMO, FALSE)
SET_PED_INFINITE_AMMO(PedIndex, TRUE, eWeaponType)
SET_PED_AS_ENEMY(PedIndex, TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(PedIndex, RelHashGroup)
SET_PED_TARGET_LOSS_RESPONSE(PedIndex, TLR_NEVER_LOSE_TARGET)
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_PED_CONFIG_FLAG(PedIndex, PCF_AllowToBeTargetedInAVehicle, TRUE)
SET_COMBAT_FLOAT(PedIndex, CCF_TIME_TO_INVALIDATE_INJURED_TARGET, 30.0)
SET_ENTITY_IS_TARGET_PRIORITY(PedIndex, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, TRUE)
#IF IS_DEBUG_BUILD
IF NOT IS_STRING_NULL_OR_EMPTY(sDebugName)
SET_PED_NAME_DEBUG(PedIndex, sDebugName)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created enemy ped in vehicle ", sDebugName, ".")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created enemy ped in vehicle.")
ENDIF
#ENDIF
RETURN PedIndex
ENDIF
RETURN NULL
ENDFUNC
/// 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_ACTOR)
eStage = MISSION_STAGE_GET_TO_ACTOR
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_CAR)
eStage = MISSION_STAGE_GET_TO_CAR
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_ESCAPE_FILM_SET)
eStage = MISSION_STAGE_ESCAPE_FILM_SET
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_DELIVER_CAR)
eStage = MISSION_STAGE_DELIVER_CAR
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission is being replayed at stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
ENDPROC
PROC INITIALISE_ARRAYS_FOR_FILM_CREW()
osPropLamp.vPosition = <<-1169.7400, -512.6960, 34.7427>>
osPropLamp.vRotation = <<-0.0000, 0.0000, -122.4000>>
osPropLamp.ModelName = PROP_STUDIO_LIGHT_02
osPropChair.vPosition = << -1178.42, -511.08, 35.26 >> //<< -1185.21, -506.609, 35.1495 >>
osPropChair.vRotation = << 0.000, 0.000, 180.000 >> //<< 0.0, 0.0, 0.0 >>
osPropChair.ModelName = PROP_DIRECT_CHAIR_02
osPropClipboard.vPosition = << -1180.00, -511.25, 34.57 >>
osPropClipboard.vRotation = << 0.0, 0.0, 0.0 >>
osPropClipboard.ModelName = P_CS_CLIPBOARD
osPropToilet.vPosition = << -1160.7360, -528.9149, 31.5855 >>
osPropToilet.vRotation = << 0.0, 0.0, 152.3009 >>
osPropToilet.ModelName = PROP_PORTALOO_01A
osPropGreenScreen.vPosition = <<-1130.5870, -453.2327, 36.1750>>
osPropGreenScreen.vRotation = <<-0.8000, 1.0000, -160.0000>>
osPropGreenScreen.ModelName = PROP_LD_GREENSCREEN_01
osPropCamera.vPosition = << -1132.19, -449.93, 34.61 >>
osPropCamera.vRotation = << 0.0, 0.0, 0.0 >>
osPropCamera.ModelName = PROP_V_CAM_01
osPropMicrophone.vPosition = << -1132.75, -451.21, 34.57 >>
osPropMicrophone.vRotation = << 0.0, 0.0, 0.0 >>
osPropMicrophone.ModelName = PROP_V_BMIKE_01
psFilmCrew[FCP_DIRECTOR].vPosition = << -1178.1136, -510.3467, 34.5669 >> //film director
psFilmCrew[FCP_DIRECTOR].fHeading = 27.1460
psFilmCrew[FCP_DIRECTOR].ModelName = U_M_M_FILMDIRECTOR
psFilmCrew[FCP_GRIP_1].vPosition = << -1179.1171, -510.1808, 34.5669 >> //grip who stands next to director
psFilmCrew[FCP_GRIP_1].fHeading = 350.5527
psFilmCrew[FCP_GRIP_1].ModelName = S_M_Y_GRIP_01
psFilmCrew[FCP_GRIP_2].vPosition = <<-1170.0442, -511.5512, 34.5666>>//<<-1171.0500, -512.6278, 34.5666>>//<<-1173.4337, -505.6174, 34.5665>> //grip who stands in front of the car
psFilmCrew[FCP_GRIP_2].fHeading = 203.5958//246.1889//219.8001
psFilmCrew[FCP_GRIP_2].ModelName = S_M_Y_GRIP_01
psFilmCrew[FCP_GRIP_3].vPosition = <<-1185.9601, -506.3779, 34.5794>>
psFilmCrew[FCP_GRIP_3].fHeading = 65.6138
psFilmCrew[FCP_GRIP_3].ModelName = S_M_Y_GRIP_01
psFilmCrew[FCP_GRIP_4].vPosition = <<-1177.0441, -488.3724, 34.5519>>
psFilmCrew[FCP_GRIP_4].fHeading = 82.4244
psFilmCrew[FCP_GRIP_4].ModelName = S_M_Y_GRIP_01
psFilmCrew[FCP_GRIP_5].vPosition = <<-1176.1688, -482.1744, 34.7701>>
psFilmCrew[FCP_GRIP_5].fHeading = 201.0676
psFilmCrew[FCP_GRIP_5].ModelName = S_M_Y_GRIP_01
psAliens[0].vPosition = <<-1140.1760, -472.6156, 33.9209>>
psAliens[0].fHeading = 37.5363
psAliens[0].ModelName = S_M_M_MOVALIEN_01
#IF IS_DEBUG_BUILD
psAliens[0].sDebugName = "Alien 0"
#ENDIF
psAliens[1].vPosition = <<-1139.2887, -471.7373, 33.9631>>
psAliens[1].fHeading = 23.6991
psAliens[1].ModelName = S_M_M_MOVALIEN_01
#IF IS_DEBUG_BUILD
psAliens[1].sDebugName = "Alien 1"
#ENDIF
psActress.vPosition = << -1181.3146, -506.7412, 34.5669 >>
psActress.fHeading = 253.9266
psActress.ModelName = U_F_Y_SPYACTRESS
#IF IS_DEBUG_BUILD
psActress.sDebugName = "Actress"
#ENDIF
psToilet.vPosition = <<-1159.3536, -527.1266, 31.5364>>
psToilet.fHeading = 137.4430
psToilet.ModelName = S_M_Y_GRIP_01
#IF IS_DEBUG_BUILD
psToilet.sDebugName = "Toliet"
#ENDIF
psMeltdownCrew[MSP_ACTORA].vPosition = <<-1130.6631, -450.2912, 34.6384>>
psMeltdownCrew[MSP_ACTORA].fHeading = 170.2838
psMeltdownCrew[MSP_ACTORA].ModelName = IG_MILTON
#IF IS_DEBUG_BUILD
psMeltdownCrew[MSP_ACTORA].sDebugName = "MSP_ACTORA"
#ENDIF
psMeltdownCrew[MSP_ACTORB].vPosition = <<-1128.7494, -449.8770, 34.6903>>
psMeltdownCrew[MSP_ACTORB].fHeading = 173.7335
psMeltdownCrew[MSP_ACTORB].ModelName = S_M_M_MOVALIEN_01//S_M_Y_GRIP_01
#IF IS_DEBUG_BUILD
psMeltdownCrew[MSP_ACTORB].sDebugName = "MSP_ACTORB"
#ENDIF
psMeltdownCrew[MSP_CAMERAMAN].vPosition = <<-1132.4835, -449.4888, 34.6125>>
psMeltdownCrew[MSP_CAMERAMAN].fHeading = 207.1287
psMeltdownCrew[MSP_CAMERAMAN].ModelName = S_M_Y_GRIP_01
#IF IS_DEBUG_BUILD
psMeltdownCrew[MSP_CAMERAMAN].sDebugName = "MSP_CAMERAMAN"
#ENDIF
psMeltdownCrew[MSP_BOOMMAN].vPosition = <<-1133.2305, -451.1367, 34.5651>>
psMeltdownCrew[MSP_BOOMMAN].fHeading = 222.7364
psMeltdownCrew[MSP_BOOMMAN].ModelName = S_M_Y_GRIP_01
#IF IS_DEBUG_BUILD
psMeltdownCrew[MSP_BOOMMAN].sDebugName = "MSP_BOOMMAN"
#ENDIF
psMeltdownCrew[MSP_DIRECTOR].vPosition = <<-1128.5414, -447.9520, 34.7552>>
psMeltdownCrew[MSP_DIRECTOR].fHeading = 157.4622
psMeltdownCrew[MSP_DIRECTOR].ModelName = U_M_Y_ANTONB
#IF IS_DEBUG_BUILD
psMeltdownCrew[MSP_DIRECTOR].sDebugName = "MSP_DIRECTOR"
#ENDIF
ENDPROC
PROC INITIALISE_ARRAYS_FOR_SECURITY()
psSetSecurity[0].vPosition = << -1175.2550, -501.9372, 34.5669 >>
psSetSecurity[0].fHeading = 138.1011
psSetSecurity[0].iConversationTimer = -1
psSetSecurity[0].ModelName = mnSecurityPed
#IF IS_DEBUG_BUILD
psSetSecurity[0].sDebugName = "Set 0"
#ENDIF
psSetSecurity[1].vPosition = << -1199.8624, -493.9804, 34.5414 >>
psSetSecurity[1].fHeading = 219.7226
psSetSecurity[1].iConversationTimer = -1
psSetSecurity[1].ModelName = mnSecurityPed
#IF IS_DEBUG_BUILD
psSetSecurity[1].sDebugName = "Set 1"
#ENDIF
psSetSecurity[2].vPosition = << -1188.6659, -510.1270, 34.6740 >>
psSetSecurity[2].fHeading = 317.9273
psSetSecurity[2].iConversationTimer = -1
psSetSecurity[2].ModelName = mnSecurityPed
#IF IS_DEBUG_BUILD
psSetSecurity[2].sDebugName = "Set 2"
#ENDIF
psSetSecurity[3].vPosition = << -1180.6191, -522.2653, 29.3807 >>
psSetSecurity[3].fHeading = 238.8610
psSetSecurity[3].iConversationTimer = -1
psSetSecurity[3].ModelName = mnSecurityPed
#IF IS_DEBUG_BUILD
psSetSecurity[3].sDebugName = "Set 3"
#ENDIF
psSetSecurity[4].vPosition = <<-1149.7146, -512.0564, 32.6042>>
psSetSecurity[4].fHeading = 240.8322
psSetSecurity[4].iConversationTimer = -1
psSetSecurity[4].ModelName = mnSecurityPed
#IF IS_DEBUG_BUILD
psSetSecurity[4].sDebugName = "Set 4"
#ENDIF
psNorthGateSecurity[0].vPosition = <<-1066.0760, -477.5667, 35.6377>>
psNorthGateSecurity[0].fHeading = 209.0050
psNorthGateSecurity[0].ModelName = mnSecurityPed
#IF IS_DEBUG_BUILD
psNorthGateSecurity[0].sDebugName = "NorthGate 0"
#ENDIF
psSouthGateSecurity[0].vPosition = <<-1209.3595, -569.9016, 26.3524>>
psSouthGateSecurity[0].fHeading = 222.0723
psSouthGateSecurity[0].ModelName = mnSecurityPed
#IF IS_DEBUG_BUILD
psSouthGateSecurity[0].sDebugName = "SouthGate 0"
#ENDIF
psMeltdownSecurity[0].vPosition = <<-1118.7767, -440.0241, 35.2380>>
psMeltdownSecurity[0].fHeading = 120.6108
psMeltdownSecurity[0].ModelName = mnSecurityPed
#IF IS_DEBUG_BUILD
psMeltdownSecurity[0].sDebugName = "Meltdown 0"
#ENDIF
ENDPROC
PROC INITIALISE_ARRAYS_FOR_SECURITY_SPAWNPOINTS()
SecuritySpawned[0] = FALSE
SecuritySpawnPoints[0].vPosition = <<-1098.1554, -540.3402, 34.3502>>
SecuritySpawnPoints[0].fHeading = 297.8740
SecuritySpawned[1] = FALSE
SecuritySpawnPoints[1].vPosition = <<-1095.3468, -492.3910, 35.0424>>
SecuritySpawnPoints[1].fHeading = 205.2367
SecuritySpawned[2] = FALSE
SecuritySpawnPoints[2].vPosition = <<-1124.9238, -499.1039, 33.7600>>
SecuritySpawnPoints[2].fHeading = 121.9869
SecuritySpawned[3] = FALSE
SecuritySpawnPoints[3].vPosition = <<-1068.7140, -503.8521, 35.1105>>
SecuritySpawnPoints[3].fHeading = 28.3751
SecuritySpawned[4] = FALSE
SecuritySpawnPoints[4].vPosition = <<-1104.8634, -485.5148, 35.0221>>
SecuritySpawnPoints[4].fHeading = 299.0859
SecuritySpawned[5] = FALSE
SecuritySpawnPoints[5].vPosition = <<-1091.2770, -549.1374, 33.9233>>
SecuritySpawnPoints[5].fHeading = 304.0113
SecuritySpawned[6] = FALSE
SecuritySpawnPoints[6].vPosition = <<-1134.6398, -530.8317, 31.9306>>
SecuritySpawnPoints[6].fHeading = 120.3262
SecuritySpawned[7] = FALSE
SecuritySpawnPoints[7].vPosition = <<-1124.9128, -504.2563, 33.6356>>
SecuritySpawnPoints[7].fHeading = 299.8388
ENDPROC
/// PURPOSE:
/// Populates structs and arrays with data such as vectors, model names etc for a specified mission stage.
/// PARAMS:
/// eStage - Mission stage to initialise arrays for.
PROC INITIALISE_ARRAYS_FOR_MISSION_STAGE(MISSION_STAGES eStage)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Initialising arrays for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
INITIALISE_ARRAYS_FOR_SECURITY()
INITIALISE_ARRAYS_FOR_FILM_CREW()
INITIALISE_ARRAYS_FOR_SECURITY_SPAWNPOINTS()
SWITCH eStage
CASE MISSION_STAGE_GET_TO_ACTOR
sMissionPosition.vPosition = << -1085.6110, -428.5754, 35.6276 >>
sMissionPosition.fHeading = 118.9753
vsPlayersCar.vPosition = << -1180.1277, -505.9280, 34.5664 >>
vsPlayersCar.fHeading = 246.5268
vsPlayersCar.ModelName = JB700
psActor.vPosition = << -1109.36, -503.38, 34.26 >>
psActor.fHeading = 116.5653
psActor.ModelName = U_M_M_SPYACTOR
psAssistant.vPosition = << -1112.3136, -504.5007, 34.0635 >> //aligned << -1112.14, -504.91, 34.0635 >>
psAssistant.fHeading = 296.0018
psAssistant.ModelName = A_F_Y_HIPSTER_04
osTrailerDoor.vPosition = << -1113.92, -502.832, 35.882 >>
osTrailerDoor.vRotation = << 0.0, 0.0, -84.1778 >> //trailer door in open rotation
osTrailerDoor.ModelName = PROP_A_TRAILER_DOOR_01
BREAK
CASE MISSION_STAGE_CUTSCENE_TRAILER
sMissionPosition.vPosition = << -1109.6000, -502.7238, 34.2594 >>
sMissionPosition.fHeading = 113.6969
vsPlayersCar.vPosition = << -1180.1277, -505.9280, 34.5664 >>
vsPlayersCar.fHeading = 246.5268
vsPlayersCar.ModelName = JB700
psActor.vPosition = << -1105.2350, -491.2045, 34.8387 >> //coords will place the ped inside a building
psActor.fHeading = 206.1382 //this is fine as he has to be hidden
psActor.ModelName = U_M_M_SPYACTOR
osTrailerDoor.vPosition = << -1113.92, -502.832, 35.882 >>
osTrailerDoor.vRotation = << 0.0, 0.0, -84.1778 >> //trailer door in open rotation
osTrailerDoor.ModelName = PROP_A_TRAILER_DOOR_01
BREAK
CASE MISSION_STAGE_GET_TO_CAR
sMissionPosition.vPosition = << -1115.4556, -505.5281, 33.9062 >>
sMissionPosition.fHeading = 117.7305
vsPlayersCar.vPosition = << -1180.1277, -505.9280, 34.5664 >>
vsPlayersCar.fHeading = 246.5268
vsPlayersCar.ModelName = JB700
psActor.vPosition = <<-1116.6180, -502.8903, 34.8063>>
psActor.fHeading = 304.2335
psActor.ModelName = U_M_M_SPYACTOR
osTrailerDoor.vPosition = <<-1113.9050, -502.8200, 35.882>>
osTrailerDoor.vRotation = << 0.0, 0.0, 27 >> //trailer door in closed rotation
osTrailerDoor.ModelName = PROP_A_TRAILER_DOOR_01
BREAK
CASE MISSION_STAGE_ESCAPE_FILM_SET
sMissionPosition.vPosition = << -1180.1184, -504.4346, 34.5669 >>
sMissionPosition.fHeading = 252.0904
vsPlayersCar.vPosition = << -1180.1277, -505.9280, 34.5664 >>
vsPlayersCar.fHeading = 246.5268
vsPlayersCar.ModelName = JB700
psActor.vPosition = << -1105.23, -491.20, 34.83 >> //coords inside a building
psActor.fHeading = 206.1382 //this is fine as ped has to be hidden
psActor.ModelName = U_M_M_SPYACTOR //ped will play animation afterwards
osTrailerDoor.vPosition = << -1113.92, -502.832, 35.882 >>
osTrailerDoor.vRotation = << 0.0, 0.0, -84.1778 >> //trailer door in open rotation
osTrailerDoor.ModelName = PROP_A_TRAILER_DOOR_01
BREAK
CASE MISSION_STAGE_DELIVER_CAR
sMissionPosition.vPosition = << 126.2967, -912.3267, 29.0396 >>
sMissionPosition.fHeading = 160.9179
vsPlayersCar.vPosition = << 124.8845, -913.1312, 28.9710 >>
vsPlayersCar.fHeading = 161.6850
vsPlayersCar.ModelName = JB700
BREAK
CASE MISSION_STAGE_CUTSCENE_END
sMissionPosition.vPosition = << 481.8158, -1318.6210, 28.2052 >>
sMissionPosition.fHeading = 119.3001
vsPlayersCar.vPosition = << 480.7779, -1317.7502, 28.2059 >>
vsPlayersCar.fHeading = 116.0750
vsPlayersCar.ModelName = JB700
BREAK
#IF IS_DEBUG_BUILD
CASE MISSION_STAGE_EJECTOR_TEST
sMissionPosition.vPosition = << 126.2967, -912.3267, 29.0396 >>
sMissionPosition.fHeading = 160.9179
vsPlayersCar.vPosition = << 124.8845, -913.1312, 28.9710 >>
vsPlayersCar.fHeading = 161.6850
vsPlayersCar.ModelName = JB700
psActress.vPosition = << -1181.3146, -506.7412, 34.5669 >>
psActress.fHeading = 253.9266
psActress.ModelName = U_F_Y_SPYACTRESS
BREAK
#ENDIF
ENDSWITCH
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished initialising arrays for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
ENDPROC
PROC BUILD_REQUEST_BANK_FOR_MISSION_STAGE(MISSION_STAGES eStage)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Building request bank for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
SWITCH eStage
CASE MISSION_STAGE_GET_TO_ACTOR
IF NOT DOES_ENTITY_EXIST(vsPlayersCar.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsPlayersCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psActor.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psActor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(osTrailerDoor.ObjectIndex)
ADD_MODEL_REQUEST_TO_ARRAY(osTrailerDoor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_TRAILER
IF NOT DOES_ENTITY_EXIST(vsPlayersCar.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsPlayersCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psActor.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psActor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(osTrailerDoor.ObjectIndex)
ADD_MODEL_REQUEST_TO_ARRAY(osTrailerDoor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
BREAK
CASE MISSION_STAGE_GET_TO_CAR
IF NOT DOES_ENTITY_EXIST(vsPlayersCar.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsPlayersCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(osTrailerDoor.ObjectIndex)
ADD_MODEL_REQUEST_TO_ARRAY(osTrailerDoor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
BREAK
CASE MISSION_STAGE_ESCAPE_FILM_SET
IF NOT DOES_ENTITY_EXIST(vsPlayersCar.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsPlayersCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(osTrailerDoor.ObjectIndex)
ADD_MODEL_REQUEST_TO_ARRAY(osTrailerDoor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
ADD_MODEL_REQUEST_TO_ARRAY(mnSpike, MissionModels, MAX_MODELS, iModelsRequested)
BREAK
CASE MISSION_STAGE_DELIVER_CAR
IF NOT DOES_ENTITY_EXIST(vsPlayersCar.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsPlayersCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
ADD_MODEL_REQUEST_TO_ARRAY(mnSpike, MissionModels, MAX_MODELS, iModelsRequested)
BREAK
CASE MISSION_STAGE_CUTSCENE_END
IF NOT DOES_ENTITY_EXIST(vsPlayersCar.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsPlayersCar.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_MISSION_STAGE_LOADED(MISSION_STAGES eStage, INT &iSetupProgress, BOOL &bStageLoaded, BOOL &bStageSkippedTo, BOOL &bStageReplayed)
//handle initial mission setup
//only run this once, when the mission first loads
IF ( iSetupProgress = 0 )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting initial mission loading.")
#ENDIF
CLEAR_HELP()
CLEAR_PRINTS()
REQUEST_ADDITIONAL_TEXT("CAR4", MISSION_TEXT_SLOT)
REQUEST_ADDITIONAL_TEXT("CST4AUD", MISSION_DIALOGUE_TEXT_SLOT)
IF NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
OR NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_DIALOGUE_TEXT_SLOT)
WAIT(0)
ENDIF
REGISTER_SCRIPT_WITH_AUDIO(TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(JB700, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(mnSecurityCar, TRUE)
SET_PED_MODEL_IS_SUPPRESSED(mnSecurityPed, TRUE)
SET_PED_MODEL_IS_SUPPRESSED(U_M_M_SPYACTOR, TRUE)
SET_PED_MODEL_IS_SUPPRESSED(U_F_Y_SPYACTRESS, TRUE)
SET_PED_MODEL_IS_SUPPRESSED(U_M_M_FILMDIRECTOR, TRUE)
//setup relationship groups
ADD_RELATIONSHIP_GROUP("FilmCrew", rgFilmCrew)
//film crew
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rgFilmCrew, rgFilmCrew)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rgFilmCrew, RELGROUPHASH_COP)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rgFilmCrew, RELGROUPHASH_SECURITY_GUARD)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, rgFilmCrew, RELGROUPHASH_PLAYER)
//global SECURITY_GUARD relationship group
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_SECURITY_GUARD, rgFilmCrew)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_DISLIKE, RELGROUPHASH_SECURITY_GUARD, RELGROUPHASH_PLAYER)
SET_IGNORE_NO_GPS_FLAG(TRUE)
SET_GPS_FLAGS(GPS_FLAG_NONE, 15.0)
bHasOutfitChangedBeforeMission = GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(CHAR_FRANKLIN) //ensure bChange is set to the state of player has changed outfit at the start of the mission
SUPPRESS_EMERGENCY_CALLS()
DISABLE_TAXI_HAILING(TRUE)
SUPPRESS_RESTRICTED_AREA_WANTED_LEVEL(AC_MOVIE_STUDIO)
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(g_sAutoDoorData[ENUM_TO_INT(AUTODOOR_HAYES_GARAGE)].doorID)
ADD_DOOR_TO_SYSTEM(g_sAutoDoorData[ENUM_TO_INT(AUTODOOR_HAYES_GARAGE)].doorID,
g_sAutoDoorData[ENUM_TO_INT(AUTODOOR_HAYES_GARAGE)].model,
g_sAutoDoorData[ENUM_TO_INT(AUTODOOR_HAYES_GARAGE)].coords)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding door AUTODOOR_HAYES_GARAGE to system.")
#ENDIF
ENDIF
IF IS_DOOR_REGISTERED_WITH_SYSTEM(g_sAutoDoorData[ENUM_TO_INT(AUTODOOR_HAYES_GARAGE)].doorID)
SET_SCRIPT_UPDATE_DOOR_AUDIO(g_sAutoDoorData[ENUM_TO_INT(AUTODOOR_HAYES_GARAGE)].doorID, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling SET_SCRIPT_UPDATE_DOOR_AUDIO for AUTODOOR_HAYES_GARAGE.")
#ENDIF
ENDIF
IF IS_REPEAT_PLAY_ACTIVE()
bStageReplayed = TRUE
ENDIF
IF IS_SCREEN_FADED_OUT()
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
ELSE
SET_WEATHER_TYPE_OVERTIME_PERSIST("EXTRASUNNY", 15.0)
ENDIF
iEjectorScreamSoundID = GET_SOUND_ID()
//fix for B*2066186, some poor soul decided to add a van vehicle generator exactly where the green screen scene takes place, block it on mission
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<< -1130.463867 - 6.0, -455.577698 - 6.0, 36.564621 - 3.0 >>, << -1130.463867 + 6.0, -455.577698 + 6.0, 36.564621 + 3.0 >>, FALSE)
REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(<< -1130.463867 - 6.0, -455.577698 - 6.0, 36.564621 - 3.0 >>, << -1130.463867 + 6.0, -455.577698 + 6.0, 36.564621 + 3.0 >>)
SET_STUNT_JUMPS_CAN_TRIGGER(FALSE)
#IF IS_DEBUG_BUILD
PRINT_GLOBAL_BIT_SET()
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_ANIMATION_ARRAY(MissionAnimations, iAnimationsRequested)
//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
//handle resetting flags and the global bit set variable depending on mission stage skipped to
SWITCH eStage
CASE MISSION_STAGE_GET_TO_ACTOR
bPlayerEnteredTargetVehicle = FALSE
RESET_GLOBAL_BIT_SET()
BREAK
CASE MISSION_STAGE_CUTSCENE_TRAILER
bPlayerEnteredTargetVehicle = FALSE
BREAK
CASE MISSION_STAGE_GET_TO_CAR
bPlayerEnteredTargetVehicle = FALSE
BREAK
CASE MISSION_STAGE_ESCAPE_FILM_SET
bPlayerEnteredTargetVehicle = TRUE
BREAK
CASE MISSION_STAGE_DELIVER_CAR
bPlayerEnteredTargetVehicle = TRUE
BREAK
CASE MISSION_STAGE_CUTSCENE_END
bPlayerEnteredTargetVehicle = TRUE
BREAK
ENDSWITCH
WARP_PED(PLAYER_PED_ID(), sMissionPosition.vPosition, sMissionPosition.fHeading, FALSE, TRUE, FALSE)
IF ( bStageSkippedTo = TRUE )
//pin the interior at player start position for stages starting in interiors or requiring interiors
IF ( eStage = MISSION_STAGE_CUTSCENE_END )
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())
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
STOP_FIRE_IN_RANGE(sMissionPosition.vPosition, 1000.0)
REMOVE_DECALS_IN_RANGE(sMissionPosition.vPosition, 1000.0)
REMOVE_PARTICLE_FX_IN_RANGE(sMissionPosition.vPosition, 1000.0)
CLEAR_AREA(sMissionPosition.vPosition, 1000.0, TRUE)
CLEAR_AREA_OF_VEHICLES(sMissionPosition.vPosition, 1000.0)
CLEAR_AREA_OF_OBJECTS(<< -1051.45, -477.70, 35.99 >>, 20.0, CLEAROBJ_FLAG_FORCE | CLEAROBJ_FLAG_INCLUDE_DOORS) //north gate barriers
CLEAR_AREA_OF_OBJECTS(<< -1209.42, -577.77, 26.67 >>, 20.0, CLEAROBJ_FLAG_FORCE | CLEAROBJ_FLAG_INCLUDE_DOORS) //south gate barriers
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
bSecurityAlerted = FALSE //reset security alerted flag
iPlayerLethalKills = 0 //reset player kill counters
iPlayerStealthKills = 0
iPlayerTakedownKills = 0
fDistanceFromPlayerToTargetVehicle = 0 //reset the distance check on skips
sLabelDCAR = "CAR4_DCAR"
sLabelGENGETIN = "CMN_GENGETIN"
sLabelGENGETBCK = "CMN_GENGETBCK"
CST4_DSC_TRIGGERED = FALSE
CST4_DSG_TRIGGERED = FALSE
CST4_DSW_TRIGGERED = FALSE
CST4_DBRAN_1_TRIGGERED = FALSE
CST4_DBRAN_2_TRIGGERED = FALSE
CST4_DBRAN_3_TRIGGERED = FALSE
CST4_DBRAN_4_TRIGGERED = FALSE
CST4_DBRAN_5_TRIGGERED = FALSE
CST4_DSCAR_TRIGGERED = FALSE
CST4_DSSET1_TRIGGERED = FALSE
CST4_DSSET2_TRIGGERED = FALSE
CST4_DCHAT1_TRIGGERED = FALSE
CST4_DCHAT2_TRIGGERED = FALSE
CST4_DSG_PLAYING_TRIGGERED = FALSE
ENDIF
SWITCH eStage
CASE MISSION_STAGE_GET_TO_ACTOR
CASE MISSION_STAGE_CUTSCENE_TRAILER
CASE MISSION_STAGE_GET_TO_CAR
CASE MISSION_STAGE_ESCAPE_FILM_SET
IF ( bFilmStudioAmbientPedsBlocked = FALSE )
SET_SCENARIO_GROUP_ENABLED("MOVIE_STUDIO_SECURITY", FALSE) //disable ambient security guards
CREATE_PED_NON_CREATION_AREA(<< -1149.78, -508.89, 40.84 >>, << 72.0, 52.0, 16.0 >>) //block peds arounds film set
IF ( ScenarioBlockingArea1 = NULL )
ScenarioBlockingArea1 = CREATE_SCENARIO_BLOCKING_AREA(<< -1149.78, -508.89, 40.84 >>, << 72.0, 52.0, 16.0 >>) //big area
ENDIF
IF ( ScenarioBlockingArea2 = NULL )
ScenarioBlockingArea2 = CREATE_SCENARIO_BLOCKING_AREA(<< -1073.38, -476.93, 37.63 >>, << 20.0, 20.0, 4.0>>) //north gate
ENDIF
CLEAR_AREA_OF_PEDS(<< -1149.78, -508.89, 40.84 >>, 90.0) //big area
CLEAR_AREA_OF_PEDS(<< -1080.52, -479.68, 35.69>>, 20.0) //north gate
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Added film studio scenario blocking areas and non ped creation areas.")
#ENDIF
bFilmStudioAmbientPedsBlocked = TRUE
ENDIF
BREAK
DEFAULT
//
BREAK
ENDSWITCH
IF ( bStageReplayed = TRUE )
START_REPLAY_SETUP(sMissionPosition.vPosition, sMissionPosition.fHeading)
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()
//handle loading of mission animations that 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_ANIMATIONS_LOADED(MissionAnimations, iAnimationsRequested)
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_GET_TO_ACTOR
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsPlayersCar, FALSE, TRUE, NO_CHARACTER)
FailFlags[MISSION_FAIL_CAR_DEAD] = TRUE
FailFlags[MISSION_FAIL_CAR_UNDRIVABLE] = TRUE
FailFlags[MISSION_FAIL_STUDIO_LEFT_BEHIND] = TRUE
SET_VEHICLE_AS_RESTRICTED(vsPlayersCar.VehicleIndex, 0)
IF IS_VEHICLE_DRIVEABLE(vsPlayersCar.VehicleIndex)
SET_VEHICLE_STRONG(vsPlayersCar.VehicleIndex, TRUE)
SET_VEHICLE_TYRES_CAN_BURST(vsPlayersCar.VehicleIndex, FALSE)
ENDIF
IF HAS_MISSION_PED_BEEN_CREATED(psActor, FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE)
AND HAS_MISSION_PED_BEEN_CREATED(psAssistant, FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE)
AND HAS_MISSION_PED_BEEN_CREATED(psActress, FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE, FALSE, vsPlayersCar.VehicleIndex, VS_FRONT_RIGHT)
IF NOT IS_PED_INJURED(psActor.PedIndex)
SET_PED_COMPONENT_VARIATION(psActor.PedIndex, PED_COMP_LEG, 0, 0, 0)
SET_PED_COMPONENT_VARIATION(psActor.PedIndex, PED_COMP_TORSO, 0, 0, 0)
ENDIF
IF NOT IS_PED_INJURED(psAssistant.PedIndex)
SET_PED_COMPONENT_VARIATION(psAssistant.PedIndex, PED_COMP_HEAD, 1, 1, 0) //(head)
SET_PED_COMPONENT_VARIATION(psAssistant.PedIndex, PED_COMP_HAIR, 1, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(psAssistant.PedIndex, PED_COMP_TORSO, 0, 2, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psAssistant.PedIndex, PED_COMP_LEG, 0, 0, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psAssistant.PedIndex, PED_COMP_HAND, 0, 0, 0) //(hand)
ENDIF
IF HAS_MISSION_OBJECT_BEEN_CREATED(osTrailerDoor, TRUE)
AND HAS_MISSION_OBJECT_BEEN_CREATED(osPropLamp, FALSE)
IF DOES_ENTITY_EXIST(osTrailerDoor.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osTrailerDoor.ObjectIndex)
SET_ENTITY_INVINCIBLE(osTrailerDoor.ObjectIndex, TRUE)
ENDIF
ENDIF
//handle player's mission start vehicle
VEHICLE_INDEX LastPlayerVehicleIndex
LastPlayerVehicleIndex = GET_PLAYERS_LAST_VEHICLE()
IF IS_REPLAY_START_VEHICLE_AVAILABLE()
IF DOES_ENTITY_EXIST(LastPlayerVehicleIndex)
AND IS_VEHICLE_DRIVEABLE(LastPlayerVehicleIndex)
IF NOT IS_ENTITY_A_MISSION_ENTITY(LastPlayerVehicleIndex)
SET_ENTITY_AS_MISSION_ENTITY(LastPlayerVehicleIndex)
ENDIF
TRACK_VEHICLE_FOR_IMPOUND(LastPlayerVehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(LastPlayerVehicleIndex)
ENDIF
ENDIF
iSetupProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_TRAILER
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsPlayersCar, FALSE, TRUE, NO_CHARACTER)
FailFlags[MISSION_FAIL_CAR_DEAD] = TRUE
FailFlags[MISSION_FAIL_CAR_UNDRIVABLE] = TRUE
FailFlags[MISSION_FAIL_CAR_LEFT_BEHIND] = TRUE
SET_VEHICLE_AS_RESTRICTED(vsPlayersCar.VehicleIndex, 0)
IF IS_VEHICLE_DRIVEABLE(vsPlayersCar.VehicleIndex)
SET_VEHICLE_STRONG(vsPlayersCar.VehicleIndex, TRUE)
SET_VEHICLE_TYRES_CAN_BURST(vsPlayersCar.VehicleIndex, FALSE)
ENDIF
IF HAS_MISSION_PED_BEEN_CREATED(psActor, FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE)
IF NOT IS_PED_INJURED(psActor.PedIndex)
SET_PED_COMPONENT_VARIATION(psActor.PedIndex, PED_COMP_LEG, 0, 0, 0)
SET_PED_COMPONENT_VARIATION(psActor.PedIndex, PED_COMP_TORSO, 0, 0, 0)
ENDIF
IF HAS_MISSION_OBJECT_BEEN_CREATED(osTrailerDoor, TRUE)
AND HAS_MISSION_OBJECT_BEEN_CREATED(osPropLamp, FALSE)
IF DOES_ENTITY_EXIST(osTrailerDoor.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osTrailerDoor.ObjectIndex)
SET_ENTITY_INVINCIBLE(osTrailerDoor.ObjectIndex, TRUE)
ENDIF
ENDIF
iSetupProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_GET_TO_CAR
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsPlayersCar, FALSE, TRUE, NO_CHARACTER)
FailFlags[MISSION_FAIL_CAR_DEAD] = TRUE
FailFlags[MISSION_FAIL_CAR_UNDRIVABLE] = TRUE
FailFlags[MISSION_FAIL_CAR_LEFT_BEHIND] = TRUE
SET_VEHICLE_AS_RESTRICTED(vsPlayersCar.VehicleIndex, 0)
IF IS_VEHICLE_DRIVEABLE(vsPlayersCar.VehicleIndex)
SET_VEHICLE_STRONG(vsPlayersCar.VehicleIndex, TRUE)
SET_VEHICLE_TYRES_CAN_BURST(vsPlayersCar.VehicleIndex, FALSE)
SET_VEHICLE_ENGINE_ON(vsPlayersCar.VehicleIndex, TRUE, TRUE)
ENDIF
SET_RADIO_TO_STATION_INDEX(255)
IF HAS_MISSION_OBJECT_BEEN_CREATED(osTrailerDoor, TRUE)
AND HAS_MISSION_OBJECT_BEEN_CREATED(osPropLamp, FALSE)
IF DOES_ENTITY_EXIST(osTrailerDoor.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osTrailerDoor.ObjectIndex)
SET_ENTITY_INVINCIBLE(osTrailerDoor.ObjectIndex, TRUE)
ENDIF
ENDIF
IF HAS_MISSION_PED_BEEN_CREATED(psActor, FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE)
IF NOT IS_PED_INJURED(psActor.PedIndex)
SET_PED_COMPONENT_VARIATION(psActor.PedIndex, PED_COMP_LEG, 1, 0, 0)
SET_PED_COMPONENT_VARIATION(psActor.PedIndex, PED_COMP_TORSO, 1, 0, 0)
ENDIF
IF HAS_MISSION_PED_BEEN_CREATED(psActress, FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE, FALSE, vsPlayersCar.VehicleIndex, VS_FRONT_RIGHT)
GO_TO_PED_STATE(psActress, PED_STATE_SITTING_IN_CAR)
iSetupProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_ESCAPE_FILM_SET
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsPlayersCar, FALSE, TRUE, NO_CHARACTER)
FailFlags[MISSION_FAIL_CAR_DEAD] = TRUE
FailFlags[MISSION_FAIL_CAR_UNDRIVABLE] = TRUE
FailFlags[MISSION_FAIL_CAR_LEFT_BEHIND] = TRUE
FailFlags[MISSION_FAIL_COPS_AT_GARAGE] = TRUE
FailFlags[MISSION_FAIL_ACTRESS_AT_GARAGE] = TRUE
FailFlags[MISSION_FAIL_SECURITY_AT_GARAGE] = TRUE
SET_VEHICLE_AS_RESTRICTED(vsPlayersCar.VehicleIndex, 0)
IF IS_VEHICLE_DRIVEABLE(vsPlayersCar.VehicleIndex)
SET_VEHICLE_STRONG(vsPlayersCar.VehicleIndex, TRUE)
SET_VEHICLE_TYRES_CAN_BURST(vsPlayersCar.VehicleIndex, FALSE)
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, FALSE)
ENDIF
IF HAS_MISSION_OBJECT_BEEN_CREATED(osTrailerDoor, TRUE)
AND HAS_MISSION_OBJECT_BEEN_CREATED(osPropLamp, FALSE)
IF DOES_ENTITY_EXIST(osTrailerDoor.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osTrailerDoor.ObjectIndex)
SET_ENTITY_INVINCIBLE(osTrailerDoor.ObjectIndex, TRUE)
ENDIF
ENDIF
IF IS_BIT_SET(g_iCarSteal3AgentBitSet, ACTRESS_FLED_CAR)
iSetupProgress++
ELSE
IF HAS_MISSION_PED_BEEN_CREATED(psActress, FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE, FALSE, vsPlayersCar.VehicleIndex, VS_FRONT_RIGHT)
GO_TO_PED_STATE(psActress, PED_STATE_SITTING_IN_CAR)
iSetupProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_DELIVER_CAR
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsPlayersCar, FALSE, TRUE, NO_CHARACTER)
FailFlags[MISSION_FAIL_CAR_DEAD] = TRUE
FailFlags[MISSION_FAIL_CAR_UNDRIVABLE] = TRUE
FailFlags[MISSION_FAIL_CAR_LEFT_BEHIND] = TRUE
SET_VEHICLE_AS_RESTRICTED(vsPlayersCar.VehicleIndex, 0)
IF IS_VEHICLE_DRIVEABLE(vsPlayersCar.VehicleIndex)
SET_VEHICLE_STRONG(vsPlayersCar.VehicleIndex, FALSE)
SET_VEHICLE_TYRES_CAN_BURST(vsPlayersCar.VehicleIndex, FALSE)
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, FALSE)
ENDIF
FailFlags[MISSION_FAIL_DEVIN_DEAD] = TRUE
FailFlags[MISSION_FAIL_DEVIN_ATTACKED] = TRUE
FailFlags[MISSION_FAIL_COPS_AT_GARAGE] = TRUE
iSetupProgress++
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_END
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsPlayersCar, FALSE, TRUE, NO_CHARACTER)
FailFlags[MISSION_FAIL_CAR_DEAD] = TRUE
FailFlags[MISSION_FAIL_CAR_UNDRIVABLE] = TRUE
FailFlags[MISSION_FAIL_CAR_LEFT_BEHIND] = TRUE
SET_VEHICLE_AS_RESTRICTED(vsPlayersCar.VehicleIndex, 0)
IF IS_VEHICLE_DRIVEABLE(vsPlayersCar.VehicleIndex)
SET_VEHICLE_STRONG(vsPlayersCar.VehicleIndex, FALSE)
SET_VEHICLE_TYRES_CAN_BURST(vsPlayersCar.VehicleIndex, FALSE)
ENDIF
iSetupProgress++
ENDIF
BREAK
#IF IS_DEBUG_BUILD
CASE MISSION_STAGE_EJECTOR_TEST
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsPlayersCar, FALSE, TRUE, NO_CHARACTER)
IF HAS_MISSION_PED_BEEN_CREATED(psActress, FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE, FALSE, vsPlayersCar.VehicleIndex, VS_FRONT_RIGHT)
iSetupProgress++
ENDIF
ENDIF
BREAK
#ENDIF
ENDSWITCH
ENDIF
//handle player's outfit
IF ( iSetupProgress = 5 )
SWITCH eStage
CASE MISSION_STAGE_GET_TO_ACTOR
CASE MISSION_STAGE_CUTSCENE_TRAILER
IF IS_REPEAT_PLAY_ACTIVE()
OR IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_WHITE_TUXEDO)
SET_PLAYER_PED_OUTFIT_TO_TUXEDO(FALSE)
ENDIF
BREAK
CASE MISSION_STAGE_GET_TO_CAR
bPlayerWearingTuxedo = TRUE
SET_PLAYER_PED_OUTFIT_TO_TUXEDO(TRUE)
IF NOT IS_BIT_SET(g_iCarSteal3AgentBitSet, PLAYER_GOT_TUXEDO)
SET_GLOBAL_BIT_SET(PLAYER_GOT_TUXEDO)
ENDIF
BREAK
DEFAULT
IF IS_BIT_SET(g_iCarSteal3AgentBitSet, PLAYER_GOT_TUXEDO)
bPlayerWearingTuxedo = TRUE
SET_PLAYER_PED_OUTFIT_TO_TUXEDO(TRUE)
ELSE
bPlayerWearingTuxedo = FALSE
SET_PLAYER_PED_OUTFIT_TO_TUXEDO(FALSE)
ENDIF
BREAK
ENDSWITCH
iSetupProgress++
ENDIF
//handle adding mission peds for dialogue depending on mission stage
IF ( iSetupProgress = 6 )
REMOVE_PED_FOR_DIALOGUE(CST4Conversation, 0) //Devin/Toilet ped
REMOVE_PED_FOR_DIALOGUE(CST4Conversation, 1) //Franklin
REMOVE_PED_FOR_DIALOGUE(CST4Conversation, 2) //Molly
REMOVE_PED_FOR_DIALOGUE(CST4Conversation, 3) //Actress
REMOVE_PED_FOR_DIALOGUE(CST4Conversation, 6) //Actor
REMOVE_PED_FOR_DIALOGUE(CST4Conversation, 7) //Film director
REMOVE_PED_FOR_DIALOGUE(CST4Conversation, 4) //Meltdown scene actor A
REMOVE_PED_FOR_DIALOGUE(CST4Conversation, 5) //Meltdown scene actor B
REMOVE_PED_FOR_DIALOGUE(CST4Conversation, 8) //Meltodown scene director
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
ADD_PED_FOR_DIALOGUE(CST4Conversation, 1, PLAYER_PED_ID(), "FRANKLIN")
ENDIF
SWITCH eStage
CASE MISSION_STAGE_GET_TO_ACTOR
ADD_PED_FOR_DIALOGUE(CST4Conversation, 2, NULL, "MOLLY")
IF NOT IS_PED_INJURED(psActor.PedIndex)
ADD_PED_FOR_DIALOGUE(CST4Conversation, 6, psActor.PedIndex, "CST4ACTOR")
ENDIF
BREAK
CASE MISSION_STAGE_GET_TO_CAR
IF NOT IS_PED_INJURED(psActress.PedIndex)
ADD_PED_FOR_DIALOGUE(CST4Conversation, 3, psActress.PedIndex, "CST4ACTRESS")
ENDIF
BREAK
CASE MISSION_STAGE_ESCAPE_FILM_SET
ADD_PED_FOR_DIALOGUE(CST4Conversation, 2, NULL, "MOLLY")
IF NOT IS_PED_INJURED(psActress.PedIndex)
ADD_PED_FOR_DIALOGUE(CST4Conversation, 3, psActress.PedIndex, "CST4ACTRESS")
ENDIF
IF NOT IS_PED_INJURED( psFilmCrew[FCP_DIRECTOR].PedIndex)
ADD_PED_FOR_DIALOGUE(CST4Conversation, 7, psFilmCrew[FCP_DIRECTOR].PedIndex, "CST4DIRECTOR")
ENDIF
BREAK
#IF IS_DEBUG_BUILD
CASE MISSION_STAGE_EJECTOR_TEST
IF NOT IS_PED_INJURED(psActress.PedIndex)
ADD_PED_FOR_DIALOGUE(CST4Conversation, 3, psActress.PedIndex, "CST4ACTRESS")
ENDIF
BREAK
#ENDIF
ENDSWITCH
iSetupProgress++
ENDIF
IF ( iSetupProgress = 7 )
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE) //all shops available by default
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_01_AP, TRUE) //mod shops are not available on this mission
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_05_ID2, TRUE)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_06_BT1, TRUE)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_07_CS1, TRUE)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_08_CS6, TRUE)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_SUPERMOD, TRUE)
REGISTER_STUDIO_GATES()
LOCK_STUDIO_GATES()
SET_MAX_WANTED_LEVEL(5)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_CREATE_RANDOM_COPS(TRUE)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
SWITCH eStage
CASE MISSION_STAGE_GET_TO_ACTOR
CASE MISSION_STAGE_CUTSCENE_TRAILER
CASE MISSION_STAGE_GET_TO_CAR
SET_IGNORE_NO_GPS_FLAG(TRUE)
SET_MAX_WANTED_LEVEL(0)
SET_WANTED_LEVEL_MULTIPLIER(0.0)
SET_CREATE_RANDOM_COPS(FALSE)
BREAK
CASE MISSION_STAGE_ESCAPE_FILM_SET
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(TRUE) //all shops are unavailable
SET_IGNORE_NO_GPS_FLAG(TRUE)
SET_MAX_WANTED_LEVEL(0)
SET_WANTED_LEVEL_MULTIPLIER(0.0)
SET_CREATE_RANDOM_COPS(FALSE)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_DRIVING)
BREAK
CASE MISSION_STAGE_DELIVER_CAR
CASE MISSION_STAGE_CUTSCENE_END
SET_IGNORE_NO_GPS_FLAG(FALSE)
BREAK
ENDSWITCH
//handle garage doors
SWITCH eStage
CASE MISSION_STAGE_GET_TO_ACTOR
CASE MISSION_STAGE_CUTSCENE_TRAILER
CASE MISSION_STAGE_GET_TO_CAR
SET_DOOR_STATE(DOORNAME_CARSTEAL_GARAGE_S, DOORSTATE_LOCKED)
IF IS_DOOR_REGISTERED_WITH_SYSTEM(g_sAutoDoorData[ENUM_TO_INT(AUTODOOR_HAYES_GARAGE)].doorID )
SET_SCRIPT_UPDATE_DOOR_AUDIO(g_sAutoDoorData[ENUM_TO_INT(AUTODOOR_HAYES_GARAGE)].doorID , TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling SET_SCRIPT_UPDATE_DOOR_AUDIO for AUTODOOR_HAYES_GARAGE.")
#ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_ESCAPE_FILM_SET
SET_DOOR_STATE(DOORNAME_CARSTEAL_GARAGE_S, DOORSTATE_LOCKED)
IF IS_DOOR_REGISTERED_WITH_SYSTEM(g_sAutoDoorData[ENUM_TO_INT(AUTODOOR_HAYES_GARAGE)].doorID )
SET_SCRIPT_UPDATE_DOOR_AUDIO(g_sAutoDoorData[ENUM_TO_INT(AUTODOOR_HAYES_GARAGE)].doorID , TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling SET_SCRIPT_UPDATE_DOOR_AUDIO for AUTODOOR_HAYES_GARAGE.")
#ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_DELIVER_CAR
CASE MISSION_STAGE_CUTSCENE_END
SET_DOOR_STATE(DOORNAME_CARSTEAL_GARAGE_S, DOORSTATE_LOCKED)
IF IS_DOOR_REGISTERED_WITH_SYSTEM(g_sAutoDoorData[ENUM_TO_INT(AUTODOOR_HAYES_GARAGE)].doorID )
SET_SCRIPT_UPDATE_DOOR_AUDIO(g_sAutoDoorData[ENUM_TO_INT(AUTODOOR_HAYES_GARAGE)].doorID , TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling SET_SCRIPT_UPDATE_DOOR_AUDIO for AUTODOOR_HAYES_GARAGE.")
#ENDIF
ENDIF
BREAK
ENDSWITCH
iSetupProgress++
ENDIF
//handle initial setup for skipping to or retrying specific stages
IF ( iSetupProgress = 8 )
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
SWITCH eStage
CASE MISSION_STAGE_ESCAPE_FILM_SET
INT i
REQUEST_CLIP_SET("move_injured_generic")
REQUEST_ANIM_DICT("misscarsteal4@director_grip")
IF HAS_CLIP_SET_LOADED("move_injured_generic")
AND HAS_ANIM_DICT_LOADED("misscarsteal4@director_grip")
IF HAS_MISSION_PED_BEEN_CREATED(psFilmCrew[FCP_GRIP_1], FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE)
AND HAS_MISSION_PED_BEEN_CREATED(psFilmCrew[FCP_GRIP_2], FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE)
AND HAS_MISSION_PED_BEEN_CREATED(psFilmCrew[FCP_DIRECTOR], FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE)
IF HAS_MISSION_OBJECT_BEEN_CREATED(osPropChair)
AND HAS_MISSION_OBJECT_BEEN_CREATED(osPropClipboard)
IF NOT IS_PED_INJURED(psFilmCrew[FCP_DIRECTOR].PedIndex)
SET_PED_PROP_INDEX(psFilmCrew[FCP_DIRECTOR].PedIndex, ANCHOR_EYES, 0, 0)
ADD_PED_FOR_DIALOGUE(CST4Conversation, 7, psFilmCrew[FCP_DIRECTOR].PedIndex, "CST4DIRECTOR")
ENDIF
IF NOT IS_PED_INJURED(psFilmCrew[FCP_GRIP_1].PedIndex)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GRIP_1].PedIndex, PED_COMP_HEAD, 1, 1, 0) //(head)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GRIP_1].PedIndex, PED_COMP_TORSO, 1, 1, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GRIP_1].PedIndex, PED_COMP_LEG, 0, 1, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GRIP_1].PedIndex, PED_COMP_SPECIAL, 2, 0, 0) //(accs)
ENDIF
IF NOT IS_PED_INJURED(psFilmCrew[FCP_GRIP_2].PedIndex)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GRIP_2].PedIndex, PED_COMP_HEAD, 0, 1, 0) //(head)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GRIP_2].PedIndex, PED_COMP_TORSO, 0, 2, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GRIP_2].PedIndex, PED_COMP_LEG, 0, 2, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GRIP_2].PedIndex, PED_COMP_SPECIAL, 0, 0, 0) //(accs)
ENDIF
IF DOES_ENTITY_EXIST(osPropClipboard.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osPropClipboard.ObjectIndex)
IF NOT IS_ENTITY_ATTACHED(osPropClipboard.ObjectIndex)
IF NOT IS_PED_INJURED(psFilmCrew[FCP_GRIP_1].PedIndex)
ATTACH_ENTITY_TO_ENTITY(osPropClipboard.ObjectIndex, psFilmCrew[FCP_GRIP_1].PedIndex,
GET_PED_BONE_INDEX(psFilmCrew[FCP_GRIP_1].PedIndex, BONETAG_PH_L_HAND),
<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psFilmCrew[FCP_GRIP_1].PedIndex)
IF NOT IS_PED_INJURED(psFilmCrew[FCP_GRIP_1].PedIndex)
IF NOT IS_ENTITY_PLAYING_ANIM(psFilmCrew[FCP_GRIP_1].PedIndex, "misscarsteal4@director_grip", "end_loop_grip")
TASK_PLAY_ANIM_ADVANCED(psFilmCrew[FCP_GRIP_1].PedIndex, "misscarsteal4@director_grip", "end_loop_grip",
osPropChair.vPosition, osPropChair.vRotation, SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1,
AF_LOOPING | AF_NOT_INTERRUPTABLE | AF_EXTRACT_INITIAL_OFFSET |
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION,
0, EULER_YXZ, AIK_DISABLE_ARM_IK)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psFilmCrew[FCP_GRIP_2].PedIndex)
IF NOT IS_PED_INJURED(psFilmCrew[FCP_GRIP_2].PedIndex)
IF NOT IS_ENTITY_PLAYING_ANIM(psFilmCrew[FCP_GRIP_2].PedIndex, "misscarsteal4@director_grip", "mcs_2_loop_grip1")
TASK_PLAY_ANIM_ADVANCED(psFilmCrew[FCP_GRIP_2].PedIndex, "misscarsteal4@director_grip", "mcs_2_loop_grip1", vFilmCrewPedsScenePosition,
vFilmCrewPedsSceneRotation, INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psFilmCrew[FCP_DIRECTOR].PedIndex)
IF NOT IS_PED_INJURED(psFilmCrew[FCP_DIRECTOR].PedIndex)
SET_PED_PROP_INDEX(psFilmCrew[FCP_DIRECTOR].PedIndex, ANCHOR_EYES, 0, 0)
IF NOT IS_ENTITY_PLAYING_ANIM(psFilmCrew[FCP_DIRECTOR].PedIndex, "misscarsteal4@director_grip", "end_loop_director")
TASK_PLAY_ANIM_ADVANCED(psFilmCrew[FCP_DIRECTOR].PedIndex, "misscarsteal4@director_grip", "end_loop_director",
osPropChair.vPosition, osPropChair.vRotation, SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1,
AF_LOOPING | AF_NOT_INTERRUPTABLE | AF_EXTRACT_INITIAL_OFFSET |
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION,
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
ENDIF
ENDIF
ENDIF
GO_TO_PED_STATE(psFilmCrew[FCP_GRIP_1], PED_STATE_PLAYING_ANIM_3)
GO_TO_PED_STATE(psFilmCrew[FCP_GRIP_2], PED_STATE_BLOCKING_PLAYER)
GO_TO_PED_STATE(psFilmCrew[FCP_DIRECTOR], PED_STATE_PLAYING_ANIM_3)
IF DOES_ENTITY_EXIST(psSetSecurity[0].PedIndex)
AND DOES_ENTITY_EXIST(psSetSecurity[1].PedIndex)
AND DOES_ENTITY_EXIST(psSetSecurity[2].PedIndex)
AND DOES_ENTITY_EXIST(psSetSecurity[3].PedIndex)
REPEAT 4 i
IF NOT IS_ENTITY_DEAD(psSetSecurity[i].PedIndex)
TASK_AIM_GUN_AT_ENTITY(psSetSecurity[i].PedIndex, PLAYER_PED_ID(), -1, TRUE)
GO_TO_PED_STATE(psSetSecurity[i], PED_STATE_COMBAT_AIMING)
ENDIF
ENDREPEAT
iSetupProgress++
ELSE
REPEAT COUNT_OF(psSetSecurity) i
IF NOT DOES_ENTITY_EXIST(psSetSecurity[i].PedIndex)
REQUEST_MODEL(mnSecurityPed)
IF HAS_MODEL_LOADED(mnSecurityPed)
psSetSecurity[i].PedIndex = CREATE_ENEMY_PED(psSetSecurity[i].vPosition, psSetSecurity[i].fHeading, mnSecurityPed,
RELGROUPHASH_SECURITY_GUARD, 200, WEAPONTYPE_PISTOL
#IF IS_DEBUG_BUILD, psSetSecurity[i].sDebugName #ENDIF)
GO_TO_PED_STATE(psSetSecurity[i], PED_STATE_IDLE)
SET_MODEL_AS_NO_LONGER_NEEDED(mnSecurityPed)
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
DEFAULT
iSetupProgress++
BREAK
ENDSWITCH
ELSE
iSetupProgress++
ENDIF
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 = 9 )
//stage was skipped to or is being replayed
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
IF ( bStageReplayed = TRUE )
END_REPLAY_SETUP(NULL, DEFAULT, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling END_REPLAY_SETUP().")
#ENDIF
ELSE
NEW_LOAD_SCENE_START_SPHERE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 20.0)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_START_SPHERE() at coordinates ", sMissionPosition.vPosition, " for mission replay or stage skip. This might take a while to load.")
#ENDIF
INT iLoadSceneTimer = GET_GAME_TIMER() + 15000
WHILE IS_NEW_LOAD_SCENE_ACTIVE()
AND NOT IS_NEW_LOAD_SCENE_LOADED()
AND GET_GAME_TIMER() < iLoadSceneTimer
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Load scene timer: ", iLoadSceneTimer - GET_GAME_TIMER(), ".")
#ENDIF
WAIT(0)
ENDWHILE
NEW_LOAD_SCENE_STOP()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP().")
#ENDIF
ENDIF
WAIT(500) //add wait to hide any load scene freezes
//put player in car when required during the skip
SWITCH eStage
CASE MISSION_STAGE_ESCAPE_FILM_SET
CASE MISSION_STAGE_DELIVER_CAR
CASE MISSION_STAGE_CUTSCENE_END
#IF IS_DEBUG_BUILD
CASE MISSION_STAGE_EJECTOR_TEST
#ENDIF
IF IS_VEHICLE_DRIVEABLE(vsPlayersCar.VehicleIndex)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vsPlayersCar.VehicleIndex, VS_DRIVER)
SET_VEHICLE_ON_GROUND_PROPERLY(vsPlayersCar.VehicleIndex)
SET_VEHICLE_ENGINE_ON(vsPlayersCar.VehicleIndex, TRUE, TRUE)
ACTIVATE_PHYSICS(vsPlayersCar.VehicleIndex)
SET_ENTITY_DYNAMIC(vsPlayersCar.VehicleIndex, TRUE)
ENDIF
ENDIF
BREAK
ENDSWITCH
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SWITCH eStage //handle music for skips/retry/replay of mission stages
CASE MISSION_STAGE_CUTSCENE_TRAILER
TRIGGER_MUSIC_EVENT("CAR3_TRAILER_RESTART")
IF NOT IS_AUDIO_SCENE_ACTIVE("CAR_3_INSIDE_STUDIO")
START_AUDIO_SCENE("CAR_3_INSIDE_STUDIO")
ENDIF
BREAK
CASE MISSION_STAGE_GET_TO_CAR
TRIGGER_MUSIC_EVENT("CAR3_CAR_RESTART")
IF NOT IS_AUDIO_SCENE_ACTIVE("CAR_3_INSIDE_STUDIO")
START_AUDIO_SCENE("CAR_3_INSIDE_STUDIO")
ENDIF
BREAK
CASE MISSION_STAGE_ESCAPE_FILM_SET
TRIGGER_MUSIC_EVENT("CAR3_ESCAPE_RESTART")
IF NOT IS_AUDIO_SCENE_ACTIVE("CAR_3_ESCAPE_SECURITY")
START_AUDIO_SCENE("CAR_3_ESCAPE_SECURITY")
ENDIF
BREAK
CASE MISSION_STAGE_DELIVER_CAR
TRIGGER_MUSIC_EVENT("CAR3_DELIVER_RESTART")
BREAK
ENDSWITCH
SWITCH eStage //handle fade in for each mission stage
CASE MISSION_STAGE_CUTSCENE_TRAILER //do not fade in, mission stage will handle a fade in from fade out
CASE MISSION_STAGE_CUTSCENE_END
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Halting loading screen fade in for skip to a mission stage that will fade the screen in.")
#ENDIF
BREAK
DEFAULT //fade in by default for other stages
#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 = 10 )
SWITCH eStage
CASE MISSION_STAGE_GET_TO_ACTOR
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_ACTOR), "GET TO ACTOR", FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_ACTOR), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
CASE MISSION_STAGE_GET_TO_CAR
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_CAR), "GET TO CAR", FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_CAR), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
CASE MISSION_STAGE_ESCAPE_FILM_SET
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_ESCAPE_FILM_SET), "ESCAPE FILM SET", FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_ESCAPE_FILM_SET), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
CASE MISSION_STAGE_DELIVER_CAR
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_DELIVER_CAR), "DELIVER CAR", TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_DELIVER_CAR), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
ENDSWITCH
iSetupProgress++
ENDIF
//print the message only once per mission stage
//handle fades
IF ( iSetupProgress = 11 )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished mission stage loading for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
//reset the stage reset flag
#IF IS_DEBUG_BUILD
bStageResetFlag = FALSE
#ENDIF
bStageLoaded = TRUE
bStageReplayed = FALSE
bStageSkippedTo = FALSE
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
iSetupProgress++
ENDIF
IF ( iSetupProgress = 12 )
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
//|======================== END MISSION STAGE LOADING PROCEDURES ========================|
//|=============================== MISSION STAGES FUNCTIONS ==============================|
FUNC BOOL CAN_PED_HEAR_PED_ON_FOOT(PED_INDEX PedIndex, PED_INDEX TargetPedIndex, FLOAT fDistanceBetweenPeds)
IF DOES_ENTITY_EXIST(PedIndex)
IF NOT IS_ENTITY_DEAD(PedIndex)
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF NOT IS_PED_INJURED(TargetPedIndex)
IF NOT IS_PED_IN_ANY_VEHICLE(TargetPedIndex)
IF CAN_PED_HEAR_PLAYER(PLAYER_ID(), PedIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped heard player heard on foot.")
#ENDIF
IF IS_PED_RUNNING(TargetPedIndex)
OR IS_PED_SPRINTING(TargetPedIndex)
IF fDistanceBetweenPeds <= 5.0
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped heard player heard on foot running.")
#ENDIF
RETURN TRUE
ENDIF
ENDIF
IF IS_PED_WALKING(TargetPedIndex)
IF fDistanceBetweenPeds <= 3.0
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped heard player heard on foot walking.")
#ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CAN_PED_HEAR_PED_IN_VEHICLE(PED_INDEX PedIndex, PED_INDEX TargetPedIndex, FLOAT fDistanceBetweenPeds)
IF DOES_ENTITY_EXIST(PedIndex)
IF NOT IS_ENTITY_DEAD(PedIndex)
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF NOT IS_PED_INJURED(TargetPedIndex)
IF IS_PED_IN_ANY_VEHICLE(TargetPedIndex)
IF ( fDistanceBetweenPeds < 20.0 )
IF IS_HORN_ACTIVE(GET_VEHICLE_PED_IS_USING(TargetPedIndex))
OR IS_VEHICLE_SIREN_ON(GET_VEHICLE_PED_IS_USING(TargetPedIndex))
OR IS_VEHICLE_ALARM_ACTIVATED(GET_VEHICLE_PED_IS_USING(TargetPedIndex))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player heard in vehicle with horn, siren or alarm active.")
#ENDIF
RETURN TRUE
ENDIF
IF IS_VEHICLE_IN_BURNOUT(GET_VEHICLE_PED_IS_USING(TargetPedIndex))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player heard in vehicle doing burnout.")
#ENDIF
RETURN TRUE
ENDIF
ENDIF
IF ( fDistanceBetweenPeds < 15.0 )
IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(GET_VEHICLE_PED_IS_USING(TargetPedIndex)) AND GET_ENTITY_SPEED(GET_VEHICLE_PED_IS_USING(TargetPedIndex)) > 5.0
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player heard in vehicle crashing.")
#ENDIF
RETURN TRUE
ENDIF
IF CAN_PED_HEAR_PLAYER(PLAYER_ID(), PedIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player heard in vehicle.")
#ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_SECURITY_PED_ALERTED_BY_PED_VEHICLE_ACTIONS(PED_INDEX PedIndex, PED_INDEX TargetPedIndex, FLOAT fDistanceBetweenPeds, BOOL bCanSeePed)
IF DOES_ENTITY_EXIST(PedIndex)
IF NOT IS_ENTITY_DEAD(PedIndex)
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF NOT IS_PED_INJURED(TargetPedIndex)
IF IS_PED_IN_ANY_VEHICLE(TargetPedIndex)
IF ( fDistanceBetweenPeds < 40.0 )
IF IS_VEHICLE_ALARM_ACTIVATED(GET_VEHICLE_PED_IS_USING(TargetPedIndex))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped alerted due to player using vehicle with alarm active.")
#ENDIF
RETURN TRUE
ENDIF
ENDIF
IF ( fDistanceBetweenPeds < 5.0 )
IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(GET_VEHICLE_PED_IS_USING(TargetPedIndex)) AND GET_ENTITY_SPEED(GET_VEHICLE_PED_IS_USING(TargetPedIndex)) > 5.0
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped alerted due to player crashing a vehicle nearby ped.")
#ENDIF
RETURN TRUE
ENDIF
ENDIF
IF ( bPlayerInsideFilmStudio = TRUE )
IF ( bCanSeePed = TRUE )
IF IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_USING(TargetPedIndex)))
OR IS_THIS_MODEL_A_PLANE(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_USING(TargetPedIndex)))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped alerted due to player seen using helicopter or plane inside film studio.")
#ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_PED_ALERTED_BY_PED_ACTIONS(PED_INDEX PedIndex, PED_INDEX TargetPedIndex)
IF NOT IS_PED_INJURED(PedIndex)
AND NOT IS_PED_INJURED(TargetPedIndex)
VECTOR PedCoords = GET_ENTITY_COORDS(PedIndex)
IF HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_GUN_AIMED_AT)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_POTENTIAL_BLAST)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_SHOT_FIRED_WHIZZED_BY)
OR IS_BULLET_IN_AREA(PedCoords, 16.0, TRUE)
OR IS_BULLET_IN_AREA(PedCoords, 16.0, FALSE)
OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, PedCoords, 16.0)
OR IS_ENTITY_TOUCHING_ENTITY(PedIndex, TargetPedIndex)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(PedIndex, TargetPedIndex)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_FILM_CREW_PED_ALERTED_BY_PED_ACTIONS(PED_INDEX PedIndex, PED_INDEX TargetPedIndex)
IF NOT IS_PED_INJURED(PedIndex)
AND NOT IS_PED_INJURED(TargetPedIndex)
VECTOR PedCoords = GET_ENTITY_COORDS(PedIndex)
IF HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_GUN_AIMED_AT)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_POTENTIAL_BLAST)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_SHOT_FIRED)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_SHOT_FIRED_WHIZZED_BY)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_SHOT_FIRED_BULLET_IMPACT)
OR IS_BULLET_IN_AREA(PedCoords, 16.0, TRUE)
OR IS_BULLET_IN_AREA(PedCoords, 16.0, FALSE)
OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, PedCoords, 16.0)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(PedIndex, TargetPedIndex)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_SECURITY_PED_ALERTED_BY_PED_ACTIONS(PED_INDEX PedIndex, PED_INDEX TargetPedIndex)
IF NOT IS_PED_INJURED(PedIndex)
AND NOT IS_PED_INJURED(TargetPedIndex)
VECTOR PedCoords = GET_ENTITY_COORDS(PedIndex)
IF HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_MELEE_ACTION)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_GUN_AIMED_AT)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_POTENTIAL_BLAST)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_POTENTIAL_GET_RUN_OVER)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_EXPLOSION)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_SHOCKING_EXPLOSION)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_SHOCKING_CAR_ALARM)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_SHOT_FIRED)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_SHOT_FIRED_WHIZZED_BY)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_SHOT_FIRED_BULLET_IMPACT)
OR IS_BULLET_IN_AREA(PedCoords, 20.0, TRUE)
OR IS_BULLET_IN_AREA(PedCoords, 20.0, FALSE)
OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, PedCoords, 20.0)
OR IS_ENTITY_TOUCHING_ENTITY(PedIndex, TargetPedIndex)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(PedIndex, TargetPedIndex)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CAN_PED_SEE_PED_WEAPON(PED_INDEX PedIndex, PED_INDEX TargetPedIndex, FLOAT fDistanceBetweenPeds, BOOL bCanSeePed)
IF NOT IS_PED_INJURED(PedIndex)
AND NOT IS_PED_INJURED(TargetPedIndex)
IF ( fDistanceBetweenPeds < 20.0 AND bCanSeePed = TRUE )
WEAPON_TYPE eCurrentPlayerWeapon
IF IS_PED_SHOOTING(TargetPedIndex)
OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), PedIndex)
OR HAS_PED_RECEIVED_EVENT(PedIndex, EVENT_GUN_AIMED_AT)
OR IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), PedIndex)
OR GET_CURRENT_PED_WEAPON(TargetPedIndex, eCurrentPlayerWeapon)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CAN_PED_SEE_PED_PERFORMING_MELEE_ACTION(PED_INDEX PedIndex, PED_INDEX TargetPedIndex, FLOAT fDistanceBetweenPeds, BOOL bCanSeePed)
IF NOT IS_PED_INJURED(PedIndex)
AND NOT IS_PED_INJURED(TargetPedIndex)
IF ( fDistanceBetweenPeds < 25.0 AND bCanSeePed = TRUE )
IF NOT IS_PED_DEAD_OR_DYING(PedIndex)
IF IS_PED_PERFORMING_MELEE_ACTION(TargetPedIndex)
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CAN_PED_SEE_PED_DAMAGING_VEHICLE(PED_INDEX PedIndex, PED_INDEX TargetPedIndex, VEHICLE_INDEX TargetVehicleIndex, BOOL bCanSeePed)
IF NOT IS_PED_INJURED(PedIndex)
AND NOT IS_PED_INJURED(TargetPedIndex)
IF DOES_ENTITY_EXIST(TargetVehicleIndex)
AND NOT IS_ENTITY_DEAD(TargetVehicleIndex)
IF ( bCanSeePed = TRUE )
IF IS_PED_ON_SPECIFIC_VEHICLE(TargetPedIndex, TargetVehicleIndex)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(TargetVehicleIndex, TargetPedIndex)
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CAN_PED_SEE_PED_IN_STEALTH_MOVEMENT(PED_INDEX PedIndex, PED_INDEX TargetPedIndex, FLOAT fDistanceBetweenPeds, BOOL bCanSeePed)
IF NOT IS_PED_INJURED(PedIndex)
AND NOT IS_PED_INJURED(TargetPedIndex)
IF ( fDistanceBetweenPeds < 10.0 AND bCanSeePed = TRUE )
IF GET_PED_STEALTH_MOVEMENT(TargetPedIndex)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC MANAGE_TOILET_PED(PED_STRUCT &ped, PED_INDEX TargetPedIndex)
IF DOES_ENTITY_EXIST(ped.PedIndex)
ped.fDistanceToTarget = GET_DISTANCE_BETWEEN_ENTITIES(ped.PedIndex, TargetPedIndex)
#IF IS_DEBUG_BUILD
ped.sDebugName = "Toilet"
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
SET_PED_NAME_DEBUG(ped.PedIndex, "Toilet")
ENDIF
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
ENDIF
#ENDIF
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
IF NOT IS_PED_INJURED(TargetPedIndex)
VECTOR vAnimPosition = << -1160.548, -528.440, 31.585 >>
VECTOR vAnimRotation = << 0.000, 0.000, 133.920 >>
IF ( ped.eState != PED_STATE_FLEEING )
IF IS_ENTITY_TOUCHING_ENTITY(ped.PedIndex, TargetPedIndex)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(ped.PedIndex, TargetPedIndex)
OR HAS_PED_RECEIVED_EVENT(ped.PedIndex, EVENT_SHOT_FIRED)
OR HAS_PED_RECEIVED_EVENT(ped.PedIndex, EVENT_GUN_AIMED_AT)
OR HAS_PED_RECEIVED_EVENT(ped.PedIndex, EVENT_SHOT_FIRED_WHIZZED_BY)
OR HAS_PED_RECEIVED_EVENT(ped.PedIndex, EVENT_SHOT_FIRED_BULLET_IMPACT)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
ENDIF
SWITCH ped.eState
CASE PED_STATE_IDLE
IF ( ped.bHasTask = FALSE )
//ad initial tasks and settings here
ped.bHasTask = TRUE
ENDIF
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_1)
BREAK
CASE PED_STATE_PLAYING_ANIM_1
CASE PED_STATE_PLAYING_ANIM_2
CASE PED_STATE_PLAYING_ANIM_3
CASE PED_STATE_PLAYING_ANIM_4
IF ( ped.bHasTask = FALSE )
SWITCH ped.eState
CASE PED_STATE_PLAYING_ANIM_1
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_base_idle")
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
TASK_PLAY_ANIM_ADVANCED(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_base_idle",
vAnimPosition, vAnimRotation, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1,
AF_EXTRACT_INITIAL_OFFSET | AF_HOLD_LAST_FRAME)
ELSE
ped.bHasTask = TRUE
ENDIF
BREAK
CASE PED_STATE_PLAYING_ANIM_2
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_idle_a")
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
TASK_PLAY_ANIM_ADVANCED(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_idle_a",
vAnimPosition, vAnimRotation, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1,
AF_EXTRACT_INITIAL_OFFSET | AF_HOLD_LAST_FRAME)
ELSE
ped.bHasTask = TRUE
ENDIF
BREAK
CASE PED_STATE_PLAYING_ANIM_3
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_idle_b")
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
TASK_PLAY_ANIM_ADVANCED(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_idle_b",
vAnimPosition, vAnimRotation, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1,
AF_EXTRACT_INITIAL_OFFSET | AF_HOLD_LAST_FRAME)
ELSE
ped.bHasTask = TRUE
ENDIF
BREAK
CASE PED_STATE_PLAYING_ANIM_4
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_idle_c")
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
TASK_PLAY_ANIM_ADVANCED(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_idle_c",
vAnimPosition, vAnimRotation, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1,
AF_EXTRACT_INITIAL_OFFSET | AF_HOLD_LAST_FRAME)
ELSE
ped.bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
IF ( ped.bHasTask = TRUE )
WEAPON_TYPE TargetPedWeaponType
IF ( eMissionStage = MISSION_STAGE_GET_TO_ACTOR )
AND GET_CURRENT_PED_WEAPON(TargetPedIndex, TargetPedWeaponType)
AND TargetPedWeaponType = WEAPONTYPE_STUNGUN
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, TRUE)
ELSE
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ENDIF
SWITCH ped.eState
CASE PED_STATE_PLAYING_ANIM_1
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_base_idle")
IF GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_base_idle") >= 1.0
SWITCH GET_RANDOM_INT_IN_RANGE(0, 3)
CASE 0
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_2)
BREAK
CASE 1
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_3)
BREAK
CASE 2
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_4)
BREAK
ENDSWITCH
ENDIF
ENDIF
BREAK
CASE PED_STATE_PLAYING_ANIM_2
CASE PED_STATE_PLAYING_ANIM_3
CASE PED_STATE_PLAYING_ANIM_4
IF ( IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_idle_a") AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_idle_a") >= 1.0 )
OR ( IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_idle_b") AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_idle_b") >= 1.0 )
OR ( IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_idle_c") AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_idle_c") >= 1.0 )
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_1)
ENDIF
BREAK
ENDSWITCH
SWITCH ped.eState
CASE PED_STATE_PLAYING_ANIM_1
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_base_idle")
IF HAS_LABEL_BEEN_TRIGGERED("CST4_TOILET")
SET_LABEL_AS_TRIGGERED("CST4_TOILET", FALSE)
ENDIF
ENDIF
BREAK
CASE PED_STATE_PLAYING_ANIM_2
CASE PED_STATE_PLAYING_ANIM_3
CASE PED_STATE_PLAYING_ANIM_4
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_idle_a")
OR IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_idle_b")
OR IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@toilet", "desperate_toilet_idle_c")
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_TOILET")
IF IS_ENTITY_AT_COORD(TargetPedIndex, << -1151.53, -535.51, 42.63 >>, << 20.0, 16.0, 16.0 >>) AND ( ped.fDistanceToTarget < 20.0 )
SWITCH GET_RANDOM_INT_IN_RANGE(0, 5)
CASE 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_TOILET", "CST4_TOILET_1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_TOILET", TRUE)
ENDIF
ELSE
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "CST4_BSAA", "CST4RUNNER3", SPEECH_PARAMS_FORCE_FRONTEND)
SET_LABEL_AS_TRIGGERED("CST4_TOILET", TRUE)
ENDIF
ENDIF
BREAK
CASE 1
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_TOILET", "CST4_TOILET_3", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_TOILET", TRUE)
ENDIF
ELSE
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "CST4_BSAB", "CST4RUNNER3", SPEECH_PARAMS_FORCE_FRONTEND)
SET_LABEL_AS_TRIGGERED("CST4_TOILET", TRUE)
ENDIF
ENDIF
BREAK
CASE 2
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_TOILET", "CST4_TOILET_5", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_TOILET", TRUE)
ENDIF
ELSE
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "CST4_BSAC", "CST4RUNNER3", SPEECH_PARAMS_FORCE_FRONTEND)
SET_LABEL_AS_TRIGGERED("CST4_TOILET", TRUE)
ENDIF
ENDIF
BREAK
CASE 3
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_TOILET", "CST4_TOILET_7", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_TOILET", TRUE)
ENDIF
ELSE
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "CST4_BSAD", "CST4RUNNER3", SPEECH_PARAMS_FORCE_FRONTEND)
SET_LABEL_AS_TRIGGERED("CST4_TOILET", TRUE)
ENDIF
ENDIF
BREAK
CASE 4
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_TOILET", "CST4_TOILET_9", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_TOILET", TRUE)
ENDIF
ELSE
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "CST4_BSAE", "CST4RUNNER3", SPEECH_PARAMS_FORCE_FRONTEND)
SET_LABEL_AS_TRIGGERED("CST4_TOILET", TRUE)
ENDIF
ENDIF
BREAK
ENDSWITCH
ELSE
SET_LABEL_AS_TRIGGERED("CST4_TOILET", TRUE)
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_SCRIPTED_SPEECH_PLAYING(ped.PedIndex)
IF IS_PED_DEAD_OR_DYING(ped.PedIndex)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
BREAK
CASE PED_STATE_FLEEING
IF ( ped.bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_ALWAYS_FLEE, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_DISABLE_COWER, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_DISABLE_HANDS_UP, TRUE)
IF NOT IS_PED_FLEEING(ped.PedIndex)
CLEAR_PED_TASKS(ped.PedIndex)
TASK_SMART_FLEE_PED(ped.PedIndex, TargetPedIndex, 300, -1)
SET_PED_KEEP_TASK(ped.PedIndex, TRUE)
ENDIF
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ped.iConversationTimer = 0
ped.bHasTask = TRUE
ENDIF
IF GET_GAME_TIMER() - ped.iConversationTimer > 0
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "SCREAM_PANIC", "WAVELOAD_PAIN_MALE", SPEECH_PARAMS_FORCE)
ped.iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 7000)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(ped.PedIndex) OR ped.eState = PED_STATE_FLEEING //cleanup ped when ped is not dead or fleeing
IF ( bPlayerInsideFilmStudio = FALSE )
IF ( ped.fDistanceToTarget > 200.0 )
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
REMOVE_ANIM_DICT("misscarsteal4@toilet")
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_DEAD(ped.PedIndex) OR ped.eState = PED_STATE_FLEEING //cleanup ped when ped is dead or fleeing
IF IS_ENTITY_DEAD(ped.PedIndex)
ped.eState = PED_STATE_DEAD
IF (ped.eCleanupReason = PED_CLEANUP_NO_CLEANUP)
ped.eCleanupReason = GET_PED_CLEANUP_REASON(ped)
UPDATE_PLAYER_KILL_COUNTERS(ped.eCleanupReason, iPlayerLethalKills, iPlayerStealthKills, iPlayerTakedownKills)
ENDIF
ENDIF
IF ( ped.fDistanceToTarget > 200.0 )
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
REMOVE_ANIM_DICT("misscarsteal4@toilet")
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_TOILET_SCENE(INT &iProgress)
SWITCH iProgress
CASE 0
iProgress++
BREAK
CASE 1
REQUEST_MODEL(osPropToilet.ModelName)
REQUEST_ANIM_DICT("misscarsteal4@toilet")
IF HAS_MODEL_LOADED(osPropToilet.ModelName)
AND HAS_ANIM_DICT_LOADED("misscarsteal4@toilet")
IF HAS_MISSION_PED_BEEN_CREATED(psToilet, FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE)
IF NOT IS_PED_INJURED(psToilet.PedIndex)
ADD_PED_FOR_DIALOGUE(CST4Conversation, 0, psToilet.PedIndex, "CST4RUNNER3")
ENDIF
CREATE_MODEL_HIDE(osPropToilet.vPosition, 1.0, osPropToilet.ModelName, FALSE)
IF HAS_MISSION_OBJECT_BEEN_CREATED(osPropToilet, TRUE)
//
ENDIF
GO_TO_PED_STATE(psToilet, PED_STATE_IDLE)
iProgress++
ENDIF
ENDIF
BREAK
CASE 2
MANAGE_TOILET_PED(psToilet, PLAYER_PED_ID())
BREAK
ENDSWITCH
ENDPROC
PROC BLOCK_WEAPON_FIRE_FOR_AIMING_SECURITY_GROUP(PED_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)
IF array[i].eState = PED_STATE_COMBAT_AIMING
OR array[i].eState = PED_STATE_COMBAT_AIMING_PED
SET_PED_RESET_FLAG(array[i].PedIndex, PRF_BlockWeaponFire, TRUE)
ENDIF
ENDIF
ENDIF
ENDFOR
ENDPROC
PROC MANAGE_SECURITY_PED_AT_FILM_SET(PED_STRUCT &ped, PED_INDEX TargetPedIndex, VEHICLE_INDEX VehicleIndex, STRING sVoiceName,
VECTOR vDefensiveSpherePosition, FLOAT fDefensiveSphereRadius, INT iCarAimingTime,
INT iPedAimingTime, INT iLOSTime, FLOAT fWalkWhenStrafingInCombatAimingChance,
BOOL bEntryGuard)
IF DOES_ENTITY_EXIST(ped.PedIndex)
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
IF NOT IS_PED_INJURED(TargetPedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
ENDIF
#ENDIF
ped.fDistanceToTarget = GET_DISTANCE_BETWEEN_ENTITIES(ped.PedIndex, TargetPedIndex)
CHECK_PED_LINE_OF_SIGHT_TO_PED(ped.PedIndex, TargetPedIndex, ped.bCanSeeTargetPed, ped.iLOSTimer, iLOSTime)
SWITCH ped.eState
CASE PED_STATE_IDLE
GO_TO_PED_STATE(ped, PED_STATE_STANDING_AT_LOCATION)
BREAK
CASE PED_STATE_STANDING_AT_LOCATION
IF ( ped.bHasTask = FALSE )
TASK_START_SCENARIO_IN_PLACE(ped.PedIndex, "WORLD_HUMAN_GUARD_STAND")
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ped.iConversationTimer = 0
ped.bHasTask = TRUE
ENDIF
IF ( bEntryGuard = TRUE )
WEAPON_TYPE TargetPedWeaponType
IF ( eMissionStage = MISSION_STAGE_GET_TO_ACTOR )
AND GET_CURRENT_PED_WEAPON(TargetPedIndex, TargetPedWeaponType)
AND TargetPedWeaponType = WEAPONTYPE_STUNGUN
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, TRUE)
ELSE
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ENDIF
ENDIF
IF ( ped.bCanSeeTargetPed = TRUE )
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
IF IS_ENTITY_AT_ENTITY(TargetPedIndex, VehicleIndex, << 2.5, 2.5, 2.5 >>, FALSE, TRUE, TM_ON_FOOT)
GO_TO_PED_STATE(ped, PED_STATE_INTIMIDATION)
ENDIF
ENDIF
ENDIF
IF ( bSecurityAlerted = TRUE )
OR ( bFilmCrewGripAlerted = TRUE)
OR ( bDirectorSceneDisrupted = TRUE)
OR IS_PED_IN_COMBAT(ped.PedIndex)
OR IS_SECURITY_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
OR CAN_PED_SEE_PED_WEAPON(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_DAMAGING_VEHICLE(ped.PedIndex, TargetPedIndex, VehicleIndex, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_PERFORMING_MELEE_ACTION(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR IS_SECURITY_PED_ALERTED_BY_PED_VEHICLE_ACTIONS(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
IF ( CST4_DSG_PLAYING_TRIGGERED = TRUE )
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_AIMING_PED)
ENDIF
IF ( ped.bCanSeeTargetPed = TRUE )
IF ( bEntryGuard = TRUE )
SET_PED_CAN_PLAY_AMBIENT_ANIMS(ped.PedIndex, FALSE)
ENDIF
IF GET_GAME_TIMER() - ped.iConversationTimer > 0
IF ( ped.fDistanceToTarget < 12.0 )
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
IF ( bPlayerWearingTuxedo = TRUE )
IF ( bEntryGuard = TRUE )
TASK_LOOK_AT_ENTITY(ped.PedIndex, TargetPedIndex, 6000, SLF_WHILE_NOT_IN_FOV | SLF_FAST_TURN_RATE | SLF_USE_TORSO, SLF_LOOKAT_VERY_HIGH)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "NEEDED_ON_SET", sVoiceName, SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ped.iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 15000)
ENDIF
ELSE
TASK_LOOK_AT_ENTITY(ped.PedIndex, TargetPedIndex, 6000, SLF_WHILE_NOT_IN_FOV | SLF_FAST_TURN_RATE | SLF_USE_TORSO, SLF_LOOKAT_VERY_HIGH)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "MOVE_AWAY_WARNING", sVoiceName, SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ped.iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 15000)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF ( bEntryGuard = TRUE )
SET_PED_CAN_PLAY_AMBIENT_ANIMS(ped.PedIndex, TRUE)
ENDIF
ENDIF
BREAK
CASE PED_STATE_INTIMIDATION
IF ( ped.bHasTask = FALSE )
REQUEST_ANIM_DICT("move_m@intimidation@cop@unarmed")
REQUEST_ANIM_DICT("reaction@intimidation@cop@unarmed")
IF HAS_ANIM_DICT_LOADED("move_m@intimidation@cop@unarmed")
AND HAS_ANIM_DICT_LOADED("reaction@intimidation@cop@unarmed")
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, TargetPedIndex)
TASK_LOOK_AT_ENTITY(NULL, TargetPedIndex, 100, SLF_FAST_TURN_RATE)
TASK_PLAY_ANIM(NULL, "reaction@intimidation@cop@unarmed", "intro", SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_DEFAULT)
TASK_PLAY_ANIM(NULL, "move_m@intimidation@cop@unarmed", "idle", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(ped.PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, TRUE)
ped.iTimer = GET_GAME_TIMER()
ped.bHasTask = TRUE
ENDIF
ENDIF
IF ( bSecurityAlerted = TRUE )
OR ( bFilmCrewGripAlerted = TRUE)
OR ( bDirectorSceneDisrupted = TRUE)
OR IS_PED_IN_COMBAT(ped.PedIndex)
OR IS_SECURITY_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
OR CAN_PED_SEE_PED_WEAPON(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_DAMAGING_VEHICLE(ped.PedIndex, TargetPedIndex, VehicleIndex, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_PERFORMING_MELEE_ACTION(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR IS_SECURITY_PED_ALERTED_BY_PED_VEHICLE_ACTIONS(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
IF ( CST4_DSG_PLAYING_TRIGGERED = TRUE )
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_AIMING_PED)
ENDIF
BREAK
CASE PED_STATE_COMBAT_AIMING_PED
SET_PED_RESET_FLAG(ped.PedIndex, PRF_BlockWeaponFire, TRUE) //block weapon fire in aiming state each frame
IF ( ped.bHasTask = FALSE )
SET_PED_COMBAT_ABILITY(ped.PedIndex, CAL_PROFESSIONAL)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_USE_COVER, FALSE)
SET_PED_COMBAT_RANGE(ped.PedIndex, CR_NEAR)
SET_PED_COMBAT_MOVEMENT(ped.PedIndex, CM_WILLADVANCE)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 1.0)
TASK_COMBAT_PED(ped.PedIndex, TargetPedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ped.iTimer = GET_GAME_TIMER()
ped.iConversationTimer = 0
ped.bHasTask = TRUE
ENDIF
IF ( ped.bHasTask = TRUE )
IF ( bSecurityAlerted = TRUE )
OR ( bFilmCrewGripAlerted = TRUE)
OR ( bDirectorSceneDisrupted = TRUE)
OR HAS_TIME_PASSED(iPedAimingTime, ped.iTimer)
OR IS_SECURITY_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
OR CAN_PED_SEE_PED_WEAPON(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_DAMAGING_VEHICLE(ped.PedIndex, TargetPedIndex, VehicleIndex, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_PERFORMING_MELEE_ACTION(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
IF ( ped.bCanSeeTargetPed = TRUE )
IF GET_GAME_TIMER() - ped.iConversationTimer > 0
IF ( ped.fDistanceToTarget < 12.0 )
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
SWITCH GET_RANDOM_INT_IN_RANGE(0, 2)
CASE 0
TASK_LOOK_AT_ENTITY(ped.PedIndex, TargetPedIndex, 1000, SLF_WHILE_NOT_IN_FOV | SLF_FAST_TURN_RATE | SLF_USE_TORSO, SLF_LOOKAT_VERY_HIGH)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "MOVE_AWAY_FROM_THE_CAR", sVoiceName, SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ped.iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(6000, 9000)
BREAK
CASE 1
TASK_LOOK_AT_ENTITY(ped.PedIndex, TargetPedIndex, 1000, SLF_WHILE_NOT_IN_FOV | SLF_FAST_TURN_RATE | SLF_USE_TORSO, SLF_LOOKAT_VERY_HIGH)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "FREEZE", sVoiceName, SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ped.iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(6000, 9000)
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_AIMING
SET_PED_RESET_FLAG(ped.PedIndex, PRF_BlockWeaponFire, TRUE) //block weapon fire in aiming state each frame
IF ( ped.bHasTask = FALSE )
REMOVE_ANIM_DICT("move_m@intimidation@cop@unarmed")
REMOVE_ANIM_DICT("reaction@intimidation@cop@unarmed")
SET_PED_COMBAT_ABILITY(ped.PedIndex, CAL_PROFESSIONAL)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_USE_COVER, FALSE)
SET_PED_COMBAT_RANGE(ped.PedIndex, CR_NEAR)
SET_PED_COMBAT_MOVEMENT(ped.PedIndex, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(ped.PedIndex, vDefensiveSpherePosition, fDefensiveSphereRadius)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, fWalkWhenStrafingInCombatAimingChance)
TASK_COMBAT_PED(ped.PedIndex, TargetPedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ped.iTimer = GET_GAME_TIMER()
ped.iConversationTimer = 0
ped.bHasTask = TRUE
ENDIF
IF ( ped.bHasTask = TRUE )
IF ( bSecurityAlerted = TRUE )
OR ( bFilmCrewGripAlerted = TRUE)
OR ( bDirectorSceneDisrupted = TRUE)
OR HAS_TIME_PASSED(iCarAimingTime, ped.iTimer)
OR IS_SECURITY_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
OR CAN_PED_SEE_PED_WEAPON(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_DAMAGING_VEHICLE(ped.PedIndex, TargetPedIndex, VehicleIndex, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_PERFORMING_MELEE_ACTION(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
IF GET_GAME_TIMER() - ped.iConversationTimer > 0
IF ( ped.fDistanceToTarget < 15.0 )
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
TASK_LOOK_AT_ENTITY(ped.PedIndex, TargetPedIndex, 1000, SLF_WHILE_NOT_IN_FOV | SLF_FAST_TURN_RATE | SLF_USE_TORSO, SLF_LOOKAT_VERY_HIGH)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "GET_OUT_OF_THE_CAR", sVoiceName, SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ped.iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(5000, 7500)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
IF ( ped.bHasTask = FALSE )
REMOVE_ANIM_DICT("move_m@intimidation@cop@unarmed")
REMOVE_ANIM_DICT("reaction@intimidation@cop@unarmed")
REMOVE_PED_DEFENSIVE_AREA(ped.PedIndex)
SET_PED_COMBAT_MOVEMENT(ped.PedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_CAN_FLANK, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_CAN_CHASE_TARGET_ON_FOOT, TRUE)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
IF ( ped.fDistanceToTarget < 25.0 )
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "FREEZE", sVoiceName, SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
TASK_LOOK_AT_ENTITY(ped.PedIndex, TargetPedIndex, 1000, SLF_WHILE_NOT_IN_FOV | SLF_FAST_TURN_RATE | SLF_USE_TORSO, SLF_LOOKAT_VERY_HIGH)
ENDIF
TASK_COMBAT_PED(ped.PedIndex, TargetPedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
bSecurityAlerted = TRUE
ped.bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF IS_ENTITY_DEAD(ped.PedIndex)
ped.eState = PED_STATE_DEAD
IF (ped.eCleanupReason = PED_CLEANUP_NO_CLEANUP)
ped.eCleanupReason = GET_PED_CLEANUP_REASON(ped)
UPDATE_PLAYER_KILL_COUNTERS(ped.eCleanupReason, iPlayerLethalKills, iPlayerStealthKills, iPlayerTakedownKills)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_SECURITY_PED_AT_GATE(PED_STRUCT &ped, STRING sVoiceName, PED_INDEX TargetPedIndex, VEHICLE_INDEX TargetVehicleIndex,
VECTOR vGateAreaPosition1, VECTOR vGateAreaPosition2, FLOAT fGateAreaWidth,
VECTOR vDefensiveAreaPosition1, VECTOR vDefensiveAreaPosition2, FLOAT fDefensiveAreaWidth, INT iLOSTime)
IF DOES_ENTITY_EXIST(ped.PedIndex)
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
IF NOT IS_PED_INJURED(TargetPedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
ENDIF
#ENDIF
ped.fDistanceToTarget = GET_DISTANCE_BETWEEN_ENTITIES(ped.PedIndex, TargetPedIndex)
CHECK_PED_LINE_OF_SIGHT_TO_PED(ped.PedIndex, TargetPedIndex, ped.bCanSeeTargetPed, ped.iLOSTimer, iLOSTime)
SWITCH ped.eState
CASE PED_STATE_IDLE
GO_TO_PED_STATE(ped, PED_STATE_STANDING_AT_LOCATION)
BREAK
CASE PED_STATE_STANDING_AT_LOCATION
IF ( ped.bHasTask = FALSE )
TASK_START_SCENARIO_IN_PLACE(ped.PedIndex, "WORLD_HUMAN_GUARD_STAND")
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ped.iConversationTimer = 0
ped.bHasTask = TRUE
ENDIF
IF ( bSecurityAlerted = TRUE )
OR IS_PED_IN_COMBAT(ped.PedIndex)
OR IS_SECURITY_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
OR CAN_PED_SEE_PED_WEAPON(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR IS_SECURITY_PED_ALERTED_BY_PED_VEHICLE_ACTIONS(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
IF ( ped.bCanSeeTargetPed = TRUE )
IF IS_ENTITY_IN_ANGLED_AREA(TargetPedIndex, vGateAreaPosition1, vGateAreaPosition2, fGateAreaWidth)
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
IF GET_GAME_TIMER() - ped.iConversationTimer > 0
IF ( bPlayerInsideFilmStudio = FALSE AND ped.fDistanceToTarget < 15.0 )
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
TASK_LOOK_AT_ENTITY(ped.PedIndex, TargetPedIndex, 1000, SLF_WHILE_NOT_IN_FOV | SLF_FAST_TURN_RATE | SLF_USE_TORSO, SLF_LOOKAT_VERY_HIGH)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "MOVE_AWAY_WARNING", sVoiceName, SPEECH_PARAMS_FORCE_NORMAL)
ped.iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 15000)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_DEFENSIVE
IF ( ped.bHasTask = FALSE )
SET_PED_COMBAT_RANGE(ped.PedIndex, CR_NEAR)
SET_PED_COMBAT_MOVEMENT(ped.PedIndex, CM_DEFENSIVE)
SET_PED_COMBAT_ABILITY(ped.PedIndex, CAL_PROFESSIONAL)
SET_PED_ANGLED_DEFENSIVE_AREA(ped.PedIndex, vDefensiveAreaPosition1, vDefensiveAreaPosition2, fDefensiveAreaWidth)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_USE_COVER, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_CAN_CHARGE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_CAN_FLANK, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_AGGRESSIVE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_ALWAYS_FIGHT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_SWITCH_TO_ADVANCE_IF_CANT_FIND_COVER, TRUE)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.5)
TASK_COMBAT_PED(ped.PedIndex, TargetPedIndex, COMBAT_PED_PREVENT_CHANGING_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ped.iConversationTimer = 0
ped.bHasTask = TRUE
ENDIF
IF ( ped.bCanSeeTargetPed = TRUE )
IF IS_PED_IN_THIS_VEHICLE(TargetPedIndex, TargetVehicleIndex)
IF ( ped.fDistanceToTarget < 20.0 )
IF GET_GAME_TIMER() - ped.iConversationTimer > 0
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
IF IS_VEHICLE_STOPPED(TargetVehicleIndex)
TASK_LOOK_AT_ENTITY(ped.PedIndex, TargetPedIndex, 1000, SLF_WHILE_NOT_IN_FOV | SLF_FAST_TURN_RATE | SLF_USE_TORSO, SLF_LOOKAT_VERY_HIGH)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "GET_OUT_OF_THE_CAR", sVoiceName, SPEECH_PARAMS_FORCE_NORMAL)
ped.iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 15000)
ELSE
TASK_LOOK_AT_ENTITY(ped.PedIndex, TargetPedIndex, 1000, SLF_WHILE_NOT_IN_FOV | SLF_FAST_TURN_RATE | SLF_USE_TORSO, SLF_LOOKAT_VERY_HIGH)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "STOP_THE_CAR", sVoiceName, SPEECH_PARAMS_FORCE_NORMAL)
ped.iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 15000)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
IF ( ped.bHasTask = FALSE )
REMOVE_PED_DEFENSIVE_AREA(ped.PedIndex)
SET_PED_COMBAT_RANGE(ped.PedIndex, CR_NEAR)
SET_PED_COMBAT_MOVEMENT(ped.PedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ABILITY(ped.PedIndex, CAL_PROFESSIONAL)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_CAN_FLANK, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_AGGRESSIVE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_ALWAYS_FIGHT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_SWITCH_TO_ADVANCE_IF_CANT_FIND_COVER, TRUE)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.2)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "FREEZE", sVoiceName, SPEECH_PARAMS_FORCE_NORMAL)
TASK_LOOK_AT_ENTITY(ped.PedIndex, TargetPedIndex, 1000, SLF_WHILE_NOT_IN_FOV | SLF_FAST_TURN_RATE | SLF_USE_TORSO, SLF_LOOKAT_VERY_HIGH)
IF NOT IS_PED_IN_COMBAT(ped.PedIndex, TargetPedIndex)
TASK_COMBAT_PED(ped.PedIndex, TargetPedIndex, COMBAT_PED_PREVENT_CHANGING_TARGET)
ENDIF
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
bSecurityAlerted = TRUE
ped.bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF IS_ENTITY_DEAD(ped.PedIndex)
ped.eState = PED_STATE_DEAD
IF (ped.eCleanupReason = PED_CLEANUP_NO_CLEANUP)
ped.eCleanupReason = GET_PED_CLEANUP_REASON(ped)
UPDATE_PLAYER_KILL_COUNTERS(ped.eCleanupReason, iPlayerLethalKills, iPlayerStealthKills, iPlayerTakedownKills)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_SECURITY_PED_AROUND_ACTOR(PED_STRUCT &ped, PED_INDEX TargetPedIndex)
IF DOES_ENTITY_EXIST(ped.PedIndex)
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
IF NOT IS_PED_INJURED(TargetPedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
ENDIF
#ENDIF
SWITCH ped.eState
CASE PED_STATE_IDLE
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_AIMING)
BREAK
CASE PED_STATE_COMBAT_AIMING
IF ( ped.bHasTask = FALSE )
SET_PED_COMBAT_RANGE(ped.PedIndex, CR_NEAR)
SET_PED_COMBAT_MOVEMENT(ped.PedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ABILITY(ped.PedIndex, CAL_PROFESSIONAL)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_USE_COVER, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_CAN_FLANK, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_AGGRESSIVE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_ALWAYS_FIGHT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
//CA_JUST_FOLLOW_VEHICLE - might be useful for chasers
//CA_USE_VEHICLE_ATTACK - might be useful for chasers
SET_COMBAT_FLOAT(ped.PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
TASK_COMBAT_PED(ped.PedIndex, TargetPedIndex, COMBAT_PED_PREVENT_CHANGING_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ped.iTimer = GET_GAME_TIMER()
ped.bHasTask = TRUE
ENDIF
SET_PED_RESET_FLAG(ped.PedIndex, PRF_BlockWeaponFire, TRUE) //block weapon fire in aiming state each frame
IF ( ped.bHasTask = TRUE )
IF HAS_TIME_PASSED(5000, ped.iTimer)
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
//add other checks here, like player aiming
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(ped.PedIndex, TargetPedIndex)
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
IF ( ped.bHasTask = FALSE )
REMOVE_PED_DEFENSIVE_AREA(ped.PedIndex)
SET_PED_COMBAT_RANGE(ped.PedIndex, CR_NEAR)
SET_PED_COMBAT_MOVEMENT(ped.PedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ABILITY(ped.PedIndex, CAL_PROFESSIONAL)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_CAN_FLANK, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_AGGRESSIVE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_ALWAYS_FIGHT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_SWITCH_TO_ADVANCE_IF_CANT_FIND_COVER, TRUE)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.2)
TASK_COMBAT_PED(ped.PedIndex, TargetPedIndex, COMBAT_PED_PREVENT_CHANGING_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
bSecurityAlerted = TRUE
ped.bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF IS_ENTITY_DEAD(ped.PedIndex)
ped.eState = PED_STATE_DEAD
IF (ped.eCleanupReason = PED_CLEANUP_NO_CLEANUP)
ped.eCleanupReason = GET_PED_CLEANUP_REASON(ped)
UPDATE_PLAYER_KILL_COUNTERS(ped.eCleanupReason, iPlayerLethalKills, iPlayerStealthKills, iPlayerTakedownKills)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_SECURITY_PEDS_AT_FILM_SET(INT &iProgress)
SWITCH iProgress
CASE 0
iProgress++
BREAK
CASE 1
INT i
IF DOES_ENTITY_EXIST(psSetSecurity[0].PedIndex)
AND DOES_ENTITY_EXIST(psSetSecurity[1].PedIndex)
AND DOES_ENTITY_EXIST(psSetSecurity[2].PedIndex)
AND DOES_ENTITY_EXIST(psSetSecurity[3].PedIndex)
AND DOES_ENTITY_EXIST(psSetSecurity[4].PedIndex)
REPEAT COUNT_OF(psSetSecurity) i
SWITCH eMissionStage
CASE MISSION_STAGE_GET_TO_ACTOR
CASE MISSION_STAGE_GET_TO_CAR
//
BREAK
CASE MISSION_STAGE_ESCAPE_FILM_SET
IF NOT IS_ENTITY_DEAD(psSetSecurity[i].PedIndex)
IF psSetSecurity[i].eState != PED_STATE_DEAD
AND psSetSecurity[i].eState != PED_STATE_COMBAT_AIMING
AND psSetSecurity[i].eState != PED_STATE_COMBAT_ON_FOOT
GO_TO_PED_STATE(psSetSecurity[i], PED_STATE_COMBAT_AIMING)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDREPEAT
iProgress++
ELSE
REPEAT COUNT_OF(psSetSecurity) i
IF NOT DOES_ENTITY_EXIST(psSetSecurity[i].PedIndex)
REQUEST_MODEL(mnSecurityPed)
IF HAS_MODEL_LOADED(mnSecurityPed)
psSetSecurity[i].PedIndex = CREATE_ENEMY_PED(psSetSecurity[i].vPosition, psSetSecurity[i].fHeading, mnSecurityPed,
RELGROUPHASH_SECURITY_GUARD, 200, WEAPONTYPE_PISTOL
#IF IS_DEBUG_BUILD, psSetSecurity[i].sDebugName #ENDIF)
GO_TO_PED_STATE(psSetSecurity[i], PED_STATE_IDLE)
SET_MODEL_AS_NO_LONGER_NEEDED(mnSecurityPed)
ENDIF
ENDIF
ENDREPEAT
ENDIF
BREAK
CASE 2
IF ( bSecurityAlerted = FALSE )
IF ( iSetSecurityAlertTimer != 0 )
IF HAS_TIME_PASSED(20000, iSetSecurityAlertTimer)
bSecurityAlerted = TRUE
ENDIF
ENDIF
ENDIF
MANAGE_SECURITY_PED_AT_FILM_SET(psSetSecurity[0], PLAYER_PED_ID(), vsPlayersCar.VehicleIndex,
SECURITY1VOICENAME, << -1177.71, -503.58, 34.57 >>, 0.75, 10000, 6000, 1050, 1.0, FALSE)
MANAGE_SECURITY_PED_AT_FILM_SET(psSetSecurity[1], PLAYER_PED_ID(), vsPlayersCar.VehicleIndex,
SECURITY2VOICENAME, << -1189.43, -506.21, 34.57 >>, 0.75, 20000, 5500, 1000, 0.0, FALSE)
MANAGE_SECURITY_PED_AT_FILM_SET(psSetSecurity[2], PLAYER_PED_ID(), vsPlayersCar.VehicleIndex,
SECURITY3VOICENAME, << -1182.29, -507.45, 34.57 >>, 0.75, 12000, 6500, 950, 1.0, FALSE)
MANAGE_SECURITY_PED_AT_FILM_SET(psSetSecurity[3], PLAYER_PED_ID(), vsPlayersCar.VehicleIndex,
SECURITY4VOICENAME, << -1171.85, -512.33, 34.57 >>, 0.75, 15000, 5000, 1100, 0.0, TRUE)
MANAGE_SECURITY_PED_AT_FILM_SET(psSetSecurity[4], PLAYER_PED_ID(), vsPlayersCar.VehicleIndex,
SECURITY2VOICENAME, << -1158.05, -513.84, 34.02 >>, 0.75, 16000, 6000, 900, 0.0, TRUE)
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_SECURITY_PEDS_AT_GATES(INT &iProgress)
SWITCH iProgress
CASE 0
iProgress++
BREAK
CASE 1
IF DOES_ENTITY_EXIST(psNorthGateSecurity[0].PedIndex)
AND DOES_ENTITY_EXIST(psSouthGateSecurity[0].PedIndex)
SWITCH eMissionStage
CASE MISSION_STAGE_GET_TO_ACTOR
CASE MISSION_STAGE_GET_TO_CAR
//
BREAK
CASE MISSION_STAGE_ESCAPE_FILM_SET
IF NOT IS_ENTITY_DEAD(psNorthGateSecurity[0].PedIndex)
IF psNorthGateSecurity[0].eState != PED_STATE_DEAD
AND psNorthGateSecurity[0].eState != PED_STATE_COMBAT_ON_FOOT
AND psNorthGateSecurity[0].eState != PED_STATE_COMBAT_DEFENSIVE
WARP_PED(psNorthGateSecurity[0].PedIndex, <<-1055.8082, -485.2950, 35.6577>>, 117.3792, FALSE, FALSE, FALSE)
GO_TO_PED_STATE(psNorthGateSecurity[0], PED_STATE_COMBAT_DEFENSIVE)
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(psSouthGateSecurity[0].PedIndex)
IF psSouthGateSecurity[0].eState != PED_STATE_DEAD
AND psSouthGateSecurity[0].eState != PED_STATE_COMBAT_ON_FOOT
AND psSouthGateSecurity[0].eState != PED_STATE_COMBAT_DEFENSIVE
WARP_PED(psSouthGateSecurity[0].PedIndex, <<-1206.0895, -571.6317, 26.2291>>, 303.6333, FALSE, FALSE, FALSE)
GO_TO_PED_STATE(psSouthGateSecurity[0], PED_STATE_COMBAT_DEFENSIVE)
ENDIF
ENDIF
//maybe have 2 more guards when escaping without tuxedo?
BREAK
ENDSWITCH
iProgress++
ELSE
IF NOT DOES_ENTITY_EXIST(psNorthGateSecurity[0].PedIndex)
REQUEST_MODEL(mnSecurityPed)
IF HAS_MODEL_LOADED(mnSecurityPed)
psNorthGateSecurity[0].PedIndex = CREATE_ENEMY_PED(psNorthGateSecurity[0].vPosition, psNorthGateSecurity[0].fHeading, mnSecurityPed,
RELGROUPHASH_SECURITY_GUARD, 200, WEAPONTYPE_PISTOL
#IF IS_DEBUG_BUILD, psNorthGateSecurity[0].sDebugName #ENDIF)
GO_TO_PED_STATE(psNorthGateSecurity[0], PED_STATE_IDLE)
SET_MODEL_AS_NO_LONGER_NEEDED(mnSecurityPed)
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(psSouthGateSecurity[0].PedIndex)
REQUEST_MODEL(mnSecurityPed)
IF HAS_MODEL_LOADED(mnSecurityPed)
psSouthGateSecurity[0].PedIndex = CREATE_ENEMY_PED(psSouthGateSecurity[0].vPosition, psSouthGateSecurity[0].fHeading, mnSecurityPed,
RELGROUPHASH_SECURITY_GUARD, 200, WEAPONTYPE_PISTOL
#IF IS_DEBUG_BUILD, psSouthGateSecurity[0].sDebugName #ENDIF)
GO_TO_PED_STATE(psSouthGateSecurity[0], PED_STATE_IDLE)
SET_MODEL_AS_NO_LONGER_NEEDED(mnSecurityPed)
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
MANAGE_SECURITY_PED_AT_GATE(psNorthGateSecurity[0], SECURITY1VOICENAME, PLAYER_PED_ID(), vsPlayersCar.VehicleIndex,
<<-1044.182617,-485.863373,34.623894>>, <<-1061.653687,-472.510498,43.651306>>, 3.0,
<<-1063.403076,-471.480377,35.153713>>, <<-1043.490601,-486.186920,39.613873>>, 10.0, 650)
MANAGE_SECURITY_PED_AT_GATE(psSouthGateSecurity[0], SECURITY2VOICENAME, PLAYER_PED_ID(), vsPlayersCar.VehicleIndex,
<<-1203.236206,-582.197266,25.330757>>, <<-1212.639648,-571.008911,32.306335>>, 1.5,
<<-1202.559204,-583.141479,24.330172>>, <<-1213.059326,-570.624268,30.307667>>, 20.0, 750)
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_SECURITY_PEDS_AROUND_ACTOR(INT &iProgress)
INT i, k
SWITCH iProgress
CASE 0
IF ( bSpawnActorSecurity = TRUE )
REQUEST_MODEL(mnSecurityPed)
IF HAS_MODEL_LOADED(mnSecurityPed)
iProgress++
ENDIF
ENDIF
BREAK
CASE 1
REPEAT COUNT_OF(psActorSecurity) i
IF NOT DOES_ENTITY_EXIST(psActorSecurity[i].PedIndex)
IF HAS_MODEL_LOADED(mnSecurityPed)
k = GET_RANDOM_INT_IN_RANGE(0, COUNT_OF(SecuritySpawnPoints))
IF NOT IS_SPHERE_VISIBLE(SecuritySpawnPoints[k].vPosition, 2.0) AND NOT SecuritySpawned[k]
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), SecuritySpawnPoints[k].vPosition) > 10.0
#IF IS_DEBUG_BUILD
psActorSecurity[i].sDebugName = "Actor "
psActorSecurity[i].sDebugName += i
#ENDIF
SecuritySpawned[k] = TRUE
psActorSecurity[i].PedIndex = CREATE_ENEMY_PED(SecuritySpawnPoints[k].vPosition, SecuritySpawnPoints[k].fHeading, mnSecurityPed,
RELGROUPHASH_SECURITY_GUARD, 200, WEAPONTYPE_PISTOL
#IF IS_DEBUG_BUILD, psActorSecurity[i].sDebugName #ENDIF)
GO_TO_PED_STATE(psActorSecurity[i], PED_STATE_IDLE)
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF DOES_ENTITY_EXIST(psActorSecurity[0].PedIndex)
AND DOES_ENTITY_EXIST(psActorSecurity[1].PedIndex)
AND DOES_ENTITY_EXIST(psActorSecurity[2].PedIndex)
SET_MODEL_AS_NO_LONGER_NEEDED(mnSecurityPed)
iProgress++
ENDIF
BREAK
CASE 2 //update spawned security
REPEAT COUNT_OF(psActorSecurity) i
MANAGE_SECURITY_PED_AROUND_ACTOR(psActorSecurity[i], PLAYER_PED_ID())
ENDREPEAT
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_SECURITY_PED_FOR_MELTDOWN(PED_STRUCT &ped, STRING sVoiceName, PED_INDEX TargetPedIndex, INT iLOSTime)
IF DOES_ENTITY_EXIST(ped.PedIndex)
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
IF NOT IS_PED_INJURED(TargetPedIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
ENDIF
#ENDIF
ped.fDistanceToTarget = GET_DISTANCE_BETWEEN_ENTITIES(ped.PedIndex, TargetPedIndex)
CHECK_PED_LINE_OF_SIGHT_TO_PED(ped.PedIndex, TargetPedIndex, ped.bCanSeeTargetPed, ped.iLOSTimer, iLOSTime)
SWITCH ped.eState
CASE PED_STATE_IDLE
GO_TO_PED_STATE(ped, PED_STATE_STANDING_AT_LOCATION)
BREAK
CASE PED_STATE_STANDING_AT_LOCATION
IF ( ped.bHasTask = FALSE )
TASK_START_SCENARIO_IN_PLACE(ped.PedIndex, "WORLD_HUMAN_GUARD_STAND")
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ped.iConversationTimer = 0
ped.bHasTask = TRUE
ENDIF
IF ( bSecurityAlerted = TRUE )
OR ( bMeltdownSceneDisrupted = TRUE)
OR IS_PED_IN_COMBAT(ped.PedIndex)
OR IS_SECURITY_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
OR CAN_PED_SEE_PED_WEAPON(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_PERFORMING_MELEE_ACTION(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR IS_SECURITY_PED_ALERTED_BY_PED_VEHICLE_ACTIONS(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
IF ( ped.bCanSeeTargetPed = TRUE )
IF IS_ENTITY_IN_ANGLED_AREA(TargetPedIndex, <<-1143.180786,-428.372925,35.001019>>, <<-1125.562012,-426.191284,40.545696>>, 1.0)
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
IF ( bMeltdownSceneWalkedInto = TRUE )
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_AIMING_PED)
ENDIF
BREAK
CASE PED_STATE_COMBAT_AIMING_PED
SET_PED_RESET_FLAG(ped.PedIndex, PRF_BlockWeaponFire, TRUE) //block weapon fire in aiming state each frame
IF ( ped.bHasTask = FALSE )
SET_PED_COMBAT_ABILITY(ped.PedIndex, CAL_PROFESSIONAL)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_USE_COVER, FALSE)
SET_PED_COMBAT_RANGE(ped.PedIndex, CR_NEAR)
SET_PED_COMBAT_MOVEMENT(ped.PedIndex, CM_WILLADVANCE)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 1.0)
TASK_COMBAT_PED(ped.PedIndex, TargetPedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ped.iTimer = GET_GAME_TIMER()
ped.iConversationTimer = 0
ped.bHasTask = TRUE
ENDIF
IF ( bSecurityAlerted = TRUE )
OR ( bMeltdownSceneDisrupted = TRUE)
OR HAS_TIME_PASSED(5000, ped.iTimer)
OR IS_SECURITY_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
OR CAN_PED_SEE_PED_WEAPON(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_PERFORMING_MELEE_ACTION(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR IS_SECURITY_PED_ALERTED_BY_PED_VEHICLE_ACTIONS(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
IF ( ped.bCanSeeTargetPed = TRUE )
IF GET_GAME_TIMER() - ped.iConversationTimer > 0
IF ( ped.fDistanceToTarget < 30.0 )
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
TASK_LOOK_AT_ENTITY(ped.PedIndex, TargetPedIndex, 1000, SLF_WHILE_NOT_IN_FOV | SLF_FAST_TURN_RATE | SLF_USE_TORSO, SLF_LOOKAT_VERY_HIGH)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "FREEZE", sVoiceName, SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ped.iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(6000, 9000)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
IF ( ped.bHasTask = FALSE )
REMOVE_PED_DEFENSIVE_AREA(ped.PedIndex)
SET_PED_COMBAT_MOVEMENT(ped.PedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_CAN_FLANK, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_CAN_CHASE_TARGET_ON_FOOT, TRUE)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
IF ( ped.fDistanceToTarget < 25.0 )
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "FREEZE", sVoiceName, SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
TASK_LOOK_AT_ENTITY(ped.PedIndex, TargetPedIndex, 1000, SLF_WHILE_NOT_IN_FOV | SLF_FAST_TURN_RATE | SLF_USE_TORSO, SLF_LOOKAT_VERY_HIGH)
ENDIF
TASK_COMBAT_PED(ped.PedIndex, TargetPedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
bSecurityAlerted = TRUE
ped.bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF IS_ENTITY_DEAD(ped.PedIndex)
ped.eState = PED_STATE_DEAD
IF (ped.eCleanupReason = PED_CLEANUP_NO_CLEANUP)
ped.eCleanupReason = GET_PED_CLEANUP_REASON(ped)
UPDATE_PLAYER_KILL_COUNTERS(ped.eCleanupReason, iPlayerLethalKills, iPlayerStealthKills, iPlayerTakedownKills)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_SECURITY_PEDS_FOR_MELTDOWN(INT &iProgress)
SWITCH iProgress
CASE 0
iProgress++
BREAK
CASE 1
IF DOES_ENTITY_EXIST(psMeltdownSecurity[0].PedIndex)
SWITCH eMissionStage
CASE MISSION_STAGE_GET_TO_ACTOR
CASE MISSION_STAGE_GET_TO_CAR
//
BREAK
CASE MISSION_STAGE_ESCAPE_FILM_SET
BREAK
ENDSWITCH
iProgress++
ELSE
IF NOT DOES_ENTITY_EXIST(psMeltdownSecurity[0].PedIndex)
REQUEST_MODEL(mnSecurityPed)
IF HAS_MODEL_LOADED(mnSecurityPed)
psMeltdownSecurity[0].PedIndex = CREATE_ENEMY_PED(psMeltdownSecurity[0].vPosition, psMeltdownSecurity[0].fHeading, mnSecurityPed,
RELGROUPHASH_SECURITY_GUARD, 200, WEAPONTYPE_PISTOL
#IF IS_DEBUG_BUILD, psMeltdownSecurity[0].sDebugName #ENDIF)
GO_TO_PED_STATE(psMeltdownSecurity[0], PED_STATE_IDLE)
SET_MODEL_AS_NO_LONGER_NEEDED(mnSecurityPed)
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
MANAGE_SECURITY_PED_FOR_MELTDOWN(psMeltdownSecurity[0], SECURITY3VOICENAME, PLAYER_PED_ID(), 750)
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_DEVIN(INT &iProgress)
SWITCH iProgress
CASE 0
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vInteriorPosition) < 150.0
psDevin.vPosition = <<475.4521, -1313.7129, 28.2059>>
psDevin.fHeading = 233.8940
psDevin.ModelName = IG_DEVIN
iProgress++
ENDIF
BREAK
CASE 1
REQUEST_MODEL(psDevin.ModelName)
REQUEST_ANIM_DICT("misscarsteal4leadinoutcar_4_ext")
IF HAS_MODEL_LOADED(psDevin.ModelName)
AND HAS_ANIM_DICT_LOADED("misscarsteal4leadinoutcar_4_ext")
IF HAS_MISSION_PED_BEEN_CREATED(psDevin, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_DEVIN)
IF NOT IS_ENTITY_DEAD(psDevin.PedIndex)
SET_FORCE_FOOTSTEP_UPDATE(psDevin.PedIndex, TRUE)
ADD_PED_FOR_DIALOGUE(CST4Conversation, 0, psDevin.PedIndex, "DEVIN")
SET_PED_COMPONENT_VARIATION(psDevin.PedIndex, PED_COMP_HEAD, 0, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(psDevin.PedIndex, PED_COMP_HAIR, 0, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(psDevin.PedIndex, PED_COMP_TORSO, 0, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psDevin.PedIndex, PED_COMP_LEG, 0, 0, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psDevin.PedIndex, PED_COMP_HAND, 0, 0, 0) //(hand)
SET_PED_COMPONENT_VARIATION(psDevin.PedIndex, PED_COMP_FEET, 0, 0, 0) //(feet)
SET_PED_COMPONENT_VARIATION(psDevin.PedIndex, PED_COMP_TEETH, 0, 0, 0) //(feet)
SET_PED_COMPONENT_VARIATION(psDevin.PedIndex, PED_COMP_SPECIAL, 2, 0, 0) //(accs)
SET_PED_COMPONENT_VARIATION(psDevin.PedIndex, PED_COMP_SPECIAL2, 0, 0, 0) //(task)
SET_PED_COMPONENT_VARIATION(psDevin.PedIndex, PED_COMP_DECL, 0, 0, 0) //(decl)
SET_PED_COMPONENT_VARIATION(psDevin.PedIndex, PED_COMP_JBIB, 0, 0, 0) //(jbib)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(psDevin.ModelName)
psDevin.bHasTask = FALSE
psDevin.iProgress = 0
iProgress++
ENDIF
ENDIF
BREAK
CASE 2
VECTOR vScenePosition, vSceneRotation
vSceneRotation = << 0.0, 0.0, 116.8 >>
vScenePosition = << 473.682, -1314.547, 29.244 >>
IF DOES_ENTITY_EXIST(psDevin.PedIndex)
IF NOT IS_ENTITY_DEAD(psDevin.PedIndex)
IF IS_ENTITY_PLAYING_ANIM(psDevin.PedIndex, "misscarsteal4leadinoutcar_4_ext", "leadin_loop_devin")
OR IS_ENTITY_PLAYING_ANIM(psDevin.PedIndex, "misscarsteal4leadinoutcar_4_ext", "leadin_action_devin")
SET_PED_CAPSULE(psDevin.PedIndex, 0.5)
SET_PED_RESET_FLAG(psDevin.PedIndex, PRF_ExpandPedCapsuleFromSkeleton, TRUE)
ENDIF
SWITCH psDevin.iProgress
CASE 0
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psDevin.PedIndex, TRUE)
SET_RAGDOLL_BLOCKING_FLAGS(psDevin.PedIndex, RBF_PLAYER_IMPACT)
TASK_PLAY_ANIM_ADVANCED(psDevin.PedIndex, "misscarsteal4leadinoutcar_4_ext", "leadin_loop_devin",
vScenePosition, vSceneRotation, INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1,
AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE |
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
psDevin.bHasTask = FALSE
psDevin.iProgress++
BREAK
CASE 1
IF ( bLeadInTriggered = TRUE )
IF IS_ENTITY_PLAYING_ANIM(psDevin.PedIndex, "misscarsteal4leadinoutcar_4_ext", "leadin_loop_devin")
IF GET_ENTITY_ANIM_CURRENT_TIME(psDevin.PedIndex, "misscarsteal4leadinoutcar_4_ext", "leadin_loop_devin") > 0.93
TASK_LOOK_AT_ENTITY(psDevin.PedIndex, PLAYER_PED_ID(), INFINITE_TASK_TIME, SLF_WHILE_NOT_IN_FOV)
TASK_PLAY_ANIM_ADVANCED(psDevin.PedIndex, "misscarsteal4leadinoutcar_4_ext", "leadin_action_devin",
vScenePosition, vSceneRotation, SLOW_BLEND_IN, SLOW_BLEND_OUT, -1,
AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE |AF_USE_KINEMATIC_PHYSICS |
AF_HOLD_LAST_FRAME, 0, EULER_YXZ, AIK_DISABLE_LEG_IK)
psDevin.bHasTask = FALSE
psDevin.iProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF IS_ENTITY_PLAYING_ANIM(psDevin.PedIndex, "misscarsteal4leadinoutcar_4_ext", "leadin_action_devin")
SET_ENTITY_ANIM_SPEED(psDevin.PedIndex, "misscarsteal4leadinoutcar_4_ext", "leadin_action_devin", 1.0)
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_EXT_LI")
IF GET_ENTITY_ANIM_CURRENT_TIME(psDevin.PedIndex, "misscarsteal4leadinoutcar_4_ext", "leadin_action_devin") >= 0.225
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_EXT_LI", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_EXT_LI", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_EJECTOR_SEAT(PED_INDEX PedIndex, PED_INDEX TargetPedIndex, VEHICLE_INDEX VehicleIndex,
INT &iProgress, INT &iTimer, BOOL &bEjectorActivated, BOOL &bPedEjected)
IF DOES_ENTITY_EXIST(PedIndex)
IF NOT IS_ENTITY_DEAD(PedIndex)
IF NOT IS_CELLPHONE_CAMERA_IN_USE()
AND NOT IS_CINEMATIC_SHOT_ACTIVE(SHOTTYPE_CAMERA_MAN)
SWITCH iProgress
CASE 0
IF NOT IS_ENTITY_UPSIDEDOWN(VehicleIndex)
AND IS_PED_SITTING_IN_THIS_VEHICLE(PedIndex, VehicleIndex)
AND IS_PED_SITTING_IN_THIS_VEHICLE(TargetPedIndex, VehicleIndex)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_NEXT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_PREV_WEAPON)
REQUEST_PTFX_ASSET()
REQUEST_SCRIPT_AUDIO_BANK("CAR_STEAL_3_SCREAM")
REQUEST_AMBIENT_AUDIO_BANK("CAR_THEFT_MOVIE_LOT")
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_SCRIPT_RLEFT)
CLEAR_HELP()
CLEAR_PRINTS()
DISABLE_CELLPHONE(TRUE)
HANG_UP_AND_PUT_AWAY_PHONE(TRUE)
CLEAR_PED_TASKS(PedIndex)
SET_ENTITY_INVINCIBLE(PedIndex, TRUE)
IF IS_PLAYER_PLAYING(PLAYER_ID())
SPECIAL_ABILITY_DEACTIVATE(PLAYER_ID())
ENABLE_SPECIAL_ABILITY(PLAYER_ID(), FALSE)
ENDIF
START_AUDIO_SCENE("CAR_3_ACTIVATE_EJECTOR_SEAT")
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", TRUE)
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", TRUE)
SET_AUDIO_FLAG("DisableAbortConversationForDeathAndInjury", TRUE)
TASK_LOOK_AT_ENTITY(TargetPedIndex, PedIndex, 2000, SLF_WHILE_NOT_IN_FOV)
iTimer = GET_GAME_TIMER()
bEjectorActivated = TRUE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
iProgress++
ENDIF
ENDIF
BREAK
CASE 1
DISABLE_CINEMATIC_BONNET_CAMERA_THIS_UPDATE()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_NEXT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_PREV_WEAPON)
IF HAS_TIME_PASSED(20, iTimer)
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
POP_OFF_VEHICLE_ROOF_WITH_IMPULSE(VehicleIndex, << 0.0, -9.0, 10.0>>)
ENDIF
PLAY_SOUND_FROM_ENTITY(-1, "CAR_THEFT_MOVIE_LOT_EJECT_SEAT", VehicleIndex)
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_carsteal3_eject", VehicleIndex, vEjectorSeatPtfxOffset, vEjectorSeatPtfxRotation)
iTimer = GET_GAME_TIMER()
iProgress++
ENDIF
BREAK
CASE 2
DISABLE_CINEMATIC_BONNET_CAMERA_THIS_UPDATE()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_NEXT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_PREV_WEAPON)
IF HAS_TIME_PASSED(150, iTimer)
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iEjectSceneID)
iEjectSceneID = CREATE_SYNCHRONIZED_SCENE(<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
SET_SYNCHRONIZED_SCENE_LOOPED(iEjectSceneID, FALSE)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iEjectSceneID, FALSE)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iEjectSceneID, VehicleIndex, GET_ENTITY_BONE_INDEX_BY_NAME(VehicleIndex, "seat_pside_f"))
CLEAR_PED_TASKS_IMMEDIATELY(PedIndex)
SET_ENTITY_NO_COLLISION_ENTITY(PedIndex, VehicleIndex, TRUE)
TASK_SYNCHRONIZED_SCENE(PedIndex, iEjectSceneID, "misscarsteal4@actress", "eject_girl",
INSTANT_BLEND_IN, INSTANT_BLEND_OUT,
SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_PRESERVE_VELOCITY,
RBF_FALLING)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, TRUE)
ENDIF
PLAY_SOUND_FROM_ENTITY(iEjectorScreamSoundID, "Ejector_Scream", PedIndex, "CAR_STEAL_3_AGENT")
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(CS3_EJECTOR_SEAT_USED)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 4.0, REPLAY_IMPORTANCE_HIGH)
iTimer = GET_GAME_TIMER()
iProgress++
ENDIF
ENDIF
BREAK
CASE 3
DISABLE_CINEMATIC_BONNET_CAMERA_THIS_UPDATE()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_NEXT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_PREV_WEAPON)
IF IS_SYNCHRONIZED_SCENE_RUNNING(iEjectSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iEjectSceneID) >= fEjectScenePhase
CLEAR_PED_TASKS(PedIndex)
SET_PED_TO_RAGDOLL_WITH_FALL(PedIndex, 1000, 30000, TYPE_FROM_HIGH, << 0.0, 0.0, 1.0 >>, 0.0, << 0.0, 0.0, 0.0>>, << 0.0, 0.0, 0.0>>)
APPLY_FORCE_TO_ENTITY(PedIndex, APPLY_TYPE_IMPULSE, vEjectorSeatSecondaryForce, <<0.0,0.0,0.0>>,
ENUM_TO_INT(RAGDOLL_SPINE3), TRUE, TRUE, TRUE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PedIndex)
ENDIF
ENDIF
IF HAS_TIME_PASSED(1000, iTimer)
SET_ENTITY_HEALTH(PedIndex, 101)
SET_PED_DIES_WHEN_INJURED(PedIndex, TRUE)
SET_ENTITY_INVINCIBLE(PedIndex, FALSE)
IF IS_PLAYER_PLAYING(PLAYER_ID())
ENABLE_SPECIAL_ABILITY(PLAYER_ID(), TRUE)
ENDIF
DISABLE_CELLPHONE(FALSE)
bPedEjected = TRUE
STOP_AUDIO_SCENE("CAR_3_ACTIVATE_EJECTOR_SEAT")
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", FALSE)
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", FALSE)
SET_AUDIO_FLAG("DisableAbortConversationForDeathAndInjury", FALSE)
IF IS_THIS_PRINT_BEING_DISPLAYED("CAR4_EGIRL")
CLEAR_PRINTS()
ENDIF
IF ( bMusicEventDropTriggered = FALSE )
TRIGGER_MUSIC_EVENT("CAR3_DROP")
bMusicEventDropTriggered = TRUE
ENDIF
iProgress++
ENDIF
BREAK
CASE 4
IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(PedIndex)
APPLY_DAMAGE_TO_PED(PedIndex, 10, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Applying damage to ejected ped due to collision.")
#ENDIF
iProgress++
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF NOT HAS_SOUND_FINISHED(iEjectorScreamSoundID)
IF IS_ENTITY_DEAD(PedIndex)
STOP_SOUND(iEjectorScreamSoundID)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_STEER_BIAS(PED_INDEX PedIndex, VEHICLE_INDEX VehicleIndex, BOOL &bActive, INT &iTimer, INT &iTime, FLOAT &fValue,
INT iBaseTime = 3500, INT iBaseSteerTime = 500, FLOAT fBaseValue = 0.3, FLOAT fAddedValue = 0.5,
INT iSteerAddedTimeMin = 500, INT iSteerAddedTimeMax = 2500, INT iBaseTimeMin = 1500, INT iBaseTimeMax = 3000)
IF DOES_ENTITY_EXIST(PedIndex)
IF NOT IS_ENTITY_DEAD(PedIndex)
IF IS_PED_SITTING_IN_THIS_VEHICLE(PedIndex, VehicleIndex)
IF NOT IS_CINEMATIC_SHOT_ACTIVE(SHOTTYPE_CAMERA_MAN)
IF ( iTimer = 0 ) //initialise the timers
iTimer = GET_GAME_TIMER()
iTime = iBaseTime
bActive = FALSE
ELSE //run timers
IF NOT IS_VEHICLE_STOPPED(VehicleIndex)
IF ( bActive = FALSE )
IF HAS_TIME_PASSED(iTime, iTimer)
fValue = GET_RANDOM_FLOAT_IN_RANGE(-fAddedValue, fAddedValue) //calculate new value of the steer bias
IF ( fValue >= 0.0 )
fValue = fValue + fBaseValue
ELIF ( fValue < 0.0 )
fValue = fValue - fBaseValue
ENDIF
iTimer = GET_GAME_TIMER()
iTime = iBaseSteerTime + GET_RANDOM_INT_IN_RANGE(iSteerAddedTimeMin, iSteerAddedTimeMax)
IF NOT IS_ENTITY_PLAYING_ANIM(PedIndex, "misscarsteal4@actress", "car_fight_girl")
TASK_PLAY_ANIM(PedIndex, "misscarsteal4@actress", "car_fight_girl", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
ENDIF
bActive = TRUE
ENDIF
ELIF ( bActive = TRUE )
IF HAS_TIME_PASSED(iTime, iTimer) //if it is time to stop applying steer bias
iTimer = GET_GAME_TIMER()
iTime = iBaseTime + GET_RANDOM_INT_IN_RANGE(iBaseTimeMin, iBaseTimeMax)
IF IS_ENTITY_PLAYING_ANIM(PedIndex, "misscarsteal4@actress", "car_fight_girl")
CLEAR_PED_TASKS(PedIndex)
ENDIF
bActive = FALSE
ELSE //keep applying steer bias
SET_VEHICLE_STEER_BIAS(VehicleIndex, fValue)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_ACTRESS(PED_STRUCT &ped, PED_INDEX TargetPedIndex, VEHICLE_INDEX TargetVehicleIndex)
IF DOES_ENTITY_EXIST(ped.PedIndex)
ped.fDistanceToTarget = GET_DISTANCE_BETWEEN_ENTITIES(ped.PedIndex, TargetPedIndex)
#IF IS_DEBUG_BUILD
ped.sDebugName = "Actress"
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
ENDIF
#ENDIF
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
IF NOT IS_PED_INJURED(TargetPedIndex)
IF ( bEjectorSeatAllowed = TRUE )
MANAGE_EJECTOR_SEAT(ped.PedIndex, TargetPedIndex, TargetVehicleIndex, iEjectorSeatProgress,
iEjectorSeatTimer, bEjectorSeatActive, bActressEjected)
ENDIF
SWITCH ped.eState
CASE PED_STATE_IDLE
GO_TO_PED_STATE(ped, PED_STATE_SITTING_IN_CAR)
BREAK
CASE PED_STATE_SITTING_IN_CAR
IF ( ped.bHasTask = FALSE )
REQUEST_ANIM_DICT("misscarsteal4@actress")
IF HAS_ANIM_DICT_LOADED("misscarsteal4@actress")
SET_PED_CONFIG_FLAG(ped.PedIndex, PCF_FallsOutOfVehicleWhenKilled, TRUE)
TASK_PLAY_ANIM(ped.PedIndex, "misscarsteal4@actress", "sit", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
IF ( bPlayerEnteredTargetVehicle = FALSE )
TASK_LOOK_AT_ENTITY(ped.PedIndex, TargetPedIndex, INFINITE_TASK_TIME, SLF_WHILE_NOT_IN_FOV)
ENDIF
SET_PED_VISUAL_FIELD_PROPERTIES(ped.PedIndex, 30.0, 5.0, 90.0)
ped.bHasTask = TRUE
ENDIF
ENDIF
IF ARE_PEDS_IN_THE_SAME_VEHICLE(ped.PedIndex, TargetPedIndex)
IF HAS_LABEL_BEEN_TRIGGERED("CST4_APULL")
MANAGE_STEER_BIAS(ped.PedIndex, TargetVehicleIndex, bSteerBiasActive, psActress.iTimer,
iSteerBiasTimer, fSteerBiasValue, 3500, 500, 0.05, 0.035, 250, 1250)
ENDIF
ENDIF
IF ( bPlayerEnteredTargetVehicle = TRUE )
IF IS_PED_IN_THIS_VEHICLE(ped.PedIndex, TargetVehicleIndex)
IF NOT IS_PED_IN_VEHICLE(TargetPedIndex, TargetVehicleIndex)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
IF IS_VEHICLE_STOPPED(TargetVehicleIndex)
AND IS_ENTRY_POINT_FOR_SEAT_CLEAR(ped.PedIndex, TargetVehicleIndex, VS_FRONT_RIGHT)
IF ( iCarStoppedTimer = 0 )
iCarStoppedTimer = GET_GAME_TIMER()
ELSE
IF HAS_TIME_PASSED(PICK_INT(bPlayerInsideFilmStudio, 12000, 8000), iCarStoppedTimer)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
ENDIF
ELSE
iCarStoppedTimer = 0
ENDIF
ENDIF
IF ( bChaseInProgress = FALSE )
IF IS_VEHICLE_DRIVEABLE(TargetVehicleIndex)
IF IS_PED_SITTING_IN_VEHICLE(ped.PedIndex, TargetVehicleIndex)
IF IS_VEHICLE_STOPPED(TargetVehicleIndex)
IF NOT IS_PED_IN_VEHICLE(TargetPedIndex, TargetVehicleIndex)
OR IS_BULLET_IN_AREA(GET_ENTITY_COORDS(ped.PedIndex), 16.0, FALSE)
OR IS_BULLET_IN_AREA(GET_ENTITY_COORDS(ped.PedIndex), 16.0, TRUE)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF ( bSecurityAlerted = TRUE )
OR IS_FILM_CREW_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedindex)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
ENDIF
IF IS_PED_SITTING_IN_VEHICLE(TargetPedIndex, TargetVehicleIndex)
IF ( bSteerBiasActive = FALSE )
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actress", "car_panic_girl")
REQUEST_ANIM_DICT("misscarsteal4@actress")
IF HAS_ANIM_DICT_LOADED("misscarsteal4@actress")
TASK_CLEAR_LOOK_AT(ped.PedIndex)
TASK_PLAY_ANIM(ped.PedIndex, "misscarsteal4@actress", "car_panic_girl", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
ENDIF
ENDIF
ENDIF
ELSE
IF IS_FILM_CREW_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedindex)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
ENDIF
IF NOT IS_PED_IN_VEHICLE(ped.PedIndex, TargetVehicleIndex)
OR ( IS_PED_BEING_JACKED(ped.PedIndex) AND IS_PED_JACKING(TargetPedIndex) )
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
IF ( bEjectorSeatActive = TRUE )
GO_TO_PED_STATE(ped, PED_STATE_BEING_EJECTED)
ENDIF
BREAK
CASE PED_STATE_BEING_EJECTED
IF ( ped.bHasTask = FALSE )
ped.bHasTask = TRUE
ENDIF
IF ( bActressEjected = TRUE )
IF ( GET_ENTITY_HEALTH(ped.PedIndex) < 101 )
SET_ENTITY_HEALTH(ped.PedIndex, 0)
ENDIF
ENDIF
BREAK
CASE PED_STATE_FLEEING
IF ( ped.bHasTask = FALSE )
IF NOT IS_PED_RAGDOLL(ped.PedIndex)
CLEAR_PED_TASKS(ped.PedIndex)
ENDIF
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_USE_VEHICLE, FALSE)
TASK_SMART_FLEE_PED(ped.PedIndex, TargetPedIndex, 300, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, TRUE)
SET_PED_KEEP_TASK(ped.PedIndex, TRUE)
ped.bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF IS_ENTITY_DEAD(ped.PedIndex) OR ped.eState = PED_STATE_FLEEING
IF ( ped.fDistanceToTarget > 150.0 )
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
REMOVE_ANIM_DICT("misscarsteal4@actress")
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_CONVERSATIONS_FOR_DIRECTOR(PED_STRUCT &ped, PED_INDEX TargetPedIndex)
IF DOES_ENTITY_EXIST(ped.PedIndex)
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
TEXT_LABEL_23 CurrentConversationRoot
IF NOT CST4_DSCAR_TRIGGERED
IF ( ped.fDistanceToTarget < 30.0 )
IF ( ped.eState != PED_STATE_FLEEING )
AND ( ped.eState != PED_STATE_MOVING_TO_LOCATION )
IF IS_PED_IN_VEHICLE(TargetPedIndex, vsPlayersCar.VehicleIndex, TRUE)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
TEXT_LABEL_23 LocalConversationRoot
LocalConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(LocalConversationRoot)
IF NOT ARE_STRINGS_EQUAL(LocalConversationRoot, "CST4_DSW")
AND NOT ARE_STRINGS_EQUAL(LocalConversationRoot, "CST4_DSG")
AND NOT ARE_STRINGS_EQUAL(LocalConversationRoot, "CST4_DSC")
AND NOT ARE_STRINGS_EQUAL(LocalConversationroot, "CST4_DSSET1")
AND NOT ARE_STRINGS_EQUAL(LocalConversationroot, "CST4_DSSET2")
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_DSCAR", CONV_PRIORITY_MEDIUM)
CST4_DSCAR_TRIGGERED = TRUE
CST4_DBRAN_1_TRIGGERED = TRUE
CST4_DBRAN_2_TRIGGERED = TRUE
CST4_DBRAN_3_TRIGGERED = TRUE
CST4_DBRAN_4_TRIGGERED = TRUE
CST4_DBRAN_5_TRIGGERED = TRUE
CST4_DSSET1_TRIGGERED = TRUE
CST4_DSSET2_TRIGGERED = TRUE
CST4_DCHAT1_TRIGGERED = TRUE
CST4_DCHAT2_TRIGGERED = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT CST4_DSW_TRIGGERED
IF ( ped.fDistanceToTarget < 20.0 AND ped.bCanSeeTargetPed = TRUE )
WEAPON_TYPE eCurrentPlayerWeapon
IF IS_PED_SHOOTING(TargetPedIndex)
OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), ped.PedIndex)
OR HAS_PED_RECEIVED_EVENT(ped.PedIndex, EVENT_GUN_AIMED_AT)
OR IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), ped.PedIndex)
OR GET_CURRENT_PED_WEAPON(TargetPedIndex, eCurrentPlayerWeapon)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_DSW", CONV_PRIORITY_MEDIUM)
CST4_DSW_TRIGGERED = TRUE
CST4_DSG_TRIGGERED = TRUE
CST4_DSCAR_TRIGGERED = TRUE
CST4_DSSET1_TRIGGERED = TRUE
CST4_DSSET2_TRIGGERED = TRUE
CST4_DCHAT1_TRIGGERED = TRUE
CST4_DCHAT2_TRIGGERED = TRUE
CST4_DSG_PLAYING_TRIGGERED = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT CST4_DBRAN_1_TRIGGERED
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF ( bPlayerWearingTuxedo = TRUE AND ped.fDistanceToTarget < 30.0 )
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_DBRAN", "CST4_DBRAN_1", CONV_PRIORITY_MEDIUM)
ped.iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7000, 10000)
CST4_DBRAN_1_TRIGGERED = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF NOT CST4_DBRAN_2_TRIGGERED
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF ( bPlayerWearingTuxedo = TRUE AND ped.fDistanceToTarget < 30.0 )
IF GET_GAME_TIMER() - ped.iConversationTimer > 0
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_DBRAN", "CST4_DBRAN_2", CONV_PRIORITY_MEDIUM)
ped.iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(8000, 12000)
CST4_DBRAN_2_TRIGGERED = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT CST4_DBRAN_3_TRIGGERED
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF ( bPlayerWearingTuxedo = TRUE AND ped.fDistanceToTarget < 30.0 )
IF GET_GAME_TIMER() - ped.iConversationTimer > 0
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_DBRAN", "CST4_DBRAN_3", CONV_PRIORITY_MEDIUM)
ped.iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7000, 12000)
CST4_DBRAN_3_TRIGGERED = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT CST4_DBRAN_4_TRIGGERED
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF ( bPlayerWearingTuxedo = TRUE AND ped.fDistanceToTarget < 30.0 )
IF GET_GAME_TIMER() - ped.iConversationTimer > 0
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_DBRAN", "CST4_DBRAN_4", CONV_PRIORITY_MEDIUM)
ped.iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 12000)
CST4_DBRAN_4_TRIGGERED = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT CST4_DBRAN_5_TRIGGERED
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF ( bPlayerWearingTuxedo = TRUE AND ped.fDistanceToTarget < 30.0 )
IF GET_GAME_TIMER() - ped.iConversationTimer > 0
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_DBRAN", "CST4_DBRAN_5", CONV_PRIORITY_MEDIUM)
CST4_DBRAN_5_TRIGGERED = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF CST4_DBRAN_1_TRIGGERED
OR CST4_DBRAN_2_TRIGGERED
OR CST4_DBRAN_3_TRIGGERED
OR CST4_DBRAN_4_TRIGGERED
OR CST4_DBRAN_5_TRIGGERED
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF ( ped.fDistanceToTarget > 35.0 )
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot) AND ARE_STRINGS_EQUAL(CurrentConversationRoot, "CST4_DBRAN")
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT CST4_DCHAT1_TRIGGERED
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF ( bPlayerWearingTuxedo = FALSE AND ped.fDistanceToTarget < 25.0 )
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_DCHAT1", CONV_PRIORITY_MEDIUM)
CST4_DCHAT1_TRIGGERED = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF ( ped.fDistanceToTarget > 35.0 )
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot) AND ARE_STRINGS_EQUAL(CurrentConversationRoot, "CST4_DCHAT1")
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT CST4_DCHAT2_TRIGGERED
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF ( bPlayerWearingTuxedo = FALSE AND ped.fDistanceToTarget < 25.0 )
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_DCHAT2", CONV_PRIORITY_MEDIUM)
CST4_DCHAT2_TRIGGERED = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF ( ped.fDistanceToTarget > 35.0 )
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot) AND ARE_STRINGS_EQUAL(CurrentConversationRoot, "CST4_DCHAT2")
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT CST4_DSSET1_TRIGGERED
AND NOT CST4_DSSET2_TRIGGERED
IF ( ped.fDistanceToTarget < 20.0 AND ped.bCanSeeTargetPed = TRUE )
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot)
IF ARE_STRINGS_EQUAL(CurrentConversationRoot, "CST4_DBRAN")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "CST4_DCHAT1")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "CST4_DCHAT2")
CST4_DBRAN_1_TRIGGERED = TRUE
CST4_DBRAN_2_TRIGGERED = TRUE
CST4_DBRAN_3_TRIGGERED = TRUE
CST4_DBRAN_4_TRIGGERED = TRUE
CST4_DBRAN_5_TRIGGERED = TRUE
CST4_DCHAT1_TRIGGERED = TRUE
CST4_DCHAT2_TRIGGERED = TRUE
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF ( bPlayerWearingTuxedo = TRUE )
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_DSSET1", CONV_PRIORITY_MEDIUM)
TASK_LOOK_AT_ENTITY(ped.PedIndex, TargetPedIndex, 6000, SLF_WHILE_NOT_IN_FOV | SLF_FAST_TURN_RATE, SLF_LOOKAT_VERY_HIGH)
iDirectorFranklinShoutsCounter++
IF ( iDirectorFranklinShoutsCounter >= 2 )
CST4_DSSET1_TRIGGERED = TRUE
ENDIF
ENDIF
ELSE
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_DSSET2", CONV_PRIORITY_MEDIUM)
TASK_LOOK_AT_ENTITY(ped.PedIndex, TargetPedIndex, 6000, SLF_WHILE_NOT_IN_FOV | SLF_FAST_TURN_RATE, SLF_LOOKAT_VERY_HIGH)
iDirectorFranklinShoutsCounter++
IF ( iDirectorFranklinShoutsCounter >= 2 )
CST4_DSSET2_TRIGGERED = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT CST4_DSG_TRIGGERED
IF ( ped.fDistanceToTarget < 30.0 )
IF ( ped.eState != PED_STATE_FLEEING )
AND ( ped.eState != PED_STATE_MOVING_TO_LOCATION )
IF CST4_DSCAR_TRIGGERED
OR CST4_DSSET1_TRIGGERED
OR CST4_DSSET2_TRIGGERED
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_DSG", CONV_PRIORITY_MEDIUM)
CST4_DSG_TRIGGERED = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
TEXT_LABEL_23 LocalConversationRoot
LocalConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(LocalConversationRoot)
IF ARE_STRINGS_EQUAL(LocalConversationRoot, "CST4_DSG")
IF IS_SCRIPTED_SPEECH_PLAYING(ped.PedIndex)
CST4_DSG_PLAYING_TRIGGERED = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT CST4_DSC_TRIGGERED
IF ( ped.eState = PED_STATE_FLEEING )
OR ( ped.eState = PED_STATE_MOVING_TO_LOCATION )
IF ( ped.fDistanceToTarget < 25.0 )
IF IS_PED_RUNNING(ped.PedIndex) OR IS_PED_SPRINTING(ped.PedIndex)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_DSC", CONV_PRIORITY_MEDIUM)
iDirectorFleeShoutsCounter++
IF ( iDirectorFleeShoutsCounter >= 3 )
CST4_DSC_TRIGGERED = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( ped.eState = PED_STATE_FLEEING )
OR ( ped.eState = PED_STATE_MOVING_TO_LOCATION )
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot)
IF ARE_STRINGS_EQUAL(CurrentConversationRoot, "CST4_DBRAN")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "CST4_DCHAT1")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "CST4_DCHAT2")
CST4_DBRAN_1_TRIGGERED = TRUE
CST4_DBRAN_2_TRIGGERED = TRUE
CST4_DBRAN_3_TRIGGERED = TRUE
CST4_DBRAN_4_TRIGGERED = TRUE
CST4_DBRAN_5_TRIGGERED = TRUE
CST4_DCHAT1_TRIGGERED = TRUE
CST4_DCHAT2_TRIGGERED = TRUE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_DIRECTOR(PED_STRUCT &ped, PED_INDEX TargetPedIndex)
IF DOES_ENTITY_EXIST(ped.PedIndex)
ped.fDistanceToTarget = GET_DISTANCE_BETWEEN_ENTITIES(ped.PedIndex, TargetPedIndex)
CHECK_PED_LINE_OF_SIGHT_TO_PED(ped.PedIndex, TargetPedIndex, ped.bCanSeeTargetPed, ped.iLOSTimer, 1000)
#IF IS_DEBUG_BUILD
ped.sDebugName = "FCP_DIRECTOR"
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
SET_PED_NAME_DEBUG(ped.PedIndex, "FCP_DIRECTOR")
ENDIF
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
ENDIF
#ENDIF
MANAGE_CONVERSATIONS_FOR_DIRECTOR(ped, TargetPedIndex)
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
IF NOT IS_PED_INJURED(TargetPedIndex)
SET_PED_RESET_FLAG(ped.PedIndex, PRF_ForceInjuryAfterStunned, TRUE)
SWITCH ped.eState
CASE PED_STATE_PLAYING_ANIM_1
IF ( ped.bHasTask = FALSE )
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "beginning_loop_director")
TASK_PLAY_ANIM_ADVANCED(ped.PedIndex, "misscarsteal4@director_grip", "beginning_loop_director",
osPropChair.vPosition, osPropChair.vRotation,
INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1,
AF_LOOPING | AF_NOT_INTERRUPTABLE | AF_EXTRACT_INITIAL_OFFSET |
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION,
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
ELSE
SET_ENTITY_HEALTH(ped.PedIndex, 105)
SET_PED_DIES_WHEN_INJURED(ped.PedIndex, TRUE)
SET_ENTITY_NO_COLLISION_ENTITY(ped.PedIndex, osPropChair.ObjectIndex, TRUE)
ped.bHasTask = TRUE
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "beginning_loop_director")
FLOAT fAnimationPhase
SET_PED_CAPSULE(ped.PedIndex, 0.6)
SET_PED_RESET_FLAG(ped.PedIndex, PRF_ExpandPedCapsuleFromSkeleton, TRUE)
fAnimationPhase = GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@director_grip", "beginning_loop_director")
IF HAS_LABEL_BEEN_TRIGGERED("CST4_DBRAN")
//OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << -1187.17, -501.91, 33.41 >>, << -1172.83, -508.60, 37.56 >>, 12.0)
IF ( fAnimationPhase <= 0.06 OR fAnimationPhase >= 0.99 )
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_2)
ENDIF
ENDIF
ENDIF
IF ( CST4_DSW_TRIGGERED = TRUE )
OR ( bSecurityAlerted = TRUE )
OR ( bDirectorSceneDisrupted = TRUE )
OR IS_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "beginning_loop_director")
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_4)
ELSE
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
ENDIF
BREAK
CASE PED_STATE_PLAYING_ANIM_2
IF ( ped.bHasTask = FALSE )
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "react_director")
TASK_PLAY_ANIM_ADVANCED(ped.PedIndex, "misscarsteal4@director_grip", "react_director",
osPropChair.vPosition, osPropChair.vRotation,
NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1,
AF_NOT_INTERRUPTABLE | AF_EXTRACT_INITIAL_OFFSET |
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION | AF_HOLD_LAST_FRAME,
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
ELSE
SET_ENTITY_NO_COLLISION_ENTITY(ped.PedIndex, osPropChair.ObjectIndex, TRUE)
ped.bHasTask = TRUE
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "react_director")
SET_PED_CAPSULE(ped.PedIndex, 0.6)
SET_PED_RESET_FLAG(ped.PedIndex, PRF_ExpandPedCapsuleFromSkeleton, TRUE)
IF GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@director_grip", "react_director") >= 0.999
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_3)
ENDIF
ENDIF
IF ( CST4_DSW_TRIGGERED = TRUE )
OR ( bSecurityAlerted = TRUE )
OR ( bDirectorSceneDisrupted = TRUE )
OR IS_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "react_director")
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@director_grip", "react_director") <= 0.118
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_4)
ELSE
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
ENDIF
BREAK
CASE PED_STATE_PLAYING_ANIM_3
IF ( ped.bHasTask = FALSE )
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "end_loop_director")
TASK_PLAY_ANIM_ADVANCED(ped.PedIndex, "misscarsteal4@director_grip", "end_loop_director",
osPropChair.vPosition, osPropChair.vRotation,
NORMAL_BLEND_IN, WALK_BLEND_OUT, -1,
AF_LOOPING | AF_NOT_INTERRUPTABLE | AF_EXTRACT_INITIAL_OFFSET |
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION,
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
ELSE
SET_ENTITY_NO_COLLISION_ENTITY(ped.PedIndex, osPropChair.ObjectIndex, TRUE)
ped.bHasTask = TRUE
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "end_loop_director")
SET_PED_CAPSULE(ped.PedIndex, 0.6)
SET_PED_RESET_FLAG(ped.PedIndex, PRF_ExpandPedCapsuleFromSkeleton, TRUE)
ENDIF
IF ( CST4_DSW_TRIGGERED = TRUE )
OR ( bSecurityAlerted = TRUE )
OR ( bDirectorSceneDisrupted = TRUE )
OR IS_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
SET_PED_MOVEMENT_CLIPSET(ped.PedIndex, "move_injured_generic")
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
BREAK
CASE PED_STATE_PLAYING_ANIM_4
IF ( ped.bHasTask = FALSE )
IF NOT IS_PED_RAGDOLL(ped.PedIndex)
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "flee_exit_fwd_director")
TASK_PLAY_ANIM_ADVANCED(ped.PedIndex, "misscarsteal4@director_grip", "flee_exit_fwd_director",
osPropChair.vPosition, osPropChair.vRotation,
SLOW_BLEND_IN, WALK_BLEND_OUT, -1,
AF_NOT_INTERRUPTABLE | AF_EXTRACT_INITIAL_OFFSET |
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION | AF_HOLD_LAST_FRAME,
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
ELSE
SET_ENTITY_NO_COLLISION_ENTITY(ped.PedIndex, osPropChair.ObjectIndex, TRUE)
ped.bHasTask = TRUE
ENDIF
ELSE
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
ENDIF
IF ( ped.bHasTask = TRUE )
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "flee_exit_fwd_director")
IF GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@director_grip", "flee_exit_fwd_director") >= 0.725
GO_TO_PED_STATE(ped, PED_STATE_MOVING_TO_LOCATION)
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_MOVING_TO_LOCATION
IF ( ped.bHasTask = FALSE )
CLEAR_PED_TASKS(ped.PedIndex)
/*
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_ALWAYS_FLEE, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_DISABLE_COWER, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_DISABLE_HANDS_UP, TRUE)
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1178.16, -499.45, 34.57 >>, PEDMOVE_SPRINT, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1188.00, -496.22, 34.57 >>, PEDMOVE_SPRINT, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1198.91, -495.79, 34.49 >>, PEDMOVE_SPRINT, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
TASK_SMART_FLEE_PED(NULL, TargetPedIndex, 300, -1)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(ped.PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
*/
TASK_COWER(ped.PedIndex, 7000)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)//TRUE)
//SET_PED_KEEP_TASK(ped.PedIndex, TRUE)
bDirectorSceneDisrupted = TRUE
ped.iTimer = GET_GAME_TIMER()
ped.bHasTask = TRUE
ENDIF
IF ( ped.bHasTask = TRUE )
IF HAS_TIME_PASSED(5000, ped.iTimer)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
/*
IF GET_SCRIPT_TASK_STATUS(ped.PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK
IF IS_PED_FLEEING(ped.PedIndex)
OR GET_SEQUENCE_PROGRESS(ped.PedIndex) = 3
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
ENDIF
*/
ENDIF
BREAK
CASE PED_STATE_FLEEING
IF ( ped.bHasTask = FALSE )
bDirectorSceneDisrupted = TRUE
IF NOT IS_PED_RAGDOLL(ped.PedIndex)
IF NOT IS_PED_FLEEING(ped.PedIndex)
CLEAR_PED_TASKS(ped.PedIndex)
CLEAR_RAGDOLL_BLOCKING_FLAGS(ped.PedIndex, RBF_MELEE | RBF_PLAYER_IMPACT)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_ALWAYS_FLEE, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_DISABLE_COWER, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_DISABLE_HANDS_UP, TRUE)
TASK_SMART_FLEE_PED(ped.PedIndex, TargetPedIndex, 300, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, TRUE)
SET_PED_KEEP_TASK(ped.PedIndex, TRUE)
ELSE
ped.bHasTask = TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(ped.PedIndex) OR ped.eState = PED_STATE_FLEEING //cleanup ped when ped is not dead or fleeing
IF ( bPlayerInsideFilmStudio = FALSE )
IF ( ped.fDistanceToTarget > 200.0 )
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
REMOVE_CLIP_SET("move_injured_generic")
REMOVE_ANIM_DICT("misscarsteal4@director_grip")
CLEANUP_OBJECT(osPropChair.ObjectIndex, FALSE) //cleanup prop that this ped is using
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_DEAD(ped.PedIndex) OR ped.eState = PED_STATE_FLEEING //cleanup ped when ped is dead or fleeing
IF IS_ENTITY_DEAD(ped.PedIndex)
ped.eState = PED_STATE_DEAD
IF (ped.eCleanupReason = PED_CLEANUP_NO_CLEANUP)
ped.eCleanupReason = GET_PED_CLEANUP_REASON(ped)
UPDATE_PLAYER_KILL_COUNTERS(ped.eCleanupReason, iPlayerLethalKills, iPlayerStealthKills, iPlayerTakedownKills)
ENDIF
ENDIF
IF ( ped.fDistanceToTarget > 200.0 )
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
REMOVE_CLIP_SET("move_injured_generic")
REMOVE_ANIM_DICT("misscarsteal4@director_grip")
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_GRIP_1(PED_STRUCT &ped, PED_INDEX TargetPedIndex)
IF DOES_ENTITY_EXIST(ped.PedIndex)
ped.fDistanceToTarget = GET_DISTANCE_BETWEEN_ENTITIES(ped.PedIndex, TargetPedIndex)
#IF IS_DEBUG_BUILD
ped.sDebugName = "FCP_GRIP_1"
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
SET_PED_NAME_DEBUG(ped.PedIndex, "FCP_GRIP_1")
ENDIF
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
ENDIF
#ENDIF
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
IF NOT IS_PED_INJURED(TargetPedIndex)
IF ( ped.eState != PED_STATE_FLEEING )
IF ( CST4_DSW_TRIGGERED = TRUE )
OR ( bSecurityAlerted = TRUE )
OR ( bDirectorSceneDisrupted = TRUE )
OR IS_PED_DEAD_OR_DYING(ped.PedIndex)
OR IS_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
ENDIF
SWITCH ped.eState
CASE PED_STATE_PLAYING_ANIM_1
IF ( ped.bHasTask = FALSE )
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "beginning_loop_grip")
TASK_PLAY_ANIM_ADVANCED(ped.PedIndex, "misscarsteal4@director_grip", "beginning_loop_grip",
osPropChair.vPosition, osPropChair.vRotation,
INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1,
AF_LOOPING | AF_NOT_INTERRUPTABLE | AF_EXTRACT_INITIAL_OFFSET |
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION,
0, EULER_YXZ, AIK_DISABLE_ARM_IK)
ELSE
ped.bHasTask = TRUE
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "beginning_loop_grip")
SET_PED_CAPSULE(ped.PedIndex, 0.6)
SET_PED_RESET_FLAG(ped.PedIndex, PRF_ExpandPedCapsuleFromSkeleton, TRUE)
IF (psFilmCrew[FCP_DIRECTOR].eState = PED_STATE_PLAYING_ANIM_2)
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_2)
ENDIF
ENDIF
BREAK
CASE PED_STATE_PLAYING_ANIM_2
IF ( ped.bHasTask = FALSE )
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "react_grip")
TASK_PLAY_ANIM_ADVANCED(ped.PedIndex, "misscarsteal4@director_grip", "react_grip",
osPropChair.vPosition, osPropChair.vRotation,
NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1,
AF_NOT_INTERRUPTABLE | AF_EXTRACT_INITIAL_OFFSET |
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION | AF_HOLD_LAST_FRAME,
0, EULER_YXZ, AIK_DISABLE_ARM_IK)
ELSE
ped.bHasTask = TRUE
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "react_grip")
FLOAT fAnimationPhase
SET_PED_CAPSULE(ped.PedIndex, 0.6)
SET_PED_RESET_FLAG(ped.PedIndex, PRF_ExpandPedCapsuleFromSkeleton, TRUE)
fAnimationPhase = GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@director_grip", "react_grip")
IF DOES_ENTITY_EXIST(osPropClipboard.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osPropClipboard.ObjectIndex)
IF IS_ENTITY_ATTACHED(osPropClipboard.ObjectIndex)
IF ( fAnimationPhase >= 0.6)
DETACH_ENTITY(osPropClipboard.ObjectIndex, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
IF (psFilmCrew[FCP_DIRECTOR].eState = PED_STATE_PLAYING_ANIM_3)
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_3)
ENDIF
ENDIF
BREAK
CASE PED_STATE_PLAYING_ANIM_3
IF ( ped.bHasTask = FALSE )
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "end_loop_grip")
TASK_PLAY_ANIM_ADVANCED(ped.PedIndex, "misscarsteal4@director_grip", "end_loop_grip",
osPropChair.vPosition, osPropChair.vRotation,
NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1,
AF_LOOPING | AF_NOT_INTERRUPTABLE | AF_EXTRACT_INITIAL_OFFSET |
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION,
0, EULER_YXZ, AIK_DISABLE_ARM_IK)
ELSE
ped.bHasTask = TRUE
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "end_loop_grip")
SET_PED_CAPSULE(ped.PedIndex, 0.6)
SET_PED_RESET_FLAG(ped.PedIndex, PRF_ExpandPedCapsuleFromSkeleton, TRUE)
ENDIF
BREAK
CASE PED_STATE_FLEEING
IF ( ped.bHasTask = FALSE )
bDirectorSceneDisrupted = TRUE
IF NOT IS_PED_RAGDOLL(ped.PedIndex)
CLEAR_PED_TASKS(ped.PedIndex)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_ALWAYS_FLEE, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_DISABLE_COWER, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_DISABLE_HANDS_UP, TRUE)
IF DOES_ENTITY_EXIST(osPropClipboard.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osPropClipboard.ObjectIndex)
IF IS_ENTITY_ATTACHED(osPropClipboard.ObjectIndex)
DETACH_ENTITY(osPropClipboard.ObjectIndex, FALSE)
ENDIF
ENDIF
ENDIF
TASK_SMART_FLEE_PED(ped.PedIndex, TargetPedIndex, 300, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, TRUE)
SET_PED_KEEP_TASK(ped.PedIndex, TRUE)
ped.bHasTask = TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(ped.PedIndex) OR ped.eState = PED_STATE_FLEEING //cleanup ped when ped is not dead or fleeing
IF ( bPlayerInsideFilmStudio = FALSE )
IF ( ped.fDistanceToTarget > 200.0 )
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
REMOVE_ANIM_DICT("misscarsteal4@director_grip")
CLEANUP_OBJECT(osPropClipboard.ObjectIndex, FALSE) //cleanup prop that this ped is using
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_DEAD(ped.PedIndex) OR ped.eState = PED_STATE_FLEEING
IF IS_ENTITY_DEAD(ped.PedIndex)
IF DOES_ENTITY_EXIST(osPropClipboard.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osPropClipboard.ObjectIndex)
IF IS_ENTITY_ATTACHED(osPropClipboard.ObjectIndex)
DETACH_ENTITY(osPropClipboard.ObjectIndex, FALSE)
ENDIF
ENDIF
ENDIF
ped.eState = PED_STATE_DEAD
IF (ped.eCleanupReason = PED_CLEANUP_NO_CLEANUP)
ped.eCleanupReason = GET_PED_CLEANUP_REASON(ped)
UPDATE_PLAYER_KILL_COUNTERS(ped.eCleanupReason, iPlayerLethalKills, iPlayerStealthKills, iPlayerTakedownKills)
ENDIF
ENDIF
IF ( ped.fDistanceToTarget > 200.0 )
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
CLEANUP_OBJECT(osPropClipboard.ObjectIndex, FALSE) //cleanup prop that this ped is using
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_FILM_CREW_PED(PED_STRUCT &ped, PED_INDEX TargetPedIndex, VEHICLE_INDEX TargetVehicleIndex,
VECTOR vScenarioPosition, STRING sScenarioName, BOOL bShouldBlockPlayer #IF IS_DEBUG_BUILD, STRING DebugName #ENDIF)
IF DOES_ENTITY_EXIST(ped.PedIndex)
ped.fDistanceToTarget = GET_DISTANCE_BETWEEN_ENTITIES(ped.PedIndex, TargetPedIndex)
#IF IS_DEBUG_BUILD
ped.sDebugName = DebugName
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
SET_PED_NAME_DEBUG(ped.PedIndex, DebugName)
ENDIF
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
ENDIF
#ENDIF
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
IF NOT IS_PED_INJURED(TargetPedIndex)
CHECK_PED_LINE_OF_SIGHT_TO_PED(ped.PedIndex, TargetPedIndex, ped.bCanSeeTargetPed, ped.iLOSTimer, 1000)
SWITCH ped.eState
CASE PED_STATE_STARTING_SCENARIO_WARP
IF ( ped.bHasTask = FALSE )
IF NOT IS_PED_USING_SCENARIO(ped.PedIndex, sScenarioName)
IF DOES_SCENARIO_EXIST_IN_AREA(vScenarioPosition, 1.5, FALSE)
CLEAR_PED_TASKS(ped.PedIndex)
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(ped.PedIndex, vScenarioPosition, 1.5)
ENDIF
ped.iTimer = GET_GAME_TIMER()
ped.bHasTask = TRUE
ENDIF
ENDIF
IF ( ped.bHasTask = TRUE )
IF IS_PED_USING_SCENARIO(ped.PedIndex, sScenarioName)
AND IS_PED_ACTIVE_IN_SCENARIO(ped.PedIndex)
GO_TO_PED_STATE(ped, PED_STATE_USING_SCENARIO)
ELSE
IF HAS_TIME_PASSED(3000, ped.iTimer)
GO_TO_PED_STATE(ped, PED_STATE_STARTING_SCENARIO_WARP)
ENDIF
ENDIF
ENDIF
IF ( CST4_DSW_TRIGGERED = TRUE )
OR ( bDirectorSceneDisrupted = TRUE )
OR IS_FILM_CREW_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
BREAK
CASE PED_STATE_USING_SCENARIO
IF ( ped.bHasTask = FALSE )
//
ped.bHasTask = TRUE
ENDIF
IF NOT IS_PED_USING_SCENARIO(ped.PedIndex, sScenarioName)
GO_TO_PED_STATE(ped, PED_STATE_STARTING_SCENARIO_WARP)
ENDIF
IF ( CST4_DSW_TRIGGERED = TRUE )
OR ( bDirectorSceneDisrupted = TRUE )
OR IS_FILM_CREW_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
IF ( ped.bCanSeeTargetPed = TRUE AND ped.fDistanceToTarget < 15.0 )
WEAPON_TYPE eCurrentPlayerWeapon
IF IS_PED_SHOOTING(TargetPedIndex)
OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), ped.PedIndex)
OR IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), ped.PedIndex)
OR GET_CURRENT_PED_WEAPON(TargetPedIndex, eCurrentPlayerWeapon)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
ENDIF
IF ( bShouldBlockPlayer = TRUE )
IF DOES_ENTITY_EXIST(GET_VEHICLE_PED_IS_USING(TargetPedIndex))
IF GET_VEHICLE_PED_IS_USING(TargetPedIndex) = TargetVehicleIndex
IF GET_DISTANCE_BETWEEN_ENTITIES(TargetPedIndex, TargetVehicleIndex) < 2.0
GO_TO_PED_STATE(ped, PED_STATE_MOVING_TO_LOCATION)
ENDIF
ENDIF
ENDIF
IF IS_PED_IN_THIS_VEHICLE(TargetPedIndex, TargetVehicleIndex, TRUE)
GO_TO_PED_STATE(ped, PED_STATE_MOVING_TO_LOCATION)
ENDIF
ENDIF
BREAK
CASE PED_STATE_MOVING_TO_LOCATION
IF ( ped.bHasTask = FALSE )
REQUEST_ANIM_DICT("misscarsteal4@director_grip")
IF HAS_ANIM_DICT_LOADED("misscarsteal4@director_grip")
SET_PED_SHOULD_PLAY_IMMEDIATE_SCENARIO_EXIT(ped.PedIndex)
CLEAR_PED_TASKS(ped.PedIndex)
SET_ENTITY_HEALTH(ped.PedIndex, 105)
VECTOR vDestination, vRotation
vDestination = GET_ANIM_INITIAL_OFFSET_POSITION("misscarsteal4@director_grip", "mcs_2_loop_grip1", vFilmCrewPedsScenePosition,
vFilmCrewPedsSceneRotation)
vRotation = GET_ANIM_INITIAL_OFFSET_ROTATION("misscarsteal4@director_grip", "mcs_2_loop_grip1", vFilmCrewPedsScenePosition,
vFilmCrewPedsSceneRotation)
vDestination = << -1175.94, -508.15, 34.57 >>
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(ped.PedIndex), vDestination) < 7.5
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, TargetPedIndex)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vDestination, PEDMOVE_RUN/*1.35*/, DEFAULT_TIME_BEFORE_WARP * 2, 0.0, ENAV_ACCURATE_WALKRUN_START | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED, vRotation.z)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(ped.PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
ped.bHasTask = TRUE
ELSE
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
ENDIF
IF ( ped.bHasTask = TRUE )
IF GET_SCRIPT_TASK_STATUS(ped.PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(ped.PedIndex), << -1175.56, -507.77, 34.57 >>) < 1.5
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "mcs_2_loop_grip1")
TASK_PLAY_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "mcs_2_loop_grip1", WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_SECONDARY | AF_UPPERBODY | AF_LOOPING)
TASK_LOOK_AT_ENTITY(ped.PedIndex, TargetPedIndex, INFINITE_TASK_TIME, SLF_WHILE_NOT_IN_FOV)
ENDIF
ENDIF
ENDIF
IF GET_SCRIPT_TASK_STATUS(ped.PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK
IF IS_PED_IN_THIS_VEHICLE(TargetPedIndex, TargetVehicleIndex)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(vsPlayersCar.VehicleIndex), vsPlayersCar.vPosition) > 1.75
GO_TO_PED_STATE(ped, PED_STATE_JACKING_PLAYER)
ENDIF
ENDIF
ENDIF
IF GET_SCRIPT_TASK_STATUS(ped.PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "GENERIC_FRIGHTENED_HIGH", "A_M_Y_Vinewood_03_White_FULL_01 ", SPEECH_PARAMS_FORCE_SHOUTED)
GO_TO_PED_STATE(ped, PED_STATE_BLOCKING_PLAYER)
ENDIF
ENDIF
BREAK
CASE PED_STATE_BLOCKING_PLAYER
IF ( ped.bHasTask = FALSE )
SET_ENTITY_HEALTH(ped.PedIndex, 105)
SET_PED_CAN_BE_TARGETTED(ped.PedIndex, TRUE)
TASK_PLAY_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "mcs_2_loop_grip1", WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_LOOPING)
TASK_LOOK_AT_ENTITY(ped.PedIndex, TargetPedIndex, INFINITE_TASK_TIME, SLF_WHILE_NOT_IN_FOV)
ped.iTimer = GET_GAME_TIMER()
ped.iProgress = 0
ped.bHasTask = TRUE
ENDIF
IF ped.iProgress = 0
IF HAS_TIME_PASSED(250, ped.iTimer)
CLEAR_PED_SECONDARY_TASK(ped.PedIndex)
ped.iProgress = 1
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@director_grip", "mcs_2_loop_grip1")
IF HAS_TIME_PASSED(5000, ped.iTimer)
IF IS_VEHICLE_DRIVEABLE(TargetVehicleIndex)
GO_TO_PED_STATE(ped, PED_STATE_JACKING_PLAYER)
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(TargetVehicleIndex)
IF NOT IS_PED_IN_VEHICLE(TargetPedIndex, TargetVehicleIndex)
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ELSE
IF ( ped.fDistanceToTarget < 2.25 )
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_JACKING_PLAYER
IF ( ped.bHasTask = FALSE )
TASK_CLEAR_LOOK_AT(ped.PedIndex)
TASK_ENTER_VEHICLE(ped.PedIndex, TargetVehicleIndex, -1, VS_DRIVER, PEDMOVE_RUN, ECF_USE_LEFT_ENTRY | ECF_RESUME_IF_INTERRUPTED | ECF_JUST_PULL_PED_OUT | ECF_JACK_ANYONE | ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP)
ped.bHasTask = TRUE
ENDIF
IF IS_VEHICLE_DRIVEABLE(TargetVehicleIndex)
IF NOT IS_PED_IN_VEHICLE(TargetPedIndex, TargetVehicleIndex)
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
IF ( ped.bHasTask = FALSE )
TASK_CLEAR_LOOK_AT(ped.PedIndex)
CLEAR_PED_SECONDARY_TASK(ped.PedIndex)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_FIGHT_PROFICIENCY, 1.0)
TASK_COMBAT_PED(ped.PedIndex, TargetPedIndex)
ped.bHasTask = TRUE
ENDIF
IF ( ped.bCanSeeTargetPed = TRUE )
IF IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), ped.PedIndex)
OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), ped.PedIndex)
WEAPON_TYPE eCurrentWeapon
IF GET_CURRENT_PED_WEAPON(TargetPedIndex, eCurrentWeapon)
IF ( eCurrentWeapon <> WEAPONTYPE_UNARMED)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_FLEEING
IF ( ped.bHasTask = FALSE )
CLEAR_PED_TASKS(ped.PedIndex)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_ALWAYS_FLEE, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_DISABLE_COWER, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_DISABLE_HANDS_UP, TRUE)
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "SCREAM_PANIC", "WAVELOAD_PAIN_MALE", SPEECH_PARAMS_FORCE_SHOUTED)
ENDIF
TASK_SMART_FLEE_PED(ped.PedIndex, TargetPedIndex, 300, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
SET_PED_KEEP_TASK(ped.PedIndex, TRUE)
bFilmCrewGripAlerted = TRUE
ped.bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
IF ( bPlayerInsideFilmStudio = FALSE )
IF ( ped.fDistanceToTarget > 300.0 )
GO_TO_PED_STATE(ped, PED_STATE_DEAD)
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting ped with debug name ", ped.sDebugName, " as no longer needed due to player distance.")
#ENDIF
ENDIF
ENDIF
IF ( ped.eState = PED_STATE_FLEEING )
IF ( ped.fDistanceToTarget > 200.0 )
GO_TO_PED_STATE(ped, PED_STATE_DEAD)
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting ped with debug name ", ped.sDebugName, " as no longer needed due to fleeing distance.")
#ENDIF
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_DEAD(ped.PedIndex)
ped.eState = PED_STATE_DEAD
IF (ped.eCleanupReason = PED_CLEANUP_NO_CLEANUP)
ped.eCleanupReason = GET_PED_CLEANUP_REASON(ped)
UPDATE_PLAYER_KILL_COUNTERS(ped.eCleanupReason, iPlayerLethalKills, iPlayerStealthKills, iPlayerTakedownKills)
ENDIF
IF ( ped.fDistanceToTarget > 200.0 )
GO_TO_PED_STATE(ped, PED_STATE_DEAD)
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting ped with debug name ", ped.sDebugName, " as no longer needed due to dead distance.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_DIRECTOR_AND_GRIP(INT &iProgress)
SWITCH iProgress
CASE 0
iProgress++
BREAK
CASE 1
REQUEST_CLIP_SET("move_injured_generic")
REQUEST_ANIM_DICT("misscarsteal4@director_grip")
IF HAS_CLIP_SET_LOADED("move_injured_generic")
AND HAS_ANIM_DICT_LOADED("misscarsteal4@director_grip")
IF HAS_MISSION_OBJECT_BEEN_CREATED(osPropChair)
AND HAS_MISSION_OBJECT_BEEN_CREATED(osPropClipboard)
IF HAS_MISSION_PED_BEEN_CREATED(psFilmCrew[FCP_GRIP_1], FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE)
AND HAS_MISSION_PED_BEEN_CREATED(psFilmCrew[FCP_DIRECTOR], FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE)
IF NOT IS_PED_INJURED(psFilmCrew[FCP_DIRECTOR].PedIndex)
SET_PED_PROP_INDEX(psFilmCrew[FCP_DIRECTOR].PedIndex, ANCHOR_EYES, 0, 0)
ADD_PED_FOR_DIALOGUE(CST4Conversation, 7, psFilmCrew[FCP_DIRECTOR].PedIndex, "CST4DIRECTOR")
ENDIF
IF NOT IS_PED_INJURED(psFilmCrew[FCP_GRIP_1].PedIndex)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GRIP_1].PedIndex, PED_COMP_HEAD, 1, 1, 0) //(head)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GRIP_1].PedIndex, PED_COMP_TORSO, 1, 1, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GRIP_1].PedIndex, PED_COMP_LEG, 0, 1, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GRIP_1].PedIndex, PED_COMP_SPECIAL, 2, 0, 0) //(accs)
ENDIF
IF DOES_ENTITY_EXIST(osPropClipboard.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osPropClipboard.ObjectIndex)
IF NOT IS_ENTITY_ATTACHED(osPropClipboard.ObjectIndex)
IF NOT IS_PED_INJURED(psFilmCrew[FCP_GRIP_1].PedIndex)
ATTACH_ENTITY_TO_ENTITY(osPropClipboard.ObjectIndex, psFilmCrew[FCP_GRIP_1].PedIndex,
GET_PED_BONE_INDEX(psFilmCrew[FCP_GRIP_1].PedIndex, BONETAG_PH_L_HAND),
<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
ENDIF
ENDIF
ENDIF
ENDIF
GO_TO_PED_STATE(psFilmCrew[FCP_GRIP_1], PED_STATE_PLAYING_ANIM_1)
GO_TO_PED_STATE(psFilmCrew[FCP_DIRECTOR], PED_STATE_PLAYING_ANIM_1)
SET_PED_VISUAL_FIELD_PROPERTIES(psFilmCrew[FCP_GRIP_1].PedIndex, 30.0, 5.0, 90.0)
SET_PED_VISUAL_FIELD_PROPERTIES(psFilmCrew[FCP_DIRECTOR].PedIndex, 30.0, 5.0, 90.0)
iProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
MANAGE_DIRECTOR(psFilmCrew[FCP_DIRECTOR], PLAYER_PED_ID())
MANAGE_GRIP_1(psFilmCrew[FCP_GRIP_1], PLAYER_PED_ID())
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_FILM_CREW(INT &iProgress)
SWITCH iProgress
CASE 0
iProgress++
BREAK
CASE 1
//this needs a better check
//what if ped is killed or flees in the get to car stage and the player returns to the set and moves the mission on
//it would probably recreate the ped again
IF ( psFilmCrew[FCP_GRIP_2].eState = PED_STATE_DEAD OR HAS_MISSION_PED_BEEN_CREATED(psFilmCrew[FCP_GRIP_2], FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE) )
AND ( psFilmCrew[FCP_GRIP_3].eState = PED_STATE_DEAD OR HAS_MISSION_PED_BEEN_CREATED(psFilmCrew[FCP_GRIP_3], FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE) )
AND ( psFilmCrew[FCP_GRIP_4].eState = PED_STATE_DEAD OR HAS_MISSION_PED_BEEN_CREATED(psFilmCrew[FCP_GRIP_4], FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE) )
AND ( psFilmCrew[FCP_GRIP_5].eState = PED_STATE_DEAD OR HAS_MISSION_PED_BEEN_CREATED(psFilmCrew[FCP_GRIP_5], FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE) )
IF NOT IS_PED_INJURED(psFilmCrew[FCP_GRIP_2].PedIndex)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GRIP_2].PedIndex, PED_COMP_HEAD, 0, 1, 0) //(head)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GRIP_2].PedIndex, PED_COMP_TORSO, 0, 2, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GRIP_2].PedIndex, PED_COMP_LEG, 0, 2, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psFilmCrew[FCP_GRIP_2].PedIndex, PED_COMP_SPECIAL, 0, 0, 0) //(accs)
ENDIF
SWITCH eMissionStage
CASE MISSION_STAGE_GET_TO_ACTOR
CASE MISSION_STAGE_GET_TO_CAR
IF NOT IS_PED_INJURED(psFilmCrew[FCP_GRIP_2].PedIndex)
GO_TO_PED_STATE(psFilmCrew[FCP_GRIP_2], PED_STATE_STARTING_SCENARIO_WARP)
ENDIF
IF NOT IS_PED_INJURED(psFilmCrew[FCP_GRIP_3].PedIndex)
GO_TO_PED_STATE(psFilmCrew[FCP_GRIP_3], PED_STATE_STARTING_SCENARIO_WARP)
ENDIF
IF NOT IS_PED_INJURED(psFilmCrew[FCP_GRIP_4].PedIndex)
GO_TO_PED_STATE(psFilmCrew[FCP_GRIP_4], PED_STATE_STARTING_SCENARIO_WARP)
ENDIF
IF NOT IS_PED_INJURED(psFilmCrew[FCP_GRIP_5].PedIndex)
GO_TO_PED_STATE(psFilmCrew[FCP_GRIP_5], PED_STATE_STARTING_SCENARIO_WARP)
ENDIF
BREAK
CASE MISSION_STAGE_ESCAPE_FILM_SET
IF NOT IS_PED_INJURED(psFilmCrew[FCP_GRIP_2].PedIndex)
IF psFilmCrew[FCP_GRIP_2].eState != PED_STATE_DEAD
AND psFilmCrew[FCP_GRIP_2].eState != PED_STATE_FLEEING
AND psFilmCrew[FCP_GRIP_2].eState != PED_STATE_MOVING_TO_LOCATION
AND psFilmCrew[FCP_GRIP_2].eState != PED_STATE_BLOCKING_PLAYER
GO_TO_PED_STATE(psFilmCrew[FCP_GRIP_2], PED_STATE_MOVING_TO_LOCATION)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(psFilmCrew[FCP_GRIP_3].PedIndex)
IF psFilmCrew[FCP_GRIP_3].eState != PED_STATE_DEAD
AND psFilmCrew[FCP_GRIP_3].eState != PED_STATE_FLEEING
GO_TO_PED_STATE(psFilmCrew[FCP_GRIP_3], PED_STATE_STARTING_SCENARIO_WARP)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(psFilmCrew[FCP_GRIP_4].PedIndex)
IF psFilmCrew[FCP_GRIP_4].eState != PED_STATE_DEAD
AND psFilmCrew[FCP_GRIP_4].eState != PED_STATE_FLEEING
GO_TO_PED_STATE(psFilmCrew[FCP_GRIP_4], PED_STATE_STARTING_SCENARIO_WARP)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(psFilmCrew[FCP_GRIP_5].PedIndex)
IF psFilmCrew[FCP_GRIP_5].eState != PED_STATE_DEAD
AND psFilmCrew[FCP_GRIP_5].eState != PED_STATE_FLEEING
GO_TO_PED_STATE(psFilmCrew[FCP_GRIP_5], PED_STATE_STARTING_SCENARIO_WARP)
ENDIF
ENDIF
BREAK
ENDSWITCH
iProgress++
ENDIF
BREAK
CASE 2
MANAGE_FILM_CREW_PED(psFilmCrew[FCP_GRIP_2], PLAYER_PED_ID(), vsPlayersCar.VehicleIndex,
<<-1170.0442, -511.5512, 34.5666>>/*<< -1172.57, -506.53, 34.57 >>*/, "PROP_HUMAN_MOVIE_STUDIO_LIGHT", TRUE
#IF IS_DEBUG_BUILD, "FCP_GRIP_2" #ENDIF)
MANAGE_FILM_CREW_PED(psFilmCrew[FCP_GRIP_3], PLAYER_PED_ID(), vsPlayersCar.VehicleIndex,
<< -1186.86, -505.80, 34.58 >>, "PROP_HUMAN_MOVIE_STUDIO_LIGHT", FALSE
#IF IS_DEBUG_BUILD, "FCP_GRIP_3" #ENDIF)
MANAGE_FILM_CREW_PED(psFilmCrew[FCP_GRIP_4], PLAYER_PED_ID(), vsPlayersCar.VehicleIndex,
<< -1178.57, -488.17, 34.55 >>, "PROP_HUMAN_MOVIE_BULB", FALSE
#IF IS_DEBUG_BUILD, "FCP_GRIP_4" #ENDIF)
MANAGE_FILM_CREW_PED(psFilmCrew[FCP_GRIP_5], PLAYER_PED_ID(), vsPlayersCar.VehicleIndex,
<< -1175.81, -483.17, 34.54 >>, "PROP_HUMAN_MOVIE_STUDIO_LIGHT", FALSE
#IF IS_DEBUG_BUILD, "FCP_GRIP_5" #ENDIF)
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_CONVERSATIONS_FOR_ACTOR(PED_STRUCT &ped, PED_INDEX TargetPedIndex)
IF DOES_ENTITY_EXIST(ped.PedIndex)
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
SWITCH ped.eState
CASE PED_STATE_ARGUING
CASE PED_STATE_PLAYING_ANIM_1
CASE PED_STATE_PLAYING_ANIM_2
CASE PED_STATE_PLAYING_ANIM_3
CASE PED_STATE_PLAYING_ANIM_4
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_MSARG")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_berating_assistant")
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSARG", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_MSARG", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4", FALSE)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 15.0, REPLAY_IMPORTANCE_HIGHEST)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_MSVOC1_1")
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_1")
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_1") >= 0.1
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_1") <= 0.375
IF ( ped.fDistanceToTarget < 35.0 )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSVOC1", CONV_PRIORITY_MEDIUM)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSVOC1", "CST4_MSVOC1_1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_1", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_2", FALSE)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_HIGH)
ENDIF
ENDIF
ENDIF
ELSE
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_1", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_2", FALSE)
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_MSVOC1_2")
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_1")
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_1") >= 0.430
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_1") <= 0.880
IF ( ped.fDistanceToTarget < 35.0 )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSVOC1", CONV_PRIORITY_MEDIUM)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSVOC1", "CST4_MSVOC1_2", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_1", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_2", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_2", FALSE)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_HIGH)
ENDIF
ENDIF
ENDIF
ELSE
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_1", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_2", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_2", FALSE)
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_MSVOC2_1")
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_2")
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_2") >= 0.105
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_2") <= 0.375
IF ( ped.fDistanceToTarget < 35.0 )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSVOC2", CONV_PRIORITY_MEDIUM)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSVOC2", "CST4_MSVOC2_1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_1", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_2", FALSE)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_HIGH)
ENDIF
ENDIF
ENDIF
ELSE
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_1", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_2", FALSE)
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_MSVOC2_2")
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_2")
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_2") >= 0.390
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_2") <= 0.840
IF ( ped.fDistanceToTarget < 35.0 )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSVOC2", CONV_PRIORITY_MEDIUM)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSVOC2", "CST4_MSVOC2_2", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_1", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_2", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_2", FALSE)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_HIGH)
ENDIF
ENDIF
ENDIF
ELSE
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_1", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_2", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_2", FALSE)
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_MSVOC3_1")
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_3")
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_3") >= 0.100
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_3") <= 0.362
IF ( ped.fDistanceToTarget < 35.0 )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSVOC3", CONV_PRIORITY_MEDIUM)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSVOC3", "CST4_MSVOC3_1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_1", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_2", FALSE)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_HIGH)
ENDIF
ENDIF
ENDIF
ELSE
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_1", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_2", FALSE)
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_MSVOC3_2")
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_3")
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_3") >= 0.452
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_3") <= 0.900
IF ( ped.fDistanceToTarget < 35.0 )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSVOC3", CONV_PRIORITY_MEDIUM)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSVOC3", "CST4_MSVOC3_2", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_1", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_2", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_2", FALSE)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_HIGH)
ENDIF
ENDIF
ENDIF
ELSE
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_1", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_2", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_2", FALSE)
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_MSVOC4_1")
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_4")
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_4") >= 0.100
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_4") <= 0.365
IF ( ped.fDistanceToTarget < 35.0 )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSVOC4", CONV_PRIORITY_MEDIUM)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSVOC4", "CST4_MSVOC4_1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_1", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_2", FALSE)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_HIGH)
ENDIF
ENDIF
ENDIF
ELSE
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_1", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_2", FALSE)
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_MSVOC4_2")
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_4")
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_4") >= 0.460
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_4") <= 0.828
IF ( ped.fDistanceToTarget < 35.0 )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
//IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSVOC4", CONV_PRIORITY_MEDIUM)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSVOC4", "CST4_MSVOC4_2", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_1", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_2", TRUE)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_HIGH)
ENDIF
ENDIF
ENDIF
ELSE
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC1_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC2_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_1", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC3_2", FALSE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_1", TRUE)
SET_LABEL_AS_TRIGGERED("CST4_MSVOC4_2", TRUE)
ENDIF
ENDIF
ENDIF
IF IS_PED_FLEEING(ped.PedIndex)
OR IS_PED_IN_COMBAT(ped.PedIndex)
OR IS_PED_RESPONDING_TO_EVENT(ped.PedIndex, EVENT_SHOT_FIRED_BULLET_IMPACT)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(ped.PedIndex, TargetPedIndex)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_SCRIPTED_SPEECH_PLAYING(ped.PedIndex)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "SCREAM_PANIC", "WAVELOAD_PAIN_MALE", SPEECH_PARAMS_FORCE)
ENDIF
ENDIF
BREAK
CASE PED_STATE_INTIMIDATION
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_SCRIPTED_SPEECH_PLAYING(ped.PedIndex)
TEXT_LABEL_23 ConversationRoot
ConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(ConversationRoot)
IF NOT ARE_STRINGS_EQUAL(ConversationRoot, "CST4_MSSEC")
AND NOT ARE_STRINGS_EQUAL(ConversationRoot, "CST4_MSSPO")
AND NOT ARE_STRINGS_EQUAL(ConversationRoot, "CST4_MSFIG")
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_MSSPO")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSSPO", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_MSSPO", TRUE)
ped.iTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_SCRIPTED_SPEECH_PLAYING(ped.PedIndex)
TEXT_LABEL_23 ConversationRoot
ConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(ConversationRoot)
IF NOT ARE_STRINGS_EQUAL(ConversationRoot, "CST4_MSSEC")
AND NOT ARE_STRINGS_EQUAL(ConversationRoot, "CST4_MSSPO")
AND NOT ARE_STRINGS_EQUAL(ConversationRoot, "CST4_MSFIG")
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_MSFIG")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSFIG", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_MSFIG", TRUE)
ped.iConversationTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ELSE
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_PED_IN_COMBAT(ped.PedIndex)
IF ( ped.fDistanceToTarget < 30.0 )
IF HAS_TIME_PASSED(5000, ped.iConversationTimer)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MSSEC", CONV_PRIORITY_MEDIUM)
ped.iConversationTimer = GET_GAME_TIMER()
ENDIF
ELSE
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "CST4_AYAA", "CST4ACTOR", SPEECH_PARAMS_FORCE)
bSpawnActorSecurity = TRUE
ped.iConversationTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_SCRIPTED_SPEECH_PLAYING(ped.PedIndex)
TEXT_LABEL_23 LocalConversationRoot
LocalConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(LocalConversationRoot)
IF ARE_STRINGS_EQUAL(LocalConversationRoot, "CST4_MSSEC")
bSpawnActorSecurity = TRUE //spawn securirty when this converstion root is playing
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_FLEEING
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_SCRIPTED_SPEECH_PLAYING(ped.PedIndex)
TEXT_LABEL_23 ConversationRoot
ConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(ConversationRoot)
IF NOT ARE_STRINGS_EQUAL(ConversationRoot, "CST4_MSSEC")
AND NOT ARE_STRINGS_EQUAL(ConversationRoot, "CST4_MSSPO")
AND NOT ARE_STRINGS_EQUAL(ConversationRoot, "CST4_MSFIG")
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_PED_FLEEING(ped.PedIndex)
OR IS_PED_IN_COMBAT(ped.PedIndex)
IF ( ped.fDistanceToTarget < 30.0 )
IF HAS_TIME_PASSED(3000, ped.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(CST4Conversation, "CST4AUD", "CST4_MSSEC", CONV_PRIORITY_MEDIUM)
bSpawnActorSecurity = TRUE
ped.iConversationTimer = GET_GAME_TIMER()
ENDIF
ELSE
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "CST4_AYAA", "CST4ACTOR", SPEECH_PARAMS_FORCE)
bSpawnActorSecurity = TRUE
ped.iConversationTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
IF IS_PED_BEING_STUNNED(ped.PedIndex)
OR IS_PED_DEAD_OR_DYING(ped.PedIndex)
OR IS_PED_BEING_STEALTH_KILLED(ped.PedIndex)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_PED_IN_CURRENT_CONVERSATION(ped.PedIndex)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_ACTOR_DURING_GET_TO_ACTOR(PED_STRUCT &ped, PED_INDEX TargetPedIndex)
IF DOES_ENTITY_EXIST(ped.PedIndex)
#IF IS_DEBUG_BUILD
ped.sDebugName = "Actor"
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
SET_PED_NAME_DEBUG(ped.PedIndex, "Actor")
ENDIF
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
ENDIF
#ENDIF
ped.fDistanceToTarget = GET_DISTANCE_BETWEEN_ENTITIES(ped.PedIndex, TargetPedIndex)
CHECK_PED_LINE_OF_SIGHT_TO_PED(ped.PedIndex, TargetPedIndex, ped.bCanSeeTargetPed, ped.iLOSTimer, 750)
MANAGE_CONVERSATIONS_FOR_ACTOR(ped, TargetPedIndex)
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
IF NOT IS_PED_INJURED(TargetPedIndex)
SET_PED_RESET_FLAG(ped.PedIndex, PRF_ForceInjuryAfterStunned, TRUE)
SET_PED_RESET_FLAG(ped.PedIndex, PRF_PreventFailedMeleeTakedowns, TRUE)
SET_PED_RESET_FLAG(TargetPedIndex, PRF_SuppressLethalMeleeActions, TRUE) //suppress player ped from lethal melee actions
IF ped.eState != PED_STATE_FLEEING
IF ( bSecurityAlerted = TRUE AND ped.eState != PED_STATE_COMBAT_ON_FOOT )
OR IS_PED_FLEEING(ped.PedIndex)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
ENDIF
SWITCH ped.eState
CASE PED_STATE_IDLE
IF ( ped.bHasTask = FALSE )
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_berating_loop")
REQUEST_ANIM_DICT("misscarsteal4@actor")
IF HAS_ANIM_DICT_LOADED("misscarsteal4@actor")
TASK_PLAY_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_berating_loop",
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_ALWAYS_FIGHT, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ENDIF
ELSE
CREATE_TRACKED_POINT_FOR_COORD(iActorTrackedPoint, GET_PED_BONE_COORDS(ped.PedIndex, BONETAG_HEAD, << 0.0, 0.0, 0.0 >>), 0.5)
SET_PED_VISUAL_FIELD_PROPERTIES(ped.PedIndex, 25.0, 5.0, 90.0, -45.0, 45.0)
SET_ENTITY_HEALTH(ped.PedIndex, 150)
SET_PED_CONFIG_FLAG(ped.PedIndex, PCF_DisableHurt, TRUE)
SET_PED_CONFIG_FLAG(ped.PedIndex, PCF_AvoidTearGas, TRUE)
SET_PED_CONFIG_FLAG(ped.PedIndex, PCF_AlwaysSeeApproachingVehicles, TRUE)
SET_PED_CONFIG_FLAG(ped.PedIndex, PCF_DisableGoToWritheWhenInjured, TRUE)
ped.bHasTask = TRUE
ENDIF
ENDIF
IF ( bRepositionActor = FALSE )
IF IS_ENTITY_AT_COORD(TargetPedIndex, << -1132.33, -490.46, 41.16 >>, << 8.0, 8.0, 8.0>>)
OR IS_ENTITY_IN_ANGLED_AREA(TargetPedIndex, << -1118.82, -504.05, 22.36 >>, << -1207.15, -576.01, 44.20 >>, 30.0)
WARP_PED(ped.PedIndex, << -1109.36, -503.38, 34.26 >>, 292.4256, FALSE, FALSE, FALSE)
bRepositionActor = TRUE
ENDIF
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(TargetPedIndex, <<-1141.908203,-523.151123,27.854542>>, <<-1069.740967,-490.765381,49.649647>>, 46.0)
OR IS_ENTITY_AT_COORD(TargetPedIndex, << -1132.34, -490.47, 41.16 >>, << 8.0, 8.0, 8.0>>) //alley behind the trailer
START_AUDIO_SCENE("CAR_3_TAKE_OUT_ACTOR")
GO_TO_PED_STATE(ped, PED_STATE_ARGUING)
ENDIF
BREAK
CASE PED_STATE_ARGUING
IF ( ped.bHasTask = FALSE )
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_berating_assistant")
IF HAS_ANIM_DICT_LOADED("misscarsteal4@actor")
IF NOT IS_PED_INJURED(psAssistant.PedIndex)
TASK_LOOK_AT_ENTITY(ped.PedIndex, psAssistant.PedIndex, 15000, SLF_WHILE_NOT_IN_FOV)
ENDIF
TASK_PLAY_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_berating_assistant", SLOW_BLEND_IN, SLOW_BLEND_OUT)
ELSE
REQUEST_ANIM_DICT("misscarsteal4@actor")
ENDIF
ELSE
ped.bHasTask = TRUE
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_berating_assistant")
IF GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_berating_assistant") > 0.995
SWITCH GET_RANDOM_INT_IN_RANGE(0, 4)
CASE 0
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_1)
BREAK
CASE 1
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_2)
BREAK
CASE 2
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_3)
BREAK
CASE 3
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_4)
BREAK
ENDSWITCH
ENDIF
ENDIF
IF bActorSceneDisrupted = TRUE
OR IS_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
OR CAN_PED_SEE_PED_WEAPON(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_IN_STEALTH_MOVEMENT(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_PERFORMING_MELEE_ACTION(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
IF CAN_PED_HEAR_PED_IN_VEHICLE(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
IF CAN_PED_HEAR_PED_ON_FOOT(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget)
IF ( ped.bCanSeeTargetPed = FALSE )
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
IF ( ped.bCanSeeTargetPed = TRUE )
IF ( ped.fDistanceToTarget < 6.25 )
GO_TO_PED_STATE(ped, PED_STATE_INTIMIDATION)
ENDIF
ENDIF
BREAK
CASE PED_STATE_PLAYING_ANIM_1
CASE PED_STATE_PLAYING_ANIM_2
CASE PED_STATE_PLAYING_ANIM_3
CASE PED_STATE_PLAYING_ANIM_4
IF ( ped.bHasTask = FALSE )
SWITCH ped.eState
CASE PED_STATE_PLAYING_ANIM_1
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_1")
TASK_PLAY_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_1",
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_HOLD_LAST_FRAME)
ELSE
ped.bHasTask = TRUE
ENDIF
BREAK
CASE PED_STATE_PLAYING_ANIM_2
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_2")
TASK_PLAY_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_2",
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_HOLD_LAST_FRAME)
ELSE
ped.bHasTask = TRUE
ENDIF
BREAK
CASE PED_STATE_PLAYING_ANIM_3
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_3")
TASK_PLAY_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_3",
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_HOLD_LAST_FRAME)
ELSE
ped.bHasTask = TRUE
ENDIF
BREAK
CASE PED_STATE_PLAYING_ANIM_4
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_4")
TASK_PLAY_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_4",
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_HOLD_LAST_FRAME)
ELSE
ped.bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
IF ( ped.bHasTask = TRUE )
SWITCH ped.eState
CASE PED_STATE_PLAYING_ANIM_1
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_1")
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_1") >= 0.988
SWITCH GET_RANDOM_INT_IN_RANGE(0, 3)
CASE 0
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_2)
BREAK
CASE 1
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_3)
BREAK
CASE 2
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_4)
BREAK
ENDSWITCH
ENDIF
BREAK
CASE PED_STATE_PLAYING_ANIM_2
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_2")
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_2") >= 0.988
SWITCH GET_RANDOM_INT_IN_RANGE(0, 3)
CASE 0
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_1)
BREAK
CASE 1
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_3)
BREAK
CASE 2
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_4)
BREAK
ENDSWITCH
ENDIF
BREAK
CASE PED_STATE_PLAYING_ANIM_3
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_3")
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_3") >= 0.988
SWITCH GET_RANDOM_INT_IN_RANGE(0, 3)
CASE 0
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_1)
BREAK
CASE 1
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_2)
BREAK
CASE 2
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_4)
BREAK
ENDSWITCH
ENDIF
BREAK
CASE PED_STATE_PLAYING_ANIM_4
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_4")
AND GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "actor_warming_up_loop_4") >= 0.988
SWITCH GET_RANDOM_INT_IN_RANGE(0, 3)
CASE 0
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_1)
BREAK
CASE 1
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_2)
BREAK
CASE 2
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_3)
BREAK
ENDSWITCH
ENDIF
BREAK
ENDSWITCH
ENDIF
IF bActorSceneDisrupted = TRUE
OR IS_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
OR CAN_PED_SEE_PED_WEAPON(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_IN_STEALTH_MOVEMENT(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_PERFORMING_MELEE_ACTION(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
IF CAN_PED_HEAR_PED_IN_VEHICLE(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
IF CAN_PED_HEAR_PED_ON_FOOT(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget)
IF ( ped.bCanSeeTargetPed = FALSE )
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
IF ( ped.bCanSeeTargetPed = TRUE )
IF ( ped.fDistanceToTarget < 6.25 )
GO_TO_PED_STATE(ped, PED_STATE_INTIMIDATION)
ENDIF
ENDIF
BREAK
CASE PED_STATE_INTIMIDATION
IF ( ped.bHasTask = FALSE )
CLEAR_PED_TASKS(ped.PedIndex)
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, TargetPedIndex)
TASK_LOOK_AT_ENTITY(NULL, TargetPedIndex, 3000, SLF_FAST_TURN_RATE)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(ped.PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
ped.iTimer = GET_GAME_TIMER()
ped.bHasTask = TRUE
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("CST4_MSSPO")
IF HAS_TIME_PASSED(3500, ped.iTimer)
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
IF IS_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
OR CAN_PED_SEE_PED_WEAPON(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_IN_STEALTH_MOVEMENT(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_PERFORMING_MELEE_ACTION(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
BREAK
CASE PED_STATE_FLEEING
IF ( ped.bHasTask = FALSE )
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
SET_GLOBAL_BIT_SET(ACTOR_IGNORED)
SET_PED_COMBAT_MOVEMENT(ped.PedIndex, CM_WILLRETREAT)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_ALWAYS_FLEE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_ALWAYS_FIGHT, FALSE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_DISABLE_COWER, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_DISABLE_HANDS_UP, TRUE)
IF NOT IS_PED_FLEEING(ped.PedIndex)
CLEAR_PED_TASKS(ped.PedIndex)
TASK_SMART_FLEE_PED(ped.PedIndex, TargetPedIndex, 300, -1)
ENDIF
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
SET_PED_KEEP_TASK(ped.PedIndex, TRUE)
bActorSceneDisrupted = FALSE
ped.iConversationTimer = 0
ped.bHasTask = TRUE
ENDIF
BREAK
CASE PED_STATE_COMBAT_ON_FOOT
IF ( ped.bHasTask = FALSE )
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
SET_PED_COMBAT_MOVEMENT(ped.PedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_ALWAYS_FLEE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_ALWAYS_FIGHT, TRUE)
SET_COMBAT_FLOAT(ped.PedIndex, CCF_FIGHT_PROFICIENCY, 1.0)
TASK_COMBAT_PED(ped.PedIndex, TargetPedIndex, COMBAT_PED_PREVENT_CHANGING_TARGET, TASK_THREAT_RESPONSE_NONE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
SET_PED_KEEP_TASK(ped.PedIndex, TRUE)
//bSpawnActorSecurity = TRUE //actor will call security when his security dialogue plays
bActorSceneDisrupted = TRUE
ped.iConversationTimer = 0
ped.bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF IS_ENTITY_DEAD(ped.PedIndex) OR ped.eState = PED_STATE_FLEEING //cleanup ped when ped is dead or fleeing
IF IS_ENTITY_DEAD(ped.PedIndex)
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
IF ( ped.eCleanupReason = PED_CLEANUP_NO_CLEANUP )
ped.eCleanupReason = GET_PED_CLEANUP_REASON(ped)
ActorCauseOfDeathWeapon = GET_PED_CAUSE_OF_DEATH(ped.PedIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", ped.sDebugName, " was killed with weapon ", GET_WEAPON_NAME(GET_PED_CAUSE_OF_DEATH(ped.PedIndex)), ".")
#ENDIF
UPDATE_PLAYER_KILL_COUNTERS(ped.eCleanupReason, iPlayerLethalKills, iPlayerStealthKills, iPlayerTakedownKills)
ENDIF
ENDIF
IF ( ped.fDistanceToTarget > 200.0 )
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
REMOVE_ANIM_DICT("misscarsteal4@actor")
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_ASSISTANT_PED_DURING_GET_TO_ACTOR(PED_STRUCT &ped, PED_INDEX TargetPedIndex)
IF DOES_ENTITY_EXIST(ped.PedIndex)
#IF IS_DEBUG_BUILD
ped.sDebugName = "Assistant"
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
SET_PED_NAME_DEBUG(ped.PedIndex, "Assistant")
ENDIF
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
ENDIF
#ENDIF
ped.fDistanceToTarget = GET_DISTANCE_BETWEEN_ENTITIES(ped.PedIndex, TargetPedIndex)
CHECK_PED_LINE_OF_SIGHT_TO_PED(ped.PedIndex, TargetPedIndex, ped.bCanSeeTargetPed, ped.iLOSTimer, 500)
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
IF NOT IS_PED_INJURED(TargetPedIndex)
IF ( ped.eState != PED_STATE_FLEEING )
IF bSecurityAlerted = TRUE
OR IS_PED_FLEEING(ped.PedIndex)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
ENDIF
SWITCH ped.eState
CASE PED_STATE_IDLE
IF ( ped.bHasTask = FALSE )
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "assistant_loop")
REQUEST_ANIM_DICT("misscarsteal4@actor")
IF HAS_ANIM_DICT_LOADED("misscarsteal4@actor")
SET_PED_VISUAL_FIELD_PROPERTIES(ped.PedIndex, 20.0, 5.0, 90.0)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_ALWAYS_FLEE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_ALWAYS_FIGHT, FALSE)
TASK_PLAY_ANIM(ped.PedIndex, "misscarsteal4@actor", "assistant_loop",
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ENDIF
ELSE
ped.bHasTask = TRUE
ENDIF
ENDIF
IF ( bRepositionAssistant = FALSE )
IF IS_ENTITY_AT_COORD(TargetPedIndex, << -1132.33, -490.46, 41.16 >>, << 8.0, 8.0, 8.0 >>)
OR IS_ENTITY_IN_ANGLED_AREA(TargetPedIndex, << -1118.82, -504.05, 22.36 >>, << -1207.15, -576.01, 44.20 >>, 30.0)
WARP_PED(ped.PedIndex, << -1109.1906, -503.3141, 34.26 >>, 120.0023, FALSE, FALSE, FALSE)
bRepositionAssistant = TRUE
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psActor.PedIndex)
IF NOT IS_ENTITY_DEAD(psActor.PedIndex)
IF psActor.eState = PED_STATE_ARGUING
GO_TO_PED_STATE(ped, PED_STATE_ARGUING)
ENDIF
ENDIF
ENDIF
IF ( bActorSceneDisrupted = TRUE )
OR IS_FILM_CREW_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
OR CAN_PED_SEE_PED_WEAPON(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
bSpawnActorSecurity = TRUE
bActorSceneDisrupted = TRUE
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
IF ( ped.bCanSeeTargetPed = TRUE )
IF DOES_ENTITY_EXIST(psActor.PedIndex)
IF IS_ENTITY_DEAD(psActor.PedIndex)
bSpawnActorSecurity = TRUE
bActorSceneDisrupted = TRUE
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ELSE
IF IS_PED_BEING_STUNNED(psActor.PedIndex)
OR IS_PED_DEAD_OR_DYING(psActor.PedIndex)
OR IS_PED_BEING_STEALTH_KILLED(psActor.PedIndex)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(psActor.PedIndex, TargetPedIndex)
OR IS_ENTITY_TOUCHING_ENTITY(psActor.PedIndex, TargetPedIndex)
OR IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), psActor.PedIndex)
OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), psActor.PedIndex)
bSpawnActorSecurity = TRUE
bActorSceneDisrupted = TRUE
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_ARGUING
IF ( ped.bHasTask = FALSE )
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "assistant_berated")
TASK_PLAY_ANIM(ped.PedIndex, "misscarsteal4@actor", "assistant_berated",
SLOW_BLEND_IN, WALK_BLEND_OUT, -1, AF_HOLD_LAST_FRAME)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ELSE
ped.bHasTask = TRUE
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@actor", "assistant_berated")
SET_ENTITY_ANIM_SPEED(ped.PedIndex, "misscarsteal4@actor", "assistant_berated", 1.125)
IF ( GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@actor", "assistant_berated") > 0.995 )
GO_TO_PED_STATE(ped, PED_STATE_MOVING_TO_LOCATION)
ENDIF
ENDIF
IF ( bActorSceneDisrupted = TRUE )
OR IS_FILM_CREW_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
OR CAN_PED_SEE_PED_WEAPON(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_IN_STEALTH_MOVEMENT(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
bSpawnActorSecurity = TRUE
bActorSceneDisrupted = TRUE
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
IF ( ped.bCanSeeTargetPed = TRUE )
IF DOES_ENTITY_EXIST(psActor.PedIndex)
IF IS_ENTITY_DEAD(psActor.PedIndex)
bSpawnActorSecurity = TRUE
bActorSceneDisrupted = TRUE
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ELSE
IF IS_PED_BEING_STUNNED(psActor.PedIndex)
OR IS_PED_DEAD_OR_DYING(psActor.PedIndex)
OR IS_PED_BEING_STEALTH_KILLED(psActor.PedIndex)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(psActor.PedIndex, TargetPedIndex)
OR IS_ENTITY_TOUCHING_ENTITY(psActor.PedIndex, TargetPedIndex)
OR IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), psActor.PedIndex)
OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), psActor.PedIndex)
bSpawnActorSecurity = TRUE
bActorSceneDisrupted = TRUE
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_MOVING_TO_LOCATION
IF ( ped.bHasTask = FALSE )
CLEAR_PED_TASKS(ped.PedIndex)
FORCE_PED_MOTION_STATE(ped.PedIndex, MS_ON_FOOT_RUN, FALSE)
IF ( bRepositionAssistant = TRUE )
TASK_FOLLOW_NAV_MESH_TO_COORD(ped.PedIndex, << -1075.86, -468.95, 35.64 >>, PEDMOVE_RUN, -1, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 309.4294)
ELSE
TASK_FOLLOW_NAV_MESH_TO_COORD(ped.PedIndex, << -1155.5319, -521.8391, 31.5830 >>, PEDMOVE_RUN, -1, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 74.1956)
ENDIF
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, TRUE)
ped.bHasTask = TRUE
ENDIF
IF ( GET_SCRIPT_TASK_STATUS(ped.PedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = FINISHED_TASK )
GO_TO_PED_STATE(ped, PED_STATE_STANDING_AT_LOCATION)
ENDIF
IF IS_FILM_CREW_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
OR CAN_PED_SEE_PED_WEAPON(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
bSecurityAlerted = TRUE
//bSpawnActorSecurity = TRUE
//bActorSceneDisrupted = TRUE
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
IF ( ped.bCanSeeTargetPed = TRUE )
IF DOES_ENTITY_EXIST(psActor.PedIndex)
IF IS_ENTITY_DEAD(psActor.PedIndex)
bSecurityAlerted = TRUE
//bSpawnActorSecurity = TRUE
//bActorSceneDisrupted = TRUE
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ELSE
IF IS_PED_BEING_STUNNED(psActor.PedIndex)
OR IS_PED_DEAD_OR_DYING(psActor.PedIndex)
OR IS_PED_BEING_STEALTH_KILLED(psActor.PedIndex)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(psActor.PedIndex, TargetPedIndex)
OR IS_ENTITY_TOUCHING_ENTITY(psActor.PedIndex, TargetPedIndex)
OR IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), psActor.PedIndex)
OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), psActor.PedIndex)
bSecurityAlerted = TRUE
//bSpawnActorSecurity = TRUE
//bActorSceneDisrupted = TRUE
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_STANDING_AT_LOCATION
IF ( ped.bHasTask = FALSE )
TASK_START_SCENARIO_IN_PLACE(ped.PedIndex, "WORLD_HUMAN_STAND_IMPATIENT")
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ped.bHasTask = TRUE
ENDIF
WEAPON_TYPE TargetPedWeaponType
IF ( eMissionStage = MISSION_STAGE_GET_TO_ACTOR )
AND GET_CURRENT_PED_WEAPON(TargetPedIndex, TargetPedWeaponType)
AND TargetPedWeaponType = WEAPONTYPE_STUNGUN
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, TRUE)
ELSE
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
ENDIF
IF IS_FILM_CREW_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
OR CAN_PED_SEE_PED_WEAPON(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
bSecurityAlerted = TRUE
//bSpawnActorSecurity = TRUE
//bActorSceneDisrupted = TRUE
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
BREAK
CASE PED_STATE_FLEEING
IF ( ped.bHasTask = FALSE )
CLEAR_PED_TASKS(ped.PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "SCREAM_PANIC", "WAVELOAD_PAIN_FEMALE", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_ALWAYS_FLEE, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_DISABLE_COWER, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_DISABLE_HANDS_UP, TRUE)
TASK_SMART_FLEE_PED(ped.PedIndex, TargetPedIndex, 300, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
SET_PED_KEEP_TASK(ped.PedIndex, TRUE)
ped.iConversationTimer = GET_GAME_TIMER()
ped.bHasTask = TRUE
ENDIF
IF ( ped.bHasTask = TRUE )
IF HAS_TIME_PASSED(3000, ped.iConversationTimer)
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "GENERIC_FRIGHTENED_HIGH", "A_F_Y_VINEWOOD_01_WHITE_FULL_01", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ped.iConversationTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF IS_ENTITY_DEAD(ped.PedIndex) OR ped.eState = PED_STATE_FLEEING //cleanup ped when ped is dead or fleeing
IF IS_ENTITY_DEAD(ped.PedIndex)
IF ( ped.eCleanupReason = PED_CLEANUP_NO_CLEANUP )
ped.eCleanupReason = GET_PED_CLEANUP_REASON(ped)
UPDATE_PLAYER_KILL_COUNTERS(ped.eCleanupReason, iPlayerLethalKills, iPlayerStealthKills, iPlayerTakedownKills)
ENDIF
ENDIF
IF ( ped.fDistanceToTarget > 200.0 )
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_ANY_MELTDOWN_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
TEXT_LABEL_23 LocalConversationRoot
LocalConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(LocalConversationRoot)
IF ARE_STRINGS_EQUAL(LocalConversationRoot, "CST4_MELT")
OR ARE_STRINGS_EQUAL(LocalConversationRoot, "CST4_CUT")
OR ARE_STRINGS_EQUAL(LocalConversationRoot, "CST4_AWFUL")
OR ARE_STRINGS_EQUAL(LocalConversationRoot, "CST4_AGAIN")
OR ARE_STRINGS_EQUAL(LocalConversationRoot, "CST4_ACTION")
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC MANAGE_MELTDOWN_DIALOGUE()
IF bMeltdownSceneDisrupted = FALSE
SWITCH iMeltdownDialogueProgress
CASE 0
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMeltdownSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iMeltdownSceneID) >= 0.040 AND GET_SYNCHRONIZED_SCENE_PHASE(iMeltdownSceneID) < 0.500
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMeltdownScenePosition) <= 25.0
IF NOT IS_ANY_MELTDOWN_CONVERSATION_ONGOING_OR_QUEUED()
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MELT", "CST4_MELT_1", CONV_PRIORITY_MEDIUM)
iMeltdownDialogueProgress = 1
ENDIF
ENDIF
ELSE
iMeltdownDialogueProgress = 1
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMeltdownSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iMeltdownSceneID) >= 0.100 AND GET_SYNCHRONIZED_SCENE_PHASE(iMeltdownSceneID) < 0.500
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMeltdownScenePosition) <= 25.0
IF NOT IS_ANY_MELTDOWN_CONVERSATION_ONGOING_OR_QUEUED()
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MELT", "CST4_MELT_2", CONV_PRIORITY_MEDIUM)
iMeltdownDialogueProgress = 2
ENDIF
ENDIF
ELSE
iMeltdownDialogueProgress = 2
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMeltdownSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iMeltdownSceneID) >= 0.235 AND GET_SYNCHRONIZED_SCENE_PHASE(iMeltdownSceneID) < 0.500
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMeltdownScenePosition) <= 25.0
IF NOT IS_ANY_MELTDOWN_CONVERSATION_ONGOING_OR_QUEUED()
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MELT", "CST4_MELT_4", CONV_PRIORITY_MEDIUM)
iMeltdownDialogueProgress = 3
ENDIF
ENDIF
ELSE
iMeltdownDialogueProgress = 3
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMeltdownSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iMeltdownSceneID) >= 0.310 AND GET_SYNCHRONIZED_SCENE_PHASE(iMeltdownSceneID) < 0.500
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMeltdownScenePosition) <= 25.0
IF NOT IS_ANY_MELTDOWN_CONVERSATION_ONGOING_OR_QUEUED()
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MELT", "CST4_MELT_5", CONV_PRIORITY_MEDIUM)
iMeltdownDialogueProgress = 4
ENDIF
ENDIF
ELSE
iMeltdownDialogueProgress = 4
ENDIF
ENDIF
ENDIF
BREAK
CASE 4
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMeltdownSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iMeltdownSceneID) >= 0.375
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMeltdownScenePosition) <= 25.0
IF NOT IS_ANY_MELTDOWN_CONVERSATION_ONGOING_OR_QUEUED()
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MELT", "CST4_MELT_6", CONV_PRIORITY_MEDIUM)
iMeltdownDialogueProgress = 5
ENDIF
ENDIF
ELSE
iMeltdownDialogueProgress = 5
ENDIF
ENDIF
ENDIF
BREAK
CASE 5
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMeltdownSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iMeltdownSceneID) >= 0.425
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMeltdownScenePosition) <= 25.0
IF NOT IS_ANY_MELTDOWN_CONVERSATION_ONGOING_OR_QUEUED()
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MELT", "CST4_MELT_7", CONV_PRIORITY_MEDIUM)
iMeltdownDialogueProgress = 6
ENDIF
ENDIF
ELSE
iMeltdownDialogueProgress = 6
ENDIF
ENDIF
ENDIF
BREAK
CASE 6
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMeltdownSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iMeltdownSceneID) >= 0.520
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMeltdownScenePosition) <= 25.0
IF NOT IS_ANY_MELTDOWN_CONVERSATION_ONGOING_OR_QUEUED()
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MELT", "CST4_MELT_8", CONV_PRIORITY_MEDIUM)
iMeltdownDialogueProgress = 7
ENDIF
ENDIF
ELSE
iMeltdownDialogueProgress = 7
ENDIF
ENDIF
ENDIF
BREAK
CASE 7
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMeltdownSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iMeltdownSceneID) >= 0.600
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMeltdownScenePosition) <= 25.0
IF NOT IS_ANY_MELTDOWN_CONVERSATION_ONGOING_OR_QUEUED()
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_MELT", "CST4_MELT_9", CONV_PRIORITY_MEDIUM)
iMeltdownDialogueProgress = 8
ENDIF
ENDIF
ELSE
iMeltdownDialogueProgress = 8
ENDIF
ENDIF
ENDIF
BREAK
CASE 8
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMeltdownSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iMeltdownSceneID) >= 0.640
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMeltdownScenePosition) <= 25.0
IF NOT IS_ANY_MELTDOWN_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_CUT", CONV_PRIORITY_MEDIUM)
iMeltdownDialogueProgress = 9
ENDIF
ENDIF
ELSE
iMeltdownDialogueProgress = 9
ENDIF
ENDIF
ENDIF
BREAK
CASE 9
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMeltdownSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iMeltdownSceneID) >= 0.685
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMeltdownScenePosition) <= 25.0
IF NOT IS_ANY_MELTDOWN_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_AWFUL", CONV_PRIORITY_MEDIUM)
iMeltdownDialogueProgress = 10
ENDIF
ENDIF
ELSE
iMeltdownDialogueProgress = 10
ENDIF
ENDIF
ENDIF
BREAK
CASE 10
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMeltdownSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iMeltdownSceneID) >= 0.825
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMeltdownScenePosition) <= 25.0
IF NOT IS_ANY_MELTDOWN_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_AGAIN", CONV_PRIORITY_MEDIUM)
iMeltdownDialogueProgress = 11
ENDIF
ENDIF
ELSE
iMeltdownDialogueProgress = 11
ENDIF
ENDIF
ENDIF
BREAK
CASE 11
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMeltdownSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iMeltdownSceneID) >= 0.900
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMeltdownScenePosition) <= 25.0
IF NOT IS_ANY_MELTDOWN_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_ACTION", CONV_PRIORITY_MEDIUM)
iMeltdownDialogueProgress = 12
ENDIF
ENDIF
ELSE
iMeltdownDialogueProgress = 12
ENDIF
ENDIF
ENDIF
BREAK
CASE 12
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMeltdownSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iMeltdownSceneID) >= 0.99
iMeltdownDialogueProgress = 0
ENDIF
ENDIF
BREAK
ENDSWITCH
ELSE
IF IS_ANY_MELTDOWN_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDPROC
PROC MANAGE_MELTDOWN_DIRECTOR_PED(PED_STRUCT &ped, PED_INDEX TargetPedIndex)
IF DOES_ENTITY_EXIST(ped.PedIndex)
ped.fDistanceToTarget = GET_DISTANCE_BETWEEN_ENTITIES(ped.PedIndex, PLAYER_PED_ID())
CHECK_PED_LINE_OF_SIGHT_TO_PED(ped.PedIndex, TargetPedIndex, ped.bCanSeeTargetPed, ped.iLOSTimer, 950)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
ENDIF
#ENDIF
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
IF ( ped.eState != PED_STATE_FLEEING )
IF ( bSecurityAlerted = TRUE )
OR ( bMeltdownSceneDisrupted = TRUE )
OR IS_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
OR CAN_PED_HEAR_PED_IN_VEHICLE(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget)
OR CAN_PED_SEE_PED_WEAPON(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_IN_STEALTH_MOVEMENT(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_PERFORMING_MELEE_ACTION(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
ENDIF
SWITCH ped.eState
CASE PED_STATE_PLAYING_ANIM_1
IF ( ped.bHasTask = FALSE )
TASK_PLAY_ANIM(ped.PedIndex, "misscarsteal4@aliens", "rehearsal_base_idle_director", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
ped.iTimer = GET_GAME_TIMER()
ped.bHasTask = TRUE
ENDIF
IF ( ped.bHasTask = TRUE )
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMeltdownSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iMeltdownSceneID) >= 0.645 AND GET_SYNCHRONIZED_SCENE_PHASE(iMeltdownSceneID) < 0.700
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_2)
ENDIF
ENDIF
ENDIF
IF ( ped.bCanSeeTargetPed = TRUE )
IF IS_ENTITY_AT_COORD(TargetPedIndex, <<-1130.014404,-451.218109,35.503246>>,<<2.000000,3.000000,1.350000>>)
OR IS_ENTITY_IN_ANGLED_AREA(TargetPedIndex, <<-1131.502075,-450.782013,34.109997>>, <<-1130.051880,-454.864288,36.793358>>, 4.5)
GO_TO_PED_STATE(ped, PED_STATE_INTIMIDATION)
ENDIF
ENDIF
BREAK
CASE PED_STATE_PLAYING_ANIM_2
IF ( ped.bHasTask = FALSE )
SWITCH GET_RANDOM_INT_IN_RANGE(0, 3)
CASE 0
sDirectorAnimName = "rehearsal_idle_a_director"
BREAK
CASE 1
sDirectorAnimName = "rehearsal_idle_b_director"
BREAK
CASE 2
sDirectorAnimName = "rehearsal_idle_c_director"
BREAK
ENDSWITCH
TASK_PLAY_ANIM(ped.PedIndex, "misscarsteal4@aliens", sDirectorAnimName, SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_HOLD_LAST_FRAME)
ped.bHasTask = TRUE
ENDIF
IF ( ped.bHasTask = TRUE )
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "misscarsteal4@aliens", sDirectorAnimName)
IF GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "misscarsteal4@aliens", sDirectorAnimName) >= 0.99
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ANIM_1)
ENDIF
ENDIF
ENDIF
IF ( ped.bCanSeeTargetPed = TRUE )
IF IS_ENTITY_AT_COORD(TargetPedIndex, <<-1130.014404,-451.218109,35.503246>>,<<2.000000,3.000000,1.350000>>)
OR IS_ENTITY_IN_ANGLED_AREA(TargetPedIndex, <<-1131.502075,-450.782013,34.109997>>, <<-1130.051880,-454.864288,36.793358>>, 4.5)
GO_TO_PED_STATE(ped, PED_STATE_INTIMIDATION)
ENDIF
ENDIF
BREAK
CASE PED_STATE_INTIMIDATION
IF ( ped.bHasTask = FALSE )
CLEAR_PED_TASKS(ped.PedIndex)
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, TargetPedIndex)
TASK_LOOK_AT_ENTITY(NULL, TargetPedIndex, 5000, SLF_FAST_TURN_RATE | SLF_WHILE_NOT_IN_FOV | SLF_USE_TORSO, SLF_LOOKAT_HIGH)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(ped.PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
IF IS_SCRIPTED_SPEECH_PLAYING(ped.PedIndex)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ped.iProgress = 0
ped.bHasTask = TRUE
ENDIF
IF ( ped.bHasTask = TRUE )
SWITCH ped.iProgress
CASE 0
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
SWITCH GET_RANDOM_INT_IN_RANGE(0, 3)
CASE 0
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "GENERIC_CURSE_HIGH", "ANTON", SPEECH_PARAMS_FORCE_NORMAL)
BREAK
CASE 1
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "AIMED_AT_BY_PLAYER", "ANTON", SPEECH_PARAMS_FORCE_NORMAL)
BREAK
CASE 2
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "GENERIC_FRIGHTENED_HIGH", "ANTON", SPEECH_PARAMS_FORCE_NORMAL)
BREAK
CASE 3
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "GENERIC_SHOCKED_MED", "ANTON", SPEECH_PARAMS_FORCE_NORMAL)
BREAK
CASE 4
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "CRASH_GENERIC_INTERRUPT", "ANTON", SPEECH_PARAMS_FORCE_NORMAL)
BREAK
CASE 5
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "GENERIC_FRIGHTENED_HIGH", "ANTON", SPEECH_PARAMS_FORCE_NORMAL)
BREAK
CASE 6
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "GENERIC_INTERUPT_HIGH", "ANTON", SPEECH_PARAMS_FORCE_NORMAL)
BREAK
ENDSWITCH
ELSE
ped.iTimer = GET_GAME_TIMER()
ped.iProgress = 1
ENDIF
BREAK
CASE 1
IF HAS_TIME_PASSED(2000, ped.iTimer)
bMeltdownSceneWalkedInto = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
BREAK
CASE PED_STATE_FLEEING
IF ( ped.bHasTask = FALSE )
CLEAR_PED_TASKS(ped.PedIndex)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_ALWAYS_FLEE, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_DISABLE_COWER, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_DISABLE_HANDS_UP, TRUE)
TASK_SMART_FLEE_PED(ped.PedIndex, PLAYER_PED_ID(), 300, -1)
PLAY_PAIN(ped.PedIndex, AUD_DAMAGE_REASON_SCREAM_TERROR)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
SET_PED_KEEP_TASK(ped.PedIndex, TRUE)
bMeltdownSceneDisrupted = TRUE
ped.iConversationTimer = 0
ped.bHasTask = TRUE
ENDIF
IF GET_GAME_TIMER() - ped.iConversationTimer > 0
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "SCREAM_PANIC", "WAVELOAD_PAIN_MALE", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ped.iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 7000)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
IF IS_ENTITY_DEAD(ped.PedIndex) OR ped.eState = PED_STATE_FLEEING
IF IS_ENTITY_DEAD(ped.PedIndex)
IF (ped.eCleanupReason = PED_CLEANUP_NO_CLEANUP)
ped.eCleanupReason = GET_PED_CLEANUP_REASON(ped)
UPDATE_PLAYER_KILL_COUNTERS(ped.eCleanupReason, iPlayerLethalKills, iPlayerStealthKills, iPlayerTakedownKills)
ENDIF
ENDIF
IF ( ped.fDistanceToTarget > 200.0 )
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_MELTDOWN_PED(PED_STRUCT &ped, PED_INDEX TargetPedIndex, INT iLOSTime)
IF DOES_ENTITY_EXIST(ped.PedIndex)
ped.fDistanceToTarget = GET_DISTANCE_BETWEEN_ENTITIES(ped.PedIndex, PLAYER_PED_ID())
CHECK_PED_LINE_OF_SIGHT_TO_PED(ped.PedIndex, TargetPedIndex, ped.bCanSeeTargetPed, ped.iLOSTimer, iLOSTime)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
ENDIF
#ENDIF
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
IF ( ped.eState != PED_STATE_FLEEING )
IF ( bSecurityAlerted = TRUE )
OR ( bMeltdownSceneDisrupted = TRUE )
OR IS_PED_ALERTED_BY_PED_ACTIONS(ped.PedIndex, TargetPedIndex)
OR CAN_PED_HEAR_PED_IN_VEHICLE(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget)
OR CAN_PED_SEE_PED_WEAPON(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_IN_STEALTH_MOVEMENT(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
OR CAN_PED_SEE_PED_PERFORMING_MELEE_ACTION(ped.PedIndex, TargetPedIndex, ped.fDistanceToTarget, ped.bCanSeeTargetPed)
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
ENDIF
ENDIF
SWITCH ped.eState
CASE PED_STATE_PLAYING_ANIM_1
IF ( ped.bHasTask = FALSE )
//
ped.bHasTask = TRUE
ENDIF
BREAK
CASE PED_STATE_FLEEING
IF ( ped.bHasTask = FALSE )
CLEAR_PED_TASKS(ped.PedIndex)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_ALWAYS_FLEE, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_DISABLE_COWER, TRUE)
SET_PED_FLEE_ATTRIBUTES(ped.PedIndex, FA_DISABLE_HANDS_UP, TRUE)
IF DOES_ENTITY_EXIST(osPropCamera.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osPropCamera.ObjectIndex)
IF IS_ENTITY_ATTACHED_TO_ENTITY(osPropCamera.ObjectIndex, ped.PedIndex)
DETACH_ENTITY(osPropCamera.ObjectIndex, FALSE)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(osPropMicrophone.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osPropMicrophone.ObjectIndex)
IF IS_ENTITY_ATTACHED_TO_ENTITY(osPropMicrophone.ObjectIndex, ped.PedIndex)
DETACH_ENTITY(osPropMicrophone.ObjectIndex, FALSE)
ENDIF
ENDIF
ENDIF
TASK_SMART_FLEE_PED(ped.PedIndex, PLAYER_PED_ID(), 300, -1)
PLAY_PAIN(ped.PedIndex, AUD_DAMAGE_REASON_SCREAM_TERROR)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, FALSE)
SET_PED_KEEP_TASK(ped.PedIndex, TRUE)
bMeltdownSceneDisrupted = TRUE
ped.iConversationTimer = 0
ped.bHasTask = TRUE
ENDIF
IF GET_GAME_TIMER() - ped.iConversationTimer > 0
IF NOT IS_AMBIENT_SPEECH_PLAYING(ped.PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped.PedIndex, "SCREAM_PANIC", "WAVELOAD_PAIN_MALE", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ped.iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2500, 9000)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
IF IS_ENTITY_DEAD(ped.PedIndex) OR ped.eState = PED_STATE_FLEEING
IF IS_ENTITY_DEAD(ped.PedIndex)
IF (ped.eCleanupReason = PED_CLEANUP_NO_CLEANUP)
ped.eCleanupReason = GET_PED_CLEANUP_REASON(ped)
UPDATE_PLAYER_KILL_COUNTERS(ped.eCleanupReason, iPlayerLethalKills, iPlayerStealthKills, iPlayerTakedownKills)
ENDIF
ENDIF
IF ( ped.fDistanceToTarget > 200.0 )
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_MELTDOWN_SCENE(INT &iProgress)
SWITCH iProgress
CASE 0
iProgress++
BREAK
CASE 1
REQUEST_ANIM_DICT("misscarsteal4@aliens")
REQUEST_ANIM_DICT("misscarsteal4@meltdown")
REQUEST_MODEL(osPropCamera.ModelName)
REQUEST_MODEL(osPropMicrophone.ModelName)
REQUEST_MODEL(osPropGreenScreen.ModelName)
IF HAS_ANIM_DICT_LOADED("misscarsteal4@aliens")
AND HAS_ANIM_DICT_LOADED("misscarsteal4@meltdown")
IF HAS_MISSION_OBJECT_BEEN_CREATED(osPropGreenScreen)//, TRUE)
AND HAS_MISSION_PED_BEEN_CREATED(psMeltdownCrew[MSP_ACTORA], FALSE, rgFilmCrew, FALSE, NO_CHARACTER)
AND HAS_MISSION_PED_BEEN_CREATED(psMeltdownCrew[MSP_ACTORB], FALSE, rgFilmCrew, FALSE, NO_CHARACTER)
AND HAS_MISSION_PED_BEEN_CREATED(psMeltdownCrew[MSP_CAMERAMAN], FALSE, rgFilmCrew, FALSE, NO_CHARACTER)
AND HAS_MISSION_PED_BEEN_CREATED(psMeltdownCrew[MSP_BOOMMAN], FALSE, rgFilmCrew, FALSE, NO_CHARACTER)
AND HAS_MISSION_PED_BEEN_CREATED(psMeltdownCrew[MSP_DIRECTOR], FALSE, rgFilmCrew, FALSE, NO_CHARACTER)
IF HAS_MISSION_OBJECT_BEEN_CREATED(osPropCamera)
AND HAS_MISSION_OBJECT_BEEN_CREATED(osPropMicrophone)
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iMeltdownSceneID)
iMeltdownSceneID = CREATE_SYNCHRONIZED_SCENE(vMeltdownScenePosition, vMeltdownSceneRotation)
SET_SYNCHRONIZED_SCENE_LOOPED(iMeltdownSceneID, TRUE)
SET_SYNCHRONIZED_SCENE_RATE(iMeltdownSceneID, 0.80)
IF NOT IS_PED_INJURED(psMeltdownCrew[MSP_ACTORA].PedIndex)
SET_PED_COMPONENT_VARIATION(psMeltdownCrew[MSP_ACTORA].PedIndex, PED_COMP_HEAD, 0, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(psMeltdownCrew[MSP_ACTORA].PedIndex, PED_COMP_HAIR, 0, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(psMeltdownCrew[MSP_ACTORA].PedIndex, PED_COMP_TORSO, 1, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psMeltdownCrew[MSP_ACTORA].PedIndex, PED_COMP_LEG, 1, 0, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psMeltdownCrew[MSP_ACTORA].PedIndex, PED_COMP_HAND, 0, 0, 0) //(hand)
SET_PED_COMPONENT_VARIATION(psMeltdownCrew[MSP_ACTORA].PedIndex, PED_COMP_FEET, 0, 0, 0) //(feet)
SET_PED_COMPONENT_VARIATION(psMeltdownCrew[MSP_ACTORA].PedIndex, PED_COMP_TEETH, 0, 0, 0) //(teef)
SET_PED_COMPONENT_VARIATION(psMeltdownCrew[MSP_ACTORA].PedIndex, PED_COMP_JBIB, 1, 0, 0) //(jbib)
TASK_SYNCHRONIZED_SCENE(psMeltdownCrew[MSP_ACTORA].PedIndex, iMeltdownSceneID,
"misscarsteal4@meltdown", "_rehearsal_actor_a",
INSTANT_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psMeltdownCrew[MSP_ACTORA].PedIndex)
ENDIF
IF NOT IS_PED_INJURED(psMeltdownCrew[MSP_ACTORB].PedIndex)
//S_M_M_MOVALIEN_01 variations
SET_PED_COMPONENT_VARIATION(psMeltdownCrew[MSP_ACTORB].PedIndex, PED_COMP_HEAD, 1, 1, 0) //(head)
SET_PED_COMPONENT_VARIATION(psMeltdownCrew[MSP_ACTORB].PedIndex, PED_COMP_TORSO, 1, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psMeltdownCrew[MSP_ACTORB].PedIndex, PED_COMP_LEG, 1, 0, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psMeltdownCrew[MSP_ACTORB].PedIndex, PED_COMP_HAND, 1, 0, 0) //(hand)
//S_M_Y_GRIP_01 varitions
//SET_PED_COMPONENT_VARIATION(psMeltdownCrew[MSP_ACTORB].PedIndex, PED_COMP_HEAD, 0, 0, 0) //(head)
//SET_PED_COMPONENT_VARIATION(psMeltdownCrew[MSP_ACTORB].PedIndex, PED_COMP_TORSO, 0, 0, 0) //(uppr)
//SET_PED_COMPONENT_VARIATION(psMeltdownCrew[MSP_ACTORB].PedIndex, PED_COMP_LEG, 0, 1, 0) //(lowr)
//SET_PED_COMPONENT_VARIATION(psMeltdownCrew[MSP_ACTORB].PedIndex, PED_COMP_SPECIAL, 2, 0, 0) //(accs)
TASK_SYNCHRONIZED_SCENE(psMeltdownCrew[MSP_ACTORB].PedIndex, iMeltdownSceneID,
"misscarsteal4@meltdown", "_rehearsal_actor_b",
INSTANT_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psMeltdownCrew[MSP_ACTORB].PedIndex)
ENDIF
IF NOT IS_PED_INJURED(psMeltdownCrew[MSP_CAMERAMAN].PedIndex)
IF DOES_ENTITY_EXIST(osPropCamera.ObjectIndex) AND NOT IS_ENTITY_DEAD(osPropCamera.ObjectIndex)
IF NOT IS_ENTITY_ATTACHED(osPropCamera.ObjectIndex)
ATTACH_ENTITY_TO_ENTITY(osPropCamera.ObjectIndex, psMeltdownCrew[MSP_CAMERAMAN].PedIndex,
GET_PED_BONE_INDEX( psMeltdownCrew[MSP_CAMERAMAN].PedIndex, BONETAG_PH_R_HAND),
<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
ENDIF
ENDIF
TASK_SYNCHRONIZED_SCENE(psMeltdownCrew[MSP_CAMERAMAN].PedIndex, iMeltdownSceneID,
"misscarsteal4@meltdown", "_rehearsal_camera_man",
INSTANT_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psMeltdownCrew[MSP_CAMERAMAN].PedIndex)
ENDIF
IF NOT IS_PED_INJURED(psMeltdownCrew[MSP_BOOMMAN].PedIndex)
IF DOES_ENTITY_EXIST(osPropMicrophone.ObjectIndex) AND NOT IS_ENTITY_DEAD(osPropMicrophone.ObjectIndex)
IF NOT IS_ENTITY_ATTACHED(osPropMicrophone.ObjectIndex)
ATTACH_ENTITY_TO_ENTITY(osPropMicrophone.ObjectIndex, psMeltdownCrew[MSP_BOOMMAN].PedIndex,
GET_PED_BONE_INDEX( psMeltdownCrew[MSP_BOOMMAN].PedIndex, BONETAG_PH_R_HAND),
<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
ENDIF
ENDIF
TASK_SYNCHRONIZED_SCENE(psMeltdownCrew[MSP_BOOMMAN].PedIndex, iMeltdownSceneID,
"misscarsteal4@meltdown", "_rehearsal_boom_op",
INSTANT_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psMeltdownCrew[MSP_BOOMMAN].PedIndex)
ENDIF
IF NOT IS_PED_INJURED(psMeltdownCrew[MSP_DIRECTOR].PedIndex)
SET_PED_COMPONENT_VARIATION(psMeltdownCrew[MSP_DIRECTOR].PedIndex, PED_COMP_HEAD, 0, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(psMeltdownCrew[MSP_DIRECTOR].PedIndex, PED_COMP_TORSO, 0, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psMeltdownCrew[MSP_DIRECTOR].PedIndex, PED_COMP_LEG, 0, 0, 0) //(lowr)
ENDIF
ADD_PED_FOR_DIALOGUE(CST4Conversation, 4, psMeltdownCrew[MSP_ACTORA].PedIndex, "DYLAN")
ADD_PED_FOR_DIALOGUE(CST4Conversation, 5, psMeltdownCrew[MSP_ACTORB].PedIndex, "FITCH")
ADD_PED_FOR_DIALOGUE(CST4Conversation, 8, psMeltdownCrew[MSP_DIRECTOR].PedIndex, "ANTON")
SET_MODEL_AS_NO_LONGER_NEEDED(osPropCamera.ModelName)
SET_MODEL_AS_NO_LONGER_NEEDED(osPropMicrophone.ModelName)
SET_MODEL_AS_NO_LONGER_NEEDED(osPropGreenScreen.ModelName)
GO_TO_PED_STATE(psMeltdownCrew[MSP_ACTORA], PED_STATE_PLAYING_ANIM_1)
GO_TO_PED_STATE(psMeltdownCrew[MSP_ACTORB], PED_STATE_PLAYING_ANIM_1)
GO_TO_PED_STATE(psMeltdownCrew[MSP_BOOMMAN], PED_STATE_PLAYING_ANIM_1)
GO_TO_PED_STATE(psMeltdownCrew[MSP_DIRECTOR], PED_STATE_PLAYING_ANIM_1)
GO_TO_PED_STATE(psMeltdownCrew[MSP_CAMERAMAN], PED_STATE_PLAYING_ANIM_1)
iMeltdownDialogueProgress = 0
iProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
MANAGE_MELTDOWN_DIALOGUE()
MANAGE_MELTDOWN_PED(psMeltdownCrew[MSP_ACTORA], PLAYER_PED_ID(), 900)
MANAGE_MELTDOWN_PED(psMeltdownCrew[MSP_ACTORB], PLAYER_PED_ID(), 1000)
MANAGE_MELTDOWN_PED(psMeltdownCrew[MSP_BOOMMAN], PLAYER_PED_ID(), 1250)
MANAGE_MELTDOWN_PED(psMeltdownCrew[MSP_CAMERAMAN], PLAYER_PED_ID(), 950)
MANAGE_MELTDOWN_DIRECTOR_PED(psMeltdownCrew[MSP_DIRECTOR], PLAYER_PED_ID())
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_WALKING_ALIENS(INT &iProgress)
SWITCH iProgress
CASE 0
IF ( bSecurityAlerted = FALSE )
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), << -1139.96, -452.77, 40.31 >>, << 22.0, 22.0, 8.0 >>)
iProgress++
ENDIF
ENDIF
BREAK
CASE 1
IF HAS_MISSION_PED_BEEN_CREATED(psAliens[0], FALSE, rgFilmCrew, FALSE, NO_CHARACTER)
AND HAS_MISSION_PED_BEEN_CREATED(psAliens[1], FALSE, rgFilmCrew, FALSE, NO_CHARACTER)
GO_TO_PED_STATE(psAliens[0], PED_STATE_MOVING_TO_LOCATION)
GO_TO_PED_STATE(psAliens[1], PED_STATE_MOVING_TO_LOCATION)
iProgress++
ENDIF
BREAK
CASE 2
IF DOES_ENTITY_EXIST(psAliens[0].PedIndex)
psAliens[0].fDistanceToTarget = GET_DISTANCE_BETWEEN_ENTITIES(psAliens[0].PedIndex, PLAYER_PED_ID())
#IF IS_DEBUG_BUILD
psAliens[0].sDebugName = "Alien0"
IF NOT IS_ENTITY_DEAD(psAliens[0].PedIndex)
SET_PED_NAME_DEBUG(psAliens[0].PedIndex, "Alien0")
ENDIF
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psAliens[0].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(psAliens[0].eState), 1.25)
ENDIF
#ENDIF
IF NOT IS_ENTITY_DEAD(psAliens[0].PedIndex)
IF ( psAliens[0].eState != PED_STATE_FLEEING )
IF ( bAlienWalkDisrupted = TRUE )
OR IS_ENTITY_TOUCHING_ENTITY(psAliens[0].PedIndex, PLAYER_PED_ID())
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(psAliens[0].PedIndex, PLAYER_PED_ID())
OR HAS_PED_RECEIVED_EVENT(psAliens[0].PedIndex, EVENT_SHOT_FIRED)
OR HAS_PED_RECEIVED_EVENT(psAliens[0].PedIndex, EVENT_SHOT_FIRED_WHIZZED_BY)
OR HAS_PED_RECEIVED_EVENT(psAliens[0].PedIndex, EVENT_SHOT_FIRED_BULLET_IMPACT)
GO_TO_PED_STATE(psAliens[0], PED_STATE_FLEEING)
ENDIF
ENDIF
SWITCH psAliens[0].eState
CASE PED_STATE_MOVING_TO_LOCATION
IF ( psAliens[0].bHasTask = FALSE )
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1143.49, -464.56, 33.96 >>, 0.8, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1143.91, -458.29, 34.08 >>, 0.8, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1150.15, -455.65, 33.91 >>, 0.8, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1162.95, -461.74, 33.30 >>, 0.8, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1166.33, -459.13, 33.27 >>, 0.8, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1183.96, -467.70, 32.30 >>, 0.8, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1204.53, -480.80, 31.49 >>, 0.8, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_WANDER_IN_AREA(NULL, << -1223.41, -496.62, 30.31 >>, 10.0)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(psAliens[0].PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psAliens[0].PedIndex, TRUE)
psAliens[0].bHasTask = TRUE
ENDIF
BREAK
CASE PED_STATE_FLEEING
IF ( psAliens[0].bHasTask = FALSE )
CLEAR_PED_TASKS(psAliens[0].PedIndex)
SET_PED_COMBAT_ATTRIBUTES(psAliens[0].PedIndex, CA_ALWAYS_FLEE, TRUE)
SET_PED_FLEE_ATTRIBUTES(psAliens[0].PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(psAliens[0].PedIndex, FA_DISABLE_COWER, TRUE)
SET_PED_FLEE_ATTRIBUTES(psAliens[0].PedIndex, FA_DISABLE_HANDS_UP, TRUE)
TASK_SMART_FLEE_PED(psAliens[0].PedIndex, PLAYER_PED_ID(), 300, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psAliens[0].PedIndex, FALSE)
SET_PED_KEEP_TASK(psAliens[0].PedIndex, TRUE)
bAlienWalkDisrupted = TRUE
psAliens[0].iConversationTimer = 0
psAliens[0].bHasTask = TRUE
ENDIF
IF GET_GAME_TIMER() - psAliens[0].iConversationTimer > 0
IF NOT IS_AMBIENT_SPEECH_PLAYING(psAliens[0].PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(psAliens[0].PedIndex, "SCREAM_PANIC", "WAVELOAD_PAIN_MALE", SPEECH_PARAMS_FORCE)
psAliens[0].iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 7000)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
IF IS_ENTITY_DEAD(psAliens[0].PedIndex) OR psAliens[0].eState = PED_STATE_FLEEING
IF IS_ENTITY_DEAD(psAliens[0].PedIndex)
IF (psAliens[0].eCleanupReason = PED_CLEANUP_NO_CLEANUP)
psAliens[0].eCleanupReason = GET_PED_CLEANUP_REASON(psAliens[0])
UPDATE_PLAYER_KILL_COUNTERS(psAliens[0].eCleanupReason, iPlayerLethalKills, iPlayerStealthKills, iPlayerTakedownKills)
ENDIF
ENDIF
IF ( psAliens[0].fDistanceToTarget > 200.0 )
SET_PED_AS_NO_LONGER_NEEDED(psAliens[0].PedIndex)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psAliens[1].PedIndex)
psAliens[1].fDistanceToTarget = GET_DISTANCE_BETWEEN_ENTITIES(psAliens[1].PedIndex, PLAYER_PED_ID())
#IF IS_DEBUG_BUILD
psAliens[1].sDebugName = "Alien1"
IF NOT IS_ENTITY_DEAD(psAliens[1].PedIndex)
SET_PED_NAME_DEBUG(psAliens[1].PedIndex, "Alien1")
ENDIF
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(psAliens[1].PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(psAliens[1].eState), 1.25)
ENDIF
#ENDIF
IF NOT IS_ENTITY_DEAD(psAliens[1].PedIndex)
IF ( psAliens[1].eState != PED_STATE_FLEEING )
IF ( bAlienWalkDisrupted = TRUE )
OR IS_ENTITY_TOUCHING_ENTITY(psAliens[1].PedIndex, PLAYER_PED_ID())
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(psAliens[1].PedIndex, PLAYER_PED_ID())
OR HAS_PED_RECEIVED_EVENT(psAliens[1].PedIndex, EVENT_SHOT_FIRED)
OR HAS_PED_RECEIVED_EVENT(psAliens[1].PedIndex, EVENT_SHOT_FIRED_WHIZZED_BY)
OR HAS_PED_RECEIVED_EVENT(psAliens[1].PedIndex, EVENT_SHOT_FIRED_BULLET_IMPACT)
GO_TO_PED_STATE(psAliens[1], PED_STATE_FLEEING)
ENDIF
ENDIF
SWITCH psAliens[1].eState
CASE PED_STATE_MOVING_TO_LOCATION
IF ( psAliens[1].bHasTask = FALSE )
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1142.27, -462.21, 34.07 >>, 0.8, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1143.37, -457.43, 34.19 >>, 0.8, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1152.27, -454.78, 33.86 >>, 0.8, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1164.64, -460.87, 33.27 >>, 0.8, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1167.92, -458.11, 33.237 >>, 0.8, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1184.64, -465.70, 32.47 >>, 0.8, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1206.56, -478.80, 31.57 >>, 0.8, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_WANDER_IN_AREA(NULL, << -1223.41, -496.62, 30.31 >>, 10.0)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(psAliens[1].PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psAliens[1].PedIndex, TRUE)
psAliens[1].bHasTask = TRUE
ENDIF
BREAK
CASE PED_STATE_FLEEING
IF ( psAliens[1].bHasTask = FALSE )
CLEAR_PED_TASKS(psAliens[1].PedIndex)
SET_PED_COMBAT_ATTRIBUTES(psAliens[1].PedIndex, CA_ALWAYS_FLEE, TRUE)
SET_PED_FLEE_ATTRIBUTES(psAliens[1].PedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(psAliens[1].PedIndex, FA_DISABLE_COWER, TRUE)
SET_PED_FLEE_ATTRIBUTES(psAliens[1].PedIndex, FA_DISABLE_HANDS_UP, TRUE)
TASK_SMART_FLEE_PED(psAliens[1].PedIndex, PLAYER_PED_ID(), 300, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psAliens[1].PedIndex, FALSE)
SET_PED_KEEP_TASK(psAliens[1].PedIndex, TRUE)
bAlienWalkDisrupted = TRUE
psAliens[1].iConversationTimer = 0
psAliens[1].bHasTask = TRUE
ENDIF
IF GET_GAME_TIMER() - psAliens[1].iConversationTimer > 0
IF NOT IS_AMBIENT_SPEECH_PLAYING(psAliens[1].PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(psAliens[1].PedIndex, "SCREAM_PANIC", "WAVELOAD_PAIN_MALE", SPEECH_PARAMS_FORCE)
psAliens[1].iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 8000)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
IF IS_ENTITY_DEAD(psAliens[1].PedIndex) OR psAliens[1].eState = PED_STATE_FLEEING
IF IS_ENTITY_DEAD(psAliens[1].PedIndex)
IF (psAliens[1].eCleanupReason = PED_CLEANUP_NO_CLEANUP)
psAliens[1].eCleanupReason = GET_PED_CLEANUP_REASON(psAliens[1])
UPDATE_PLAYER_KILL_COUNTERS(psAliens[1].eCleanupReason, iPlayerLethalKills, iPlayerStealthKills, iPlayerTakedownKills)
ENDIF
ENDIF
IF ( psAliens[1].fDistanceToTarget > 200.0 )
SET_PED_AS_NO_LONGER_NEEDED(psAliens[1].PedIndex)
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC RUN_DOOR_BARGE_CHECK()
IF ( bDoorBargePlayed = FALSE )
REQUEST_ANIM_DICT("missarmenian3_tryopendoor")
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1089.873169,-432.288513,35.528690>>, <<-1088.673828,-431.657532,38.127274>>, 1.7)
IF IS_PED_WALKING(PLAYER_PED_ID())
AND NOT IS_PED_CLIMBING(PLAYER_PED_ID())
VECTOR vVelocity
vVelocity = GET_ENTITY_SPEED_VECTOR(PLAYER_PED_ID(), TRUE)
IF ( vVelocity.y > 0.0 )
AND ( GET_ENTITY_HEADING(PLAYER_PED_ID()) < 130.0 AND GET_ENTITY_HEADING(PLAYER_PED_ID()) > 90.0 )
IF NOT IS_PHONE_ONSCREEN()
IF HAS_ANIM_DICT_LOADED("missarmenian3_tryopendoor")
IF NOT IS_AREA_OCCUPIED(<<-1088.917603 - 2.0, -431.848083 - 2.0, 37.127144 - 1.5 >>,
<<-1088.917603 + 2.0, -431.848083 + 2.0, 37.127144 + 1.5 >>,
FALSE, TRUE, FALSE, FALSE, FALSE, PLAYER_PED_ID())
VECTOR vAnimationPosition, vAnimationRotation
vAnimationPosition = GET_ANIM_INITIAL_OFFSET_POSITION("missarmenian3_tryopendoor", "lockeddoor_tryopen", << -1090.100, -431.850, 35.620 >>, << 0.000, 0.000, 120.000 >>)
vAnimationRotation = GET_ANIM_INITIAL_OFFSET_ROTATION("missarmenian3_tryopendoor", "lockeddoor_tryopen", << -1090.100, -431.850, 35.620 >>, << 0.000, 0.000, 120.000 >>)
SEQUENCE_INDEX SequenceIndex
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_GO_STRAIGHT_TO_COORD(NULL, vAnimationPosition, PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP, vAnimationRotation.Z)
TASK_PLAY_ANIM_ADVANCED(NULL, "missarmenian3_tryopendoor", "lockeddoor_tryopen", << -1090.10, -431.85, 35.62 >>,
<< 0.0, 0.0, 120.0 >>, WALK_BLEND_IN, WALK_BLEND_OUT, -1,
AF_EXTRACT_INITIAL_OFFSET | AF_IGNORE_GRAVITY | AF_OVERRIDE_PHYSICS | AF_TURN_OFF_COLLISION | AF_EXIT_AFTER_INTERRUPTED)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
bDoorBargePlayed = TRUE
bDoorBargeInterrupted = FALSE
ELSE
REMOVE_ANIM_DICT("missarmenian3_tryopendoor")
bDoorBargePlayed = TRUE
bDoorBargeInterrupted = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bPlayerInsideFilmStudio = TRUE OR bSecurityAlerted = TRUE ) //if player gets into film studio, don't attempt to play animation again
bDoorBargePlayed = TRUE
ENDIF
ELSE
IF ( bDoorBargeInterrupted = FALSE )
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "missarmenian3_tryopendoor", "lockeddoor_tryopen")
IF IS_PED_RAGDOLL(PLAYER_PED_ID())
OR IS_PED_PERFORMING_MELEE_ACTION(PLAYER_PED_ID())
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_JUMP)
CLEAR_PED_TASKS(PLAYER_PED_ID())
bDoorBargeInterrupted = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bPlayerInsideFilmStudio = TRUE )
REMOVE_ANIM_DICT("missarmenian3_tryopendoor")
ENDIF
ENDPROC
PROC MANAGE_REQUESTING_TRAILER_CUTSCENE()
IF DOES_ENTITY_EXIST(psActor.PedIndex)
IF IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()
OR IS_PLAYER_CHANGING_CLOTHES()
OR ( bSecurityAlerted = TRUE )
IF HAS_THIS_CUTSCENE_LOADED("car_4_mcs_1")
OR HAS_CUTSCENE_LOADED()
OR IS_CUTSCENE_ACTIVE()
REMOVE_CUTSCENE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player browsing items in a shop or changing clothes or security is alerted. Removing cutscene.")
#ENDIF
ENDIF
ELSE
IF ( bPlayerInsideFilmStudio = TRUE )
AND ( psActor.fDistanceToTarget < 50.0 )
REQUEST_CUTSCENE("car_4_mcs_1")
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Franklin", PLAYER_PED_ID())
ENDIF
ELSE
IF HAS_THIS_CUTSCENE_LOADED("car_4_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
ENDIF
ENDPROC
BOOL bFirstTimePlayerEntered
FUNC BOOL IS_MISSION_STAGE_GET_TO_ACTOR_COMPLETED(INT &iStageProgress)
IF bPlayerInsideFilmStudio
IF bFirstTimePlayerEntered = FALSE
REPLAY_RECORD_BACK_FOR_TIME(3.0, 4.0, REPLAY_IMPORTANCE_NORMAL)
bFirstTimePlayerEntered = TRUE
ENDIF
ENDIF
MANAGE_FILM_CREW(iFilmCrewProgress)
MANAGE_DIRECTOR_AND_GRIP(iDirectorAndGripProgress)
MANAGE_ACTRESS(psActress, PLAYER_PED_ID(), vsPlayersCar.VehicleIndex)
MANAGE_TOILET_SCENE(iToiletSceneProgress)
MANAGE_MELTDOWN_SCENE(iMeltdownSceneProgress)
MANAGE_WALKING_ALIENS(iWalkingAliensProgress)
MANAGE_ACTOR_DURING_GET_TO_ACTOR(psActor, PLAYER_PED_ID())
MANAGE_ASSISTANT_PED_DURING_GET_TO_ACTOR(psAssistant, PLAYER_PED_ID())
MANAGE_SECURITY_PEDS_AT_GATES(iGateSecurityProgress)
MANAGE_SECURITY_PEDS_AT_FILM_SET(iSetSecurityProgress)
MANAGE_SECURITY_PEDS_AROUND_ACTOR(iActorSecurityProgress)
MANAGE_SECURITY_PEDS_FOR_MELTDOWN(iMeltdownSecurityProgress)
RUN_DOOR_BARGE_CHECK()
MANAGE_REQUESTING_TRAILER_CUTSCENE()
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_SCALL")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF PLAYER_CALL_CHAR_CELLPHONE(CST4Conversation, CHAR_MOLLY, "CST4AUD", "CST4_SCALL", CONV_PRIORITY_VERY_HIGH)
SET_LABEL_AS_TRIGGERED("CST4_SCALL", TRUE)
ENDIF
ENDIF
ENDIF
IF ( bMusicEventMissionStartTriggered = FALSE )
IF HAS_LABEL_BEEN_TRIGGERED("CST4_SCALL")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_MOBILE_PHONE_CALL_ONGOING()
AND NOT IS_CALLING_CONTACT(CHAR_MOLLY)
AND NOT IS_CONTACT_IN_CONNECTED_CALL(CHAR_MOLLY)
IF TRIGGER_MUSIC_EVENT("CAR3_MISSION_START")
bMusicEventMissionStartTriggered = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("CAR_3_INSIDE_STUDIO")
IF ( bPlayerInsideFilmStudio = TRUE )
START_AUDIO_SCENE("CAR_3_INSIDE_STUDIO")
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CAR4_CDOOR")
IF HAS_LABEL_BEEN_TRIGGERED("CST4_SCALL")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_MOBILE_PHONE_CALL_ONGOING()
AND NOT IS_CALLING_CONTACT(CHAR_MOLLY)
AND NOT IS_CONTACT_IN_CONNECTED_CALL(CHAR_MOLLY)
IF ( bPlayerInsideFilmStudio = FALSE )
IF NOT DOES_BLIP_EXIST(DestinationBlip)
DestinationBlip = ADD_BLIP_FOR_COORD(<< -1091.00, -433.06, 36.63 >>)
PRINT_GOD_TEXT_ADVANCED("CAR4_CDOOR", DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
ELSE
SET_LABEL_AS_TRIGGERED("CAR4_CDOOR", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CAR4_HALERT")
IF bMusicEventMissionStartTriggered
IF ( bSecurityAlerted = TRUE )
IF DOES_BLIP_EXIST(DestinationBlip)
REMOVE_BLIP(DestinationBlip)
ENDIF
IF DOES_BLIP_EXIST(psActor.BlipIndex)
REMOVE_BLIP(psActor.BlipIndex)
ENDIF
IF ( bMusicEventSetAlertTriggered = FALSE )
IF TRIGGER_MUSIC_EVENT("CAR3_SET_ALERT")
bMusicEventSetAlertTriggered = TRUE
ENDIF
ENDIF
PRINT_HELP_ADVANCED("CAR4_HALERT", FALSE, TRUE, DEFAULT_HELP_TEXT_TIME, TRUE)
IF NOT IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsPlayersCar.VehicleIndex, TRUE)
IF IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
CLEAR_PRINTS()
ENDIF
PRINT_GOD_TEXT_ADVANCED("CAR4_LCAR", DEFAULT_GOD_TEXT_TIME, TRUE)
CLEANUP_TRACKED_POINT(iActorTrackedPoint)
CREATE_TRACKED_POINT_FOR_COORD(iCarTrackedPoint, vsPlayersCar.vPosition, 3.0)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CMN_GENGETIN")
IF HAS_LABEL_BEEN_TRIGGERED("CAR4_LCAR")
IF DOES_TRACKED_POINT_EXIST(iCarTrackedPoint)
IF IS_TRACKED_POINT_VISIBLE(iCarTrackedPoint)
IF DOES_BLIP_EXIST(DestinationBlip)
REMOVE_BLIP(DestinationBlip)
ENDIF
IF IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
CLEAR_PRINTS()
ENDIF
CLEANUP_TRACKED_POINT(iCarTrackedPoint)
PRINT_GOD_TEXT_ADVANCED("CMN_GENGETIN", DEFAULT_GOD_TEXT_TIME, TRUE)
IF NOT DOES_BLIP_EXIST(vsPlayersCar.BlipIndex)
vsPlayersCar.BlipIndex = CREATE_BLIP_FOR_VEHICLE(vsPlayersCar.VehicleIndex)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CAR4_HKO")
IF DOES_ENTITY_EXIST(psActor.PedIndex)
IF NOT IS_ENTITY_DEAD(psActor.PedIndex)
IF ( psActor.eState != PED_STATE_FLEEING )
IF DOES_BLIP_EXIST(psActor.BlipIndex)
IF DOES_TRACKED_POINT_EXIST(iActorTrackedPoint)
IF IS_TRACKED_POINT_VISIBLE(iActorTrackedPoint)
PRINT_HELP_ADVANCED("CAR4_HKO", FALSE, TRUE, DEFAULT_HELP_TEXT_TIME, TRUE)
CLEANUP_TRACKED_POINT(iActorTrackedPoint)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH iStageProgress
CASE 0
IF DOES_ENTITY_EXIST(psActor.PedIndex)
IF NOT IS_ENTITY_DEAD(psActor.PedIndex)
IF NOT HAS_LABEL_BEEN_TRIGGERED("CAR4_TMSTA")
IF NOT DOES_BLIP_EXIST(psActor.BlipIndex)
IF ( bPlayerInsideFilmStudio = TRUE AND bSecurityAlerted = FALSE )
IF HAS_LABEL_BEEN_TRIGGERED("CST4_SCALL")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_MOBILE_PHONE_CALL_ONGOING()
AND NOT IS_CALLING_CONTACT(CHAR_MOLLY)
AND NOT IS_CONTACT_IN_CONNECTED_CALL(CHAR_MOLLY)
CLEAR_PRINTS()
IF DOES_BLIP_EXIST(DestinationBlip)
REMOVE_BLIP(DestinationBlip)
ENDIF
psActor.BlipIndex = CREATE_BLIP_FOR_PED(psActor.PedIndex, TRUE)
PRINT_GOD_TEXT_ADVANCED("CAR4_TMSTA", DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_DEAD(psActor.PedIndex)
IF ( psActor.eCleanupReason = PED_CLEANUP_KILLED_BY_PLAYER_STEALTH )
OR ( psActor.eCleanupReason = PED_CLEANUP_KILLED_BY_PLAYER_TAKEDOWN )
OR ( psActor.eCleanupReason = PED_CLEANUP_KILLED_BY_PLAYER_LETHAL )
IF ( psActor.eCleanupReason = PED_CLEANUP_KILLED_BY_PLAYER_STEALTH )
SET_GLOBAL_BIT_SET(ACTOR_STEALTH_KILLED)
CLEAR_GLOBAL_BIT_SET(ACTOR_KILLED)
ELIF ( psActor.eCleanupReason = PED_CLEANUP_KILLED_BY_PLAYER_TAKEDOWN )
SET_GLOBAL_BIT_SET(ACTOR_STEALTH_KILLED)
SWITCH ActorCauseOfDeathWeapon
CASE WEAPONTYPE_KNIFE
CASE WEAPONTYPE_DLC_BOTTLE
CASE WEAPONTYPE_DLC_DAGGER
SET_GLOBAL_BIT_SET(ACTOR_KILLED)
BREAK
DEFAULT
CLEAR_GLOBAL_BIT_SET(ACTOR_KILLED)
BREAK
ENDSWITCH
ELIF ( psActor.eCleanupReason = PED_CLEANUP_KILLED_BY_PLAYER_LETHAL )
CLEAR_GLOBAL_BIT_SET(ACTOR_STEALTH_KILLED)
SET_GLOBAL_BIT_SET(ACTOR_KILLED)
ENDIF
IF NOT IS_BIT_SET(g_iCarSteal3AgentBitSet, ACTOR_KILLED)
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(CS3_ACTOR_KNOCKOUT)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Informing stat system that bool stat CS3_ACTOR_KNOCKOUT happened.")
#ENDIF
ENDIF
STOP_AUDIO_SCENE("CAR_3_TAKE_OUT_ACTOR")
REPLAY_RECORD_BACK_FOR_TIME(6.0, 0.0, REPLAY_IMPORTANCE_HIGH)
iStageProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF ( bSecurityAlerted = FALSE AND bSpawnActorSecurity = FALSE )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF ( psActor.fDistanceToTarget < 5.0)
CLEANUP_TRACKED_POINT(iCarTrackedPoint)
CLEANUP_TRACKED_POINT(iActorTrackedPoint)
SET_PED_AS_NO_LONGER_NEEDED(psActor.PedIndex)
RETURN TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
IF IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsPlayersCar.VehicleIndex)
IF NOT IS_PED_IN_THIS_VEHICLE(psActress.PedIndex, vsPlayersCar.VehicleIndex)
SET_GLOBAL_BIT_SET(ACTRESS_FLED_CAR)
ENDIF
IF IS_THIS_PRINT_BEING_DISPLAYED("CMN_GENGETIN")
CLEAR_PRINTS()
ENDIF
IF DOES_BLIP_EXIST(vsPlayersCar.BlipIndex)
REMOVE_BLIP(vsPlayersCar.BlipIndex)
ENDIF
IF DOES_BLIP_EXIST(psActor.BlipIndex)
REMOVE_BLIP(psActor.BlipIndex)
ENDIF
IF DOES_BLIP_EXIST(DestinationBlip)
REMOVE_BLIP(DestinationBlip)
ENDIF
IF DOES_ENTITY_EXIST(psActor.PedIndex)
IF NOT IS_ENTITY_DEAD(psActor.PedIndex)
SET_GLOBAL_BIT_SET(ACTOR_IGNORED)
ENDIF
SET_PED_AS_NO_LONGER_NEEDED(psActor.PedIndex)
ENDIF
IF DOES_ENTITY_EXIST(psAssistant.PedIndex)
SET_PED_AS_NO_LONGER_NEEDED(psAssistant.PedIndex)
ENDIF
REMOVE_ANIM_DICT("misscarsteal4@actor")
REMOVE_ANIM_DICT("misscarsteal4@aliens")
REMOVE_ANIM_DICT("misscarsteal4@meltdown")
CLEANUP_PED_GROUP(psAliens, FALSE, FALSE, FALSE)
CLEANUP_PED_GROUP(psMeltdownCrew,FALSE, FALSE, FALSE)
CLEANUP_OBJECT(osPropCamera.ObjectIndex, FALSE)
CLEANUP_OBJECT(osPropMicrophone.ObjectIndex, FALSE)
CLEANUP_OBJECT(osPropGreenScreen.ObjectIndex, FALSE, FALSE)
CLEANUP_TRACKED_POINT(iCarTrackedPoint)
CLEANUP_TRACKED_POINT(iActorTrackedPoint)
IF IS_AUDIO_SCENE_ACTIVE("CAR_3_INSIDE_STUDIO")
STOP_AUDIO_SCENE("CAR_3_INSIDE_STUDIO")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("CAR_3_TAKE_OUT_ACTOR")
STOP_AUDIO_SCENE("CAR_3_TAKE_OUT_ACTOR")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("CAR_3_ESCAPE_SECURITY")
START_AUDIO_SCENE("CAR_3_ESCAPE_SECURITY")
ENDIF
bPlayerEnteredTargetVehicle = TRUE
TRIGGER_MUSIC_EVENT("CAR3_DRIVE")
REMOVE_CUTSCENE()
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_TRAILER_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
IF HAS_REQUESTED_CUTSCENE_LOADED("car_4_mcs_1")
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, PLAYER_ONE)
ENDIF
IF NOT IS_PED_INJURED(psActor.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psActor.PedIndex, "spy_actor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, U_M_M_SPYACTOR)
ENDIF
IF DOES_ENTITY_EXIST(osTrailerDoor.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osTrailerDoor.ObjectIndex)
REGISTER_ENTITY_FOR_CUTSCENE(osTrailerDoor.ObjectIndex, "Actors_trailer_door", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, osTrailerDoor.ModelName)
ENDIF
ENDIF
CLEAR_HELP()
CLEAR_PRINTS()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ENDIF
BREAK
CASE 1 //fade screen in if screen was faded out due to shit skip or debug skip
IF IS_CUTSCENE_PLAYING()
REMOVE_ANIM_DICT("misscarsteal4@toilet")
REMOVE_ANIM_DICT("misscarsteal4@aliens")
REMOVE_ANIM_DICT("misscarsteal4@meltdown")
CLEANUP_PED(psToilet, TRUE)
CLEANUP_PED(psAssistant, TRUE)
CLEANUP_PED_GROUP(psAliens, TRUE)
CLEANUP_PED_GROUP(psMeltdownCrew, TRUE)
CLEANUP_OBJECT(osPropCamera.ObjectIndex, TRUE)
CLEANUP_OBJECT(osPropMicrophone.ObjectIndex, TRUE)
CLEANUP_OBJECT(osPropGreenScreen.ObjectIndex, TRUE, FALSE)
IF DOES_ENTITY_EXIST(osPropToilet.ObjectIndex)
REMOVE_MODEL_HIDE(osPropToilet.vPosition, 1.0, osPropToilet.ModelName)
CLEANUP_OBJECT(osPropToilet.ObjectIndex, TRUE)
ENDIF
IF DOES_BLIP_EXIST(DestinationBlip)
REMOVE_BLIP(DestinationBlip)
ENDIF
CLEAR_AREA_OF_PEDS(sMissionPosition.vPosition, 25.0)
CLEAR_AREA_OF_VEHICLES(sMissionPosition.vPosition, 25.0)
CLEAR_AREA_OF_OBJECTS(sMissionPosition.vPosition, 100.0)
CLEAR_AREA_OF_PROJECTILES(sMissionPosition.vPosition, 25.0)
REMOVE_PARTICLE_FX_IN_RANGE(sMissionPosition.vPosition, 25.0)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 2
REQUEST_ANIM_DICT("dead")
IF IS_CUTSCENE_PLAYING()
IF GET_CUTSCENE_TIME() >= 17000.0
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE) //disable cutscene skip when player starts final walk
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
ENDIF
IF ( bPlayerWearingTuxedo = FALSE )
IF IS_CUTSCENE_PLAYING()
IF ( GET_CUTSCENE_TIME() > 10000 )
SET_PLAYER_PED_OUTFIT_TO_TUXEDO(TRUE)
IF DOES_CUTSCENE_ENTITY_EXIST("spy_actor")
SET_CUTSCENE_PED_COMPONENT_VARIATION("spy_actor", PED_COMP_LEG, 1, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("spy_actor", PED_COMP_TORSO, 1, 0)
ENDIF
bPlayerWearingTuxedo = TRUE
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Franklin.")
#ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 1500)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("spy_actor")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for spy_actor.")
#ENDIF
IF NOT IS_PED_INJURED(psActor.PedIndex)
IF HAS_ANIM_DICT_LOADED("dead")
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iDeadActorSceneID)
iDeadActorSceneID = CREATE_SYNCHRONIZED_SCENE(<< -1114.511, -501.777, 35.810 >>, << -0.000, 0.000, 69.480 >>)
TASK_SYNCHRONIZED_SCENE(psActor.PedIndex, iDeadActorSceneID, "dead", "dead_d", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, RBF_BULLET_IMPACT | RBF_PLAYER_IMPACT | RBF_MELEE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psActor.PedIndex)
STOP_PED_SPEAKING(psActor.PedIndex, TRUE)
SET_ENTITY_INVINCIBLE(psActor.PedIndex, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psActor.PedIndex, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Actors_trailer_door")
IF DOES_ENTITY_EXIST(osTrailerDoor.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osTrailerDoor.ObjectIndex)
FREEZE_ENTITY_POSITION(osTrailerDoor.ObjectIndex, TRUE)
ENDIF
ENDIF
ENDIF
IF ( bMusicEventTrailerTriggered = FALSE )
IF IS_CUTSCENE_PLAYING()
IF GET_CUTSCENE_TIME() > 10500
IF TRIGGER_MUSIC_EVENT("CAR3_TRAILER")
bMusicEventTrailerTriggered = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_CUTSCENE_FINISHED()
REPLAY_STOP_EVENT()
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
CLEAR_PED_TASKS(PLAYER_PED_ID())
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 1500)
ENDIF
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
SET_GLOBAL_BIT_SET(PLAYER_GOT_TUXEDO)
RETURN TRUE
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(), ": Mocap cutscene was skipped by the player.")
#ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC MANAGE_ACTOR_DURING_GET_TO_CAR(INT &iProgress)
IF DOES_ENTITY_EXIST(psActor.PedIndex)
IF NOT IS_ENTITY_DEAD(psActor.PedIndex)
SWITCH iProgress
CASE 0
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iDeadActorSceneID)
REQUEST_ANIM_DICT("dead")
IF HAS_ANIM_DICT_LOADED("dead")
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iDeadActorSceneID)
iDeadActorSceneID = CREATE_SYNCHRONIZED_SCENE(<< -1114.511, -501.777, 35.810 >>, << -0.000, 0.000, 69.480 >>)
TASK_SYNCHRONIZED_SCENE(psActor.PedIndex, iDeadActorSceneID, "dead", "dead_d", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, RBF_BULLET_IMPACT | RBF_PLAYER_IMPACT | RBF_MELEE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psActor.PedIndex)
STOP_PED_SPEAKING(psActor.PedIndex, TRUE)
SET_ENTITY_INVINCIBLE(psActor.PedIndex, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psActor.PedIndex, TRUE)
ENDIF
ENDIF
ELSE
SET_RAGDOLL_BLOCKING_FLAGS(psActor.PedIndex, RBF_FIRE)
SET_RAGDOLL_BLOCKING_FLAGS(psActor.PedIndex, RBF_MELEE)
SET_RAGDOLL_BLOCKING_FLAGS(psActor.PedIndex, RBF_EXPLOSION)
SET_RAGDOLL_BLOCKING_FLAGS(psActor.PedIndex, RBF_PLAYER_BUMP)
SET_RAGDOLL_BLOCKING_FLAGS(psActor.PedIndex, RBF_BULLET_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(psActor.PedIndex, RBF_PLAYER_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(psActor.PedIndex, RBF_IMPACT_OBJECT)
iProgress++
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_MISSION_STAGE_GET_TO_CAR_COMPLETED(INT &iStageProgress)
UPDATE_TRIGGERED_LABEL(sLabelGENGETIN)
IF IS_VEHICLE_DRIVEABLE(vsPlayersCar.VehicleIndex)
IF NOT IS_VEHICLE_SEAT_FREE(vsPlayersCar.VehicleIndex, VS_FRONT_RIGHT)
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_ForcePlayerToEnterVehicleThroughDirectDoorOnly, TRUE)
ENDIF
ENDIF
MANAGE_FILM_CREW(iFilmCrewProgress)
MANAGE_ACTOR_DURING_GET_TO_CAR(iDeadActorProgress)
MANAGE_DIRECTOR_AND_GRIP(iDirectorAndGripProgress)
MANAGE_ACTRESS(psActress, PLAYER_PED_ID(), vsPlayersCar.VehicleIndex)
MANAGE_SECURITY_PEDS_AT_GATES(iGateSecurityProgress)
MANAGE_SECURITY_PEDS_AT_FILM_SET(iSetSecurityProgress)
IF NOT HAS_LABEL_BEEN_TRIGGERED("CAR4_HALERT")
IF ( bSecurityAlerted = TRUE )
PRINT_HELP_ADVANCED("CAR4_HALERT", FALSE, TRUE, DEFAULT_HELP_TEXT_TIME, TRUE)
IF ( bMusicEventSetAlertTriggered = FALSE )
IF TRIGGER_MUSIC_EVENT("CAR3_SET_ALERT")
bMusicEventSetAlertTriggered = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH iStageProgress
CASE 0
IF NOT DOES_BLIP_EXIST(vsPlayersCar.BlipIndex)
vsPlayersCar.BlipIndex = CREATE_BLIP_FOR_VEHICLE(vsPlayersCar.VehicleIndex)
PRINT_GOD_TEXT_ADVANCED(sLabelGENGETIN, DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
bPlayerEnteredTargetVehicle = FALSE
iStageProgress++
BREAK
CASE 1
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1187.176270,-501.910004,33.418343>>, <<-1172.835205,-508.601990,37.566460>>, 12.0)
IF ( bMusicEventSetAlertTriggered = FALSE )
IF TRIGGER_MUSIC_EVENT("CAR3_SET_ALERT")
bMusicEventSetAlertTriggered = TRUE
ENDIF
ENDIF
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsPlayersCar.VehicleIndex)
REPLAY_RECORD_BACK_FOR_TIME(8.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
IF DOES_BLIP_EXIST(vsPlayersCar.BlipIndex)
REMOVE_BLIP(vsPlayersCar.BlipIndex)
ENDIF
IF NOT IS_PED_IN_THIS_VEHICLE(psActress.PedIndex, vsPlayersCar.VehicleIndex)
SET_GLOBAL_BIT_SET(ACTRESS_FLED_CAR)
ENDIF
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
TRIGGER_MUSIC_EVENT("CAR3_DRIVE")
IF IS_AUDIO_SCENE_ACTIVE("CAR_3_INSIDE_STUDIO")
STOP_AUDIO_SCENE("CAR_3_INSIDE_STUDIO")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("CAR_3_ESCAPE_SECURITY")
START_AUDIO_SCENE("CAR_3_ESCAPE_SECURITY")
ENDIF
CLEANUP_PED(psActor, TRUE)
REMOVE_ANIM_DICT("dead")
bPlayerEnteredTargetVehicle = TRUE
RETURN TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC CLEANUP_PED_AND_VEHICLE(PED_STRUCT &ped, VEH_STRUCT &vehicle, FLOAT fCleanupDistanceInVehicle = 300.0, FLOAT fCleanupDistanceOnFoot = 150.0)
IF DOES_ENTITY_EXIST(ped.PedIndex)
IF IS_PED_INJURED(ped.PedIndex)
IF ( ped.eCleanupReason = PED_CLEANUP_NO_CLEANUP ) //ped has no cleanup reason
ped.eCleanupReason = GET_PED_CLEANUP_REASON(ped)
UPDATE_PLAYER_KILL_COUNTERS(ped.eCleanupReason, iPlayerLethalKills, iPlayerStealthKills, iPlayerTakedownKills)
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
ELSE //ped has a valid cleanup reason
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
ENDIF
ELSE
IF NOT IS_PED_IN_ANY_VEHICLE(ped.PedIndex)
IF ( GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), ped.PedIndex) > fCleanupDistanceOnFoot )
ped.eCleanupReason = PED_CLEANUP_LOST //flag ped cleanup reason as lost
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped on foot ", ped.sDebugName, " cleaned up with reason PED_CLEANUP_LOST.")
#ENDIF
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
ENDIF
ELSE
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
IF IS_PED_IN_VEHICLE(ped.PedIndex, vehicle.VehicleIndex)
IF ( GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), ped.PedIndex) > fCleanupDistanceInVehicle )
ped.eCleanupReason = PED_CLEANUP_LOST //flag ped cleanup reason as lost
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped in vehicle ", ped.sDebugName, " cleaned up with reason PED_CLEANUP_LOST.")
#ENDIF
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
IF DOES_ENTITY_EXIST(ped.PedIndex)
AND NOT IS_ENTITY_DEAD(ped.PedIndex)
IF ( GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), vehicle.VehicleIndex) > fCleanupDistanceInVehicle )
REMOVE_VEHICLE_STUCK_CHECK(vehicle.VehicleIndex)
REMOVE_VEHICLE_UPSIDEDOWN_CHECK(vehicle.VehicleIndex)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vehicle.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
IF DOES_BLIP_EXIST(vehicle.BlipIndex)
REMOVE_BLIP(vehicle.BlipIndex)
ENDIF
ENDIF
ELSE
REMOVE_VEHICLE_STUCK_CHECK(vehicle.VehicleIndex)
REMOVE_VEHICLE_UPSIDEDOWN_CHECK(vehicle.VehicleIndex)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vehicle.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
IF DOES_BLIP_EXIST(vehicle.BlipIndex)
REMOVE_BLIP(vehicle.BlipIndex)
ENDIF
ENDIF
ELSE
REMOVE_VEHICLE_STUCK_CHECK(vehicle.VehicleIndex)
REMOVE_VEHICLE_UPSIDEDOWN_CHECK(vehicle.VehicleIndex)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vehicle.VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicle.VehicleIndex)
IF DOES_BLIP_EXIST(vehicle.BlipIndex)
REMOVE_BLIP(vehicle.BlipIndex)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC UPDATE_BLIPS_FOR_PED_AND_VEHCILE(PED_STRUCT &ped, VEH_STRUCT &vehicle)
IF DOES_ENTITY_EXIST(ped.PedIndex)
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
IF ( ped.eState = PED_STATE_IMMOBILIZED )
IF DOES_BLIP_EXIST(vehicle.BlipIndex)
REMOVE_BLIP(vehicle.BlipIndex)
ENDIF
IF NOT DOES_BLIP_EXIST(ped.BlipIndex)
ped.BlipIndex = CREATE_BLIP_FOR_PED(ped.PedIndex, TRUE)
ENDIF
ELSE
IF NOT IS_PED_INJURED(ped.PedIndex)
IF IS_PED_IN_VEHICLE(ped.PedIndex, vehicle.VehicleIndex)
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
IF NOT DOES_BLIP_EXIST(vehicle.BlipIndex)
vehicle.BlipIndex = CREATE_BLIP_FOR_COORD(GET_ENTITY_COORDS(vehicle.VehicleIndex))
SET_BLIP_COLOUR(vehicle.BlipIndex, BLIP_COLOUR_RED)
SET_BLIP_PRIORITY(vehicle.BlipIndex, BLIPPRIORITY_HIGHEST)
SET_BLIP_NAME_FROM_TEXT_FILE(vehicle.BlipIndex, "BLIP_VEH")
ENDIF
IF DOES_BLIP_EXIST(vehicle.BlipIndex)
VECTOR vBlipPosition = GET_BLIP_COORDS(vehicle.BlipIndex)
VECTOR vVehiclePosition = GET_ENTITY_COORDS(vehicle.VehicleIndex)
vBlipPosition.X = vBlipPosition.X +@((vVehiclePosition.X - vBlipPosition.X) / BLIP_SLIDE_AMOUNT)
vBlipPosition.Y = vBlipPosition.Y +@((vVehiclePosition.Y - vBlipPosition.Y) / BLIP_SLIDE_AMOUNT)
vBlipPosition.Z = vBlipPosition.Z +@((vVehiclePosition.Z - vBlipPosition.Z) / BLIP_SLIDE_AMOUNT)
SET_BLIP_COORDS(vehicle.BlipIndex, vBlipPosition)
ENDIF
ELSE //driver out of the car
IF DOES_BLIP_EXIST(vehicle.BlipIndex)
REMOVE_BLIP(vehicle.BlipIndex)
ENDIF
IF NOT DOES_BLIP_EXIST(ped.BlipIndex)
ped.BlipIndex = CREATE_BLIP_FOR_PED(ped.PedIndex, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE //vehicle not driveable, diplay the driver blip then
IF NOT IS_PED_INJURED(ped.PedIndex)
IF DOES_BLIP_EXIST(vehicle.BlipIndex)
REMOVE_BLIP(vehicle.BlipIndex)
ENDIF
IF NOT DOES_BLIP_EXIST(ped.BlipIndex)
ped.BlipIndex = CREATE_BLIP_FOR_PED(ped.PedIndex, TRUE)
ENDIF
ENDIF
ENDIF
ELSE //vehicle does not exist, display driver blip
IF NOT IS_PED_INJURED(ped.PedIndex)
IF DOES_BLIP_EXIST(vehicle.BlipIndex)
REMOVE_BLIP(vehicle.BlipIndex)
ENDIF
IF NOT DOES_BLIP_EXIST(ped.BlipIndex)
ped.BlipIndex = CREATE_BLIP_FOR_PED(ped.PedIndex, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC RUN_VEHICLE_WARP_CHECK_BASED_ON_TARGET_VEHICLE(VEHICLE_INDEX VehicleIndex, VEHICLE_INDEX TargetVehicleIndex, VECTOR &vWarpPosition,
FLOAT &fWarpHeading, VECTOR &vLastTargetPosition, FLOAT &fLastTargetHeading,
INT &iWarpTimer, VECTOR vWarpOffset, INT iWarpTimeDelay, FLOAT fWarpDistance)
IF DOES_ENTITY_EXIST(VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(TargetVehicleIndex), vLastTargetPosition) > 20.0
vWarpPosition = vLastTargetPosition //store last target vehicle positon as the new warp position
fWarpHeading = fLastTargetHeading //store last target vehicle heading as the new warp heading
vWarpPosition = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vWarpPosition, fWarpHeading, vWarpOffset)
STORE_ENTITY_POSITION_AND_HEADING(TargetVehicleIndex, vLastTargetPosition, fLastTargetHeading)
ENDIF
IF IS_ENTITY_ON_SCREEN(VehicleIndex)
iWarpTimer = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - iWarpTimer > iWarpTimeDelay
IF GET_DISTANCE_BETWEEN_ENTITIES(VehicleIndex, TargetVehicleIndex) > fWarpDistance
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(TargetVehicleIndex), vWarpPosition) > 20.0
IF NOT IS_VECTOR_ZERO(vWarpPosition)
IF NOT IS_SPHERE_VISIBLE(vWarpPosition, 3.0)
CLEAR_AREA_OF_PEDS(vWarpPosition, 1.5)
CLEAR_AREA_OF_VEHICLES(vWarpPosition, 3.0)
SET_ENTITY_COORDS(VehicleIndex, vWarpPosition)
SET_ENTITY_HEADING(VehicleIndex, fWarpHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(VehicleIndex)
SET_VEHICLE_FORWARD_SPEED(VehicleIndex, 10.0)
SET_VEHICLE_ENGINE_ON(VehicleIndex, TRUE, TRUE)
iWarpTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_SECURITY_PED_IN_VEHICLE(PED_STRUCT &ped, VEH_STRUCT &vehicle, PED_INDEX TargetPedIndex, VEHICLE_INDEX TargetVehicleIndex)
IF DOES_ENTITY_EXIST(ped.PedIndex)
AND NOT IS_ENTITY_DEAD(ped.PedIndex)
AND NOT IS_ENTITY_DEAD(TargetPedIndex)
AND NOT IS_ENTITY_DEAD(TargetVehicleIndex)
#IF IS_DEBUG_BUILD
IF ( bDrawDebugStates = TRUE )
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
ENDIF
#ENDIF
ped.fDistanceToTarget = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(ped.PedIndex), GET_ENTITY_COORDS(TargetPedIndex))
IF ( bCarSecurityAggressive = FALSE )
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(ped.PedIndex, TargetPedIndex, TRUE)
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(ped.PedIndex, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(ped.PedIndex)
bCarSecurityAggressive = TRUE
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF NOT IS_ENTITY_DEAD(vehicle.VehicleIndex)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vehicle.VehicleIndex, TargetPedIndex, TRUE)
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(vehicle.VehicleIndex, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(vehicle.VehicleIndex)
bCarSecurityAggressive = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH ped.eState
CASE PED_STATE_COMBAT_ON_FOOT
IF ( ped.bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_USE_VEHICLE, FALSE)
TASK_COMBAT_PED(ped.PedIndex, TargetPedIndex)
ped.bHasTask = TRUE
ENDIF
IF IS_PED_DRIVING_VEHICLE(TargetPedIndex, TargetVehicleIndex)
IF ( ped.fDistanceToTarget > 20.0)
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
AND NOT IS_VEHICLE_STUCK_ON_ROOF(vehicle.VehicleIndex)
AND NOT IS_VEHICLE_PERMANENTLY_STUCK(vehicle.VehicleIndex)
IF NOT IS_PED_IN_VEHICLE(ped.PedIndex, vehicle.VehicleIndex)
IF IS_VEHICLE_SEAT_FREE(vehicle.VehicleIndex, VS_DRIVER)
GO_TO_PED_STATE(ped, PED_STATE_ENTERING_VEHICLE)
ENDIF
ELSE
IF ( bCarSecurityAggressive = TRUE )
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_FROM_CAR_SHOOTING)
ELSE
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_FROM_CAR_NO_SHOOTING)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PED_STATE_COMBAT_FROM_CAR_NO_SHOOTING
IF ( ped.bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_LEAVE_VEHICLES, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_USE_VEHICLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_DO_DRIVEBYS, FALSE)
TASK_COMBAT_PED(ped.PedIndex, TargetPedIndex)
ped.iTimer = GET_GAME_TIMER()
ped.bHasTask = TRUE
ENDIF
SET_PED_RESET_FLAG(ped.PedIndex, PRF_BlockWeaponFire, TRUE) //block weapon fire in no shooting state each frame
IF ( bCarSecurityAggressive = TRUE )
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_FROM_CAR_SHOOTING)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
IF IS_PED_SITTING_IN_VEHICLE(ped.PedIndex, vehicle.VehicleIndex)
IF ( ped.fDistanceToTarget < 17.5 )
IF NOT IS_PED_DRIVING_VEHICLE(TargetPedIndex, TargetVehicleIndex)
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
ENDIF
RUN_VEHICLE_WARP_CHECK_BASED_ON_TARGET_VEHICLE(vehicle.VehicleIndex, TargetVehicleIndex,
vehicle.vPosition, vehicle.fHeading,
vehicle.vTargetPosition, vehicle.fTargetHeading,
ped.iTimer, vehicle.vOffset, 3000, 40.0)
ENDIF
IF NOT IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
IF ( vehicle.bImmobilized = TRUE )
GO_TO_PED_STATE(ped, PED_STATE_IMMOBILIZED)
ENDIF
BREAK
CASE PED_STATE_COMBAT_FROM_CAR_SHOOTING
IF ( ped.bHasTask = FALSE )
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_LEAVE_VEHICLES, FALSE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_USE_VEHICLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_DO_DRIVEBYS, TRUE)
TASK_COMBAT_PED(ped.PedIndex, TargetPedIndex)
ped.iTimer = GET_GAME_TIMER()
ped.bHasTask = TRUE
ENDIF
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
IF IS_PED_SITTING_IN_VEHICLE(ped.PedIndex, vehicle.VehicleIndex)
IF ( ped.fDistanceToTarget < 17.5 )
IF NOT IS_PED_DRIVING_VEHICLE(TargetPedIndex, TargetVehicleIndex)
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
ENDIF
ENDIF
RUN_VEHICLE_WARP_CHECK_BASED_ON_TARGET_VEHICLE(vehicle.VehicleIndex, TargetVehicleIndex,
vehicle.vPosition, vehicle.fHeading,
vehicle.vTargetPosition, vehicle.fTargetHeading,
ped.iTimer, vehicle.vOffset, 3000, 40.0)
ENDIF
IF NOT IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
IF ( vehicle.bImmobilized = TRUE )
GO_TO_PED_STATE(ped, PED_STATE_IMMOBILIZED)
ENDIF
BREAK
CASE PED_STATE_ENTERING_VEHICLE
IF ( ped.bHasTask = FALSE )
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_USE_VEHICLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_LEAVE_VEHICLES, FALSE)
TASK_ENTER_VEHICLE(ped.PedIndex, vehicle.VehicleIndex, DEFAULT_TIME_BEFORE_WARP, VS_DRIVER, PEDMOVE_RUN, ECF_JACK_ANYONE)
ENDIF
ENDIF
ped.bHasTask = TRUE
ENDIF
IF DOES_ENTITY_EXIST(vehicle.VehicleIndex)
AND IS_VEHICLE_DRIVEABLE(vehicle.VehicleIndex)
IF IS_PED_IN_VEHICLE(ped.PedIndex, vehicle.VehicleIndex)
IF ( bCarSecurityAggressive = TRUE )
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_FROM_CAR_SHOOTING)
ELSE
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_FROM_CAR_NO_SHOOTING)
ENDIF
ENDIF
ELSE
GO_TO_PED_STATE(ped, PED_STATE_COMBAT_ON_FOOT)
ENDIF
BREAK
CASE PED_STATE_IMMOBILIZED
IF ( ped.bHasTask = FALSE )
SET_VEHICLE_UNDRIVEABLE(vehicle.VehicleIndex, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_ATTRIBUTES(ped.PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_MOVEMENT(ped.PedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ABILITY(ped.PedIndex, CAL_AVERAGE)
SET_PED_COMBAT_RANGE(ped.PedIndex, CR_NEAR)
SET_PED_SHOOT_RATE(ped.PedIndex, 20)
SET_PED_ACCURACY(ped.PedIndex, 20)
TASK_COMBAT_PED(ped.PedIndex, TargetPedIndex)
ped.bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC
PROC MANAGE_SECURITY_PEDS_IN_VEHICLES(INT &iProgress)
IF ( bSecurityInVehiclesAllowed = FALSE )
IF ( bPlayerInsideFilmStudio = FALSE )
bStartSecurityChaseTimerDelay = TRUE
IF ( iSecurityChaseDelayTimer = 0 )
IF ( bStartSecurityChaseTimerDelay = TRUE )
iSecurityChaseDelayTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting security chase delay timer.")
#ENDIF
ENDIF
ELSE
//if the player stops the car outside the film studio, spawn the security cars sooner
IF HAS_TIME_PASSED(PICK_INT(IS_VEHICLE_STOPPED(vsPlayersCar.VehicleIndex), 5000, 10000), iSecurityChaseDelayTimer)
bSecurityInVehiclesAllowed = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Security in vehicles are allowed to spawn due to timer.")
#ENDIF
ENDIF
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(vsPlayersCar.VehicleIndex, << -840.78, -345.37, 35.68 >>, << -806.72, -359.60, 44.10 >>, 32.0)
vsSecurityCars[0].vPosition = << -940.7892, -425.8869, 36.6582 >>
vsSecurityCars[0].fHeading = 299.7635
vsSecurityCars[1].vPosition = << -914.2634, -410.5154, 36.5965 >>
vsSecurityCars[1].fHeading = 295.6050
bSecurityInVehiclesAllowed = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Security in vehicles are allowed to spawn due to player reaching locate 1.")
#ENDIF
ELIF IS_ENTITY_IN_ANGLED_AREA(vsPlayersCar.VehicleIndex, <<-922.50, -462.98, 34.38 >>, << -958.13, -481.30, 44.20 >>, 32.0)
vsSecurityCars[0].vPosition = << -990.2645, -451.9471, 36.5288 >>
vsSecurityCars[0].fHeading = 298.9762
vsSecurityCars[1].vPosition = << -924.7919, -408.3496, 36.5208 >>
vsSecurityCars[1].fHeading = 118.9813
bSecurityInVehiclesAllowed = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Security in vehicles are allowed to spawn due to player reaching locate 2.")
#ENDIF
ELIF IS_ENTITY_IN_ANGLED_AREA(vsPlayersCar.VehicleIndex, << -940.00, -366.51, 35.96 >>, << -1011.40, -402.69, 46.61 >>, 32.0)
vsSecurityCars[0].vPosition = << -1043.2084, -376.0805, 36.8852 >>
vsSecurityCars[0].fHeading = 298.4807
vsSecurityCars[1].vPosition = << -945.8993, -313.9898, 37.9018 >>
vsSecurityCars[1].fHeading = 119.5346
bSecurityInVehiclesAllowed = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Security in vehicles are allowed to spawn due to player reaching locate 3.")
#ENDIF
ELIF IS_ENTITY_IN_ANGLED_AREA(vsPlayersCar.VehicleIndex, << -1043.86, -410.67, 34.58 >>, << -1088.86, -433.64, 51.62 >>, 32.0)
vsSecurityCars[0].vPosition = << -1037.3854, -309.7007, 36.7360 >>
vsSecurityCars[0].fHeading = 188.3013
vsSecurityCars[1].vPosition = << -1169.5857, -422.5981, 33.9917 >>
vsSecurityCars[1].fHeading = 276.9465
bSecurityInVehiclesAllowed = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Security in vehicles are allowed to spawn due to player reaching locate 4.")
#ENDIF
ELIF IS_ENTITY_IN_ANGLED_AREA(vsPlayersCar.VehicleIndex, << -1206.13, -646.00, 20.83 >>, << -1175.31, -618.72, 31.01 >>, 32.0)
vsSecurityCars[0].vPosition = << -1246.7711, -612.4629, 26.1706 >>
vsSecurityCars[0].fHeading = 308.9866
vsSecurityCars[1].vPosition = << -1137.7020, -615.8666, 20.7124 >>
vsSecurityCars[1].fHeading = 126.5517
bSecurityInVehiclesAllowed = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Security in vehicles are allowed to spawn due to player reaching locate 5.")
#ENDIF
ELIF IS_ENTITY_IN_ANGLED_AREA(vsPlayersCar.VehicleIndex, << -1248.37, -625.58, 24.17 >>, << -1263.54, -606.61, 34.16 >>, 32.0)
vsSecurityCars[0].vPosition = << -1273.5568, -554.0495, 29.3703 >>
vsSecurityCars[0].fHeading = 219.1150
vsSecurityCars[1].vPosition = << -1188.8282, -635.2723, 22.7021 >>
vsSecurityCars[1].fHeading = 41.9663
bSecurityInVehiclesAllowed = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Security in vehicles are allowed to spawn due to player reaching locate 6.")
#ENDIF
ELIF IS_ENTITY_IN_ANGLED_AREA(vsPlayersCar.VehicleIndex, << -1291.04, -558.91, 28.71 >>, << -1254.28, -527.38, 38.07 >>, 32.0)
vsSecurityCars[0].vPosition = << -1255.1533, -618.7726, 26.1000 >>
vsSecurityCars[0].fHeading = 303.7104
vsSecurityCars[1].vPosition = << -1263.9615, -464.1984, 32.5328 >>
vsSecurityCars[1].fHeading = 141.2234
bSecurityInVehiclesAllowed = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Security in vehicles are allowed to spawn due to player reaching locate 7.")
#ENDIF
ENDIF
ENDIF
ENDIF
SWITCH iProgress
CASE 0 //request models
REQUEST_MODEL(mnSecurityCar)
REQUEST_MODEL(mnSecurityPed)
IF HAS_MODEL_LOADED(mnSecurityCar)
AND HAS_MODEL_LOADED(mnSecurityPed)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Models ", GET_MODEL_NAME_FOR_DEBUG(mnSecurityCar), " and ", GET_MODEL_NAME_FOR_DEBUG(mnSecurityPed), " are loaded.")
#ENDIF
vsSecurityCars[0].vPosition = << 0.0, 0.0, 0.0 >>
vsSecurityCars[0].fHeading = 0.0
vsSecurityCars[0].vOffset = << -2.15, -3.0, 0.0 >>
vsSecurityCars[0].ModelName = mnSecurityCar
vsSecurityCars[1].vPosition = << 0.0, 0.0, 0.0 >>
vsSecurityCars[1].fHeading = 0.0
vsSecurityCars[1].vOffset = << 2.15, 3.0, 0.0 >>
vsSecurityCars[1].ModelName = mnSecurityCar
iProgress++
ENDIF
BREAK
CASE 1
IF ( bSecurityInVehiclesAllowed = TRUE )
IF IS_VECTOR_ZERO(vsSecurityCars[0].vPosition)
OR IS_VECTOR_ZERO(vsSecurityCars[1].vPosition)
VECTOR vPlayerPosition
VECTOR vClosestNodeToPlayer
vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF GET_CLOSEST_VEHICLE_NODE(vPlayerPosition, vClosestNodeToPlayer, NF_NONE)
IF ( GET_DISTANCE_BETWEEN_COORDS(vPlayerPosition, vClosestNodeToPlayer) < 7.0 )
IF CAN_GET_CLOSEST_NTH_VEHICLE_NODE_TO_ENTITY_BETWEEN_ANGLES(PLAYER_PED_ID(), vClosestRoadNode, fClosestRoadNodeHeading, 20,
PICK_FLOAT(IS_VEHICLE_STOPPED(vsPlayersCar.VehicleIndex), 0.0, 120.0),
PICK_FLOAT(IS_VEHICLE_STOPPED(vsPlayersCar.VehicleIndex), 180.0, 180.0))
IF NOT IS_SPHERE_VISIBLE(vClosestRoadNode, 3.0)
INT i
FLOAT fHeadingDifference
FLOAT fPlayerHeading
FLOAT fSpawnHeading
fPlayerHeading = GET_ENTITY_HEADING(PLAYER_PED_ID())
fHeadingDifference = ABSF(fPlayerHeading - fClosestRoadNodeHeading)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), " fPlayerHeading: ", fPlayerHeading,
" fClosestRoadNodeHeading: ", fClosestRoadNodeHeading,
" fHeadingDifference: ", fHeadingDifference, ".")
#ENDIF
IF ( fHeadingDifference > 180.0 )
fHeadingDifference = ABSF(fHeadingDifference - 360.0)
ENDIF
IF ( fHeadingDifference < 90.0 )
fSpawnHeading = fClosestRoadNodeHeading
ELSE
fSpawnHeading = fClosestRoadNodeHeading + 180
ENDIF
FOR i = 0 TO ( COUNT_OF(vsSecurityCars) - 1 )
vsSecurityCars[i].vPosition = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vClosestRoadNode, fClosestRoadNodeHeading, vsSecurityCars[i].vOffset)
vsSecurityCars[i].fHeading = fSpawnHeading
vsSecurityCars[i].bLineOfSightToTarget = FALSE
CLEAR_AREA_OF_VEHICLES(vsSecurityCars[i].vPosition, 3.0)
ENDFOR
iProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
iProgress++
ENDIF
ENDIF
BREAK
CASE 2 //create security cars
REQUEST_MODEL(mnSecurityCar)
REQUEST_MODEL(mnSecurityPed)
IF HAS_MODEL_LOADED(mnSecurityCar)
AND HAS_MODEL_LOADED(mnSecurityPed)
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsSecurityCars[0], FALSE, FALSE, NO_CHARACTER, FALSE, -1, 0, 0, 0, 0 #IF IS_DEBUG_BUILD, "Car 0" #ENDIF)
AND HAS_MISSION_VEHICLE_BEEN_CREATED(vsSecurityCars[1], FALSE, FALSE, NO_CHARACTER, FALSE, -1, 0, 0, 0, 0 #IF IS_DEBUG_BUILD, "Car 1" #ENDIF)
INT i
REPEAT 2 i
psCarSecurity[i].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(vsSecurityCars[i].VehicleIndex, mnSecurityPed,
RELGROUPHASH_SECURITY_GUARD, VS_DRIVER, 200, WEAPONTYPE_PISTOL
#IF IS_DEBUG_BUILD, GET_STRING_FROM_INT(i) #ENDIF)
SET_VEHICLE_ENGINE_ON(vsSecurityCars[i].VehicleIndex, TRUE, TRUE)
SET_VEHICLE_FORWARD_SPEED(vsSecurityCars[i].VehicleIndex, 20.0)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(vsSecurityCars[i].VehicleIndex, TRUE)
ADD_VEHICLE_UPSIDEDOWN_CHECK(vsSecurityCars[i].VehicleIndex)
ADD_VEHICLE_STUCK_CHECK_WITH_WARP(vsSecurityCars[i].VehicleIndex, 10, 1000, FALSE, FALSE, FALSE, -1)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vsSecurityCars[i].VehicleIndex, "CAR_3_SEC_CARS")
STORE_ENTITY_POSITION_AND_HEADING(vsPlayersCar.VehicleIndex, vsSecurityCars[i].vTargetPosition, vsSecurityCars[i].fTargetHeading)
vsSecurityCars[i].bImmobilized = FALSE
psCarSecurity[i].bHasTask = FALSE
psCarSecurity[i].eState = PED_STATE_COMBAT_FROM_CAR_NO_SHOOTING
ENDREPEAT
SET_MODEL_AS_NO_LONGER_NEEDED(mnSecurityCar)
SET_MODEL_AS_NO_LONGER_NEEDED(mnSecurityPed)
bChaseInProgress = TRUE
bChaseStarted = TRUE
bChaseFinished = FALSE
#IF IS_DEBUG_BUILD
psCarSecurity[0].sDebugName = "CarSecurity 0"
psCarSecurity[1].sDebugName = "CarSecurity 1"
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Security chase started.")
#ENDIF
iProgress++
ENDIF
ENDIF
BREAK
CASE 3 //keep updating the security peds in security vehicles
INT i
REPEAT 2 i
UPDATE_BLIPS_FOR_PED_AND_VEHCILE(psCarSecurity[i], vsSecurityCars[i])
CLEANUP_PED_AND_VEHICLE(psCarSecurity[i], vsSecurityCars[i], 320.0, 150.0)
MANAGE_SECURITY_PED_IN_VEHICLE(psCarSecurity[i], vsSecurityCars[i], PLAYER_PED_ID(), vsPlayersCar.VehicleIndex)
ENDREPEAT
IF ( vsSecurityCars[0].bLineOfSightToTarget = FALSE AND vsSecurityCars[1].bLineOfSightToTarget = FALSE ) //check enemy cars line of sight
vsSecurityCars[0].bLineOfSightToTarget = HAS_ENTITY_CLEAR_LOS_TO_ENTITY(vsSecurityCars[0].VehicleIndex, vsPlayersCar.VehicleIndex)
vsSecurityCars[1].bLineOfSightToTarget = HAS_ENTITY_CLEAR_LOS_TO_ENTITY(vsSecurityCars[1].VehicleIndex, vsPlayersCar.VehicleIndex)
ENDIF
IF NOT DOES_ENTITY_EXIST(psCarSecurity[0].PedIndex)
AND NOT DOES_ENTITY_EXIST(psCarSecurity[1].PedIndex)
AND NOT DOES_ENTITY_EXIST(vsSecurityCars[0].VehicleIndex)
AND NOT DOES_ENTITY_EXIST(vsSecurityCars[1].VehicleIndex)
bChaseFinished = TRUE
bChaseInProgress = FALSE
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CAR4_HCARS")
CLEAR_HELP()
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsPlayersCar.VehicleIndex)
SET_VEHICLE_STRONG(vsPlayersCar.VehicleIndex, FALSE)
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Security chase finished.")
#ENDIF
iProgress++
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_ACTOR_DURING_ESCAPE_FILM_SET()
SWITCH psActor.iProgress
CASE 0
IF NOT IS_BIT_SET(g_iCarSteal3AgentBitSet, ACTOR_KILLED)
AND NOT IS_BIT_SET(g_iCarSteal3AgentBitSet, ACTOR_IGNORED)
psActor.iProgress++
ELSE
IF IS_BIT_SET(g_iCarSteal3AgentBitSet, ACTOR_KILLED)
AND IS_BIT_SET(g_iCarSteal3AgentBitSet, PLAYER_GOT_TUXEDO)
psActor.iProgress = 10
ENDIF
ENDIF
BREAK
CASE 1
psActor.vPosition = << -1105.23, -491.20, 34.83 >> //coords inside a building
psActor.fHeading = 206.1382 //this is fine as ped has to be hidden
psActor.ModelName = U_M_M_SPYACTOR //ped will play animation afterwards
psActor.iProgress++
BREAK
CASE 2
IF HAS_MISSION_PED_BEEN_CREATED(psActor, FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE)
IF NOT IS_PED_INJURED(psActor.PedIndex)
IF IS_BIT_SET(g_iCarSteal3AgentBitSet, PLAYER_GOT_TUXEDO)
SET_PED_COMPONENT_VARIATION(psActor.PedIndex, PED_COMP_LEG, 1, 0, 0)
SET_PED_COMPONENT_VARIATION(psActor.PedIndex, PED_COMP_TORSO, 1, 0, 0)
ELSE
SET_PED_COMPONENT_VARIATION(psActor.PedIndex, PED_COMP_LEG, 0, 0, 0)
SET_PED_COMPONENT_VARIATION(psActor.PedIndex, PED_COMP_TORSO, 0, 0, 0)
ENDIF
ENDIF
REQUEST_ANIM_DICT("misscarsteal4@actor")
#IF IS_DEBUG_BUILD
psActor.sDebugName = "Actor"
#ENDIF
psActor.eCleanupReason = PED_CLEANUP_NO_CLEANUP //reset actor ped cleanup reason
psActor.iCleanupAttempts = 0
psActor.iProgress++
ENDIF
BREAK
CASE 3
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-1177.465454,-508.063934,36.566887>>, <<28.0, 16.0, 8.0 >>)
IF DOES_ENTITY_EXIST(osTrailerDoor.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osTrailerDoor.ObjectIndex)
SET_ENTITY_ROTATION(osTrailerDoor.ObjectIndex, osTrailerDoor.vRotation)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(psActor.PedIndex)
SET_ENTITY_HEALTH(psActor.PedIndex, 101)
SEQUENCE_INDEX SequenceIndex
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_PLAY_ANIM_ADVANCED(NULL, "misscarsteal4@actor", "stumble", << -1111.76, -505.90, 35.035 >>, << 0.0, 0.0, -164.0 >>,
INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1,
AF_EXIT_AFTER_INTERRUPTED | AF_EXTRACT_INITIAL_OFFSET, 0.1)
TASK_PLAY_ANIM(NULL, "misscarsteal4@actor", "dazed_idle", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1,
AF_LOOPING | AF_EXIT_AFTER_INTERRUPTED | AF_EXTRACT_INITIAL_OFFSET)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(psActor.PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
ENDIF
psActor.iTimer = 0
psActor.iProgress++
ENDIF
BREAK
CASE 4
IF DOES_ENTITY_EXIST(psActor.PedIndex)
psActor.fDistanceToTarget = GET_DISTANCE_BETWEEN_ENTITIES(psActor.PedIndex, PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(psActor.PedIndex)
IF IS_PED_SITTING_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsPlayersCar.VehicleIndex)
IF NOT HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(psActor.PedIndex, vsPlayersCar.VehicleIndex, FALSE)
IF IS_ENTITY_TOUCHING_ENTITY(vsPlayersCar.VehicleIndex, psActor.PedIndex)
IF ( psActor.iTimer = 0 )
psActor.iTimer = GET_GAME_TIMER()
ELSE
IF HAS_TIME_PASSED(300, psActor.iTimer)
SET_PED_TO_RAGDOLL(psActor.PedIndex, 10000, 20000, TASK_RELAX)
APPLY_DAMAGE_TO_PED(psActor.PedIndex, 10, TRUE)
psActor.eCleanupReason = PED_CLEANUP_KILLED_BY_SCRIPT
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", psActor.sDebugName, " cleaned up with reason PED_CLEANUP_KILLED_BY_SCRIPT.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(psActor.PedIndex, PLAYER_PED_ID(), FALSE)
IF IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), psActor.PedIndex)
IF NOT IS_PED_PERFORMING_STEALTH_KILL(PLAYER_PED_ID())
SET_PED_TO_RAGDOLL(psActor.PedIndex, 10000, 20000, TASK_RELAX)
APPLY_DAMAGE_TO_PED(psActor.PedIndex, 10, TRUE)
psActor.eCleanupReason = PED_CLEANUP_KILLED_BY_SCRIPT
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", psActor.sDebugName, " cleaned up with reason PED_CLEANUP_KILLED_BY_SCRIPT.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE //actor ped is dead
IF ( psActor.eCleanupReason = PED_CLEANUP_NO_CLEANUP ) //ped has no cleanup reason
psActor.eCleanupReason = GET_PED_CLEANUP_REASON(psActor) //call this until cleanup reason is returned
IF ( psActor.eCleanupReason = PED_CLEANUP_KILLED_BY_PLAYER_VEHICLE )
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(CS3_RAN_OVER_ACTOR_AGAIN)
REPLAY_RECORD_BACK_FOR_TIME(3, 0.0, REPLAY_IMPORTANCE_HIGH)
ENDIF
ENDIF
ENDIF
IF ( psActor.fDistanceToTarget > 200.0 )
IF ( bPlayerInsideFilmStudio = FALSE)
REMOVE_ANIM_DICT("misscarsteal4@actor")
SET_PED_AS_NO_LONGER_NEEDED(psActor.PedIndex)
ENDIF
ENDIF
ENDIF
BREAK
CASE 10
IF IS_BIT_SET(g_iCarSteal3AgentBitSet, ACTOR_KILLED)
AND IS_BIT_SET(g_iCarSteal3AgentBitSet, PLAYER_GOT_TUXEDO)
IF HAS_MISSION_PED_BEEN_CREATED(psActor, FALSE, rgFilmCrew, FALSE, NO_CHARACTER, FALSE, TRUE)
IF NOT IS_PED_INJURED(psActor.PedIndex)
IF IS_BIT_SET(g_iCarSteal3AgentBitSet, PLAYER_GOT_TUXEDO)
SET_PED_COMPONENT_VARIATION(psActor.PedIndex, PED_COMP_LEG, 1, 0, 0)
SET_PED_COMPONENT_VARIATION(psActor.PedIndex, PED_COMP_TORSO, 1, 0, 0)
ELSE
SET_PED_COMPONENT_VARIATION(psActor.PedIndex, PED_COMP_LEG, 0, 0, 0)
SET_PED_COMPONENT_VARIATION(psActor.PedIndex, PED_COMP_TORSO, 0, 0, 0)
ENDIF
IF DOES_ENTITY_EXIST(osTrailerDoor.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osTrailerDoor.ObjectIndex)
SET_ENTITY_ROTATION(osTrailerDoor.ObjectIndex, << 0.0, 0.0, 27 >>)
ENDIF
ENDIF
REMOVE_ANIM_DICT("misscarsteal4@actor")
iDeadActorProgress = 0
psActor.iProgress = 11
ENDIF
ENDIF
ENDIF
BREAK
CASE 11
IF DOES_ENTITY_EXIST(psActor.PedIndex)
psActor.fDistanceToTarget = GET_DISTANCE_BETWEEN_ENTITIES(psActor.PedIndex, PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(psActor.PedIndex)
SWITCH iDeadActorProgress
CASE 0
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iDeadActorSceneID)
REQUEST_ANIM_DICT("dead")
IF HAS_ANIM_DICT_LOADED("dead")
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iDeadActorSceneID)
iDeadActorSceneID = CREATE_SYNCHRONIZED_SCENE(<< -1114.511, -501.777, 35.810 >>, << -0.000, 0.000, 69.480 >>)
TASK_SYNCHRONIZED_SCENE(psActor.PedIndex, iDeadActorSceneID, "dead", "dead_d", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, RBF_BULLET_IMPACT | RBF_PLAYER_IMPACT | RBF_MELEE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psActor.PedIndex)
STOP_PED_SPEAKING(psActor.PedIndex, TRUE)
SET_ENTITY_INVINCIBLE(psActor.PedIndex, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psActor.PedIndex, TRUE)
ENDIF
ENDIF
ELSE
SET_RAGDOLL_BLOCKING_FLAGS(psActor.PedIndex, RBF_FIRE)
SET_RAGDOLL_BLOCKING_FLAGS(psActor.PedIndex, RBF_MELEE)
SET_RAGDOLL_BLOCKING_FLAGS(psActor.PedIndex, RBF_EXPLOSION)
SET_RAGDOLL_BLOCKING_FLAGS(psActor.PedIndex, RBF_PLAYER_BUMP)
SET_RAGDOLL_BLOCKING_FLAGS(psActor.PedIndex, RBF_BULLET_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(psActor.PedIndex, RBF_PLAYER_IMPACT)
SET_RAGDOLL_BLOCKING_FLAGS(psActor.PedIndex, RBF_IMPACT_OBJECT)
iDeadActorProgress++
ENDIF
BREAK
CASE 1
IF ( psActor.fDistanceToTarget > 200.0 )
IF ( bPlayerInsideFilmStudio = FALSE)
REMOVE_ANIM_DICT("dead")
REMOVE_ANIM_DICT("misscarsteal4@actor")
SET_PED_AS_NO_LONGER_NEEDED(psActor.PedIndex)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC SETUP_LABELS_FOR_END_PHONE_CALL()
IF ( iPlayerLethalKills > 0 ) //decide if clean or messy end call should be triggered
bEndCallMessy = TRUE
ELSE
bEndCallMessy = FALSE
ENDIF
IF ( bEndCallMessy = FALSE ) //if end call clean should be triggered
EndCallCleanRoots[0] = "CST4_ECALLC" //build the start of end call clean
EndCallCleanLines[0] = "CST4_ECALLC_1"
EndCallCleanRoots[1] = "CST4_ECALLC"
EndCallCleanLines[1] = "CST4_ECALLC_2"
EndCallCleanRoots[2] = "CST4_ECALLC"
EndCallCleanLines[2] = "CST4_ECALLC_3"
EndCallCleanRoots[3] = "CST4_ECALLC"
EndCallCleanLines[3] = "CST4_ECALLC_4"
EndCallCleanRoots[4] = "CST4_ECALLC"
EndCallCleanLines[4] = "CST4_ECALLC_5"
EndCallCleanRoots[5] = "CST4_ECALLC"
EndCallCleanLines[5] = "CST4_ECALLC_6"
IF ( bActressEjected = FALSE ) //build the dynamic part of the end call clean
IF ( CarGadgetData.iTimesSpikesDropped > 0 )
EndCallCleanRoots[6] = "CST4_ECALL1"
EndCallCleanLines[6] = "CST4_ECALL1_1"
ELSE
EndCallCleanRoots[6] = "CST4_ECALL3"
EndCallCleanLines[6] = "CST4_ECALL3_1"
ENDIF
ELSE
IF ( CarGadgetData.iTimesSpikesDropped > 0 )
EndCallCleanRoots[6] = "CST4_ECALL2"
EndCallCleanLines[6] = "CST4_ECALL2_1"
ELSE
EndCallCleanRoots[6] = "CST4_ECALL4"
EndCallCleanLines[6] = "CST4_ECALL4_1"
ENDIF
ENDIF
EndCallCleanRoots[7] = "CST4_ECALLE" //build the end of the end call clean
EndCallCleanLines[7] = "CST4_ECALLE_1"
EndCallCleanRoots[8] = "CST4_ECALLE"
EndCallCleanLines[8] = "CST4_ECALLE_2"
ELSE //if end call messy should be triggered
EndCallMessyRoots[0] = "CST4_ECALLM" //build the start of end call messy
EndCallMessyLines[0] = "CST4_ECALLM_1"
EndCallMessyRoots[1] = "CST4_ECALLM"
EndCallMessyLines[1] = "CST4_ECALLM_2"
EndCallMessyRoots[2] = "CST4_ECALLM"
EndCallMessyLines[2] = "CST4_ECALLM_3"
EndCallMessyRoots[3] = "CST4_ECALLM"
EndCallMessyLines[3] = "CST4_ECALLM_4"
EndCallMessyRoots[4] = "CST4_ECALLM"
EndCallMessyLines[4] = "CST4_ECALLM_5"
EndCallMessyRoots[5] = "CST4_ECALLM"
EndCallMessyLines[5] = "CST4_ECALLM_6"
EndCallMessyRoots[6] = "CST4_ECALLM"
EndCallMessyLines[6] = "CST4_ECALLM_7"
EndCallMessyRoots[7] = "CST4_ECALLM"
EndCallMessyLines[7] = "CST4_ECALLM_8"
EndCallMessyRoots[8] = "CST4_ECALLM"
EndCallMessyLines[8] = "CST4_ECALLM_9"
IF ( bActressEjected = FALSE ) //build the dynamic part of the end call messy
IF ( CarGadgetData.iTimesSpikesDropped > 0 )
EndCallMessyRoots[9] = "CST4_ECALL1"
EndCallMessyLines[9] = "CST4_ECALL1_1"
ELSE
EndCallMessyRoots[9] = "CST4_ECALL3"
EndCallMessyLines[9] = "CST4_ECALL3_1"
ENDIF
ELSE
IF ( CarGadgetData.iTimesSpikesDropped > 0 )
EndCallMessyRoots[9] = "CST4_ECALL2"
EndCallMessyLines[9] = "CST4_ECALL2_1"
ELSE
EndCallMessyRoots[9] = "CST4_ECALL4"
EndCallMessyLines[9] = "CST4_ECALL4_1"
ENDIF
ENDIF
EndCallMessyRoots[10] = "CST4_ECALLE" //build the end of the end call messy
EndCallMessyLines[10] = "CST4_ECALLE_1"
EndCallMessyRoots[11] = "CST4_ECALLE"
EndCallMessyLines[11] = "CST4_ECALLE_2"
ENDIF
ENDPROC
PROC MANAGE_CONVERSATIONS_DURING_ESCAPE_FILM_SET()
IF DOES_ENTITY_EXIST(psActress.PedIndex) //play actress's fleeing conversations
IF NOT IS_ENTITY_DEAD(psActress.PedIndex)
IF NOT IS_PED_IN_ANY_VEHICLE(psActress.PedIndex) //play conversation for actress out of the car
AND NOT IS_PED_FALLING(psActress.PedIndex)
AND NOT IS_PED_RAGDOLL(psActress.PedIndex)
AND HAS_SOUND_FINISHED(iEjectorScreamSoundID)
AND NOT IS_ENTITY_PLAYING_ANIM(psActress.PedIndex, "misscarsteal4@actress", "eject_girl")
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() //kill any ongoing conversations with Franklin
TEXT_LABEL_23 CurrentRoot
CurrentRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentRoot)
IF ARE_STRINGS_EQUAL(CurrentRoot, "CST4_ACHAT1")
OR ARE_STRINGS_EQUAL(CurrentRoot, "CST4_ACHAT2")
OR ARE_STRINGS_EQUAL(CurrentRoot, "CST4_ACHAT3")
OR ARE_STRINGS_EQUAL(CurrentRoot, "CST4_ACHAT4")
OR ARE_STRINGS_EQUAL(CurrentRoot, "CST4_ANNOY1")
OR ARE_STRINGS_EQUAL(CurrentRoot, "CST4_ANNOY2")
OR ARE_STRINGS_EQUAL(CurrentRoot, "CST4_ANNOY3")
OR ARE_STRINGS_EQUAL(CurrentRoot, "CST4_ANNOY4")
OR ARE_STRINGS_EQUAL(CurrentRoot, "CST4_ANNOY5")
OR ARE_STRINGS_EQUAL(CurrentRoot, "CST4_ANNOY6")
OR ARE_STRINGS_EQUAL(CurrentRoot, "CST4_ANNOY7")
OR ARE_STRINGS_EQUAL(CurrentRoot, "CST4_ANNOY8")
OR ARE_STRINGS_EQUAL(CurrentRoot, "CST4_ANNOY9")
OR ARE_STRINGS_EQUAL(CurrentRoot, "CST4_ANNOY10")
OR ARE_STRINGS_EQUAL(CurrentRoot, "CST4_AWARN")
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_AFLEE1") //play conversation for actress getting out of the car
IF ( psActress.fDistanceToTarget < 35.0 )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_AFLEE1", CONV_PRIORITY_MEDIUM)
psActress.iConversationCounter = 0 //reset conversation counter
psActress.iConversationTimer = GET_GAME_TIMER() //reset conversation timer
SET_LABEL_AS_TRIGGERED("CST4_AFLEE1", TRUE)
ENDIF
ELSE
IF NOT IS_AMBIENT_SPEECH_PLAYING(psActress.PedIndex) //maybe play conversation with no subs instead?
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(psActress.PedIndex, "CST4_CDAA", "CST4ACTRESS", SPEECH_PARAMS_FORCE_NORMAL)
psActress.iConversationCounter = 0 //reset conversation counter
psActress.iConversationTimer = GET_GAME_TIMER() //reset conversation timer
SET_LABEL_AS_TRIGGERED("CST4_AFLEE1", TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing ped ambient speech CST4_AFLEE1.")
#ENDIF
ENDIF
ENDIF
ENDIF
ELSE
SET_LABEL_AS_TRIGGERED("CST4_AFLEE1", TRUE)
ENDIF
ELSE
IF IS_PED_FLEEING(psActress.PedIndex)
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_AFLEE2") //play conversation for actrees fleeing on foot
IF HAS_TIME_PASSED(15000, psActress.iConversationTimer)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF ( psActress.fDistanceToTarget < 30.0 )
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_AFLEE2", CONV_PRIORITY_MEDIUM)
psActress.iConversationCounter++ //increment conversation counter
psActress.iConversationTimer = GET_GAME_TIMER() //reset conversation timer
IF ( psActress.iConversationCounter = 6 )
SET_LABEL_AS_TRIGGERED("CST4_AFLEE2", TRUE)
ENDIF
ENDIF
ELSE
IF NOT IS_AMBIENT_SPEECH_PLAYING(psActress.PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(psActress.PedIndex, "CST4_DGAA", "CST4ACTRESS", SPEECH_PARAMS_FORCE)
psActress.iConversationCounter++ //increment conversation counter
psActress.iConversationTimer = GET_GAME_TIMER() //reset conversation timer
IF ( psActress.iConversationCounter = 6 )
SET_LABEL_AS_TRIGGERED("CST4_AFLEE2", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psActress.PedIndex) //Franklin and actress are in the same car
IF NOT IS_PED_INJURED(psActress.PedIndex) //play actress screams when bullets are near her
IF NOT IS_AMBIENT_SPEECH_PLAYING(psActress.PedIndex)
AND NOT IS_SCRIPTED_SPEECH_PLAYING(psActress.PedIndex)
IF IS_BULLET_IN_AREA(GET_ENTITY_COORDS(psActress.PedIndex), 3.0, TRUE)
OR IS_BULLET_IN_AREA(GET_ENTITY_COORDS(psActress.PedIndex), 3.0, FALSE)
PLAY_PAIN(psActress.PedIndex, AUD_DAMAGE_REASON_SCREAM_SCARED)
ENDIF
ENDIF
ENDIF
IF ( bPlayerInsideFilmStudio = FALSE ) //and they have left the studio
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_AKDNP") //play conversation for actress asking if this is a kidnapping
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(CST4Conversation, "CST4AUD", "CST4_AKDNP", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_AKDNP", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_APULL") //play conversation for actress trying to pull the car over
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(CST4Conversation, "CST4AUD", "CST4_APULL", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_APULL", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bChaseFinished = TRUE )
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_BUTTON1")
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psActress.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 ( bSteerBiasActive = FALSE )
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_BUTTON1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_BUTTON1", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_ENDCALL")
IF IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsPlayersCar.VehicleIndex)
IF NOT IS_PED_IN_THIS_VEHICLE(psActress.PedIndex, vsPlayersCar.VehicleIndex)
IF ( bPlayerInsideFilmStudio = FALSE )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF ( iPhoneCallToDevinDelayTimer = 0 )
iPhoneCallToDevinDelayTimer = GET_GAME_TIMER()
ELSE
IF HAS_TIME_PASSED(2000, iPhoneCallToDevinDelayTimer)
SETUP_LABELS_FOR_END_PHONE_CALL()
IF ( bEndCallMessy = FALSE ) //trigger clean version of end call
IF PLAYER_CALL_CHAR_CELLPHONE_MULTIPART_WITH_N_LINES(9, CST4Conversation, CHAR_MOLLY, "CST4AUD",
EndCallCleanRoots, EndCallCleanLines,
CONV_PRIORITY_HIGH)
SET_LABEL_AS_TRIGGERED("CST4_ENDCALL", TRUE)
ENDIF
ELSE //trigger messy version of end call
IF PLAYER_CALL_CHAR_CELLPHONE_MULTIPART_WITH_N_LINES(12, CST4Conversation, CHAR_MOLLY, "CST4AUD",
EndCallMessyRoots, EndCallMessyLines,
CONV_PRIORITY_HIGH)
SET_LABEL_AS_TRIGGERED("CST4_ENDCALL", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// ELSE
// IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// bEndPhoneCallFinished = TRUE
// ENDIF
ENDIF
ENDIF
IF ( bChaseStarted = TRUE )
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_ASSC") //play conversation for spotting security
AND NOT HAS_LABEL_BEEN_TRIGGERED("CST4_FSSC")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT IS_VEHICLE_SEAT_FREE(vsPlayersCar.VehicleIndex, VS_FRONT_RIGHT) //actress is sitting in the car
IF DOES_ENTITY_EXIST(psActress.PedIndex)
IF NOT IS_ENTITY_DEAD(psActress.PedIndex)
IF IS_PED_SITTING_IN_VEHICLE(psActress.PedIndex, vsPlayersCar.VehicleIndex)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_ASSC", CONV_PRIORITY_MEDIUM)
psActress.iConversationTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("CST4_ASSC", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE //actress is not sitting in the car
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_FSSC", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_FSSC", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE //conversation for security being spotted has been triggered
IF HAS_LABEL_BEEN_TRIGGERED("CAR4_LSEC") //lose the security objective has been printed
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_ASSCF") //play conversation for Franklin responding to
IF HAS_LABEL_BEEN_TRIGGERED("CST4_ASSC") //actress's conversation for spotting the security cars arrive
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_SCRIPTED_CONVERSATION_ONGOING()
AND NOT IS_AMBIENT_SPEECH_PLAYING(PLAYER_PED_ID())
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), "CST4_DDAA", "FRANKLIN", SPEECH_PARAMS_FORCE)
SET_LABEL_AS_TRIGGERED("CST4_ASSCF", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_PED_SITTING_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsPlayersCar.VehicleIndex) //play spikes related conversations
IF ( bSpikesAllowed = FALSE )
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_FSPB")
IF ( bSpikesUnlocked = TRUE )
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(CST4Conversation, "CST4AUD", "CST4_FSPB", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_FSPB", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_FSPDS")
IF ( iSuccessfullSpikesHits <> iSecurityCarsImmobilized )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_FSPDS", CONV_PRIORITY_MEDIUM)
iSuccessfullSpikesHits = iSecurityCarsImmobilized
IF ( iSecurityCarsImmobilized = 2 )
SET_LABEL_AS_TRIGGERED("CST4_FSPDS", TRUE)
ENDIF
ENDIF
ELSE
INTERRUPT_CONVERSATION(PLAYER_PED_ID(), "CST4_CFAA", "FRANKLIN")
iSuccessfullSpikesHits = iSecurityCarsImmobilized
IF ( iSecurityCarsImmobilized = 2 )
SET_LABEL_AS_TRIGGERED("CST4_FSPDS", TRUE)
ENDIF
//IF NOT IS_THIS_CONVERSATION_PLAYING("CST4_FSPDS")
// KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
//ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psActress.PedIndex)
IF ( bEjectorSeatActive = FALSE )
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_SHOOT") //play conversation for actress reacting to player shooting from car
IF HAS_TIME_PASSED(10000, psActress.iConversationTimer)
IF IS_PED_SHOOTING(PLAYER_PED_ID())
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_SHOOT", CONV_PRIORITY_MEDIUM)
iActressShootConversationCounter++
psActress.iConversationTimer = GET_GAME_TIMER()
IF ( iActressShootConversationCounter = 4 )
SET_LABEL_AS_TRIGGERED("CST4_SHOOT", TRUE)
ENDIF
ENDIF
ELSE
IF NOT IS_AMBIENT_SPEECH_PLAYING(psActress.PedIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(psActress.PedIndex, "CST4_DCAA", "CST4ACTRESS", SPEECH_PARAMS_FORCE)
iActressShootConversationCounter++
psActress.iConversationTimer = GET_GAME_TIMER()
IF ( iActressShootConversationCounter = 4 )
SET_LABEL_AS_TRIGGERED("CST4_SHOOT", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_ACHAT1")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_ACHAT1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_ACHAT1", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_ACHAT2")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_ACHAT2", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_ACHAT2", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_ACHAT3")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_ACHAT3", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_ACHAT3", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_ACHAT4")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_ACHAT4", CONV_PRIORITY_MEDIUM)
psActress.iConversationTimer = GET_GAME_TIMER()
bRandomConversationsAllowed = TRUE
SET_LABEL_AS_TRIGGERED("CST4_ACHAT4", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bRandomConversationsAllowed = TRUE )
IF ( bEjectorSeatActive = FALSE )
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF HAS_TIME_PASSED(12500, psActress.iConversationTimer)
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_SECSHT")
PED_INDEX ClosestPedIndex
ClosestPedIndex = GET_PED_CLOSEST_PED_FROM_RELATIONSHIP_GROUP(psActress.PedIndex, RELGROUPHASH_SECURITY_GUARD)
IF DOES_ENTITY_EXIST(ClosestPedIndex)
IF NOT IS_ENTITY_DEAD(ClosestPedIndex)
IF GET_DISTANCE_BETWEEN_PEDS(psActress.PedIndex, ClosestPedIndex) < 10.0
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_SECSHT", CONV_PRIORITY_MEDIUM)
iActressSecurityConversationCounter++
psActress.iConversationTimer = GET_GAME_TIMER()
IF ( iActressSecurityConversationCounter = 5 )
SET_LABEL_AS_TRIGGERED("CST4_SECSHT", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
SWITCH GET_RANDOM_INT_IN_RANGE(0, 3)
CASE 0
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_STOP", CONV_PRIORITY_MEDIUM)
psActress.iConversationTimer = GET_GAME_TIMER()
ENDIF
BREAK
CASE 1
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_SCREAM", CONV_PRIORITY_MEDIUM)
psActress.iConversationTimer = GET_GAME_TIMER()
ENDIF
BREAK
CASE 2
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_ASTOP", CONV_PRIORITY_MEDIUM)
psActress.iConversationTimer = GET_GAME_TIMER()
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_ANNOY1")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_ANNOY1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_ANNOY1", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_ANNOY2")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_ANNOY2", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("CST4_ANNOY2", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_ANNOY3")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_ANNOY3", CONV_PRIORITY_MEDIUM)
psActress.iConversationTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("CST4_ANNOY3", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_ANNOY4")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_ANNOY4", CONV_PRIORITY_MEDIUM)
psActress.iConversationTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("CST4_ANNOY4", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_ANNOY5")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_ANNOY5", CONV_PRIORITY_MEDIUM)
psActress.iConversationTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("CST4_ANNOY5", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_ANNOY6")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_ANNOY6", CONV_PRIORITY_MEDIUM)
psActress.iConversationTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("CST4_ANNOY6", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_ANNOY7")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_ANNOY7", CONV_PRIORITY_MEDIUM)
psActress.iConversationTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("CST4_ANNOY7", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_ANNOY8")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_ANNOY8", CONV_PRIORITY_MEDIUM)
psActress.iConversationTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("CST4_ANNOY8", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_ANNOY9")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_ANNOY9", CONV_PRIORITY_MEDIUM)
psActress.iConversationTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("CST4_ANNOY9", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_ANNOY10")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_ANNOY10", CONV_PRIORITY_MEDIUM)
psActress.iConversationTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("CST4_ANNOY10", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_AWARN")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_AWARN", CONV_PRIORITY_MEDIUM)
psActress.iConversationTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("CST4_AWARN", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE //chase not started
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_AMSNO") //play conversation for actress seeing the dazed actor
AND NOT HAS_LABEL_BEEN_TRIGGERED("CST4_AMSRO")
IF DOES_ENTITY_EXIST(psActor.PedIndex)
IF NOT IS_ENTITY_DEAD(psActor.PedIndex)
IF IS_ENTITY_PLAYING_ANIM(psActor.PedIndex, "misscarsteal4@actor", "stumble")
OR IS_ENTITY_PLAYING_ANIM(psActor.PedIndex, "misscarsteal4@actor", "dazed_idle")
CHECK_PED_LINE_OF_SIGHT_TO_PED(psActress.PedIndex, psActor.PedIndex, psActress.bCanSeeTargetPed, psActress.iTimer, 950)
IF ( psActress.bCanSeeTargetPed = TRUE )
IF ( GET_DISTANCE_BETWEEN_ENTITIES(psActor.PedIndex, psActress.PedIndex) < 30.0)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_AMSNO", CONV_PRIORITY_HIGH)
SET_LABEL_AS_TRIGGERED("CST4_AMSNO", TRUE)
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CST4_AMSRO") //play conversation for actress reacting to player running over the actor
IF IS_PED_SITTING_IN_THIS_VEHICLE(psActress.PedIndex, vsPlayersCar.VehicleIndex)
IF ( psActress.bCanSeeTargetPed = TRUE )
IF DOES_ENTITY_EXIST(psActor.PedIndex)
IF IS_ENTITY_DEAD(psActor.PedIndex)
IF ( psActor.eCleanupReason = PED_CLEANUP_KILLED_BY_PLAYER_VEHICLE )
//HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(psActor.PedIndex, PLAYER_PED_ID(), TRUE)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION(CST4Conversation, "CST4AUD", "CST4_AMSRO", CONV_PRIORITY_HIGH)
SET_LABEL_AS_TRIGGERED("CST4_AMSRO", TRUE)
ENDIF
ELSE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_MISSION_STAGE_ESCAPE_FILM_SET_COMPLETED(INT &iStageProgress)
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
IF ( bPlayerInsideFilmStudio = FALSE )
SET_IGNORE_NO_GPS_FLAG(FALSE)
ENDIF
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
ENDIF
KEEP_GARAGE_DOOR_SHUT()
UPDATE_TRIGGERED_LABEL(sLabelDCAR)
UPDATE_TRIGGERED_LABEL(sLabelGENGETIN)
UPDATE_TRIGGERED_LABEL(sLabelGENGETBCK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HORN)
MANAGE_FILM_CREW(iFilmCrewProgress)
MANAGE_GRIP_1(psFilmCrew[FCP_GRIP_1], PLAYER_PED_ID())
MANAGE_DIRECTOR(psFilmCrew[FCP_DIRECTOR], PLAYER_PED_ID())
MANAGE_ACTOR_DURING_ESCAPE_FILM_SET()
MANAGE_ACTRESS(psActress, PLAYER_PED_ID(), vsPlayersCar.VehicleIndex)
MANAGE_SECURITY_PEDS_AT_GATES(iGateSecurityProgress)
MANAGE_SECURITY_PEDS_AT_FILM_SET(iSetSecurityProgress)
MANAGE_SECURITY_PEDS_IN_VEHICLES(iSecurityChaseProgress)
MANAGE_CONVERSATIONS_DURING_ESCAPE_FILM_SET()
IF IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsPlayersCar.VehicleIndex)
AND IS_PED_IN_THIS_VEHICLE(psActress.PedIndex, vsPlayersCar.VehicleIndex)
DISABLE_CINEMATIC_BONNET_CAMERA_THIS_UPDATE()
ENDIF
IF IS_CINEMATIC_SHOT_ACTIVE(SHOTTYPE_CAMERA_MAN)
IF ( bReplayRecordBackFortimeTriggered = FALSE )
REPLAY_RECORD_BACK_FOR_TIME(3, 0.0, REPLAY_IMPORTANCE_HIGH)
bReplayRecordBackFortimeTriggered = TRUE
ENDIF
ELSE
bReplayRecordBackFortimeTriggered = FALSE
ENDIF
SWITCH iStageProgress
CASE 0
IF ( bChaseInProgress = FALSE ) //security chase not in progress
IF ( bChaseFinished = FALSE ) //security chase not finished
IS_PLAYER_AT_ANGLED_AREA_IN_VEHICLE(sLocatesData, vInteriorPosition, << 483.30, -1316.18, 27.70 >>, << 477.64 , -1319.01, 31.20 >>, 5.0, TRUE, vsPlayersCar.VehicleIndex, sLabelDCAR, sLabelGENGETIN, sLabelGENGETBCK, TRUE)
ELSE //security chase finished, security lost or killed
IF ( bEjectorSeatAllowed = FALSE )
IF HAS_LABEL_BEEN_TRIGGERED("CST4_BUTTON1")
bEjectorSeatAllowed = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ejector seat allowed.")
#ENDIF
ENDIF
ENDIF
IF IS_PED_IN_THIS_VEHICLE(psActress.PedIndex, vsPlayersCar.VehicleIndex)
IF HAS_LABEL_BEEN_TRIGGERED("CST4_BUTTON1")
IF NOT HAS_LABEL_BEEN_TRIGGERED("CAR4_EGIRL")
IF ( bEjectorSeatActive = FALSE )
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
PRINT_GOD_TEXT_ADVANCED("CAR4_EGIRL", DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
ENDIF
ENDIF
ELSE
IF ( bMusicEventDropTriggered = FALSE )
IF HAS_LABEL_BEEN_TRIGGERED("CST4_ENDCALL")
IF IS_CALLING_CONTACT(CHAR_MOLLY)
OR IS_CONTACT_IN_CONNECTED_CALL(CHAR_MOLLY)
TRIGGER_MUSIC_EVENT("CAR3_DROP") //trigger music event
bMusicEventDropTriggered = TRUE //if not triggered via ejector seat
ENDIF
ENDIF
ENDIF
IF IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsPlayersCar.VehicleIndex) //if player is in the car
AND NOT IS_CINEMATIC_SHOT_ACTIVE(SHOTTYPE_CAMERA_MAN) //and spikes camera is not active
IF HAS_LABEL_BEEN_TRIGGERED("CST4_ENDCALL")
IF IS_CALLING_CONTACT(CHAR_MOLLY)
OR IS_CONTACT_IN_CONNECTED_CALL(CHAR_MOLLY)
IF GET_CURRENT_SCRIPTED_CONVERSATION_LINE() > 0
STOP_AUDIO_SCENE("CAR_3_ESCAPE_SECURITY")
RETURN TRUE
ENDIF
ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
STOP_AUDIO_SCENE("CAR_3_ESCAPE_SECURITY")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE //security chase in progress
IF ( bSpikesAllowed = FALSE )
IF ( iSpikesDelayTimer = 0 )
IF IS_PED_IN_THIS_VEHICLE(psActress.PedIndex, vsPlayersCar.VehicleIndex)
iSpikesDelayTime = 22000
ELSE
iSpikesDelayTime = 16000
ENDIF
iSpikesDelayTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting spikes delay timer with delay time ", iSpikesDelayTime, "ms.")
#ENDIF
ELSE
IF HAS_TIME_PASSED(iSpikesDelayTime, iSpikesDelayTimer)
bSpikesUnlocked = TRUE
IF HAS_LABEL_BEEN_TRIGGERED("CST4_FSPB")
bSpikesAllowed = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Spikes allowed.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_BLIP_EXIST(sLocatesData.vehicleBlip)
OR DOES_BLIP_EXIST(sLocatesData.LocationBlip) //clear locates header blip and text when chase starts
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, FALSE)
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("CAR4_LSEC")
IF HAS_LABEL_BEEN_TRIGGERED("CST4_ASSC")
OR HAS_LABEL_BEEN_TRIGGERED("CST4_FSSC")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
PRINT_GOD_TEXT_ADVANCED("CAR4_LSEC", DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsPlayersCar.VehicleIndex) //handle target vehicle blip display
IF NOT DOES_BLIP_EXIST(vsPlayersCar.BlipIndex)
AND NOT DOES_BLIP_EXIST(sLocatesData.vehicleBlip)
vsPlayersCar.BlipIndex = CREATE_BLIP_FOR_VEHICLE(vsPlayersCar.VehicleIndex)
ENDIF
IF DOES_BLIP_EXIST(vsPlayersCar.BlipIndex)
IF NOT HAS_LABEL_BEEN_TRIGGERED(sLabelGENGETBCK) AND NOT IS_STRING_NULL_OR_EMPTY(sLabelGENGETBCK)
IF IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
CLEAR_PRINTS()
PRINT_GOD_TEXT_ADVANCED(sLabelGENGETBCK, DEFAULT_GOD_TEXT_TIME, TRUE)
ENDIF
ENDIF
ENDIF
ELSE //player is in the car
IF DOES_BLIP_EXIST(vsPlayersCar.BlipIndex)
IF IS_THIS_PRINT_BEING_DISPLAYED(sLabelGENGETBCK)
CLEAR_PRINTS()
ENDIF
REMOVE_BLIP(vsPlayersCar.BlipIndex)
ENDIF
ENDIF
IF IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsPlayersCar.VehicleIndex) //handle help text display
AND NOT IS_CELLPHONE_CAMERA_IN_USE()
IF NOT IS_CINEMATIC_SHOT_ACTIVE(SHOTTYPE_CAMERA_MAN)
IF ( bSpikesAllowed = TRUE )
IF ( iSecurityCarsImmobilized = 0)
IF ( bChaseInProgress = TRUE )
IF NOT HAS_LABEL_BEEN_TRIGGERED("CAR4_HCARS")
PRINT_HELP_ADVANCED("CAR4_HCARS", TRUE, TRUE) //handle spikes help text
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bEjectorSeatAllowed = TRUE )
IF ( bEjectorSeatActive = FALSE )
IF IS_PED_IN_THIS_VEHICLE(psActress.PedIndex, vsPlayersCar.VehicleIndex)
IF NOT HAS_LABEL_BEEN_TRIGGERED("CAR4_HCARE")
PRINT_HELP_ADVANCED("CAR4_HCARE", TRUE, TRUE) //handle ejector seat help text
ELSE
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CAR4_HCARE")
SET_LABEL_AS_TRIGGERED("CAR4_HCARE", FALSE)
ENDIF
ENDIF
ELSE
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CAR4_HCARE")
CLEAR_HELP()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CAR4_HCARE")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CAR4_HCARS")
CLEAR_HELP()
ENDIF
ENDIF
IF NOT IS_CELLPHONE_CAMERA_IN_USE()
IF ( bSpikesAllowed = TRUE )
UPDATE_JB700_SPIKES_DROPPING(vsPlayersCar.VehicleIndex, CarGadgetData)
UPDATE_JB700_SPIKES_COLLISIONS(vsPlayersCar.VehicleIndex, CarGadgetData)
IF NOT IS_CALLING_CONTACT(CHAR_MOLLY) AND NOT IS_CONTACT_IN_CONNECTED_CALL(CHAR_MOLLY)
UPDATE_JB700_SPIKES_CUTSCENE(vsPlayersCar.VehicleIndex, CarGadgetData, "CAR_3_TYRE_BURST_CAM")
ELSE
RESET_JB700_SPIKES_CUTSCENE_TIMERS(CarGadgetData)
ENDIF
UPDATE_JB700_SPIKE_HIT_COUNTERS(CarGadgetData, vsSecurityCars)
UPDATE_JB700_PED_DRIVE_TASK(CarGadgetData, PLAYER_PED_ID(), vsPlayersCar.VehicleIndex, vsPlayersCar.bAutoDriveActive, vsPlayersCar.iTimer)
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_DELIVER_CAR_COMPLETED(INT &iStageProgress)
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HORN)
MANAGE_DEVIN(iLeadInProgress)
MANAGE_ACTRESS(psActress, PLAYER_PED_ID(), vsPlayersCar.VehicleIndex)
MANAGE_DIRECTOR(psFilmCrew[FCP_DIRECTOR], PLAYER_PED_ID())
MANAGE_GRIP_1(psFilmCrew[FCP_GRIP_1], PLAYER_PED_ID())
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF NOT IS_AUDIO_SCENE_ACTIVE("CAR_3_GO_TO_GARAGE")
START_AUDIO_SCENE("CAR_3_GO_TO_GARAGE")
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(psDevin.PedIndex)
OR NOT bInteriorLoadSceneLoaded
KEEP_GARAGE_DOOR_SHUT()
ENDIF
IF IS_DOOR_REGISTERED_WITH_SYSTEM(g_sAutoDoorData[ENUM_TO_INT(AUTODOOR_HAYES_GARAGE)].doorID)
SET_SCRIPT_UPDATE_DOOR_AUDIO(g_sAutoDoorData[ENUM_TO_INT(AUTODOOR_HAYES_GARAGE)].doorID , TRUE)
ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vInteriorPosition) < 50.0
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_START_SPHERE(vInteriorPosition, 5.25, NEWLOADSCENE_FLAG_INTERIOR_AND_EXTERIOR)
bInteriorLoadSceneLoaded = FALSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting new load scene at coords ", vInteriorPosition, ".")
#ENDIF
ELSE
IF IS_NEW_LOAD_SCENE_LOADED()
//NEW_LOAD_SCENE_STOP()
bInteriorLoadSceneLoaded = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": New load scene at coords ", vInteriorPosition, " loaded.")
#ENDIF
ENDIF
ENDIF
ELSE
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vInteriorPosition) > 75.0
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
bInteriorLoadSceneLoaded = FALSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping new load scene at coords ", vInteriorPosition, ".")
#ENDIF
ENDIF
ENDIF
ENDIF
IF IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()
OR IS_PLAYER_CHANGING_CLOTHES()
IF HAS_THIS_CUTSCENE_LOADED("car_4_ext")
OR HAS_CUTSCENE_LOADED()
OR IS_CUTSCENE_ACTIVE()
REMOVE_CUTSCENE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player browsing items in a shop or changing clothes. Removing cutscene.")
#ENDIF
ENDIF
ELSE
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vInteriorPosition) < 15.0 //DEFAULT_CUTSCENE_LOAD_DIST
REQUEST_CUTSCENE("car_4_ext")
//fix for streaming of the gates, see B*1843796
REQUEST_MODEL(PROP_SC1_06_GATE_L)
REQUEST_MODEL(PROP_SC1_06_GATE_R)
REMOVE_ANIM_DICT("move_m@generic")
REMOVE_ANIM_DICT("move_m@intimidation@cop@unarmed")
REMOVE_ANIM_DICT("reaction@intimidation@cop@unarmed")
CLEANUP_OBJECT(osPropLamp.ObjectIndex, FALSE)
CLEANUP_PED_GROUP(psSetSecurity, FALSE, FALSE)
CLEANUP_PED_GROUP(psActorSecurity, FALSE, FALSE)
CLEANUP_PED_GROUP(psMeltdownSecurity, FALSE, FALSE)
CLEANUP_PED_GROUP(psNorthGateSecurity, FALSE, FALSE)
CLEANUP_PED_GROUP(psSouthGateSecurity, FALSE, FALSE)
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Franklin", PLAYER_PED_ID()) //request variations for Franklin
IF DOES_ENTITY_EXIST(psDevin.PedIndex) //request variations for Devin
IF NOT IS_ENTITY_DEAD(psDevin.PedIndex)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Devin", psDevin.PedIndex) //from ped if Devin exists
ENDIF
ELSE //and if Devin does not exist
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_HEAD, 0, 0) //(head)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_HAIR, 0, 0) //(hair)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_TORSO, 0, 0) //(uppr)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_LEG, 0, 0) //(lowr)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_HAND, 0, 0) //(hand)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_FEET, 0, 0) //(feet)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_TEETH, 0, 0) //(feet)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_SPECIAL, 2, 0) //(accs)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_SPECIAL2, 0, 0) //(task)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_DECL, 0, 0) //(decl)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_JBIB, 0, 0) //(jbib)
ENDIF
ENDIF
IF ( bMusicEventDeliverTriggered = FALSE )
IF TRIGGER_MUSIC_EVENT("CAR3_DELIVER")
bMusicEventDeliverTriggered = TRUE
ENDIF
ENDIF
ELSE
IF HAS_THIS_CUTSCENE_LOADED("car_4_ext")
OR HAS_CUTSCENE_LOADED()
OR IS_CUTSCENE_ACTIVE()
REMOVE_CUTSCENE()
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_SC1_06_GATE_L)
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_SC1_06_GATE_R)
#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
SWITCH iStageProgress
CASE 0
UPDATE_JB700_SPIKES_DROPPING(vsPlayersCar.VehicleIndex, CarGadgetData)
UPDATE_JB700_SPIKES_COLLISIONS(vsPlayersCar.VehicleIndex, CarGadgetData)
IF NOT IS_CALLING_CONTACT(CHAR_MOLLY) AND NOT IS_CONTACT_IN_CONNECTED_CALL(CHAR_MOLLY)
UPDATE_JB700_SPIKES_CUTSCENE(vsPlayersCar.VehicleIndex, CarGadgetData, "CAR_3_TYRE_BURST_CAM")
ELSE
RESET_JB700_SPIKES_CUTSCENE_TIMERS(CarGadgetData)
ENDIF
UPDATE_JB700_SPIKE_HIT_COUNTERS(CarGadgetData, vsSecurityCars)
UPDATE_JB700_PED_DRIVE_TASK(CarGadgetData, PLAYER_PED_ID(), vsPlayersCar.VehicleIndex, vsPlayersCar.bAutoDriveActive, vsPlayersCar.iTimer)
//if the player reaches this stage while not being in car and the blip was displayed
//make sure the car's blip is cleaned up
IF IS_VEHICLE_DRIVEABLE(vsPlayersCar.VehicleIndex)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsPlayersCar.VehicleIndex)
IF DOES_BLIP_EXIST(vsPlayersCar.BlipIndex)
REMOVE_BLIP(vsPlayersCar.BlipIndex)
ENDIF
ENDIF
ENDIF
IF ( bFilmStudioAmbientPedsBlocked = TRUE )
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vFilmSetCenterPosition) > 500.0
CLEAR_PED_NON_CREATION_AREA()
SET_SCENARIO_GROUP_ENABLED("MOVIE_STUDIO_SECURITY", TRUE)
IF ( ScenarioBlockingArea1 != NULL )
REMOVE_SCENARIO_BLOCKING_AREA(ScenarioBlockingArea1)
ENDIF
IF ( ScenarioBlockingArea2 != NULL )
REMOVE_SCENARIO_BLOCKING_AREA(ScenarioBlockingArea2)
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removed film studio scenario blocking areas and non ped creation areas.")
#ENDIF
bFilmStudioAmbientPedsBlocked = FALSE
ENDIF
ENDIF
ENDIF
IS_PLAYER_AT_LOCATION_IN_VEHICLE(sLocatesData, vInteriorPosition, DEFAULT_LOCATES_SIZE_VECTOR(), TRUE, vsPlayersCar.VehicleIndex, sLabelDCAR, sLabelGENGETIN, sLabelGENGETBCK, TRUE)
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF ( IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << 483.30, -1316.18, 27.70 >>, << 477.64 , -1319.01, 31.20 >>, 5.0)
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vInteriorPosition) < CLAMP(GET_ENTITY_SPEED(PLAYER_PED_ID()), 1.25, 3.5) )
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<474.036987,-1316.961304,28.106997>>, <<481.344360,-1311.562744,31.202971>>, 6.0)
TRIGGER_MUSIC_EVENT("CAR3_STOP_TRACK")
CLEANUP_JB700_SPIKES(CarGadgetData, FALSE)
CLEANUP_OBJECT(osPropChair.ObjectIndex, TRUE)
CLEANUP_OBJECT(osTrailerDoor.ObjectIndex, TRUE)
CLEANUP_OBJECT(osPropClipboard.ObjectIndex, TRUE)
IF IS_PHONE_ONSCREEN()
HANG_UP_AND_PUT_AWAY_PHONE(TRUE)
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
ENDIF
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), psDevin.PedIndex, INFINITE_TASK_TIME, SLF_WHILE_NOT_IN_FOV)
bLeadInTriggered = TRUE
iStageProgress++
ENDIF
ENDIF
BREAK
CASE 1
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vsPlayersCar.VehicleIndex, 2.5, 1, 0.75)
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
iStageProgress++
ENDIF
BREAK
CASE 2
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
DISABLE_PLAYER_VEHICLE_CONTROLS_THIS_FRAME()
BOOL bProgress
bProgress = FALSE
IF DOES_ENTITY_EXIST(psDevin.PedIndex)
IF NOT IS_ENTITY_DEAD(psDevin.PedIndex)
IF IS_ENTITY_PLAYING_ANIM(psDevin.PedIndex, "misscarsteal4leadinoutcar_4_ext", "leadin_action_devin")
IF GET_ENTITY_ANIM_CURRENT_TIME(psDevin.PedIndex, "misscarsteal4leadinoutcar_4_ext", "leadin_action_devin") > 0.875
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
bProgress = TRUE
ENDIF
ENDIF
ELSE
IF NOT IS_ENTITY_PLAYING_ANIM(psDevin.PedIndex, "misscarsteal4leadinoutcar_4_ext", "leadin_loop_devin")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
bProgress = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF bProgress
CLEANUP_PED(psActor)
REMOVE_ANIM_DICT("dead")
REMOVE_ANIM_DICT("misscarsteal4@actor")
REMOVE_ANIM_DICT("misscarsteal4leadinoutcar_4_ext")
IF IS_VEHICLE_DRIVEABLE(vsPlayersCar.VehicleIndex)
SET_VEHICLE_ENGINE_ON(vsPlayersCar.VehicleIndex, FALSE, FALSE)
ENDIF
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
SET_FORCE_FOOTSTEP_UPDATE(psDevin.PedIndex, FALSE)
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
ENDIF
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_END_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
IF HAS_REQUESTED_CUTSCENE_LOADED("car_4_ext")
IF IS_VEHICLE_DRIVEABLE(vsPlayersCar.VehicleIndex)
IF IS_VEHICLE_DOOR_DAMAGED(vsPlayersCar.VehicleIndex, SC_DOOR_FRONT_LEFT)
SET_VEHICLE_DOOR_CONTROL(vsPlayersCar.VehicleIndex, SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0)
ENDIF
SET_VEHICLE_ENGINE_ON(vsPlayersCar.VehicleIndex, FALSE, FALSE)
REGISTER_ENTITY_FOR_CUTSCENE(vsPlayersCar.VehicleIndex, "movie_car", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF DOES_ENTITY_EXIST(psDevin.PedIndex)
IF NOT IS_ENTITY_DEAD(psDevin.PedIndex)
SET_FORCE_FOOTSTEP_UPDATE(psDevin.PedIndex, FALSE)
REGISTER_ENTITY_FOR_CUTSCENE(psDevin.PedIndex, "Devin", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
ENDIF
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ELSE
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_HEAD, 0, 0) //(head)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_HAIR, 0, 0) //(hair)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_TORSO, 0, 0) //(uppr)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_LEG, 0, 0) //(lowr)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_HAND, 0, 0) //(hand)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_FEET, 0, 0) //(feet)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_TEETH, 0, 0) //(feet)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_SPECIAL, 2, 0) //(accs)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_SPECIAL2, 0, 0) //(task)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_DECL, 0, 0) //(decl)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Devin", PED_COMP_JBIB, 0, 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()
STOP_AUDIO_SCENE("CAR_3_GO_TO_GARAGE")
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_SC1_06_GATE_L)
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_SC1_06_GATE_R)
CLEANUP_JB700_SPIKES(CarGadgetData, TRUE)
CLEAR_AREA_OF_OBJECTS(<< 484.687, -1315.512, 28.202 >>, 4.5)
CLEAR_AREA_OF_PEDS(sMissionPosition.vPosition, 100.0)
CLEAR_AREA_OF_VEHICLES(sMissionPosition.vPosition, 100.0)
STOP_FIRE_IN_RANGE(sMissionPosition.vPosition, 20.0)
REMOVE_DECALS_IN_RANGE(sMissionPosition.vPosition, 20.0)
CLEAR_AREA_OF_PROJECTILES(sMissionPosition.vPosition, 20.0)
REMOVE_PARTICLE_FX_IN_RANGE(sMissionPosition.vPosition, 20.0)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 2
IF IS_CUTSCENE_PLAYING()
KEEP_GARAGE_DOOR_SHUT()
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
//should fix pop at end of cutscene
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
IF ( bCutsceneSkipped = TRUE )
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_GARAGE_FRONT))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_GARAGE_FRONT), -1.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_GARAGE_FRONT), DOORSTATE_FORCE_OPEN_THIS_FRAME, FALSE, TRUE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
WARP_PED(PLAYER_PED_ID(), << 493.4449, -1313.0740, 28.2614 >>, 300.9095, FALSE, TRUE, FALSE)
//fix for B*2025342, put Franklin in motion at the end of the cutscene
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT)
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 2000)
ENDIF
ENDIF
IF HAS_CUTSCENE_FINISHED()
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
REPLAY_STOP_EVENT()
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
RETURN TRUE
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(), ": Mocap cutscene was skipped by the player.")
#ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
#IF IS_DEBUG_BUILD
FUNC BOOL IS_MISSION_STAGE_EJECTOR_TEST_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
MANAGE_EJECTOR_SEAT(psActress.PedIndex, PLAYER_PED_ID(), vsPlayersCar.VehicleIndex, iEjectorSeatProgress,
iEjectorSeatTimer, bEjectorSeatActive, bActressEjected)
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
#ENDIF
//|============================= END MISSION STAGES FUNCTIONS ============================|
//|=================================== MAIN SCRIPT LOOP ==================================|
SCRIPT
SET_MISSION_FLAG(TRUE)
//check for death or arrest
IF HAS_FORCE_CLEANUP_OCCURRED()
CLEAR_HELP()
CLEAR_PRINTS()
KILL_ANY_CONVERSATION()
TRIGGER_MUSIC_EVENT("CAR3_MISSION_FAIL")
MISSION_FLOW_MISSION_FORCE_CLEANUP()
MISSION_CLEANUP()
TERMINATE_THIS_THREAD()
ENDIF
INIT_PC_SCRIPTED_CONTROLS( "Carsteal4_spycar" )
SET_INTERIOR_CAPPED(INTERIOR_V_CHOPSHOP, FALSE)
#IF IS_DEBUG_BUILD
CREATE_DEBUG_MISSION_STAGE_MENU()
CREATE_DEBUG_WIDGETS()
#ENDIF
IF IS_REPLAY_IN_PROGRESS()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission replay is in progress.")
#ENDIF
SET_MISSION_STAGE_FOR_REPLAY(eMissionStage, Get_Replay_Mid_Mission_Stage())
bReplayFlag = TRUE
//handle shitskip message
IF ( g_bShitSkipAccepted = TRUE )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Shitskip accepted by the player.")
#ENDIF
eMissionStage = GET_NEXT_MISSION_STAGE(eMissionStage)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Shitskip changed mission stage to ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eMissionStage), ".")
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Shitskip not triggered.")
#ENDIF
ENDIF
ELSE
RESET_GLOBAL_BIT_SET()
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_ACTOR), "GET TO ACTOR", FALSE)
ENDIF
WHILE TRUE
//calculate distance from player ped to target vehicle
//then use the variable rather than running another distance check
IF DOES_ENTITY_EXIST(vsPlayersCar.VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(vsPlayersCar.VehicleIndex)
fDistanceFromPlayerToTargetVehicle = GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), vsPlayersCar.VehicleIndex)
ENDIF
ENDIF
bPlayerInsideFilmStudio = IS_ENTITY_IN_FILM_STUDIO(PLAYER_PED_ID())
//check each frame if mission is failed due to fail conditions
//check only if mission stage loading has finished
IF ( bLoadingFinishedFlag = TRUE )
RUN_FAIL_CHECKS(eMissionStage, eMissionFail)
RUN_INTERIOR_PINNING_AND_UNPINNING_CHECK(vInteriorPosition, 150.0)
ENDIF
//run this check to stop security peds in the film set
//from firing random bullet when the PRF_BlockWeaponFire is not set for a frame
BLOCK_WEAPON_FIRE_FOR_AIMING_SECURITY_GROUP(psSetSecurity)
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_DeepInside")
SWITCH eMissionStage
CASE MISSION_STAGE_GET_TO_ACTOR
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.2)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.2)
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2175707
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFinishedFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_GET_TO_ACTOR_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
IF IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsPlayersCar.VehicleIndex)
eMissionStage = MISSION_STAGE_ESCAPE_FILM_SET
ELSE
eMissionStage = MISSION_STAGE_CUTSCENE_TRAILER
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_TRAILER
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.1)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.1)
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFinishedFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_TRAILER_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_GET_TO_CAR
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_GET_TO_CAR
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.1)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.1)
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2175707
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFinishedFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_GET_TO_CAR_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_ESCAPE_FILM_SET
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_ESCAPE_FILM_SET
IF ( bChaseFinished = FALSE )
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.4)
ENDIF
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2175707
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFinishedFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_ESCAPE_FILM_SET_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_DELIVER_CAR
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_DELIVER_CAR
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFinishedFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_DELIVER_CAR_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_CUTSCENE_END
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_END
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFinishedFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_END_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
//lock the main garage door after the end cutscene
KEEP_GARAGE_DOOR_SHUT()
SET_DOOR_STATE(DOORNAME_CARSTEAL_GARAGE_S, DOORSTATE_LOCKED)
eMissionStage = MISSION_STAGE_PASSED
ENDIF
ENDIF
BREAK
#IF IS_DEBUG_BUILD
CASE MISSION_STAGE_EJECTOR_TEST
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFinishedFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_EJECTOR_TEST_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_PASSED
ENDIF
ENDIF
BREAK
#ENDIF
CASE MISSION_STAGE_PASSED
MISSION_FLOW_MISSION_PASSED()
MISSION_CLEANUP()
TERMINATE_THIS_THREAD()
BREAK
CASE MISSION_STAGE_FAILED
SET_MISSION_FAILED_WITH_REASON(eMissionFail)
CLEAR_HELP()
CLEAR_PRINTS()
KILL_ANY_CONVERSATION()
TRIGGER_MUSIC_EVENT("CAR3_MISSION_FAIL")
WHILE NOT GET_MISSION_FLOW_SAFE_TO_CLEANUP()
WAIT(0)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Waiting for GET_MISSION_FLOW_SAFE_TO_CLEANUP() to return TRUE.")
#ENDIF
ENDWHILE
IF ( bPlayerInsideFilmStudio = TRUE )
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<-1021.8750, -475.0034, 36.0445>>, 82.2636)
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_WHITE_TUXEDO)
SET_PLAYER_PED_OUTFIT_TO_TUXEDO(FALSE)
ENDIF
MISSION_CLEANUP()
TERMINATE_THIS_THREAD()
BREAK
ENDSWITCH
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID(), CS3_DAMAGE)
IF DOES_ENTITY_EXIST(vsPlayersCar.VehicleIndex)
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(vsPlayersCar.VehicleIndex, CS3_NO_SCRATCH)
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(vsPlayersCar.VehicleIndex, CS3_FASTEST_SPEED)
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() //handle rag widgets
RUN_DEBUG_INFORMATION_DISPLAY() //handle drawing of debug information
#ENDIF
WAIT(0)
ENDWHILE
ENDSCRIPT