Files
gtav-src/script/dev_ng/singleplayer/scripts/RandomChar/Josh/Josh4.sc
T
2025-09-29 00:52:08 +02:00

1879 lines
67 KiB
Python
Executable File

//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
USING "rage_builtins.sch"
USING "globals.sch"
USING "commands_entity.sch"
USING "commands_script.sch"
USING "script_player.sch"
USING "randomChar_public.sch"
USING "commands_vehicle.sch"
USING "commands_cutscene.sch"
USING "cutscene_public.sch"
USING "script_blips.sch"
USING "script_ped.sch"
USING "RC_helper_functions.sch"
USING "dialogue_public.sch"
USING "CompletionPercentage_public.sch"
USING "RC_Threat_public.sch"
USING "initial_scenes_josh.sch"
USING "commands_recording.sch"
#IF IS_DEBUG_BUILD
USING "select_mission_stage.sch"
#ENDIF
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : Josh4.sc
// AUTHOR : David Roberts/Ian Gander
// DESCRIPTION : Josh tells the cops that Trevor burnt down his house in a
// cutscene. Trevor must escape from the cops and lose his
// wanted level.
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//-------------------------
STRING g_CutsceneName = "josh_4_int_concat"
CONST_INT PLAYER_WANTED_LEVEL 2
CONST_INT MAX_FLEE_DIRECTIONS 5
MODEL_NAMES cop_model = S_M_Y_Cop_01
MODEL_NAMES cop_car_model = POLICE3
VEHICLE_INDEX viTemp // Temp vehicle index used for player's vehicle during a replay
//Main states of the mission
ENUM RC_MainState
RC_LEADIN,
RC_INTRO, //Intro cutscene
RC_ESCAPE_COPS //Escape the cops
ENDENUM
ENUM RC_AI_CopCarState
RC_AIC_LOAD,
RC_AIC_CREATE,
RC_AIC_START_REC,
RC_AIC_UPDATE_REC,
RC_AIC_END_REC,
RC_AIC_FINISHED
ENDENUM
//Mini state machine for each mission state
ENUM RC_SubState
SS_Setup, //Create everything and start things off (objectives etc)
SS_Update, //Every frame - main running of the state
SS_Cleanup //Called last time through the state - clean thing up, set new state etc
ENDENUM
ENUM COP_ENCOUNTER_STATE
CE_WAIT,
CE_AIM,
CE_AIMWAIT,
CE_ATTACK,
CE_ARREST
ENDENUM
ENUM JOSH_STATE
JOSH_WATCH,
JOSH_FLEE,
JOSH_LOST,
JOSH_DEAD
ENDENUM
ENUM DIALOGUE_STATE
CONV_PAUSE,
CONV_START,
CONV_PLAYING,
CONV_STOP
ENDENUM
STRUCT RC_DrivingCopCar
VECTOR vStartPos
FLOAT Qx
FLOAT Qy
FLOAT Qz
FLOAT Qw
VEHICLE_INDEX iIndex
PED_INDEX mCopsInCar
INT iRecNum
STRING sRecName
RC_AI_CopCarState mState
ENDSTRUCT
STRUCT RC_TriggerArea
VECTOR vec1
VECTOR vec2
FLOAT width
ENDSTRUCT
STRUCT RC_CAR_QUATS
FLOAT Qx
FLOAT Qy
FLOAT Qz
FLOAT Qw
ENDSTRUCT
// Checkpoint
//CONST_INT CP_START 1
RC_MainState m_state = RC_LEADIN //Main states of the mission
RC_SubState m_subState = SS_Setup //Mini state machine for each state the mission goes into
RC_DrivingCopCar m_AI_FleeCar
COP_ENCOUNTER_STATE m_Cop_State = CE_WAIT
JOSH_STATE JoshState = JOSH_WATCH
DIALOGUE_STATE ConvState = CONV_START
BOOL bDoCopConv = TRUE
INT iDialogueTimer
VECTOR vPlayerPosAfterIntro = <<-1102.9056, 284.7310, 63.0602>> //Where the player is after the cutscene
FLOAT fPlayerHeadAfterIntro = 9.4866 //Heading of the player after the cutscene
VECTOR vRC_runToPoint //Where Josh runs to - back of the house
structPedsForConversation cConversation //Conversatino of the cops shouting at the start.
structPedsForConversation jConversation //Conversation between Josh and Trevor
g_structRCScriptArgs sRCLauncherDataLocal //Local copy of the data created by the launcher
OBJECT_INDEX idleCopGun
OBJECT_INDEX notepadCopGun
SEQUENCE_INDEX seq
VEHICLE_INDEX viCopCar
VEHICLE_INDEX viJoshCar
MODEL_NAMES JoshCarModel = FELON2
CONST_INT MAX_COP_DIALOG 3
CONST_INT MAX_JOSH_DIALOG 3
int iFlee
int iShootTimer
BOOL bDone10SecWarning = FALSE
BOOL bCopWait = FALSE
BOOL bCopMove = FALSE
BOOL bCopsDead[2]
BOOL bCopsShooting = FALSE
BOOL bLeadinPlayed = FALSE
BOOL bLeadinConvo = FALSE
BOOL bCutsceneSkipped = FALSE
// Music triggers
BOOL bDoneMusicCutscene = FALSE
BOOL bDoneMusicStart = FALSE
BOOL bDoneMusicVehicle = FALSE
bool bDoJoshComment = FALSE
BOOL bDoneJoshJackingConv = FALSE
int iCutsceneProgress = 0
int iRantProgress = 0
INT iJoshFleeConvoCount = 0
INT iCopReleaseTimer
INT iTrevRantTimer
INT iJoshFleeConvoTimer
BOOL bDonePoliceReport = FALSE
RC_TriggerArea FleeTrigger[MAX_FLEE_DIRECTIONS]
VECTOR vCopCarRushPos[MAX_FLEE_DIRECTIONS]
RC_CAR_QUATS qFleeQuats[MAX_FLEE_DIRECTIONS]
CONST_INT JOSH 0
CONST_INT SPEAKER_COP 1
CONST_INT NOTEPAD_COP 2
CONST_INT COP_CAR 0
CONST_INT JOSH_CAR 1
#IF IS_DEBUG_BUILD
CONST_INT MAX_SKIP_MENU_LENGTH 3
MissionStageMenuTextStruct mSkipMenu[MAX_SKIP_MENU_LENGTH]
INT menu_option
BOOL bDebug_PrintToTTY = TRUE
WIDGET_GROUP_ID widgetGroup
#ENDIF
// ===========================================================================================================
// Debug prints
// ===========================================================================================================
/// PURPOSE: Print a string to the console
PROC DEBUG_PRINTSTRING(STRING s)
#IF IS_DEBUG_BUILD
IF bDebug_PrintToTTY
CPRINTLN(DEBUG_MISSION, s)
ENDIF
#ENDIF
// Stop release compile error
s = s
ENDPROC
/// PURPOSE: Print a string with an int to the console
PROC DEBUG_PRINTSI(STRING s, INT i)
#IF IS_DEBUG_BUILD
IF bDebug_PrintToTTY
CPRINTLN(DEBUG_MISSION, s, i)
ENDIF
#ENDIF
// Stop release compile error
s = s
i = i
ENDPROC
/// PURPOSE:
/// Handle starting the music at appropriate times during the mission
PROC HANDLE_MUSIC()
IF m_state = RC_INTRO
IF IS_CUTSCENE_PLAYING()
IF GET_CUTSCENE_TIME() > 14000
AND NOT bDoneMusicCutscene
TRIGGER_MUSIC_EVENT("JOSH4_START")
DEBUG_PRINTSTRING("Starting 'JOSH4_START'")
bDoneMusicCutscene = TRUE
ENDIF
ENDIF
ELSE
IF NOT bDoneMusicStart
TRIGGER_MUSIC_EVENT("JOSH4_ACTION")
DEBUG_PRINTSTRING("Starting 'JOSH4_ACTION'")
bDoneMusicStart = TRUE
ELSE
IF NOT bDoneMusicVehicle
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
TRIGGER_MUSIC_EVENT("JOSH4_VEHICLE")
DEBUG_PRINTSTRING("Starting 'JOSH4_VEHICLE'")
bDoneMusicVehicle = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Set up all the positions for the cops and flee car required in the mission
PROC SetupPositions()
#IF IS_DEBUG_BUILD
mSkipMenu[0].sTxtLabel = "Intro"
mSkipMenu[1].sTxtLabel = "Escape cops"
mSkipMenu[2].sTxtLabel = "Debug: Kill Josh so alternative Trevor rant occurs"
#ENDIF
//Players postion
vPlayerPosAfterIntro = <<-1102.9056, 284.7310, 63.0602>> //Using INVALID_WORLD_Z to ensure actor is on the ground
fPlayerHeadAfterIntro = 9.4866
//Where RCcharacter runs to
vRC_runToPoint = << -1140.98, 297.59, 65.89 >>
//Everything else about this car will need to get filled out during the mission
m_AI_FleeCar.sRecName = "Josh4CopRush"
m_AI_FleeCar.mState = RC_AIC_LOAD
FleeTrigger[0].vec1 = <<-1152.525513,278.231750,65.693336>>
FleeTrigger[0].vec2 = <<-1136.276611,239.055130,69.440590>>
FleeTrigger[0].width = 3.250000
FleeTrigger[1].vec1 = <<-1151.918335,287.227570,66.040184>>
FleeTrigger[1].vec2 = <<-1137.050903,290.545349,70.042900>>
FleeTrigger[1].width = 3.250000
FleeTrigger[2].vec1 = <<-1093.003174,295.528900,63.115368>>
FleeTrigger[2].vec2 = <<-1069.194458,293.528595,67.535675>>
FleeTrigger[2].width = 3.250000
FleeTrigger[3].vec1 = <<-1050.775513,284.393494,63.156693>>
FleeTrigger[3].vec2 = <<-1050.369385,244.094513,67.863937>>
FleeTrigger[3].width = 3.250000
FleeTrigger[4].vec1 = <<-1065.411011,229.621628,61.886574>>
FleeTrigger[4].vec2 = <<-1104.021484,232.132095,68.149750>>
FleeTrigger[4].width = 3.250000
vCopCarRushPos[0] = << -1357.5698, 200.1279, 58.0750 >>
qFleeQuats[0].Qx = 0.0072
qFleeQuats[0].Qy = 0.0163
qFleeQuats[0].Qz = -0.5901
qFleeQuats[0].Qw = 0.8071
vCopCarRushPos[1] = << -1219.0353, 401.5473, 74.7130 >>
qFleeQuats[1].Qx = -0.0145
qFleeQuats[1].Qy = 0.0329
qFleeQuats[1].Qz = -0.6893
qFleeQuats[1].Qw = 0.7235
vCopCarRushPos[2] = << -1113.0596, 397.6948, 69.1133 >>
qFleeQuats[2].Qx = -0.0155
qFleeQuats[2].Qy = -0.0400
qFleeQuats[2].Qz = 0.7661
qFleeQuats[2].Qw = -0.6413
vCopCarRushPos[3] = << -885.0710, 240.0283, 71.7539 >>
qFleeQuats[3].Qx = -0.0576
qFleeQuats[3].Qy = 0.0000
qFleeQuats[3].Qz = 0.5936
qFleeQuats[3].Qw = 0.8027
vCopCarRushPos[4] = << -1020.4949, 121.0783, 53.0567 >>
qFleeQuats[4].Qx = 0.0234
qFleeQuats[4].Qy = 0.0126
qFleeQuats[4].Qz = 0.2792
qFleeQuats[4].Qw = 0.9599
REQUEST_ADDITIONAL_TEXT("JOSH4", MISSION_TEXT_SLOT)
WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
WAIT(0)
ENDWHILE
IF IS_REPLAY_BEING_SET_UP()
IF OPEN_FRONT_GATES(FALSE)
DEBUG_PRINTSTRING("*** Opened Josh gate for replay")
ENDIF
ENDIF
DEBUG_PRINTSTRING("*** Set up coords")
ENDPROC
/// PURPOSE: Register all mission entities for cutscene
PROC SetupStartOfIntro()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
DEBUG_PRINTSTRING("*** Registered Trevor")
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[JOSH])
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.pedID[JOSH], "Josh", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
DEBUG_PRINTSTRING("*** Registered Josh")
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[SPEAKER_COP])
idleCopGun = CREATE_WEAPON_OBJECT(WEAPONTYPE_PISTOL, INFINITE_AMMO, GET_ENTITY_COORDS(sRCLauncherDataLocal.pedID[SPEAKER_COP]), TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.pedID[SPEAKER_COP], "Cop_standing_idle", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
DEBUG_PRINTSTRING("*** Registered Cop standing")
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[NOTEPAD_COP])
notepadCopGun = CREATE_WEAPON_OBJECT(WEAPONTYPE_PISTOL, INFINITE_AMMO, GET_ENTITY_COORDS(sRCLauncherDataLocal.pedID[NOTEPAD_COP]), TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.pedID[NOTEPAD_COP], "Cop_with_notepad", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
DEBUG_PRINTSTRING("*** Registered Cop with notepad")
ENDIF
IF IS_ENTITY_ALIVE(idleCopGun)
REGISTER_ENTITY_FOR_CUTSCENE(idleCopGun, "Security_guard_pistol", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
DEBUG_PRINTSTRING("*** Registered idle cop gun")
ENDIF
IF IS_ENTITY_ALIVE(notepadCopGun)
REGISTER_ENTITY_FOR_CUTSCENE(notepadCopGun, "FBI_Agent_1_Gun", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
DEBUG_PRINTSTRING("*** Registered notepad cop gun")
ENDIF
bDoneMusicCutscene = FALSE
bDoneMusicStart = FALSE
bDoneMusicVehicle = FALSE
ENDPROC
/// PURPOSE: Continually try and set the exit state for the cop and Josh while the cutscene is running
PROC GrabCop()
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Josh")
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[JOSH])
DEBUG_PRINTSTRING("Playing Josh's leadout")
OPEN_SEQUENCE_TASK (seq)
TASK_LOOK_AT_ENTITY(NULL, PLAYER_PED_ID(), -1, SLF_FAST_TURN_RATE)
//TASK_PLAY_ANIM(NULL, "rcmjosh4", "josh_leadout", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE|AF_USE_KINEMATIC_PHYSICS)
TASK_PLAY_ANIM(NULL, "rcmjosh4", "josh_leadout_loop", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING|AF_NOT_INTERRUPTABLE|AF_USE_KINEMATIC_PHYSICS)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sRCLauncherDataLocal.pedID[JOSH], seq)
CLEAR_SEQUENCE_TASK(seq)
FORCE_PED_MOTION_STATE(sRCLauncherDataLocal.pedID[JOSH], MS_DO_NOTHING, FALSE, FAUS_CUTSCENE_EXIT)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Security_guard_pistol")
IF IS_ENTITY_ALIVE(idleCopGun)
AND IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[SPEAKER_COP])
GIVE_WEAPON_OBJECT_TO_PED(idleCopGun, sRCLauncherDataLocal.pedID[SPEAKER_COP])
DEBUG_PRINTSTRING("*** Gave idle cop gun")
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("FBI_Agent_1_Gun")
IF IS_ENTITY_ALIVE(notepadCopGun)
AND IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[NOTEPAD_COP])
GIVE_WEAPON_OBJECT_TO_PED(notepadCopGun, sRCLauncherDataLocal.pedID[NOTEPAD_COP])
DEBUG_PRINTSTRING("*** Gave notepad cop gun")
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Cop_standing_idle")
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[SPEAKER_COP])
FORCE_PED_MOTION_STATE(sRCLauncherDataLocal.pedID[SPEAKER_COP], MS_AIMING, DEFAULT, FAUS_CUTSCENE_EXIT)
OPEN_SEQUENCE_TASK(seq)
TASK_LOOK_AT_ENTITY(NULL, PLAYER_PED_ID(), -1, SLF_FAST_TURN_RATE|SLF_USE_TORSO)
//TASK_PLAY_ANIM(NULL, "rcmjosh4", "josh_leadout_cop2", FAST_BLEND_IN, SLOW_BLEND_OUT, DEFAULT, AF_USE_KINEMATIC_PHYSICS|AF_NOT_INTERRUPTABLE)
TASK_AIM_GUN_AT_ENTITY(null, PLAYER_PED_ID(),-1, TRUE)
TASK_PLAY_ANIM(NULL, "combat@gestures@pistol@glances", "90", NORMAL_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS|AF_NOT_INTERRUPTABLE|AF_SECONDARY)
// TASK_STAND_STILL(NULL, 4000)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sRCLauncherDataLocal.pedID[SPEAKER_COP], seq)
CLEAR_SEQUENCE_TASK(seq)
DEBUG_PRINTSTRING("*** Idle cop anim")
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Cop_with_notepad")
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[NOTEPAD_COP])
FORCE_PED_MOTION_STATE(sRCLauncherDataLocal.pedID[NOTEPAD_COP], MS_AIMING, DEFAULT, FAUS_CUTSCENE_EXIT)
OPEN_SEQUENCE_TASK(seq)
TASK_LOOK_AT_ENTITY(NULL, PLAYER_PED_ID(), -1, SLF_FAST_TURN_RATE|SLF_USE_TORSO)
//TASK_PLAY_ANIM(NULL, "rcmjosh4", "josh_leadout_cop1", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE|AF_USE_KINEMATIC_PHYSICS)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<-1103.72, 289.46, 63.23>>, PLAYER_PED_ID(), PEDMOVEBLENDRATIO_WALK, FALSE, 0.1,
DEFAULT, DEFAULT, DEFAULT, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<-1106.08, 288.55, 63.31>>, PLAYER_PED_ID(), PEDMOVEBLENDRATIO_WALK, FALSE, 0.1,
DEFAULT, DEFAULT, DEFAULT, TRUE)
TASK_AIM_GUN_AT_ENTITY(null,PLAYER_PED_ID(),-1, TRUE)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sRCLauncherDataLocal.pedID[NOTEPAD_COP], seq)
CLEAR_SEQUENCE_TASK(seq)
DEBUG_PRINTSTRING("*** Notepad cop anim")
ENDIF
ENDIF
ENDPROC
FUNC BOOL DO_TREVOR_EXIT()
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Get all the actors ready to come back into gameplay, load animations and models, set initial tasks and teleport them
PROC SetupEndOfIntro(BOOL bSkipped = FALSE)
REQUEST_ANIM_DICT("combat@gestures@pistol@halt")
REQUEST_ANIM_DICT("combat@gestures@pistol@glances")
REQUEST_MODEL(JoshCarModel)
WHILE NOT HAS_ANIM_DICT_LOADED("combat@gestures@pistol@halt")
OR NOT HAS_ANIM_DICT_LOADED("combat@gestures@pistol@glances")
OR NOT HAS_MODEL_LOADED(JoshCarModel)
wait(0)
ENDWHILE
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<-1138.32, 299.69, 65.94>>, 5.0, PROP_LRGGATE_01c_L)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(PROP_LRGGATE_01c_L, <<-1138.32, 299.69, 65.94>>, FALSE, 0)
ENDIF
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<-1137.52, 297.02, 65.81>>, 5.0, PROP_LRGGATE_01c_R)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(PROP_LRGGATE_01c_R, <<-1137.053833, 295.585571, 67.180458>>, FALSE, 0)
ENDIF
// Move Josh
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[JOSH])
IF bSkipped = TRUE
SET_ENTITY_COORDS(sRCLauncherDataLocal.pedID[JOSH],<<-1103.9620, 291.3401, 63.3670>>)
SET_ENTITY_HEADING(sRCLauncherDataLocal.pedID[JOSH],193.1737)
TASK_PLAY_ANIM(sRCLauncherDataLocal.pedID[JOSH], "rcmjosh4", "josh_leadout_loop", DEFAULT, DEFAULT, DEFAULT, AF_LOOPING)
ENDIF
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sRCLauncherDataLocal.pedID[JOSH], TRUE)
SET_PED_CAN_BE_TARGETTED(sRCLauncherDataLocal.pedID[JOSH], TRUE)
ENDIF
//Get all cops into position
//INT i
IF bSkipped = TRUE
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[NOTEPAD_COP])
GIVE_WEAPON_TO_PED(sRCLauncherDataLocal.pedID[NOTEPAD_COP],WEAPONTYPE_PISTOL,INFINITE_AMMO,TRUE)
SET_ENTITY_COORDS(sRCLauncherDataLocal.pedID[NOTEPAD_COP], <<-1106.08, 288.55, 63.31>>)
OPEN_SEQUENCE_TASK (seq)
TASK_AIM_GUN_AT_ENTITY(null,PLAYER_PED_ID(),-1, TRUE)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sRCLauncherDataLocal.pedID[NOTEPAD_COP], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sRCLauncherDataLocal.pedID[NOTEPAD_COP],TRUE)
ENDIF
ENDIF
IF bSkipped = TRUE
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[SPEAKER_COP])
GIVE_WEAPON_TO_PED(sRCLauncherDataLocal.pedID[SPEAKER_COP],WEAPONTYPE_PISTOL,INFINITE_AMMO,TRUE)
SET_ENTITY_COORDS(sRCLauncherDataLocal.pedID[SPEAKER_COP], <<-1102.41, 289.73, 63.18>>)
OPEN_SEQUENCE_TASK (seq)
TASK_AIM_GUN_AT_ENTITY(null,PLAYER_PED_ID(),-1, TRUE)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sRCLauncherDataLocal.pedID[SPEAKER_COP], seq)
CLEAR_SEQUENCE_TASK(seq)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sRCLauncherDataLocal.pedID[SPEAKER_COP],TRUE)
ENDIF
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[SPEAKER_COP])
SET_PED_COMBAT_ATTRIBUTES(sRCLauncherDataLocal.pedID[SPEAKER_COP], CA_REQUIRES_LOS_TO_SHOOT, TRUE)
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[NOTEPAD_COP])
SET_PED_COMBAT_ATTRIBUTES(sRCLauncherDataLocal.pedID[NOTEPAD_COP], CA_REQUIRES_LOS_TO_SHOOT, TRUE)
ENDIF
IF IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[JOSH_CAR])
SET_VEHICLE_DOORS_LOCKED(sRCLauncherDataLocal.vehID[JOSH_CAR], VEHICLELOCK_UNLOCKED)
ENDIF
// Add Trevor to the conversation early to avoid nasty asserts
ADD_PED_FOR_DIALOGUE(jConversation, ENUM_TO_INT(CHAR_TREVOR), PLAYER_PED_ID(), "TREVOR")
bDone10SecWarning = FALSE
bCopWait = FALSE
bCopMove = FALSE
bDoJoshComment = FALSE
bCopsDead[0] = FALSE
bCopsDead[1] = FALSE
IF bCopsDead[0]
ENDIF
bCopsShooting = FALSE
m_Cop_State = CE_WAIT
JoshState = JOSH_WATCH
DEBUG_PRINTSTRING("*** End of intro set up")
ENDPROC
/// PURPOSE: State machine for both cop's behaviour after the mocap
PROC Update_GateCops()
INT i
INT n
SWITCH m_Cop_State
CASE CE_WAIT
IF NOT bCopWait
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[SPEAKER_COP])
bCopWait = TRUE
ENDIF
ENDIF
IF NOT bCopMove
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[NOTEPAD_COP])
bCopMove = TRUE
ENDIF
ENDIF
IF (GET_GAME_TIMER() - iShootTimer) > 4000
// Aim after 4 seconds
DEBUG_PRINTSTRING("************************************** TIMEOUT - AIM next frame")
m_Cop_State = CE_AIM
iShootTimer = GET_GAME_TIMER() //Reset the timer to be used again
ENDIF
for i = 1 to COUNT_OF(sRCLauncherDataLocal.pedID)-1
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[i])
IF GET_DISTANCE_BETWEEN_ENTITIES(sRCLauncherDataLocal.pedID[i],PLAYER_PED_ID(),FALSE) > 10.0
DEBUG_PRINTSTRING("************************************** TOO FAR - AIM next frame")
m_Cop_State = CE_AIM
iShootTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDFOR
// [1] Aim
// [2] Move over
// [1] Play an ambient anim?
// if timer > 4 secs, go to CE_AIM
// if player > 7m away, go to CE_AIM
BREAK
CASE CE_AIM
m_Cop_State = CE_AIMWAIT
// Keep aiming at player
BREAK
CASE CE_AIMWAIT
IF (GET_GAME_TIMER() - iShootTimer) > 20000
// Attack after 15 seconds
DEBUG_PRINTSTRING("************************************** TIMEOUT - ARREST next frame")
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[SPEAKER_COP])
CLEAR_PED_TASKS(sRCLauncherDataLocal.pedID[SPEAKER_COP])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sRCLauncherDataLocal.pedID[SPEAKER_COP],FALSE)
TASK_ARREST_PED(sRCLauncherDataLocal.pedID[SPEAKER_COP],PLAYER_PED_ID())
ENDIF
m_Cop_State = CE_ARREST
iShootTimer = GET_GAME_TIMER() //Reset the timer to be used again
ENDIF
for i = 1 to COUNT_OF(sRCLauncherDataLocal.pedID)-1
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[i])
IF GET_DISTANCE_BETWEEN_ENTITIES(sRCLauncherDataLocal.pedID[i],PLAYER_PED_ID(),FALSE) > 12.0
DEBUG_PRINTSTRING("************************************** TOO FAR - ATTACK next frame")
m_Cop_State = CE_ATTACK
iShootTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDFOR
BREAK
CASE CE_ARREST
for i = 1 to COUNT_OF(sRCLauncherDataLocal.pedID)-1
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[i])
IF GET_DISTANCE_BETWEEN_ENTITIES(sRCLauncherDataLocal.pedID[i],PLAYER_PED_ID(),FALSE) > 12.0
DEBUG_PRINTSTRING("************************************** TOO FAR - ATTACK next frame")
m_Cop_State = CE_ATTACK
iShootTimer = GET_GAME_TIMER()
ELSE
IF HAS_PLAYER_THREATENED_PED(sRCLauncherDataLocal.pedID[i])
DEBUG_PRINTSTRING("************************************** THREAT DURING ARREST - ATTACK next frame")
m_Cop_State = CE_ATTACK
iShootTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDFOR
BREAK
CASE CE_ATTACK
ConvState = CONV_STOP // Make sure the warning/taunting conversations don't play
IF NOT bCopsShooting
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, TRUE)
FOR i=1 to COUNT_OF(sRCLauncherDataLocal.pedID)-1
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[i])
CLEAR_PED_TASKS(sRCLauncherDataLocal.pedID[i])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sRCLauncherDataLocal.pedID[i],FALSE)
OPEN_SEQUENCE_TASK (seq)
TASK_SHOOT_AT_ENTITY(null,PLAYER_PED_ID(),-1,FIRING_TYPE_RANDOM_BURSTS)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(sRCLauncherDataLocal.pedID[i], seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ENDFOR
ADD_PED_FOR_DIALOGUE(cConversation, ENUM_TO_INT(CHAR_TREVOR), PLAYER_PED_ID(), "TREVOR")
ADD_PED_FOR_DIALOGUE(cConversation, 3, sRCLauncherDataLocal.pedID[SPEAKER_COP], "JOSHCOP")
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_ANY_CONVERSATION()
ADD_NON_CRITICAL_STANDARD_CONVERSATION_TO_BUFFER(cConversation, "JOSH4AU", "JOSH4COP2", CONV_PRIORITY_MEDIUM)
ELSE
CREATE_CONVERSATION(cConversation, "JOSH4AU", "JOSH4COP2", CONV_PRIORITY_MEDIUM)
ENDIF
DEBUG_PRINTSTRING("Doing cop fire warning")
bCopsShooting = TRUE
iCopReleaseTimer = GET_GAME_TIMER()
ELSE
FOR n=1 to COUNT_OF(sRCLauncherDataLocal.pedID)-1
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[n])
IF GET_DISTANCE_BETWEEN_ENTITIES(sRCLauncherDataLocal.pedID[n], PLAYER_PED_ID()) > 20
SET_PED_ACCURACY(sRCLauncherDataLocal.pedID[n], 75)
ELSE
SET_PED_ACCURACY(sRCLauncherDataLocal.pedID[n], 1)
ENDIF
ENDIF
ENDFOR
IF (GET_GAME_TIMER() - iCopReleaseTimer) > 15000
FOR n=1 to COUNT_OF(sRCLauncherDataLocal.pedID)-1
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[n])
IF GET_DISTANCE_BETWEEN_ENTITIES(sRCLauncherDataLocal.pedID[n], PLAYER_PED_ID()) >= 50
SAFE_RELEASE_PED(sRCLauncherDataLocal.pedID[n], FALSE, TRUE)
ENDIF
ENDIF
ENDFOR
ELSE
FOR n=1 to COUNT_OF(sRCLauncherDataLocal.pedID)-1
IF NOT IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[n])
IF n = 1
bCopsDead[0] = TRUE
ELIF n = 2
bCopsDead[1] = TRUE
ENDIF
ENDIF
ENDFOR
ENDIF
ENDIF
// Give attack order
// Play dialogue
// Release peds
// Turn on dispatch
BREAK
ENDSWITCH
IF m_Cop_State != CE_ATTACK // Don't want to keep checking these over and over when the player breaks one of these 'rules' and the cops are already attacking
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
DEBUG_PRINTSTRING("************************************** VEHICLE - ATTACK now")
m_Cop_State = CE_ATTACK
ENDIF
ENDIF
FOR i=1 to COUNT_OF(sRCLauncherDataLocal.pedID)-1
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[i])
IF IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sRCLauncherDataLocal.pedID[i])
WEAPON_TYPE tempWT = WEAPONTYPE_UNARMED
IF NOT GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), tempWT) //wType <> WEAPONTYPE_UNARMED
DEBUG_PRINTSTRING("************************************** AIMED WEAPON - ATTACK now")
m_Cop_State = CE_ATTACK
ENDIF
ENDIF
IF HAS_PLAYER_THREATENED_PED(sRCLauncherDataLocal.pedID[i])
DEBUG_PRINTSTRING("************************************** ATTACKED/THREATENED - ATTACK now")
m_Cop_State = CE_ATTACK
ENDIF
IF m_Cop_State != CE_ARREST // Don't care about Trevor being too close if they're trying to arrest him
IF GET_DISTANCE_BETWEEN_ENTITIES(sRCLauncherDataLocal.pedID[i],PLAYER_PED_ID(),FALSE) < 2.3
DEBUG_PRINTSTRING("************************************** TOO CLOSE - ATTACK now")
m_Cop_State = CE_ATTACK
ENDIF
ENDIF
ENDIF
ENDFOR
ENDIF
ENDPROC
/// PURPOSE: State machine for the scripted cop car that spawns as you run away
PROC Update_AI_CopCars()
SWITCH (m_AI_FleeCar.mState)
CASE RC_AIC_LOAD
for iFlee = 0 to (MAX_FLEE_DIRECTIONS-1)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), FleeTrigger[iFlee].vec1, FleeTrigger[iFlee].vec2, FleeTrigger[iFlee].width, FALSE, TRUE, TM_IN_VEHICLE)
DEBUG_PRINTSI("Player detected inside flee direction trigger: ", iFlee)
REQUEST_MODEL(cop_car_model)
REQUEST_MODEL(cop_model)
m_AI_FleeCar.vStartPos = vCopCarRushPos[iFlee]
m_AI_FleeCar.Qx = qFleeQuats[iFlee].Qx
m_AI_FleeCar.Qy = qFleeQuats[iFlee].Qy
m_AI_FleeCar.Qz = qFleeQuats[iFlee].Qz
m_AI_FleeCar.Qw = qFleeQuats[iFlee].Qw
switch iFlee
CASE 0 m_AI_FleeCar.iRecNum = 000 break
CASE 1 m_AI_FleeCar.iRecNum = 001 break
CASE 2 m_AI_FleeCar.iRecNum = 002 break
CASE 3 m_AI_FleeCar.iRecNum = 003 break
CASE 4 m_AI_FleeCar.iRecNum = 004 break
ENDSWITCH
DEBUG_PRINTSI("iFlee value is: ", iFlee)
DEBUG_PRINTSTRING("Requesting flee recording: ") DEBUG_PRINTSI(m_AI_FleeCar.sRecName, m_AI_FleeCar.iRecNum)
REQUEST_VEHICLE_RECORDING(m_AI_FleeCar.iRecNum,m_AI_FleeCar.sRecName)
WHILE NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(m_AI_FleeCar.iRecNum,m_AI_FleeCar.sRecName)
OR NOT HAS_MODEL_LOADED(cop_car_model)
OR NOT HAS_MODEL_LOADED(cop_model)
WAIT(0)
ENDWHILE
DEBUG_PRINTSTRING("Flee car has loaded!")
m_AI_FleeCar.mState = RC_AIC_CREATE
ENDIF
ENDFOR
BREAK
CASE RC_AIC_CREATE
IF NOT DOES_ENTITY_EXIST(m_AI_FleeCar.iIndex)
m_AI_FleeCar.iIndex = CREATE_VEHICLE(cop_car_model,m_AI_FleeCar.vStartPos)
SET_VEHICLE_ON_GROUND_PROPERLY(m_AI_FleeCar.iIndex)
SET_ENTITY_QUATERNION(m_AI_FleeCar.iIndex,m_AI_FleeCar.Qx,m_AI_FleeCar.Qy,m_AI_FleeCar.Qz,m_AI_FleeCar.Qw)
m_AI_FleeCar.mCopsInCar = CREATE_PED_INSIDE_VEHICLE(m_AI_FleeCar.iIndex,PEDTYPE_COP,cop_model,VS_DRIVER)
GIVE_WEAPON_TO_PED(m_AI_FleeCar.mCopsInCar,WEAPONTYPE_PISTOL,INFINITE_AMMO,FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(m_AI_FleeCar.mCopsInCar,TRUE)
CLEAR_PED_TASKS(m_AI_FleeCar.mCopsInCar)
DEBUG_PRINTSTRING("Flee car created!")
m_AI_FleeCar.mState = RC_AIC_START_REC
ENDIF
BREAK
CASE RC_AIC_START_REC
IF IS_VEHICLE_OK(m_AI_FleeCar.iIndex)
IF IS_ENTITY_ALIVE(m_AI_FleeCar.mCopsInCar)
IF IS_PED_IN_ANY_VEHICLE(m_AI_FleeCar.mCopsInCar)
START_PLAYBACK_RECORDED_VEHICLE(m_AI_FleeCar.iIndex, m_AI_FleeCar.iRecNum, m_AI_FleeCar.sRecName)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(m_AI_FleeCar.iIndex)
DEBUG_PRINTSI("*** m_AI_FleeCar.iRecNum: ", m_AI_FleeCar.iRecNum)
switch m_AI_FleeCar.iRecNum
CASE 0 SET_PLAYBACK_SPEED(m_AI_FleeCar.iIndex,1.5) break
CASE 1 SET_PLAYBACK_SPEED(m_AI_FleeCar.iIndex,1) break
CASE 2 SET_PLAYBACK_SPEED(m_AI_FleeCar.iIndex,1.4) break
CASE 3 SET_PLAYBACK_SPEED(m_AI_FleeCar.iIndex,1.5) break
CASE 4 SET_PLAYBACK_SPEED(m_AI_FleeCar.iIndex,1.5) break
ENDSWITCH
DEBUG_PRINTSTRING("Flee car playing!")
m_AI_FleeCar.mState = RC_AIC_UPDATE_REC
ENDIF
ENDIF
ENDIF
BREAK
CASE RC_AIC_UPDATE_REC
IF IS_VEHICLE_OK(m_AI_FleeCar.iIndex)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(m_AI_FleeCar.iIndex)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(m_AI_FleeCar.iRecNum,m_AI_FleeCar.sRecName)
REMOVE_VEHICLE_RECORDING(m_AI_FleeCar.iRecNum,m_AI_FleeCar.sRecName)
DEBUG_PRINTSTRING("Flee car recording finished!")
m_AI_FleeCar.mState = RC_AIC_END_REC
ENDIF
ELSE
switch m_AI_FleeCar.iRecNum
CASE 0 SET_PLAYBACK_SPEED(m_AI_FleeCar.iIndex,1.5) break
CASE 1 SET_PLAYBACK_SPEED(m_AI_FleeCar.iIndex,1) break
CASE 2 SET_PLAYBACK_SPEED(m_AI_FleeCar.iIndex,1.4) break
CASE 3 SET_PLAYBACK_SPEED(m_AI_FleeCar.iIndex,1.5) break
CASE 4 SET_PLAYBACK_SPEED(m_AI_FleeCar.iIndex,1.5) break
ENDSWITCH
ENDIF
ENDIF
BREAK
CASE RC_AIC_END_REC
IF IS_VEHICLE_OK(m_AI_FleeCar.iIndex)
IF IS_ENTITY_ALIVE(m_AI_FleeCar.mCopsInCar)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(m_AI_FleeCar.mCopsInCar,FALSE)
SAFE_RELEASE_PED(m_AI_FleeCar.mCopsInCar)
ENDIF
m_AI_FleeCar.mState = RC_AIC_FINISHED
SAFE_RELEASE_VEHICLE(m_AI_FleeCar.iIndex)
ENDIF
DEBUG_PRINTSTRING("Flee car & ped released!")
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE: Main process to handle Josh's behaviour during the mission
PROC Update_Josh()
SWITCH JoshState
CASE JOSH_WATCH
IF m_Cop_State = CE_ATTACK
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[JOSH])
CLEAR_PED_TASKS(sRCLauncherDataLocal.pedID[JOSH])
IF IS_VEHICLE_OK(viJoshCar)
IF IS_POSITION_OCCUPIED(<<-1138.421265,298.030731,65.900322>>, 4.0, FALSE, TRUE, FALSE, FALSE, FALSE, viJoshCar)
DEBUG_PRINTSTRING("Back gate blocked")
vRC_runToPoint = <<-1130.35, 307.92, 65.19>>
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL,vRC_runToPoint,PEDMOVE_RUN, DEFAULT, 1.0, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL,<<-1126.56, 319.85, 65.98>>,PEDMOVE_RUN, DEFAULT, 1.0, ENAV_NO_STOPPING)
TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 500, -1)
CLOSE_SEQUENCE_TASK(seq)
SET_PED_KEEP_TASK(sRCLauncherDataLocal.pedID[JOSH], TRUE)
TASK_PERFORM_SEQUENCE(sRCLauncherDataLocal.pedID[JOSH], seq)
ELSE
DEBUG_PRINTSTRING("Back gate clear")
OPEN_SEQUENCE_TASK(seq)
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL,vRC_runToPoint,PEDMOVE_RUN, DEFAULT, 1.0, ENAV_NO_STOPPING)
IF IS_VEHICLE_OK(viJoshCar)
//TASK_ENTER_VEHICLE(NULL, viJoshCar)
TASK_VEHICLE_MISSION_PED_TARGET(NULL, viJoshCar, PLAYER_PED_ID(), MISSION_FLEE, 30, DRIVINGMODE_AVOIDCARS, 500, 0.1, TRUE)
ELSE
TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 500, -1)
ENDIF
CLOSE_SEQUENCE_TASK(seq)
SET_PED_KEEP_TASK(sRCLauncherDataLocal.pedID[JOSH], TRUE)
TASK_PERFORM_SEQUENCE(sRCLauncherDataLocal.pedID[JOSH], seq)
ENDIF
ELSE
DEBUG_PRINTSTRING("Josh car not ok - do Josh flee anyway")
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL,vRC_runToPoint,PEDMOVE_RUN, DEFAULT, 1.0, ENAV_NO_STOPPING)
IF IS_VEHICLE_OK(viJoshCar)
TASK_ENTER_VEHICLE(NULL, viJoshCar)
TASK_VEHICLE_MISSION_PED_TARGET(NULL, viJoshCar, PLAYER_PED_ID(), MISSION_FLEE, 30, DRIVINGMODE_AVOIDCARS, 500, 0.1, TRUE)
ELSE
TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 500, -1)
ENDIF
CLOSE_SEQUENCE_TASK(seq)
SET_PED_KEEP_TASK(sRCLauncherDataLocal.pedID[JOSH], TRUE)
TASK_PERFORM_SEQUENCE(sRCLauncherDataLocal.pedID[JOSH], seq)
ENDIF
SET_PED_FLEE_ATTRIBUTES(sRCLauncherDataLocal.pedID[JOSH], FA_USE_VEHICLE, TRUE)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
iJoshFleeConvoTimer = GET_GAME_TIMER()
SET_PED_CAN_BE_DRAGGED_OUT(sRCLauncherDataLocal.pedID[JOSH], TRUE)
SET_PED_CONFIG_FLAG(sRCLauncherDataLocal.pedID[JOSH], PCF_PedsJackingMeDontGetIn, TRUE)
JoshState = JOSH_FLEE
ENDIF
BREAK
CASE JOSH_FLEE
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[JOSH])
// If either of the cops die, make Josh comment about their deaths if the player's close enough
IF NOT bDoJoshComment
IF bCopsDead[0] OR bCopsDead[1]
IF GET_DISTANCE_BETWEEN_ENTITIES(sRCLauncherDataLocal.pedID[JOSH],PLAYER_PED_ID(),FALSE) < 20.0
ADD_PED_FOR_DIALOGUE(jConversation, ENUM_TO_INT(CHAR_TREVOR), PLAYER_PED_ID(), "TREVOR")
ADD_PED_FOR_DIALOGUE(jConversation, 4, sRCLauncherDataLocal.pedID[JOSH], "JOSH")
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_ANY_CONVERSATION()
ADD_NON_CRITICAL_STANDARD_CONVERSATION_TO_BUFFER(jConversation, "JOSH4AU", "JOSH4COP3", CONV_PRIORITY_VERY_HIGH)
ELSE
CREATE_CONVERSATION(jConversation, "JOSH4AU", "JOSH4COP3", CONV_PRIORITY_VERY_HIGH)
ENDIF
DEBUG_PRINTSTRING("Doing Josh comment")
ELSE
DEBUG_PRINTSTRING("Too far away to do Josh comment")
ENDIF
bDoJoshComment = TRUE
ENDIF
ENDIF
IF IS_VEHICLE_OK(viJoshCar)
// If Josh's car's engine health gets too low, make him flee on foot
IF IS_PED_IN_VEHICLE(sRCLauncherDataLocal.pedID[JOSH], viJoshCar, TRUE)
IF GET_VEHICLE_ENGINE_HEALTH(viJoshCar) < 20
CLEAR_PED_TASKS(sRCLauncherDataLocal.pedID[JOSH])
TASK_LEAVE_ANY_VEHICLE(sRCLauncherDataLocal.pedID[JOSH], 0, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP|ECF_DONT_CLOSE_DOOR|ECF_JUMP_OUT)
TASK_SMART_FLEE_PED(sRCLauncherDataLocal.pedID[JOSH], PLAYER_PED_ID(), 510, -1)
SAFE_RELEASE_VEHICLE(viJoshCar)
ENDIF
ENDIF
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viJoshCar, TRUE)
CLEAR_PED_TASKS(sRCLauncherDataLocal.pedID[JOSH])
TASK_SMART_FLEE_PED(sRCLauncherDataLocal.pedID[JOSH], PLAYER_PED_ID(), 510, -1)
SAFE_RELEASE_VEHICLE(viJoshCar)
ENDIF
ENDIF
// If Trevor jacks Josh, make him flee on foot
IF IS_PED_BEING_JACKED(sRCLauncherDataLocal.pedID[JOSH])
IF bDoneJoshJackingConv = FALSE
IF CREATE_CONVERSATION(jConversation, "JOSH4AU", "JOSH4BEGS", CONV_PRIORITY_VERY_HIGH)
bDoneJoshJackingConv = TRUE
ENDIF
ENDIF
CLEAR_PED_TASKS(sRCLauncherDataLocal.pedID[JOSH])
SAFE_RELEASE_VEHICLE(viJoshCar)
TASK_SMART_FLEE_PED(sRCLauncherDataLocal.pedID[JOSH], PLAYER_PED_ID(), 510, -1)
ENDIF
ENDIF
// If Josh gets 500m away from Trevor, consider him to have gotten away
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[JOSH]) > 350
DEBUG_PRINTSTRING("Deleting Josh, setting as lost")
SAFE_DELETE_PED(sRCLauncherDataLocal.pedID[JOSH])
SAFE_DELETE_VEHICLE(viJoshCar)
JoshState = JOSH_LOST
ENDIF
// Do Josh's flee dialogue if the player is following them closely in a car
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
AND IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[JOSH])
IF iJoshFleeConvoCount < 3
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[JOSH]) < 10
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND (GET_GAME_TIMER() - iJoshFleeConvoTimer) > 8000
IF CREATE_CONVERSATION(jConversation, "JOSH4AU", "JOSH4CHASE", CONV_PRIORITY_VERY_HIGH)
iJoshFleeConvoCount++
iJoshFleeConvoTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sRCLauncherDataLocal.pedID[JOSH], PLAYER_PED_ID())
REPLAY_RECORD_BACK_FOR_TIME(2.0, 2.0, REPLAY_IMPORTANCE_LOWEST) // Record 2 seconds before Josh died to try and capture the kill
DEBUG_PRINTSTRING("Player killed Josh!")
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(JO4_JOSH_KILLED_BEFORE_ESCAPE)
ENDIF
// Josh has died - likely at Trevor's hands
DEBUG_PRINTSTRING("Josh - DEAD!")
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_ANY_CONVERSATION()
ENDIF
IF CREATE_CONVERSATION(jConversation, "JOSH4AU", "JOSH4KILL", CONV_PRIORITY_VERY_HIGH)
JoshState = JOSH_DEAD
ENDIF
ENDIF
BREAK
CASE JOSH_LOST
// Nothing to do, Josh got away
BREAK
CASE JOSH_DEAD
// Nothing to do, Josh is dead
BREAK
ENDSWITCH
ENDPROC
PROC HANDLE_POLICE_REPORT()
IF bDonePoliceReport = FALSE
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<-1116.62, 299.12, 64.96>>) > 50.0
PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_JOSH_4_01", 0.0)
DEBUG_PRINTSTRING("*** Played special Josh 4 police report ***")
bDonePoliceReport = TRUE
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Handle triggering Trevor's rant to himself as the player escapes
PROC Rant_During_Escape()
IF iRantProgress = 0
// Don't trigger Trevor's rant while he's still around the house
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1208.580688,309.849396,80.691895>>, <<-1041.644897,319.581085,60.402634>>, 178.500000)
WHILE IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION()
wait(0)
ENDWHILE
ADD_PED_FOR_DIALOGUE(jConversation, ENUM_TO_INT(CHAR_TREVOR), PLAYER_PED_ID(), "TREVOR")
ADD_PED_FOR_DIALOGUE(jConversation, 4, sRCLauncherDataLocal.pedID[JOSH], "JOSH")
iTrevRantTimer = GET_GAME_TIMER()
iRantProgress++
ENDIF
ELIF IRantProgress = 1
IF JoshState <> JOSH_WATCH // Make sure Trevor doesn't say any of this if Josh is watching, just in case
IF (GET_GAME_TIMER() - iTrevRantTimer) > 6000
IF JoshState = JOSH_DEAD
// Do the calm "why did I help him" comment if Josh is dead
CREATE_CONVERSATION(jConversation, "JOSH4AU", "JOSH4CAR2", CONV_PRIORITY_VERY_HIGH)
ELIF JoshState = JOSH_FLEE
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[JOSH])
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[JOSH]) < 75
// If the player is <75m away from Josh (thus could potentially be chasing him), play the 'chase down' dialogue
CREATE_CONVERSATION(jConversation, "JOSH4AU", "JOSH4CAR3", CONV_PRIORITY_VERY_HIGH)
ELSE
// Otherwise do the "You can't hide forever" line if Josh is still alive but Trevor may not know where he is
CREATE_CONVERSATION(jConversation, "JOSH4AU", "JOSH4CAR1", CONV_PRIORITY_VERY_HIGH)
ENDIF
ENDIF
ELIF JoshState = JOSH_LOST
// Do the "You can't hide forever" line if Josh 'got away'
CREATE_CONVERSATION(jConversation, "JOSH4AU", "JOSH4CAR1", CONV_PRIORITY_VERY_HIGH)
ENDIF
iRantProgress++
ENDIF
ENDIF
ENDIF
ENDPROC
// ===========================================================================================================
// Termination
// ===========================================================================================================
// -----------------------------------------------------------------------------------------------------------
// Script Cleanup
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE: release everything and terminate the script
PROC Script_Cleanup()
// Ensure launcher is terminated
RC_CLEANUP_LAUNCHER()
CLEAR_PRINTS()
// If the mission was triggered then additional mission cleanup will be required.
IF (Random_Character_Cleanup_If_Triggered())
DEBUG_PRINTSTRING("...Random Character Script was triggered so additional cleanup required")
ENDIF
INT i
FOR i=1 to COUNT_OF(sRCLauncherDataLocal.pedID)-1
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[i])
SAFE_RELEASE_PED(sRCLauncherDataLocal.pedID[i], TRUE, FALSE)
ENDIF
ENDFOR
SAFE_RELEASE_PED(sRCLauncherDataLocal.pedID[JOSH])
FOR i = 0 to COUNT_OF(sRCLauncherDataLocal.vehID)-1
SAFE_RELEASE_VEHICLE(sRCLauncherDataLocal.vehID[i])
ENDFOR
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
CLEAR_PED_NON_CREATION_AREA()
SET_PED_PATHS_BACK_TO_ORIGINAL(<< -1140.2233, 271.7450, 50 >>, << -1082.4034, 344.8568, 80 >>)
//Cleanup the scene created by the launcher
RC_CleanupSceneEntities(sRCLauncherDataLocal)
//Release any requested models
SET_MODEL_AS_NO_LONGER_NEEDED(cop_car_model)
SET_MODEL_AS_NO_LONGER_NEEDED(cop_model)
TERMINATE_THIS_THREAD()
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Script Pass
// -----------------------------------------------------------------------------------------------------------
PROC Script_Passed()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
TRIGGER_MUSIC_EVENT("JOSH4_COPS_LOST_RADIO")
DEBUG_PRINTSTRING("Starting 'JOSH4_COPS_LOST_RADIO'")
ELSE
TRIGGER_MUSIC_EVENT("JOSH4_COPS_LOST")
DEBUG_PRINTSTRING("Starting 'JOSH4_COPS_LOST'")
ENDIF
ELSE
TRIGGER_MUSIC_EVENT("JOSH4_COPS_LOST")
DEBUG_PRINTSTRING("Player is somehow not alive when passing the mission - starting 'JOSH4_COPS_LOST'")
ENDIF
Random_Character_Passed(CP_RAND_C_JOS4)
Script_Cleanup()
ENDPROC
// ===========================================================================================================
// DEBUG
// ===========================================================================================================
/// PURPOSE: Reset the scene back to default so we can cleanly play the intro again
PROC Reset_Scene()
bDone10SecWarning = FALSE
bCopMove = FALSE
m_Cop_State = CE_WAIT
JoshState = JOSH_WATCH
ConvState = CONV_START
bDoCopConv = TRUE
bDoJoshComment = FALSE
bLeadInPlayed = FALSE
bDonePoliceReport = FALSE
iRantProgress = 0
REQUEST_MODEL(cop_model)
REQUEST_MODEL(cop_car_model)
//-------------------------------------------------------------
// Create random character
//-------------------------------------------------------------
SAFE_DELETE_PED(sRCLauncherDataLocal.pedID[JOSH])
WHILE NOT RC_CREATE_NPC_PED(sRCLauncherDataLocal.pedID[JOSH], CHAR_JOSH, <<-1103.60, 290.81, 64.32>>, -99.24, "JOSH")
WAIT(0)
ENDWHILE
WHILE NOT HAS_MODEL_LOADED(cop_model)
WAIT(0)
ENDWHILE
// First cop
SAFE_DELETE_PED(sRCLauncherDataLocal.pedID[SPEAKER_COP])
sRCLauncherDataLocal.pedID[SPEAKER_COP] = CREATE_PED(PEDTYPE_COP, cop_model, <<-1102.92, 290.12,/*64.25*/INVALID_WORLD_Z>>, 40.46, FALSE, FALSE)
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[SPEAKER_COP])
SET_PED_DEFAULT_COMPONENT_VARIATION(sRCLauncherDataLocal.pedID[SPEAKER_COP])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sRCLauncherDataLocal.pedID[SPEAKER_COP],true)
GIVE_WEAPON_TO_PED(sRCLauncherDataLocal.pedID[SPEAKER_COP], WEAPONTYPE_PISTOL, -1, FALSE)
ENDIF
//Second Cop
SAFE_DELETE_PED(sRCLauncherDataLocal.pedID[NOTEPAD_COP])
sRCLauncherDataLocal.pedID[NOTEPAD_COP] = CREATE_PED(PEDTYPE_COP, cop_model, <<-1102.73, 290.91,/*64.35*/INVALID_WORLD_Z>>, 92.06, FALSE, FALSE)
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[NOTEPAD_COP])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sRCLauncherDataLocal.pedID[NOTEPAD_COP], TRUE)
GIVE_WEAPON_TO_PED(sRCLauncherDataLocal.pedID[NOTEPAD_COP], WEAPONTYPE_PISTOL, -1, FALSE)
ENDIF
// have the models loaded
WHILE NOT HAS_MODEL_LOADED(cop_car_model)
WAIT(0)
ENDWHILE
//Cop car outside gate
SAFE_DELETE_VEHICLE(sRCLauncherDataLocal.vehID[COP_CAR])
sRCLauncherDataLocal.vehID[COP_CAR] = CREATE_VEHICLE(cop_car_model,<<-1107.50, 280.33, 64.01>>, 97.97)
IF IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[COP_CAR])
SET_VEHICLE_ON_GROUND_PROPERLY(sRCLauncherDataLocal.vehID[COP_CAR])
ENDIF
ENDPROC
/// PURPOSE: Set the mission's new state
PROC SetState(RC_MainState in)
m_state = in
m_subState = SS_Setup
ENDPROC
/// PURPOSE: Jump ahead straight to the Escape The Cops stage
PROC Jump_To_Escape()
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[SPEAKER_COP])
SET_ENTITY_COORDS_NO_OFFSET(sRCLauncherDataLocal.pedID[SPEAKER_COP], <<-1102.48,290.20,64.22>>)
SET_ENTITY_HEADING(sRCLauncherDataLocal.pedID[SPEAKER_COP], 177.74)
ELSE
sRCLauncherDataLocal.pedID[SPEAKER_COP] = CREATE_PED(PEDTYPE_COP, cop_model, <<-1102.92, 290.12,/*64.25*/INVALID_WORLD_Z>>, 40.46, FALSE, FALSE)
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[NOTEPAD_COP])
SET_ENTITY_COORDS_NO_OFFSET(sRCLauncherDataLocal.pedID[NOTEPAD_COP], <<-1103.94,290.21,64.28>>)
SET_ENTITY_HEADING(sRCLauncherDataLocal.pedID[NOTEPAD_COP], -167.67)
ELSE
sRCLauncherDataLocal.pedID[NOTEPAD_COP] = CREATE_PED(PEDTYPE_COP, cop_model, <<-1102.73, 290.91,/*64.35*/INVALID_WORLD_Z>>, 92.06, FALSE, FALSE)
ENDIF
//Get player into position
IF NOT IS_REPLAY_BEING_SET_UP()
SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vPlayerPosAfterIntro, fPlayerHeadAfterIntro, TRUE)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
ENDIF
SetupEndOfIntro(TRUE)
REQUEST_MODEL(JoshCarModel)
WHILE NOT HAS_MODEL_LOADED(JoshCarModel)
WAIT(0)
ENDWHILE
SetState(RC_ESCAPE_COPS)
// Return script systems to normal.
IF NOT IS_REPLAY_BEING_SET_UP()
RC_END_CUTSCENE_MODE()
ENDIF
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
ENDIF
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, FALSE)
// Going to reset all of these here, to try and ensure that restarting after dying won't make the cops shoot you immediately
bDone10SecWarning = FALSE
bCopMove = FALSE
m_Cop_State = CE_WAIT
iJoshFleeConvoCount = 0
IF Is_Replay_In_Progress()
// Do the gate stuff again just in case the replay failed far enough away for these to have not worked
IF NOT OPEN_FRONT_GATES(FALSE)
CPRINTLN(DEBUG_MISSION, "Josh4: Front gates say they haven't opened...")
ELSE
CPRINTLN(DEBUG_MISSION, "Josh4: Front gates opened")
ENDIF
IF NOT CLOSE_REAR_GATES()
CPRINTLN(DEBUG_MISSION, "Josh4: Rear gates say they haven't closed...")
ELSE
CPRINTLN(DEBUG_MISSION, "Josh4: Rear gates closed")
ENDIF
IF IS_REPLAY_BEING_SET_UP()
END_REPLAY_SETUP()
ENDIF
RC_END_Z_SKIP()
ENDIF
ENDPROC
#IF IS_DEBUG_BUILD
/// PURPOSE: Check for Forced Pass or Fail
PROC DEBUG_Check_Debug_Keys()
// Check for Pass
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
WAIT_FOR_CUTSCENE_TO_STOP()
CLEAR_PRINTS()
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[SPEAKER_COP])
CLEAR_PED_TASKS(sRCLauncherDataLocal.pedID[SPEAKER_COP])
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[NOTEPAD_COP])
CLEAR_PED_TASKS(sRCLauncherDataLocal.pedID[NOTEPAD_COP])
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[JOSH])
CLEAR_PED_TASKS(sRCLauncherDataLocal.pedID[JOSH])
ENDIF
Script_Passed()
ENDIF
// Check for Fail
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
WAIT_FOR_CUTSCENE_TO_STOP()
CLEAR_PRINTS()
Random_Character_Failed()
Script_Cleanup()
ENDIF
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J))
WAIT_FOR_CUTSCENE_TO_STOP()
CLEAR_PRINTS()
IF m_state = RC_INTRO
Jump_To_Escape()
ELSE
Script_Passed()
ENDIF
ENDIF
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P))
WAIT_FOR_CUTSCENE_TO_STOP()
CLEAR_PRINTS()
Reset_Scene()
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
// We're going to run the intro cutscene again
SetState(RC_INTRO)
ENDIF
IF LAUNCH_MISSION_STAGE_MENU(mSkipMenu, menu_option)
IF menu_option = 2
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[JOSH])
APPLY_DAMAGE_TO_PED(sRCLauncherDataLocal.pedID[JOSH], 1000, TRUE)
ENDIF
EXIT
ENDIF
RC_START_Z_SKIP()
WAIT_FOR_CUTSCENE_TO_STOP()
CLEAR_PRINTS()
IF menu_option = 0
Reset_Scene()
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
// We're going to run the intro cutscene again
SetState(RC_INTRO)
ELIF menu_option = 1
Jump_To_Escape()
ENDIF
RC_END_Z_SKIP()
ENDIF
ENDPROC
#ENDIF
PROC STATE_Leadin()
// Disable controls and exit current vehicle
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
// If we re-requested the cutscene (we probably did), this will ensure the cop variations get set properly
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[SPEAKER_COP])
DEBUG_PRINTSTRING("Trying to set Cop 1 component variation (leadin loop)")
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Cop_standing_idle", sRCLauncherDataLocal.pedID[SPEAKER_COP])
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[NOTEPAD_COP])
DEBUG_PRINTSTRING("Trying to set Cop 2 component variation (leadin loop)")
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Cop_with_notepad", sRCLauncherDataLocal.pedID[NOTEPAD_COP])
ENDIF
ENDIF
SWITCH m_SubState
CASE SS_Setup
IF NOT IS_REPEAT_PLAY_ACTIVE()
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1107.352905,281.626038,61.464512>>, <<-1099.520508,282.507324,65.992226>>, 16.0)
DEBUG_PRINTSTRING("Doing setup for leadin")
ADD_PED_FOR_DIALOGUE(jConversation, 4, sRCLauncherDataLocal.pedID[JOSH], "JOSH")
ADD_PED_FOR_DIALOGUE(jConversation, 2, PLAYER_PED_ID(), "TREVOR")
REQUEST_ANIM_DICT("rcmjosh4")
IF HAS_ANIM_DICT_LOADED("rcmjosh4")
m_SubState = SS_Update
ENDIF
ELSE
DEBUG_PRINTSTRING("Skipping setup for leadin (repeat play/wrong area)")
SetState(RC_INTRO)
ENDIF
BREAK
CASE SS_Update
IF NOT IS_REPEAT_PLAY_ACTIVE() // Don't do the leadin if we're on a repeat-play, just go into the cutscene
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1107.352905,281.626038,61.464512>>, <<-1099.520508,282.507324,65.992226>>, 16.0)
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
AND IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[JOSH])
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1105.570923,290.008026,62.871758>>, <<-1100.577393,290.429840,66.452118>>, 4.50)
IF NOT IS_PLAYER_IN_FIRST_PERSON_CAMERA()
IF NOT IsPedPerformingTask(PLAYER_PED_ID(), SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY)
TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[JOSH])
ENDIF
ELSE
RC_DISABLE_CONTROL_ACTIONS_FOR_LEAD_IN()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MOVE_LR)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MOVE_UD)
CLEAR_PED_TASKS(PLAYER_PED_ID())
ENDIF
ENDIF
ENDIF
IF NOT bLeadInPlayed
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[JOSH])
IF IS_ENTITY_PLAYING_ANIM(sRCLauncherDataLocal.pedID[JOSH], "rcmjosh4","beckon_a_josh") // Make sure Josh is playing the idle anim
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // Allow the conversation line to end before playing the lead-in
//IF GET_ENTITY_ANIM_CURRENT_TIME(sRCLauncherDataLocal.pedID[JOSH], "rcmjosh4", "beckon_a_josh") <0.02 // Only start playing the leadin anims when Josh won't pop
TASK_PLAY_ANIM(sRCLauncherDataLocal.pedID[JOSH], "rcmjosh4", "josh_4_leadin_josh", REALLY_SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME)
DEBUG_PRINTSTRING("Done Josh leadin anim")
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[NOTEPAD_COP])
TASK_PLAY_ANIM(sRCLauncherDataLocal.pedID[NOTEPAD_COP], "rcmjosh4", "josh_4_leadin_cop_a", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME)
DEBUG_PRINTSTRING("Done Notepad cop leadin anim")
ENDIF
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[SPEAKER_COP])
TASK_PLAY_ANIM(sRCLauncherDataLocal.pedID[SPEAKER_COP], "rcmjosh4", "josh_4_leadin_cop_b", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME)
DEBUG_PRINTSTRING("Done Speaker cop leadin anim")
ENDIF
REMOVE_CUTSCENE()
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("JOSH_4_INT_CONCAT", CS_SECTION_2) // Request the concatinated version of the cutscene for the leadin instead
bLeadInPlayed = TRUE
//ENDIF
ENDIF
ENDIF
ELSE
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
AND IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[JOSH])
AND NOT IS_PLAYER_IN_FIRST_PERSON_CAMERA()
IF NOT IsPedPerformingTask(PLAYER_PED_ID(), SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY)
TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[JOSH])
ENDIF
ENDIF
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[JOSH])
IF IS_ENTITY_PLAYING_ANIM(sRCLauncherDataLocal.pedID[JOSH], "rcmjosh4", "josh_4_leadin_josh")
// Comment back in when lead-in convo has been made
IF GET_ENTITY_ANIM_CURRENT_TIME(sRCLauncherDataLocal.pedID[JOSH], "rcmjosh4", "josh_4_leadin_josh") > 0.276
IF bLeadinConvo = FALSE
IF CREATE_CONVERSATION(jConversation, "JOSH4AU", "JOSH_4_INTLI", CONV_PRIORITY_VERY_HIGH)
REPLAY_RECORD_BACK_FOR_TIME(2.0, 3, REPLAY_IMPORTANCE_LOW)
bLeadinConvo = TRUE
ENDIF
ENDIF
ENDIF
IF GET_ENTITY_ANIM_CURRENT_TIME(sRCLauncherDataLocal.pedID[JOSH], "rcmjosh4", "josh_4_leadin_josh") > 0.98
SetState(RC_INTRO)
ENDIF
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[JOSH]) <= 2.0
// Kill the leadin convo early if it's started
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
DEBUG_PRINTSTRING("Player too close to Josh, starting cutscene early")
SetState(RC_INTRO)
ENDIF
ELSE
SetState(RC_INTRO)
ENDIF
ENDIF
ENDIF
ELSE
SetState(RC_INTRO)
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE: Main intro cutscene state
PROC STATE_IntroCutscene()
HANDLE_MUSIC()
// If we re-requested the cutscene (we probably did), this will ensure the cop variations get set properly
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[SPEAKER_COP])
DEBUG_PRINTSTRING("Trying to set Cop 1 component variation (intro loop)")
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Cop_standing_idle", sRCLauncherDataLocal.pedID[SPEAKER_COP])
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[NOTEPAD_COP])
DEBUG_PRINTSTRING("Trying to set Cop 2 component variation (intro loop)")
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Cop_with_notepad", sRCLauncherDataLocal.pedID[NOTEPAD_COP])
ENDIF
ENDIF
SWITCH m_subState
CASE SS_Setup
IF NOT ARE_STRINGS_EQUAL(g_CutsceneName , "")
IF bLeadInPlayed = FALSE // If we haven't played the lead-in, just make sure the full cutscene is definitely loaded
RC_REQUEST_CUTSCENE(g_CutsceneName)
ENDIF
iCutsceneProgress = 0
m_subState = SS_Update
ELSE
SetupEndOfIntro()
SetState(RC_ESCAPE_COPS)
ENDIF
BREAK
CASE SS_Update
SWITCH iCutsceneProgress
CASE 0
IF RC_IS_CUTSCENE_OK_TO_START()
// Register cutscene entities
SetupStartOfIntro()
// Cleanup launcher which will remove lead-in blip
RC_CLEANUP_LAUNCHER()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW)
// Showtime!
START_CUTSCENE()
WAIT(0)
VEHICLE_INDEX veh
veh = GET_PLAYERS_LAST_VEHICLE()
VECTOR vMoveToLoc
FLOAT fHead
IF IS_VEHICLE_OK(veh)
IF IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(veh))
vMoveToLoc = <<-1089.27, 283.76, 64.22>>
fHead = 132.53
ELIF IS_ENTITY_IN_ANGLED_AREA(veh, <<-1115.984375,285.592438,61.942406>>, <<-1097.599243,285.134613,66.346695>>, 33.000000)
vMoveToLoc = <<-1101.694336,280.501923,63.383522>>
fHead = 85.45
ELSE
vMoveToLoc = << -1095.2307, 279.3389, 62.7919 >>
fHead = 84.67
ENDIF
ELSE
// Default coords/heading if the vehicle is fucked, just do whatever start cutscene mode does by default
vMoveToLoc = << -1095.2307, 279.3389, 62.7919 >>
fHead = 84.67
ENDIF
IF IS_VEHICLE_OK(veh)
IF IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(veh)) // Special case for helis (B*1341936)
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<-1115.984375,285.592438,61.942406>>, <<-1097.599243,285.134613,66.346695>>, 33.0,
vMoveToLoc, fHead, <<50, 50, 50>>)
ELSE
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<-1115.984375,285.592438,61.942406>>, <<-1097.599243,285.134613,66.346695>>, 33.0,
vMoveToLoc, fHead, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
ENDIF
ELSE
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<-1115.984375,285.592438,61.942406>>, <<-1097.599243,285.134613,66.346695>>, 33.0,
vMoveToLoc, fHead, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
ENDIF
RC_START_CUTSCENE_MODE(<< -1104.93, 291.25, 64.30 >>,TRUE, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT)
IF IS_VEHICLE_OK(viCopCar)
SET_ENTITY_COORDS(viCopCar, <<-1107.50, 280.33, 64.01>>)
SET_ENTITY_HEADING(viCopCar, 97.97)
SET_VEHICLE_ON_GROUND_PROPERLY(viCopCar)
ENDIF
iCutsceneProgress++
ENDIF
BREAK
CASE 1
REQUEST_ANIM_DICT("rcmjosh4")
REQUEST_ANIM_DICT("combat@gestures@pistol@halt")
REQUEST_ANIM_DICT("combat@gestures@pistol@glances")
REQUEST_MODEL(JoshCarModel)
iCutsceneProgress++
BREAK
CASE 2
IF HAS_ANIM_DICT_LOADED("rcmjosh4")
AND HAS_ANIM_DICT_LOADED("combat@gestures@pistol@halt")
AND HAS_ANIM_DICT_LOADED("combat@gestures@pistol@glances")
AND HAS_MODEL_LOADED(JoshCarModel)
iCutsceneProgress++
ENDIF
BREAK
CASE 3
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
IF DO_TREVOR_EXIT()
REPLAY_STOP_EVENT()
REPLAY_RECORD_BACK_FOR_TIME(0.0, 5.0, REPLAY_IMPORTANCE_LOWEST)
iCutsceneProgress = 4
ENDIF
GrabCop()
IF WAS_CUTSCENE_SKIPPED()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
bCutsceneSkipped = TRUE
iCutsceneProgress = 4
IF NOT bDoneMusicCutscene
TRIGGER_MUSIC_EVENT("JOSH4_START")
DEBUG_PRINTSTRING("Starting 'JOSH4_START' via cutscene skip")
bDoneMusicCutscene = TRUE
ENDIF
ENDIF
BREAK
CASE 4
GrabCop()
DO_TREVOR_EXIT()
IF WAS_CUTSCENE_SKIPPED()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
bCutsceneSkipped = TRUE
IF NOT bDoneMusicCutscene
TRIGGER_MUSIC_EVENT("JOSH4_START")
DEBUG_PRINTSTRING("Starting 'JOSH4_START' via cutscene skip")
bDoneMusicCutscene = TRUE
ENDIF
ENDIF
IF NOT IS_CUTSCENE_PLAYING()
SetupEndOfIntro(bCutsceneSkipped)
// Return script systems to normal.
RC_END_CUTSCENE_MODE()
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, FALSE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, FALSE)
m_subState = SS_Cleanup
ENDIF
BREAK
DEFAULT
iCutsceneProgress = 0
BREAK
ENDSWITCH
BREAK
CASE SS_Cleanup
SetState(RC_ESCAPE_COPS)
BREAK
ENDSWITCH
ENDPROC
PROC Update_Conversations()
IF NOT bDone10SecWarning
ADD_PED_FOR_DIALOGUE(cConversation, ENUM_TO_INT(CHAR_TREVOR), PLAYER_PED_ID(), "TREVOR")
ADD_PED_FOR_DIALOGUE(cConversation, 3, sRCLauncherDataLocal.pedID[SPEAKER_COP], "JOSHCOP")
CREATE_CONVERSATION(cConversation, "JOSH4AU", "JOSH4GIVEUP", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES, DO_ADD_TO_BRIEF_SCREEN)
bDone10SecWarning = TRUE // don't run this anymore
ELSE
SWITCH ConvState
CASE CONV_PAUSE
IF (GET_GAME_TIMER() - iDialogueTimer) > 1000
ConvState = CONV_START
ENDIF
BREAK
CASE CONV_START
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT IS_MESSAGE_BEING_DISPLAYED()
IF bDoCopConv
ADD_PED_FOR_DIALOGUE(cConversation, ENUM_TO_INT(CHAR_TREVOR), PLAYER_PED_ID(), "TREVOR")
ADD_PED_FOR_DIALOGUE(cConversation, 3, sRCLauncherDataLocal.pedID[SPEAKER_COP], "JOSHCOP")
IF CREATE_CONVERSATION(cConversation, "JOSH4AU", "JOSH4COP1", CONV_PRIORITY_HIGH)
ConvState = CONV_PLAYING
bDoCopConv = FALSE
ENDIF
ELSE
ADD_PED_FOR_DIALOGUE(jConversation, ENUM_TO_INT(CHAR_TREVOR), PLAYER_PED_ID(), "TREVOR")
ADD_PED_FOR_DIALOGUE(jConversation, 4, sRCLauncherDataLocal.pedID[JOSH], "JOSH")
IF CREATE_CONVERSATION(jConversation, "JOSH4AU", "JOSH4JOSH", CONV_PRIORITY_LOW)
ConvState = CONV_PLAYING
bDoCopConv = TRUE
ENDIF
ENDIF
ENDIF
BREAK
CASE CONV_PLAYING
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
iDialogueTimer = GET_GAME_TIMER()
ConvState = CONV_PAUSE
ENDIF
BREAK
CASE CONV_STOP
// Do nothing, we want to stop the conversation
BREAK
ENDSWITCH
ENDIF
ENDPROC
/// PURPOSE: Main process for the 'escape the cops' state (and more or less the only proper gameplay state for the mission)
PROC STATE_EscapeCops()
HANDLE_MUSIC()
SWITCH m_subState
CASE SS_Setup
// Ensure no entities are bulletproof...
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
IF IS_ENTITY_ALIVE(viCopCar) SET_ENTITY_PROOFS(viCopCar, FALSE, FALSE, FALSE, FALSE, FALSE) ENDIF
IF IS_ENTITY_ALIVE(viJoshCar) SET_ENTITY_PROOFS(viJoshCar, FALSE, FALSE, FALSE, FALSE, FALSE) ENDIF
PRINT_NOW("JOSH4_LOSECOPS", DEFAULT_GOD_TEXT_TIME, 1) //Using global text
SET_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX(),PLAYER_WANTED_LEVEL)
SET_PLAYER_WANTED_LEVEL_NOW(GET_PLAYER_INDEX())
SET_PED_NON_CREATION_AREA(<< -1140.2233, 271.7450, 50 >>, << -1082.4034, 344.8568, 80 >>)
SET_PED_PATHS_IN_AREA(<< -1140.2233, 271.7450, 50 >>, << -1082.4034, 344.8568, 80 >>, FALSE)
CLEAR_AREA_OF_PEDS(<<-1114.787842,319.340149,66.122597>>, 20.5)
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[JOSH])
TASK_LOOK_AT_ENTITY(sRCLauncherDataLocal.pedID[JOSH], PLAYER_PED_ID(), -1)
ENDIF
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_DRIVING)
// Tell both cops to aim at the player
// int i
// for i=1 to COUNT_OF(sRCLauncherDataLocal.pedID)-1
// IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[i])
// TASK_AIM_GUN_AT_ENTITY(sRCLauncherDataLocal.pedID[i], PLAYER_PED_ID(), -1, TRUE)
// ENDIF
// ENDFOR
//SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_START, "Escape cops")
iShootTimer = GET_GAME_TIMER()
m_subState = SS_Update
BREAK
CASE SS_Update
Update_Conversations()
Update_GateCops()
Update_AI_CopCars()
Update_Josh()
Rant_During_Escape()
HANDLE_POLICE_REPORT()
IF GET_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX()) <= 0
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // Because we don't want Trevor's rant to himself to cut off if you lose your wanted level as it plays
INT i
for i=1 to COUNT_OF(sRCLauncherDataLocal.pedID)-1
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[i])
SAFE_RELEASE_PED(sRCLauncherDataLocal.pedID[i], FALSE, TRUE)
ENDIF
ENDFOR
IF IS_VEHICLE_OK(viCopCar)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viCopCar)
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(JO4_ESCAPE_IN_PARKED_COP_CAR)
ENDIF
ENDIF
m_subState = SS_Cleanup
ENDIF
BREAK
CASE SS_Cleanup
Script_Passed()
BREAK
ENDSWITCH
ENDPROC
// ===========================================================================================================
// Script Loop
// ===========================================================================================================
SCRIPT(g_structRCScriptArgs sRCLauncherDataIn)
DEBUG_PRINTSTRING("*** Now in Josh 4 loop ***")
sRCLauncherDataLocal = sRCLauncherDataIn
RC_TakeEntityOwnership(sRCLauncherDataLocal)
SET_MISSION_FLAG(TRUE)
// Setup callback when player is killed, arrested or goes to multiplayer
IF (HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS|FORCE_CLEANUP_FLAG_DEBUG_MENU))
PRINT_LAUNCHER_DEBUG("Force cleanup [TERMINATING]")
TRIGGER_MUSIC_EVENT("JOSH4_MISSION_FAIL")
Random_Character_Failed()
Script_Cleanup()
ENDIF
IF Is_Replay_In_Progress() // Set up the initial scene for replays
DEBUG_PRINTSTRING("*** Setting up initial scene for replay")
START_REPLAY_SETUP(vPlayerPosAfterIntro, fPlayerHeadAfterIntro)
DEBUG_PRINTSTRING("*** Replay setup started")
g_bSceneAutoTrigger = TRUE
eInitialSceneStage = IS_REQUEST_SCENE
WHILE NOT SetupScene_JOSH_4(sRCLauncherDataLocal)
WAIT(0)
ENDWHILE
DEBUG_PRINTSTRING("*** Josh 4 scene set up")
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
g_bSceneAutoTrigger = FALSE
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[SPEAKER_COP])
STOP_PED_SPEAKING(sRCLauncherDataLocal.pedID[SPEAKER_COP], TRUE)
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[NOTEPAD_COP])
STOP_PED_SPEAKING(sRCLauncherDataLocal.pedID[NOTEPAD_COP], TRUE)
ENDIF
viCopCar = sRCLauncherDataLocal.vehID[COP_CAR]
viJoshCar = sRCLauncherDataLocal.vehID[JOSH_CAR]
DEBUG_PRINTSTRING("*** About to set up positions...")
SetupPositions()
#IF IS_DEBUG_BUILD
IF NOT DOES_WIDGET_GROUP_EXIST(widgetGroup)
DEBUG_PRINTSTRING("*** Setting up Josh 4 RAG widgets")
widgetGroup= START_WIDGET_GROUP("Josh 4 widgets")
ADD_WIDGET_BOOL("TTY Toggle - Print Mission Debug Info", bDebug_PrintToTTY)
STOP_WIDGET_GROUP()
ENDIF
#ENDIF
ADD_CONTACT_TO_PHONEBOOK(CHAR_JOSH, TREVOR_BOOK, FALSE)
IF Is_Replay_In_Progress()
DEBUG_PRINTSTRING("*** Creating replay vehicle and jumping to post-cutscene")
CREATE_VEHICLE_FOR_REPLAY(viTemp, <<-1100.04, 280.60, 63.53>>, 267.48, FALSE, FALSE, TRUE, TRUE, FALSE)
TRIGGER_MUSIC_EVENT("JOSH4_RESTART1")
Jump_To_Escape()
ENDIF
WHILE(TRUE)
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_BOC")
WAIT(0)
UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene)
// Loop within here until the mission passes or fails
SWITCH(m_state)
CASE RC_LEADIN
STATE_Leadin()
BREAK
CASE RC_INTRO
STATE_IntroCutscene()
BREAK
CASE RC_ESCAPE_COPS
STATE_EscapeCops()
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
DEBUG_Check_Debug_Keys()
#ENDIF
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT