//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