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

3278 lines
122 KiB
Python
Executable File

//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
USING "rage_builtins.sch"
USING "globals.sch"
USING "commands_camera.sch"
USING "commands_pad.sch"
USING "commands_script.sch"
USING "flow_public_core_override.sch"
USING "RC_Helper_Functions.sch"
USING "rgeneral_include.sch"
USING "chase_hint_cam.sch" CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
#IF IS_DEBUG_BUILD
USING "select_mission_stage.sch"
#ENDIF
USING "replay_public.sch"
USING "RC_Threat_public.sch"
USING "family_public.sch"
USING "commands_misc.sch"
USING "taxi_functions.sch"
USING "commands_recording.sch"
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : ME_Jimmy1.sc
// AUTHOR : Joe Binks
// DESCRIPTION : Jimmy had arranged to go on a date with someone he met online.
// As a result, he finds himself trapped in the trunk of a car
// owned by an overweight geek who's driving to a LARP.
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
// ===========================================================================================================
// Variables / Constants etc
// ===========================================================================================================
ENUM MISSION_STATE
MS_INIT,
MS_DRIVE_TO_LOCATION,
MS_RESCUE_JIMMY,
MS_DRIVE_HOME,
MS_RETURN_TO_JIMMY,
MS_LOSE_COPS,
MS_AT_HOME,
MS_AT_HOTEL,
MS_FAIL_DELAY
ENDENUM
ENUM MISSION_SUBSTATE
MSS_PREPARE,
MSS_ACTIVE_ONE,
MSS_ACTIVE_TWO,
MSS_ACTIVE_THREE
ENDENUM
ENUM MISSION_FAILED_REASON
MFR_NONE,
MFR_JIMMY_HURT,
MFR_JIMMY_DEAD,
MFR_JIMMY_KIDNAPPED,
MFR_JIMMY_LEFT,
MFR_KIDNAPPER_DIED
ENDENUM
ENUM JIMMYS_ANIMS
JA_READY,
JA_NULL,
JA_ENTER_BACK,
JA_BACK,
JA_ENTER_LEFT,
JA_LEFT,
JA_LEFT_PLAYING,
JA_EXIT_LEFT,
JA_ENTER_RIGHT,
JA_RIGHT,
JA_RIGHT_PLAYING,
JA_EXIT_RIGHT,
JA_EXITED_SIDE,
JA_WAIT,
JA_EXIT_BACK,
JA_ENTER_BACKSEAT,
JA_PUT_JIMMY_IN_SEAT,
JA_EXIT_VEHICLE
ENDENUM
ENUM DRIVE_CONV_STATE
DCS_NULL,
DCS_READY,
DCS_PLAYING,
DCS_FINISHED
ENDENUM
ENUM PLAYER_REL_POS
PRP_LEFT,
PRP_BEHIND,
PRP_RIGHT,
PRP_NULL
ENDENUM
CONST_INT MICHAEL_ID 0
CONST_INT JIMMY_ID 3
CONST_INT JIMMY_PHONE_ID 4
CONST_INT KIDNAPPER_ID 5
CONST_INT PASSENGER_ID 6
structPedsForConversation pedConvStruct
CONST_INT KIDNAPPERS_STUCK_TIME 5000
STRING ANIM_DICT_JIMMY = "missmej1ig_1"
INT iJimmyAnims
JIMMYS_ANIMS eJimmysAnimStage = JA_READY
STRING ANIM_ATTACH_POINT = "seat_pside_r"//"chassis_dummy"
RAGDOLL_BLOCKING_FLAGS rbfSyncedScene = RBF_BULLET_IMPACT | RBF_VEHICLE_IMPACT | RBF_PLAYER_IMPACT | RBF_EXPLOSION | RBF_IMPACT_OBJECT
BOOL bExitBack = FALSE
DRIVE_CONV_STATE eDriveConvState = DCS_NULL
//CONST_INT NUM_DRIVE_CONVS 5
CONST_INT iDriveConvTimer 10000
//STRING sDriveConvs[NUM_DRIVE_CONVS]
INT iCurrentDriveConv = -1
INT iPreviousDriveConv = -1
TEXT_LABEL_23 sSceneConvLine
/*VECTOR vOnFootEndPosMichael = <<-823.5155, 181.1892, 70.6611>>
FLOAT fOnFootEndRotMichael = 129.8824
VECTOR vOnFootEndPosJimmy = <<-824.33, 180.29, 71.55>>
FLOAT fOnFootEndRotJimmy = -31.51*/
VECTOR vJimmyFinalDest = <<-814.317505,179.017578,71.159195>>
VECTOR vJimmyFinalDestRear = <<-806.181396,184.289764,71.347694>>
VECTOR vKitchen = <<-801.9036, 182.9307, 71.6055>>
VECTOR vHotel = <<-1368.278687,355.901825,63.081089>>//<<-1320.7941, 380.0252, 68.0737>>
//CAMERA_INDEX ciHomeCam
INT iCutTimer
BOOL bSkipped
/*CONST_INT NUM_START_LINES 5
CONST_INT iStartLinesTimer 10000
STRING sStartLines[NUM_START_LINES]
INT iCurrentStartLine = 3//-1 // Currently Michael only says one line when going to find Jimmy, if the other lines are wanted again, these values must change back to -1
INT iPreviousStartLine = 3//-1
*/
CONST_FLOAT CHASE_SHOUT_DIST 50.0
CONST_INT NUM_CHASE_LINES 8//5
CONST_INT iChaseLinesTimer 5000
STRING sChaseLines[NUM_CHASE_LINES]
INT iCurrentChaseLine = -1
INT iPreviousChaseLine = -1
INT iJimmyChaseTimer = -1
BOOL bHasPlayerTouchedKidnapper = FALSE
BOOL bJimmyDadLinePlayed = FALSE
BOOL bPlayNoKillLine = TRUE
BOOL bTriggerSecondPhoneCall = TRUE
BOOL bStartFirstRecording = TRUE
/*CONST_INT NUM_TIED_LINES 5
STRING sTiedLines[NUM_TIED_LINES]
INT iCurrentTiedLine = 0*/
CONST_INT TIED_LINE_TIME 15000
INT iTiedLineTimer = 0
INT iConversationTimer
INT iPreChaseLinesTimer
INT iLookBehindTimer
BOOL bTurnOnVisibleDamage = FALSE
INT iVisibleDamageTimer = -1
CONST_INT DRIVING_LINES_TIMEOUT 9000
CONST_INT NUM_CRASH_LINES 6
INT iCrashLineTimer
STRING sCrashLines[NUM_CRASH_LINES]
INT iCurrentCrashLine = 0
CONST_INT NUM_CRIME_LINES 3
INT iCrimeLineTimer
STRING sCrimeLines[NUM_CRIME_LINES]
STRING sCrimeLinesNoKill[NUM_CRIME_LINES]
INT iCurrentCrimeLine = 0
CONST_INT NUM_STILL_LINES 3
INT iStillLineTimer
INT iStillTime
CONST_INT iStillTimeout 60
STRING sStillLines[NUM_STILL_LINES]
INT iCurrentStillLine = 0
CONST_INT NUM_AIM_LINES 4
INT iAimLineTimer
STRING sAimLines[NUM_AIM_LINES]
INT iCurrentAimLine = 0
CONST_INT SHOOTING_TIMEOUT 10000
INT iShootingLineTimer = 0
CONST_INT NUM_FOOT_CONVS 12//3
INT iFootConvTimer
STRING sFootConvs[NUM_FOOT_CONVS]
INT iCurrentFootConv = 0
CONST_FLOAT fFootConvDist 30.0
VEHICLE_INDEX viPlayersVehicle
CONST_INT iCheckVehicle 1000
INT iCheckVehicleTimer = 0
BOOL bAllowKidnapperDeadConv = TRUE
BOOL bKillLineOneReady = TRUE
//BOOL bKillLineTwoReady = TRUE
VECTOR vMissionLocation = <<-2271.74, 1070.36, 198.20>>
VECTOR vHomeLocation = <<-825.503540,179.026611,70.369011>>//<<-822.573730,182.467636,70.849342>>//<<-829.0000, 171.0000, 70.0000>>
VECTOR vHotelLocation = <<-1378.4454, 367.8120, 63.0445>>//<<-1317.6356, 391.5271, 68.6091>>
CONST_FLOAT fFailDistanceFirst 800.0
CONST_FLOAT fFailDistanceSecond 200.0
FLOAT fFailDistance = fFailDistanceFirst
CONST_FLOAT fVanWarnDistanceFirst 100.0
CONST_FLOAT fVanWarnDistanceSecond 500.0
FLOAT fVanWarnDistance = fVanWarnDistanceFirst
CONST_FLOAT fVanReturnDistance 50.0
CONST_FLOAT fWarnDistance 15.0
CONST_FLOAT fReturnDistance 5.0
CONST_FLOAT fSpawnSetupDist 1400.0//600.0//850.0//1000.0//600.0//400.0//200.0
MISSION_STATE missionState = MS_INIT
MISSION_SUBSTATE missionSubstate = MSS_PREPARE
MISSION_FAILED_REASON missionFailedReason = MFR_NONE
BLIP_INDEX biObjective
PED_INDEX piJimmy
REL_GROUP_HASH rghPlayer
CONST_INT NUM_KIDNAPPERS 3
PED_INDEX piKidnapper[NUM_KIDNAPPERS]
VEHICLE_SEAT vsKidnapperSeat[NUM_KIDNAPPERS]
MODEL_NAMES mnKidnapper = A_M_M_GENFAT_01
VEHICLE_INDEX viKidnapCar
MODEL_NAMES mnKidnapCar = LANDSTALKER
VECTOR vKidnapCarPosA = <<-2271.74, 1070.36, 198.20>>
FLOAT fKidnapCarHeadingA = 135.06
VECTOR vAreaAPos1 = <<-2223.215820,1009.274719,163.511749>>
VECTOR vAreaAPos2 = <<-2226.588135,1147.933105,270.956543>> // THIS ONE ADJUSTS MAX HEIGHT
VECTOR vAreaAPos1Alt = <<-2269.846924,891.106750,192.302780>>
VECTOR vAreaAPos2Alt = <<-2161.118896,1225.726929,500.543518>>
VECTOR vAreaBPos1 = <<-2402.328857,1057.228638,189.975388>>
VECTOR vAreaBPos2 = <<-2410.820068,1005.260376,200.859146>>
VECTOR vAreaBPos1Alt = <<-2328.858887,892.164307,196.736588>>
VECTOR vAreaBPos2Alt = <<-2333.411621,1221.692627,495.647705>>
FLOAT fAreaWidth = 90.0
FLOAT fAreaWidthAlt = 200.0
BOOL bShowHomeObjective = TRUE
BOOL bShowReturnObjective = TRUE
BOOL bGoToJimmy = FALSE
BOOL bShowReturnToVanMessage = TRUE
BOOL bDoneFailDialogue
// variables for dealing with the player bursting the car tyres
BOOL bTyresBurst = FALSE
INT iTyresBurstTimer = 0
CONST_INT iTyresTime 1000
// Clear this area if the player arrives home on foot
VECTOR vCutsceneAreaPos1 = <<-826.696777,178.020920,69.187263>>
VECTOR vCutsceneAreaPos2 = <<-817.752869,185.950363,72.353897>>
FLOAT fCutsceneAreaWidth = 7.0
VECTOR vCarMovePos = <<-826.00, 157.66, 69.06>>
FLOAT fCarMoveHead = 273.51
CONST_INT CP_MISSION_START 0
CONST_INT CP_AT_KIDNAPPER 1
CONST_INT CP_DRIVE_HOME 2
CONST_INT CP_MISSION_PASSED 3
// variables for dealing with the number of times the player has rammed the kidnappers
INT iVanRammedCount = 0
BOOL bVanRammedLastFrame = FALSE
FLOAT fPlayerVsVanClosingSpeedLastFrame = 0
INT iRamTimer = 0
// Timer to check if conversations have failed to trigger
INT iConvFailedTimer
//CONST_INT CONV_FAILED_TIME 5000
MODEL_NAMES mnRestartCar = TAILGATER
// To allow certain conversations to be interrupted by objectives
RC_CONV_RESTORE_STATE stateRestoreConversation
TEXT_LABEL_23 tSavedConversationRoot
TEXT_LABEL_23 tSavedConversationLabel
#IF IS_DEBUG_BUILD
MissionStageMenuTextStruct sSkipMenu[3]
#ENDIF
// ===========================================================================================================
// Termination
// ===========================================================================================================
/// PURPOSE:
/// Releases or deletes everything created by the mission
/// PARAMS:
/// deleteAll - True if everything should be deleted, false if things should be released
PROC RemovePedsAndVehicles(BOOL deleteAll = FALSE, BOOL bFailed = FALSE)
IF deleteAll
SAFE_DELETE_PED(piJimmy)
ELSE
IF IS_PED_UNINJURED(piJimmy) AND IS_PED_IN_GROUP(piJimmy)
REMOVE_PED_FROM_GROUP(piJimmy)
ENDIF
IF bFailed
SAFE_RELEASE_PED(piJimmy)
ELSE
IF IS_PED_UNINJURED(piJimmy) AND IS_ENTITY_AT_COORD(piJimmy, vHomeLocation, <<50,50,50>>)
RELEASE_PED_TO_FAMILY_SCENE(piJimmy)
ELSE
SAFE_RELEASE_PED(piJimmy)
ENDIF
ENDIF
ENDIF
INT i = 0
IF deleteAll
REPEAT NUM_KIDNAPPERS i
SAFE_DELETE_PED(piKidnapper[i])
ENDREPEAT
ELSE
REPEAT NUM_KIDNAPPERS i
SAFE_RELEASE_PED(piKidnapper[i])
ENDREPEAT
ENDIF
SAFE_REMOVE_BLIP(biObjective)
STOP_AUDIO_SCENES()
IF IS_VEHICLE_OK(viKidnapCar)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(viKidnapCar)
ENDIF
IF deleteAll
SAFE_DELETE_VEHICLE(viKidnapCar)
ELSE
SAFE_RELEASE_VEHICLE(viKidnapCar)
ENDIF
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Mission Cleanup
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Cleans up and ends the mission
PROC Mission_Cleanup(BOOL bFailed = FALSE)
CPRINTLN(DEBUG_MISSION,"...ME_Jimmy1 Cleanup")
RemovePedsAndVehicles(FALSE, bFailed)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
CLEAR_PRINTS()
KILL_FACE_TO_FACE_CONVERSATION()
REMOVE_ANIM_DICT(ANIM_DICT_JIMMY)
SET_WIDESCREEN_BORDERS(FALSE, 0)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA((vHotelLocation-<<10,10,10>>), (vHotelLocation+<<10,10,10>>),TRUE)
DISABLE_TAXI_HAILING(FALSE)
TERMINATE_THIS_THREAD()
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Mission Pass
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Passes the mission
PROC Mission_Passed()
CPRINTLN(DEBUG_MISSION,"...ME_Jimmy1 Passed")
//MISSION_FLOW_PLAY_END_OF_MISSION_MUSIC(TRUE)
Mission_Flow_Mission_Passed()
Mission_Cleanup()
ENDPROC
// ===========================================================================================================
// Helper Functions
// ===========================================================================================================
/// PURPOSE:
/// Checks if it's OK to play non-essential dialogue without it overriding god text
/// RETURNS:
/// TRUE if there's no god text or if the player isn't using subtitles
FUNC BOOL IsOkToPlayDialogue()
IF NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Suppresses the players vehicle model
PROC SUPPRESS_PLAYERS_VEHICLE()
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX viPlayerCar = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF IS_VEHICLE_OK(viPlayerCar)
MODEL_NAMES mnPlayerCar = GET_ENTITY_MODEL(viPlayerCar)
SET_VEHICLE_MODEL_IS_SUPPRESSED(mnPlayerCar, TRUE)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Plays the player's dialogue while driving to meet Jimmy
/*PROC PlayStartLines()
IF iCurrentStartLine < NUM_START_LINES AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT IS_THIS_PRINT_BEING_DISPLAYED("MEJ1_02") // Trash the kidnappers' ~r~car.
AND NOT IS_REPLAY_IN_PROGRESS()
IF iPreviousStartLine = iCurrentStartLine
iCurrentStartLine++
iConversationTimer = GET_GAME_TIMER() + iStartLinesTimer
ELSE
IF GET_GAME_TIMER() > iConversationTimer
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_MICHAEL", sStartLines[iCurrentStartLine], CONV_PRIORITY_MEDIUM)
iPreviousStartLine = iCurrentStartLine
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC*/
/// PURPOSE:
/// Plays the player's dialogue while chasing the kidnapper
PROC PlayChaseLines()
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piKidnapper[0]) AND IS_VEHICLE_OK(viKidnapCar) //AND IsOkToPlayDialogue()
IF iCurrentChaseLine = -1 AND iPreviousChaseLine = -1
IF NOT bHasPlayerTouchedKidnapper
bHasPlayerTouchedKidnapper = IS_ENTITY_TOUCHING_ENTITY(viKidnapCar, PLAYER_PED_ID())
ENDIF
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(viKidnapCar, PLAYER_PED_ID()) OR bHasPlayerTouchedKidnapper
//OR (GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piKidnapper[0]) < CHASE_SHOUT_DIST AND NOT IS_ENTITY_OCCLUDED(viKidnapCar))
//HANG_UP_AND_PUT_AWAY_PHONE(TRUE)
KILL_PHONE_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
//IF CHAR_CALL_PLAYER_CELLPHONE_FORCE_ANSWER(pedConvStruct, CHAR_JIMMY, "MEJ1AUD", "MEJ1_DAD", CONV_PRIORITY_MEDIUM)
/*BOOL bConvPlayed = FALSE
IF (GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piKidnapper[0]) > CHASE_SHOUT_DIST) OR bHasPlayerTouchedKidnapper
bConvPlayed = PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_RAM", "MEJ1_RAM_3", CONV_PRIORITY_MEDIUM)
ELSE
bConvPlayed = CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_SEES", CONV_PRIORITY_MEDIUM)
ENDIF
IF bConvPlayed*/
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_RAM", "MEJ1_RAM_3", CONV_PRIORITY_MEDIUM)
bTriggerSecondPhoneCall = TRUE
iCurrentChaseLine++
iConversationTimer = GET_GAME_TIMER() // want the next conversation to start immediately
// want the kidnapper to speed up the first time you damage him
TASK_VEHICLE_MISSION_PED_TARGET(piKidnapper[0], viKidnapCar, PLAYER_PED_ID(), MISSION_FLEE, 25.0, DRIVINGMODE_AVOIDCARS_RECKLESS, 100.0,1.0)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 0.0, REPLAY_IMPORTANCE_HIGH) // Record The player first attacking the kidnappers
//SET_VEHICLE_FORWARD_SPEED(viKidnapCar, 25.0)
//SET_DRIVE_TASK_CRUISE_SPEED(piKidnapper[0], 50.0)
// Make Jimmy turn around in the boot
eJimmysAnimStage = JA_ENTER_BACK
fFailDistance = fFailDistanceSecond
fVanWarnDistance = fVanWarnDistanceSecond
ENDIF
ELIF (GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piKidnapper[0]) < CHASE_SHOUT_DIST AND NOT IS_ENTITY_OCCLUDED(viKidnapCar))
IF GET_GAME_TIMER() > iPreChaseLinesTimer
BOOL bConvDone = FALSE
IF IS_MESSAGE_BEING_DISPLAYED()
bConvDone = CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_SEES", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
ELSE
bConvDone = CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_SEES", CONV_PRIORITY_MEDIUM)
ENDIF
IF bStartFirstRecording
REPLAY_RECORD_BACK_FOR_TIME(3.0, 0.0, REPLAY_IMPORTANCE_HIGH) // Record the player attacking the kidnappers for the first time
bStartFirstRecording = FALSE
ENDIF
IF bConvDone
iPreChaseLinesTimer = GET_GAME_TIMER() + 10000
ENDIF
ENDIF
ENDIF
ELSE
IF bTriggerSecondPhoneCall
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CHAR_CALL_PLAYER_CELLPHONE_FORCE_ANSWER(pedConvStruct, CHAR_JIMMY, "MEJ1AUD", "MEJ1_DAD", CONV_PRIORITY_MEDIUM)
bTriggerSecondPhoneCall = FALSE
ENDIF
ENDIF
ELIF iCurrentChaseLine < NUM_CHASE_LINES AND (GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piKidnapper[0]) < CHASE_SHOUT_DIST)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_THIS_PRINT_BEING_DISPLAYED("MEJ1_02") // Trash the kidnapper's ~r~van.
IF !bJimmyDadLinePlayed
AND CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_DSPOT", CONV_PRIORITY_MEDIUM)
CPRINTLN(DEBUG_MISSION, "PlayChaseLines: Triggering the new Dad! Dad! line")
iConversationTimer = GET_GAME_TIMER() + iChaseLinesTimer
bJimmyDadLinePlayed = TRUE
iJimmyChaseTimer = GET_GAME_TIMER() + 10000
ELIF iPreviousChaseLine = iCurrentChaseLine
iCurrentChaseLine++
iConversationTimer = GET_GAME_TIMER() + iChaseLinesTimer
ELSE
IF GET_GAME_TIMER() > iConversationTimer
//IF CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", sChaseLines[iCurrentChaseLine], CONV_PRIORITY_MEDIUM)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_MRAM", sChaseLines[iCurrentChaseLine], CONV_PRIORITY_MEDIUM)
iPreviousChaseLine = iCurrentChaseLine
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC PlayJimmyChaseLines()
IF iJimmyChaseTimer > 0 AND GET_GAME_TIMER() > iJimmyChaseTimer
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piJimmy)
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piJimmy) < CHASE_SHOUT_DIST
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_THIS_PRINT_BEING_DISPLAYED("MEJ1_02") // Trash the kidnapper's ~r~van.
IF bPlayNoKillLine
IF CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_DONT", CONV_PRIORITY_MEDIUM)
iJimmyChaseTimer = GET_GAME_TIMER() + 10000
bPlayNoKillLine = FALSE
ENDIF
ELSE
IF CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_CALL", CONV_PRIORITY_MEDIUM)
iJimmyChaseTimer = GET_GAME_TIMER() + 10000
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Plays dialogue where Jimmy shouts about being tied up in the back of the car
PROC PlayJimmyTiedLines()
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piJimmy)
//IF iCurrentTiedLine < NUM_TIED_LINES
IF GET_GAME_TIMER() > iTiedLineTimer
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_MESSAGE_BEING_DISPLAYED()
//IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_TIED", sTiedLines[iCurrentTiedLine], CONV_PRIORITY_MEDIUM)
IF CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_HERE", CONV_PRIORITY_MEDIUM)
//iCurrentTiedLine++
iTiedLineTimer = GET_GAME_TIMER() + TIED_LINE_TIME
ENDIF
ENDIF
ENDIF
//ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Loads the models used by the mission
PROC LoadMissionModels()
REQUEST_LOAD_MODEL(mnKidnapper)
REQUEST_LOAD_MODEL(GET_NPC_PED_MODEL(CHAR_JIMMY))
REQUEST_LOAD_MODEL(mnKidnapCar)
ENDPROC
FUNC PLAYER_REL_POS DetectPlayersRelativeSide()
IF IS_VEHICLE_OK(viKidnapCar) AND IS_ENTITY_IN_RANGE_ENTITY(viKidnapCar, PLAYER_PED_ID(), 10.0)
VECTOR vPlayersRelativePos
vPlayersRelativePos = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(viKidnapCar, GET_ENTITY_COORDS(PLAYER_PED_ID()))
IF vPlayersRelativePos.y < -1
RETURN PRP_BEHIND
ELIF vPlayersRelativePos.x < -1
RETURN PRP_RIGHT
ELIF vPlayersRelativePos.x > 1
RETURN PRP_LEFT
ELSE
RETURN PRP_BEHIND
ENDIF
ENDIF
RETURN PRP_NULL
ENDFUNC
PROC ControlJimmysAnims()
IF IS_PED_UNINJURED(piJimmy) AND IS_VEHICLE_OK(viKidnapCar)
SWITCH eJimmysAnimStage
CASE JA_READY
IF bExitBack OR NOT IS_VEHICLE_WINDOW_INTACT(viKidnapCar, SC_WINDSCREEN_REAR)
eJimmysAnimStage = JA_ENTER_BACKSEAT
ENDIF
BREAK
CASE JA_ENTER_BACK
iJimmyAnims = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>,<<0,0,0>>)
SET_SYNCHRONIZED_SCENE_PHASE(iJimmyAnims, 0.0)
SET_SYNCHRONIZED_SCENE_LOOPED(iJimmyAnims,FALSE)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iJimmyAnims,TRUE)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iJimmyAnims, viKidnapCar, GET_ENTITY_BONE_INDEX_BY_NAME(viKidnapCar, ANIM_ATTACH_POINT))
TASK_SYNCHRONIZED_SCENE(piJimmy, iJimmyAnims, ANIM_DICT_JIMMY, "enter_back", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, rbfSyncedScene)
bTurnOnVisibleDamage = FALSE
iVisibleDamageTimer = -1
eJimmysAnimStage = JA_EXITED_SIDE
BREAK
CASE JA_BACK
IF IS_SYNCHRONIZED_SCENE_RUNNING(iJimmyAnims)
IF bExitBack OR NOT IS_VEHICLE_WINDOW_INTACT(viKidnapCar, SC_WINDSCREEN_REAR)
eJimmysAnimStage = JA_EXIT_BACK
ELSE
SWITCH DetectPlayersRelativeSide()
CASE PRP_LEFT
eJimmysAnimStage = JA_ENTER_LEFT
BREAK
CASE PRP_RIGHT
eJimmysAnimStage = JA_ENTER_RIGHT
BREAK
ENDSWITCH
ENDIF
/*ELSE
iJimmyAnims = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>,<<0,0,0>>)
SET_SYNCHRONIZED_SCENE_LOOPED(iJimmyAnims,TRUE)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iJimmyAnims,FALSE)
IF IS_VEHICLE_OK(viKidnapCar)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iJimmyAnims, viKidnapCar, GET_ENTITY_BONE_INDEX_BY_NAME(viKidnapCar, ANIM_ATTACH_POINT))
ENDIF
TASK_SYNCHRONIZED_SCENE(piJimmy, iJimmyAnims, ANIM_DICT_JIMMY, "back", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, rbfSyncedScene)*/
//eJimmysAnimStage = JA_NULL
ENDIF
BREAK
CASE JA_ENTER_LEFT
iJimmyAnims = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>,<<0,0,0>>)
SET_SYNCHRONIZED_SCENE_PHASE(iJimmyAnims, 0.0)
SET_SYNCHRONIZED_SCENE_LOOPED(iJimmyAnims,FALSE)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iJimmyAnims,TRUE)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iJimmyAnims, viKidnapCar, GET_ENTITY_BONE_INDEX_BY_NAME(viKidnapCar, ANIM_ATTACH_POINT))
TASK_SYNCHRONIZED_SCENE(piJimmy, iJimmyAnims, ANIM_DICT_JIMMY, "enter_left", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, rbfSyncedScene)
eJimmysAnimStage = JA_LEFT
BREAK
CASE JA_LEFT
//IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iJimmyAnims)
IF IS_SYNCHRONIZED_SCENE_RUNNING(iJimmyAnims)
IF GET_SYNCHRONIZED_SCENE_PHASE(iJimmyAnims) >= 0.9
iJimmyAnims = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>,<<0,0,0>>)
SET_SYNCHRONIZED_SCENE_LOOPED(iJimmyAnims,TRUE)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iJimmyAnims,FALSE)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iJimmyAnims, viKidnapCar, GET_ENTITY_BONE_INDEX_BY_NAME(viKidnapCar, ANIM_ATTACH_POINT))
TASK_SYNCHRONIZED_SCENE(piJimmy, iJimmyAnims, ANIM_DICT_JIMMY, "left", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, rbfSyncedScene)
eJimmysAnimStage = JA_LEFT_PLAYING
ENDIF
ENDIF
BREAK
CASE JA_LEFT_PLAYING
IF IS_SYNCHRONIZED_SCENE_RUNNING(iJimmyAnims)
IF bExitBack OR NOT IS_VEHICLE_WINDOW_INTACT(viKidnapCar, SC_WINDSCREEN_REAR)
eJimmysAnimStage = JA_EXIT_LEFT
ELSE
SWITCH DetectPlayersRelativeSide()
CASE PRP_BEHIND
CASE PRP_RIGHT
eJimmysAnimStage = JA_EXIT_LEFT
BREAK
ENDSWITCH
ENDIF
ENDIF
BREAK
CASE JA_EXIT_LEFT
iJimmyAnims = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>,<<0,0,0>>)
SET_SYNCHRONIZED_SCENE_PHASE(iJimmyAnims, 0.0)
SET_SYNCHRONIZED_SCENE_LOOPED(iJimmyAnims,FALSE)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iJimmyAnims,TRUE)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iJimmyAnims, viKidnapCar, GET_ENTITY_BONE_INDEX_BY_NAME(viKidnapCar, ANIM_ATTACH_POINT))
TASK_SYNCHRONIZED_SCENE(piJimmy, iJimmyAnims, ANIM_DICT_JIMMY, "exit_left", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, rbfSyncedScene)
IF bExitBack OR (IS_VEHICLE_OK(viKidnapCar) AND NOT IS_VEHICLE_WINDOW_INTACT(viKidnapCar, SC_WINDSCREEN_REAR))
eJimmysAnimStage = JA_WAIT
ELSE
eJimmysAnimStage = JA_EXITED_SIDE
ENDIF
BREAK
CASE JA_ENTER_RIGHT
iJimmyAnims = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>,<<0,0,0>>)
SET_SYNCHRONIZED_SCENE_PHASE(iJimmyAnims, 0.0)
SET_SYNCHRONIZED_SCENE_LOOPED(iJimmyAnims,FALSE)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iJimmyAnims,TRUE)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iJimmyAnims, viKidnapCar, GET_ENTITY_BONE_INDEX_BY_NAME(viKidnapCar, ANIM_ATTACH_POINT))
TASK_SYNCHRONIZED_SCENE(piJimmy, iJimmyAnims, ANIM_DICT_JIMMY, "enter_right", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, rbfSyncedScene)
eJimmysAnimStage = JA_RIGHT
BREAK
CASE JA_RIGHT
//IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iJimmyAnims)
IF IS_SYNCHRONIZED_SCENE_RUNNING(iJimmyAnims)
IF GET_SYNCHRONIZED_SCENE_PHASE(iJimmyAnims) >= 0.9
iJimmyAnims = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>,<<0,0,0>>)
SET_SYNCHRONIZED_SCENE_LOOPED(iJimmyAnims,TRUE)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iJimmyAnims,FALSE)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iJimmyAnims, viKidnapCar, GET_ENTITY_BONE_INDEX_BY_NAME(viKidnapCar, ANIM_ATTACH_POINT))
TASK_SYNCHRONIZED_SCENE(piJimmy, iJimmyAnims, ANIM_DICT_JIMMY, "right", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, rbfSyncedScene)
eJimmysAnimStage = JA_RIGHT_PLAYING
ENDIF
ENDIF
BREAK
CASE JA_RIGHT_PLAYING
IF IS_SYNCHRONIZED_SCENE_RUNNING(iJimmyAnims)
IF bExitBack OR NOT IS_VEHICLE_WINDOW_INTACT(viKidnapCar, SC_WINDSCREEN_REAR)
eJimmysAnimStage = JA_EXIT_RIGHT
ELSE
SWITCH DetectPlayersRelativeSide()
CASE PRP_BEHIND
CASE PRP_LEFT
eJimmysAnimStage = JA_EXIT_RIGHT
BREAK
ENDSWITCH
ENDIF
ENDIF
BREAK
CASE JA_EXIT_RIGHT
iJimmyAnims = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>,<<0,0,0>>)
SET_SYNCHRONIZED_SCENE_PHASE(iJimmyAnims, 0.0)
SET_SYNCHRONIZED_SCENE_LOOPED(iJimmyAnims,FALSE)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iJimmyAnims,TRUE)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iJimmyAnims, viKidnapCar, GET_ENTITY_BONE_INDEX_BY_NAME(viKidnapCar, ANIM_ATTACH_POINT))
TASK_SYNCHRONIZED_SCENE(piJimmy, iJimmyAnims, ANIM_DICT_JIMMY, "exit_right", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, rbfSyncedScene)
IF bExitBack OR NOT IS_VEHICLE_WINDOW_INTACT(viKidnapCar, SC_WINDSCREEN_REAR)
eJimmysAnimStage = JA_WAIT
ELSE
eJimmysAnimStage = JA_EXITED_SIDE
ENDIF
BREAK
CASE JA_EXITED_SIDE
//IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iJimmyAnims)
IF IS_SYNCHRONIZED_SCENE_RUNNING(iJimmyAnims)
IF GET_SYNCHRONIZED_SCENE_PHASE(iJimmyAnims) >= 0.9
IF iVisibleDamageTimer < 0
bTurnOnVisibleDamage = TRUE
iVisibleDamageTimer = GET_GAME_TIMER() + 1000
ENDIF
iJimmyAnims = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>,<<0,0,0>>)
SET_SYNCHRONIZED_SCENE_LOOPED(iJimmyAnims,TRUE)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iJimmyAnims,FALSE)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iJimmyAnims, viKidnapCar, GET_ENTITY_BONE_INDEX_BY_NAME(viKidnapCar, ANIM_ATTACH_POINT))
TASK_SYNCHRONIZED_SCENE(piJimmy, iJimmyAnims, ANIM_DICT_JIMMY, "back", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, rbfSyncedScene)
eJimmysAnimStage = JA_BACK
ENDIF
ENDIF
BREAK
CASE JA_WAIT
IF IS_SYNCHRONIZED_SCENE_RUNNING(iJimmyAnims)
IF GET_SYNCHRONIZED_SCENE_PHASE(iJimmyAnims) >= 0.7
eJimmysAnimStage = JA_EXIT_BACK
ENDIF
ENDIF
BREAK
CASE JA_EXIT_BACK
iJimmyAnims = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>,<<0,0,0>>)
SET_SYNCHRONIZED_SCENE_PHASE(iJimmyAnims, 0.0)
SET_SYNCHRONIZED_SCENE_LOOPED(iJimmyAnims,FALSE)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iJimmyAnims,TRUE)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iJimmyAnims, viKidnapCar, GET_ENTITY_BONE_INDEX_BY_NAME(viKidnapCar, ANIM_ATTACH_POINT))
TASK_SYNCHRONIZED_SCENE(piJimmy, iJimmyAnims, ANIM_DICT_JIMMY, "exit_back", SLOW_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, rbfSyncedScene)
eJimmysAnimStage = JA_ENTER_BACKSEAT
BREAK
CASE JA_ENTER_BACKSEAT
// IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iJimmyAnims)
// iJimmyAnims = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>,<<0,0,0>>)
// SET_SYNCHRONIZED_SCENE_LOOPED(iJimmyAnims,FALSE)
// SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iJimmyAnims,FALSE)
// IF IS_VEHICLE_OK(viKidnapCar)
// ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iJimmyAnims, viKidnapCar, GET_ENTITY_BONE_INDEX_BY_NAME(viKidnapCar, "chassis_dummy"))
// ENDIF
// TASK_SYNCHRONIZED_SCENE(piJimmy, iJimmyAnims, ANIM_DICT_JIMMY, "enter_backseat", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, rbfSyncedScene)
// eJimmysAnimStage = JA_PUT_JIMMY_IN_SEAT
// ENDIF
IF IS_SYNCHRONIZED_SCENE_RUNNING(iJimmyAnims)
IF GET_SYNCHRONIZED_SCENE_PHASE(iJimmyAnims) >= 0.95
CPRINTLN(DEBUG_MISSION, "ControlJimmysAnims: JA_ENTER_BACKSEAT: Updating anim on phase ", GET_SYNCHRONIZED_SCENE_PHASE(iJimmyAnims))
iJimmyAnims = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>,<<0,0,0>>)
SET_SYNCHRONIZED_SCENE_PHASE(iJimmyAnims, 0.0)
SET_SYNCHRONIZED_SCENE_LOOPED(iJimmyAnims,FALSE)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iJimmyAnims,TRUE)
IF IS_VEHICLE_OK(viKidnapCar)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iJimmyAnims, viKidnapCar, GET_ENTITY_BONE_INDEX_BY_NAME(viKidnapCar, ANIM_ATTACH_POINT))
ENDIF
TASK_SYNCHRONIZED_SCENE(piJimmy, iJimmyAnims, ANIM_DICT_JIMMY, "enter_backseat", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, rbfSyncedScene)
eJimmysAnimStage = JA_PUT_JIMMY_IN_SEAT
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "ControlJimmysAnims: JA_ENTER_BACKSEAT: Updating anim on scene completed")
iJimmyAnims = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>,<<0,0,0>>)
SET_SYNCHRONIZED_SCENE_LOOPED(iJimmyAnims,FALSE)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iJimmyAnims,TRUE)
IF IS_VEHICLE_OK(viKidnapCar)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iJimmyAnims, viKidnapCar, GET_ENTITY_BONE_INDEX_BY_NAME(viKidnapCar, ANIM_ATTACH_POINT))
ENDIF
TASK_SYNCHRONIZED_SCENE(piJimmy, iJimmyAnims, ANIM_DICT_JIMMY, "enter_backseat", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, rbfSyncedScene)
eJimmysAnimStage = JA_PUT_JIMMY_IN_SEAT
ENDIF
BREAK
CASE JA_PUT_JIMMY_IN_SEAT
IF IS_SYNCHRONIZED_SCENE_RUNNING(iJimmyAnims)
IF GET_SYNCHRONIZED_SCENE_PHASE(iJimmyAnims) >= 0.85
CPRINTLN(DEBUG_MISSION, "ControlJimmysAnims: JA_PUT_JIMMY_IN_SEAT: Warped Jimmy into seat at phase ", GET_SYNCHRONIZED_SCENE_PHASE(iJimmyAnims))
//SET_ENTITY_COLLISION(piJimmy, TRUE)
//TASK_WARP_PED_INTO_VEHICLE(piJimmy, viKidnapCar, VS_BACK_RIGHT)
STOP_SYNCHRONIZED_ENTITY_ANIM(piJimmy, SLOW_BLEND_OUT, TRUE)
SAFE_SET_PED_INTO_VEHICLE(piJimmy, viKidnapCar, VS_BACK_RIGHT)
eJimmysAnimStage = JA_EXIT_VEHICLE
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "ControlJimmysAnims: JA_PUT_JIMMY_IN_SEAT: Warped Jimmy into seat on scene completed")
SET_ENTITY_COLLISION(piJimmy, TRUE)
//TASK_WARP_PED_INTO_VEHICLE(piJimmy, viKidnapCar, VS_BACK_RIGHT)
SAFE_SET_PED_INTO_VEHICLE(piJimmy, viKidnapCar, VS_BACK_RIGHT)
eJimmysAnimStage = JA_EXIT_VEHICLE
ENDIF
BREAK
CASE JA_EXIT_VEHICLE
IF IS_PED_IN_VEHICLE(piJimmy, viKidnapCar) AND bExitBack
// Only get out if player hasn't got in - B*1225919
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viKidnapCar)
TASK_LEAVE_ANY_VEHICLE(piJimmy, 0, ECF_DONT_DEFAULT_WARP_IF_DOOR_BLOCKED)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 0.0, REPLAY_IMPORTANCE_HIGH) // Record Jimmy leaving the car
ENDIF
eJimmysAnimStage = JA_NULL
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC
/// PURPOSE:
/// Makes a ped play animations to make them look behind in the car
/// PARAMS:
/// PedIndex - the ped who will look behind
/// iTime - how long to look behind for
/// Animflags - Any anim flags that are needed
PROC TASK_PLAY_LOOK_BEHIND_ANIM(PED_INDEX PedIndex, INT iTime = -1, ANIMATION_FLAGS Animflags = AF_DEFAULT)
IF DOES_ENTITY_EXIST(PedIndex)
IF NOT IS_ENTITY_DEAD(PedIndex)
STRING sEnterAnim
STRING sLoopAnim
STRING sExitAnim
SEQUENCE_INDEX SequenceIndex
VEHICLE_SEAT eSeat
IF IS_PED_SITTING_IN_ANY_VEHICLE(PedIndex)
VEHICLE_INDEX viPed = GET_VEHICLE_PED_IS_IN(PedIndex)
IF IS_VEHICLE_OK(viPed)
eSeat = GET_PED_VEHICLE_SEAT(PedIndex, viPed)
SWITCH eSeat
CASE VS_DRIVER
CASE VS_BACK_LEFT
sEnterAnim = "incar_lookbehind_enter_driver"
sLoopAnim = "incar_lookbehind_idle_driver"
sExitAnim = "incar_lookbehind_exit_driver"
BREAK
CASE VS_FRONT_RIGHT
CASE VS_BACK_RIGHT
sEnterAnim = "incar_lookbehind_enter_passenger"
sLoopAnim = "incar_lookbehind_idle_passenger"
sExitAnim = "incar_lookbehind_exit_passenger"
BREAK
ENDSWITCH
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_PLAY_ANIM(NULL, "missfam3", sEnterAnim, SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_UPPERBODY | Animflags)
TASK_PLAY_ANIM(NULL, "missfam3", sLoopAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, iTime, AF_UPPERBODY | Animflags | AF_LOOPING)
TASK_PLAY_ANIM(NULL, "missfam3", sExitAnim, NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_UPPERBODY | Animflags)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MAKE_KIDNAPPER_LOOK_AT_PLAYER()
IF HAS_ANIM_DICT_LOADED("missfam3")
IF GET_GAME_TIMER() > iLookBehindTimer
VECTOR vBehindKidnappers = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(viKidnapCar, <<0,-20,0>>)
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vBehindKidnappers, 20.0)
INT iPed = GET_RANDOM_INT_IN_RANGE(1, COUNT_OF(piKidnapper))
INT iLookBehindDelay = GET_RANDOM_INT_IN_RANGE(1, 6)
iLookBehindDelay*=1000
TASK_PLAY_LOOK_BEHIND_ANIM(piKidnapper[iPed], iLookBehindDelay)
iLookBehindTimer = GET_GAME_TIMER() + iLookBehindDelay
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Local replacement for CREATE_NPC_PED functions so you can specify a specific outfit
/// RETURNS:
/// TRUE when spawned
FUNC BOOL SPAWN_JIMMY(PED_INDEX &JimmyPed, VECTOR vCoords, FLOAT fHeading = 0.0, BOOL bCleanupModel = TRUE)
// Load the required model
MODEL_NAMES model = GET_NPC_PED_MODEL(CHAR_JIMMY)
REQUEST_MODEL(model)
IF HAS_MODEL_LOADED(model)
// Delete ped in case of weirdness- should be OK though
SAFE_DELETE_PED(JimmyPed)
JimmyPed = CREATE_PED(PEDTYPE_MISSION, model, vCoords, fHeading, FALSE, FALSE)
// Set up outfit
SET_PED_COMPONENT_VARIATION(JimmyPed, PED_COMP_TORSO, 6, 0)
SET_PED_COMPONENT_VARIATION(JimmyPed, PED_COMP_LEG, 0, 0)
SET_PED_COMPONENT_VARIATION(JimmyPed, PED_COMP_FEET, 0, 0)
SET_PED_COMPONENT_VARIATION(JimmyPed, PED_COMP_BERD, 3, 0) // No accessories
// StoreAsGlobalFriend(TraceyPed, CHAR_JIMMY) // The CREATE_NPC_PED func does this but it's not necessary AFAIK
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(model)
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Creates Jimmy, the kidnapper and the kidnapper's van
PROC SpawnMissionSetup()
IF IS_VEHICLE_OK(viKidnapCar)
INT i = 0
REPEAT NUM_KIDNAPPERS i
IF NOT IS_PED_UNINJURED(piKidnapper[i])
IF HAS_MODEL_LOADED(mnKidnapper)
piKidnapper[i] = CREATE_PED_INSIDE_VEHICLE(viKidnapCar, PEDTYPE_CIVMALE, mnKidnapper, vsKidnapperSeat[i])
SET_PED_COMPONENT_VARIATION(piKidnapper[i], INT_TO_ENUM(PED_COMPONENT,0), i, i, 0) //(head)
SET_PED_COMPONENT_VARIATION(piKidnapper[i], INT_TO_ENUM(PED_COMPONENT,2), i, i, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(piKidnapper[i], INT_TO_ENUM(PED_COMPONENT,3), i, i, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(piKidnapper[i], INT_TO_ENUM(PED_COMPONENT,4), i, i, 0) //(lowr)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(piKidnapper[i], TRUE)
SET_ENTITY_VISIBLE(piKidnapper[i], FALSE)
SET_PED_FLEE_ATTRIBUTES(piKidnapper[i], FA_USE_VEHICLE, FALSE)
SET_PED_FLEE_ATTRIBUTES(piKidnapper[i], FA_DISABLE_HANDS_UP, FALSE)
SET_PED_FLEE_ATTRIBUTES(piKidnapper[i], FA_FORCE_EXIT_VEHICLE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(piKidnapper[i], CA_ALWAYS_FLEE, TRUE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(piKidnapper[i], TRUE)
IF i = 0
ADD_PED_FOR_DIALOGUE(pedConvStruct, KIDNAPPER_ID, piKidnapper[i], "MEJimmyKidnapper", TRUE)
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF NOT IS_PED_UNINJURED(piJimmy)
IF HAS_MODEL_LOADED(GET_NPC_PED_MODEL(CHAR_JIMMY))
AND HAS_ANIM_DICT_LOADED(ANIM_DICT_JIMMY) // B*1260858
//CREATE_NPC_PED_INSIDE_VEHICLE(piJimmy, CHAR_JIMMY, viKidnapCar, VS_BACK_LEFT)
SPAWN_JIMMY(piJimmy, vKidnapCarPosA, fKidnapCarHeadingA)
//CREATE_NPC_PED_ON_FOOT(piJimmy, CHAR_JIMMY, vKidnapCarPosA, fKidnapCarHeadingA)
SET_ENTITY_VISIBLE(piJimmy, FALSE)
SET_PED_CAN_BE_TARGETTED(piJimmy, FALSE)
SET_PED_CONFIG_FLAG(piJimmy, PCF_GetOutUndriveableVehicle, FALSE)
SET_PED_CONFIG_FLAG(piJimmy, PCF_GetOutBurningVehicle, FALSE)
SET_PED_CONFIG_FLAG(piJimmy, PCF_OpenDoorArmIK, TRUE)
SET_PED_PATH_CAN_USE_CLIMBOVERS(piJimmy, TRUE)
SET_PED_PATH_CAN_DROP_FROM_HEIGHT(piJimmy, TRUE)
// Added for B* 1308548 - Jimmy uses the female skeleton which results in his helmet being offset, disabling helmet use was the best solution
SET_PED_HELMET(piJimmy, FALSE)
SET_ENTITY_PROOFS(piJimmy, TRUE, FALSE, FALSE, TRUE, TRUE)
SET_PED_CAN_RAGDOLL(piJimmy, FALSE)
SET_PED_RESET_FLAG(piJimmy, PRF_DisablePotentialBlastReactions, TRUE)
SET_PED_RESET_FLAG(piJimmy, PRF_DisableVehicleDamageReactions, TRUE)
SET_PED_RESET_FLAG(piJimmy, PRF_CannotBeTargetedByAI, TRUE)
//SET_PED_CONFIG_FLAG(piJimmy, PCF_WaitForDirectEntryPointToBeFreeWhenExiting, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(piJimmy, TRUE)
SET_PED_DIES_IN_WATER(piJimmy, TRUE)
SET_PED_DIES_IN_SINKING_VEHICLE(piJimmy, TRUE)
ADD_PED_FOR_DIALOGUE(pedConvStruct, JIMMY_ID, piJimmy, "JIMMY", TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), rghPlayer)
SET_PED_RELATIONSHIP_GROUP_HASH(piJimmy, rghPlayer)
SET_ENTITY_COLLISION(piJimmy, FALSE)
iJimmyAnims = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>,<<0,0,0>>)
SET_SYNCHRONIZED_SCENE_LOOPED(iJimmyAnims,TRUE)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iJimmyAnims,FALSE)
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iJimmyAnims, viKidnapCar, GET_ENTITY_BONE_INDEX_BY_NAME(viKidnapCar, ANIM_ATTACH_POINT))
TASK_SYNCHRONIZED_SCENE(piJimmy, iJimmyAnims, ANIM_DICT_JIMMY, "base", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, rbfSyncedScene)
eJimmysAnimStage = JA_READY
ENDIF
ENDIF
ELSE
IF HAS_MODEL_LOADED(mnKidnapCar)
viKidnapCar = CREATE_VEHICLE(mnKidnapCar, vKidnapCarPosA, fKidnapCarHeadingA)
//SET_VEHICLE_COLOUR_COMBINATION(viKidnapCar, 7)
SET_VEHICLE_COLOURS(viKidnapCar, 22, 22)
SET_VEHICLE_EXTRA_COLOURS(viKidnapCar, 0, 8)
SET_ENTITY_VISIBLE(viKidnapCar, FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(viKidnapCar, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(mnKidnapCar, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(mnKidnapCar)
//SET_VEHICLE_WINDOW_TINT(viKidnapCar, 0)
//SET_VEHICLE_MOD_KIT(viKidnapCar, 0)
SET_ENTITY_LOAD_COLLISION_FLAG(viKidnapCar, TRUE)
SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(viKidnapCar, FALSE)
bTurnOnVisibleDamage = FALSE
iVisibleDamageTimer = -1
ADD_ENTITY_TO_AUDIO_MIX_GROUP(viKidnapCar, "M_E_JIMMY_ENEMY_VEHICLE_GROUP")
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Teleports the kidnapper's van to an appropriate place based on where the player is and starts the chase if the player is in a trigger zone
/// RETURNS:
/// TRUE if the player is in one of the two trigger zones
FUNC BOOL StartCarChase()
IF IS_VEHICLE_OK(viKidnapCar) AND IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piKidnapper[0]) AND IS_PED_UNINJURED(piJimmy)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), vAreaAPos1, vAreaAPos2, fAreaWidth) OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), vAreaAPos1Alt, vAreaAPos2Alt, fAreaWidthAlt)
SET_ENTITY_COORDS(viKidnapCar, vKidnapCarPosA)
SET_ENTITY_HEADING(viKidnapCar, fKidnapCarHeadingA)
RETURN TRUE
ELIF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), vAreaBPos1, vAreaBPos2, fAreaWidth) OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), vAreaBPos1Alt, vAreaBPos2Alt, fAreaWidthAlt)
SET_ENTITY_COORDS(viKidnapCar, vKidnapCarPosA)
SET_ENTITY_HEADING(viKidnapCar, fKidnapCarHeadingA)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Have the tyres on the enemy car been burst?
/// RETURNS:
/// TRUE if more than two tyres have been burst
FUNC BOOL EnemyTyresBurst()
IF bTyresBurst
IF GET_GAME_TIMER() > iTyresBurstTimer
RETURN TRUE
ENDIF
ELSE
INT numTyres = 0
IF IS_VEHICLE_TYRE_BURST(viKidnapCar, SC_WHEEL_CAR_FRONT_LEFT)
numTyres++
ENDIF
IF IS_VEHICLE_TYRE_BURST(viKidnapCar, SC_WHEEL_CAR_FRONT_RIGHT)
numTyres++
ENDIF
IF IS_VEHICLE_TYRE_BURST(viKidnapCar, SC_WHEEL_CAR_REAR_LEFT)
numTyres++
ENDIF
IF IS_VEHICLE_TYRE_BURST(viKidnapCar, SC_WHEEL_CAR_REAR_RIGHT)
numTyres++
ENDIF
IF numTyres > 2
bTyresBurst = TRUE
iTyresBurstTimer = GET_GAME_TIMER() + iTyresTime
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Updates the fail reason, and sets the mission state to be fail delay
/// PARAMS:
/// eFailReason - the reason the player failed the mission
PROC SetFailReason(MISSION_FAILED_REASON eFailReason)
missionFailedReason = eFailReason
missionState = MS_FAIL_DELAY
missionSubstate = MSS_PREPARE
ENDPROC
/// PURPOSE:
/// Fails the mission if the player is too far from Jimmy
PROC TooFarFromJimmy()
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piJimmy)
IF (GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piJimmy) > fFailDistance)
IF missionState = MS_RESCUE_JIMMY AND missionSubstate = MSS_ACTIVE_ONE
SetFailReason(MFR_JIMMY_KIDNAPPED)
ELSE
SetFailReason(MFR_JIMMY_LEFT)
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Removes the upside down check from the kidnapper's van and starts the foot conversation timer
PROC CommonCollectionStuff()
iFootConvTimer = GET_GAME_TIMER() + DRIVING_LINES_TIMEOUT
missionSubstate = MSS_PREPARE
IF (GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0)
missionState = MS_DRIVE_HOME
ELSE
missionState = MS_LOSE_COPS
ENDIF
ENDPROC
/// PURPOSE:
/// Deals with the player rescuing Jimmy, either by releasing him or by taking the van
/// PARAMS:
/// bProperRescue - TRUE if the player has released Jimmy by walking to the back of the van, FALSE if they've taken the van without first releasing him
PROC PlayerCollectsJimmy()//BOOL bProperRescue = TRUE)
//IF bProperRescue
// Conversation is optional so not used with an IF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
//CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_RESCUED", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
IF IS_MESSAGE_BEING_DISPLAYED()
PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_WHERE", "MEJ1_WHERE_2", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
ELSE
PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_WHERE", "MEJ1_WHERE_2", CONV_PRIORITY_MEDIUM)
ENDIF
ENDIF
CommonCollectionStuff()
/*ELSE
// Conversation is optional so not used with an IF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_VAN", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
ENDIF
CommonCollectionStuff()
ENDIF*/
ENDPROC
/// PURPOSE:
/// Fails the mission if the player has injured or killed Jimmy, makes him respond appropriately if the player threatens him
PROC CheckJimmy()
IF missionState = MS_FAIL_DELAY
EXIT
ENDIF
IF DOES_ENTITY_EXIST(piJimmy) AND IS_PED_INJURED(piJimmy)
SetFailReason(MFR_JIMMY_DEAD)
ELIF IS_PED_UNINJURED(piJimmy) AND IS_PED_UNINJURED(PLAYER_PED_ID())
IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(piJimmy), 2.0)
AND NOT IS_EXPLOSION_IN_SPHERE(EXP_TAG_DIR_WATER_HYDRANT, GET_ENTITY_COORDS(piJimmy), 2.0)
//EXPLODE_PED_HEAD(piJimmy)
SET_PED_CAN_RAGDOLL(piJimmy, TRUE)
SET_PED_TO_RAGDOLL(piJimmy, 500, 1000, TASK_RELAX, FALSE, FALSE)
SET_ENTITY_HEALTH(piJimmy, 99)
SET_ENTITY_COLLISION(piJimmy, TRUE) // B* 1915369 - Jimmy fell through the road at this point
SetFailReason(MFR_JIMMY_DEAD)
ELIF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(piJimmy, PLAYER_PED_ID())
IF HAS_PED_BEEN_DAMAGED_BY_WEAPON(piJimmy, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON) OR HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE(piJimmy)
REMOVE_PED_FROM_GROUP(piJimmy)
SEQUENCE_INDEX siJimmy
OPEN_SEQUENCE_TASK(siJimmy)
IF IS_PED_IN_ANY_VEHICLE(piJimmy)
TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP | ECF_JUMP_OUT | ECF_DONT_CLOSE_DOOR)
ENDIF
TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 500, -1)
CLOSE_SEQUENCE_TASK(siJimmy)
TASK_PERFORM_SEQUENCE(piJimmy, siJimmy)
CLEAR_SEQUENCE_TASK(siJimmy)
SetFailReason(MFR_JIMMY_HURT)
ENDIF
ELSE
IF IS_ENTITY_ALIVE(viKidnapCar) AND (IS_PED_IN_VEHICLE(piJimmy, viKidnapCar) OR IS_ENTITY_PLAYING_ANIM(piJimmy, ANIM_DICT_JIMMY, "back", ANIM_SYNCED_SCENE)
OR IS_ENTITY_PLAYING_ANIM(piJimmy, ANIM_DICT_JIMMY, "base", ANIM_SYNCED_SCENE) OR IS_ENTITY_PLAYING_ANIM(piJimmy, ANIM_DICT_JIMMY, "enter_back", ANIM_SYNCED_SCENE)
OR IS_ENTITY_PLAYING_ANIM(piJimmy, ANIM_DICT_JIMMY, "enter_backseat", ANIM_SYNCED_SCENE) OR IS_ENTITY_PLAYING_ANIM(piJimmy, ANIM_DICT_JIMMY, "exit_back", ANIM_SYNCED_SCENE))
IF IS_ENTITY_ON_FIRE(viKidnapCar)
SetFailReason(MFR_JIMMY_HURT)
ENDIF
ENDIF
//IF IS_PLAYER_VISIBLY_TARGETTING_PED(piJimmy)
IF IS_PLAYER_FREE_AIMING(PLAYER_ID()) AND IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), piJimmy, 50.0) AND CAN_PED_SEE_PLAYER(piJimmy)
AND CAN_PED_SEE_PED(PLAYER_PED_ID(), piJimmy, 90.0)
//AND (IS_PED_HEADING_TOWARDS_POSITION(PLAYER_PED_ID(), GET_ENTITY_COORDS(piJimmy), 10.0))// OR IS_PED_HEADING_TOWARDS_POSITION(PLAYER_PED_ID(), GET_ENTITY_COORDS(piJimmy), -5.0))
IF iCurrentAimLine < NUM_AIM_LINES AND GET_GAME_TIMER() > iAimLineTimer
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_INJURE", sAimLines[iCurrentAimLine], CONV_PRIORITY_MEDIUM)
iCurrentAimLine++
iAimLineTimer = GET_GAME_TIMER() + DRIVING_LINES_TIMEOUT
ENDIF
ENDIF
ENDIF
IF (GET_SCRIPT_TASK_STATUS(piJimmy, SCRIPT_TASK_HANDS_UP) <> PERFORMING_TASK)
TASK_HANDS_UP(piJimmy, -1)
ENDIF
ELIF (GET_SCRIPT_TASK_STATUS(piJimmy, SCRIPT_TASK_HANDS_UP) = PERFORMING_TASK)
CLEAR_PED_TASKS(piJimmy)
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if the player has killed a kidnapper, fails if they have
PROC CheckKidnappers()
IF missionState = MS_FAIL_DELAY
EXIT
ENDIF
INT i_index = 0
REPEAT NUM_KIDNAPPERS i_index
IF DOES_ENTITY_EXIST(piKidnapper[i_index])
IF IS_PED_INJURED(piKidnapper[i_index])
SetFailReason(MFR_KIDNAPPER_DIED)
ENDIF
ENDIF
ENDREPEAT
ENDPROC
/*
INT iHandDropTimer = 0
IF IS_PLAYER_VISIBLY_TARGETTING_PED(piJimmy)
IF (GET_SCRIPT_TASK_STATUS(piJimmy, SCRIPT_TASK_HANDS_UP) <> PERFORMING_TASK)
TASK_HANDS_UP(piJimmy, -1)
ENDIF
iHandDropTimer = GET_GAME_TIMER() + 2000
ELIF (GET_GAME_TIMER() > iHandDropTimer)
IF (GET_SCRIPT_TASK_STATUS(piJimmy, SCRIPT_TASK_HANDS_UP) = PERFORMING_TASK)
CLEAR_PED_TASKS(piJimmy)
ENDIF
ENDIF
*/
//VECTOR D
//angle = DOT_PRODUCT(GET_ENTITY_FORWARD_VECTOR(PLAYER_PED_ID()), vNormalisedVec)
/// PURPOSE:
/// Checks if Michael and Jimmy are in the same vehicle
/// RETURNS:
/// True if they are in the same vehicle, false otherwise
FUNC BOOL MichaelAndJimmyInSameVehicle()
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX viTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF IS_VEHICLE_OK(viTemp) AND IS_PED_IN_VEHICLE(piJimmy, viTemp)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Checks if Michael and Jimmy are on foot
/// RETURNS:
/// True if they are both on foot, false otherwise
FUNC BOOL MichaelAndJimmyOnFoot()
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) OR IS_PED_IN_ANY_VEHICLE(piJimmy)
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Controls Michael and Jimmy's conversations while driving home
PROC ManageDriveConversations()
IF eDriveConvState = DCS_NULL
IF /*iCurrentDriveConv = -1 /*< NUM_DRIVE_CONVS AND*/ iPreviousDriveConv = -1 AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IsOkToPlayDialogue()
AND MichaelAndJimmyInSameVehicle() //OR MichaelAndJimmyOnFoot())
IF iPreviousDriveConv = iCurrentDriveConv
iCurrentDriveConv++
iConversationTimer = GET_GAME_TIMER() + iDriveConvTimer
ELSE
IF GET_GAME_TIMER() > iConversationTimer
//IF CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", sDriveConvs[iCurrentDriveConv], CONV_PRIORITY_MEDIUM)
IF CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_DRIVE1", CONV_PRIORITY_MEDIUM)
iPreviousDriveConv = iCurrentDriveConv
eDriveConvState = DCS_PLAYING
ENDIF
ENDIF
ENDIF
ENDIF
ELIF eDriveConvState = DCS_READY
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IsOkToPlayDialogue() AND MichaelAndJimmyInSameVehicle() AND GET_GAME_TIMER() > iConversationTimer
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(pedConvStruct, "MEJ1AUD", "MEJ1_DRIVE1", sSceneConvLine, CONV_PRIORITY_MEDIUM)
eDriveConvState = DCS_PLAYING
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Pauses the drive conversation ready to restart it
PROC PauseDriveConversation()
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()// AND eDriveConvState = DCS_PLAYING
TEXT_LABEL_23 tlConv
tlConv = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
STRING sConv
sConv = CONVERT_TEXT_LABEL_TO_STRING(tlConv)
IF ARE_STRINGS_EQUAL(sConv, "MEJ1_DRIVE1")
CPRINTLN(DEBUG_MISSION,"Drive conversation playing, ready to pause")
sSceneConvLine = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL()
CPRINTLN(DEBUG_MISSION,"Current conversation label is: ", sSceneConvLine)
IF ARE_STRINGS_EQUAL(sSceneConvLine, "") OR ARE_STRINGS_EQUAL(sSceneConvLine, "NULL")
eDriveConvState = DCS_FINISHED
ELSE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
iConversationTimer = GET_GAME_TIMER() + iDriveConvTimer
eDriveConvState = DCS_READY
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Tests if the player has hurt or killed a specific ped
/// PARAMS:
/// testPed - the ped to test
/// RETURNS:
/// TRUE if the ped has hurt or killed this ped
FUNC BOOL PedHurtByPlayer(PED_INDEX testPed)
IF IS_PED_INJURED(testPed) OR (IS_PED_UNINJURED(testPed) AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(testPed, PLAYER_PED_ID())) //OR IS_PLAYER_SHOOTING_NEAR_PED(testPed)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Jimmy speaks to Michael if the player kills the kidnapper
PROC ManageKillingKidnapper()
IF bAllowKidnapperDeadConv AND DOES_ENTITY_EXIST(piKidnapper[0]) AND DOES_ENTITY_EXIST(piKidnapper[1]) AND DOES_ENTITY_EXIST(piKidnapper[2]) AND IS_PED_UNINJURED(piJimmy)
AND NOT IS_MESSAGE_BEING_DISPLAYED()
/*IF PedHurtByPlayer(piKidnapper[0]) OR PedHurtByPlayer(piKidnapper[1]) OR PedHurtByPlayer(piKidnapper[2])
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF (HAS_ENTITY_CLEAR_LOS_TO_ENTITY(piJimmy, piKidnapper[0]) AND IS_PED_INJURED(piKidnapper[0]))
OR (HAS_ENTITY_CLEAR_LOS_TO_ENTITY(piJimmy, piKidnapper[1]) AND IS_PED_INJURED(piKidnapper[1]))
OR (HAS_ENTITY_CLEAR_LOS_TO_ENTITY(piJimmy, piKidnapper[2]) AND IS_PED_INJURED(piKidnapper[2]))
IF CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_KILL", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
bAllowKidnapperDeadConv = FALSE
ENDIF
ELSE
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_KILL", "MEJ1_KILL_1", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
bAllowKidnapperDeadConv = FALSE
ENDIF
ENDIF
ENDIF
ENDIF*/
/*IF IS_PED_INJURED(piKidnapper[0])
//KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
IF CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_KIDNAP", CONV_PRIORITY_MEDIUM)
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
bAllowKidnapperDeadConv = FALSE
ENDIF
ELIF IS_PED_INJURED(piKidnapper[1]) OR IS_PED_INJURED(piKidnapper[2])
//KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
IF CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_HENCH", CONV_PRIORITY_MEDIUM)
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
bAllowKidnapperDeadConv = FALSE
ENDIF
ELSE*/
//KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
IF CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_THANK", CONV_PRIORITY_MEDIUM)
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
bAllowKidnapperDeadConv = FALSE
ENDIF
//ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Plays dialogue if the player kills the kidnapper or a henchman
/*PROC PlayKillLines()
IF bKillLineOneReady
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_MESSAGE_BEING_DISPLAYED()
IF PedHurtByPlayer(piKidnapper[0]) OR PedHurtByPlayer(piKidnapper[1]) OR PedHurtByPlayer(piKidnapper[2])
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_KILL", "MEJ1_KILL_1", CONV_PRIORITY_MEDIUM)
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
bKillLineOneReady = FALSE
ENDIF
ENDIF
ENDIF
ELIF bKillLineTwoReady
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_MESSAGE_BEING_DISPLAYED()
IF PedHurtByPlayer(piKidnapper[0]) OR PedHurtByPlayer(piKidnapper[1]) OR PedHurtByPlayer(piKidnapper[2])
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_KILL", "MEJ1_KILL_2", CONV_PRIORITY_MEDIUM)
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
bKillLineTwoReady = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC*/
/// PURPOSE:
/// Controls Jimmy responding to the player crashing the car
PROC ManageCrashLines()
IF iCurrentCrashLine < NUM_CRASH_LINES AND GET_GAME_TIMER() > iCrashLineTimer /*AND IsOkToPlayDialogue()*/ AND MichaelAndJimmyInSameVehicle()
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) /*AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()*/ AND NOT IS_PED_STOPPED(PLAYER_PED_ID())
VEHICLE_INDEX viTemp
viTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF IS_VEHICLE_OK(viTemp)
IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(viTemp)
CPRINTLN(DEBUG_MISSION, "Player collided with something")
//PauseDriveConversation()
//KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
BOOL bConvDone = FALSE
IF IsOkToPlayDialogue()
bConvDone = PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_CRASH", sCrashLines[iCurrentCrashLine], CONV_PRIORITY_MEDIUM)
ELSE
bConvDone = PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_CRASH", sCrashLines[iCurrentCrashLine], CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
ENDIF
IF bConvDone
iCurrentCrashLine++
iCrashLineTimer = GET_GAME_TIMER() + DRIVING_LINES_TIMEOUT
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Controls Jimmy responding to the player committing crime
PROC ManageCrimeLines()
IF iCurrentCrimeLine < NUM_CRIME_LINES AND GET_GAME_TIMER() > iCrimeLineTimer //AND IsOkToPlayDialogue()
AND (MichaelAndJimmyInSameVehicle() OR MichaelAndJimmyOnFoot())
IF /*IS_PED_SHOOTING(PLAYER_PED_ID()) OR*/ HAS_PLAYER_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
//KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
CPRINTLN(DEBUG_MISSION, "Player hurt someone")
//PauseDriveConversation()
IF bKillLineOneReady
// Player hasn't killed any of the kidnappers
//IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
BOOL bConvDone = FALSE
IF IsOkToPlayDialogue()
bConvDone = PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_NOKILL", sCrimeLinesNoKill[iCurrentCrimeLine], CONV_PRIORITY_MEDIUM)
ELSE
bConvDone = PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_NOKILL", sCrimeLinesNoKill[iCurrentCrimeLine], CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
ENDIF
IF bConvDone
iCurrentCrimeLine++
iCrimeLineTimer = GET_GAME_TIMER() + DRIVING_LINES_TIMEOUT
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
ENDIF
//ENDIF
ELSE
// Player has killed at least one of the kidnappers
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_HITKILL", sCrimeLines[iCurrentCrimeLine], CONV_PRIORITY_MEDIUM)
iCurrentCrimeLine++
iCrimeLineTimer = GET_GAME_TIMER() + DRIVING_LINES_TIMEOUT
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
ENDIF
ENDIF
ENDIF
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Controls Jimmy responding to the player staying stationary
PROC ManageStationaryLines()
IF iCurrentStillLine < NUM_STILL_LINES AND GET_GAME_TIMER() > iStillLineTimer
AND (MichaelAndJimmyInSameVehicle() OR MichaelAndJimmyOnFoot())
IF IS_PED_STOPPED(PLAYER_PED_ID())
// check stopped timer, do line if too long
iStillTime++
IF iStillTime > iStillTimeout
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IsOkToPlayDialogue()
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_STILL", sStillLines[iCurrentStillLine], CONV_PRIORITY_MEDIUM)
iCurrentStillLine++
iStillTime = 0
iStillLineTimer = GET_GAME_TIMER() + DRIVING_LINES_TIMEOUT
ENDIF
ENDIF
ENDIF
ELSE
iStillTime = 0
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Manages conversations between Michael and the kidnapper if the player decides to chase after him
PROC ManageFootChaseLines()
IF iCurrentFootConv < NUM_FOOT_CONVS AND GET_GAME_TIMER() > iFootConvTimer AND IS_PED_UNINJURED(piKidnapper[0])
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piKidnapper[0]) < fFootConvDist
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IsOkToPlayDialogue()
//IF CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", sFootConvs[iCurrentFootConv], CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_FLEE", sFootConvs[iCurrentFootConv], CONV_PRIORITY_MEDIUM)
iCurrentFootConv++
iFootConvTimer = GET_GAME_TIMER() + DRIVING_LINES_TIMEOUT
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC ManageShootingLines()
IF GET_GAME_TIMER() > iShootingLineTimer
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IsOkToPlayDialogue() AND IS_PED_SHOOTING(PLAYER_PED_ID())
IF CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_SHOOT", CONV_PRIORITY_MEDIUM)
iShootingLineTimer = GET_GAME_TIMER() + SHOOTING_TIMEOUT
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if the player is close to the kidnappers in a cop car with the siren on
/// RETURNS:
/// TRUE if the ped is close, in a cop car and has the siren on
FUNC BOOL PlayerCloseInCopCar()
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_VEHICLE_OK(viKidnapCar)
VEHICLE_INDEX viPlayer = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF IS_VEHICLE_OK(viPlayer)
MODEL_NAMES mnPlayer = GET_ENTITY_MODEL(viPlayer)
IF IS_MODEL_POLICE_VEHICLE(mnPlayer) OR mnPlayer = POLICE4 OR mnPlayer = POLICEOLD1 OR mnPlayer = POLICEOLD2 OR mnPlayer = FBI
IF IS_VEHICLE_SIREN_ON(viPlayer) AND IS_ENTITY_IN_RANGE_ENTITY(viPlayer, viKidnapCar, 15.0)
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Gets the player's current car and adds it to the upside down check
PROC GetCurrentPlayersCar()
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND GET_GAME_TIMER() > iCheckVehicleTimer
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX viNewVehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF viNewVehicle <> viPlayersVehicle
IF IS_VEHICLE_OK(viPlayersVehicle)
SET_VEHICLE_AS_NO_LONGER_NEEDED(viPlayersVehicle)
ENDIF
viPlayersVehicle = viNewVehicle
ENDIF
ENDIF
iCheckVehicleTimer = GET_GAME_TIMER() + iCheckVehicle
ENDIF
ENDPROC
/// PURPOSE:
/// Makes Jimmy leave a submerged vehicle
PROC JimmyLeavesDrowningCar()
IF IS_PED_UNINJURED(piJimmy)
IF IS_PED_IN_ANY_VEHICLE(piJimmy)
VEHICLE_INDEX viVehicle = GET_VEHICLE_PED_IS_IN(piJimmy)
IF DOES_ENTITY_EXIST(viVehicle)
IF NOT IS_VEHICLE_DRIVEABLE(viVehicle) AND IS_ENTITY_IN_WATER(viVehicle)
TASK_LEAVE_ANY_VEHICLE(piJimmy, 0, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP | ECF_JUMP_OUT | ECF_DONT_CLOSE_DOOR)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Pick a sensible spawnpoint near to where the CP coords got set
/// PARAMS:
/// vCoords - Current checkpoint spawn vector, will be reset to one of the presets
/// fHeading - Current spawn heading, will be reset to one of the presets
PROC GET_NEAREST_PRESET_SPAWN_TO_CP(VECTOR &vCoords, FLOAT &fHeading)
// Set up possible spawn coords/heading
VECTOR vSpawnCoords[5]
FLOAT fSpawnHead[5]
vSpawnCoords[0] = << -2539.17, 1866.73, 166.10 >>
fSpawnHead[0] = 216.03
vSpawnCoords[1] = << -2022.33, 826.23, 162.32 >>
fSpawnHead[1] = 172.12
vSpawnCoords[2] = << -1038.30, 253.00, 64.21 >>
fSpawnHead[2] = 270.02
vSpawnCoords[3] = << -3140.89, 1024.06, 18.33 >>
fSpawnHead[3] = 152.08
vSpawnCoords[4] = << -2641.30, -110.03, 18.70 >>
fSpawnHead[4] = 221.35
// Index for best match found so far
INT iBestMatch = 0
INT iCount = 1
WHILE iCount < 5
// Compare distances for current 'best' and next in list (actually comparing the squares but amounts to the same thing)
IF VDIST2(vSpawnCoords[iCount], vCoords) < VDIST2(vSpawnCoords[iBestMatch], vCoords)
iBestMatch = iCount
ENDIF
iCount++
ENDWHILE
// Set the passed in variables to be the best match found
vCoords = vSpawnCoords[iBestMatch]
fHeading = fSpawnHead[iBestMatch]
ENDPROC
// ===========================================================================================================
// Debug functions
// ===========================================================================================================
/// PURPOSE:
/// Restarts the mission from the beginning
PROC RestartMission()
RC_START_Z_SKIP()
IF IS_PED_UNINJURED(PLAYER_PED_ID())
RemovePedsAndVehicles(TRUE)
LoadMissionModels()
VEHICLE_INDEX viTemp
CREATE_VEHICLE_FOR_REPLAY(viTemp, << -2086.9126, 951.6347, 183.7526 >>, 75.8, TRUE, TRUE, FALSE, TRUE, TRUE, mnRestartCar)
IF IS_VEHICLE_OK(viTemp)
SET_VEHICLE_ENGINE_ON(viTemp, TRUE, TRUE)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SpawnMissionSetup()
WHILE NOT IS_PED_UNINJURED(piJimmy) AND NOT IS_PED_UNINJURED(piKidnapper[0]) AND NOT IS_PED_UNINJURED(piKidnapper[1]) AND NOT IS_PED_UNINJURED(piKidnapper[2])
SpawnMissionSetup()
WAIT(0)
ENDWHILE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()))
IF IS_VEHICLE_OK(viTemp)
SET_VEHICLE_FORWARD_SPEED(viTemp, 25.0)
ENDIF
ENDIF
RC_END_Z_SKIP()
ENDPROC
/// PURPOSE:
/// Makes Jimmy walk off if the player debug passes the mission
PROC DebugPassDealWithJimmy()
IF IS_PED_UNINJURED(piJimmy)
IF IS_VEHICLE_OK(viKidnapCar)
IF IS_PED_IN_VEHICLE(piJimmy, viKidnapCar) AND IS_VEHICLE_SEAT_FREE(viKidnapCar, VS_FRONT_RIGHT)
SAFE_DELETE_PED(piJimmy)
EXIT
ENDIF
ENDIF
REMOVE_PED_FROM_GROUP(piJimmy)
SEQUENCE_INDEX siJimmy
OPEN_SEQUENCE_TASK(siJimmy)
IF IS_PED_IN_ANY_VEHICLE(piJimmy)
TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP)
ENDIF
TASK_WANDER_STANDARD(NULL)
CLOSE_SEQUENCE_TASK(siJimmy)
TASK_PERFORM_SEQUENCE(piJimmy, siJimmy)
CLEAR_SEQUENCE_TASK(siJimmy)
SET_PED_KEEP_TASK(piJimmy, TRUE)
SAFE_RELEASE_PED(piJimmy)
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if the shop scene models have loaded
/// PARAMS:
/// iTimer - timer to continue the mission if models have failed to load after one second
/// RETURNS:
/// TRUE when all models have loaded or one second has passed
FUNC BOOL AreSceneModelsLoaded(INT & iTimer)
IF iTimer < 0
iTimer = GET_GAME_TIMER() + 1000
ELIF GET_GAME_TIMER() > iTimer
CPRINTLN(DEBUG_MISSION, "TIMEOUT -- AreSceneModelsLoaded")
RETURN TRUE
ENDIF
IF NOT HAS_MODEL_LOADED(mnKidnapCar)
RETURN FALSE
ENDIF
IF NOT HAS_MODEL_LOADED(mnKidnapper)
RETURN FALSE
ENDIF
IF NOT HAS_MODEL_LOADED(GET_NPC_PED_MODEL(CHAR_JIMMY))
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Checks if the shop scene entities have been created
/// PARAMS:
/// iTimer - timer to continue the mission if models have failed to load after one second
/// RETURNS:
/// TRUE when they've all been created or if one second has passed
FUNC BOOL DoSceneEntitiesExist(INT & iTimer)
IF iTimer < 0
iTimer = GET_GAME_TIMER() + 1000
ELIF GET_GAME_TIMER() > iTimer
CPRINTLN(DEBUG_MISSION, "TIMEOUT -- DoSceneEntitiesExist")
RETURN TRUE
ENDIF
IF NOT DOES_ENTITY_EXIST(viKidnapCar)
RETURN FALSE
ENDIF
IF NOT DOES_ENTITY_EXIST(piKidnapper[0])
RETURN FALSE
ENDIF
IF NOT DOES_ENTITY_EXIST(piKidnapper[1])
RETURN FALSE
ENDIF
IF NOT DOES_ENTITY_EXIST(piKidnapper[2])
RETURN FALSE
ENDIF
IF NOT DOES_ENTITY_EXIST(piJimmy)
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Spawns the mission peds and vehicles if the player debug skips
PROC DebugSpawnMissionSetup()
INT iTimer = -1
LoadMissionModels()
WHILE NOT AreSceneModelsLoaded(iTimer)
WAIT(0)
ENDWHILE
iTimer = -1
SpawnMissionSetup()
WHILE NOT DoSceneEntitiesExist(iTimer)
SpawnMissionSetup()
WAIT(0)
ENDWHILE
ENDPROC
/// PURPOSE:
/// Skips to the Drive Home stage, used when restarting and Z skipping
/// PARAMS:
/// bDebugSkip - is this a debug skip?
PROC SKIP_TO_DRIVE_HOME(BOOL bDebugSkip = FALSE)
RemovePedsAndVehicles(TRUE)
DebugSpawnMissionSetup()
SET_ENTITY_VISIBLE(viKidnapCar, TRUE)
SET_ENTITY_VISIBLE(piJimmy, TRUE)
INT i = 0
REPEAT NUM_KIDNAPPERS i
SAFE_DELETE_PED(piKidnapper[i])
ENDREPEAT
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piJimmy)
SET_ENTITY_COLLISION(piJimmy, TRUE)
IF bDebugSkip
IF IS_VEHICLE_OK(viKidnapCar) AND IS_VEHICLE_SEAT_FREE(viKidnapCar) AND IS_VEHICLE_SEAT_FREE(viKidnapCar, VS_FRONT_RIGHT)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), viKidnapCar)
SET_PED_INTO_VEHICLE(piJimmy, viKidnapCar, VS_FRONT_RIGHT)
SET_VEHICLE_ENGINE_ON(viKidnapCar, TRUE, TRUE)
ENDIF
ELSE
VEHICLE_INDEX viTemp
VECTOR vPos = GET_REPLAY_CHECKPOINT_PLAYER_POSITION()
FLOAT fHeading
GET_NEAREST_PRESET_SPAWN_TO_CP(vPos, fHeading)
CREATE_VEHICLE_FOR_REPLAY(viTemp, vPos, fHeading, TRUE, FALSE, TRUE, TRUE, TRUE)
IF IS_VEHICLE_OK(viTemp) AND IS_VEHICLE_SEAT_FREE(viTemp, VS_FRONT_RIGHT) AND IS_PED_UNINJURED(piJimmy)
SET_PED_INTO_VEHICLE(piJimmy, viTemp, VS_FRONT_RIGHT)
SET_VEHICLE_ENGINE_ON(viTemp, TRUE, TRUE)
SAFE_RELEASE_VEHICLE(viKidnapCar)
ENDIF
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
ENDIF
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
bShowHomeObjective = TRUE
bShowReturnObjective = TRUE
bAllowKidnapperDeadConv = TRUE
iCurrentDriveConv = -1
iPreviousDriveConv = -1
iCurrentCrashLine = 0
iCurrentCrimeLine = 0
iCurrentStillLine = 0
iCrashLineTimer = 0
iCrimeLineTimer = 0
iStillLineTimer = 0
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_DRIVE_HOME, "Drive Home", TRUE)
missionSubstate = MSS_PREPARE
missionState = MS_DRIVE_HOME
ENDPROC
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Skips to the next stage of the mission
PROC J_SKIP()
RC_START_Z_SKIP()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
// used to deal with failing for taking too long. Commented out for now in case this is needed again
//iFailTimer = GET_CLOCK_HOURS()
SWITCH missionState
CASE MS_DRIVE_TO_LOCATION
IF IS_PED_UNINJURED(PLAYER_PED_ID())
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX viTemp
REQUEST_MODEL(mnRestartCar)
WHILE NOT HAS_MODEL_LOADED(mnRestartCar)
WAIT(0)
ENDWHILE
viTemp = CREATE_VEHICLE(mnRestartCar, << -2192.9592, 1044.9886, 191.9691 >>, 42.5)
WHILE NOT DOES_ENTITY_EXIST(viTemp)
WAIT(0)
ENDWHILE
IF IS_PED_UNINJURED(PLAYER_PED_ID())
TASK_WARP_PED_INTO_VEHICLE(PLAYER_PED_ID(), viTemp)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(mnRestartCar)
ELSE
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), << -2192.9592, 1044.9886, 191.9691 >>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 42.5)
ENDIF
DebugSpawnMissionSetup()
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
bAllowKidnapperDeadConv = TRUE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AT_KIDNAPPER, "Rescue Jimmy")
missionSubstate = MSS_PREPARE
missionState = MS_RESCUE_JIMMY
ENDIF
BREAK
CASE MS_RESCUE_JIMMY
INT i
i = 0
REPEAT NUM_KIDNAPPERS i
SAFE_DELETE_PED(piKidnapper[i])
ENDREPEAT
WHILE DOES_ENTITY_EXIST(piKidnapper[0]) OR DOES_ENTITY_EXIST(piKidnapper[1]) OR DOES_ENTITY_EXIST(piKidnapper[2])
WAIT(0)
ENDWHILE
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piJimmy) AND IS_VEHICLE_OK(viKidnapCar) AND IS_VEHICLE_SEAT_FREE(viKidnapCar)
AND IS_VEHICLE_SEAT_FREE(viKidnapCar, VS_FRONT_RIGHT)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), viKidnapCar)
SET_PED_INTO_VEHICLE(piJimmy, viKidnapCar, VS_FRONT_RIGHT)
SET_ENTITY_COLLISION(piJimmy, TRUE)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
ENDIF
bShowHomeObjective = TRUE
bAllowKidnapperDeadConv = TRUE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_DRIVE_HOME, "Drive Home", TRUE)
missionSubstate = MSS_PREPARE
missionState = MS_DRIVE_HOME
iCurrentDriveConv = -1
iPreviousDriveConv = -1
iCurrentCrashLine = 0
iCurrentCrimeLine = 0
iCurrentStillLine = 0
iCrashLineTimer = 0
iCrimeLineTimer = 0
iStillLineTimer = 0
BREAK
CASE MS_DRIVE_HOME
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piJimmy)
IF GetMichaelScheduleStage() = MSS_M4_WithoutFamily
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX viTemp
viTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF IS_VEHICLE_OK(viTemp) AND IS_PED_IN_VEHICLE(piJimmy, viTemp)
SET_ENTITY_COORDS(viTemp, vHotelLocation)
SET_ENTITY_HEADING(viTemp, 300.0)
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), vHotelLocation)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 300.0)
SET_ENTITY_COORDS(piJimmy, vHotelLocation+<<1,1,0>>)
SET_ENTITY_HEADING(piJimmy, 300.0)
ENDIF
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), vHotelLocation)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 300.0)
SET_ENTITY_COORDS(piJimmy, vHotelLocation+<<1,1,0>>)
SET_ENTITY_HEADING(piJimmy, 300.0)
ENDIF
ELSE
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX viTemp
viTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF IS_VEHICLE_OK(viTemp) AND IS_PED_IN_VEHICLE(piJimmy, viTemp)
SET_ENTITY_COORDS(viTemp, vHomeLocation)
SET_ENTITY_HEADING(viTemp, 300.0)
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), vHomeLocation)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 300.0)
SET_ENTITY_COORDS(piJimmy, vHomeLocation+<<1,1,0>>)
SET_ENTITY_HEADING(piJimmy, 300.0)
ENDIF
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), vHomeLocation)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 300.0)
SET_ENTITY_COORDS(piJimmy, vHomeLocation+<<1,1,0>>)
SET_ENTITY_HEADING(piJimmy, 300.0)
ENDIF
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_DRIVE_HOME, "Drive Home", TRUE)
ENDIF
BREAK
ENDSWITCH
RC_END_Z_SKIP()
ENDPROC
/// PURPOSE:
/// Skips to the previous stage of the mission
PROC P_SKIP()
RC_START_Z_SKIP()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
SWITCH missionState
CASE MS_RESCUE_JIMMY
IF IS_PED_UNINJURED(PLAYER_PED_ID())
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX viTemp
REQUEST_MODEL(mnRestartCar)
WHILE NOT HAS_MODEL_LOADED(mnRestartCar)
WAIT(0)
ENDWHILE
viTemp = CREATE_VEHICLE(mnRestartCar, << -2086.9126, 951.6347, 183.7526 >>, 75.8)
WHILE NOT DOES_ENTITY_EXIST(viTemp)
WAIT(0)
ENDWHILE
IF IS_PED_UNINJURED(PLAYER_PED_ID())
TASK_WARP_PED_INTO_VEHICLE(PLAYER_PED_ID(), viTemp)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(mnRestartCar)
ELSE
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), << -2086.9126, 951.6347, 183.7526 >>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 75.8)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
RemovePedsAndVehicles(TRUE)
bAllowKidnapperDeadConv = TRUE
missionSubstate = MSS_PREPARE
missionState = MS_DRIVE_TO_LOCATION
ENDIF
BREAK
CASE MS_DRIVE_HOME
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX viTemp
REQUEST_MODEL(mnRestartCar)
WHILE NOT HAS_MODEL_LOADED(mnRestartCar)
WAIT(0)
ENDWHILE
viTemp = CREATE_VEHICLE(mnRestartCar, << -2192.9592, 1044.9886, 191.9691 >>, 42.5)
WHILE NOT DOES_ENTITY_EXIST(viTemp)
WAIT(0)
ENDWHILE
IF IS_PED_UNINJURED(PLAYER_PED_ID())
TASK_WARP_PED_INTO_VEHICLE(PLAYER_PED_ID(), viTemp)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(mnRestartCar)
ELSE
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), << -2192.9592, 1044.9886, 191.9691 >>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 42.5)
ENDIF
RemovePedsAndVehicles(TRUE)
DebugSpawnMissionSetup()
bAllowKidnapperDeadConv = TRUE
iCurrentDriveConv = -1
iPreviousDriveConv = -1
iCurrentCrashLine = 0
iCurrentCrimeLine = 0
iCurrentStillLine = 0
iCrashLineTimer = 0
iCrimeLineTimer = 0
iStillLineTimer = 0
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AT_KIDNAPPER, "Rescue Jimmy")
missionSubstate = MSS_PREPARE
missionState = MS_RESCUE_JIMMY
BREAK
ENDSWITCH
RC_END_Z_SKIP()
ENDPROC
/// PURPOSE:
/// Skips to a player selected stage of the mission
PROC Z_SKIP()
INT debugJumpStage = -1
IF LAUNCH_MISSION_STAGE_MENU(sSkipMenu, debugJumpStage)
RC_START_Z_SKIP()
IF debugJumpStage = 0
// Drive to location
RestartMission()
missionSubstate = MSS_PREPARE
missionState = MS_DRIVE_TO_LOCATION
ELIF debugJumpStage = 1
// Rescue Jimmy
IF IS_PED_UNINJURED(PLAYER_PED_ID())
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX viTemp
REQUEST_MODEL(mnRestartCar)
WHILE NOT HAS_MODEL_LOADED(mnRestartCar)
WAIT(0)
ENDWHILE
viTemp = CREATE_VEHICLE(mnRestartCar, << -2192.9592, 1044.9886, 191.9691 >>, 42.5)
WHILE NOT DOES_ENTITY_EXIST(viTemp)
WAIT(0)
ENDWHILE
IF IS_PED_UNINJURED(PLAYER_PED_ID())
TASK_WARP_PED_INTO_VEHICLE(PLAYER_PED_ID(), viTemp)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(mnRestartCar)
ELSE
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), << -2192.9592, 1044.9886, 191.9691 >>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 42.5)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
bAllowKidnapperDeadConv = TRUE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
RemovePedsAndVehicles(TRUE)
DebugSpawnMissionSetup()
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AT_KIDNAPPER, "Rescue Jimmy")
missionSubstate = MSS_PREPARE
missionState = MS_RESCUE_JIMMY
ENDIF
ELIF debugJumpStage = 2
// Drive home
SKIP_TO_DRIVE_HOME(TRUE)
ENDIF
RC_END_Z_SKIP()
ENDIF
ENDPROC
/// PURPOSE:
/// Checks for the player pressing a skip stage debug key
PROC CheckDebugKeys()
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J))
J_SKIP()
ENDIF
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P))
P_SKIP()
ENDIF
Z_SKIP()
ENDPROC
#ENDIF
// ===========================================================================================================
// Mission state functions
// ===========================================================================================================
/// PURPOSE:
/// Initilises the mission
PROC INIT()
REQUEST_ADDITIONAL_TEXT("MEJ1", MISSION_TEXT_SLOT)
IF HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
CPRINTLN(DEBUG_MISSION,"MS_INIT")
IF IS_PED_UNINJURED(PLAYER_PED_ID())
ADD_PED_FOR_DIALOGUE(pedConvStruct, MICHAEL_ID, PLAYER_PED_ID(), "MICHAEL", TRUE)
ENDIF
ADD_PED_FOR_DIALOGUE(pedConvStruct, JIMMY_PHONE_ID, NULL, "JIMMY")
IF IS_PED_UNINJURED(PLAYER_PED_ID())
rghPlayer = GET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID())
ENDIF
DISABLE_TAXI_HAILING(TRUE)
// Set the instance priority
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_DRIVING)
REQUEST_ANIM_DICT(ANIM_DICT_JIMMY)
#IF IS_DEBUG_BUILD
sSkipMenu[0].sTxtLabel = "Drive to Jimmy"
sSkipMenu[1].sTxtLabel = "Rescue Jimmy"
sSkipMenu[2].sTxtLabel = "Drive home"
#ENDIF
/*sDriveConvs[0] = "MEJ1_DRIVE1"
sDriveConvs[1] = "MEJ1_DRIVE2"
sDriveConvs[2] = "MEJ1_DRIVE3"
sDriveConvs[3] = "MEJ1_DRIVE4"
sDriveConvs[4] = "MEJ1_DRIVE5"*/
/*sStartLines[0] = "MEJ1_MICHAEL_1"
sStartLines[1] = "MEJ1_MICHAEL_2"
sStartLines[2] = "MEJ1_MICHAEL_3"
sStartLines[3] = "MEJ1_MICHAEL_4"
sStartLines[4] = "MEJ1_MICHAEL_5"*/
/*sChaseLines[0] = "MEJ1_CHASE2"
sChaseLines[1] = "MEJ1_CHASE3"
sChaseLines[2] = "MEJ1_CHASE4"
sChaseLines[3] = "MEJ1_CHASE5"
sChaseLines[4] = "MEJ1_CHASE6"*/
sChaseLines[0] = "MEJ1_MRAM_1"
sChaseLines[1] = "MEJ1_MRAM_2"
sChaseLines[2] = "MEJ1_MRAM_3"
sChaseLines[3] = "MEJ1_MRAM_4"
sChaseLines[4] = "MEJ1_MRAM_5"
sChaseLines[2] = "MEJ1_MRAM_6"
sChaseLines[3] = "MEJ1_MRAM_7"
sChaseLines[4] = "MEJ1_MRAM_8"
/*sTiedLines[0] = "MEJ1_TIED_1"
sTiedLines[1] = "MEJ1_TIED_2"
sTiedLines[2] = "MEJ1_TIED_3"
sTiedLines[3] = "MEJ1_TIED_4"
sTiedLines[4] = "MEJ1_TIED_5"*/
sCrashLines[0] = "MEJ1_CRASH_1"
sCrashLines[1] = "MEJ1_CRASH_2"
sCrashLines[2] = "MEJ1_CRASH_3"
sCrashLines[3] = "MEJ1_CRASH_4"
sCrashLines[4] = "MEJ1_CRASH_5"
sCrashLines[5] = "MEJ1_CRASH_6"
sCrimeLines[0] = "MEJ1_HITKILL_1"
sCrimeLines[1] = "MEJ1_HITKILL_2"
sCrimeLines[2] = "MEJ1_HITKILL_3"
sCrimeLinesNoKill[0] = "MEJ1_NOKILL_1"
sCrimeLinesNoKill[1] = "MEJ1_NOKILL_2"
sCrimeLinesNoKill[2] = "MEJ1_NOKILL_3"
sStillLines[0] = "MEJ1_STILL_1"
sStillLines[1] = "MEJ1_STILL_2"
sStillLines[2] = "MEJ1_STILL_3"
sAimLines[0] = "MEJ1_INJURE_1"
sAimLines[1] = "MEJ1_INJURE_2"
sAimLines[2] = "MEJ1_INJURE_3"
sAimLines[3] = "MEJ1_INJURE_4"
/*sFootConvs[0] = "MEJ1_FOOT1"
sFootConvs[1] = "MEJ1_FOOT2"
sFootConvs[2] = "MEJ1_FOOT3"*/
sFootConvs[0] = "MEJ1_FLEE_1"
sFootConvs[1] = "MEJ1_FLEE_2"
sFootConvs[2] = "MEJ1_FLEE_3"
sFootConvs[3] = "MEJ1_FLEE_4"
sFootConvs[4] = "MEJ1_FLEE_5"
sFootConvs[5] = "MEJ1_FLEE_6"
sFootConvs[6] = "MEJ1_FLEE_7"
sFootConvs[7] = "MEJ1_FLEE_8"
sFootConvs[8] = "MEJ1_FLEE_9"
sFootConvs[9] = "MEJ1_FLEE_10"
sFootConvs[10] = "MEJ1_FLEE_11"
sFootConvs[11] = "MEJ1_FLEE_12"
vsKidnapperSeat[0] = VS_DRIVER
vsKidnapperSeat[1] = VS_FRONT_RIGHT
vsKidnapperSeat[2] = VS_BACK_LEFT
IF IS_REPEAT_PLAY_ACTIVE() AND IS_PED_UNINJURED(PLAYER_PED_ID())
VEHICLE_INDEX viTemp
VECTOR vPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
FLOAT fHead = GET_ENTITY_HEADING(PLAYER_PED_ID())
CREATE_VEHICLE_FOR_REPLAY(viTemp, vPos, fHead, TRUE, FALSE, TRUE, TRUE, TRUE)
ENDIF
IF IS_REPLAY_IN_PROGRESS()
INT iReplayStage = GET_REPLAY_MID_MISSION_STAGE()
IF g_bShitskipAccepted = TRUE
iReplayStage++ // player is skipping this stage
ENDIF
SWITCH iReplayStage
CASE CP_MISSION_START
// don't do anything to the player if they failed before even reaching the mission
VEHICLE_INDEX viTemp
CREATE_VEHICLE_FOR_PHONECALL_TRIGGER_REPLAY(viTemp, TRUE, TRUE, TRUE, TRUE, mnRestartCar)
IF IS_ENTITY_IN_RANGE_COORDS(viTemp, <<-811.343750,187.436691,71.478607>>, 6.0)
SET_ENTITY_COORDS(viTemp, <<-822.404419,182.607849,71.378090>>)
SET_ENTITY_HEADING(viTemp, 135.654083)
ENDIF
SAFE_RELEASE_VEHICLE(viTemp)
SUPPRESS_PLAYERS_VEHICLE()
SAFE_FADE_SCREEN_IN_FROM_BLACK()
missionSubstate = MSS_PREPARE
missionState = MS_DRIVE_TO_LOCATION
BREAK
CASE CP_AT_KIDNAPPER
// Give the player a car and respot them near the start of the chase
RestartMission()
SUPPRESS_PLAYERS_VEHICLE()
missionSubstate = MSS_PREPARE
missionState = MS_DRIVE_TO_LOCATION
BREAK
CASE CP_DRIVE_HOME
RC_START_Z_SKIP()
SKIP_TO_DRIVE_HOME()
SUPPRESS_PLAYERS_VEHICLE()
WAIT(500)
RC_END_Z_SKIP()
BREAK
CASE CP_MISSION_PASSED
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SAFE_FADE_SCREEN_IN_FROM_BLACK()
RC_END_Z_SKIP()
Mission_Passed()
BREAK
DEFAULT
SCRIPT_ASSERT("Replay in progress: Unknown checkpoint selected")
BREAK
ENDSWITCH
ELSE
CPRINTLN(DEBUG_MISSION, "Not on a replay")
SUPPRESS_PLAYERS_VEHICLE()
SAFE_FADE_SCREEN_IN_FROM_BLACK()
missionSubstate = MSS_PREPARE
missionState = MS_DRIVE_TO_LOCATION
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Player drives to the start of the car chsae
PROC DRIVE_TO_LOCATION()
HANDLE_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(stateRestoreConversation, pedConvStruct, "MEJ1AUD", tSavedConversationRoot, tSavedConversationLabel)
SWITCH missionSubstate
CASE MSS_PREPARE
CPRINTLN(DEBUG_MISSION,"Entering drive to location state")
SAFE_REMOVE_BLIP(biObjective)
biObjective = CREATE_COORD_BLIP(vMissionLocation, BLIPPRIORITY_MED, FALSE)
SET_BLIP_COLOUR(biObjective, BLIP_COLOUR_BLUE)
SET_BLIP_NAME_FROM_TEXT_FILE(biObjective, "MEJ1_JIM")
SET_BLIP_ROUTE(biObjective, TRUE)
SET_TAXI_DROPOFF_LOCATION_FOR_BLIP(biObjective, << -2086.9126, 951.6347, 183.7526 >>, 75.8)
PRINT_NOW("MEJ1_01", DEFAULT_GOD_TEXT_TIME, 1) // Save ~b~Jimmy.
CHECK_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT_NOW(stateRestoreConversation)
/*iCurrentStartLine = 3//-1
iPreviousStartLine = 3//-1
*/
LoadMissionModels()
IF IS_REPLAY_IN_PROGRESS()
missionSubstate = MSS_ACTIVE_THREE
ELSE
missionSubstate = MSS_ACTIVE_ONE
ENDIF
BREAK
CASE MSS_ACTIVE_ONE
//PlayStartLines()
// spawn mission set up when close enough
IF (GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMissionLocation) < fSpawnSetupDist)
missionSubstate = MSS_ACTIVE_TWO
ENDIF
BREAK
CASE MSS_ACTIVE_TWO
// start car chase and change state when close enough
SpawnMissionSetup()
IF StartCarChase()
IF CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_RAM2", CONV_PRIORITY_MEDIUM)
OR IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
missionSubstate = MSS_PREPARE
missionState = MS_RESCUE_JIMMY
ENDIF
ENDIF
// If Jimmy and the kidnapper have been created, play the phone conversation
IF IS_PED_UNINJURED(piJimmy) AND IS_PED_UNINJURED(piKidnapper[0])
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vMissionLocation, 150)
OR CHAR_CALL_PLAYER_CELLPHONE_FORCE_ANSWER(pedConvStruct, CHAR_JIMMY, "MEJ1AUD", "MEJ1_CLOSE", CONV_PRIORITY_MEDIUM)
missionSubstate = MSS_ACTIVE_THREE
ENDIF
ENDIF
BREAK
CASE MSS_ACTIVE_THREE
// start car chase and change state when close enough
SpawnMissionSetup()
IF StartCarChase()
IF CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_RAM2", CONV_PRIORITY_MEDIUM)
OR IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
missionSubstate = MSS_PREPARE
missionState = MS_RESCUE_JIMMY
ENDIF
ENDIF
BREAK
ENDSWITCH
IF NOT IS_AUDIO_SCENE_ACTIVE("M_E_JIMMY_GO_TO_JIMMY")
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
START_AUDIO_SCENE("M_E_JIMMY_GO_TO_JIMMY")
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// The player chases the kidnapper and smashes up his van before rescuing Jimmy
PROC RESCUE_JIMMY()
HANDLE_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(stateRestoreConversation, pedConvStruct, "MEJ1AUD", tSavedConversationRoot, tSavedConversationLabel)
SWITCH missionSubstate
CASE MSS_PREPARE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
CPRINTLN(DEBUG_MISSION,"Entering Resue Jimmy stage")
SAFE_REMOVE_BLIP(biObjective)
IF IS_VEHICLE_OK(viKidnapCar) AND IS_PED_UNINJURED(piKidnapper[0]) AND IS_PED_UNINJURED(piKidnapper[1]) AND IS_PED_UNINJURED(piKidnapper[2]) AND IS_PED_UNINJURED(piJimmy)
SET_ENTITY_VISIBLE(viKidnapCar, TRUE)
SET_VEHICLE_HAS_STRONG_AXLES(viKidnapCar, TRUE)
INT i
i = 0
REPEAT NUM_KIDNAPPERS i
SET_ENTITY_VISIBLE(piKidnapper[i], TRUE)
ENDREPEAT
SET_ENTITY_VISIBLE(piJimmy, TRUE)
SET_PED_DIES_INSTANTLY_IN_WATER(piJimmy, TRUE)
SET_VEHICLE_FORWARD_SPEED(viKidnapCar, 12)//23.0)
//TASK_VEHICLE_MISSION_PED_TARGET(piKidnapper[0], viKidnapCar, PLAYER_PED_ID(), MISSION_CRUISE, 12, DRIVINGMODE_AVOIDCARS_RECKLESS, 100.0,1.0)
TASK_VEHICLE_DRIVE_WANDER(piKidnapper[0], viKidnapCar, 12, DRIVINGMODE_AVOIDCARS_RECKLESS)
REQUEST_VEHICLE_ASSET(mnKidnapCar)
biObjective = CREATE_VEHICLE_BLIP(viKidnapCar, FALSE)
PRINT_NOW("MEJ1_02", DEFAULT_GOD_TEXT_TIME, 1) // Trash the kidnappers' ~r~car.
CHECK_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT_NOW(stateRestoreConversation)
PRINT_HELP("MEJ1_WARN")
// Give the player car strong axles
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX vehPTmp
vehPTmp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
SET_ENTITY_AS_MISSION_ENTITY(vehPTmp)
IF IS_ENTITY_ALIVE(vehPTmp)
SET_VEHICLE_HAS_STRONG_AXLES(vehPTmp, TRUE)
ENDIF
SAFE_RELEASE_VEHICLE(vehPTmp)
ENDIF
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("M_E_JIMMY_GO_TO_JIMMY")
STOP_AUDIO_SCENE("M_E_JIMMY_GO_TO_JIMMY")
ENDIF
START_AUDIO_SCENE("M_E_JIMMY_STOP_KIDNAPPERS")
iCurrentChaseLine = -1
iPreviousChaseLine = -1
iJimmyChaseTimer = -1
//iCurrentTiedLine = 0
iTiedLineTimer = 0
bTyresBurst = FALSE
bGoToJimmy = FALSE
bKillLineOneReady = TRUE
//bKillLineTwoReady = TRUE
bHasPlayerTouchedKidnapper = FALSE
bJimmyDadLinePlayed = FALSE
bPlayNoKillLine = TRUE
bExitBack = FALSE
bStartFirstRecording = TRUE
INIT_HAS_PLAYER_RAMMED_ENEMY_ENOUGH(bVanRammedLastFrame, iRamTimer, iVanRammedCount, fPlayerVsVanClosingSpeedLastFrame)
fFailDistance = fFailDistanceFirst
fVanWarnDistance = fVanWarnDistanceFirst
SET_WANTED_LEVEL_MULTIPLIER(0.1)
REQUEST_ANIM_DICT("missfam3")
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AT_KIDNAPPER, "Rescue Jimmy")
missionSubstate = MSS_ACTIVE_ONE
BREAK
CASE MSS_ACTIVE_ONE
MAKE_KIDNAPPER_LOOK_AT_PLAYER()
PlayChaseLines()
PlayJimmyChaseLines()
UPDATE_CHASE_BLIP(biObjective, piJimmy, fFailDistance)
IF IS_VEHICLE_OK(viKidnapCar) AND DOES_ENTITY_EXIST(piKidnapper[0])
IF bTurnOnVisibleDamage AND GET_GAME_TIMER() > iVisibleDamageTimer
SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(viKidnapCar, TRUE)
bTurnOnVisibleDamage = FALSE
ENDIF
CONTROL_VEHICLE_CHASE_HINT_CAM_ANY_MEANS(localChaseHintCamStruct, viKidnapCar)
IF (GET_ENTITY_HEALTH(viKidnapCar) < 850) OR EnemyTyresBurst()
OR PlayerCloseInCopCar()
OR HAS_PLAYER_RAMMED_ENEMY_ENOUGH(viKidnapCar, bVanRammedLastFrame, iRamTimer, iVanRammedCount, fPlayerVsVanClosingSpeedLastFrame)
OR (GET_VEHICLE_ENGINE_HEALTH(viKidnapCar) < 50)
OR (GET_VEHICLE_PETROL_TANK_HEALTH(viKidnapCar) < 50)
//OR IS_PED_INJURED(piKidnapper[0])
OR (IS_PED_UNINJURED(piKidnapper[0]) AND NOT IS_PED_IN_VEHICLE(piKidnapper[0], viKidnapCar))
OR IS_VEHICLE_STUCK_TIMER_UP(viKidnapCar, VEH_STUCK_HUNG_UP, KIDNAPPERS_STUCK_TIME)
OR IS_VEHICLE_STUCK_TIMER_UP(viKidnapCar, VEH_STUCK_JAMMED, KIDNAPPERS_STUCK_TIME)
OR IS_VEHICLE_STUCK_TIMER_UP(viKidnapCar, VEH_STUCK_ON_ROOF, KIDNAPPERS_STUCK_TIME)
OR IS_VEHICLE_STUCK_TIMER_UP(viKidnapCar, VEH_STUCK_ON_SIDE, KIDNAPPERS_STUCK_TIME)
IF IS_MOBILE_PHONE_CALL_ONGOING()
KILL_PHONE_CONVERSATION()
ENDIF
IF IS_PED_UNINJURED(piKidnapper[0])
TASK_VEHICLE_TEMP_ACTION(piKidnapper[0], viKidnapCar, TEMPACT_SWERVELEFT_STOP, 1000)
ENDIF
BRING_VEHICLE_TO_HALT(viKidnapCar, 20.0, 1)
REMOVE_ANIM_DICT("missfam3")
missionSubstate = MSS_ACTIVE_TWO
ENDIF
IF IS_ENTITY_ON_FIRE(viKidnapCar)
// if the car's on fire, fail the mission because Jimmy's still in it
SET_PED_CAN_RAGDOLL(piJimmy, TRUE)
SET_PED_TO_RAGDOLL(piJimmy, 500, 1000, TASK_RELAX, FALSE, FALSE)
SET_ENTITY_HEALTH(piJimmy, 99)
SetFailReason(MFR_JIMMY_DEAD)
ENDIF
ELIF DOES_ENTITY_EXIST(viKidnapCar)
REMOVE_ANIM_DICT("missfam3")
//missionSubstate = MSS_ACTIVE_TWO
IF IS_ENTITY_ON_FIRE(viKidnapCar)
// if the car's on fire, fail the mission because Jimmy's still in it
SET_PED_CAN_RAGDOLL(piJimmy, TRUE)
SET_PED_TO_RAGDOLL(piJimmy, 500, 1000, TASK_RELAX, FALSE, FALSE)
SET_ENTITY_HEALTH(piJimmy, 99)
SetFailReason(MFR_JIMMY_DEAD)
ENDIF
ENDIF
BREAK
CASE MSS_ACTIVE_TWO
UPDATE_CHASE_BLIP(biObjective, piJimmy, fFailDistance)
IF IS_VEHICLE_OK(viKidnapCar)
IF IS_VEHICLE_STOPPED(viKidnapCar)
INT i
i = 0
SEQUENCE_INDEX siFlee
REPEAT NUM_KIDNAPPERS i
IF IS_PED_UNINJURED(piKidnapper[i])
OPEN_SEQUENCE_TASK(siFlee)
TASK_PAUSE(NULL, (i*1000))
IF IS_PED_IN_VEHICLE(piKidnapper[i], viKidnapCar)
TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_RESUME_IF_INTERRUPTED | ECF_DONT_CLOSE_DOOR)
ENDIF
TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 500, -1)
CLOSE_SEQUENCE_TASK(siFlee)
TASK_PERFORM_SEQUENCE(piKidnapper[i], siFlee)
CLEAR_SEQUENCE_TASK(siFlee)
// non-essential conversation so not in an IF statement
IF i = 0 AND NOT PlayerCloseInCopCar()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_NERD", "MEJ1_NERD_1", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
ELIF ((i = 1 AND NOT IS_PED_UNINJURED(piKidnapper[0]))
OR (i = 2 AND NOT IS_PED_UNINJURED(piKidnapper[0]) AND NOT IS_PED_UNINJURED(piKidnapper[1]))) AND NOT PlayerCloseInCopCar()
ADD_PED_FOR_DIALOGUE(pedConvStruct, PASSENGER_ID, piKidnapper[i], "MEJimmyKidnapper2", TRUE)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_NERD", "MEJ1_NERD_2", CONV_PRIORITY_MEDIUM)
ELIF (i = 1 AND IS_PED_UNINJURED(piKidnapper[0]))
OR (i = 2 AND (IS_PED_UNINJURED(piKidnapper[0]) OR IS_PED_UNINJURED(piKidnapper[1])))
MAKE_PED_SCREAM(piKidnapper[i])
ENDIF
ENDIF
ENDREPEAT
SAFE_REMOVE_BLIP(biObjective)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(viKidnapCar, FALSE)
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
iCurrentFootConv = 0
iFootConvTimer = GET_GAME_TIMER() + DRIVING_LINES_TIMEOUT
IF IS_PED_UNINJURED(piJimmy) AND
(IS_VEHICLE_STUCK_TIMER_UP(viKidnapCar, VEH_STUCK_HUNG_UP, KIDNAPPERS_STUCK_TIME)
OR IS_VEHICLE_STUCK_TIMER_UP(viKidnapCar, VEH_STUCK_JAMMED, KIDNAPPERS_STUCK_TIME)
OR IS_VEHICLE_STUCK_TIMER_UP(viKidnapCar, VEH_STUCK_ON_ROOF, KIDNAPPERS_STUCK_TIME)
OR IS_VEHICLE_STUCK_TIMER_UP(viKidnapCar, VEH_STUCK_ON_SIDE, KIDNAPPERS_STUCK_TIME))
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piJimmy) > (fReturnDistance + 1.0)
biObjective = CREATE_PED_BLIP(piJimmy, TRUE, TRUE)
PRINT_NOW("MEJ1_07", DEFAULT_GOD_TEXT_TIME, 1) // Go to ~b~Jimmy.
CHECK_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT_NOW(stateRestoreConversation)
IF IS_AUDIO_SCENE_ACTIVE("M_E_JIMMY_STOP_KIDNAPPERS")
STOP_AUDIO_SCENE("M_E_JIMMY_STOP_KIDNAPPERS")
ENDIF
bGoToJimmy = TRUE
/*SEQUENCE_INDEX siLeave
OPEN_SEQUENCE_TASK(siLeave)
IF IS_PED_IN_VEHICLE(piJimmy, viKidnapCar)
TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_RESUME_IF_INTERRUPTED | ECF_DONT_CLOSE_DOOR)
ENDIF
TASK_COWER(NULL)
CLOSE_SEQUENCE_TASK(siLeave)
TASK_PERFORM_SEQUENCE(piJimmy, siLeave)
CLEAR_SEQUENCE_TASK(siLeave)*/
//eJimmysAnimStage = JA_EXIT_BACK
bExitBack = TRUE
iFootConvTimer = GET_GAME_TIMER() + DRIVING_LINES_TIMEOUT
missionSubstate = MSS_ACTIVE_THREE
ELSE
//TASK_LEAVE_ANY_VEHICLE(piJimmy)
//eJimmysAnimStage = JA_EXIT_BACK
bExitBack = TRUE
IF IS_AUDIO_SCENE_ACTIVE("M_E_JIMMY_STOP_KIDNAPPERS")
STOP_AUDIO_SCENE("M_E_JIMMY_STOP_KIDNAPPERS")
ENDIF
PlayerCollectsJimmy()
ENDIF
ELSE
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viKidnapCar)
//eJimmysAnimStage = JA_EXIT_BACK
bExitBack = TRUE
IF IS_AUDIO_SCENE_ACTIVE("M_E_JIMMY_STOP_KIDNAPPERS")
STOP_AUDIO_SCENE("M_E_JIMMY_STOP_KIDNAPPERS")
ENDIF
PlayerCollectsJimmy()
ELSE
biObjective = CREATE_VEHICLE_BLIP(viKidnapCar)
PRINT_NOW("MEJ1_03", DEFAULT_GOD_TEXT_TIME, 1) // Go to the ~b~van.
CHECK_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT_NOW(stateRestoreConversation)
IF IS_AUDIO_SCENE_ACTIVE("M_E_JIMMY_STOP_KIDNAPPERS")
STOP_AUDIO_SCENE("M_E_JIMMY_STOP_KIDNAPPERS")
ENDIF
iFootConvTimer = GET_GAME_TIMER() + DRIVING_LINES_TIMEOUT
missionSubstate = MSS_ACTIVE_THREE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MSS_ACTIVE_THREE
//ManageKillingKidnapper()
ManageFootChaseLines()
PlayJimmyTiedLines()
IF IS_VEHICLE_OK(viKidnapCar) AND IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piJimmy)
IF bShowReturnToVanMessage AND GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piJimmy) > fVanWarnDistance
PRINT_NOW("MEJ1_08", DEFAULT_GOD_TEXT_TIME, 1) // Return to the ~b~van.
CHECK_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT_NOW(stateRestoreConversation)
bShowReturnToVanMessage = FALSE
ENDIF
//IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF bGoToJimmy
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piJimmy) < fReturnDistance
CLEAR_PED_TASKS_IMMEDIATELY(piJimmy)
PlayerCollectsJimmy()
ENDIF
ELIF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), viKidnapCar) < (fReturnDistance - 1)
//TASK_LEAVE_ANY_VEHICLE(piJimmy)
//eJimmysAnimStage = JA_EXIT_BACK
bExitBack = TRUE
PlayerCollectsJimmy()
ENDIF
/*ELIF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viKidnapCar) AND IS_PED_IN_VEHICLE(piJimmy, viKidnapCar)
PlayerCollectsJimmy()
ENDIF*/
ENDIF
BREAK
ENDSWITCH
IF NOT IS_AUDIO_SCENE_ACTIVE("M_E_JIMMY_FOCUS_CAM")
IF IS_GAMEPLAY_HINT_ACTIVE()
START_AUDIO_SCENE("M_E_JIMMY_FOCUS_CAM")
ENDIF
ELSE
IF NOT IS_GAMEPLAY_HINT_ACTIVE()
STOP_AUDIO_SCENE("M_E_JIMMY_FOCUS_CAM")
ENDIF
ENDIF
IF IS_PED_UNINJURED(piJimmy)
SET_PED_RESET_FLAG(piJimmy, PRF_DisablePotentialBlastReactions, TRUE)
SET_PED_RESET_FLAG(piJimmy, PRF_DisableVehicleDamageReactions, TRUE)
SET_PED_RESET_FLAG(piJimmy, PRF_CannotBeTargetedByAI, TRUE)
ENDIF
ControlJimmysAnims()
//PlayKillLines()
TooFarFromJimmy()
ENDPROC
PROC CheckAtDestination()
VECTOR vDest
IF GetMichaelScheduleStage() = MSS_M4_WithoutFamily
vDest = vHotelLocation
ELSE
vDest = vHomeLocation
ENDIF
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vDest, <<1,1,LOCATE_SIZE_HEIGHT>>, TRUE)
OR (GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vDest) < LOCATE_SIZE_MISSION_TRIGGER)//5.0)
BOOL bIsOnGround
bIsOnGround = FALSE
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX viTemp
viTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF IS_VEHICLE_OK(viTemp)
IF IS_VEHICLE_ON_ALL_WHEELS(viTemp)
bIsOnGround = TRUE
ENDIF
ENDIF
ELSE
IF NOT IS_ENTITY_IN_AIR(PLAYER_PED_ID())
bIsOnGround = TRUE
ENDIF
ENDIF
IF bIsOnGround
missionSubstate = MSS_PREPARE
IF GetMichaelScheduleStage() = MSS_M4_WithoutFamily
missionState = MS_AT_HOTEL
ELSE
missionState = MS_AT_HOME
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// The player drives home with Jimmy
PROC DRIVE_HOME()
HANDLE_BUDDY_HEAD_TRACK_WHILE_ENTERING_VEHICLE()
HANDLE_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(stateRestoreConversation, pedConvStruct, "MEJ1AUD", tSavedConversationRoot, tSavedConversationLabel)
SWITCH missionSubstate
CASE MSS_PREPARE
CPRINTLN(DEBUG_MISSION,"Entering Drive home stage")
SAFE_REMOVE_BLIP(biObjective)
IF GetMichaelScheduleStage() = MSS_M4_WithoutFamily
biObjective = CREATE_COORD_BLIP(vHotelLocation)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA((vHotelLocation-<<10,10,10>>), (vHotelLocation+<<10,10,10>>),FALSE)
CLEAR_AREA_OF_VEHICLES(vHotelLocation, 10)
ELSE
biObjective = CREATE_COORD_BLIP(vHomeLocation)
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("M_E_JIMMY_STOP_KIDNAPPERS")
STOP_AUDIO_SCENE("M_E_JIMMY_STOP_KIDNAPPERS")
ENDIF
IF bShowHomeObjective
PRINT_NOW("MEJ1_04", DEFAULT_GOD_TEXT_TIME, 1) // Go ~y~home.
CHECK_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT_NOW(stateRestoreConversation)
START_AUDIO_SCENE("M_E_JIMMY_DRIVE_HOME")
bShowHomeObjective = FALSE
bShowReturnObjective = TRUE
iCurrentAimLine = 0
eDriveConvState = DCS_NULL
ENDIF
IF IS_PED_UNINJURED(piJimmy) AND NOT IS_PED_GROUP_MEMBER(piJimmy, PLAYER_GROUP_ID())
SET_PED_AS_GROUP_MEMBER(piJimmy, PLAYER_GROUP_ID())
SET_PED_GROUP_MEMBER_PASSENGER_INDEX(piJimmy, VS_FRONT_RIGHT)
SET_PED_NEVER_LEAVES_GROUP(piJimmy, TRUE)
SET_PED_DIES_INSTANTLY_IN_WATER(piJimmy, FALSE)
SET_ENTITY_PROOFS(piJimmy, TRUE, FALSE, FALSE, FALSE, TRUE)
SET_PED_CAN_RAGDOLL(piJimmy, TRUE)
ENDIF
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_DRIVE_HOME, "Drive Home", TRUE)
SET_WANTED_LEVEL_MULTIPLIER(0.1)
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
missionSubstate = MSS_ACTIVE_ONE
BREAK
CASE MSS_ACTIVE_ONE
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piJimmy)
ManageKillingKidnapper()
ManageDriveConversations()
ManageCrimeLines()
ManageCrashLines()
ManageStationaryLines()
ManageFootChaseLines()
ManageShootingLines()
GetCurrentPlayersCar()
JimmyLeavesDrowningCar()
CheckAtDestination()
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piJimmy) > fWarnDistance
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
missionSubstate = MSS_PREPARE
missionState = MS_RETURN_TO_JIMMY
ENDIF
IF (GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0)
missionSubstate = MSS_PREPARE
missionState = MS_LOSE_COPS
ENDIF
ENDIF
BREAK
ENDSWITCH
ControlJimmysAnims()
TooFarFromJimmy()
ENDPROC
/// PURPOSE:
/// The player returns to Jimmy after having gone too far from him
PROC RETURN_TO_JIMMY()
HANDLE_BUDDY_HEAD_TRACK_WHILE_ENTERING_VEHICLE()
HANDLE_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(stateRestoreConversation, pedConvStruct, "MEJ1AUD", tSavedConversationRoot, tSavedConversationLabel)
SWITCH missionSubstate
CASE MSS_PREPARE
CPRINTLN(DEBUG_MISSION,"Entering Return to Jimmy stage")
SAFE_REMOVE_BLIP(biObjective)
biObjective = CREATE_PED_BLIP(piJimmy, TRUE, TRUE)
IF bShowReturnObjective
PRINT_NOW("MEJ1_05", DEFAULT_GOD_TEXT_TIME, 1) // Return to ~b~Jimmy.
CHECK_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT_NOW(stateRestoreConversation)
bShowReturnObjective = FALSE
ENDIF
missionSubstate = MSS_ACTIVE_ONE
BREAK
CASE MSS_ACTIVE_ONE
JimmyLeavesDrowningCar()
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piJimmy)
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piJimmy) < fReturnDistance
CLEAR_THIS_PRINT("MEJ1_05") // Return to ~b~Jimmy.
missionSubstate = MSS_PREPARE
IF (GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0)
missionState = MS_DRIVE_HOME
ELSE
missionState = MS_LOSE_COPS
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
TooFarFromJimmy()
ENDPROC
/// PURPOSE:
/// The player must lose their wanted level to complete the mission
PROC LOSE_COPS()
HANDLE_BUDDY_HEAD_TRACK_WHILE_ENTERING_VEHICLE()
HANDLE_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(stateRestoreConversation, pedConvStruct, "MEJ1AUD", tSavedConversationRoot, tSavedConversationLabel)
SWITCH missionSubstate
CASE MSS_PREPARE
CPRINTLN(DEBUG_MISSION,"Entering Lose cops stage")
SAFE_REMOVE_BLIP(biObjective)
PRINT_NOW("MEJ1_06", DEFAULT_GOD_TEXT_TIME, 1) // Lose the cops.
CHECK_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT_NOW(stateRestoreConversation)
IF IS_PED_UNINJURED(piJimmy) AND NOT IS_PED_GROUP_MEMBER(piJimmy, PLAYER_GROUP_ID())
SET_PED_AS_GROUP_MEMBER(piJimmy, PLAYER_GROUP_ID())
SET_PED_GROUP_MEMBER_PASSENGER_INDEX(piJimmy, VS_FRONT_RIGHT)
SET_PED_NEVER_LEAVES_GROUP(piJimmy, TRUE)
SET_PED_DIES_INSTANTLY_IN_WATER(piJimmy, FALSE)
ENDIF
missionSubstate = MSS_ACTIVE_ONE
BREAK
CASE MSS_ACTIVE_ONE
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piJimmy)
ManageCrashLines()
ManageStationaryLines()
JimmyLeavesDrowningCar()
IF (GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0)
missionSubstate = MSS_PREPARE
missionState = MS_DRIVE_HOME
ENDIF
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piJimmy) > fWarnDistance
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
missionSubstate = MSS_PREPARE
missionState = MS_RETURN_TO_JIMMY
ENDIF
ENDIF
BREAK
ENDSWITCH
ControlJimmysAnims()
IF IS_PED_UNINJURED(piJimmy)
SET_PED_RESET_FLAG(piJimmy, PRF_CannotBeTargetedByAI, TRUE)
ENDIF
ENDPROC
/// PURPOSE:
/// The player arrives home with Jimmy
PROC AT_HOME()
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piJimmy)
SET_PED_RESET_FLAG(piJimmy, PRF_SearchForClosestDoor, TRUE )
VEHICLE_INDEX viTemp
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
viTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
ENDIF
HIDE_HUD_AND_RADAR_THIS_FRAME()
SWITCH missionSubstate
CASE MSS_PREPARE
CPRINTLN(DEBUG_MISSION,"Entering At home stage")
KILL_FACE_TO_FACE_CONVERSATION()
KILL_PHONE_CONVERSATION()
IF IS_AUDIO_SCENE_ACTIVE("M_E_JIMMY_DRIVE_HOME")
STOP_AUDIO_SCENE("M_E_JIMMY_DRIVE_HOME")
ENDIF
SAFE_REMOVE_BLIP(biObjective)
RC_START_CUTSCENE_MODE(<<0.0,0.0,0.0>>, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE)
/*ciHomeCam = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", << -840.7, 185.3, 78.4 >>, << -14.0, 0.0, -110.4 >>, 48.4)
SET_CAM_ACTIVE(ciHomeCam, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)*/
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
IF IS_VEHICLE_OK(viTemp)
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(viTemp)
ELSE
/*SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), vOnFootEndPosMichael)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fOnFootEndRotMichael)
CLEAR_PED_TASKS_IMMEDIATELY(piJimmy)
SET_ENTITY_COORDS_GROUNDED(piJimmy, vOnFootEndPosJimmy)
SET_ENTITY_HEADING(piJimmy, fOnFootEndRotJimmy)*/
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(vCutsceneAreaPos1, vCutsceneAreaPos2, fCutsceneAreaWidth, vCarMovePos, fCarMoveHead, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), piJimmy)
//TASK_TURN_PED_TO_FACE_ENTITY(piJimmy, PLAYER_PED_ID())
SEQUENCE_INDEX siJimmy
OPEN_SEQUENCE_TASK(siJimmy)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, GET_ENTITY_COORDS(PLAYER_PED_ID()), PEDMOVE_RUN)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 10000)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vKitchen, PEDMOVE_WALK)
CLOSE_SEQUENCE_TASK(siJimmy)
TASK_PERFORM_SEQUENCE(piJimmy, siJimmy)
CLEAR_SEQUENCE_TASK(siJimmy)
ENDIF
IF IS_PED_UNINJURED(piJimmy) AND IS_PED_IN_GROUP(piJimmy)
REMOVE_PED_FROM_GROUP(piJimmy)
ENDIF
iConvFailedTimer = -1
bSkipped = FALSE
missionSubstate = MSS_ACTIVE_ONE
BREAK
CASE MSS_ACTIVE_ONE
IF IS_VEHICLE_OK(viTemp)
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(viTemp)
ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
/*IF iConvFailedTimer = -1
iConvFailedTimer = GET_GAME_TIMER() + CONV_FAILED_TIME
ENDIF*/
IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), piJimmy, 5.0)
IF IS_VEHICLE_OK(viKidnapCar) AND IS_PED_UNINJURED(piJimmy) AND IS_PED_IN_VEHICLE(piJimmy, viKidnapCar) AND IS_VEHICLE_SEAT_FREE(viKidnapCar, VS_FRONT_RIGHT)
IF CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_HOME2", CONV_PRIORITY_MEDIUM)
OR CONVERSATION_TIMED_OUT(iConvFailedTimer)
//OR GET_GAME_TIMER() > iConvFailedTimer
missionSubstate = MSS_ACTIVE_TWO
ENDIF
ELSE
IF CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_HOME", CONV_PRIORITY_MEDIUM)
OR CONVERSATION_TIMED_OUT(iConvFailedTimer)
//OR GET_GAME_TIMER() > iConvFailedTimer
missionSubstate = MSS_ACTIVE_TWO
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
bSkipped = TRUE
SAFE_FADE_SCREEN_OUT_TO_BLACK()
missionSubstate = MSS_ACTIVE_THREE
ENDIF
BREAK
CASE MSS_ACTIVE_TWO
IF IS_VEHICLE_OK(viTemp)
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(viTemp)
/*IF NOT IsPedPerformingTask(piJimmy, SCRIPT_TASK_PAUSE) AND NOT IsPedPerformingTask(piJimmy, SCRIPT_TASK_LEAVE_ANY_VEHICLE)
AND NOT IsPedPerformingTask(piJimmy, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) AND NOT IsPedPerformingTask(piJimmy, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY)*/
IF IS_VEHICLE_STOPPED(viTemp)
//TASK_LEAVE_ANY_VEHICLE(piJimmy)
SEQUENCE_INDEX siLeaveVehicle
OPEN_SEQUENCE_TASK(siLeaveVehicle)
TASK_PAUSE(NULL, 6500)
TASK_LEAVE_ANY_VEHICLE(NULL)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 3000)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vKitchen, PEDMOVE_WALK)
CLOSE_SEQUENCE_TASK(siLeaveVehicle)
TASK_PERFORM_SEQUENCE(piJimmy, siLeaveVehicle)
CLEAR_SEQUENCE_TASK(siLeaveVehicle)
iCutTimer = GET_GAME_TIMER() + 25000
missionSubstate = MSS_ACTIVE_THREE
ENDIF
//ENDIF
ELSE
iCutTimer = GET_GAME_TIMER() + 25000
missionSubstate = MSS_ACTIVE_THREE
ENDIF
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
bSkipped = TRUE
SAFE_FADE_SCREEN_OUT_TO_BLACK()
missionSubstate = MSS_ACTIVE_THREE
ENDIF
BREAK
CASE MSS_ACTIVE_THREE
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
SAFE_FADE_SCREEN_OUT_TO_BLACK()
bSkipped = TRUE
ENDIF
IF (NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND (IS_ENTITY_IN_RANGE_COORDS_2D(piJimmy, vJimmyFinalDest, 2.0) OR IS_ENTITY_IN_RANGE_COORDS_2D(piJimmy, vJimmyFinalDestRear, 2.0))) // Normal completion
OR bSkipped // Player has skipped
OR (GET_GAME_TIMER() > iCutTimer) // Emergency timeout
#IF IS_DEBUG_BUILD
IF GET_GAME_TIMER() > iCutTimer
CPRINTLN(DEBUG_MISSION, "AT_HOME: ACTIVE_THREE cleaning up from timeout")
ELIF bSkipped
CPRINTLN(DEBUG_MISSION, "AT_HOME: ACTIVE_THREE cleaning up from skip")
ELSE
CPRINTLN(DEBUG_MISSION, "AT_HOME: ACTIVE_THREE cleaning up normally")
ENDIF
#ENDIF
IF bSkipped
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF IS_PED_UNINJURED(piJimmy)
CLEAR_PED_TASKS(piJimmy)
SET_ENTITY_COORDS(piJimmy, vKitchen)
SET_ENTITY_HEADING(piJimmy, 90)
ENDIF
WAIT(1000)
ENDIF
IF IS_PED_UNINJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS(PLAYER_PED_ID())
ENDIF
//RENDER_SCRIPT_CAMS(FALSE, FALSE)
SAFE_FADE_SCREEN_IN_FROM_BLACK()
RC_END_CUTSCENE_MODE()
//SET_GAMEPLAY_CAM_RELATIVE_HEADING()
//DESTROY_CAM(ciHomeCam)
Mission_Passed()
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC
PROC AT_HOTEL()
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piJimmy)
SET_PED_RESET_FLAG(piJimmy, PRF_SearchForClosestDoor, TRUE )
VEHICLE_INDEX viTemp
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
viTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
ENDIF
HIDE_HUD_AND_RADAR_THIS_FRAME()
SWITCH missionSubstate
CASE MSS_PREPARE
CPRINTLN(DEBUG_MISSION,"Entering At hotel stage")
KILL_FACE_TO_FACE_CONVERSATION()
KILL_PHONE_CONVERSATION()
IF IS_AUDIO_SCENE_ACTIVE("M_E_JIMMY_DRIVE_HOME")
STOP_AUDIO_SCENE("M_E_JIMMY_DRIVE_HOME")
ENDIF
SAFE_REMOVE_BLIP(biObjective)
RC_START_CUTSCENE_MODE(<<0.0,0.0,0.0>>, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE)
/*ciHomeCam = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", << -840.7, 185.3, 78.4 >>, << -14.0, 0.0, -110.4 >>, 48.4)
SET_CAM_ACTIVE(ciHomeCam, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)*/
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), piJimmy, -1, SLF_FAST_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
IF IS_VEHICLE_OK(viTemp)
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(viTemp)
ELSE
/*SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), vOnFootEndPosMichael)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fOnFootEndRotMichael)
CLEAR_PED_TASKS_IMMEDIATELY(piJimmy)
SET_ENTITY_COORDS_GROUNDED(piJimmy, vOnFootEndPosJimmy)
SET_ENTITY_HEADING(piJimmy, fOnFootEndRotJimmy)*/
TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), piJimmy)
//TASK_TURN_PED_TO_FACE_ENTITY(piJimmy, PLAYER_PED_ID())
SEQUENCE_INDEX siJimmy
OPEN_SEQUENCE_TASK(siJimmy)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, GET_ENTITY_COORDS(PLAYER_PED_ID()), PEDMOVE_RUN)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 10000)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vHotel, PEDMOVE_WALK)
CLOSE_SEQUENCE_TASK(siJimmy)
TASK_PERFORM_SEQUENCE(piJimmy, siJimmy)
CLEAR_SEQUENCE_TASK(siJimmy)
ENDIF
IF IS_PED_UNINJURED(piJimmy) AND IS_PED_IN_GROUP(piJimmy)
REMOVE_PED_FROM_GROUP(piJimmy)
ENDIF
iConvFailedTimer = -1
bSkipped = FALSE
IF (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) AND NOT IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID()))
OR (IS_PED_IN_ANY_VEHICLE(piJimmy, TRUE) AND NOT IS_PED_SITTING_IN_ANY_VEHICLE(piJimmy))
OR IS_PED_RAGDOLL(PLAYER_PED_ID())
OR IS_PED_RAGDOLL(piJimmy)
SAFE_FADE_SCREEN_OUT_TO_BLACK()
WAIT(1000)
SET_ENTITY_COORDS_NO_OFFSET(PLAYER_PED_ID(), <<-1374.11, 363.81, 64.25>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 117.46)
IF IS_PED_UNINJURED(piJimmy)
SET_ENTITY_COORDS_NO_OFFSET(piJimmy, <<-1375.82, 362.30, 64.17>>)
SET_ENTITY_HEADING(piJimmy, -49.27)
ENDIF
TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), piJimmy)
SEQUENCE_INDEX siJimmy
OPEN_SEQUENCE_TASK(siJimmy)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 10000)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vHotel, PEDMOVE_WALK)
CLOSE_SEQUENCE_TASK(siJimmy)
TASK_PERFORM_SEQUENCE(piJimmy, siJimmy)
CLEAR_SEQUENCE_TASK(siJimmy)
SAFE_FADE_SCREEN_IN_FROM_BLACK()
ENDIF
missionSubstate = MSS_ACTIVE_ONE
BREAK
CASE MSS_ACTIVE_ONE
IF IS_VEHICLE_OK(viTemp)
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(viTemp)
ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
/*IF iConvFailedTimer = -1
iConvFailedTimer = GET_GAME_TIMER() + CONV_FAILED_TIME
ENDIF*/
//IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), piJimmy, 5.0)
IF IS_VEHICLE_OK(viKidnapCar) AND IS_PED_UNINJURED(piJimmy) AND IS_PED_IN_VEHICLE(piJimmy, viKidnapCar) AND IS_VEHICLE_SEAT_FREE(viKidnapCar, VS_FRONT_RIGHT)
IF CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_HOME2", CONV_PRIORITY_MEDIUM)
OR CONVERSATION_TIMED_OUT(iConvFailedTimer)
//OR GET_GAME_TIMER() > iConvFailedTimer
missionSubstate = MSS_ACTIVE_TWO
ENDIF
ELSE
IF CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_HOME", CONV_PRIORITY_MEDIUM)
OR CONVERSATION_TIMED_OUT(iConvFailedTimer)
//OR GET_GAME_TIMER() > iConvFailedTimer
missionSubstate = MSS_ACTIVE_TWO
ENDIF
ENDIF
//ENDIF
ENDIF
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
bSkipped = TRUE
SAFE_FADE_SCREEN_OUT_TO_BLACK()
missionSubstate = MSS_ACTIVE_THREE
ENDIF
BREAK
CASE MSS_ACTIVE_TWO
IF IS_VEHICLE_OK(viTemp)
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(viTemp)
/*IF NOT IsPedPerformingTask(piJimmy, SCRIPT_TASK_PAUSE) AND NOT IsPedPerformingTask(piJimmy, SCRIPT_TASK_LEAVE_ANY_VEHICLE)
AND NOT IsPedPerformingTask(piJimmy, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) AND NOT IsPedPerformingTask(piJimmy, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY)*/
IF IS_VEHICLE_STOPPED(viTemp)
//TASK_LEAVE_ANY_VEHICLE(piJimmy)
SEQUENCE_INDEX siLeaveVehicle
OPEN_SEQUENCE_TASK(siLeaveVehicle)
TASK_PAUSE(NULL, 6500)
TASK_LEAVE_ANY_VEHICLE(NULL)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 3000)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vHotel, PEDMOVE_WALK)
CLOSE_SEQUENCE_TASK(siLeaveVehicle)
TASK_PERFORM_SEQUENCE(piJimmy, siLeaveVehicle)
CLEAR_SEQUENCE_TASK(siLeaveVehicle)
iCutTimer = GET_GAME_TIMER() + 25000
missionSubstate = MSS_ACTIVE_THREE
ENDIF
//ENDIF
ELSE
iCutTimer = GET_GAME_TIMER() + 25000
missionSubstate = MSS_ACTIVE_THREE
ENDIF
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
bSkipped = TRUE
SAFE_FADE_SCREEN_OUT_TO_BLACK()
missionSubstate = MSS_ACTIVE_THREE
ENDIF
BREAK
CASE MSS_ACTIVE_THREE
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
SAFE_FADE_SCREEN_OUT_TO_BLACK()
bSkipped = TRUE
ENDIF
IF (NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND (IS_ENTITY_IN_RANGE_COORDS_2D(piJimmy, vHotel, 4.0))) // Normal completion
OR bSkipped // Player has skipped
OR (GET_GAME_TIMER() > iCutTimer) // Emergency timeout
#IF IS_DEBUG_BUILD
IF GET_GAME_TIMER() > iCutTimer
CPRINTLN(DEBUG_MISSION, "AT_HOME: ACTIVE_THREE cleaning up from timeout")
ELIF bSkipped
CPRINTLN(DEBUG_MISSION, "AT_HOME: ACTIVE_THREE cleaning up from skip")
ELSE
CPRINTLN(DEBUG_MISSION, "AT_HOME: ACTIVE_THREE cleaning up normally")
ENDIF
#ENDIF
IF bSkipped
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
WAIT(1000)
ENDIF
IF IS_PED_UNINJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS(PLAYER_PED_ID())
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
ENDIF
//RENDER_SCRIPT_CAMS(FALSE, FALSE)
SAFE_DELETE_PED(piJimmy)
SAFE_FADE_SCREEN_IN_FROM_BLACK()
RC_END_CUTSCENE_MODE()
//SET_GAMEPLAY_CAM_RELATIVE_HEADING()
//DESTROY_CAM(ciHomeCam)
Mission_Passed()
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC
/// PURPOSE:
/// Fades out and fails the mission with a delay if needed
PROC FAIL_DELAY()
SWITCH missionSubstate
CASE MSS_PREPARE
CPRINTLN(DEBUG_MISSION,"Entering Fail delay stage")
CLEAR_PRINTS()
SAFE_REMOVE_BLIP(biObjective)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
// set if we have fail dialogue to play
bDoneFailDialogue = TRUE
IF missionFailedReason = MFR_JIMMY_HURT
bDoneFailDialogue = FALSE
iConvFailedTimer = -1
ENDIF
STRING sFailReason
SWITCH missionFailedReason
CASE MFR_NONE
BREAK
CASE MFR_JIMMY_HURT
sFailReason = "MEJ1_FAIL4" // ~r~You injured Jimmy.
BREAK
CASE MFR_JIMMY_DEAD
sFailReason = "MEJ1_FAIL1" // ~r~Jimmy died.
BREAK
CASE MFR_JIMMY_KIDNAPPED
sFailReason = "MEJ1_FAIL2" // ~r~The kidnapper escaped with Jimmy.
BREAK
CASE MFR_JIMMY_LEFT
sFailReason = "MEJ1_FAIL3" // ~r~You abandoned Jimmy.
BREAK
CASE MFR_KIDNAPPER_DIED
sFailReason = "MEJ1_FAIL5" // ~s~A kidnapper died.
BREAK
ENDSWITCH
IF missionFailedReason = MFR_NONE
Mission_Flow_Mission_Failed()
ELSE
MISSION_FLOW_MISSION_FAILED_WITH_REASON(sFailReason)
ENDIF
missionSubstate = MSS_ACTIVE_ONE
BREAK
CASE MSS_ACTIVE_ONE
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
// This must only take 1 frame and terminate the thread
RemovePedsAndVehicles(TRUE)
Mission_Cleanup(TRUE)
ELSE
// not finished fading out
// you may want to handle dialogue etc here.
IF bDoneFailDialogue = FALSE
IF IS_PED_UNINJURED(piJimmy)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
/*IF iConvFailedTimer = -1
iConvFailedTimer = GET_GAME_TIMER() + CONV_FAILED_TIME
ENDIF*/
IF CREATE_CONVERSATION(pedConvStruct, "MEJ1AUD", "MEJ1_INJURE", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
OR CONVERSATION_TIMED_OUT(iConvFailedTimer)
//OR GET_GAME_TIMER() > iConvFailedTimer
bDoneFailDialogue = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
// ===========================================================================================================
// Script Loop
// ===========================================================================================================
SCRIPT
CPRINTLN(DEBUG_MISSION,"...ME_Jimmy1 Launched")
IF (HAS_FORCE_CLEANUP_OCCURRED())
CPRINTLN(DEBUG_MISSION,"...ME_Jimmy1 Force Cleanup")
Mission_Flow_Mission_Force_Cleanup()
Mission_Cleanup(TRUE)
ENDIF
SET_MISSION_FLAG(TRUE)
// Uncomment to display polys
//SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
WHILE (TRUE)
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_PO")
// Uncomment to display polys
//DRAW_DEBUG_POLY_ANGLED_AREA(vAreaAPos1, vAreaAPos2, fAreaWidth, 255, 0, 0, 255, TRUE, FALSE)
//DRAW_DEBUG_POLY_ANGLED_AREA(vAreaAPos1Alt, vAreaAPos2Alt, fAreaWidthAlt, 0, 255, 255, 255, TRUE, FALSE)
//DRAW_DEBUG_POLY_ANGLED_AREA(vAreaBPos1, vAreaBPos2, fAreaWidth, 0, 255, 0, 255, TRUE, FALSE)
//DRAW_DEBUG_POLY_ANGLED_AREA(vAreaBPos1Alt, vAreaBPos2Alt, fAreaWidthAlt, 0, 0, 255, 255, TRUE, FALSE)
SWITCH missionState
CASE MS_INIT
INIT()
BREAK
CASE MS_DRIVE_TO_LOCATION
DRIVE_TO_LOCATION()
BREAK
CASE MS_RESCUE_JIMMY
RESCUE_JIMMY()
BREAK
CASE MS_DRIVE_HOME
DRIVE_HOME()
BREAK
CASE MS_RETURN_TO_JIMMY
RETURN_TO_JIMMY()
BREAK
CASE MS_LOSE_COPS
LOSE_COPS()
BREAK
CASE MS_AT_HOME
AT_HOME()
BREAK
CASE MS_AT_HOTEL
AT_HOTEL()
BREAK
CASE MS_FAIL_DELAY
FAIL_DELAY()
BREAK
ENDSWITCH
CheckJimmy()
CheckKidnappers()
#IF IS_DEBUG_BUILD
IF missionState <> MS_FAIL_DELAY
// Check for Pass
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
CLEAR_PRINTS()
DebugPassDealWithJimmy()
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
Mission_Passed()
ENDIF
// Check for Fail
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
SetFailReason(MFR_NONE)
ENDIF
CheckDebugKeys()
ENDIF
#ENDIF
WAIT(0)
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT