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