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

1459 lines
46 KiB
Python
Executable File

//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
USING "rage_builtins.sch"
USING "globals.sch"
USING "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