//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 "cutscene_public.sch" USING "commands_cutscene.sch" USING "commands_entity.sch" USING "commands_script.sch" USING "script_player.sch" USING "randomChar_public.sch" USING "RC_helper_functions.sch" USING "replay_public.sch" USING "RC_Threat_public.sch" USING "initial_scenes_barry.sch" USING "commands_recording.sch" #IF IS_DEBUG_BUILD USING "select_mission_stage.sch" #ENDIF // ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** // // MISSION NAME : Barry3.sc // AUTHOR : Joanna Wright // DESCRIPTION : Franklin meets Barry in the street // // ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** g_structRCScriptArgs sRCLauncherDataLocal ENUM MISSION_STAGE MS_INIT = 0, MS_LEADIN = -1, MS_LEADOUT = -2, MS_MEET_BARRY = 1, MS_LEAVE_AREA = 2, MS_LOSE_WANTED_LEVEL = 3, MS_MISSION_PASSED = 4, MS_FAIL = 5 ENDENUM ENUM STAGE_PROGRESS SP_SETUP, SP_RUNNING, SP_CLEANUP ENDENUM STRING sFailReason = "DEFAULT" CONST_INT BARRY 0 CONST_INT COPS_DELAY 40000 CONST_INT BARRY_ZONE 100 CONST_INT BARRY_TALK_ZONE 15 CONST_INT NOTICE_PLAYER_ZONE 40 //Barry will notice the Player get in a cop car within this distance //checkpoints CONST_INT CP_AFTER_MOCAP 0 // Mission state MISSION_STAGE mStage = MS_INIT STAGE_PROGRESS sProgress = SP_SETUP STRING animDicBarry = "rcm_barry3" SEQUENCE_INDEX barryRunSeq // Ped index for local Barry PED_INDEX piBarry VEHICLE_INDEX copVehicle PED_INDEX copPed[2] OBJECT_INDEX objJoint MODEL_NAMES modelCopVeh = POLICE MODEL_NAMES modelCop = S_F_Y_COP_01 MODEL_NAMES modelJoint = PROP_SH_JOINT_01 INT iCopsArriveTimer = 0 BOOL bCopsArrived = FALSE BOOL bBarrySeePlayerInCopCar = FALSE BOOL bBarryScaredByPlayerInCopCar = FALSE BOOL bCopCarCheck = TRUE //whether script has to check if Player in cop car or not BOOL bStartedPush = FALSE CONST_INT NUM_CONVS 4 CONST_INT CONV_WARN1 0 CONST_INT CONV_WARN2 1 CONST_INT CONV_WARN3 2 //any other warns go in here CONST_INT CONV_COPS 3 INT iConvNum = 0 //what conversation Barry needs to say next BOOL bConvArray[NUM_CONVS] BOOL bScaredConv = FALSE BOOL bTrickedConv = FALSE BOOL bLeadInConv = FALSE BOOL bBlockDoingPush = FALSE BOOL bLeadOutConv = FALSE STRING bConvString[NUM_CONVS] INT iConvTimer //timer for conversations before cop conversation structPedsForConversation mConversationStruct INT iConvDelay[CONV_COPS] VECTOR playerLoc = << 415.6973, -767.4496, 28.3675 >> VECTOR BarryLoc = << 417.77, -765.71, 29.42 >> //choice of cop spawning points, one one less likely to be seen is used VECTOR copSpawnLocA = <<442.4225, -674.2079, 27.6901>> VECTOR copSpawnLocB = <<446.5630, -821.9631, 27.1615>> //where the cop drives to VECTOR copStopCoords = <<408.4366, -763.0913, 28.2794>> FLOAT fPlayerHeading = 311.6763 FLOAT fBarryHeading = 87.30 FLOAT fCopSpawnHeadingA = 92.7329 FLOAT fCopSpawnHeadingB = 99.7090 INT iSyncScene INT iSyncScene2 STRING sSceneHandle_Franklin = "FRANKLIN" STRING sSceneHandle_Barry = "BARRY" REL_GROUP_HASH relGroupPlayer VECTOR syncScenePos = <<417.533, -765.230, 28.410>> VECTOR syncSceneHeading = <<0.0, 0.0, 12.960>> #IF IS_DEBUG_BUILD BOOL bDebug_PrintToTTY = TRUE CONST_INT MAX_SKIP_MENU_LENGTH 3 MissionStageMenuTextStruct mSkipMenu[MAX_SKIP_MENU_LENGTH] WIDGET_GROUP_ID widgetGroup #ENDIF /// PURPOSE: /// disables or enables navmesh around the Barry mission to prevent amient peds wndering through /// PARAMS: /// if you want to disable the navmesh (TRUE) or enable (FALSE) PROC SORT_BARRY_NAVMESH(BOOL bDisable) DISABLE_NAVMESH_IN_AREA(<<437.6351, -747.0594, 28.4126>>, <<397.6351, -787.0594, 28.4126>>, bDisable) ENDPROC /// PURPOSE: /// creates a joint object PROC CREATE_JOINT() IF NOT DOES_ENTITY_EXIST(objJoint) objJoint = CREATE_OBJECT(modelJoint, <<416.3885, -764.8415, 28.3848>>) ENDIF IF DOES_ENTITY_EXIST(objJoint) SET_ENTITY_ROTATION(objJoint, <<0.0, 0.0, 20.0>>) ENDIF ENDPROC /// PURPOSE: /// Deletes or releases the cop and cop car /// PARAMS: /// bRelease - whether to release (TRUE) or delete (FALSE) PROC REMOVE_COP(BOOL bRelease = TRUE) IF bRelease SAFE_RELEASE_PED(copPed[0]) SAFE_RELEASE_PED(copPed[1]) SAFE_RELEASE_VEHICLE(copVehicle) ELSE SAFE_DELETE_PED(copPed[0]) SAFE_DELETE_PED(copPed[1]) SAFE_DELETE_VEHICLE(copVehicle) ENDIF ENDPROC /// PURPOSE: /// Chooses the least likely location to be seen from a selection of locations and spawns a cop car there FUNC BOOL CREATE_COP() IF NOT DOES_ENTITY_EXIST(copVehicle) AND HAS_MODEL_LOADED(modelCopVeh) AND HAS_MODEL_LOADED(modelCop) VECTOR spawnLoc = copSpawnLocA FLOAT spawnHeading = fCopSpawnHeadingA IF (GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), copSpawnLocA)) < (GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), copSpawnLocB)) spawnLoc = copSpawnLocB spawnHeading = fCopSpawnHeadingB ENDIF copVehicle = CREATE_VEHICLE(modelCopVeh, spawnLoc, spawnHeading) copPed[0] = CREATE_PED_INSIDE_VEHICLE(copVehicle, PEDTYPE_COP, modelCop, VS_DRIVER) GIVE_DELAYED_WEAPON_TO_PED(copPed[0], WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE) SET_PED_INFINITE_AMMO(copPed[0], TRUE, WEAPONTYPE_PISTOL) copPed[1] = CREATE_PED_INSIDE_VEHICLE(copVehicle, PEDTYPE_COP, modelCop, VS_FRONT_RIGHT) GIVE_DELAYED_WEAPON_TO_PED(copPed[1], WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE) SET_PED_INFINITE_AMMO(copPed[1], TRUE, WEAPONTYPE_PISTOL) SET_VEHICLE_SIREN(copVehicle, TRUE) SET_VEHICLE_FORWARD_SPEED(copVehicle, 20.0) TASK_VEHICLE_DRIVE_TO_COORD(copPed[0], copVehicle, copStopCoords, 20.0, DRIVINGSTYLE_RACING, modelCopVeh, DRIVINGMODE_STOPFORCARS, 5.0, 5.0) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Handles head tracking between Franklin and Barry PROC UPDATE_HEAD_TRACKING() IF IS_PLAYER_PLAYING(PLAYER_ID()) AND IS_ENTITY_ALIVE(piBarry) SET_IK_TARGET(piBarry, IK_PART_HEAD, PLAYER_PED_ID(), ENUM_TO_INT(BONETAG_HEAD), <<0,0,0>>, ITF_DEFAULT) SET_IK_TARGET(PLAYER_PED_ID(), IK_PART_HEAD, piBarry, ENUM_TO_INT(BONETAG_HEAD), <<0,0,0>>, ITF_DEFAULT) ENDIF ENDPROC // ----------------------------------------------------------------------------------------------------------- // Script Cleanup // ----------------------------------------------------------------------------------------------------------- /// PURPOSE: /// Safely cleans up the script PROC Script_Cleanup() CPRINTLN(DEBUG_MISSION, "Barry3 script cleanup") // Ensure launcher is cleaned up RC_CLEANUP_LAUNCHER() // If the mission was triggered then additional mission cleanup will be required. IF (Random_Character_Cleanup_If_Triggered()) CPRINTLN(DEBUG_MISSION, "...Random Character Script was triggered so additional cleanup required") ENDIF IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) ENDIF REMOVE_PED_FOR_DIALOGUE(mConversationStruct, 1) // "FRANKLIN" REMOVE_PED_FOR_DIALOGUE(mConversationStruct, 3) // "BARRY" CLEAR_PRINTS() CLEAR_ADDITIONAL_TEXT(MISSION_DIALOGUE_TEXT_SLOT, TRUE) CLEAR_ADDITIONAL_TEXT(MISSION_TEXT_SLOT, TRUE) SET_CREATE_RANDOM_COPS(TRUE) SET_MODEL_AS_NO_LONGER_NEEDED(modelCopVeh) SET_MODEL_AS_NO_LONGER_NEEDED(modelCop) SET_MODEL_AS_NO_LONGER_NEEDED(modelJoint) SAFE_RELEASE_PED(piBarry) SAFE_RELEASE_OBJECT(objJoint) REMOVE_COP() SORT_BARRY_NAVMESH(FALSE) // Return ambient cop creation to normal SET_CREATE_RANDOM_COPS(TRUE) //Cleanup the scene created by the launcher RC_CleanupSceneEntities(sRCLauncherDataLocal, FALSE) TERMINATE_THIS_THREAD() ENDPROC // ----------------------------------------------------------------------------------------------------------- // Script Pass // ----------------------------------------------------------------------------------------------------------- /// PURPOSE: /// Adds needed contacts, completion %, cleans up and passes script. PROC Script_Passed() #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MS_MISSION_PASSED") ENDIF #ENDIF IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) CLEAR_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX()) ENDIF ADD_CONTACT_TO_PHONEBOOK(CHAR_BARRY, FRANKLIN_BOOK) Random_Character_Passed() Script_Cleanup() ENDPROC // =========================================================================================================== // Utility procs // =========================================================================================================== /// PURPOSE: /// Detach the clipboard /// PARAMS: /// bAttach - TRUE = attach clipboard, FALSE = detach PROC SORT_CLIPBOARD(BOOL bAttach) IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.objID[0]) IF bAttach IF NOT IS_ENTITY_ATTACHED(sRCLauncherDataLocal.objID[0]) ATTACH_ENTITY_TO_ENTITY(sRCLauncherDataLocal.objID[0], piBarry, GET_PED_BONE_INDEX(piBarry, BONETAG_PH_L_HAND), << 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "clipboard attached") ENDIF #ENDIF ENDIF ELSE IF IS_ENTITY_ATTACHED(sRCLauncherDataLocal.objID[0]) DETACH_ENTITY(sRCLauncherDataLocal.objID[0]) SET_ENTITY_HAS_GRAVITY(sRCLauncherDataLocal.objID[0], TRUE) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "clipboard detached") ENDIF #ENDIF ENDIF ENDIF ELSE #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "clipboard does not exist") ENDIF #ENDIF ENDIF ENDPROC /// PURPOSE: /// If the Player gets close to Barry, headtrack, else don't (unless Barry is conversing) PROC SORT_HEAD_TRACKING_WHEN_CLOSE() IF IS_ENTITY_IN_RANGE_ENTITY(piBarry, PLAYER_PED_ID(), 7.0) IF NOT IS_PED_HEADTRACKING_PED(piBarry, PLAYER_PED_ID()) TASK_LOOK_AT_ENTITY(piBarry, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) ENDIF ELSE IF IS_PED_IN_CURRENT_CONVERSATION(piBarry) IF NOT IS_PED_HEADTRACKING_PED(piBarry, PLAYER_PED_ID()) TASK_LOOK_AT_ENTITY(piBarry, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) ENDIF ELSE IF IS_PED_HEADTRACKING_PED(piBarry, PLAYER_PED_ID()) TASK_CLEAR_LOOK_AT(piBarry) ENDIF ENDIF ENDIF IF IS_ENTITY_IN_RANGE_ENTITY(piBarry, PLAYER_PED_ID(), 6.0) IF NOT IS_PED_HEADTRACKING_PED(PLAYER_PED_ID(), piBarry) TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), piBarry, -1, SLF_DEFAULT) ENDIF ELSE IF IS_PED_HEADTRACKING_PED(PLAYER_PED_ID(), piBarry) TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) ENDIF ENDIF ENDPROC /// PURPOSE: /// Sets the stage in the parameter, and its progress to setup /// PARAMS: /// MISSION_STAGE eMissionStageToSkipTo - the stage to skip to PROC setStage(MISSION_STAGE eMissionStageToSkipTo) mStage = eMissionStageToSkipTo sProgress = SP_SETUP ENDPROC /// PURPOSE: /// Sets the fail reason, and goes to the fail stage /// PARAMS: /// sFail - the fail reason PROC SET_MISSION_FAILED(STRING sFail) STOP_SCRIPTED_CONVERSATION(FALSE) CLEAR_PRINTS() IF mStage <> MS_FAIL sFailReason = sFail setStage(MS_FAIL) ENDIF ENDPROC // =========================================================================================================== // DEBUG FUNCTIONS // =========================================================================================================== #IF IS_DEBUG_BUILD /// PURPOSE: /// Resets Barry3 variables and wanted level etc, ready for debug skipping PROC RESET_BARRY3() bScaredConv = FALSE bCopsArrived = FALSE bBarrySeePlayerInCopCar = FALSE bBarryScaredByPlayerInCopCar = FALSE bCopCarCheck = TRUE bTrickedConv = FALSE iConvNum = 0 iCopsArriveTimer = 0 iConvTimer = 0 INT i = 0 WAIT_FOR_CUTSCENE_TO_STOP() CLEAR_PRINTS() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) CLEAR_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX()) ENDIF SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), playerLoc, fPlayerHeading) SAFE_TELEPORT_ENTITY(piBarry, BarryLoc, fBarryHeading, TRUE) IF IS_ENTITY_ALIVE(piBarry) SET_PED_MAX_HEALTH(piBarry, GET_PED_MAX_HEALTH(piBarry)) CLEAR_PED_TASKS_IMMEDIATELY(piBarry) RESET_PED_MOVEMENT_CLIPSET(piBarry) IF IS_PED_HEADTRACKING_PED(piBarry, PLAYER_PED_ID()) TASK_CLEAR_LOOK_AT(piBarry) ENDIF ENDIF IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.objID[0]) IF NOT IS_ENTITY_VISIBLE(sRCLauncherDataLocal.objID[0]) SET_ENTITY_VISIBLE(sRCLauncherDataLocal.objID[0], TRUE) ENDIF ENDIF REMOVE_COP(FALSE) IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[0]) ATTACH_ENTITY_TO_ENTITY(sRCLauncherDataLocal.objID[0], piBarry, GET_PED_BONE_INDEX(piBarry, BONETAG_PH_L_HAND), << 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>) ENDIF REPEAT NUM_CONVS i bConvArray[i] = FALSE ENDREPEAT ENDPROC /// PURPOSE: /// Skips to the correct stage /// PARAMS: /// MISSION_STAGE eMissionStageToSkipTo: The stage you want to enter PROC BARRY3_DEBUG_SKIP_STATE(MISSION_STAGE eMissionStageToSkipTo) RC_START_Z_SKIP() SWITCH eMissionStageToSkipTo CASE MS_MEET_BARRY RESET_BARRY3() RC_REQUEST_CUTSCENE("BAR_5_RCM_p2") IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE(sSceneHandle_Franklin, PLAYER_PED_ID()) CPRINTLN(DEBUG_MISSION, "SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE on player in debug skip to MS_MEET_BARRY") ENDIF SET_CUTSCENE_PED_PROP_VARIATION(sSceneHandle_Barry, ANCHOR_EYES, 0) CPRINTLN(DEBUG_MISSION, "SET_CUTSCENE_PED_PROP_VARIATION on Barry in debug skip to MS_MEET_BARRY") ENDIF ENDIF setStage(eMissionStageToSkipTo) BREAK CASE MS_LEAVE_AREA SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) RESET_BARRY3() IF IS_ENTITY_ALIVE(piBarry) iSyncScene2 = CREATE_SYNCHRONIZED_SCENE(syncScenePos, syncSceneHeading) SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene2, TRUE) TASK_SYNCHRONIZED_SCENE(piBarry, iSyncScene2, animDicBarry, "barry_3_sit_loop", INSTANT_BLEND_IN, NORMAL_BLEND_OUT) ENDIF CREATE_JOINT() setStage(eMissionStageToSkipTo) BREAK CASE MS_LOSE_WANTED_LEVEL RESET_BARRY3() IF IS_ENTITY_ALIVE(piBarry) iSyncScene2 = CREATE_SYNCHRONIZED_SCENE(syncScenePos, syncSceneHeading) SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene2, TRUE) TASK_SYNCHRONIZED_SCENE(piBarry, iSyncScene2, animDicBarry, "barry_3_sit_loop", INSTANT_BLEND_IN, NORMAL_BLEND_OUT) ENDIF CREATE_JOINT() setStage(eMissionStageToSkipTo) BREAK CASE MS_MISSION_PASSED RESET_BARRY3() setStage(MS_MISSION_PASSED) BREAK DEFAULT CERRORLN(DEBUG_MISSION, " BARRY3_DEBUG_SKIP_STATE tried to skip to ", eMissionStageToSkipTo) SCRIPT_ASSERT("Script cannot handle the given debug skip-to state") BREAK ENDSWITCH RC_END_Z_SKIP() ENDPROC /// 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() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) CLEAR_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX()) ENDIF Script_Passed() // Check for Fail ELIF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)) WAIT_FOR_CUTSCENE_TO_STOP() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) CLEAR_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX()) ENDIF SET_MISSION_FAILED("DEFAULT") // Forward skip ELIF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)) SWITCH (mStage) CASE MS_INIT #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Attempted j skip - you cannot skip initialisation") ENDIF #ENDIF BREAK CASE MS_LEADIN FALLTHRU CASE MS_MEET_BARRY FALLTHRU CASE MS_LEADOUT BARRY3_DEBUG_SKIP_STATE(MS_LEAVE_AREA) BREAK CASE MS_LEAVE_AREA BARRY3_DEBUG_SKIP_STATE(MS_LOSE_WANTED_LEVEL) BREAK CASE MS_LOSE_WANTED_LEVEL BARRY3_DEBUG_SKIP_STATE(MS_MISSION_PASSED) BREAK CASE MS_MISSION_PASSED #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Attempted j skip - you cannot skip mission pass") ENDIF #ENDIF BREAK CASE MS_FAIL #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Attempted j skip - you cannot skip during fail") ENDIF #ENDIF BREAK DEFAULT CERRORLN(DEBUG_MISSION, " DEBUG_Check_Debug_Keys tried to j skip to ", mStage) SCRIPT_ASSERT("Unhandled j skip") BREAK ENDSWITCH //back skip ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P) SWITCH (mStage) CASE MS_INIT #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Attempted p skip - there are no skippable stages before initialisation") ENDIF #ENDIF BREAK CASE MS_LEADIN #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Attempted p skip - there are no skippable stages before lead in") ENDIF #ENDIF BREAK CASE MS_MEET_BARRY #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Attempted p skip - there are no skippable stages before meeting barry cutscene") ENDIF #ENDIF BREAK CASE MS_LEADOUT FALLTHRU CASE MS_LEAVE_AREA BARRY3_DEBUG_SKIP_STATE(MS_MEET_BARRY) BREAK CASE MS_LOSE_WANTED_LEVEL BARRY3_DEBUG_SKIP_STATE(MS_LEAVE_AREA) BREAK CASE MS_MISSION_PASSED #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Attempted p skip - you cannot skip mission pass") ENDIF #ENDIF BREAK CASE MS_FAIL #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Attempted p skip - you cannot skip during fail") ENDIF #ENDIF BREAK DEFAULT CERRORLN(DEBUG_MISSION, " DEBUG_Check_Debug_Keys tried to p skip to ", mStage) SCRIPT_ASSERT("Unhandled p skip") BREAK ENDSWITCH ENDIF INT i_new_state IF LAUNCH_MISSION_STAGE_MENU(mSkipMenu, i_new_state) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Z skip menu used so doing z skip") ENDIF#ENDIF i_new_state++ //+1 because you can't skip to init which is 0 and you can't skip to mission passed this way BARRY3_DEBUG_SKIP_STATE(INT_TO_ENUM(MISSION_STAGE, i_new_state)) ENDIF ENDPROC #ENDIF /// PURPOSE: /// Attempts to play Barry's end line when he's been spooked/ hurt /// RETURNS: /// TRUE if he's started saying it, else return FALSE FUNC BOOL PLAY_END_CONV() INT rand = 0 IF NOT bScaredConv IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_ANY_CONVERSATION() //ADD_NON_CRITICAL_STANDARD_CONVERSATION_TO_BUFFER(mConversationStruct, "BARR3AU", "BARRY3_EEP", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) ELSE rand = GET_RANDOM_INT_IN_RANGE(0, 3) IF (rand = 0) bScaredConv = PLAY_SINGLE_LINE_FROM_CONVERSATION(mConversationStruct, "BARR3AU", "BARRY3_EEP", "BARRY3_EEP_1", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) ELIF (rand = 1) bScaredConv = PLAY_SINGLE_LINE_FROM_CONVERSATION(mConversationStruct, "BARR3AU", "BARRY3_EEP", "BARRY3_EEP_2", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) ELSE bScaredConv = PLAY_SINGLE_LINE_FROM_CONVERSATION(mConversationStruct, "BARR3AU", "BARRY3_EEP", "BARRY3_EEP_3", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) ENDIF ENDIF #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Attempting end conversation") ENDIF #ENDIF ENDIF IF bScaredConv #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Successful end conversation") ENDIF #ENDIF RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// /// PARAMS: /// bFromCops - whether the task should initially flee in a specific direction to avoid cops PROC CREATE_BARRY_SEQUENCE_TASK(BOOL bFromCops = FALSE) IF bFromCops IF DOES_ENTITY_EXIST(copVehicle) OPEN_SEQUENCE_TASK(barryRunSeq) TASK_PLAY_ANIM(NULL, animDicBarry, "barry_get_up") TASK_SMART_FLEE_COORD(NULL, GET_ENTITY_COORDS(copVehicle, FALSE), 200, -1) TASK_SMART_FLEE_PED(NULL,PLAYER_PED_ID(), 500, -1) CLOSE_SEQUENCE_TASK(barryRunSeq) ELSE CPRINTLN(DEBUG_MISSION, "Couldn't get cop car to flee from, falling back to getting ") OPEN_SEQUENCE_TASK(barryRunSeq) TASK_PLAY_ANIM(NULL, animDicBarry, "barry_get_up") TASK_SMART_FLEE_PED(NULL,PLAYER_PED_ID(), 500, -1) CLOSE_SEQUENCE_TASK(barryRunSeq) ENDIF ELSE OPEN_SEQUENCE_TASK(barryRunSeq) TASK_PLAY_ANIM(NULL, animDicBarry, "barry_get_up") TASK_SMART_FLEE_PED(NULL,PLAYER_PED_ID(), 500, -1) CLOSE_SEQUENCE_TASK(barryRunSeq) ENDIF ENDPROC /// PURPOSE: /// Checks if conditions are met that will fail the mission, for example if Barry is scared away /// Plays a fail conversation if need be /// RETURNS: /// TRUE if mission has failed, else return FALSE FUNC BOOL FAIL_CHECKS() IF NOT IS_ENTITY_ALIVE(PLAYER_PED_ID()) RETURN TRUE ELIF DOES_ENTITY_EXIST(piBarry) IF IS_ENTITY_DEAD(piBarry) SORT_CLIPBOARD(FALSE) SET_MISSION_FAILED("B3BARRYDEAD") // Barry died. RETURN TRUE ELIF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(piBarry, PLAYER_PED_ID()) OR HAS_PED_BUMPED_PED_WITH_VEHICLE(PLAYER_PED_ID(), piBarry) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "FAIL HURT BARRY") ENDIF #ENDIF TASK_SMART_FLEE_PED(piBarry,PLAYER_PED_ID(), 500, -1) SORT_CLIPBOARD(FALSE) SET_MISSION_FAILED("B3BARRYHURT") // Barry was injured RETURN TRUE ELIF HAS_PLAYER_THREATENED_PED(piBarry) OR HAS_PED_BUMPED_PED_WITH_VEHICLE(PLAYER_PED_ID(), piBarry, TRUE) IF NOT bCopsArrived #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "FAIL SCARED BARRY") ENDIF #ENDIF // Make Barry flee - but can only use sequence if he is already sitting IF mStage = MS_LEADOUT AND IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene) AND GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) < 0.82 // Don't interrupt the task sequence if it's going to look stupid ELSE CREATE_BARRY_SEQUENCE_TASK() TASK_PERFORM_SEQUENCE(piBarry, barryRunSeq) ENDIF SORT_CLIPBOARD(FALSE) SET_MISSION_FAILED("B3BARRYSCARE") RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC // =========================================================================================================== // MISSION STAGE PROCEDURES // =========================================================================================================== /// PURPOSE: /// Requests cutscene required by mission depending on if it's a replay /// Sets variables for mission PROC STATE_INIT() // Not using switch - need to save a few frames // // SETUP // IF sProgress = SP_SETUP INT i #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MS_INIT") ENDIF #ENDIF REPEAT NUM_CONVS i bConvArray[i] = FALSE ENDREPEAT bConvString[CONV_WARN1] = "BARRY3_C1" bConvString[CONV_WARN2] = "BARRY3_C2" bConvString[CONV_WARN3] = "BARRY3_C3" bConvString[CONV_COPS] = "BARRY3_COPS" iConvDelay[CONV_WARN1] = 0 iConvDelay[CONV_WARN2] = 20000 iConvDelay[CONV_WARN3] = 7000 // Get the PLAYER relationship group relGroupPlayer = GET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID()) SET_PED_RELATIONSHIP_GROUP_HASH(piBarry, relGroupPlayer) SET_PED_CONFIG_FLAG(piBarry, PCF_KeepRelationshipGroupAfterCleanUp, TRUE) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(piBarry, TRUE) SET_PED_CONFIG_FLAG(piBarry, PCF_UseKinematicModeWhenStationary, TRUE) SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(piBarry, FALSE) ADD_PED_FOR_DIALOGUE(mConversationStruct, 1, PLAYER_PED_ID(), "FRANKLIN") ADD_PED_FOR_DIALOGUE(mConversationStruct, 3, piBarry, "BARRY") #IF IS_DEBUG_BUILD mSkipMenu[0].sTxtLabel = "Intro" mSkipMenu[1].sTxtLabel = "Leave area" mSkipMenu[2].sTxtLabel = "Lose wanted level" IF NOT DOES_WIDGET_GROUP_EXIST(widgetGroup) widgetGroup = START_WIDGET_GROUP("Barry 3 widgets") ADD_WIDGET_BOOL("TTY Toggle - Print Mission Debug Info", bDebug_PrintToTTY) STOP_WIDGET_GROUP() ENDIF #ENDIF REQUEST_ADDITIONAL_TEXT("BARY3", MISSION_TEXT_SLOT) REQUEST_MODEL(modelJoint) REQUEST_ANIM_DICT(animDicBarry) sProgress = SP_RUNNING ENDIF // // RUNNING // IF sProgress = SP_RUNNING IF HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT) AND HAS_MODEL_LOADED(modelJoint) AND HAS_ANIM_DICT_LOADED(animDicBarry) IF IS_REPLAY_IN_PROGRESS() SWITCH GET_REPLAY_MID_MISSION_STAGE() CASE CP_AFTER_MOCAP REQUEST_MODEL(modelCopVeh) REQUEST_MODEL(modelCop) SAFE_FADE_SCREEN_OUT_TO_BLACK(0,FALSE) SAFE_TELEPORT_ENTITY(piBarry, BarryLoc, fBarryHeading, TRUE) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) IF IS_ENTITY_ALIVE(piBarry) iSyncScene2 = CREATE_SYNCHRONIZED_SCENE(syncScenePos, syncSceneHeading) SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene2, TRUE) TASK_SYNCHRONIZED_SCENE(piBarry, iSyncScene2, animDicBarry, "barry_3_sit_loop", INSTANT_BLEND_IN, NORMAL_BLEND_OUT) ENDIF CREATE_JOINT() START_REPLAY_SETUP(playerLoc, fPlayerHeading) END_REPLAY_SETUP() setStage(MS_LEAVE_AREA) BREAK DEFAULT CERRORLN(DEBUG_MISSION, " STATE_INIT tried to replay ", GET_REPLAY_MID_MISSION_STAGE()) SCRIPT_ASSERT("Replay in progress: Unknown checkpoint selected") BREAK ENDSWITCH ELSE // Request scene where Franklin meets Barry RC_REQUEST_CUTSCENE("BAR_5_RCM_p2", FALSE) IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) // added by Ahron for release build fix SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE(sSceneHandle_Franklin, PLAYER_PED_ID()) CPRINTLN(DEBUG_MISSION, "SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE player") ENDIF SET_CUTSCENE_PED_PROP_VARIATION(sSceneHandle_Barry, ANCHOR_EYES, 0) CPRINTLN(DEBUG_MISSION, "SET_CUTSCENE_PED_PROP_VARIATION on Barry in STATE_INIT") ENDIF // Turn off random cops for now - B*1217186 SET_CREATE_RANDOM_COPS(FALSE) // Handle screen fadeout from replay SAFE_FADE_SCREEN_IN_FROM_BLACK() setStage(MS_LEADIN) ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Plays lead in animation PROC STATE_LEADIN() RC_PLAYER_TRIGGER_SCENE_LOCK_IN() UPDATE_HEAD_TRACKING() // Replaced switch with IFs - shave off a few frames IF sProgress = SP_SETUP CPRINTLN(DEBUG_MISSION, "Init LEADIN") bLeadInConv = FALSE bBlockDoingPush = FALSE SORT_CLIPBOARD(TRUE) RC_END_CUTSCENE_MODE() //return script systems to normal. //TEST IF NOT Is_Replay_In_Progress() IF IS_ENTITY_ALIVE(piBarry) TASK_PLAY_ANIM(piBarry, animDicBarry, "lead_in", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME) CPRINTLN(DEBUG_MISSION, "Done barry leadin anim") sProgress = SP_RUNNING ENDIF ELSE CPRINTLN(DEBUG_MISSION, "Replay in progress or in wrong area - skipping to intro") setStage(MS_MEET_BARRY) ENDIF // Need to wait a frame so leadin anim can start ELIF sProgress = SP_RUNNING IF IS_PED_UNINJURED(piBarry) IF NOT bStartedPush AND (IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<415.478058,-771.704102,27.855623>>, <<415.560608,-759.937195,31.361616>>, 7.25) OR IS_PLAYER_IN_FIRST_PERSON_CAMERA()) bStartedPush = TRUE IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), piBarry, 5.0) CPRINTLN(DEBUG_MISSION, "STATE_LEADIN found player <5m from Barry on start push, blocked the push") bBlockDoingPush = TRUE ENDIF CPRINTLN(DEBUG_MISSION, "STATE_LEADIN starting focus push now") ENDIF IF bStartedPush IF NOT bBlockDoingPush IF IS_PLAYER_IN_FIRST_PERSON_CAMERA() SET_GAMEPLAY_ENTITY_HINT(piBarry, (<<0.0, 0, 0.5>>), TRUE, 5000, DEFAULT_INTERP_IN_TIME, DEFAULT_INTERP_OUT_TIME) ELSE SET_GAMEPLAY_ENTITY_HINT(piBarry, (<<0.5, 0, 0.5>>), TRUE, 5000, DEFAULT_INTERP_IN_TIME, DEFAULT_INTERP_OUT_TIME) SET_GAMEPLAY_HINT_FOV(35.0) SET_GAMEPLAY_HINT_BASE_ORBIT_PITCH_OFFSET(0.0) SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(0.35) SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(0.2) SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(0.01) SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE) ENDIF ENDIF IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), piBarry, 2.5) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), piBarry) ENDIF ENDIF IF IS_ENTITY_PLAYING_ANIM(piBarry, animDicBarry, "lead_in") IF bLeadInConv = FALSE IF CREATE_CONVERSATION(mConversationStruct, "BARR3AU", "BAR_3_INT_LI", CONV_PRIORITY_HIGH) CPRINTLN(DEBUG_MISSION, "Done leadin conv") bLeadInConv = TRUE ENDIF ELSE IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() CPRINTLN(DEBUG_MISSION, "leadin conv over") sProgress = SP_CLEANUP ENDIF ENDIF IF GET_ENTITY_ANIM_CURRENT_TIME(piBarry, animDicBarry, "lead_in") > 0.90 CPRINTLN(DEBUG_MISSION, "leadin anim over") sProgress = SP_CLEANUP ENDIF ELSE CPRINTLN(DEBUG_MISSION, "not playing leadin anim anymore - skip to cutscene for safety") sProgress = SP_CLEANUP ENDIF ENDIF ENDIF IF sProgress = SP_CLEANUP CPRINTLN(DEBUG_MISSION, "Cleaned up LEADIN") REQUEST_MODEL(modelCopVeh) REQUEST_MODEL(modelCop) setStage(MS_MEET_BARRY) ENDIF ENDPROC /// PURPOSE: /// Triggers the mocap cutscene and skips to next mission state once finished PROC STATE_MEET_BARRY() SWITCH sProgress CASE SP_SETUP CPRINTLN(DEBUG_MISSION, "Init MS_MEET_BARRY") CLEAR_AREA_OF_COPS(<< 417.78, -765.71, 29.39>>, 40) SET_CREATE_RANDOM_COPS(FALSE) IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE(sSceneHandle_Franklin, PLAYER_PED_ID()) CPRINTLN(DEBUG_MISSION, "SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE on player in STATE_MEET_BARRY") ENDIF SET_CUTSCENE_PED_PROP_VARIATION(sSceneHandle_Barry, ANCHOR_EYES, 0) CPRINTLN(DEBUG_MISSION, "SET_CUTSCENE_PED_PROP_VARIATION on Barry in STATE_MEET_BARRY") ENDIF IF RC_IS_CUTSCENE_OK_TO_START() REGISTER_ENTITY_FOR_CUTSCENE(piBarry, sSceneHandle_Barry, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), sSceneHandle_Franklin, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.objID[0]) SORT_CLIPBOARD(FALSE) REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[0], "Barrys_Clipboard", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) CPRINTLN(DEBUG_MISSION, "Register clipboard for cutscene") ENDIF // Cleanup launcher to remove lead-in blip RC_CLEANUP_LAUNCHER() // Start mocap scene START_CUTSCENE() WAIT(0) RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<416.8295, -762.7533, 27.3960>>, <<416.6834, -767.3608, 34.4159>>, 6.0, << 411.6, -773.5004, 27.9818 >>, 4.0678) RC_START_CUTSCENE_MODE(<< 417.78, -765.71, 29.39>>) // Monitor cutscene sProgress = SP_RUNNING ENDIF BREAK CASE SP_RUNNING IF IS_GAMEPLAY_HINT_ACTIVE() STOP_GAMEPLAY_HINT(TRUE) ENDIF IF CAN_SET_EXIT_STATE_FOR_CAMERA() // SET_GAMEPLAY_CAM_RELATIVE_PITCH() // SET_GAMEPLAY_CAM_RELATIVE_HEADING() ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_Franklin) FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE, FALSE, FAUS_CUTSCENE_EXIT) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSCeneHandle_Barry) IF IS_ENTITY_ALIVE(piBarry) iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<417.533, -765.230, 28.410>>, <<0.0, 0.0, 12.960>>) TASK_SYNCHRONIZED_SCENE(piBarry, iSyncScene, animDicBarry, "lead_out", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS, RBF_PLAYER_IMPACT) ENDIF ENDIF IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.objID[0]) IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Barrys_Clipboard") SORT_CLIPBOARD(TRUE) ENDIF ENDIF IF HAS_CUTSCENE_FINISHED() CREATE_JOINT() RC_END_CUTSCENE_MODE() sProgress = SP_CLEANUP ENDIF BREAK CASE SP_CLEANUP CPRINTLN(DEBUG_MISSION, "Cleaned up MS_MEET_BARRY") setStage(MS_LEADOUT) BREAK ENDSWITCH ENDPROC /// PURPOSE: /// If Barry doesn't notice the Player get in a cop car and they drive up to him, he'll freak out and run away /// RETURNS: /// TRUE if Barry has been tricked, else FALSE FUNC BOOL SORT_IF_BARRY_TRICKED_BY_PLAYER_IN_COP_CAR() IF IS_PED_IN_ANY_POLICE_VEHICLE(PLAYER_PED_ID()) //sort if Barry has seen Player enter cop car IF bCopCarCheck AND NOT bBarryScaredByPlayerInCopCar IF IS_ENTITY_IN_RANGE_ENTITY(piBarry, PLAYER_PED_ID(), NOTICE_PLAYER_ZONE) bBarrySeePlayerInCopCar = TRUE #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Barry has seen you enter the cop car") ENDIF #ENDIF ELSE bBarrySeePlayerInCopCar = FALSE #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Barry's not seen you enter the cop car") ENDIF #ENDIF ENDIF bCopCarCheck = FALSE ENDIF //run away if tricked by Player IF NOT bBarryScaredByPlayerInCopCar AND NOT bBarrySeePlayerInCopCar IF IS_ENTITY_IN_RANGE_ENTITY(piBarry, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), BARRY_TALK_ZONE) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Barry tricked by Player in cop car") ENDIF #ENDIF bBarryScaredByPlayerInCopCar = TRUE STOP_SCRIPTED_CONVERSATION(FALSE) CREATE_BARRY_SEQUENCE_TASK() TASK_PERFORM_SEQUENCE(piBarry, barryRunSeq) IF IS_PED_HEADTRACKING_PED(piBarry, PLAYER_PED_ID()) TASK_CLEAR_LOOK_AT(piBarry) ENDIF ENDIF ENDIF ELSE bCopCarCheck = TRUE ENDIF RETURN bBarryScaredByPlayerInCopCar ENDFUNC /// PURPOSE: /// check if ped is performing a certain task or not /// PARAMS: /// pedIndex - the ped index you're looking for /// theScrTaskName - the SCRIPT_TASK_NAME you are looking for /// RETURNS: /// TRUE if performing or waiting for the task, else FALSE FUNC BOOL IS_PED_PERFORMING_TASK(PED_INDEX pedIndex, SCRIPT_TASK_NAME theScrTaskName) IF (GET_SCRIPT_TASK_STATUS(pedIndex, theScrTaskName) = PERFORMING_TASK) OR (GET_SCRIPT_TASK_STATUS(pedIndex, theScrTaskName) = WAITING_TO_START_TASK) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Plays Barry's lead out animation PROC STATE_LEADOUT() SWITCH sProgress CASE SP_SETUP #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Init MS_LEADOUT") ENDIF #ENDIF //double check that sync scene is running IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene) IF IS_ENTITY_ALIVE(piBarry) iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<417.533, -765.230, 28.410>>, <<0.0, 0.0, 12.960>>) TASK_SYNCHRONIZED_SCENE(piBarry, iSyncScene, animDicBarry, "lead_out", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS, RBF_PLAYER_IMPACT) ENDIF ENDIF SORT_CLIPBOARD(TRUE) bLeadOutConv = FALSE sProgress = SP_RUNNING BREAK CASE SP_RUNNING IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene) IF bLeadOutConv = FALSE IF CREATE_CONVERSATION(mConversationStruct, "BARR3AU", "BAR_3_INT_LO", CONV_PRIORITY_HIGH) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Done leadin conv") ENDIF #ENDIF bLeadOutConv = TRUE ENDIF ENDIF IF (GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) > 0.99) #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Finished lead out") ENDIF #ENDIF sProgress = SP_CLEANUP ENDIF ELSE #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Barry not performing task, skipping lead in") ENDIF #ENDIF sProgress = SP_CLEANUP ENDIF BREAK CASE SP_CLEANUP SORT_CLIPBOARD(FALSE) setStage(MS_LEAVE_AREA) BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Barry keeps telling the player to get out of the area /// Completes mission if player does so, else calls cops if player hangs around for too long PROC STATE_LEAVE_AREA() SWITCH sProgress CASE SP_SETUP #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Init MS_LEAVE_AREA") ENDIF #ENDIF SORT_BARRY_NAVMESH(FALSE) // SORT_CLIPBOARD(TRUE) IF DOES_ENTITY_EXIST(piBarry) CLEAR_AREA_OF_COPS(GET_ENTITY_COORDS(piBarry), 1000) iSyncScene2 = CREATE_SYNCHRONIZED_SCENE(syncScenePos, syncSceneHeading) SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene2, TRUE) TASK_SYNCHRONIZED_SCENE(piBarry, iSyncScene2, animDicBarry, "barry_3_sit_loop", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS, RBF_PLAYER_IMPACT) ENDIF SET_CREATE_RANDOM_COPS(FALSE) RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE) if not IS_PLAYER_USING_A_TAXI() SAFE_FADE_SCREEN_IN_FROM_BLACK() // Handle screen fadeout from replay endif iCopsArriveTimer = GET_GAME_TIMER() iConvTimer = GET_GAME_TIMER() sProgress = SP_RUNNING BREAK CASE SP_RUNNING IF NOT SORT_IF_BARRY_TRICKED_BY_PLAYER_IN_COP_CAR() SORT_HEAD_TRACKING_WHEN_CLOSE() IF iConvNum < CONV_COPS //so don't go over any arrays IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), piBarry, BARRY_TALK_ZONE) IF NOT bConvArray[iConvNum] IF (GET_GAME_TIMER() - iConvTimer) > iConvDelay[iConvNum] bConvArray[iConvNum] = CREATE_CONVERSATION(mConversationStruct, "BARR3AU", bConvString[iConvNum], CONV_PRIORITY_MEDIUM, DISPLAY_SUBTITLES) ENDIF ELSE iConvNum++ iConvTimer = GET_GAME_TIMER() // Initialise new timer ENDIF ELSE IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "NOT IN RANGE, stopping conversation") ENDIF #ENDIF KILL_FACE_TO_FACE_CONVERSATION() ENDIF ENDIF ENDIF ELSE IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), piBarry, BARRY_TALK_ZONE) IF NOT bTrickedConv bTrickedConv = CREATE_CONVERSATION(mConversationStruct, "BARR3AU", "BARRY3_TRICK", CONV_PRIORITY_MEDIUM, DISPLAY_SUBTITLES) ENDIF ENDIF ENDIF IF NOT bCopsArrived IF (GET_GAME_TIMER() - iCopsArriveTimer) > COPS_DELAY OR GET_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX()) > 0 bCopsArrived = TRUE sProgress = SP_CLEANUP ELIF NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), piBarry, BARRY_ZONE) sProgress = SP_CLEANUP ENDIF ENDIF BREAK CASE SP_CLEANUP IF NOT bCopsArrived mStage = MS_MISSION_PASSED ELSE mStage = MS_LOSE_WANTED_LEVEL ENDIF sProgress = SP_SETUP #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Cleaned up MS_LEAVE_AREA") ENDIF #ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Cops are after the player. Player has to lose his wanted level. /// Completes mission if player does so PROC STATE_LOSE_WANTED_LEVEL() SWITCH sProgress CASE SP_SETUP IF CREATE_COP() CPRINTLN(DEBUG_MISSION, "Init MS_LOSE_WANTED_LEVEL") bCopsArrived = TRUE SORT_CLIPBOARD(FALSE) STOP_SCRIPTED_CONVERSATION(FALSE) SET_CREATE_RANDOM_COPS(TRUE) SET_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX(), 1) SET_PLAYER_WANTED_LEVEL_NOW(GET_PLAYER_INDEX()) PRINT_NOW("LOSE_WANTED_LVL", DEFAULT_GOD_TEXT_TIME, 1) IF NOT bConvArray[CONV_COPS] AND IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), piBarry, BARRY_TALK_ZONE) bConvArray[CONV_COPS] = CREATE_CONVERSATION(mConversationStruct, "BARR3AU", bConvString[CONV_COPS], CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES) ENDIF IF NOT bBarryScaredByPlayerInCopCar CREATE_BARRY_SEQUENCE_TASK(TRUE) TASK_PERFORM_SEQUENCE(piBarry, barryRunSeq) IF IS_PED_HEADTRACKING_PED(piBarry, PLAYER_PED_ID()) TASK_CLEAR_LOOK_AT(piBarry) ENDIF ENDIF IF IS_PED_HEADTRACKING_PED(PLAYER_PED_ID(), piBarry) TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) ENDIF sProgress = SP_RUNNING ENDIF BREAK CASE SP_RUNNING IF GET_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX()) = 0 sProgress = SP_CLEANUP ENDIF IF IS_ENTITY_ALIVE(copPed[0]) AND IS_ENTITY_ALIVE(copPed[1]) IF IS_ENTITY_IN_RANGE_COORDS(copPed[0], copStopCoords, 30.0) OR IS_PED_IN_PED_VIEW_CONE(copPed[0], PLAYER_PED_ID()) OR IS_PED_IN_PED_VIEW_CONE(copPed[1], PLAYER_PED_ID()) SAFE_RELEASE_PED(copPed[0]) SAFE_RELEASE_PED(copPed[1]) SAFE_RELEASE_VEHICLE(copVehicle) ENDIF ENDIF BREAK CASE SP_CLEANUP mStage = MS_MISSION_PASSED sProgress = SP_SETUP #IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "Cleaned up MS_LOSE_WANTED_LEVEL") ENDIF #ENDIF BREAK ENDSWITCH ENDPROC // =========================================================================================================== // Termination // =========================================================================================================== // ----------------------------------------------------------------------------------------------------------- // Script Fail // ----------------------------------------------------------------------------------------------------------- /// PURPOSE: /// Fails and cleans up the mission correctly PROC STAGE_FAIL() SWITCH sProgress CASE SP_SETUP IF ARE_STRINGS_EQUAL(sFailReason,"DEFAULT") Random_Character_Failed() ELSE Random_Character_Failed_With_Reason(sFailReason, TRUE) ENDIF sProgress = SP_RUNNING BREAK CASE SP_RUNNING IF GET_MISSION_FLOW_SAFE_TO_CLEANUP() Script_Cleanup() // script_cleanup should terminate the thread ELSE IF NOT IS_STRING_NULL_OR_EMPTY(sFailReason) //make Barry say "What the hell?" if he's there IF IS_PED_UNINJURED(piBarry) IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), piBarry, BARRY_TALK_ZONE) PLAY_END_CONV() ENDIF ENDIF ENDIF ENDIF BREAK ENDSWITCH ENDPROC // =========================================================================================================== // Script Loop // =========================================================================================================== SCRIPT(g_structRCScriptArgs sRCLauncherDataIn) CPRINTLN(DEBUG_MISSION, "BARRY3::: Script starting... ") 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]") Random_Character_Failed() Script_Cleanup() ENDIF IF IS_REPLAY_IN_PROGRESS()= TRUE // Set up the initial scene for replays g_bSceneAutoTrigger = TRUE eInitialSceneStage = IS_REQUEST_SCENE WHILE NOT SetupScene_BARRY_3(sRCLauncherDataLocal) WAIT(0) ENDWHILE VEHICLE_INDEX vTmp CREATE_VEHICLE_FOR_REPLAY(vTmp, << 410.74, -778.37, 28.87 >>, 359.2, FALSE, FALSE, FALSE, FALSE, FALSE) g_bSceneAutoTrigger = FALSE ENDIF // Grab Barry ped so we can handle him more easily IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[BARRY]) ASSIGN_PED_INDEX(piBarry, sRCLauncherDataLocal.pedID[BARRY]) ENDIF SORT_BARRY_NAVMESH(TRUE) // Loop within here until the mission passes or fails WHILE(TRUE) WAIT(0) REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_GRF") UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene) IF mStage = MS_FAIL STAGE_FAIL() ELSE IF NOT FAIL_CHECKS() //if not failed mission REQUEST_PATH_NODES_IN_AREA_THIS_FRAME(392.7562, -842.7891, 511.9787,-669.2035) SWITCH(mStage) CASE MS_INIT STATE_INIT() BREAK CASE MS_LEADIN STATE_LEADIN() BREAK CASE MS_MEET_BARRY STATE_MEET_BARRY() BREAK CASE MS_LEADOUT STATE_LEADOUT() BREAK CASE MS_LEAVE_AREA STATE_LEAVE_AREA() BREAK CASE MS_LOSE_WANTED_LEVEL STATE_LOSE_WANTED_LEVEL() BREAK CASE MS_MISSION_PASSED Script_Passed() BREAK ENDSWITCH // Check debug completion/failure #IF IS_DEBUG_BUILD DEBUG_Check_Debug_Keys() #ENDIF ENDIF ENDIF ENDWHILE // Script should never reach here. Always terminate with cleanup function. ENDSCRIPT