////////////////////////////////////////////////////////////////////////////////////////////////////// // // // SCRIPT NAME : Assassin_Hooker.sch // // AUTHOR : Michael Bagley // // DESCRIPTION : Vice Assassination Script - Kill the target after he picks up the hooker // // // ////////////////////////////////////////////////////////////////////////////////////////////////////// //Compile out Title Update changes to header functions. //Must be before includes. //CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R. USING "Assassin_Core.sch" USING "Assassin_Shared.sch" USING "Assassination_briefing_lib.sch" USING "replay_public.sch" USING "clearMissionArea.sch" USING "chase_hint_cam.sch" USING "timelapse.sch" USING "replay_private.sch" USING "load_queue_public.sch" #IF IS_DEBUG_BUILD USING "shared_debug.sch" USING "script_debug.sch" USING "select_mission_stage.sch" #ENDIF // ********************************** Script Globals ************************************* ENUM CAM_VICE_ENUM CAM_VICE_PICK_CAM = 0, CAM_VICE_CONTROL_CAM ENDENUM ENUM MISSION_VICE_STAGE MISSION_VICE_SETUP, MISSION_SEND_FIRST_CAR, MISSION_VICE_SEND_CARS, MISSION_VICE_CHECK_CARS, MISSION_VICE_ENTER_CAR, MISSION_VICE_FOLLOW_CAR, MISSION_VICE_PARK_CAR, MISSION_VICE_TASK_PLAYER, MISSION_VICE_CAR_FUN, MISSION_VICE_TARGET_LEAVE, MISSION_VICE_TARGET_POST_KNOCKOUT, MISSION_VICE_TARGET_ESCAPE, MISSION_VICE_TARGET_COMBAT ENDENUM MISSION_VICE_STAGE targetStage // ------------------------------Cutscene variables------------------------------ ENUM PAYPHONE_CUTSCENE PAYPHONE_CUTSCENE_INIT = 0, PAYPHONE_CUTSCENE_UPDATE, PAYPHONE_CUTSCENE_SKIP, PAYPHONE_CUTSCENE_CLEANUP ENDENUM PAYPHONE_CUTSCENE payPhoneCutsceneStages = PAYPHONE_CUTSCENE_INIT OBJECT_INDEX oPayPhone, oPayPhoneAnimated CAMERA_INDEX camPayPhoneIntro01 VECTOR vPhoneLocation = <<214.3677, -853.6607, 29.3826>> VECTOR vPlayerWarpPosition = <<214.1545, -853.6061, 29.3878>> FLOAT fPlayerWarpHeading = 346.6454 FLOAT fCutsceneLength = 40.0 FLOAT fRightX, fRightY VECTOR vCameraPosition01 = <<215.2688, -853.8094, 30.9712>> VECTOR vCameraRotation01 = <<-3.6234, -0.0263, 57.0304>> structTimer tPayphoneCutsceneTimer structTimer tPayphoneCameraTimer BOOL bSkipCutscene = FALSE BOOL bPlayedPayPhoneConvo = FALSE BOOL bTargetKillLinePlayed = FALSE BOOL bPlayerWentWanted = FALSE VECTOR scenePosition = <<0,0,0>> VECTOR sceneRotation = <<0,0,0>> INT iSceneId INT iIntroCameraStages = 0 INT iNavMeshBlocking STREAMVOL_ID svPhoneCutscene // ------------------------------Cutscene variables------------------------------ ASS_ARGS asnArgs ASS_TARGET_DATA targetData //PASS_REASON_ENUM passReasonVice //BOOL bTestingJapaneseVersion BOOL bTargetSpottedPlayerInScrapyard BOOL bPimpDialogue BOOL bHookDialogue BOOL bDrugDialogue BOOL bPrintedMsg BOOL bPlayerBlockingDeal BOOL bTargetCarStuck BOOL bTestDummyCarForPanic BOOL bReplaying = FALSE BOOL bFirstObjectivePrinted BOOL bPedConfigFlagsRestored BOOL bReplayVehicleAvailable = FALSE BOOL bDetachGirlFromCar = FALSE BOOL bPanicLinePlayed = FALSE //BOOL bSetActionMode = FALSE BOOL bIntroDone = FALSE BOOL bRunIntro = FALSE BOOL bTaskedTarget = FALSE BOOL bFinishedWaypointRecording = FALSE BOOL bTriggeredSecondMusicCue = FALSE BOOL bPickupLinePlayed = FALSE BOOL bCasualConversationFinished = FALSE BOOL bPlayedRegularLine = FALSE BOOL bPlayedCheapLine = FALSE BOOL bHookerInCar = FALSE BOOL bHookerTaskedToEnterCar = FALSE BOOL bTailedTooClose = FALSE BOOL bPlayedCellPhoneCall = FALSE BOOL bTooCloseToBouncingCar = FALSE BOOL bTaskedToLookAtTarget = FALSE //BOOL bMinorAttacked = FALSE //BOOL bTooCloseConvo01 = FALSE BOOL bTriggeredAggro = FALSE //BOOL bGivenSubtask = FALSE BOOL bPlayPanicAnimation = FALSE //BOOL bDebugSkipping = FALSE BOOL bLeaveAreaPrinted = FALSE BOOL bChaseHintCamKilled = FALSE BOOL bKillTargetCheckpointSet = FALSE //BOOL bFirstCheckpointSceneLoad = FALSE //BOOL bSecondCheckpointSceneLoad = FALSE //BOOL bThirdCheckpointSceneLoad = FALSE BOOL bPlayedFirstConvo = FALSE BOOL bGrabbedPosition = FALSE BOOL bCreatedViceScene = FALSE BOOL bContinueWithScene = FALSE BOOL bTaskedHookerCheap = FALSE BOOL bTriggeredCopsMusicCue = FALSE STRING sPanicLine STRING sHookerAnimDict = "mini@hookers_spvanilla" INT iSpeechStage INT iFrameCountAsn INT iStageToUse INT iFollowTooCloseStages = 0 INT iFirstCarStages = 0 INT iCounter = 0 INT iWalkByGirlStages = 0 FLOAT fTooCloseTime = -1 VEHICLE_INDEX viParkedCar VEHICLE_INDEX viReplayVehicle VEHICLE_INDEX viFirstCar PED_INDEX pedFirstDriver PED_INDEX pedWalkByGirl MODEL_NAMES mnToUse VECTOR vTargetStartPos VECTOR vDummyStartPos VECTOR vIntroCutscenePos[2] VECTOR vTargetCarPos VECTOR vJunkyardPos = << -442.38562, -1704.35461, 17.89104 >> VECTOR vSphereToCheckForSendCars = << -524.8151, -1771.9265, 20.3315 >> VECTOR vPlayerKillPosition VECTOR vRandomVehicleDriveToPos = << -694.35645, -1607.84534, 21.08559 >> //VECTOR vTargetVehiclePosition = << -595.08, -1811.84, 22.5398 >> //FLOAT fTargetVehicleHeading = 66.860649 VECTOR vMoveVehiclePosition01 = <<219.4298, -851.6688, 29.1372>> FLOAT fMoveVehicleHeading01 = 249.6805 VECTOR vMoveVehiclePosition02 = << -558.4304, -1825.6777, 22.0848 >> FLOAT fMoveVehicleHeading02 = 68.2288 VECTOR vPlayerCheckpointPosNearHooker = << -556.8734, -1822.5284, 22.2149 >> FLOAT fPlayerCheckpointHeadNearHooker = 77.9792 FLOAT fJunkyardRadius = 35.0 TEXT_LABEL_15 tlTargetWaypoint TEXT_LABEL_15 tlDummyWaypoint SCENARIO_BLOCKING_INDEX sbi01 structTimer vehicleTimer structTimer panicTimer structTimer printTimer structTimer tMusicCueTimer //structTimer tTextTimer structTimer tLookAtTimer structTimer tTooCloseTimer structTimer tBlockTimer structTimer tBlockTimerInterval structTimer tCellPhoneBufferTimer structTimer tFirstCarTimer structTimer tInSpawnAreaTimer structTimer tLeaveAreaCopTimer REL_GROUP_HASH relTarget CHASE_HINT_CAM_STRUCT localChaseHintCamStruct SIMPLE_USE_CONTEXT cucEndScreenCore MODEL_NAMES mnFirstCarModel = PRIMO MODEL_NAMES mnFirstCarPedModel = A_M_M_SOUCENT_04 LoadQueueLarge sLoadQueue #IF NOT IS_JAPANESE_BUILD //BOOL bCheckForSexPhoto BOOL bSexDialogueFinished BOOL bSexInCarFinished BOOL bPlayedCreeperLine = FALSE INT iSexStage structTimer dialogueTimer structTimer sexTimer #ENDIF STRUCT AMBIENT_PEDS_IN_SCENE //ambient ped variables PED_INDEX piPimp PED_INDEX piHooker[4] PED_INDEX piDealer ENDSTRUCT AMBIENT_PEDS_IN_SCENE ambVice #IF IS_DEBUG_BUILD DEBUG_POS_DATA myDebugData BOOL bDoingPSkip = FALSE BOOL bDoingJSkip = FALSE MissionStageMenuTextStruct sSkipMenu[3] INT iDebugJumpStage = 0 #ENDIF // ********************************** END SCRIPT GLOBALS************************************* PROC SETUP_DEBUG() #IF IS_DEBUG_BUILD sSkipMenu[0].sTxtLabel = "TRAVEL_STAsGE" sSkipMenu[1].sTxtLabel = "MEET_GIRL" sSkipMenu[2].sTxtLabel = "WAIT_FOR_TARGET" #ENDIF ENDPROC PROC timeLapseCutscene() IF NOT IS_REPLAY_IN_PROGRESS() IF DO_TIMELAPSE(SP_MISSION_ASSASSIN_3, sTimelapse, FALSE, FALSE) curStage = MISSION_BRIEF_INIT ENDIF ELSE curStage = MISSION_BRIEF_INIT ENDIF ENDPROC //init needed data for mission PROC INIT_VICE_DATA() vIntroCutscenePos[0] = << -558.4283, -1827.5858, 22.1976 >> vIntroCutscenePos[1] = << -632.94434, -1797.23608, 23.01625 >> //fill in some stuff for now targetData.targetEnum = A_M_M_BUSINESS_01 targetData.otherPedEnum = S_F_Y_Hooker_03 targetData.auxPedEnum = A_M_Y_Genstreet_02 targetData.vehEnum = PEYOTE targetData.auxVehEnum = EMPEROR2 targetData.otherVehEnum = ruiner targetData.vTargetPos = << -579.8, -1796.049, 22.39 >> targetData.fTargetHead = 352 targetData.weapTarget = WEAPONTYPE_PISTOL //the hooker and car shown in the intro cutscene targetData.vOtherPedPos = << -595.316, -1809.967, 22.102 >> //<< -594.3811, -1808.9480, 22.2765 >> targetData.fOtherPedHead = 158.3596 targetData.vVehPos = << -588.9072, -1769.1724, 21.6539 >> targetData.fVehHead = 130 targetData.vOtherVehPos = << -596.2801, -1811.0856, 22.1921 >> targetData.fOtherVehHead = 70 //decoy car/pedthat pulls up to hooker prior to target targetData.vAuxVehPos = << -576.8151, -1734.9265, 22.4815 >> targetData.fAuxVehHead = 234 //cutscene data targetData.vCutscenePos = << -594.4413, -1810.6296, 23.6320 >> targetData.vCutsceneHead = << 0.6454, -0.0000, 62.1310 >> targetData.fCutsceneDoF = 35 //asset requests targetData.sStringTable = "ASS_hk" targetData.sAnimDict[0] = "ODDJOBS@ASSASSINATE@VICE@SEX" targetData.sAnimDict[1] = "ODDJOBS@ASSASSINATE@VICE@HOOKER" targetData.sAnimDict[2] = "ODDJOBS@ASSASSINATE@VICE@PARK" targetData.sAnimDict[3] = "ODDJOBS@ASSASSINATE@VICE@IDLE" targetData.sAnimDict[4] = "ODDJOBS@ASSASSINATE@VICE@DEALER" targetData.sAnimDict[5] = "amb@world_human_prostitute@hooker@idle_a" // targetData.sAnimDict[6] = "amb@world_human_smoking@male@male_a@base" // targetData.sAnimDict[7] = "mini@prostitutes" // ADD_STREAMED_MODEL(targetData.streamedModels, targetData.targetEnum) // ADD_STREAMED_MODEL(targetData.streamedModels, targetData.otherPedEnum) // ADD_STREAMED_MODEL(targetData.streamedModels, targetData.auxPedEnum) // ADD_STREAMED_MODEL(targetData.streamedModels, S_F_Y_HOOKER_02) // ADD_STREAMED_MODEL(targetData.streamedModels, mnFirstCarPedModel) ADD_STREAMED_MODEL(targetData.streamedModels, mnFirstCarModel) ADD_STREAMED_MODEL(targetData.streamedModels, targetData.vehEnum) ADD_STREAMED_MODEL(targetData.streamedModels, targetData.otherVehEnum) ADD_STREAMED_MODEL(targetData.streamedModels, targetData.auxVehEnum) ADD_STREAMED_ANIM(targetData.streamedAnims, targetData.sAnimDict[0]) ADD_STREAMED_ANIM(targetData.streamedAnims, targetData.sAnimDict[1]) ADD_STREAMED_ANIM(targetData.streamedAnims, targetData.sAnimDict[2]) ADD_STREAMED_ANIM(targetData.streamedAnims, targetData.sAnimDict[3]) ADD_STREAMED_ANIM(targetData.streamedAnims, targetData.sAnimDict[4]) ADD_STREAMED_ANIM(targetData.streamedAnims, targetData.sAnimDict[5]) // ADD_STREAMED_ANIM(targetData.streamedAnims, targetData.sAnimDict[6]) // ADD_STREAMED_ANIM(targetData.streamedAnims, targetData.sAnimDict[6]) // ADD_STREAMED_ANIM(targetData.streamedAnims, targetData.sAnimDict[7]) targetData.OBJECTIVES[0] = "ASS_HK_WAIT" targetData.vWarpPos = << -556.8734, -1822.5284, 22.2149 >> targetData.myType = MISSION_NAME_HOOKER targetData.bDriving = TRUE targetData.bNonTemp = TRUE targetData.bLeaveVehicles = TRUE aggroArgs.fAimRange = 28.0 SET_PED_MODEL_IS_SUPPRESSED(targetData.targetEnum, TRUE) SET_ROADS_IN_ANGLED_AREA(<< -706.106, -1708.865, -100 >>, << -512.576, -1842.173, 100 >>, 100, FALSE, FALSE) ENDPROC FUNC BOOL ARE_MODELS_LOADED_FOR_VICE_LOT() BOOL bLoaded REQUEST_MODEL(targetData.otherPedEnum) REQUEST_MODEL(targetData.auxPedEnum) REQUEST_MODEL(S_F_Y_HOOKER_02) REQUEST_MODEL(mnFirstCarPedModel) IF HAS_MODEL_LOADED(targetData.otherPedEnum) AND HAS_MODEL_LOADED(targetData.auxPedEnum) AND HAS_MODEL_LOADED(S_F_Y_HOOKER_02) AND HAS_MODEL_LOADED(mnFirstCarPedModel) PRINTLN("MODELS_LOADED_FOR_VICE_LOT") bLoaded = TRUE ELSE bLoaded = FALSE ENDIF RETURN bLoaded ENDFUNC FUNC BOOL ARE_MODELS_LOADED_FOR_FINAL_CARS() BOOL bLoaded REQUEST_MODEL(targetData.targetEnum) IF HAS_MODEL_LOADED(targetData.targetEnum) PRINTLN("MODELS_LOADED_FOR_FINAL_CARS") bLoaded = TRUE ELSE bLoaded = FALSE ENDIF RETURN bLoaded ENDFUNC PROC RELEASE_ALL_AMBIENT_PED_MODELS_FOR_VICE_LOT(AMBIENT_PEDS_IN_SCENE& ambData) SET_MODEL_AS_NO_LONGER_NEEDED(targetData.auxPedEnum) SET_MODEL_AS_NO_LONGER_NEEDED(S_F_Y_HOOKER_02) SET_MODEL_AS_NO_LONGER_NEEDED(mnFirstCarPedModel) //create ambient life in Vice Assassination //pimp arguing with hooker IF DOES_ENTITY_EXIST(ambData.piPimp) SET_PED_AS_NO_LONGER_NEEDED(ambData.piPimp) ENDIF IF DOES_ENTITY_EXIST(ambData.piHooker[2]) SET_PED_AS_NO_LONGER_NEEDED(ambData.piHooker[2]) ENDIF // peds near the parked van IF DOES_ENTITY_EXIST(ambData.piDealer) SET_PED_AS_NO_LONGER_NEEDED(ambData.piDealer) ENDIF IF DOES_ENTITY_EXIST(ambData.piHooker[3]) SET_PED_AS_NO_LONGER_NEEDED(ambData.piHooker[3]) ENDIF // hookers on the sidewalk IF DOES_ENTITY_EXIST(ambData.piHooker[0]) SET_PED_AS_NO_LONGER_NEEDED(ambData.piHooker[0]) ENDIF IF NOT DOES_ENTITY_EXIST(ambData.piHooker[1]) SET_PED_AS_NO_LONGER_NEEDED(ambData.piHooker[1]) ENDIF ENDPROC //all peds positioned in scne around hooker (area used in intro cutscene) PROC CREATE_AMBIENT_PEDS_FOR_HOOKER(ASS_ARGS& args, AMBIENT_PEDS_IN_SCENE& ambData) //create ambient life in Vice Assassination //pimp arguing with hooker IF NOT DOES_ENTITY_EXIST(ambData.piPimp) ambData.piPimp = CREATE_PED(PEDTYPE_CIVMALE, targetData.auxPedEnum, << -586.5785, -1802.6594, 22.0327 >>, 355.9268) SET_PED_COMBAT_ATTRIBUTES(ambData.piPimp, CA_ALWAYS_FLEE, TRUE) TASK_PLAY_ANIM(ambData.piPimp, "ODDJOBS@ASSASSINATE@VICE@HOOKER", "argue_a", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) ADD_PED_FOR_DIALOGUE(args.assConv, 8, ambData.piPimp, "OJAhkPIMP") SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ambData.piPimp, TRUE) SET_PED_CAN_BE_TARGETTED(ambData.piPimp, FALSE) ENDIF IF NOT DOES_ENTITY_EXIST(ambData.piHooker[2]) ambData.piHooker[2] = CREATE_PED(PEDTYPE_CIVFEMALE, S_F_Y_Hooker_02, << -586.5862, -1801.6840, 22.0134 >>, 197.3808) SET_PED_COMBAT_ATTRIBUTES(ambData.piHooker[2], CA_ALWAYS_FLEE, TRUE) TASK_PLAY_ANIM(ambData.piHooker[2], "ODDJOBS@ASSASSINATE@VICE@HOOKER", "argue_b", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ambData.piHooker[2], TRUE) SET_PED_CAN_BE_TARGETTED(ambData.piHooker[2], FALSE) ENDIF // peds near the parked van IF NOT DOES_ENTITY_EXIST(ambData.piDealer) ambData.piDealer = CREATE_PED(PEDTYPE_CIVMALE, targetData.auxPedEnum, <<-602.4943, -1792.1892, 22.5209>>, 212.3040) SET_PED_COMBAT_ATTRIBUTES(ambData.piDealer, CA_ALWAYS_FLEE, TRUE) TASK_PLAY_ANIM(ambData.piDealer, "ODDJOBS@ASSASSINATE@VICE@DEALER", "idle_a", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) ADD_PED_FOR_DIALOGUE(args.assConv, 7, ambData.piDealer, "OJAhkDealer") SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ambData.piDealer, TRUE) SET_PED_CAN_BE_TARGETTED(ambData.piDealer, FALSE) ENDIF IF NOT DOES_ENTITY_EXIST(ambData.piHooker[3]) ambData.piHooker[3] = CREATE_PED(PEDTYPE_CIVFEMALE, S_F_Y_Hooker_02, <<-602.1377, -1793.4839, 22.4829>>, 14.4277) SET_PED_COMBAT_ATTRIBUTES(ambData.piHooker[3], CA_ALWAYS_FLEE, TRUE) TASK_PLAY_ANIM(ambData.piHooker[3], "ODDJOBS@ASSASSINATE@VICE@HOOKER", "hooker_a", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ambData.piHooker[3], TRUE) SET_PED_CAN_BE_TARGETTED(ambData.piHooker[3], FALSE) ENDIF // hookers on the sidewalk IF NOT DOES_ENTITY_EXIST(ambData.piHooker[0]) ambData.piHooker[0] = CREATE_PED(PEDTYPE_CIVFEMALE, S_F_Y_Hooker_02, << -618.6262, -1795.1394, 22.7487>>, 157.3886) SET_PED_COMBAT_ATTRIBUTES(ambData.piHooker[0], CA_ALWAYS_FLEE, TRUE) TASK_PLAY_ANIM(ambData.piHooker[0], "ODDJOBS@ASSASSINATE@VICE@HOOKER", "hooker_a", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) ADD_PED_FOR_DIALOGUE(args.assConv, 6, ambData.piHooker[0], "OJAhkHOOKER2") SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ambData.piHooker[0], TRUE) SET_PED_CAN_BE_TARGETTED(ambData.piHooker[0], FALSE) ENDIF IF NOT DOES_ENTITY_EXIST(ambData.piHooker[1]) ambData.piHooker[1] = CREATE_PED(PEDTYPE_CIVFEMALE, S_F_Y_Hooker_02, << -620.7957, -1794.6422, 22.7487 >>, 213.7140) SET_PED_COMBAT_ATTRIBUTES(ambData.piHooker[1], CA_ALWAYS_FLEE, TRUE) TASK_PLAY_ANIM(ambData.piHooker[1], "ODDJOBS@ASSASSINATE@VICE@HOOKER", "hooker_c", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ambData.piHooker[1], TRUE) SET_PED_CAN_BE_TARGETTED(ambData.piHooker[1], FALSE) ENDIF // car in parking lot IF NOT DOES_ENTITY_EXIST(viparkedCar) viparkedCar = CREATE_VEHICLE(ruiner, << -598.1845, -1790.4774, 22.6120 >>, 308.4139) SET_MODEL_AS_NO_LONGER_NEEDED(ruiner) ENDIF ENDPROC PROC DELETE_AMBIENT_PEDS_FOR_HOOKER(AMBIENT_PEDS_IN_SCENE& ambData) IF DOES_ENTITY_EXIST(ambData.piPimp) DELETE_PED(ambData.piPimp) ENDIF IF DOES_ENTITY_EXIST(ambData.piHooker[0]) DELETE_PED(ambData.piHooker[0]) ENDIF IF DOES_ENTITY_EXIST(ambData.piHooker[1]) DELETE_PED(ambData.piHooker[1]) ENDIF IF DOES_ENTITY_EXIST(ambData.piHooker[2]) DELETE_PED(ambData.piHooker[2]) ENDIF IF DOES_ENTITY_EXIST(ambData.piDealer) DELETE_PED(ambData.piDealer) ENDIF IF DOES_ENTITY_EXIST(ambData.piHooker[3]) DELETE_PED(ambData.piHooker[3]) ENDIF IF DOES_ENTITY_EXIST(ambData.piHooker[3]) DELETE_PED(ambData.piHooker[3]) ENDIF IF DOES_ENTITY_EXIST(viParkedCar) DELETE_VEHICLE(viParkedCar) ENDIF //area near where the car in the parking lot is created CLEAR_AREA(<< -598.1845, -1790.4774, 22.6120 >>, 10, TRUE) ENDPROC FUNC BOOL CHECK_FOR_TARGET_SPOTTING_PLAYER_WHILE_PARKED(ASS_ARGS& args) IF NOT IS_PED_INJURED(args.myTarget) IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-460.899048,-1728.564941,17.262728>>, <<-472.210144,-1717.901123,23.657265>>, 12.000000) OR ( IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_PLAYER_PRESSING_HORN(PLAYER_ID()) AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), args.myTarget) < 15.0 ) PRINTLN("TARGET SPOTTED PLAYER WHILE PARKED!") RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL CHECK_FOR_TARGET_SPOTTING_PLAYER(ASS_ARGS& args) IF NOT IS_PED_INJURED(args.myTarget) IF GET_DISTANCE_BETWEEN_ENTITIES(args.myTarget, PLAYER_PED_ID(), FALSE) < 7 IF IS_PED_FACING_PED(args.myTarget, PLAYER_PED_ID(), 160) PRINTLN("TARGET FACING PLAYER!") RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC #IF NOT IS_JAPANESE_BUILD //state machine for dialogue as target and the hooker are playing sex animations PROC MANAGE_SEX_DIALOGUE(ASS_ARGS& args) SWITCH iSpeechStage CASE 0 IF TIMERB() >= 6000 IF NOT IS_SCRIPTED_CONVERSATION_ONGOING() IF CAN_ASSASSIN_SPEECH_PLAY(args.myTarget) CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_SEX", CONV_PRIORITY_HIGH) ENDIF iSpeechStage++ ENDIF ENDIF BREAK CASE 1 IF TIMERB() >= 14000 IF NOT IS_SCRIPTED_CONVERSATION_ONGOING() IF CAN_ASSASSIN_SPEECH_PLAY(args.myTarget) CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_SEX2", CONV_PRIORITY_HIGH) ENDIF iSpeechStage++ ENDIF ENDIF BREAK CASE 2 IF TIMERB() >= 21000 IF NOT IS_SCRIPTED_CONVERSATION_ONGOING() IF CAN_ASSASSIN_SPEECH_PLAY(args.myTarget) CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_SEX3", CONV_PRIORITY_HIGH) ENDIF iSpeechStage++ ENDIF ENDIF BREAK CASE 3 IF TIMERB() >= 25000 IF NOT IS_SCRIPTED_CONVERSATION_ONGOING() IF CAN_ASSASSIN_SPEECH_PLAY(args.myTarget) CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_SEX4", CONV_PRIORITY_HIGH) ENDIF iSpeechStage++ ENDIF ENDIF BREAK CASE 4 IF TIMERB() >= 32000 IF NOT IS_SCRIPTED_CONVERSATION_ONGOING() IF CAN_ASSASSIN_SPEECH_PLAY(args.myTarget) CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_SEX5", CONV_PRIORITY_HIGH) ENDIF iSpeechStage++ ENDIF ENDIF BREAK CASE 5 IF TIMERB() >= 37000 IF NOT IS_SCRIPTED_CONVERSATION_ONGOING() IF CAN_ASSASSIN_SPEECH_PLAY(args.myTarget) CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_SEX6", CONV_PRIORITY_HIGH) ENDIF iSpeechStage++ ENDIF ENDIF BREAK CASE 6 IF TIMERB() >= 40000 // IF NOT IS_SCRIPTED_CONVERSATION_ONGOING() bSexDialogueFinished = TRUE // ENDIF ENDIF BREAK ENDSWITCH ENDPROC //check this before playing the car sex anims in the Vice Assassination FUNC BOOL ARE_BOTH_PEDS_IN_A_CAR_TOGETHER(PED_INDEX pedFemale, PED_INDEX pedMale) VEHICLE_INDEX vehTemp IF NOT IS_PED_INJURED(pedFemale) IF IS_PED_IN_ANY_VEHICLE(pedFemale) vehTemp = GET_VEHICLE_PED_IS_IN(pedFemale) IF IS_VEHICLE_DRIVEABLE(vehTemp) IF NOT IS_PED_INJURED(pedMale) IF IS_PED_IN_VEHICLE(pedMale, vehTemp) IF GET_PED_IN_VEHICLE_SEAT(vehTemp) = pedMale AND GET_PED_IN_VEHICLE_SEAT(vehTemp, VS_FRONT_RIGHT) = pedFemale RETURN TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC //make the car bounce when the car sex anims are playing PROC BOUNCE_THE_CAR(PED_INDEX pedFemale, PED_INDEX pedMale) IF NOT IS_PED_INJURED(pedFemale) IF IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_IN(pedMale)) IF IS_ENTITY_PLAYING_ANIM(pedFemale, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_loop_f") IF IS_ENTITY_PLAYING_ANIM(pedFemale, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_loop_f") IF NOT IS_TIMER_STARTED(sexTimer) RESTART_TIMER_NOW(sexTimer) ENDIF //don't start bouncing the car immediately IF GET_ENTITY_ANIM_CURRENT_TIME(pedFemale, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_loop_f") > 0.1 IF TIMER_DO_WHEN_READY(sexTimer, GET_RANDOM_FLOAT_IN_RANGE(0.5, 0.7)) RESTART_TIMER_NOW(sexTimer) //apply force to the car to make it bounce APPLY_FORCE_TO_ENTITY(GET_VEHICLE_PED_IS_IN(pedMale), APPLY_TYPE_IMPULSE, <<0.0, 0.0, 0.1>>, <<-0.0067, -0.8283, -0.2766>>, 0, TRUE, TRUE, TRUE, TRUE) ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC //control the different stages of the car sex anims in the Vice Assassination PROC SEX_IN_CAR(PED_INDEX pedFemale, PED_INDEX pedMale, ASS_ARGS& args) IF NOT IS_ENTITY_DEAD(pedFemale) AND NOT IS_ENTITY_DEAD(pedMale) IF GET_SCRIPT_TASK_STATUS(pedFemale, SCRIPT_TASK_LOOK_AT_ENTITY) <> PERFORMING_TASK TASK_LOOK_AT_ENTITY(pedFemale, pedMale, -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH) // PRINTLN("TASKING GUY AND GIRL TO LOOK AT EACH OTHER - 01") ENDIF ENDIF IF NOT IS_ENTITY_DEAD(pedFemale) AND NOT IS_ENTITY_DEAD(pedMale) IF GET_SCRIPT_TASK_STATUS(pedMale, SCRIPT_TASK_LOOK_AT_ENTITY) <> PERFORMING_TASK TASK_LOOK_AT_ENTITY(pedMale, pedFemale, -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH) // PRINTLN("TASKING GUY AND GIRL TO LOOK AT EACH OTHER - 02") ENDIF ENDIF SWITCH iSexStage CASE 0 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR TIMERA() > 20000 IF IS_VEHICLE_DRIVEABLE(args.myVehicle) SET_VEHICLE_RADIO_LOUD(args.myVehicle, TRUE) ENDIF TASK_PLAY_ANIM(pedMale, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_intro_m", SLOW_BLEND_IN, SLOW_BLEND_OUT) TASK_PLAY_ANIM(pedFemale, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_intro_f", SLOW_BLEND_IN, SLOW_BLEND_OUT) // bCheckForSexPhoto = TRUE iSexStage++ ELSE IF NOT bTargetSpottedPlayerInScrapyard IF CHECK_FOR_TARGET_SPOTTING_PLAYER_WHILE_PARKED(args) bTargetSpottedPlayerInScrapyard = TRUE ENDIF ENDIF ENDIF BREAK CASE 1 IF ARE_BOTH_PEDS_IN_A_CAR_TOGETHER(pedFemale, pedMale) IF IS_ENTITY_PLAYING_ANIM(pedMale, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_intro_m") IF GET_ENTITY_ANIM_CURRENT_TIME(pedMale, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_intro_m") > 0.9 TASK_PLAY_ANIM(pedMale, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_loop_m", SLOW_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING) TASK_PLAY_ANIM(pedFemale, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_loop_f", SLOW_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING) SETTIMERB(0) iSexStage++ ENDIF ENDIF ENDIF BREAK CASE 2 IF ARE_BOTH_PEDS_IN_A_CAR_TOGETHER(pedFemale, pedMale) BOUNCE_THE_CAR(pedFemale, pedMale) IF NOT bSexDialogueFinished MANAGE_SEX_DIALOGUE(args) ELSE IF IS_ENTITY_PLAYING_ANIM(pedMale, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_loop_m") IF GET_ENTITY_ANIM_CURRENT_TIME(pedMale, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_loop_m") > 0.9 TASK_PLAY_ANIM(pedMale, "ODDJOBS@ASSASSINATE@VICE@SEX", "FrontSeat_CarSex_Normal_Outro_m", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1) TASK_PLAY_ANIM(pedFemale, "ODDJOBS@ASSASSINATE@VICE@SEX", "FrontSeat_CarSex_Normal_Outro_f", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1) iSexStage++ ENDIF ENDIF ENDIF ENDIF BREAK CASE 3 IF ARE_BOTH_PEDS_IN_A_CAR_TOGETHER(pedFemale, pedMale) IF ( IS_ENTITY_PLAYING_ANIM(pedMale, "ODDJOBS@ASSASSINATE@VICE@SEX", "FrontSeat_CarSex_Normal_Outro_m") AND GET_ENTITY_ANIM_CURRENT_TIME(pedMale, "ODDJOBS@ASSASSINATE@VICE@SEX", "FrontSeat_CarSex_Normal_Outro_m") > 0.2 ) //one last shake to the car APPLY_FORCE_TO_ENTITY(GET_VEHICLE_PED_IS_IN(pedMale), APPLY_TYPE_IMPULSE, <<0.0, 0.0, 0.5>>, <<-0.4, 0.0, 0.0>>, 0, TRUE, TRUE, TRUE) iSexStage++ ELIF HAS_ENTITY_ANIM_FINISHED(pedMale, "ODDJOBS@ASSASSINATE@VICE@SEX", "FrontSeat_CarSex_Normal_Outro_m") //failsafe to make sure that the stage advances iSexStage++ ENDIF ENDIF BREAK CASE 4 IF NOT IS_ENTITY_PLAYING_ANIM(pedMale, "ODDJOBS@ASSASSINATE@VICE@SEX", "FrontSeat_CarSex_Normal_Outro_m") IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF CAN_ASSASSIN_SPEECH_PLAY(args.myTarget) //target tells the hooker he isn't gonna pay her and threatens her PLAY_SINGLE_LINE_FROM_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_LEAVE", "OJAShk_LEAVE_1", CONV_PRIORITY_HIGH) ENDIF //have target and hooker look at each other while talking IF NOT IS_PED_INJURED(args.myTarget) IF NOT IS_PED_INJURED(args.myOtherPed) TASK_PLAY_ANIM(args.myTarget, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_base_m", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING) TASK_PLAY_ANIM(args.myOtherPed, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_base_f", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING) ENDIF ENDIF SETTIMERB(0) iSexStage++ ENDIF ENDIF BREAK CASE 5 //wait a few seconds to advance after target tells the hooker to leave IF TIMERB() > 5000 bSexInCarFinished = TRUE ENDIF BREAK ENDSWITCH ENDPROC //check to see if the player is near the target when playing sex anims and handle the panic response FUNC BOOL IS_PLAYER_NEAR_BOUNCING_CAR(PED_INDEX pedToCheck, structPedsForConversation& dialogStruct, structTimer& timerToUse, BOOL bCheckingGuy = TRUE) IF NOT IS_PED_INJURED(pedToCheck) IF IS_ENTITY_PLAYING_ANIM(pedToCheck, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_loop_m") OR IS_ENTITY_PLAYING_ANIM(pedToCheck, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_loop_f") IF NOT IS_TIMER_STARTED(timerToUse) IF GET_PLAYER_DISTANCE_FROM_ENTITY(pedToCheck) < 10 IF ( bCheckingGuy AND IS_PED_FACING_PED(pedToCheck, PLAYER_PED_ID(), 160) ) OR ( bCheckingGuy = FALSE AND NOT IS_PED_FACING_PED(pedToCheck, PLAYER_PED_ID(), 160) ) //hack - anim makes her face the player, but she plays the anim from the seat facing forwards so we need to inverse the logic START_TIMER_NOW(timerToUse) PRINTLN("STARTING BOUNCING CAR TIMER NOW") ENDIF ENDIF ELSE IF NOT bPlayedCreeperLine IF GET_PLAYER_DISTANCE_FROM_ENTITY(pedToCheck) < 10 IF bCheckingGuy IF IS_PED_FACING_PED(pedToCheck, PLAYER_PED_ID(), 160) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_ANY_CONVERSATION() ELSE CREATE_CONVERSATION(dialogStruct, "OJASAUD", "OJAShk_LOOK", CONV_PRIORITY_VERY_HIGH) PRINTLN("PLAYED CREEPER LINE FROM GUY") bPlayedCreeperLine = TRUE START_TIMER_NOW(timerToUse) ENDIF ENDIF ELSE IF NOT IS_PED_FACING_PED(pedToCheck, PLAYER_PED_ID(), 160) //hack - anim makes her face the player, but she plays the anim from the seat facing forwards so we need to inverse the logic IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_ANY_CONVERSATION() ELSE CREATE_CONVERSATION(dialogStruct, "OJASAUD", "OJAShk_LOOK1", CONV_PRIORITY_VERY_HIGH) PRINTLN("PLAYED CREEPER LINE FROM GIRL") bPlayedCreeperLine = TRUE START_TIMER_NOW(timerToUse) ENDIF ENDIF ENDIF ENDIF ELSE IF GET_TIMER_IN_SECONDS(timerToUse) > 10 IF GET_PLAYER_DISTANCE_FROM_ENTITY(pedToCheck) < 10 IF ( bCheckingGuy AND IS_PED_FACING_PED(pedToCheck, PLAYER_PED_ID(), 160) ) //note - these checks seem to be terrible - may need to just switch to angled area checks instead of ped_facing OR ( bCheckingGuy = FALSE AND NOT IS_PED_FACING_PED(pedToCheck, PLAYER_PED_ID(), 160) ) //hack - anim makes her face the player, but she plays the anim from the seat facing forwards so we need to inverse the logic KILL_ANY_CONVERSATION() PRINTLN("bTooCloseToBouncingCar = TRUE !!!") bTooCloseToBouncingCar = TRUE RETURN TRUE ENDIF ENDIF ENDIF ENDIF ENDIF // IF bCheckingGuy // IF IS_PED_FACING_PED(pedToCheck, PLAYER_PED_ID(), 160) // PRINTLN("GUY FACING PLAYER") // ENDIF // ELSE // IF IS_PED_FACING_PED(pedToCheck, PLAYER_PED_ID(), 160) // PRINTLN("GIRL FACING PLAYER") // ENDIF // ENDIF IF GET_PLAYER_DISTANCE_FROM_ENTITY(pedToCheck) < 10 IF GET_JACK_TARGET(PLAYER_PED_ID()) = pedToCheck OR IS_PED_JACKING(PLAYER_PED_ID()) RETURN TRUE ENDIF ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC //PROC AWARD_BONUS_FOR_SUCCESSFUL_PHOTO(ASS_ARGS& args) // IF passReasonVice <> PASS_BONUS // IF HAS_CELLPHONE_CAM_JUST_TAKEN_PIC() // IF CELL_CAM_IS_CHAR_VISIBLE_NO_FACE_CHECK(args.myTarget) // AND CELL_CAM_IS_CHAR_VISIBLE_NO_FACE_CHECK(args.myOtherPed) // PRINT_HELP("ASS_HK_PHOTO") // passReasonCore = PASS_BONUS // // ELSE //print a help message explaining to get a better photo // // IF CELL_CAM_IS_CHAR_VISIBLE_NO_FACE_CHECK(args.myTarget) // // AND CELL_CAM_IS_CHAR_VISIBLE_NO_FACE_CHECK(args.myOtherPed) // // PRINT_HELP("ASS_HK_CAMHELP") // // ENDIF // ENDIF // ENDIF // ENDIF //ENDPROC #ENDIF //dialogue used by the ambient peds in the scene when approached by the player PROC MANAGE_AMBIENT_VICE_DIALOGUE(ASS_ARGS& args, AMBIENT_PEDS_IN_SCENE& ambData) //only update this before the target flees IF targetStage <> MISSION_VICE_TARGET_ESCAPE AND targetStage <> MISSION_VICE_TARGET_COMBAT IF DOES_ENTITY_EXIST(ambData.piPimp) IF GET_PLAYER_DISTANCE_FROM_ENTITY(ambData.piPimp) < 5 IF NOT bPimpDialogue IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_MESSAGE_BEING_DISPLAYED() IF CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_PIMP", CONV_PRIORITY_HIGH) SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(ambData.piPimp, TRUE) bPimpDialogue = TRUE ENDIF ENDIF ELSE KILL_CURRENT_AMBIENT_MISSION_DIALOGUE_IF_TOUCHED(ambData.piPimp) ENDIF ENDIF ENDIF IF DOES_ENTITY_EXIST(ambData.piHooker[0]) IF GET_PLAYER_DISTANCE_FROM_ENTITY(ambData.piHooker[0]) < 5 IF NOT bHookDialogue IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_MESSAGE_BEING_DISPLAYED() IF CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_PROST", CONV_PRIORITY_HIGH) PRINTLN("PLAYING LINE 1") SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(ambData.piHooker[0], TRUE) bHookDialogue = TRUE ENDIF ENDIF ELSE KILL_CURRENT_AMBIENT_MISSION_DIALOGUE_IF_TOUCHED(ambData.piHooker[0]) ENDIF ENDIF ENDIF IF DOES_ENTITY_EXIST(ambData.piDealer) IF GET_PLAYER_DISTANCE_FROM_ENTITY(ambData.piDealer) < 5 IF NOT bDrugDialogue IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_MESSAGE_BEING_DISPLAYED() IF CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_DRUG", CONV_PRIORITY_HIGH) SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(ambData.piDealer, TRUE) bDrugDialogue = TRUE ENDIF ENDIF ELSE KILL_CURRENT_AMBIENT_MISSION_DIALOGUE_IF_TOUCHED(ambData.piDealer) ENDIF ENDIF ENDIF ENDIF ENDPROC //set all vice peds to react to non-temp events and play reaction anims PROC SET_AMBIENT_VICE_PEDS_TO_REACT_TO_NON_TEMP_EVENTS(AMBIENT_PEDS_IN_SCENE& ambData) //Have ambient life flee IF NOT IS_PED_INJURED(ambData.piPimp) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ambData.piPimp, FALSE) ENDIF IF NOT IS_PED_INJURED(ambData.piHooker[2]) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ambData.piHooker[2], FALSE) ENDIF IF NOT IS_PED_INJURED(ambData.piDealer) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ambData.piDealer, FALSE) ENDIF IF NOT IS_PED_INJURED(ambData.piHooker[3]) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ambData.piHooker[3], FALSE) ENDIF IF NOT IS_PED_INJURED(ambData.piHooker[0]) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ambData.piHooker[0], FALSE) ENDIF IF NOT IS_PED_INJURED(ambData.piHooker[1]) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ambData.piHooker[1], FALSE) ENDIF ENDPROC FUNC BOOL IS_PLAYER_SEEN_BY_HOOKER(ASS_ARGS& args) IF NOT IS_PED_INJURED(args.myOtherPed) IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myOtherPed) < 10 AND IS_PED_FACING_PED(args.myOtherPed, PLAYER_PED_ID(), 120) OR GET_PLAYER_DISTANCE_FROM_ENTITY(args.myOtherPed) < 6 RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC //manage the hooker's dialogue to the player - tell him to get lost if he is hanging out next to her screwing up her business PROC MANAGE_HOOKER_DIALOGUE(ASS_ARGS& args) SEQUENCE_INDEX tempSeq SWITCH iSpeechStage CASE 0 IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myOtherPed) < 7 SETTIMERB(0) iSpeechStage++ ENDIF BREAK //face the player and tell him to leave CASE 1 IF TIMERB() >= 1500 IF IS_PLAYER_SEEN_BY_HOOKER(args) IF NOT IS_SCRIPTED_CONVERSATION_ONGOING() CLEAR_PED_TASKS(args.myOtherPed) CLEAR_SEQUENCE_TASK(tempSeq) OPEN_SEQUENCE_TASK(tempSeq) IF NOT IS_PED_FACING_PED(args.myOtherPed, PLAYER_PED_ID(), 120) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID()) ENDIF TASK_PLAY_ANIM(NULL, sHookerAnimDict, "idle_outro", SLOW_BLEND_IN, SLOW_BLEND_OUT) TASK_PLAY_ANIM(NULL, sHookerAnimDict, "idle_reject", SLOW_BLEND_IN, SLOW_BLEND_OUT) TASK_PLAY_ANIM(NULL, sHookerAnimDict, "reject_outro", SLOW_BLEND_IN, SLOW_BLEND_OUT) TASK_ACHIEVE_HEADING(NULL, targetData.fOtherPedHead) TASK_PLAY_ANIM(NULL, sHookerAnimDict, "idle_wait", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(tempSeq) TASK_PERFORM_SEQUENCE(args.myOtherPed, tempSeq) CLEAR_SEQUENCE_TASK(tempSeq) TASK_LOOK_AT_ENTITY(args.myOtherPed, PLAYER_PED_ID(), 5000) CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_TALK", CONV_PRIORITY_VERY_HIGH) SETTIMERB(0) iSpeechStage++ ENDIF ENDIF ENDIF BREAK CASE 2 IF NOT IS_PED_INJURED(args.myOtherPed) IF TIMERB() >= DEFAULT_GOD_TEXT_TIME // CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_TALK", CONV_PRIORITY_VERY_HIGH) iSpeechStage++ ENDIF ENDIF BREAK CASE 3 IF TIMERB() >= 9000 IF IS_PLAYER_SEEN_BY_HOOKER(args) IF NOT IS_SCRIPTED_CONVERSATION_ONGOING() CLEAR_PED_TASKS(args.myOtherPed) CLEAR_SEQUENCE_TASK(tempSeq) OPEN_SEQUENCE_TASK(tempSeq) IF NOT IS_PED_FACING_PED(args.myOtherPed, PLAYER_PED_ID(), 120) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID()) ENDIF TASK_PLAY_ANIM(NULL, sHookerAnimDict, "idle_outro", SLOW_BLEND_IN, SLOW_BLEND_OUT) TASK_PLAY_ANIM(NULL, sHookerAnimDict, "idle_reject", SLOW_BLEND_IN, SLOW_BLEND_OUT) TASK_PLAY_ANIM(NULL, sHookerAnimDict, "reject_outro", SLOW_BLEND_IN, SLOW_BLEND_OUT) TASK_ACHIEVE_HEADING(NULL, targetData.fOtherPedHead) TASK_PLAY_ANIM(NULL, sHookerAnimDict, "idle_wait", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(tempSeq) TASK_PERFORM_SEQUENCE(args.myOtherPed, tempSeq) CLEAR_SEQUENCE_TASK(tempSeq) SETTIMERB(0) iSpeechStage++ ENDIF ENDIF ENDIF BREAK CASE 4 IF NOT IS_PED_INJURED(args.myOtherPed) IF IS_ENTITY_PLAYING_ANIM(args.myOtherPed, sHookerAnimDict, "idle_reject") OR TIMERB() >= DEFAULT_GOD_TEXT_TIME CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_TALK2", CONV_PRIORITY_VERY_HIGH) iSpeechStage++ ENDIF ENDIF BREAK CASE 5 IF TIMERB() >= DEFAULT_GOD_TEXT_TIME IF IS_PLAYER_SEEN_BY_HOOKER(args) CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_TALK3", CONV_PRIORITY_VERY_HIGH) SETTIMERB(0) iSpeechStage++ ENDIF ENDIF BREAK CASE 6 IF TIMERB() >= 4000 IF targetStage < MISSION_VICE_ENTER_CAR SET_MISSION_FAILED(asnArgs, targetData, FAIL_BLOWN_COVER) PRINTLN("HOOKER: FAILING - PLAYER HARASSING THE GIRL") ELSE bPlayerBlockingDeal = TRUE ENDIF ENDIF BREAK ENDSWITCH ENDPROC //determine the order that the cars will approach the hooker based on the number of mission attempts by the player (alternate order each time) PROC POSITION_VICE_VEHICLES_FROM_SAVEDATA(ASS_ARGS& args) IF IS_VEHICLE_DRIVEABLE(args.myAuxVehicle) IF IS_VEHICLE_DRIVEABLE(args.myVehicle) IF NOT IS_PED_INJURED(args.myAuxPed) IF NOT IS_PED_INJURED(args.myOtherPed) IF g_savedGlobals.sAssassinData.iAttemptsOnCur % 2 = 0 //target car in back vTargetStartPos = << -576.8151, -1734.9265, 22.4815 >> vDummyStartPos = << -524.8151, -1771.9265, 20.3315 >> ELSE //target car in front vTargetStartPos = << -524.8151, -1771.9265, 20.3315 >> vDummyStartPos = << -576.8151, -1734.9265, 22.4815 >> ENDIF SET_PED_COORDS_KEEP_VEHICLE(args.myTarget, vTargetStartPos) SET_ENTITY_HEADING(args.myVehicle, 234) SET_VEHICLE_ON_GROUND_PROPERLY(args.myVehicle) SET_VEHICLE_RADIO_ENABLED(args.myVehicle, TRUE) // SET_RADIO_TO_STATION_NAME("RADIO_02_POP") SET_VEHICLE_RADIO_LOUD(args.myVehicle, TRUE) SET_PED_COORDS_KEEP_VEHICLE(args.myAuxPed, vDummyStartPos) SET_ENTITY_HEADING(args.myAuxVehicle, 234) SET_VEHICLE_ON_GROUND_PROPERLY(args.myAuxVehicle) SET_VEHICLE_RADIO_ENABLED(args.myAuxVehicle, TRUE) // SET_RADIO_TO_STATION_NAME("RADIO_01_CLASS_ROCK") SET_VEHICLE_RADIO_LOUD(args.myVehicle, TRUE) ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Checks to see if the players last vehicle is parked in front of the hooker blocking other vehicles from driving up to her /// RETURNS: /// TRUE if there is a vehicle detected in teh anged area around the hooker FUNC BOOL IS_PLAYER_VEHICLE_BLOCKING_HOOKER() VEHICLE_INDEX vehPlayer = GET_PLAYERS_LAST_VEHICLE() IF DOES_ENTITY_EXIST(vehPlayer) IF IS_ENTITY_IN_ANGLED_AREA(vehPlayer, << -589.952087, -1813.227417, 22.181004 >>, << -598.982971, -1809.424072, 23.080276 >>, 6.5) PRINTLN("IS_PLAYER_VEHICLE_BLOCKING_HOOKER() returned TRUE!") RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC //send the cars to the hooker based on their setup from POSITION_VICE_VEHICLES_FROM_SAVEDATA PROC SEND_CARS_TO_HOOKER(ASS_ARGS& args) IF IS_VEHICLE_DRIVEABLE(args.myAuxVehicle) IF IS_VEHICLE_DRIVEABLE(args.myVehicle) IF NOT IS_PED_INJURED(args.myAuxPed) IF NOT IS_PED_INJURED(args.myOtherPed) IF g_savedGlobals.sAssassinData.iAttemptsOnCur % 2 = 1 tlTargetWaypoint = "OJAShk_101" tlDummyWaypoint = "OJAShk_103" ELSE tlTargetWaypoint = "OJAShk_103" tlDummyWaypoint = "OJAShk_101" ENDIF TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(args.myTarget, args.myVehicle, tlTargetWaypoint, DF_SwerveAroundAllCars|DF_StopAtLights|DF_SteerAroundObjects|DF_StopForCars|DF_SteerAroundPeds|DF_SteerAroundStationaryCars|DF_DriveIntoOncomingTraffic) TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(args.myAuxPed, args.myAuxVehicle, tlDummyWaypoint, DF_SwerveAroundAllCars|DF_StopAtLights|DF_SteerAroundObjects|DF_StopForCars|DF_SteerAroundPeds|DF_SteerAroundStationaryCars|DF_DriveIntoOncomingTraffic) SET_VEHICLE_DOORS_LOCKED(args.myAuxVehicle, VEHICLELOCK_LOCKOUT_PLAYER_ONLY) PRINTLN("TASKING TO FOLLOW WAYPOINTS") SET_ENTITY_LOAD_COLLISION_FLAG(args.myTarget, TRUE) bTestDummyCarForPanic = TRUE ELSE PRINTLN("args.myOtherPed IS INJURED") ENDIF ELSE PRINTLN("args.myAuxPed IS INJURED") ENDIF ELSE PRINTLN("args.myVehicle IS NOT DRIVEABLE") ENDIF ELSE PRINTLN("args.myAuxVehicle IS NOT DRIVEABLE") ENDIF ENDPROC //update function to have the dummy car pull up next to the hooker and interact with her PROC CONTROL_DUMMY_CAR_BEHAVIOR(ASS_ARGS& args) SEQUENCE_INDEX tempSeq INT iClosestWaypoint IF NOT IS_TIMER_STARTED(vehicleTimer) IF IS_VEHICLE_DRIVEABLE(args.myAuxVehicle) IF NOT IS_PED_INJURED(args.myAuxPed) IF NOT IS_PED_INJURED(args.myOtherPed) IF WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(tlDummyWaypoint, GET_ENTITY_COORDS(args.myAuxVehicle), iClosestWaypoint) IF iClosestWaypoint >= 14 //have guy stop car and look at hooker IF NOT IS_PLAYER_VEHICLE_BLOCKING_HOOKER() IF GET_SCRIPT_TASK_STATUS(args.myAuxPed, SCRIPT_TASK_PLAY_ANIM) <> PERFORMING_TASK AND GET_SCRIPT_TASK_STATUS(args.myAuxPed, SCRIPT_TASK_PLAY_ANIM) <> WAITING_TO_START_TASK CLEAR_PED_TASKS(args.myAuxPed) TASK_LOOK_AT_ENTITY(args.myOtherPed, args.myAuxVehicle, -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH) // TASK_PLAY_ANIM(args.myAuxPed, "ODDJOBS@ASSASSINATE@VICE@IDLE", "idle_a", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) TASK_LOOK_AT_ENTITY(args.myAuxPed, args.myOtherPed, -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH) BRING_VEHICLE_TO_HALT(args.myAuxVehicle, 10, 1) ENDIF IF NOT IS_SCRIPTED_CONVERSATION_ONGOING() START_VEHICLE_HORN(args.myAuxVehicle, 750) //have hooker look at car and tell him to leave // TASK_TURN_PED_TO_FACE_ENTITY(args.myOtherPed, args.myAuxPed, -1) START_TIMER_NOW(vehicleTimer) IF CAN_ASSASSIN_SPEECH_PLAY(args.myOtherPed) ADD_PED_FOR_DIALOGUE(args.assConv, 5, args.myAuxPed, "OJAhkCrawler2") IF NOT bPlayedCheapLine IF CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_CHEAP", CONV_PRIORITY_HIGH) bPlayedCheapLine = TRUE PRINTLN("bPlayedCheapLine = TRUE - 01") ENDIF ENDIF ENDIF ENDIF ELSE PRINTLN("SET_MISSION_FAILED - IN CONTROL_DUMMY_CAR_BEHAVIOR") SET_MISSION_FAILED(asnArgs, targetData, FAIL_BLOWN_COVER) ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ELSE IF NOT IS_PED_INJURED(args.myTarget) IF IS_TIMER_STARTED(vehicleTimer) IF GET_TIMER_IN_SECONDS(vehicleTimer) > 0.5 //tell him to leave now IF NOT bTaskedHookerCheap IF NOT IS_PED_INJURED(args.myOtherPed) CLEAR_SEQUENCE_TASK(tempSeq) OPEN_SEQUENCE_TASK(tempSeq) IF GET_ENTITY_HEADING(args.myOtherPed) < targetData.fOtherPedHead - 30 OR GET_ENTITY_HEADING(args.myOtherPed) > targetData.fOtherPedHead + 30 TASK_ACHIEVE_HEADING(NULL, targetData.fOtherPedHead) //make her face towards the car if she isnt already facing that general direction ENDIF TASK_PLAY_ANIM(NULL, sHookerAnimDict, "idle_outro", SLOW_BLEND_IN, SLOW_BLEND_OUT) TASK_PLAY_ANIM(NULL, sHookerAnimDict, "idle_reject", SLOW_BLEND_IN, SLOW_BLEND_OUT) TASK_PLAY_ANIM(NULL, sHookerAnimDict, "reject_outro", SLOW_BLEND_IN, SLOW_BLEND_OUT) TASK_ACHIEVE_HEADING(NULL, targetData.fOtherPedHead) TASK_PLAY_ANIM(NULL, sHookerAnimDict, "idle_wait", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(tempSeq) TASK_PERFORM_SEQUENCE(args.myOtherPed, tempSeq) CLEAR_SEQUENCE_TASK(tempSeq) PRINTLN("bTaskedHookerCheap = TRUE") bTaskedHookerCheap = TRUE ENDIF ELSE IF GET_TIMER_IN_SECONDS(vehicleTimer) > 5.0 IF IS_VEHICLE_DRIVEABLE(args.myAuxVehicle) IF NOT IS_PED_INJURED(args.myAuxPed) IF GET_SCRIPT_TASK_STATUS(args.myAuxPed, SCRIPT_TASK_VEHICLE_DRIVE_WANDER) <> PERFORMING_TASK AND GET_SCRIPT_TASK_STATUS(args.myAuxPed, SCRIPT_TASK_VEHICLE_DRIVE_WANDER) <> WAITING_TO_START_TASK TASK_VEHICLE_DRIVE_WANDER(args.myAuxPed, args.myAuxVehicle, 6, DRIVINGMODE_AVOIDCARS_OBEYLIGHTS) PRINTLN("TASKING CHEAP GUY TO WANDER") ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF //only test the false vehicle for panic when it is near the hooker IF bTestDummyCarForPanic IF DOES_ENTITY_EXIST(args.myAuxPed) AND DOES_ENTITY_EXIST(args.myOtherPed) IF GET_DISTANCE_BETWEEN_ENTITIES(args.myAuxPed, args.myOtherPed) > 10 bTestDummyCarForPanic = FALSE ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC //trigger panic if the player gets too close to the target's vehicle when he is stopped waiting for the hooker to enter PROC TRIGGER_PANIC_IF_BLOCKING_DEAL(ASS_ARGS& args) IF NOT IS_PED_INJURED(args.myTarget) IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < 5 IF NOT IS_TIMER_STARTED(panicTimer) START_TIMER_NOW(panicTimer) ELIF GET_TIMER_IN_SECONDS(panicTimer) > 3 bPlayerBlockingDeal = TRUE ENDIF ENDIF ENDIF ENDPROC FUNC BOOL SHOULD_CHECK_FOR_PROJECTILES(PED_INDEX pedToCheck) IF DOES_ENTITY_EXIST(pedToCheck) IF IS_PED_IN_ANY_VEHICLE(pedToCheck) RETURN FALSE ENDIF ENDIF RETURN TRUE ENDFUNC FUNC BOOL HAS_PLAYER_PISSED_OFF_PEDS_IN_VICE_SCENE(AMBIENT_PEDS_IN_SCENE& ambData, ASS_ARGS& args, INT& iFrame, BOOL bDoWantedCheck, BOOL& bFlipThisIfTrue) BOOL bReturnVal PED_INDEX pedToCheck VEHICLE_INDEX vehToCheck = NULL IF iFrame = 0 pedToCheck = args.myTarget vehToCheck = args.myVehicle ELIF iFrame = 1 IF bTestDummyCarForPanic pedToCheck = args.myAuxPed vehToCheck = args.myAuxVehicle ENDIF ELIF iFrame = 2 pedToCheck = args.myOtherPed ELIF iFrame = 3 pedToCheck = ambData.piPimp ELIF iFrame = 4 pedToCheck = ambData.piHooker[2] ELIF iFrame = 5 pedToCheck = ambData.piDealer ELIF iFrame = 6 pedToCheck = ambData.piHooker[3] ELIF iFrame = 7 pedToCheck = ambData.piHooker[0] ELIF iFrame = 8 pedToCheck = ambData.piHooker[1] ELIF iFrame = 9 pedToCheck = pedFirstDriver ENDIF BOOL bCheckForMajorAttack = FALSE IF pedToCheck = pedFirstDriver bCheckForMajorAttack = TRUE ENDIF //do checks for peds only at certain points in the script INT maxFrameToCheck IF bHookerInCar maxFrameToCheck = 2 //we only care about the target and hooker now since they have parked away from the scene ELSE maxFrameToCheck = 9 ENDIF IF maxFrameToCheck = 9 IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, << -594.81824, -1792.03528, 21.93077 >>, 35.0) PRINTLN("RETURNING TRUE ON AGGRO CHECK - explosion near vice scene!!") bReturnVal = TRUE ENDIF ENDIF IF iFrame <= maxFrameToCheck IF DOES_ENTITY_EXIST(pedToCheck) IF vehToCheck = args.myVehicle AND (pedToCheck = args.myTarget) IF DO_AGGRO_CHECK(pedToCheck, vehToCheck, aggroArgs, aggroReason, FALSE, SHOULD_CHECK_FOR_PROJECTILES(pedToCheck), bCheckForMajorAttack) OR IS_VEHICLE_DRIVEABLE(args.myVehicle) AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(args.myVehicle, PLAYER_PED_ID()) OR GET_PED_IN_VEHICLE_SEAT(args.myVehicle) = PLAYER_PED_ID() // IF aggroReason = EAggro_MinorAttacked // bMinorAttacked = TRUE // PRINTLN("PLAYER AGGROED, BUT IT WAS A MINOR ATTACK") // ENDIF PRINTLN("RETURNING TRUE ON AGGRO CHECK - args.myTarget") bReturnVal = TRUE ENDIF ELIF (pedToCheck = args.myAuxPed) IF DO_AGGRO_CHECK(pedToCheck, vehToCheck, aggroArgs, aggroReason, FALSE, SHOULD_CHECK_FOR_PROJECTILES(pedToCheck)) OR GET_JACK_TARGET(PLAYER_PED_ID()) = pedToCheck OR IS_VEHICLE_DRIVEABLE(args.myAuxVehicle) AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(args.myAuxVehicle, PLAYER_PED_ID()) PRINTLN("RETURNING TRUE ON AGGRO CHECK - args.myAuxPed") bReturnVal = TRUE ENDIF ELSE IF DO_AGGRO_CHECK(pedToCheck, vehToCheck, aggroArgs, aggroReason, TRUE, SHOULD_CHECK_FOR_PROJECTILES(pedToCheck)) OR GET_JACK_TARGET(PLAYER_PED_ID()) = pedToCheck PRINTLN("RETURNING TRUE ON AGGRO CHECK. iFrame = ", iFrame) bReturnVal = TRUE ENDIF ENDIF ENDIF ELSE IF bDoWantedCheck IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) PRINTLN("RETURNING TRUE ON AGGRO CHECK - WANTED CHECK") bReturnVal = TRUE ENDIF ENDIF ENDIF //increment it by one - reset it if it exceeds the checks iFrame ++ IF iFrame > maxFrameToCheck iFrame = 0 ENDIF // Check for player being inside a police car IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) VECTOR vPlayerPosition vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID()) IF VDIST2(vPlayerPosition, << -593.13214, -1791.83606, 21.91110 >>) < 1600 //40m IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) VEHICLE_INDEX vehPlayerIsIn vehPlayerIsIn = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) IF DOES_ENTITY_EXIST(vehPlayerIsIn) AND NOT IS_ENTITY_DEAD(vehPlayerIsIn) MODEL_NAMES mnTemp mnTemp = GET_ENTITY_MODEL(vehPlayerIsIn) IF mnTemp = POLICE OR mnTemp = POLICE2 OR mnTemp = POLICE3 OR mnTemp = POLICE4 PRINTLN("PLAYER IN A POLICE VEHICLE") RETURN TRUE ENDIF ENDIF ENDIF ENDIF ENDIF IF bReturnVal = TRUE // IF NOT IS_TARGET_AND_PLAYER_UNDER_FREEWAY() // SET_PLAYER_WANTED_LEVEL_NO_DROP_NOW() // PRINTLN("SETTING PLAYER'S WANTED LEVEL 01") // ENDIF bFlipThisIfTrue = TRUE RETURN TRUE ENDIF RETURN FALSE ENDFUNC //checks prior to the intro cutscene to see if the player has triggered panic on any of the script-created peds/vehicles FUNC BOOL HAS_PANIC_TRIGGERED_IN_VICE_MISSION(ASS_ARGS& args, AMBIENT_PEDS_IN_SCENE& ambData, BOOL bDoWantedChecksForAmbientPeds) IF bDoWantedChecksForAmbientPeds IF HAS_PLAYER_PISSED_OFF_PEDS_IN_VICE_SCENE(ambData, args, iFrameCountAsn, TRUE, bTriggeredAggro) RETURN TRUE ENDIF ELSE IF HAS_PLAYER_PISSED_OFF_PEDS_IN_VICE_SCENE(ambData, args, iFrameCountAsn, FALSE, bTriggeredAggro) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC PROC SET_AMBIENT_VICE_PEDS_TO_FLEE(ASS_ARGS& args, AMBIENT_PEDS_IN_SCENE& ambData, BOOL bForceKeepTask = FALSE) //tell the fake target to flee IF NOT IS_PED_INJURED(args.myAuxPed) CLEAR_PED_TASKS(args.myAuxPed) IF IS_PED_IN_ANY_VEHICLE(args.myAuxPed) TASK_VEHICLE_MISSION_COORS_TARGET(args.myAuxPed, GET_VEHICLE_PED_IS_IN(args.myAuxPed), GET_ENTITY_COORDS(PLAYER_PED_ID()), MISSION_FLEE, 15, DRIVINGMODE_AVOIDCARS_RECKLESS, 9999, -1) ELSE TASK_SMART_FLEE_PED(args.myAuxPed, PLAYER_PED_ID(), 500, -1) ENDIF SET_PED_KEEP_TASK(args.myAuxPed, TRUE) ENDIF //tell hooker to flee IF NOT IS_PED_INJURED(args.myOtherPed) // CLEAR_PED_TASKS(args.myOtherPed) TASK_SMART_FLEE_PED(args.myOtherPed, PLAYER_PED_ID(), 500, -1) SET_PED_KEEP_TASK(args.myOtherPed, TRUE) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() PLAY_PAIN(args.myOtherPed, AUD_DAMAGE_REASON_SCREAM_TERROR) ENDIF IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 bForceKeepTask = TRUE ENDIF //Have ambient life flee IF NOT IS_PED_INJURED(ambData.piPimp) IF aggroReason <> EAggro_MinorAttacked TASK_SMART_FLEE_PED(ambData.piPimp, PLAYER_PED_ID(), 500, -1) ENDIF SET_PED_KEEP_TASK(ambData.piPimp, TRUE) ENDIF IF NOT IS_PED_INJURED(ambData.piHooker[2]) IF aggroReason <> EAggro_MinorAttacked TASK_SMART_FLEE_PED(ambData.piHooker[2], PLAYER_PED_ID(), 500, -1) ENDIF IF bForceKeepTask SET_PED_KEEP_TASK(ambData.piHooker[2], TRUE) ENDIF ENDIF IF NOT IS_PED_INJURED(ambData.piDealer) IF aggroReason <> EAggro_MinorAttacked TASK_SMART_FLEE_PED(ambData.piDealer, PLAYER_PED_ID(), 500, -1) ENDIF IF bForceKeepTask SET_PED_KEEP_TASK(ambData.piDealer, TRUE) ENDIF ENDIF IF NOT IS_PED_INJURED(ambData.piHooker[3]) IF aggroReason <> EAggro_MinorAttacked TASK_SMART_FLEE_PED(ambData.piHooker[3], PLAYER_PED_ID(), 500, -1) ENDIF IF bForceKeepTask SET_PED_KEEP_TASK(ambData.piHooker[3], TRUE) ENDIF ENDIF IF NOT IS_PED_INJURED(ambData.piHooker[0]) IF aggroReason <> EAggro_MinorAttacked TASK_SMART_FLEE_PED(ambData.piHooker[0], PLAYER_PED_ID(), 500, -1) ENDIF IF bForceKeepTask SET_PED_KEEP_TASK(ambData.piHooker[0], TRUE) ENDIF ENDIF IF NOT IS_PED_INJURED(ambData.piHooker[1]) IF aggroReason <> EAggro_MinorAttacked TASK_SMART_FLEE_PED(ambData.piHooker[1], PLAYER_PED_ID(), 500, -1) ENDIF IF bForceKeepTask SET_PED_KEEP_TASK(ambData.piHooker[1], TRUE) ENDIF ENDIF ENDPROC PROC DESTROY_SEX_CAM() IF DOES_CAM_EXIST(camHint) SET_CAM_ACTIVE(camHint, FALSE) RENDER_SCRIPT_CAMS(FALSE, FALSE) DISPLAY_HUD(TRUE) DISPLAY_RADAR(TRUE) DESTROY_CAM(camHint) PRINTLN("DESTROYING CAMERA") ENDIF ENDPROC //grab a camera position randomly from a preset number of hard-coded locations and render it to the screen if the circle button is pressed PROC HANDLE_SEX_CAMERAS(ASS_ARGS& args) IF NOT IS_PED_INJURED(args.myTarget) IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < 35 AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF SHOULD_CONTROL_CHASE_HINT_CAM(localChaseHintCamStruct) IF NOT bChaseHintCamKilled AND IS_GAMEPLAY_HINT_ACTIVE() KILL_CHASE_HINT_CAM(localChaseHintCamStruct) bChaseHintCamKilled = TRUE ELSE IF NOT DOES_CAM_EXIST(camHint) camHint = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<-470.1433, -1720.1132, 18.5970>>, <<-1.0803, -0.0000, -80.8725>>, 35.0) PRINTLN("CREATE CAMERA") ENDIF IF NOT IS_CAM_ACTIVE(camHint) SET_CAM_ACTIVE(camHint, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) DISPLAY_HUD(FALSE) DISPLAY_RADAR(FALSE) PRINTLN("TURNING CAMERA ON") ENDIF ENDIF ELSE DESTROY_SEX_CAM() ENDIF ELSE DESTROY_SEX_CAM() ENDIF ENDIF ENDPROC //switch to custom cinematic cameras if the player presses hte Circle button in a vehicle PROC CONTROL_HINT_CAMS_IN_VICE_MISSION(ASS_ARGS& args) IF targetStage >= MISSION_VICE_TASK_PLAYER AND targetStage <= MISSION_VICE_TARGET_LEAVE AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) // SET_CINEMATIC_BUTTON_ACTIVE(FALSE) HANDLE_SEX_CAMERAS(args) ELSE //destroy the sex camera if it already exists DESTROY_SEX_CAM() IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF targetStage > MISSION_VICE_CHECK_CARS CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, args.myTarget) ELSE CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, args.myOtherPed) ENDIF ELSE KILL_CHASE_HINT_CAM(localChaseHintCamStruct) ENDIF ENDIF ENDPROC PROC START_HOOKER_CUTSCENE_ANIMS(ASS_ARGS& args, BOOL bPlayFirstAnim = TRUE) SEQUENCE_INDEX tempSeq IF targetData.myType = MISSION_NAME_HOOKER IF NOT IS_PED_INJURED(args.myOtherPed) SET_ENTITY_COORDS(args.myOtherPed, << -595.316, -1809.967, 22.102 >>) SET_ENTITY_HEADING(args.myOtherPed, 132.840) FORCE_PED_AI_AND_ANIMATION_UPDATE(args.myOtherPed) PRINTLN("MOVING GIRL") //tell hooker to walk to position on sidewalk and play her anims CLEAR_SEQUENCE_TASK(tempSeq) OPEN_SEQUENCE_TASK(tempSeq) IF bPlayFirstAnim TASK_PLAY_ANIM(NULL, sHookerAnimDict, "idle_b", SLOW_BLEND_IN, SLOW_BLEND_OUT, 10000) PRINTLN("PLAYING FIRST ANIMATION") ENDIF TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -594.3811, -1808.9480, 22.27985 >>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT ,targetData.fOtherPedHead) TASK_PLAY_ANIM(NULL, sHookerAnimDict, "idle_wait", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(tempSeq) TASK_PERFORM_SEQUENCE(args.myOtherPed, tempSeq) CLEAR_SEQUENCE_TASK(tempSeq) ENDIF ENDIF ENDPROC //the dummy car and ped that pull up to the hooker PROC CREATE_FALSE_JOHN_IN_VEHICLE(ASS_ARGS& args) IF NOT DOES_ENTITY_EXIST(args.myAuxVehicle) args.myAuxVehicle = CREATE_VEHICLE(targetData.auxVehEnum, targetData.vAuxVehPos, targetData.fAuxVehHead) SET_VEHICLE_EXTRA(args.myAuxVehicle, 2, TRUE) REMOVE_VEHICLE_WINDOW(args.myAuxVehicle, SC_WINDOW_FRONT_RIGHT) REMOVE_VEHICLE_WINDOW(args.myAuxVehicle, SC_WINDOW_FRONT_LEFT) ENDIF IF NOT DOES_ENTITY_EXIST(args.myAuxPed) args.myAuxPed = CREATE_PED_INSIDE_VEHICLE(args.myAuxVehicle, PEDTYPE_MISSION, targetData.auxPedEnum) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(args.myAuxPed, TRUE) ENDIF ENDPROC //PROC REMOVE_FALSE_JOHN(ASS_ARGS& args) // // IF NOT IS_ENTITY_DEAD(args.myAuxPed) // IF GET_SCRIPT_TASK_STATUS(args.myAuxPed, SCRIPT_TASK_VEHICLE_DRIVE_WANDER) = PERFORMING_TASK // IF DOES_ENTITY_EXIST(args.myAuxPed) // IF IS_ENTITY_OCCLUDED(args.myAuxPed) // SET_PED_AS_NO_LONGER_NEEDED(args.myAuxPed) // PRINTLN("PED IS VISIBLE: args.myAuxPed - SET AS NO LONGER NEEDED") // ELSE // DELETE_PED(args.myAuxPed) // PRINTLN("DELETE PED - args.myAuxPed") // ENDIF // ENDIF // IF DOES_ENTITY_EXIST(args.myAuxVehicle) // IF IS_ENTITY_OCCLUDED(args.myAuxVehicle) // SET_VEHICLE_AS_NO_LONGER_NEEDED(args.myAuxVehicle) // PRINTLN("VEHICLE IS VISIBLE: args.myAuxVehicle - SET AS NO LONGER NEEDED") // ELSE // DELETE_VEHICLE(args.myAuxVehicle) // PRINTLN("DELETE VEHICLE - args.myAuxVehicle") // ENDIF // ENDIF // ENDIF // ENDIF //ENDPROC FUNC BOOL HANDLE_FIRST_CAR(ASS_ARGS& args) INT iClosestWaypoint SEQUENCE_INDEX tempSeq SWITCH iFirstCarStages CASE 0 IF NOT DOES_ENTITY_EXIST(viFirstCar) viFirstCar = CREATE_VEHICLE(mnFirstCarModel, << -524.8151, -1771.9265, 20.3315 >>, 234) SET_MODEL_AS_NO_LONGER_NEEDED(mnFirstCarModel) PRINTLN("CREATING VEHICLE - viFirstCar") SET_VEHICLE_ON_GROUND_PROPERLY(viFirstCar) SET_VEHICLE_RADIO_ENABLED(viFirstCar, TRUE) // SET_RADIO_TO_STATION_NAME("RADIO_01_CLASS_ROCK") SET_VEHICLE_RADIO_LOUD(viFirstCar, TRUE) IF DOES_ENTITY_EXIST(viFirstCar) pedFirstDriver = CREATE_PED_INSIDE_VEHICLE(viFirstCar, PEDTYPE_MISSION, mnFirstCarPedModel) SET_MODEL_AS_NO_LONGER_NEEDED(mnFirstCarPedModel) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedFirstDriver, TRUE) TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(pedFirstDriver, viFirstCar, "OJAShk_103", DF_SwerveAroundAllCars|DF_StopAtLights|DF_SteerAroundObjects|DF_StopForCars|DF_SteerAroundPeds|DF_SteerAroundStationaryCars|DF_DriveIntoOncomingTraffic) SET_VEHICLE_DOORS_LOCKED(viFirstCar, VEHICLELOCK_LOCKOUT_PLAYER_ONLY) PRINTLN("iFirstCarStages = 1") iFirstCarStages = 1 ENDIF ENDIF BREAK //---------------------------------------------------------------------------------------------------------- CASE 1 IF NOT IS_ENTITY_DEAD(viFirstCar) AND NOT IS_ENTITY_DEAD(pedFirstDriver) IF WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT("OJAShk_103", GET_ENTITY_COORDS(viFirstCar), iClosestWaypoint) IF iClosestWaypoint >= 14 CLEAR_PED_TASKS(pedFirstDriver) BRING_VEHICLE_TO_HALT(viFirstCar, 10, 1) START_VEHICLE_HORN(viFirstCar, 750) IF NOT IS_ENTITY_DEAD(pedFirstDriver) AND NOT IS_ENTITY_DEAD(args.myOtherPed) TASK_LOOK_AT_ENTITY(pedFirstDriver, args.myOtherPed, -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH) TASK_LOOK_AT_ENTITY(args.myOtherPed, pedFirstDriver, -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH) OPEN_SEQUENCE_TASK(tempSeq) IF GET_ENTITY_HEADING(args.myOtherPed) < targetData.fOtherPedHead - 30 OR GET_ENTITY_HEADING(args.myOtherPed) > targetData.fOtherPedHead + 30 TASK_ACHIEVE_HEADING(NULL, targetData.fOtherPedHead) //make her face towards the car if she isnt already facing that general direction PRINTLN("TASK TO ACHIEVE HEADING") ENDIF TASK_PLAY_ANIM(NULL, sHookerAnimDict, "idle_outro", SLOW_BLEND_IN, SLOW_BLEND_OUT) TASK_PLAY_ANIM(NULL, sHookerAnimDict, "idle_b", SLOW_BLEND_IN, SLOW_BLEND_OUT) TASK_PLAY_ANIM(NULL, sHookerAnimDict, "idle_wait", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(tempSeq) TASK_PERFORM_SEQUENCE(args.myOtherPed, tempSeq) CLEAR_SEQUENCE_TASK(tempSeq) PRINTLN("TASKING FIRST CAR DRIVER AND HOOKER TO LOOK AT EACH OTHER") ENDIF IF NOT IS_TIMER_STARTED(tFirstCarTimer) START_TIMER_NOW(tFirstCarTimer) PRINTLN("STARTING TIMER - tFirstCarTimer") ELSE RESTART_TIMER_NOW(tFirstCarTimer) PRINTLN("RESTARTING TIMER - tFirstCarTimer") ENDIF ADD_PED_FOR_DIALOGUE(args.assConv, 5, pedFirstDriver, "VICE_FIRST") IF NOT bPlayedFirstConvo IF CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_FIRST", CONV_PRIORITY_HIGH) PRINTLN("bPlayedFirstConvo = TRUE") bPlayedFirstConvo = TRUE ENDIF ENDIF PRINTLN("iFirstCarStages = 2") iFirstCarStages = 2 ENDIF ENDIF ENDIF BREAK //---------------------------------------------------------------------------------------------------------- CASE 2 IF NOT bPlayedFirstConvo IF CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_FIRST", CONV_PRIORITY_HIGH) PRINTLN("bPlayedFirstConvo = TRUE") bPlayedFirstConvo = TRUE ENDIF ENDIF IF IS_TIMER_STARTED(tFirstCarTimer) IF GET_TIMER_IN_SECONDS(tFirstCarTimer) > 7 //make the dummy car wander and no longer follow a waypoint recording IF IS_VEHICLE_DRIVEABLE(viFirstCar) IF NOT IS_PED_INJURED(pedFirstDriver) OPEN_SEQUENCE_TASK(tempSeq) TASK_VEHICLE_MISSION_COORS_TARGET(NULL, viFirstCar, vRandomVehicleDriveToPos, MISSION_GOTO, 15, DRIVINGMODE_AVOIDCARS_OBEYLIGHTS, 1.0, -1) TASK_VEHICLE_DRIVE_WANDER(NULL, viFirstCar, 15, DRIVINGMODE_AVOIDCARS_OBEYLIGHTS) CLOSE_SEQUENCE_TASK(tempSeq) TASK_PERFORM_SEQUENCE(pedFirstDriver, tempSeq) CLEAR_SEQUENCE_TASK(tempSeq) PRINTLN("TASKING FIRST CAR TO WANDER") ENDIF ENDIF IF NOT IS_ENTITY_DEAD(pedFirstDriver) AND NOT IS_ENTITY_DEAD(args.myOtherPed) TASK_CLEAR_LOOK_AT(pedFirstDriver) TASK_CLEAR_LOOK_AT(args.myOtherPed) PRINTLN("CLEARING LOOK AT TASKS") ENDIF PRINTLN("iFirstCarStages = 3") iFirstCarStages = 3 ENDIF ENDIF BREAK //---------------------------------------------------------------------------------------------------------- CASE 3 IF DOES_ENTITY_EXIST(viFirstCar) IF NOT IS_ENTITY_ON_SCREEN(viFirstCar) IF DOES_ENTITY_EXIST(pedFirstDriver) SET_PED_AS_NO_LONGER_NEEDED(pedFirstDriver) PRINTLN("SETTING PED AS NO LONGER NEEDED - pedFirstDriver") ENDIF SET_VEHICLE_AS_NO_LONGER_NEEDED(viFirstCar) PRINTLN("SETTING ENTITY AS NO LONGER NEEDED - viFirstCar") PRINTLN("iFirstCarStages = 4") iFirstCarStages = 4 ENDIF ENDIF BREAK //---------------------------------------------------------------------------------------------------------- CASE 4 RETURN TRUE BREAK //---------------------------------------------------------------------------------------------------------- ENDSWITCH RETURN FALSE ENDFUNC PROC CLEANUP_FIRST_CAR(BOOL bForceDelete = FALSE) IF DOES_ENTITY_EXIST(pedFirstDriver) IF IS_ENTITY_OCCLUDED(pedFirstDriver) AND NOT bForceDelete SET_PED_AS_NO_LONGER_NEEDED(pedFirstDriver) PRINTLN("PED IS VISIBLE: pedFirstDriver - SET AS NO LONGER NEEDED") ELSE DELETE_PED(pedFirstDriver) PRINTLN("DELETE PED - pedFirstDriver") ENDIF ENDIF IF DOES_ENTITY_EXIST(viFirstCar) IF IS_ENTITY_OCCLUDED(viFirstCar) AND NOT bForceDelete SET_VEHICLE_AS_NO_LONGER_NEEDED(viFirstCar) PRINTLN("VEHICLE IS VISIBLE: viFirstCar - SET AS NO LONGER NEEDED") ELSE DELETE_VEHICLE(viFirstCar) PRINTLN("DELETE VEHICLE - viFirstCar") ENDIF ENDIF ENDPROC PROC PRINT_RETURN_TO_GIRL_MESSAGE_AND_HANDLE_FAIL_TIMER() IF NOT IS_TIMER_STARTED(tInSpawnAreaTimer) START_TIMER_NOW(tInSpawnAreaTimer) PRINTLN("STARTING TIMER - tInSpawnAreaTimer") PRINT_NOW("ASS_HK_RT", DEFAULT_GOD_TEXT_TIME, 1) ELSE IF GET_TIMER_IN_SECONDS(tInSpawnAreaTimer) > 25 PRINTLN("FAILING MISSION - PLAYER HAS BEEN IN RESTRICTED AREA FOR TOO LONG") SET_MISSION_FAILED(asnArgs, targetData, FAIL_ABANDONED_MISSION) ENDIF ENDIF ENDPROC FUNC BOOL OKAY_TO_SPAWN_NEXT_ROUND_OF_CARS() IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) //angled area encompasses the road that the target spawns on IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-439.426483,-1816.019653,17.484024>>, <<-645.871460,-1681.039185,31.151434>>, 61.000000) PRINT_RETURN_TO_GIRL_MESSAGE_AND_HANDLE_FAIL_TIMER() ENDIF ENDIF IF NOT IS_SPHERE_VISIBLE(vSphereToCheckForSendCars, 10.0) OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-723.255127,-1752.763306,13.969912>>, <<-537.536438,-1891.546997,41.430756>>, 135.750000) PRINTLN("SPAWN LOCATION IS OFFSCREEN, CLEAR TO CONTINUE") RETURN TRUE ELSE PRINT_RETURN_TO_GIRL_MESSAGE_AND_HANDLE_FAIL_TIMER() ENDIF RETURN FALSE ENDFUNC //PROC VICE_PED_LEAVE_VEHICLE_AND_ATTACK_PLAYER(PED_INDEX pedToTask) // SEQUENCE_INDEX tempSeq // // SET_PED_COMBAT_ATTRIBUTES(pedToTask, CA_LEAVE_VEHICLES, TRUE) // SET_PED_COMBAT_ATTRIBUTES(pedToTask, CA_AGGRESSIVE, TRUE) // // CLEAR_SEQUENCE_TASK(tempSeq) // OPEN_SEQUENCE_TASK(tempSeq) // TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_CLOSE_DOOR) // TASK_COMBAT_PED(NULL, PLAYER_PED_ID()) // CLOSE_SEQUENCE_TASK(tempSeq) // TASK_PERFORM_SEQUENCE(pedToTask, tempSeq) // CLEAR_SEQUENCE_TASK(tempSeq) // // PRINTLN("INSIDE - VICE_PED_LEAVE_VEHICLE_AND_ATTACK_PLAYER") //ENDPROC //PROC VICE_PED_LEAVE_VEHICLE_AND_ATTACK_PLAYER_DURING_SEX_GUY(PED_INDEX& pedToTask) // SEQUENCE_INDEX tempSeq // // SET_PED_COMBAT_ATTRIBUTES(pedToTask, CA_LEAVE_VEHICLES, TRUE) // SET_PED_COMBAT_ATTRIBUTES(pedToTask, CA_AGGRESSIVE, TRUE) // // CLEAR_SEQUENCE_TASK(tempSeq) // OPEN_SEQUENCE_TASK(tempSeq) // IF bPlayPanicAnimation //// IF IS_ENTITY_PLAYING_ANIM(pedToTask, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_loop_m") // TASK_PLAY_ANIM(NULL, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_outro_m", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1) // PRINTLN("GUY IS IN SEX ACT - BUT PANIC IS SET, SO PLAY PANIC ANIMATIONS - 01") //// ELSE //// PRINTLN("THE GUY IS NOT PLAYING THE LOOPING SEX ANIMATION") //// ENDIF // ELSE // TASK_PLAY_ANIM(NULL, "ODDJOBS@ASSASSINATE@VICE@SEX", "FrontSeat_CarSex_Normal_Outro_m", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1) // PRINTLN("bPlayPanicAnimation IS FALSE - VIA VICE_PED_LEAVE_VEHICLE_AND_ATTACK_PLAYER_DURING_SEX_GUY") // ENDIF // TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_CLOSE_DOOR) // TASK_COMBAT_PED(NULL, PLAYER_PED_ID()) // CLOSE_SEQUENCE_TASK(tempSeq) // TASK_PERFORM_SEQUENCE(pedToTask, tempSeq) // CLEAR_SEQUENCE_TASK(tempSeq) // // PRINTLN("INSIDE - VICE_PED_LEAVE_VEHICLE_AND_ATTACK_PLAYER_DURING_SEX_GUY") //ENDPROC //PROC VICE_PED_LEAVE_VEHICLE_AND_ATTACK_PLAYER_DURING_SEX_GIRL(PED_INDEX& pedToTask) // SEQUENCE_INDEX tempSeq // // SET_PED_COMBAT_ATTRIBUTES(pedToTask, CA_LEAVE_VEHICLES, TRUE) // SET_PED_COMBAT_ATTRIBUTES(pedToTask, CA_AGGRESSIVE, TRUE) // // CLEAR_SEQUENCE_TASK(tempSeq) // OPEN_SEQUENCE_TASK(tempSeq) // IF bPlayPanicAnimation //// IF IS_ENTITY_PLAYING_ANIM(pedToTask, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_loop_f") // TASK_PLAY_ANIM(NULL, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_outro_f", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1) // PRINTLN("GIRL IS IN SEX ACT - BUT PANIC IS SET, SO PLAY PANIC ANIMATIONS") //// ELSE //// PRINTLN("THE GIRL IS NOT PLAYING THE LOOPING SEX ANIMATION") //// ENDIF // ELSE // TASK_PLAY_ANIM(NULL, "ODDJOBS@ASSASSINATE@VICE@SEX", "FrontSeat_CarSex_Normal_Outro_f", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1) // PRINTLN("bPlayPanicAnimation IS FALSE - VIA VICE_PED_LEAVE_VEHICLE_AND_ATTACK_PLAYER_DURING_SEX_GIRL") // ENDIF // TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_CLOSE_DOOR) // TASK_COMBAT_PED(NULL, PLAYER_PED_ID()) // CLOSE_SEQUENCE_TASK(tempSeq) // TASK_PERFORM_SEQUENCE(pedToTask, tempSeq) // CLEAR_SEQUENCE_TASK(tempSeq) // // PRINTLN("INSIDE - VICE_PED_LEAVE_VEHICLE_AND_ATTACK_PLAYER_DURING_SEX_GIRL") //ENDPROC PROC VICE_PED_LEAVE_VEHICLE_AND_FLEE_PLAYER_GIRL(PED_INDEX pedToTask) SEQUENCE_INDEX tempSeq BOOL bPlayingSexAnim IF NOT IS_ENTITY_DEAD(pedToTask) SET_PED_COMBAT_ATTRIBUTES(pedToTask, CA_LEAVE_VEHICLES, TRUE) SET_PED_COMBAT_ATTRIBUTES(pedToTask, CA_USE_VEHICLE, FALSE) ENDIF TASK_CLEAR_LOOK_AT(pedToTask) IF IS_ENTITY_PLAYING_ANIM(pedToTask, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_loop_f") OR IS_ENTITY_PLAYING_ANIM(pedToTask, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_intro_f") bPlayingSexAnim = TRUE PRINTLN("GIRL IS PLAYING SEX ANIMATION") ELSE bPlayingSexAnim = FALSE PRINTLN("GIRL IS NOT PLAYING SEX ANIMATION") ENDIF SET_PED_FLEE_ATTRIBUTES(pedToTask, FA_USE_VEHICLE, FALSE) CLEAR_SEQUENCE_TASK(tempSeq) OPEN_SEQUENCE_TASK(tempSeq) IF bPlayPanicAnimation IF bPlayingSexAnim TASK_PLAY_ANIM(NULL, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_outro_f", SLOW_BLEND_IN, SLOW_BLEND_OUT, 3500) PRINTLN("GIRL IS IN SEX ACT - BUT PANIC IS SET, SO PLAY PANIC ANIMATIONS") ELSE PRINTLN("bPlayPanicAnimation IS TRUE, BUT GIRL IS NOT PERFORMING SEX ANIMATION") ENDIF ELSE IF bPlayingSexAnim TASK_PLAY_ANIM(NULL, "ODDJOBS@ASSASSINATE@VICE@SEX", "FrontSeat_CarSex_Normal_Outro_f", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1) PRINTLN("GIRL IS IN SEX ACT - HAVE HER PLAY OUTRO FIRST BEFORE EXITING VEHICLE") ELSE PRINTLN("bPlayPanicAnimation IS FALSE, BUT GIRL IS NOT PERFORMING SEX ANIMATION") ENDIF ENDIF // TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_CLOSE_DOOR) TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 500, -1) CLOSE_SEQUENCE_TASK(tempSeq) IF NOT IS_ENTITY_DEAD(pedToTask) TASK_PERFORM_SEQUENCE(pedToTask, tempSeq) ENDIF CLEAR_SEQUENCE_TASK(tempSeq) PRINTLN("INSIDE - VICE_PED_LEAVE_VEHICLE_AND_FLEE_PLAYER - GIRL") ENDPROC PROC VICE_PED_LEAVE_VEHICLE_AND_FLEE_PLAYER_GUY(PED_INDEX pedToTask) SEQUENCE_INDEX tempSeq BOOL bPlayingSexAnim IF NOT IS_ENTITY_DEAD(pedToTask) SET_PED_COMBAT_ATTRIBUTES(pedToTask, CA_LEAVE_VEHICLES, TRUE) SET_PED_COMBAT_ATTRIBUTES(pedToTask, CA_USE_VEHICLE, FALSE) ENDIF TASK_CLEAR_LOOK_AT(pedToTask) SET_PED_CAN_BE_TARGETTED(pedToTask, TRUE) IF IS_ENTITY_PLAYING_ANIM(pedToTask, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_loop_m") OR IS_ENTITY_PLAYING_ANIM(pedToTask, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_intro_m") bPlayingSexAnim = TRUE PRINTLN("GUY IS PLAYING SEX ANIMATION") ELSE bPlayingSexAnim = FALSE PRINTLN("GUY IS NOT PLAYING SEX ANIMATION") ENDIF SET_PED_FLEE_ATTRIBUTES(pedToTask, FA_USE_VEHICLE, FALSE) CLEAR_SEQUENCE_TASK(tempSeq) OPEN_SEQUENCE_TASK(tempSeq) IF bPlayPanicAnimation IF bPlayingSexAnim TASK_PLAY_ANIM(NULL, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_outro_m", SLOW_BLEND_IN, SLOW_BLEND_OUT, 3000) PRINTLN("GUY IS IN SEX ACT - BUT PANIC IS SET, SO PLAY PANIC ANIMATIONS") ELSE PRINTLN("bPlayPanicAnimation IS TRUE, BUT GUY IS NOT PERFORMING SEX ANIMATION") ENDIF ELSE IF bPlayingSexAnim TASK_PLAY_ANIM(NULL, "ODDJOBS@ASSASSINATE@VICE@SEX", "FrontSeat_CarSex_Normal_Outro_m", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1) PRINTLN("GUY IS IN SEX ACT - HAVE HIM PLAY OUTRO FIRST BEFORE EXITING VEHICLE") ELSE PRINTLN("GUY IS NOT PERFORMING SEX ANIMATION") ENDIF ENDIF // TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_CLOSE_DOOR) // TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 500, -1) TASK_COMBAT_PED(NULL, PLAYER_PED_ID()) CLOSE_SEQUENCE_TASK(tempSeq) IF NOT IS_ENTITY_DEAD(pedToTask) TASK_PERFORM_SEQUENCE(pedToTask, tempSeq) ENDIF CLEAR_SEQUENCE_TASK(tempSeq) PRINTLN("INSIDE - VICE_PED_LEAVE_VEHICLE_AND_FLEE_PLAYER - GUY") ENDPROC PROC DETACH_GIRL_FROM_CAR(ASS_ARGS& args) FLOAT fAnimTime IF NOT IS_PED_INJURED(args.myTarget) IF IS_ENTITY_PLAYING_ANIM(args.myTarget, "ODDJOBS@assassinate@vice@incar", "passenger_KO_female_m") fAnimTime = GET_ENTITY_ANIM_CURRENT_TIME(args.myTarget, "ODDJOBS@assassinate@vice@incar", "passenger_KO_female_m") PRINTLN("fAnimTime = ", fAnimTime) ENDIF ENDIF IF NOT bDetachGirlFromCar IF fAnimTime >= 0.196 IF NOT IS_PED_INJURED(args.myOtherPed) SET_PED_CONFIG_FLAG(args.myOtherPed,PCF_FallsOutOfVehicleWhenKilled,TRUE) SET_ENTITY_HEALTH(args.myOtherPed, 0) PRINTLN("DETACHING GIRL FROM CAR AND SETTING HEALTH TO ZERO") bDetachGirlFromCar = TRUE ENDIF ENDIF ENDIF ENDPROC PROC HANDLE_SECOND_MUSIC_CUE() IF NOT bTriggeredSecondMusicCue IF IS_TIMER_STARTED(tMusicCueTimer) IF GET_TIMER_IN_SECONDS(tMusicCueTimer) > 5 TRIGGER_MUSIC_EVENT("ASS3_START") PRINTLN("TRIGGERING MUSIC - ASS3_START") bTriggeredSecondMusicCue = TRUE ENDIF ENDIF ENDIF ENDPROC PROC CHECK_FOR_DRIVING_TOO_CLOSE(ASS_ARGS& args) VECTOR vPlayerPosition VECTOR vTargetCarPosition IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID()) ENDIF ENDIF IF NOT IS_ENTITY_DEAD(args.myVehicle) vTargetCarPosition = GET_ENTITY_COORDS(args.myVehicle) ENDIF IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) IF GET_ENTITY_SPEED(PLAYER_PED_ID()) < 2.0 EXIT ENDIF ENDIF SWITCH iFollowTooCloseStages CASE 0 IF VDIST2(vPlayerPosition, <<-595.5570, -1806.4512, 22.2803>>) > 625 //25m PRINTLN("iFollowTooCloseStages = 1") iFollowTooCloseStages = 1 ENDIF BREAK //======================================================================== CASE 1 IF VDIST2(vPlayerPosition, vTargetCarPosition) < 225 //15m IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_CLOSE", CONV_PRIORITY_HIGH) IF NOT IS_TIMER_STARTED(tTooCloseTimer) START_TIMER_NOW(tTooCloseTimer) PRINTLN("STARTING TIMER - tTooCloseTimer") ELSE RESTART_TIMER_NOW(tTooCloseTimer) PRINTLN("RESTARTING TIMER - tTooCloseTimer") ENDIF fTooCloseTime = GET_TIMER_IN_SECONDS(tTooCloseTimer) PRINTLN("iFollowTooCloseStages = 2. fTooCloseTime = ", fTooCloseTime) iFollowTooCloseStages = 2 ENDIF ELSE KILL_FACE_TO_FACE_CONVERSATION() ENDIF ENDIF BREAK //======================================================================== CASE 2 IF IS_TIMER_STARTED(tTooCloseTimer) IF GET_TIMER_IN_SECONDS(tTooCloseTimer) > fTooCloseTime + 15 AND VDIST2(vPlayerPosition, vTargetCarPosition) < 100 // 10m bTailedTooClose = TRUE PRINTLN("iFollowTooCloseStages = 3") iFollowTooCloseStages = 3 ENDIF ENDIF BREAK //======================================================================== CASE 3 BREAK ENDSWITCH ENDPROC FUNC BOOL HAS_CASUAL_CONVERSATION_FINISHED(INT& iSpeechLineCounter) IF fTooCloseTime = -1 SWITCH iSpeechLineCounter CASE 0 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() CREATE_CONVERSATION(assArgs.assConv, "OJASAUD", "OJAShk_CLS_1", CONV_PRIORITY_HIGH) iSpeechLineCounter ++ ENDIF BREAK CASE 1 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() CREATE_CONVERSATION(assArgs.assConv, "OJASAUD", "OJAShk_CLS_2", CONV_PRIORITY_HIGH) iSpeechLineCounter ++ ENDIF BREAK CASE 2 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() CREATE_CONVERSATION(assArgs.assConv, "OJASAUD", "OJAShk_CLS_3", CONV_PRIORITY_HIGH) RETURN TRUE ENDIF BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// checks to see if any vehicle is blocking the target's car from moving /// PARAMS: /// vehToCheck - car to check if blocked /// timerStuck - timer used /// timerInterval - how often should we check (setting to 1.0 will check the timer every 1 second for example) /// vectorToUseInChecks - location to check if blocked /// fTimeBeforeConsideredStuck - how long before this should return true /// fDistToBeConsideredStuck - how little of a distance vehToCheck has moved before the vehicle is considered stuck /// RETURNS: /// TRUE if fTimeBeforeConsideredStuck AND fDistToBeConsideredStuck return TRUE FUNC BOOL IS_CAR_BLOCKED(VEHICLE_INDEX vehToCheck, structTimer& timerStuck, structTimer& timerInterval, VECTOR& vectorToUseInChecks, FLOAT fTimeBeforeConsideredStuck, FLOAT fDistToBeConsideredStuck) IF DOES_ENTITY_EXIST(vehToCheck) IF IS_TIMER_STARTED(timerInterval) //only check this function once a second IF GET_TIMER_IN_SECONDS(timerInterval) >= 1.0 IF IS_TIMER_STARTED(timerStuck) IF GET_TIMER_IN_SECONDS(timerStuck) > fTimeBeforeConsideredStuck IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(vehToCheck, vectorToUseInChecks) <= fDistToBeConsideredStuck PRINTLN("RETURNING TRUE ON IS_CAR_BLOCKED") RETURN TRUE ELSE //store off the car's position IF NOT IS_ENTITY_DEAD(vehToCheck) vectorToUseInChecks = GET_ENTITY_COORDS(vehToCheck) RESTART_TIMER_NOW(timerStuck) ENDIF ENDIF ENDIF ELSE //store off the car's position IF NOT IS_ENTITY_DEAD(vehToCheck) vectorToUseInChecks = GET_ENTITY_COORDS(vehToCheck) RESTART_TIMER_NOW(timerStuck) ENDIF ENDIF RESTART_TIMER_NOW(timerInterval) ENDIF ELSE RESTART_TIMER_NOW(timerInterval) ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_ANY_CAR_NEAR_JUNKYARD_PRIOR_TO_TARGET_ENTERING() #IF NOT IS_JAPANESE_BUILD VEHICLE_INDEX vehScrapyard IF targetStage >= MISSION_VICE_CHECK_CARS IF targetStage < MISSION_VICE_PARK_CAR OR ( targetStage = MISSION_VICE_PARK_CAR AND NOT IS_ENTITY_DEAD(assArgs.myVehicle) AND IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_VEHICLE(assArgs.myVehicle) AND GET_VEHICLE_WAYPOINT_PROGRESS(assArgs.myVehicle) <= 30 ) vehScrapyard = GET_CLOSEST_VEHICLE(vJunkyardPos, fJunkyardRadius, DUMMY_MODEL_FOR_SCRIPT, VEHICLE_SEARCH_FLAG_RETURN_RANDOM_VEHICLES) // IF GET_CLOSEST_VEHICLE(vJunkyardPos, fJunkyardRadius, DUMMY_MODEL_FOR_SCRIPT, VEHICLE_SEARCH_FLAG_RETURN_RANDOM_VEHICLES) != NULL // OR GET_CLOSEST_VEHICLE(vJunkyardPos, fJunkyardRadius, DUMMY_MODEL_FOR_SCRIPT, VEHICLE_SEARCH_FLAG_RETURN_MISSION_VEHICLES) != NULL // OR GET_CLOSEST_VEHICLE(vJunkyardPos, fJunkyardRadius, DUMMY_MODEL_FOR_SCRIPT, VEHICLE_SEARCH_FLAG_RETURN_LAW_ENFORCER_VEHICLES) != NULL IF vehScrapyard != NULL RETURN TRUE ENDIF // DRAW_DEBUG_SPHERE(vJunkyardPos, fJunkyardRadius) ENDIF ENDIF RETURN FALSE #ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Prints message to "Assassinate the target" when there isnt any dialogue or other objectives diaplyed on screen /// Flips the bPrintedMsg BOOL to true when done PROC PRINT_MESSAGE_TO_KILL_TARGET_WHEN_SAFE(ASS_ARGS& args) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() //remove the hooker's existing blip REMOVE_BLIP(args.mytargetblip) //create red blip on target args.mytargetblip = CREATE_BLIP_ON_ENTITY(args.myTarget, FALSE) PRINT_NOW("ASS_HK_WAIT2", DEFAULT_GOD_TEXT_TIME, 1) bPrintedMsg = TRUE ENDIF ENDPROC /// PURPOSE: /// Store off a string for the panic line to use based on the circumstances that panic was triggered /// RETURNS: /// String to use for the panic line FUNC STRING STORE_PANIC_LINE() //play appropriate panic line #IF NOT IS_JAPANESE_BUILD IF IS_PLAYER_NEAR_BOUNCING_CAR(assArgs.myTarget, assArgs.assConv, dialogueTimer) PRINTLN("PLAYING BOUNCING CONVO") RETURN "OJAShk_HELP2" //"You just signed your own death warrant buddy!" ENDIF #ENDIF IF bPlayerBlockingDeal PRINTLN("PLAYING BLOCKING CONVO") RETURN "OJAShk_HELP3" //"Can't you see I'm trying to do business here? ELIF bTailedTooClose PRINTLN("PLAYING PANIC CONVO") RETURN "OJAShk_PANIC" //"Fuck this guy! I'm getting out of here. ELIF bTargetCarStuck PRINTLN("PLAYING BLOCKING CONVO") RETURN "OJAShk_BLOCK" //"Fuck this let's get outta here. ELSE PRINTLN("PLAYING FRIGHTENED CONVO") RETURN "OJAShk_HELP" //"Get away from me you maniac!" ENDIF RETURN "" ENDFUNC /// PURPOSE: /// Plays the appropriate panic line based on data stored into sPanicLine PROC PLAY_APPROPRIATE_PANIC_LINE(ASS_ARGS& args) IF NOT bPanicLinePlayed IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF NOT IS_STRING_NULL_OR_EMPTY(sPanicLine) IF ARE_STRINGS_EQUAL(sPanicLine, "OJAShk_HELP") AND IS_PED_INJURED(args.myOtherPed) OR bTargetSpottedPlayerInScrapyard //don't have hooker play the "Oh my God, stop!" line if aggro was triggered by the player spotting them in the scrapyard PLAY_SINGLE_LINE_FROM_CONVERSATION(args.assConv, "OJASAUD", sPanicLine, "OJAShk_HELP_3", CONV_PRIORITY_VERY_HIGH) ELSE CREATE_CONVERSATION(args.assConv, "OJASAUD", sPanicLine, CONV_PRIORITY_VERY_HIGH) ENDIF ENDIF bPanicLinePlayed = TRUE ENDIF ENDIF ENDPROC PROC GRAB_RETRY_VEHICLE() IF NOT DOES_ENTITY_EXIST(viReplayVehicle) IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) viReplayVehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) PRINTLN("FOUND REPLAY VEHICLE") IF DOES_ENTITY_EXIST(viReplayVehicle) AND NOT IS_ENTITY_DEAD(viReplayVehicle) OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(viReplayVehicle) ENDIF ENDIF ENDIF ENDIF ENDPROC PROC HANDLE_PLAYER_BEING_ON_ROOFTOP() IF iCounter = 0 IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-628.644836,-1780.581421,40.331997>>, <<-600.087219,-1760.645996,48.331993>>, 24.750000) aggroArgs.fAimRange = 5.0 // PRINTLN("PLAYER IS ON ROOFTOP, INCREASE CHECK AIM DISTANCE") ELSE aggroArgs.fAimRange = 28.0 // PRINTLN("PLAYER IS NOT ON ROOFTOP, DECREASE CHECK AIM DISTANCE") ENDIF ENDIF ENDIF iCounter++ IF iCounter > 10 iCounter = 0 ENDIF ENDPROC PROC HANDLE_COPS_MUSIC_TRIGGER() IF NOT bTriggeredCopsMusicCue IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 IF PREPARE_MUSIC_EVENT("ASS3_COPS") TRIGGER_MUSIC_EVENT("ASS3_COPS") PRINTLN("TRIGGERING MUSIC - ASS3_COPS") bTriggeredCopsMusicCue = TRUE PRINTLN("bTriggeredCopsMusicCue = TRUE") ENDIF ENDIF ENDIF ENDPROC //update loop for the Vice Assassination after the intro cutscene has played until the target has been killed PROC UPDATE_LOOP_VICE(ASS_ARGS& args, AMBIENT_PEDS_IN_SCENE& ambHook) SEQUENCE_INDEX tempSeq VECTOR vClosestVehNode INT iClosestWaypoint VECTOR vTargetPos VECTOR vPlayerPosition, vTargetPosition // Used for check to play panic animations FLOAT fTemp HANDLE_PLAYER_BEING_ON_ROOFTOP() //checks to see if the player is blocking the junkyard or if the target car is stuck IF NOT bPlayerBlockingDeal IF NOT bTargetCarStuck IF IS_ANY_CAR_NEAR_JUNKYARD_PRIOR_TO_TARGET_ENTERING() bTargetCarStuck = TRUE PRINTLN("bTargetCarStuck = TRUE - CAR NEAR JUNKYARD") ENDIF ENDIF IF targetStage >= MISSION_VICE_CHECK_CARS AND targetStage < MISSION_VICE_TASK_PLAYER //don't run the blocked car check when the target pulls up to the girl since the car will be stopped and we don't want this to falsely return true IF targetStage = MISSION_VICE_ENTER_CAR OR (NOT IS_ENTITY_DEAD(args.myOtherPed) AND (GET_SCRIPT_TASK_STATUS(args.myOtherPed, SCRIPT_TASK_ENTER_VEHICLE) = PERFORMING_TASK)) IF IS_TIMER_STARTED(tBlockTimer) CANCEL_TIMER(tBlockTimer) ENDIF ELSE #IF NOT IS_JAPANESE_BUILD IF IS_CAR_BLOCKED(args.myVehicle, tBlockTimer, tBlockTimerInterval, vTargetCarPos, 10.0, 6.0) bTargetCarStuck = TRUE PRINTLN("bTargetCarStuck = TRUE - IS_CAR_BLOCKED returned true") ENDIF #ENDIF #IF IS_JAPANESE_BUILD //let the checks be more lenient since we don't want it returning true prematurely since the car is released into traffic and could be stopped at a stoplight or something IF IS_CAR_BLOCKED(args.myVehicle, tBlockTimer, tBlockTimerInterval, vTargetCarPos, 20.0, 6.0) bTargetCarStuck = TRUE PRINTLN("bTargetCarStuck = TRUE - IS_CAR_BLOCKED returned true") ENDIF #ENDIF ENDIF ENDIF ENDIF //have any peds in the vice scene play their lines if the player approaches them MANAGE_AMBIENT_VICE_DIALOGUE(args, ambHook) // *****PANIC CHECKS AND ANY OTHER CHECKS FOR THE MISSION ************************************* IF targetStage < MISSION_VICE_TARGET_ESCAPE IF HAS_PLAYER_PISSED_OFF_PEDS_IN_VICE_SCENE(ambHook, args, iFrameCountAsn, TRUE, bTriggeredAggro) #IF NOT IS_JAPANESE_BUILD OR IS_PLAYER_NEAR_BOUNCING_CAR(args.myTarget, args.assConv, dialogueTimer) OR IS_PLAYER_NEAR_BOUNCING_CAR(args.myOtherPed, args.assConv, dialogueTimer, FALSE) #ENDIF OR bPlayerBlockingDeal OR IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) OR bTailedTooClose OR bTargetCarStuck OR bTargetSpottedPlayerInScrapyard PRINTLN("WE'VE AGGROED SOMETHING, SHOULD BE FAILING") REMOVE_BLIP(args.mytargetblip) // bCheckForSexPhoto = FALSE SET_AMBIENT_VICE_PEDS_TO_FLEE(args, ambHook) RELEASE_ALL_AMBIENT_PED_MODELS_FOR_VICE_LOT(ambHook) IF NOT IS_ENTITY_DEAD(args.myTarget) AND NOT IS_ENTITY_DEAD(args.myOtherPed) AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) IF aggroReason = EAggro_ShotNear OR aggroReason = EAggro_HeardShot OR aggroReason = EAggro_MinorAttacked OR IS_PED_SHOOTING(PLAYER_PED_ID()) vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID()) vTargetPosition = GET_ENTITY_COORDS(args.myTarget) fTemp = fTemp fTemp = VDIST(vPlayerPosition, vTargetPosition) PRINTLN("DISTANCE FROM TARGET = ", fTemp) IF VDIST2(vPlayerPosition, vTargetPosition) > 25 // 5m bPlayPanicAnimation = TRUE PRINTLN("bPlayPanicAnimation = TRUE") ENDIF ENDIF ENDIF IF DOES_ENTITY_EXIST(args.myTarget) AND NOT IS_PED_INJURED(args.myTarget) //if the player is close to the target, stop any ongoing converstations and have the target play a panic line IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < 30 STOP_SCRIPTED_CONVERSATION(FALSE) sPanicLine = STORE_PANIC_LINE() ENDIF //have target exit the vehicle and attack if his vehicle is undriveable IF DOES_ENTITY_EXIST(args.myVehicle) AND NOT IS_VEHICLE_DRIVEABLE(args.myVehicle) SET_PED_COMBAT_ATTRIBUTES(args.myTarget, CA_LEAVE_VEHICLES, TRUE) SET_VEHICLE_DOORS_LOCKED(args.myVehicle, VEHICLELOCK_UNLOCKED) VICE_PED_LEAVE_VEHICLE_AND_FLEE_PLAYER_GUY(args.myTarget) PRINTLN("TARGET VEHICLE IS NOT DRIVEALBE - TASKING TARGET TO LEAVE AND FLEE PLAYER") //have hooker leave the car as well IF NOT IS_PED_INJURED(args.myOtherPed) IF GET_SCRIPT_TASK_STATUS(args.myOtherPed, SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK VICE_PED_LEAVE_VEHICLE_AND_FLEE_PLAYER_GIRL(args.myOtherPed) ENDIF ENDIF ELSE IF NOT bHookerTaskedToEnterCar SET_MISSION_FAILED(asnArgs, targetData, FAIL_BLOWN_COVER) PRINTLN("FAILING MISSION! PANIC TRIGGERED EARLY AND bHookerTaskedToEnterCar = FALSE - 01") ELSE //otherwise task him to drive off and shoot at the player while driving PRINTLN("bHookerTaskedToEnterCar MUST BE TRUE") IF NOT bTaskedTarget IF bFinishedWaypointRecording PRINTLN("WAYPOINT RECORDING FINISHED - TASKING GUY TO LEAVE VEHICLE") IF bTooCloseToBouncingCar VICE_PED_LEAVE_VEHICLE_AND_FLEE_PLAYER_GUY(args.myTarget) VICE_PED_LEAVE_VEHICLE_AND_FLEE_PLAYER_GIRL(args.myOtherPed) PRINTLN("bTooCloseToBouncingCar IS TRUE, TASKING TARGET TO FLEE") ELSE VICE_PED_LEAVE_VEHICLE_AND_FLEE_PLAYER_GUY(args.myTarget) VICE_PED_LEAVE_VEHICLE_AND_FLEE_PLAYER_GIRL(args.myOtherPed) PRINTLN("TASKING GUY AND GIRL TO FLEE") ENDIF SET_VEHICLE_DOORS_LOCKED(args.myVehicle, VEHICLELOCK_UNLOCKED) //allow player to jack if he wants IF NOT bHookerInCar AND NOT bPrintedMsg //print message to "Assassinate the target" since it hasn't yet been printed PRINT_NOW("ASS_HK_WAIT2", DEFAULT_GOD_TEXT_TIME, 1) ENDIF bTaskedTarget = TRUE ELSE PRINTLN("WAYPOINT RECORDING NOT FINISHED - TASKING GUY TO COMBAT WITH VEHICLE") CLEAR_PED_TASKS(args.myTarget) TASK_VEHICLE_MISSION_COORS_TARGET(args.myTarget, args.myVehicle, GET_ENTITY_COORDS(PLAYER_PED_ID()), MISSION_FLEE, 40, DRIVINGMODE_AVOIDCARS_RECKLESS, 9999, -1) ADD_VEHICLE_SUBTASK_ATTACK_PED(args.myTarget, PLAYER_PED_ID()) // //note that bTailedTooClose and bTargetCarStuck get RESET IN THE AGGRO CHECK FUNCTION // IF NOT bTailedTooClose AND NOT bMinorAttacked // AND NOT bTargetCarStuck // ADD_VEHICLE_SUBTASK_ATTACK_PED(args.myTarget, PLAYER_PED_ID()) // bGivenSubtask = TRUE // ENDIF bTaskedTarget = TRUE ENDIF ELSE // IF bTriggeredAggro // AND NOT bGivenSubtask // IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_VEHICLE_MISSION) = PERFORMING_TASK // ADD_VEHICLE_SUBTASK_ATTACK_PED(args.myTarget, PLAYER_PED_ID()) // bGivenSubtask = TRUE // ENDIF // ENDIF ENDIF IF NOT IS_PED_INJURED(args.myOtherPed) IF ( GET_ENTITY_SPEED(args.myOtherPed) < 5 AND IS_PED_IN_VEHICLE(args.myOtherPed, args.myVehicle) ) OR NOT IS_PED_IN_VEHICLE(args.myOtherPed, args.myVehicle) IF IS_PED_IN_VEHICLE(args.myOtherPed, args.myVehicle) IF NOT bPlayPanicAnimation VICE_PED_LEAVE_VEHICLE_AND_FLEE_PLAYER_GIRL(args.myOtherPed) PRINTLN("TASKING GIRLS TO LEAVE AND FLEE - 01") ENDIF ELSE TASK_SMART_FLEE_PED(args.myOtherPed, PLAYER_PED_ID(), 500, -1) ENDIF ENDIF ENDIF ENDIF ENDIF SET_PED_KEEP_TASK(args.myTarget, TRUE) ELSE IF NOT bHookerTaskedToEnterCar SET_MISSION_FAILED(asnArgs, targetData, FAIL_BLOWN_COVER) PRINTLN("FAILING MISSION! PANIC TRIGGERED EARLY AND bHookerTaskedToEnterCar = FALSE - 02") ENDIF ENDIF //target should hate the player and cops ADD_RELATIONSHIP_GROUP("TargetGroup", relTarget) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relTarget, RELGROUPHASH_PLAYER) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, relTarget) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relTarget, RELGROUPHASH_COP) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_COP, relTarget) IF DOES_ENTITY_EXIST(args.myTarget) SET_PED_FLEE_ATTRIBUTES(args.myTarget, FA_UPDATE_TO_NEAREST_HATED_PED, TRUE) SET_PED_RELATIONSHIP_GROUP_HASH(args.myTarget, relTarget) IF NOT targetData.bFailed args.mytargetblip = CREATE_BLIP_ON_ENTITY(args.myTarget, FALSE) ENDIF ENDIF PRINTLN("targetStage = MISSION_VICE_TARGET_ESCAPE") targetStage = MISSION_VICE_TARGET_ESCAPE ENDIF ELSE IF NOT bPedConfigFlagsRestored IF NOT IS_PED_INJURED(args.myTarget) SET_PED_CONFIG_FLAG(args.myTarget, PCF_PreventPedFromReactingToBeingJacked, FALSE) ENDIF IF NOT IS_PED_INJURED(args.myOtherPed) SET_PED_CONFIG_FLAG(args.myOtherPed, PCF_PreventPedFromReactingToBeingJacked, FALSE) ENDIF bPedConfigFlagsRestored = TRUE ENDIF ENDIF // *****MAIN LOOP FOR TARGET STAGE ************************************* SWITCH targetStage //Blip the hooker and have her play idle animations on sidewalk waiting for the target to show up CASE MISSION_VICE_SETUP // PRINTLN("MISSION_VICE_SETUP") SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(1, "assassin_hooker_wait_for_target") PRINTLN("SETTING REPLAY STAGE 1") SET_PED_NON_CREATION_AREA(<< -708.9319, -1841.2540, -100 >>, << -430.8133, -1647.6523, 100 >>) SET_PED_NON_CREATION_AREA(<< -708.9319, -1841.2540, -100 >>, << -430.8133, -1647.6523, 100 >>) ADD_PED_FOR_DIALOGUE(args.assConv, 1, PLAYER_PED_ID(), "FRANKLIN") // CREATE_FALSE_JOHN_IN_VEHICLE(args) IF NOT IS_PED_INJURED(args.myOtherPed) //remove the destination blip and blip the hooker IF DOES_BLIP_EXIST(args.mytargetblip) REMOVE_BLIP(args.mytargetblip) ENDIF args.mytargetblip = CREATE_BLIP_ON_ENTITY(args.myOtherPed) PRINTLN("GOING TO STATE - MISSION_SEND_FIRST_CAR") targetStage = MISSION_SEND_FIRST_CAR ELSE PRINTLN("args.myOtherPed IS INJURED") ENDIF BREAK CASE MISSION_SEND_FIRST_CAR // PRINTLN("MISSION_SEND_FIRST_CAR") // Once the false John is off screen, get rid of his ass! // REMOVE_FALSE_JOHN(args) IF HANDLE_FIRST_CAR(args) AND OKAY_TO_SPAWN_NEXT_ROUND_OF_CARS() AND ARE_MODELS_LOADED_FOR_FINAL_CARS() IF IS_THIS_PRINT_BEING_DISPLAYED("ASS_HK_RT") CLEAR_PRINTS() ENDIF CREATE_ASSASSINATION_TARGET(targetData, args) CREATE_ASSASSINATION_TARGET_VEHICLE(targetData, args) CREATE_FALSE_JOHN_IN_VEHICLE(args) //determine the order that the cars should pull up to the hooker based on player's savedata POSITION_VICE_VEHICLES_FROM_SAVEDATA(args) SETTIMERA(0) PRINTLN("GOING TO STATE - MISSION_VICE_SEND_CARS") targetStage = MISSION_VICE_SEND_CARS ENDIF // Music cue IF NOT IS_TIMER_STARTED(tMusicCueTimer) START_TIMER_NOW(tMusicCueTimer) PRINTLN("STARTING TIMER - tMusicCueTimer") ENDIF HANDLE_SECOND_MUSIC_CUE() BREAK //tell the target to start driving towards the hooker after X amt of time CASE MISSION_VICE_SEND_CARS // PRINTLN("MISSION_VICE_SEND_CARS") IF ( IS_VEHICLE_DRIVEABLE(args.myAuxVehicle) AND IS_ENTITY_ON_SCREEN(args.myAuxVehicle) ) OR ( IS_VEHICLE_DRIVEABLE(args.myVehicle) AND IS_ENTITY_ON_SCREEN(args.myVehicle) ) OR TIMERA() >= 10000 IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << -595.623, -1809.406, -23.282 >>, << -598.470, -1815.800, 23.282 >>, 15.0, FALSE, FALSE) // Area near the girl SEND_CARS_TO_HOOKER(args) PRINTLN("SENDING CARS - targetStage = MISSION_VICE_CHECK_CARS") targetStage = MISSION_VICE_CHECK_CARS ELSE PRINT_HELP("ASS_HK_HELP1") // PRINTLN("PLAYER IS IN ANGLED AREA") ENDIF ENDIF IF NOT bKillTargetCheckpointSet ADD_PED_FOR_DIALOGUE(args.assConv, 1, PLAYER_PED_ID(), "FRANKLIN") SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(2, "assassin_hooker_kill_target") bKillTargetCheckpointSet = TRUE ENDIF // Music cue IF NOT IS_TIMER_STARTED(tMusicCueTimer) START_TIMER_NOW(tMusicCueTimer) PRINTLN("STARTING TIMER - tMusicCueTimer") ENDIF HANDLE_SECOND_MUSIC_CUE() BREAK //Have the target stop the car and sound the horn once he arrives at the hooker CASE MISSION_VICE_CHECK_CARS // PRINTLN("MISSION_VICE_CHECK_CARS") //control behavior of false john - have him pull up and proposition the hooker and then drive away shortly after CONTROL_DUMMY_CAR_BEHAVIOR(args) HANDLE_SECOND_MUSIC_CUE() IF NOT bTaskedToLookAtTarget IF bPlayedCheapLine // At this point, the girl should be done with the first ped. // TASK_CLEAR_LOOK_AT(args.myOtherPed) TASK_LOOK_AT_ENTITY(args.myOtherPed, args.myTarget, -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH) TASK_LOOK_AT_ENTITY(args.myTarget, args.myOtherPed, -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH) PRINTLN("TASKING GIRL AND TARGET TO LOOK AT EACH OTHER") bTaskedToLookAtTarget = TRUE ENDIF ENDIF //check to see if target has pulled up to hooker IF IS_VEHICLE_DRIVEABLE(args.myVehicle) IF NOT IS_PED_INJURED(args.myTarget) IF WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(tlTargetWaypoint, GET_ENTITY_COORDS(args.myVehicle), iClosestWaypoint) IF iClosestWaypoint >= 14 CLEAR_PED_TASKS(args.myTarget) BRING_VEHICLE_TO_HALT(args.myVehicle, 10, 1) START_VEHICLE_HORN(args.myVehicle, 750) SETTIMERA(0) //make the dummy car wander and no longer follow a waypoint recording IF IS_VEHICLE_DRIVEABLE(args.myAuxVehicle) IF NOT IS_PED_INJURED(args.myAuxPed) CLEAR_PED_TASKS(args.myAuxPed) TASK_VEHICLE_DRIVE_WANDER(args.myAuxPed, args.myAuxVehicle, 15, DRIVINGMODE_AVOIDCARS_STOPFORPEDS_OBEYLIGHTS) ENDIF ENDIF //allow peds in vice scene to now react on their own to events since I no longer care about them SET_AMBIENT_VICE_PEDS_TO_REACT_TO_NON_TEMP_EVENTS(ambHook) bHookerTaskedToEnterCar = TRUE PRINTLN("GOING TO STATE - MISSION_VICE_ENTER_CAR") targetStage = MISSION_VICE_ENTER_CAR ELSE // PRINTLN("iClosestWaypoint >= 14 IS FAILING") ENDIF ENDIF ELSE PRINTLN("MISSION_VICE_CHECK_CARS: args.myVehicle IS NOT DRIVEABLE") ENDIF ELSE PRINTLN("MISSION_VICE_CHECK_CARS: args.myTarget IS INJURED") ENDIF BREAK //Have the hooker enter the targets car CASE MISSION_VICE_ENTER_CAR //add a little delay so the hooker doesnt immediately enter IF TIMERA() >= 1500 IF IS_VEHICLE_DRIVEABLE(args.myVehicle) IF NOT IS_PED_INJURED(args.myOtherPed) IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) > 5 // TASK_PLAY_ANIM(args.myTarget, "ODDJOBS@ASSASSINATE@VICE@IDLE", "idle_a", SLOW_BLEND_IN) IF CAN_ASSASSIN_SPEECH_PLAY(args.myTarget) IF NOT IS_SCRIPTED_CONVERSATION_ONGOING() CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_GETIN", CONV_PRIORITY_VERY_HIGH) ENDIF ENDIF TASK_ENTER_VEHICLE(args.myOtherPed, args.myVehicle, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT, PEDMOVEBLENDRATIO_WALK, ECF_USE_RIGHT_ENTRY) // vTargetVehiclePosition = GET_ENTITY_COORDS(args.myVehicle) // fTargetVehicleHeading = GET_ENTITY_HEADING(args.myVehicle) // // PRINTLN("vTargetVehiclePosition = ", vTargetVehiclePosition) // PRINTLN("fTargetVehicleHeading = ", fTargetVehicleHeading) bTestDummyCarForPanic = FALSE targetStage = MISSION_VICE_FOLLOW_CAR ENDIF ENDIF ENDIF ENDIF //trigger panic if the player gets too close to the target as he is stopped waiting for the hooker TRIGGER_PANIC_IF_BLOCKING_DEAL(args) BREAK //Target starts driving to destination and player is told to follow them CASE MISSION_VICE_FOLLOW_CAR HANDLE_COPS_MUSIC_TRIGGER() IF IS_VEHICLE_DRIVEABLE(args.myVehicle) IF NOT IS_PED_INJURED(args.myTarget) IF NOT IS_PED_INJURED(args.myOtherPed) IF GET_PED_IN_VEHICLE_SEAT(args.myVehicle, VS_FRONT_RIGHT) = args.myOtherPed AND NOT IS_PED_GETTING_INTO_A_VEHICLE(args.myOtherPed) bHookerInCar = TRUE // SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(2, "assassin_hooker_kill_target") TRIGGER_MUSIC_EVENT("ASS3_KILL") PRINTLN("TRIGGERING MUSIC - ASS3_KILL") PREPARE_MUSIC_EVENT("ASS3_RADIO_PASS") PRINTLN("PREPARING MUSIC - ASS3_RADIO_PASS") //print the kill target message if we can and blip the target red PRINT_MESSAGE_TO_KILL_TARGET_WHEN_SAFE(args) #IF NOT IS_JAPANESE_BUILD //NOTE - if we ever have issues with this in the future, try adding a flag for DF_GoOffRoadWhenAvoiding TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(args.myTarget, args.myVehicle, "OJAShk_104", DRIVINGMODE_STOPFORCARS, 0, EWAYPOINT_VEHICLES_USE_AI_SLOWDOWN, -1, 15) #ENDIF #IF IS_JAPANESE_BUILD OPEN_SEQUENCE_TASK(tempSeq) TASK_VEHICLE_MISSION_COORS_TARGET(NULL, args.myVehicle, << -701.80682, -1615.33716, 21.89242 >>, MISSION_GOTO, 15, DRIVINGMODE_STOPFORCARS, 100, -1, FALSE) TASK_VEHICLE_DRIVE_WANDER(NULL, args.myVehicle, 20.0, DRIVINGMODE_STOPFORCARS) CLOSE_SEQUENCE_TASK(tempSeq) TASK_PERFORM_SEQUENCE(args.myTarget, tempSeq) CLEAR_SEQUENCE_TASK(tempSeq) #ENDIF SETTIMERA(0) //initialize this iSpeechStage = 0 targetStage = MISSION_VICE_PARK_CAR ELSE // PRINTLN("GIRL NOT IN VEHICLE") ENDIF ELSE PRINTLN("GIRL IS INJURED") ENDIF ELSE PRINTLN("TARGET IS INJURED") ENDIF ELSE PRINTLN("TARGET VEHICLE NOT DRIVEABLE") ENDIF BREAK //park the car after it finishes driving to its destination under the freeway and play dialogue between target and hooker CASE MISSION_VICE_PARK_CAR HANDLE_COPS_MUSIC_TRIGGER() //handles the conversation while driving IF NOT bPrintedMsg PRINT_MESSAGE_TO_KILL_TARGET_WHEN_SAFE(args) //this function above sets bPrintedMsg to TRUE after it prints the objective and blips the target red ELSE IF NOT IS_MESSAGE_BEING_DISPLAYED() IF NOT bPickupLinePlayed IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_SET", CONV_PRIORITY_HIGH) bPickupLinePlayed = TRUE ENDIF ELSE IF NOT bCasualConversationFinished IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF CAN_ASSASSIN_SPEECH_PLAY(args.myTarget) AND CAN_ASSASSIN_SPEECH_PLAY(args.myOtherPed) IF HAS_CASUAL_CONVERSATION_FINISHED(iSpeechStage) bCasualConversationFinished = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF //checks for player tailing too close CHECK_FOR_DRIVING_TOO_CLOSE(args) #IF NOT IS_JAPANESE_BUILD IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) = FINISHED_TASK iSpeechStage = 0 //initialize this for the upcoming sex dialogue in the next stage bFinishedWaypointRecording = TRUE IF NOT IS_ENTITY_DEAD(args.myOtherPed) AND NOT IS_ENTITY_DEAD(args.myTarget) IF GET_SCRIPT_TASK_STATUS(args.myOtherPed, SCRIPT_TASK_LOOK_AT_ENTITY) <> PERFORMING_TASK TASK_LOOK_AT_ENTITY(args.myOtherPed, args.myTarget, -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH) PRINTLN("TASKING GUY AND GIRL TO LOOK AT EACH OTHER - 01a") ENDIF ENDIF IF NOT IS_ENTITY_DEAD(args.myOtherPed) AND NOT IS_ENTITY_DEAD(args.myTarget) IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_LOOK_AT_ENTITY) <> PERFORMING_TASK TASK_LOOK_AT_ENTITY(args.myTarget, args.myOtherPed, -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH) PRINTLN("TASKING GUY AND GIRL TO LOOK AT EACH OTHER - 02b") ENDIF ENDIF IF NOT IS_PED_INJURED(args.myTarget) IF NOT IS_PED_INJURED(args.myOtherPed) IF IS_VEHICLE_DRIVEABLE(args.myVehicle) CLEAR_PED_TASKS(args.myTarget) BRING_VEHICLE_TO_HALT(args.myVehicle, 10, 1) TASK_PLAY_ANIM(args.myTarget, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_base_m", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING) TASK_PLAY_ANIM(args.myOtherPed, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_base_f", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING) ENDIF ENDIF ENDIF RELEASE_ALL_AMBIENT_PED_MODELS_FOR_VICE_LOT(ambHook) targetStage = MISSION_VICE_TASK_PLAYER PRINTLN("targetStage = MISSION_VICE_TASK_PLAYER") SETTIMERA(0) ENDIF #ENDIF BREAK //Print objective to kill the target once the conversation has paused and no text is on screen CASE MISSION_VICE_TASK_PLAYER #IF NOT IS_JAPANESE_BUILD IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) > 50 //advance if the player is far away so we aren't displaying conversation subtitles OR TIMERA() > 10000 OR CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_INCAR", CONV_PRIORITY_HIGH) SETTIMERA(0) iSpeechStage = 0 targetStage = MISSION_VICE_CAR_FUN PRINTLN("targetStage = MISSION_VICE_CAR_FUN") ENDIF #ENDIF BREAK //play anims for car sex and bounce the car CASE MISSION_VICE_CAR_FUN #IF NOT IS_JAPANESE_BUILD //manage peds having sex in car IF NOT bSexInCarFinished SEX_IN_CAR(args.myOtherPed, args.myTarget, args) ELSE IF NOT IS_SCRIPTED_CONVERSATION_ONGOING() IF NOT IS_PED_INJURED(args.myTarget) IF IS_VEHICLE_DRIVEABLE(args.myVehicle) //temp fix to make hooker fall out of car until we get proper anims of target punching the hooker (BUG 336272) IF NOT IS_PED_INJURED(args.myOtherPed) TASK_PLAY_ANIM(args.myTarget, "ODDJOBS@assassinate@vice@incar", "passenger_KO_female_m") TASK_PLAY_ANIM(args.myOtherPed, "ODDJOBS@assassinate@vice@incar", "passenger_KO_female_f") ENDIF ENDIF // bCheckForSexPhoto = FALSE SET_VEHICLE_DOORS_LOCKED(args.myVehicle, VEHICLELOCK_UNLOCKED) SETTIMERA(0) targetStage = MISSION_VICE_TARGET_LEAVE ENDIF ENDIF ENDIF #ENDIF BREAK CASE MISSION_VICE_TARGET_LEAVE DETACH_GIRL_FROM_CAR(args) IF TIMERA() >= 1000 IF NOT IS_PED_INJURED(args.myTarget) IF IS_VEHICLE_DRIVEABLE(args.myVehicle) CLEAR_SEQUENCE_TASK(tempSeq) OPEN_SEQUENCE_TASK(tempSeq) TASK_LEAVE_VEHICLE(NULL, args.myVehicle) TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -458.7189, -1719.6924, 17.6259 >>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 150.2688) TASK_PLAY_ANIM(NULL, "ODDJOBS@ASSASSINATE@VICE@DEALER","base", SLOW_BLEND_IN, SLOW_BLEND_OUT, 20000, AF_LOOPING) TASK_WANDER_STANDARD(NULL, 150.2688) CLOSE_SEQUENCE_TASK(tempSeq) IF NOT IS_ENTITY_DEAD(args.myTarget) TASK_PERFORM_SEQUENCE(args.myTarget, tempSeq) PRINTLN("TASKING TARGET TO SEQUENCE") ENDIF CLEAR_SEQUENCE_TASK(tempSeq) // TASK_VEHICLE_DRIVE_WANDER(args.myTarget, args.myVehicle, 20, DRIVINGMODE_AVOIDCARS_STOPFORPEDS_OBEYLIGHTS) targetStage = MISSION_VICE_TARGET_POST_KNOCKOUT ENDIF ENDIF ENDIF IF bDetachGirlFromCar IF CHECK_FOR_TARGET_SPOTTING_PLAYER_WHILE_PARKED(args) bTargetSpottedPlayerInScrapyard = TRUE ENDIF ENDIF BREAK CASE MISSION_VICE_TARGET_POST_KNOCKOUT IF CHECK_FOR_TARGET_SPOTTING_PLAYER(args) bTargetSpottedPlayerInScrapyard = TRUE ENDIF BREAK //Panic stage - Player has aggroed the peds - task them to flee if they have not been tasked to yet CASE MISSION_VICE_TARGET_ESCAPE HANDLE_COPS_MUSIC_TRIGGER() IF NOT IS_PED_INJURED(args.myTarget) PLAY_APPROPRIATE_PANIC_LINE(args) IF IS_VEHICLE_DRIVEABLE(args.myVehicle) //TODO - not sure if we should be calling this every time - what if the vehicle is moving? // DETACH_GIRL_FROM_CAR(args) //have the target exit his vehicle and attack the player if stuck or in water IF IS_VEHICLE_STUCK_TIMER_UP(args.myVehicle, VEH_STUCK_ON_ROOF, 3000) OR IS_VEHICLE_STUCK_TIMER_UP(args.myVehicle, VEH_STUCK_HUNG_UP, 3000) OR IS_VEHICLE_STUCK_TIMER_UP(args.myVehicle, VEH_STUCK_JAMMED, 3000) OR IS_ENTITY_IN_WATER(args.myVehicle) IF IS_PED_IN_VEHICLE(args.myTarget, args.myVehicle) //teleport the target to the closest node if stuck but not upside down or in the water IF ( NOT IS_ENTITY_ON_SCREEN(args.myVehicle) AND IS_ENTITY_OCCLUDED(args.myVehicle) ) AND NOT IS_VEHICLE_STUCK_ON_ROOF(args.myVehicle) AND NOT IS_ENTITY_IN_WATER(args.myVehicle) PRINTLN("ASSASSINATION VICE - TELEPORTING STUCK VEHICLE TO CLOSEST VEHICLE NODE") GET_CLOSEST_VEHICLE_NODE(GET_ENTITY_COORDS(args.myVehicle), vClosestVehNode) SET_PED_COORDS_KEEP_VEHICLE(args.myTarget, vClosestVehNode) RESET_VEHICLE_STUCK_TIMER(args.myVehicle, VEH_STUCK_ON_ROOF) RESET_VEHICLE_STUCK_TIMER(args.myVehicle, VEH_STUCK_HUNG_UP) RESET_VEHICLE_STUCK_TIMER(args.myVehicle, VEH_STUCK_JAMMED) ELSE SET_VEHICLE_DOORS_LOCKED(args.myVehicle, VEHICLELOCK_UNLOCKED) //allow player to jack if he wants VICE_PED_LEAVE_VEHICLE_AND_FLEE_PLAYER_GUY(args.myTarget) targetStage = MISSION_VICE_TARGET_COMBAT PRINTLN("ASSASSINATION VICE - STUCK VEHICLE ON SCREEN - targetStage = MISSION_VICE_TARGET_COMBAT") ENDIF IF NOT IS_PED_INJURED(args.myOtherPed) IF GET_SCRIPT_TASK_STATUS(args.myOtherPed, SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK //check to see if she is already fleeing VICE_PED_LEAVE_VEHICLE_AND_FLEE_PLAYER_GIRL(args.myOtherPed) PRINTLN("TASKING GIRLS TO LEAVE AND FLEE - 02") ENDIF ENDIF ENDIF ENDIF ELSE //tell target to leave the car and attack the player if his car becomes undriveable IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK AND GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_PERFORM_SEQUENCE) <> WAITING_TO_START_TASK SET_VEHICLE_DOORS_LOCKED(args.myVehicle, VEHICLELOCK_UNLOCKED) VICE_PED_LEAVE_VEHICLE_AND_FLEE_PLAYER_GUY(args.myTarget) targetStage = MISSION_VICE_TARGET_COMBAT PRINTLN("ASSASSINATION VICE - VEHICLE NOT DRIVEABLE- TARGET EXITING AND ATTACKING PLAYER") ENDIF ENDIF ENDIF BREAK CASE MISSION_VICE_TARGET_COMBAT //target should attack the player when on foot but try to escape if the cops show up IF NOT IS_PED_INJURED(args.myTarget) PLAY_APPROPRIATE_PANIC_LINE(args) IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) vTargetPos = GET_ENTITY_COORDS(args.myTarget) IF IS_COP_PED_IN_AREA_3D(<< vTargetPos.x - 30, vTargetPos.y - 30, vTargetPos.z - 30 >>, << vTargetPos.x + 30, vTargetPos.y +30, vTargetPos.z + 30 >> ) IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_SMART_FLEE_PED) <> PERFORMING_TASK TASK_SMART_FLEE_PED(args.myTarget, PLAYER_PED_ID(), 500, -1) ENDIF ELSE //retask target to attack the player if there are no cops around and the player is near the target IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) <= 10 AND IS_PED_IN_COMBAT(PLAYER_PED_ID(), args.myTarget) IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_SMART_FLEE_PED) != PERFORMING_TASK TASK_SMART_FLEE_PED(args.myTarget, PLAYER_PED_ID(), 500, -1) ENDIF ENDIF ENDIF ELSE IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_SMART_FLEE_PED) != PERFORMING_TASK TASK_SMART_FLEE_PED(args.myTarget, PLAYER_PED_ID(), 500, -1) ENDIF ENDIF ENDIF BREAK ENDSWITCH //fail the script if the target escaped - TODO we should probably up this distance once we detect panic has been triggered IF HAS_TARGET_ESCAPED(args.myTarget, 300) AND bHookerTaskedToEnterCar IF DOES_BLIP_EXIST(args.myTargetBlip) REMOVE_BLIP(args.myTargetBlip) ENDIF IF targetStage != MISSION_VICE_CAR_FUN AND targetStage != MISSION_VICE_TARGET_LEAVE SET_MISSION_FAILED(asnArgs, targetData, FAIL_PED_ESCAPED) ELSE //to fix bug 1043148 - MB 2/9/13 SET_MISSION_FAILED(asnArgs, targetData, FAIL_ABANDONED_MISSION) ENDIF PRINTLN("HOOKER: FAILING - TARGET ESCAPED") ELSE IF DOES_BLIP_EXIST(args.myTargetBlip) // handles flashing of blip if the player fails to follow to the sex destination (only check after she enters the car and IF targetStage > MISSION_VICE_FOLLOW_CAR AND targetStage <= MISSION_VICE_TARGET_ESCAPE IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) > 75 IF NOT IS_BLIP_FLASHING(args.myTargetBlip) SET_BLIP_FLASHES(args.myTargetBlip, TRUE) ENDIF ELSE IF IS_BLIP_FLASHING(args.myTargetBlip) SET_BLIP_FLASHES(args.myTargetBlip, FALSE) ENDIF ENDIF ELSE IF IS_BLIP_FLASHING(args.myTargetBlip) SET_BLIP_FLASHES(args.myTargetBlip, FALSE) ENDIF ENDIF ENDIF ENDIF //play dialogue if player approaches the hooker IF targetStage < MISSION_VICE_ENTER_CAR MANAGE_HOOKER_DIALOGUE(args) ENDIF //handle hint cams CONTROL_HINT_CAMS_IN_VICE_MISSION(args) // //check for bonus // IF bCheckForSexPhoto // AWARD_BONUS_FOR_SUCCESSFUL_PHOTO(args) // ENDIF ENDPROC PROC PLAY_HOOKER_CUTSCENE_NO_CAMERAS(ASS_ARGS& args) SEQUENCE_INDEX tempSeq IF bIntroDone EXIT ENDIF IF DO_AGGRO_CHECK(piHookerCutscenePed, assArgs.myOtherVehicle, aggroArgs, aggroReason, TRUE, SHOULD_CHECK_FOR_PROJECTILES(piHookerCutscenePed)) SET_AMBIENT_VICE_PEDS_TO_FLEE(assArgs, ambVice) SET_MISSION_FAILED(asnArgs, targetData, FAIL_BLOWN_COVER) PRINTLN("FAILING COVER BLOWN - ATTACKED INTRO PED") ENDIF SWITCH introCutsceneState //close up shot of hooker CASE INTRO_CUTSCENE_CREATE GET_ASSASSIN_CUTSCENE_START_TIME() IF bReplaying START_HOOKER_CUTSCENE_ANIMS(args) ENDIF //remove windows in cutscene vehicle so that they don't obscure any cutscene shots IF IS_VEHICLE_DRIVEABLE(assArgs.myOtherVehicle) REMOVE_VEHICLE_WINDOW(assArgs.myOtherVehicle, SC_WINDOW_FRONT_RIGHT) REMOVE_VEHICLE_WINDOW(assArgs.myOtherVehicle, SC_WINDOW_FRONT_LEFT) ENDIF SETTIMERA(0) PRINTLN("GOING TO STATE - INTRO_CUTSCENE_TRANSITIONA") introCutsceneState = INTRO_CUTSCENE_TRANSITIONA BREAK //camera follows her close up again as she propositions a deal CASE INTRO_CUTSCENE_TRANSITIONA IF TIMERA() > 1700 IF NOT IS_PED_INJURED(assArgs.myOtherPed) IF NOT bPlayedRegularLine IF CREATE_CONVERSATION(assArgs.assConv, "OJASAUD", "OJAShk_REG", CONV_PRIORITY_VERY_HIGH) OR TIMERA() > 5000 //safeguard to advance the mission if the conversation never plays bPlayedRegularLine = TRUE PRINTLN("bPlayedRegularLine = TRUE - 02") SETTIMERA(0) introCutsceneState = INTRO_CUTSCENE_END ENDIF ENDIF ENDIF ELIF TIMERA() > 1300 IF NOT IS_PED_INJURED(piHookerCutscenePed) IF GET_SCRIPT_TASK_STATUS(piHookerCutscenePed, SCRIPT_TASK_LOOK_AT_ENTITY) <> PERFORMING_TASK TASK_LOOK_AT_ENTITY(piHookerCutscenePed, assArgs.myOtherPed, 5000, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH) ADD_PED_FOR_DIALOGUE(args.assConv, 5, piHookerCutscenePed, "KerbCrawler") IF NOT bPlayedRegularLine IF CREATE_CONVERSATION(assArgs.assConv, "OJASAUD", "OJAShk_REG", CONV_PRIORITY_VERY_HIGH) bPlayedRegularLine = TRUE PRINTLN("bPlayedRegularLine = TRUE - 01") SETTIMERA(0) introCutsceneState = INTRO_CUTSCENE_END ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE INTRO_CUTSCENE_END IF TIMERA() >= 2500 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF NOT IS_PED_INJURED(piHookerCutscenePed) IF IS_VEHICLE_DRIVEABLE(assArgs.myOtherVehicle) OPEN_SEQUENCE_TASK(tempSeq) TASK_VEHICLE_MISSION_COORS_TARGET(NULL, args.myOtherVehicle, vRandomVehicleDriveToPos, MISSION_GOTO, 15, DRIVINGMODE_AVOIDCARS_OBEYLIGHTS, 1.0, -1) TASK_VEHICLE_DRIVE_WANDER(NULL, args.myOtherVehicle, 15, DRIVINGMODE_AVOIDCARS_OBEYLIGHTS) CLOSE_SEQUENCE_TASK(tempSeq) TASK_PERFORM_SEQUENCE(piHookerCutscenePed, tempSeq) CLEAR_SEQUENCE_TASK(tempSeq) SET_PED_KEEP_TASK(piHookerCutscenePed, TRUE) // SET_PED_AS_NO_LONGER_NEEDED(piHookerCutscenePed) // SET_VEHICLE_AS_NO_LONGER_NEEDED(args.myOtherVehicle) REMOVE_PED_FOR_DIALOGUE(args.assConv, 5) PRINTLN("bIntroDone = TRUE") bIntroDone = TRUE ENDIF ENDIF ENDIF ENDIF BREAK ENDSWITCH ENDPROC PROC RUN_INTRO_OBJECTIVE_AND_DIALOGUE(ASS_ARGS& args) VECTOR vPlayerPosition, vHookerPosition IF bRunIntro OR bHookerInCar // Not sure where to put this? Need to stop ped look at task. IF IS_TIMER_STARTED(tLookAtTimer) IF GET_TIMER_IN_SECONDS(tLookAtTimer) > 2.0 IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_LOOK_AT_ENTITY) = PERFORMING_TASK TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) PRINTLN("CLEARING LOOK AT TASK") ENDIF ENDIF ENDIF ENDIF EXIT ENDIF IF NOT IS_PED_INJURED(PLAYER_PED_ID()) AND NOT IS_PED_INJURED(assArgs.myOtherPed) vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID()) vHookerPosition = GET_ENTITY_COORDS(assArgs.myOtherPed) ENDIF IF VDIST2(vPlayerPosition, vHookerPosition) < 2500 //50m // IF bPlayedRegularLine IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), assArgs.myOtherPed, 3000) PRINTLN("TASKING PLAYER TO LOOK AT GIRL") IF NOT IS_TIMER_STARTED(tLookAtTimer) START_TIMER_NOW(tLookAtTimer) PRINTLN("STARTING TIMER - tLookAtTimer") ELSE RESTART_TIMER_NOW(tLookAtTimer) PRINTLN("RESTARTING TIMER - tLookAtTimer") ENDIF ENDIF CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAShk_FIND", CONV_PRIORITY_HIGH) REGISTER_PRINT_DELAY(printTimer, "ASS_HK_IDT") PRINTLN("bRunIntro = TRUE") bRunIntro = TRUE ENDIF // ELSE // PRINTLN("WAITING ON REGULAR LINE TO PLAY") // ENDIF ENDIF ENDPROC PROC PLACE_TARGET_AND_GIRL_INTO_VEHICLE() IF DOES_ENTITY_EXIST(assArgs.myVehicle) IF DOES_ENTITY_EXIST(assArgs.myTarget) AND NOT IS_ENTITY_DEAD(assArgs.myTarget) AND DOES_ENTITY_EXIST(assArgs.myOtherPed) AND NOT IS_ENTITY_DEAD(assArgs.myOtherPed) SET_PED_INTO_VEHICLE(assArgs.myTarget, assArgs.myVehicle, VS_DRIVER) CLEAR_PED_TASKS_IMMEDIATELY(assArgs.myOtherPed) SET_PED_INTO_VEHICLE(assArgs.myOtherPed, assArgs.myVehicle, VS_FRONT_RIGHT) PRINTLN("PLACING TARGET AND GIRL INTO CAR") ELSE IF NOT DOES_ENTITY_EXIST(assArgs.myTarget) PRINTLN("TARGET DOES NOT EXIST") ENDIF IF NOT DOES_ENTITY_EXIST(assArgs.myOtherPed) PRINTLN("GIRL DOES NOT EXIST") ENDIF ENDIF ELSE PRINTLN("TARGET VEHICLE DOES NOT EXIST") ENDIF ENDPROC PROC REMOVE_INTRO_GUY_AND_CAR() IF DOES_ENTITY_EXIST(piHookerCutscenePed) DELETE_PED(piHookerCutscenePed) PRINTLN("DELETING PED - piHookerCutscenePed") ENDIF IF DOES_ENTITY_EXIST(assArgs.myOtherVehicle) DELETE_VEHICLE(assArgs.myOtherVehicle) PRINTLN("DELETING VEHICLE - assArgs.myOtherVehicle") ENDIF ENDPROC PROC SETUP_FRANKLIN_FOR_DIALOGUE_AND_SET_TAXI_DESTINATION() //set up player's conversation data ADD_PED_FOR_DIALOGUE(assArgs.assConv, 1, PLAYER_PED_ID(), "FRANKLIN") //set taxi drop-off location data if the player hails a taxi to the assassination scene assArgs.vTargetBlipTaxiPos = <<-544.4251, -1829.6187, 21.9962>> assArgs.fTargetBlipTaxiHead = 95.3853 ENDPROC PROC GO_TO_CHECKPOINT_1() PRINTLN("Get_Replay_Mid_Mission_Stage() = 0") #IF IS_DEBUG_BUILD IF bDoingPSkip OR bDoingJSkip SET_ENTITY_COORDS(PLAYER_PED_ID(), <<213.5436, -854.7532, 29.3921>>) SET_ENTITY_HEADING(PLAYER_PED_ID(), 64.8106) // bDebugSkipping = TRUE DELETE_AMBIENT_PEDS_FOR_HOOKER(ambVice) REMOVE_ALL_ENTITIES_IN_ASS_STRUCT(assArgs) IF DOES_ENTITY_EXIST(assArgs.myVehicle) DELETE_VEHICLE(assArgs.myVehicle) PRINTLN("KILLING args.myVehicle") ENDIF IF DOES_ENTITY_EXIST(piHookerCutscenePed) DELETE_PED(piHookerCutscenePed) PRINTLN("DELETING PED - piHookerCutscenePed") ENDIF // CREATE_AMBIENT_PEDS_FOR_HOOKER(assArgs, ambVice) // CREATE_ASSASSINATION_TARGET(targetData, assArgs) // CREATE_ASSASSINATION_TARGET_VEHICLE(targetData, assArgs) targetStage = MISSION_VICE_SETUP bFirstObjectivePrinted = FALSE bIntroDone = FALSE bHookerInCar = FALSE bHookerTaskedToEnterCar = FALSE bPrintedMsg = FALSE bPlayPanicAnimation = FALSE bPanicLinePlayed = FALSE bLeaveAreaPrinted = FALSE bChaseHintCamKilled = FALSE #IF NOT IS_JAPANESE_BUILD bPlayedCreeperLine = FALSE #ENDIF bCreatedViceScene = FALSE bKillTargetCheckpointSet = FALSE introCutsceneState = INTRO_CUTSCENE_CREATE // IF bFirstCheckpointSceneLoad // bFirstCheckpointSceneLoad = FALSE // ENDIF ENDIF #ENDIF BLIP_HOOKER_DESTINATION(targetData, assArgs) SETUP_FRANKLIN_FOR_DIALOGUE_AND_SET_TAXI_DESTINATION() // CREATE_ASSASSINATION_SCENE_HOOKER(targetData, assArgs) //fade in the game from the mission retry screen #IF IS_DEBUG_BUILD bDoingPSkip = FALSE #ENDIF SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() END_REPLAY_SETUP() FADE_IN() curStage = MISSION_STATE_PRINTS ENDPROC PROC GO_TO_CHECKPOINT_2() #IF IS_DEBUG_BUILD IF bDoingPSkip OR bDoingJSkip // bDebugSkipping = TRUE SET_ENTITY_COORDS(PLAYER_PED_ID(), vPlayerCheckpointPosNearHooker) SET_ENTITY_HEADING(PLAYER_PED_ID(), fPlayerCheckpointHeadNearHooker) DELETE_AMBIENT_PEDS_FOR_HOOKER(ambVice) REMOVE_ALL_ENTITIES_IN_ASS_STRUCT(assArgs) IF DOES_ENTITY_EXIST(assArgs.myVehicle) DELETE_VEHICLE(assArgs.myVehicle) PRINTLN("KILLING args.myVehicle") ENDIF WHILE NOT ARE_MODELS_LOADED_FOR_VICE_LOT() WAIT(0) ENDWHILE WHILE NOT ARE_MODELS_LOADED_FOR_FINAL_CARS() WAIT(0) ENDWHILE CREATE_AMBIENT_PEDS_FOR_HOOKER(assArgs, ambVice) REMOVE_INTRO_GUY_AND_CAR() CLEANUP_FIRST_CAR() targetStage = MISSION_VICE_SETUP bFirstObjectivePrinted = FALSE bIntroDone = FALSE bDoingPSkip = FALSE bHookerInCar = FALSE bHookerTaskedToEnterCar = FALSE bTailedTooClose = FALSE bTargetCarStuck = FALSE bTargetSpottedPlayerInScrapyard = FALSE bTaskedToLookAtTarget = FALSE bPrintedMsg = FALSE // bMinorAttacked = FALSE // bTooCloseConvo01 = FALSE bPlayPanicAnimation = FALSE bPanicLinePlayed = FALSE bLeaveAreaPrinted = FALSE bChaseHintCamKilled = FALSE bPlayedFirstConvo = FALSE #IF NOT IS_JAPANESE_BUILD bPlayedCreeperLine = FALSE #ENDIF bCreatedViceScene = FALSE bKillTargetCheckpointSet = FALSE bTaskedHookerCheap = FALSE introCutsceneState = INTRO_CUTSCENE_CREATE iFirstCarStages = 0 // IF bSecondCheckpointSceneLoad // bSecondCheckpointSceneLoad = FALSE // ENDIF ENDIF #ENDIF PRINTLN("Get_Replay_Mid_Mission_Stage() = 1") WHILE NOT ARE_MODELS_LOADED_FOR_VICE_LOT() WAIT(0) ENDWHILE WHILE NOT ARE_MODELS_LOADED_FOR_FINAL_CARS() WAIT(0) ENDWHILE CLEAR_AREA_OF_PEDS(<< -607.2620, -1800.8997, 22.3211 >>, 10) SETUP_FRANKLIN_FOR_DIALOGUE_AND_SET_TAXI_DESTINATION() CREATE_ASSASSINATION_SCENE_HOOKER(targetData, assArgs, FALSE) START_HOOKER_CUTSCENE_ANIMS(assArgs) CREATE_AMBIENT_PEDS_FOR_HOOKER(assArgs, ambVice) TRIGGER_MUSIC_EVENT("ASS3_RESTART1") PRINTLN("TRIGGERING MUSIC - ASS3_RESTART1") SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() END_REPLAY_SETUP() //fade in the game from the mission retry screen FADE_IN() targetStage = MISSION_VICE_SETUP curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL ENDPROC PROC GO_TO_CHECKPOINT_3() #IF IS_DEBUG_BUILD IF bDoingPSkip OR bDoingJSkip // bDebugSkipping = TRUE SET_ENTITY_COORDS(PLAYER_PED_ID(), vPlayerCheckpointPosNearHooker) SET_ENTITY_HEADING(PLAYER_PED_ID(), fPlayerCheckpointHeadNearHooker) SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() DELETE_AMBIENT_PEDS_FOR_HOOKER(ambVice) REMOVE_ALL_ENTITIES_IN_ASS_STRUCT(assArgs) CLEANUP_FIRST_CAR(TRUE) IF DOES_ENTITY_EXIST(assArgs.myVehicle) DELETE_VEHICLE(assArgs.myVehicle) PRINTLN("KILLING args.myVehicle") ENDIF WHILE NOT ARE_MODELS_LOADED_FOR_VICE_LOT() WAIT(0) ENDWHILE WHILE NOT ARE_MODELS_LOADED_FOR_FINAL_CARS() WAIT(0) ENDWHILE CREATE_AMBIENT_PEDS_FOR_HOOKER(assArgs, ambVice) // REMOVE_FALSE_JOHN() bFirstObjectivePrinted = TRUE bIntroDone = TRUE bTailedTooClose = FALSE bTargetCarStuck = FALSE bTargetSpottedPlayerInScrapyard = FALSE bTaskedToLookAtTarget = FALSE // bTooCloseConvo01 = FALSE bPlayPanicAnimation = FALSE bPrintedMsg = FALSE bPanicLinePlayed = FALSE bLeaveAreaPrinted = FALSE bChaseHintCamKilled = FALSE bPlayedFirstConvo = TRUE bGrabbedPosition = FALSE #IF NOT IS_JAPANESE_BUILD bPlayedCreeperLine = FALSE #ENDIF bCreatedViceScene = FALSE bKillTargetCheckpointSet = FALSE bTaskedHookerCheap = FALSE introCutsceneState = INTRO_CUTSCENE_CREATE iFirstCarStages = 4 vPlayerKillPosition = <<0,0,0>> // IF bThirdCheckpointSceneLoad // bThirdCheckpointSceneLoad = FALSE // ENDIF PRINTLN("DEBUG: INSIDE - GO_TO_CHECKPOINT_3") bDoingPSkip = FALSE ENDIF #ENDIF PRINTLN("INSIDE - GO_TO_CHECKPOINT_3") bIntroDone = TRUE bRunIntro = TRUE bHookerTaskedToEnterCar = FALSE bPlayerWentWanted = FALSE fTooCloseTime = -1 WHILE NOT ARE_MODELS_LOADED_FOR_VICE_LOT() WAIT(0) ENDWHILE WHILE NOT ARE_MODELS_LOADED_FOR_FINAL_CARS() WAIT(0) ENDWHILE IF targetData.otherPedEnum != DUMMY_MODEL_FOR_SCRIPT assArgs.myOtherPed = CREATE_PED(PEDTYPE_CIVFEMALE, targetData.otherPedEnum, targetData.vOtherPedPos, targetData.fOtherPedHead) SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(assArgs.myOtherPed, TRUE) ADD_PED_FOR_DIALOGUE(assArgs.assConv, 4, assArgs.myOtherPed, "OJAhkHOOKER") SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(assArgs.myOtherPed, TRUE) SET_PED_COMBAT_ATTRIBUTES(assArgs.myOtherPed, CA_ALWAYS_FLEE, TRUE) SET_PED_FLEE_ATTRIBUTES(assArgs.myOtherPed, FA_DISABLE_HANDS_UP, TRUE) SET_PED_CONFIG_FLAG(assArgs.myOtherPed, PCF_PreventPedFromReactingToBeingJacked, TRUE) SET_HOOKER_PED_COMPONENTS(assArgs.myOtherPed) START_HOOKER_CUTSCENE_ANIMS(assArgs, FALSE) REMOVE_BLIP(assArgs.myTargetBlip) IF NOT DOES_BLIP_EXIST(assArgs.myTargetBlip) assArgs.myTargetBlip = CREATE_BLIP_ON_ENTITY(assArgs.myOtherPed) SET_BLIP_COLOUR(assArgs.myTargetBlip, BLIP_COLOUR_BLUE) SET_BLIP_ROUTE(assArgs.myTargetBlip, TRUE) SET_BLIP_ROUTE_COLOUR(assArgs.myTargetBlip, BLIP_COLOUR_BLUE) ENDIF ENDIF bTargetKillLinePlayed = FALSE //cleanup vehicles and create important ones CLEANUP_FIRST_CAR() REMOVE_INTRO_GUY_AND_CAR() CREATE_ASSASSINATION_TARGET(targetData, assArgs) CREATE_ASSASSINATION_TARGET_VEHICLE(targetData, assArgs) CREATE_FALSE_JOHN_IN_VEHICLE(assArgs) POSITION_VICE_VEHICLES_FROM_SAVEDATA(assArgs) CREATE_AMBIENT_PEDS_FOR_HOOKER(assArgs, ambVice) SETTIMERA(10000) //to make sure the cars get sent immediately // PLACE_TARGET_AND_GIRL_INTO_VEHICLE() // IF DOES_ENTITY_EXIST(assArgs.myVehicle) AND IS_VEHICLE_DRIVEABLE(assArgs.myVehicle) // SET_ENTITY_COORDS(assArgs.myVehicle, vTargetVehiclePosition) // SET_ENTITY_HEADING(assArgs.myVehicle, fTargetVehicleHeading) // PRINTLN("MOVING TARGET CAR TO POSITION = ", vTargetVehiclePosition) // PRINTLN("MOVING TARGET CAR TO HEADING = ", fTargetVehicleHeading) // ENDIF CLEAR_AREA_OF_PEDS(<< -607.2620, -1800.8997, 22.3211 >>, 10) CLEAR_AREA(vJunkyardPos, fJunkyardRadius, TRUE) //makes sure there are no cars in the junkyard area TRIGGER_MUSIC_EVENT("ASS3_RESTART2") PRINTLN("TRIGGERING MUSIC - ASS3_RESTART2") SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() BOOL bSetPlayerInVehicle = FALSE IF DOES_ENTITY_EXIST(viReplayVehicle) AND NOT IS_ENTITY_DEAD(viReplayVehicle) AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) bSetPlayerInVehicle = TRUE ENDIF IF bSetPlayerInVehicle END_REPLAY_SETUP(viReplayVehicle) ELSE END_REPLAY_SETUP() ENDIF //fade in the game from the mission retry screen FADE_IN() targetStage = MISSION_VICE_SEND_CARS curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL ENDPROC //PROC GO_TO_CHECKPOINT_3() // // IF bReplayVehicleAvailable // REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL() // WHILE NOT HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED() // PRINTLN("HOOKER: Waiting for HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED - 03") // WAIT(0) // ENDWHILE // ENDIF // // // BOOL bSetPlayerIntoVehicle = FALSE // VEHICLE_INDEX vehPlayer // // IF bReplayVehicleAvailable // //create the replay vehicle but make sure it isnt a water based vehicle (so we dont spawn it on land) // vehPlayer = CREATE_REPLAY_CHECKPOINT_VEHICLE(vMoveVehiclePosition02, fMoveVehicleHeading02) // // IF NOT IS_THIS_MODEL_A_BOAT(GET_ENTITY_MODEL(vehPlayer)) // AND NOT IS_THIS_MODEL_A_PLANE(GET_ENTITY_MODEL(vehPlayer)) // AND NOT IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(vehPlayer)) // SET_VEHICLE_ON_GROUND_PROPERLY(vehPlayer) // // IF DOES_ENTITY_EXIST(vehPlayer) AND NOT IS_ENTITY_DEAD(vehPlayer) AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) // bSetPlayerIntoVehicle = TRUE // ELSE // PRINTLN("VEHICLE DOESN'T EXIST") // ENDIF // ELSE // DELETE_VEHICLE(vehPlayer) // ENDIF // ELSE // PRINTLN("REPLAY VEHICLE DOESN'T EXIST") // ENDIF // // IF bSetPlayerIntoVehicle // SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehPlayer) // ELSE // SET_ENTITY_COORDS(PLAYER_PED_ID(), targetData.vWarpPos) // SET_ENTITY_HEADING(PLAYER_PED_ID(), 77.9792) // PRINTLN("NO REPLAY VEHICLE AVAILABLE") // ENDIF // // // #IF IS_DEBUG_BUILD // IF bDoingPSkip OR bDoingJSkip // // bDebugSkipping = TRUE // // DELETE_AMBIENT_PEDS_FOR_HOOKER(ambVice) // REMOVE_ALL_ENTITIES_IN_ASS_STRUCT(assArgs) // IF DOES_ENTITY_EXIST(assArgs.myVehicle) // DELETE_VEHICLE(assArgs.myVehicle) // PRINTLN("KILLING args.myVehicle") // ENDIF // CREATE_AMBIENT_PEDS_FOR_HOOKER(assArgs, ambVice) // bFirstObjectivePrinted = TRUE // bIntroDone = TRUE // bTailedTooClose = FALSE // bTargetCarStuck = FALSE // bTargetSpottedPlayerInScrapyard = FALSE // bTaskedToLookAtTarget = FALSE // bTooCloseConvo01 = FALSE // bPlayPanicAnimation = FALSE // bPrintedMsg = FALSE // bPanicLinePlayed = FALSE // bLeaveAreaPrinted = FALSE // bChaseHintCamKilled = FALSE // introCutsceneState = INTRO_CUTSCENE_CREATE // // IF bThirdCheckpointSceneLoad // bThirdCheckpointSceneLoad = FALSE // ENDIF // // PRINTLN("DEBUG: INSIDE - GO_TO_CHECKPOINT_3") // bDoingPSkip = FALSE // ENDIF // #ENDIF // // PRINTLN("INSIDE - GO_TO_CHECKPOINT_3") // // bIntroDone = TRUE // bRunIntro = TRUE // bHookerTaskedToEnterCar = TRUE // // CREATE_ASSASSINATION_TARGET(targetData, assArgs) // CREATE_ASSASSINATION_TARGET_VEHICLE(targetData, assArgs) // // IF targetData.otherPedEnum != DUMMY_MODEL_FOR_SCRIPT // assArgs.myOtherPed = CREATE_PED_INSIDE_VEHICLE(assArgs.myVehicle, PEDTYPE_CIVFEMALE, targetData.otherPedEnum, VS_FRONT_RIGHT) // SET_HOOKER_PED_COMPONENTS(assArgs.myOtherPed) // ADD_PED_FOR_DIALOGUE(assArgs.assConv, 4, assArgs.myOtherPed, "OJAhkHOOKER") // SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(assArgs.myOtherPed, TRUE) // SET_PED_COMBAT_ATTRIBUTES(assArgs.myOtherPed, CA_ALWAYS_FLEE, TRUE) // SET_PED_FLEE_ATTRIBUTES(assArgs.myOtherPed, FA_DISABLE_HANDS_UP, TRUE) // SET_PED_CONFIG_FLAG(assArgs.myOtherPed, PCF_PreventPedFromReactingToBeingJacked, TRUE) // SET_PED_CAN_BE_TARGETTED(assArgs.myOtherPed, FALSE) // PRINTLN("CREATING GIRL") // ENDIF // // REMOVE_INTRO_GUY_AND_CAR() // PLACE_TARGET_AND_GIRL_INTO_VEHICLE() // // IF DOES_ENTITY_EXIST(assArgs.myVehicle) AND IS_VEHICLE_DRIVEABLE(assArgs.myVehicle) // SET_ENTITY_COORDS(assArgs.myVehicle, vTargetVehiclePosition) // SET_ENTITY_HEADING(assArgs.myVehicle, fTargetVehicleHeading) // PRINTLN("MOVING TARGET CAR TO POSITION = ", vTargetVehiclePosition) // PRINTLN("MOVING TARGET CAR TO HEADING = ", fTargetVehicleHeading) // ENDIF // // CLEAR_AREA_OF_PEDS(<< -607.2620, -1800.8997, 22.3211 >>, 10) // CLEAR_AREA(vJunkyardPos, fJunkyardRadius, TRUE) //makes sure there are no cars in the junkyard area // // TRIGGER_MUSIC_EVENT("ASS3_RESTART2") // PRINTLN("TRIGGERING MUSIC - ASS3_RESTART2") // // IF NOT bDebugSkipping // IF NOT bThirdCheckpointSceneLoad // IF IS_SCREEN_FADED_OUT() // OR IS_REPLAY_IN_PROGRESS() // NEW_LOAD_SCENE_START_SPHERE(targetData.vWarpPos, 10.0) // bThirdCheckpointSceneLoad = TRUE // PRINTLN("ASSASSINATION HOOKER CHECKPOINT 3: CALLING NEW_LOAD_SCENE_START_SPHERE") // ELSE // PRINTLN("ASSASSINATION HOOKER CHECKPOINT 3: SCREEN IS NOT FADED OUT") // ENDIF // ELSE // PRINTLN("ASSASSINATION HOOKER CHECKPOINT 3: bThirdCheckpointSceneLoad IS TRUE") // ENDIF // // WHILE NOT IS_NEW_LOAD_SCENE_LOADED() // WAIT(0) // PRINTLN("HOOKER - WAITING FOR SCENE TO LOAD - 3") // ENDWHILE // // PRINTLN("HOOKER - SCENE HAS LOADED - 3") // NEW_LOAD_SCENE_STOP() // ENDIF // // SET_GAMEPLAY_CAM_RELATIVE_HEADING() // SET_GAMEPLAY_CAM_RELATIVE_PITCH() // // //fade in the game from the mission retry screen // FADE_IN() // // targetStage = MISSION_VICE_FOLLOW_CAR // curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL //ENDPROC PROC GO_TO_CHECKPOINT_4() PRINTLN("INSIDE - GO_TO_CHECKPOINT_4") #IF IS_DEBUG_BUILD IF bDoingPSkip OR bDoingJSkip DELETE_AMBIENT_PEDS_FOR_HOOKER(ambVice) REMOVE_ALL_ENTITIES_IN_ASS_STRUCT(assArgs) IF DOES_ENTITY_EXIST(assArgs.myVehicle) DELETE_VEHICLE(assArgs.myVehicle) PRINTLN("KILLING args.myVehicle") ENDIF PRINTLN("DEBUG: INSIDE - GO_TO_CHECKPOINT_4") bDoingPSkip = FALSE ENDIF #ENDIF DELETE_AMBIENT_PEDS_FOR_HOOKER(ambVice) REMOVE_ALL_ENTITIES_IN_ASS_STRUCT(assArgs) REMOVE_INTRO_GUY_AND_CAR() SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) KILL_ANY_CONVERSATION() END_REPLAY_SETUP() //fade in the game from the mission retry screen FADE_IN() curStage = MISSION_STATE_SUCCESS ENDPROC FUNC BOOL HAS_ENDING_CELL_PHONE_CALL_COMPLETED(ASS_ARGS& args) IF NOT bPlayedCellPhoneCall ADD_PED_FOR_DIALOGUE(args.assConv, 3, NULL, "LESTER") ADD_PED_FOR_DIALOGUE(args.assConv, 1, PLAYER_PED_ID(), "Franklin") IF PLAYER_CALL_CHAR_CELLPHONE(args.assConv, CHAR_LESTER, "OJASAUD", "OJAS_VICE_C", CONV_MISSION_CALL) PRINTLN("VICE - CELL PHONE CALL") bPlayedCellPhoneCall = TRUE ENDIF ENDIF IF bPlayedCellPhoneCall AND HAS_CELLPHONE_CALL_FINISHED() PRINTLN("RETURNING TRUE - HAS_ENDING_CELL_PHONE_CALL_COMPLETED") RETURN TRUE ELSE PRINTLN("WAITING FOR CELL PHONE CALL TO FINISH") ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_PLAYER_NEAR_EITHER_VECTOR(VECTOR vPos, FLOAT fDist, VECTOR vPosSecond, FLOAT fDistSecond) IF GET_PLAYER_DISTANCE_FROM_LOCATION(vPos) <= fDist OR GET_PLAYER_DISTANCE_FROM_LOCATION(vPosSecond) <= fDistSecond RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL HAS_PLAYER_LEFT_AREA() VECTOR vCurrentPosition FLOAT fDistance IF NOT bGrabbedPosition IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) vPlayerKillPosition = GET_ENTITY_COORDS(PLAYER_PED_ID()) PRINTLN("PLAYER POSITION AFTER KILL: ", vPlayerKillPosition) bGrabbedPosition = TRUE ENDIF ENDIF IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) vCurrentPosition = GET_ENTITY_COORDS(PLAYER_PED_ID()) // PRINTLN("vCurrentPosition = ", vCurrentPosition) ENDIF fDistance = VDIST2(vPlayerKillPosition, vCurrentPosition) // PRINTLN("fDistance = ", fDistance) IF fDistance != 0 IF fDistance > 30625 // 175m RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL HAS_PLAYER_TOUCHED_RIGHT_STICK() fRightX = GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_X) fRightY = GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_Y) // PRINTLN("fRightX = ", fRightX) // PRINTLN("fRightY = ", fRightY) IF fRightX > 0 OR fRightY > 0 RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL ADJUST_CAMERA(CAMERA_INDEX & camToChange, FLOAT fTimeToSwitch, VECTOR vPosition, VECTOR vRotation, FLOAT fCamFOV, BOOL bUseShake = FALSE, FLOAT fShakeValue = 0.5) IF DOES_CAM_EXIST(camToChange) IF IS_TIMER_STARTED(tPayphoneCameraTimer) IF GET_TIMER_IN_SECONDS(tPayphoneCameraTimer) >= fTimeToSwitch SET_CAM_COORD(camPayPhoneIntro01, vPosition) SET_CAM_ROT(camPayPhoneIntro01, vRotation) SET_CAM_FOV(camPayPhoneIntro01, fCamFOV) IF bUseShake SHAKE_CAM(camPayPhoneIntro01, "HAND_SHAKE", fShakeValue) ENDIF RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC PROC REMOVE_WALKBY_GIRL(BOOL bHardRemove = FALSE) IF bHardRemove IF DOES_ENTITY_EXIST(pedWalkByGirl) DELETE_PED(pedWalkByGirl) PRINTLN("DELETING PED - pedWalkByGirl") ENDIF ELSE IF DOES_ENTITY_EXIST(pedWalkByGirl) IF NOT IS_ENTITY_ON_SCREEN(pedWalkByGirl) OR IS_ENTITY_OCCLUDED(pedWalkByGirl) DELETE_PED(pedWalkByGirl) PRINTLN("DELETING PED - pedWalkByGirl - SHOULD NOT BE VISIBLE") ELSE SET_MODEL_AS_NO_LONGER_NEEDED(mnToUse) SET_PED_AS_NO_LONGER_NEEDED(pedWalkByGirl) PRINTLN("SETTING PED AS NO LONGER NEEDED - pedWalkByGirl") ENDIF ENDIF ENDIF ENDPROC PROC HANDLE_WALKBY_GIRL() SEQUENCE_INDEX iSeq INT iRand SWITCH iWalkByGirlStages CASE 0 iRand = GET_RANDOM_INT_IN_RANGE() % 3 IF iRand = 0 mnToUse = A_F_M_BEACH_01 PRINTLN("mnToUse = A_F_M_BEACH_01") ELIF iRand = 1 mnToUse = A_F_Y_SouCent_03 PRINTLN("mnToUse = A_F_Y_SouCent_03") ELSE mnToUse = A_F_Y_SCDressy_01 PRINTLN("mnToUse = A_F_Y_SCDressy_01") ENDIF PRINTLN("iWalkByGirlStages = 1") iWalkByGirlStages = 1 BREAK CASE 1 REQUEST_MODEL(mnToUse) IF HAS_MODEL_LOADED(mnToUse) CLEAR_AREA_OF_PEDS(<<195.6209, -848.7115, 29.8400>>, 1.0) pedWalkByGirl = CREATE_PED(PEDTYPE_CIVFEMALE, mnToUse, <<195.6209, -848.7115, 29.8400>>, 252.7701) IF mnToUse = A_F_M_BEACH_01 SET_PED_COMPONENT_VARIATION(pedWalkByGirl, INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head) SET_PED_COMPONENT_VARIATION(pedWalkByGirl, INT_TO_ENUM(PED_COMPONENT,2), 3, 0, 0) //(hair) SET_PED_COMPONENT_VARIATION(pedWalkByGirl, INT_TO_ENUM(PED_COMPONENT,3), 1, 1, 0) //(uppr) SET_PED_COMPONENT_VARIATION(pedWalkByGirl, INT_TO_ENUM(PED_COMPONENT,4), 1, 2, 0) //(lowr) SET_PED_COMPONENT_VARIATION(pedWalkByGirl, INT_TO_ENUM(PED_COMPONENT,8), 1, 0, 0) //(accs) SET_PED_COMPONENT_VARIATION(pedWalkByGirl, INT_TO_ENUM(PED_COMPONENT,10), 0, 0, 0) //(decl) ENDIF SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedWalkByGirl, TRUE) SET_MODEL_AS_NO_LONGER_NEEDED(mnToUse) PRINTLN("SETTING MODEL AS NO LONGER NEEDED") ENDIF IF DOES_ENTITY_EXIST(pedWalkByGirl) AND NOT IS_ENTITY_DEAD(pedWalkByGirl) CLEAR_SEQUENCE_TASK(iSeq) OPEN_SEQUENCE_TASK(iSeq) TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<207.2075, -853.1223, 29.5467>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 245.8158) TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<212.1299, -854.8853, 29.4230>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 245.8158) TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<229.6208, -861.2581, 28.9823>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 245.8158) TASK_WANDER_STANDARD(NULL, 248.3764) CLOSE_SEQUENCE_TASK(iSeq) TASK_PERFORM_SEQUENCE(pedWalkByGirl, iSeq) CLEAR_SEQUENCE_TASK(iSeq) SET_PED_KEEP_TASK(pedWalkByGirl, TRUE) IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) TASK_LOOK_AT_ENTITY(pedWalkByGirl, PLAYER_PED_ID(), -1, SLF_DEFAULT, SLF_LOOKAT_VERY_HIGH) ENDIF PRINTLN("iWalkByGirlStages = 2") iWalkByGirlStages = 2 ENDIF BREAK CASE 2 IF NOT IS_ENTITY_DEAD(pedWalkByGirl) IF IS_ENTITY_AT_COORD(pedWalkByGirl, <<229.6208, -861.2581, 28.9823>>, <<1,1,1>>) PRINTLN("iWalkByGirlStages = 3") iWalkByGirlStages = 3 ENDIF ENDIF BREAK CASE 3 BREAK ENDSWITCH ENDPROC PROC HANDLE_INTRO_CAMERAS() IF iIntroCameraStages >= 1 HANDLE_WALKBY_GIRL() ENDIF SWITCH iIntroCameraStages CASE 0 IF ADJUST_CAMERA(camPayPhoneIntro01, 6.0, <<212.3080, -852.1151, 30.8906>>, <<-2.0463, 0.0491, -123.0298>>, 25.5584, TRUE, 0.2) PRINTLN("iIntroCameraStages = 1") iIntroCameraStages = 1 ENDIF BREAK CASE 1 IF ADJUST_CAMERA(camPayPhoneIntro01, 12.0, <<217.3616, -852.5518, 30.5727>>, <<0.3070, -0.0981, 113.7617>>, 37.2383, TRUE, 0.3) PRINTLN("iIntroCameraStages = 2") iIntroCameraStages = 2 ENDIF BREAK CASE 2 IF ADJUST_CAMERA(camPayPhoneIntro01, 19.0, <<212.0356, -856.7463, 30.7787>>, <<-4.4880, 0.0000, -21.4972>>, 33.2457, TRUE, 0.3) PRINTLN("iIntroCameraStages = 3") iIntroCameraStages = 3 ENDIF BREAK CASE 3 // Tighten the Fov on this one IF ADJUST_CAMERA(camPayPhoneIntro01, 23.0, <<209.2922, -849.7044, 30.8068>>, <<-0.0685, -0.0000, -134.7147>>, 33.8575, TRUE, 0.2) PRINTLN("iIntroCameraStages = 4") iIntroCameraStages = 4 ENDIF BREAK CASE 4 IF ADJUST_CAMERA(camPayPhoneIntro01, 28.0, <<212.3080, -852.1151, 30.8906>>, <<-2.0463, 0.0491, -123.0298>>, 26.1877, TRUE, 0.2) PRINTLN("iIntroCameraStages = 5") iIntroCameraStages = 5 ENDIF BREAK CASE 5 IF ADJUST_CAMERA(camPayPhoneIntro01, 34.0, <<216.3470, -855.0798, 30.8728>>, <<-1.8635, 0.0174, 55.7844>>, 33.2457, TRUE, 0.2) PRINTLN("iIntroCameraStages = 6") iIntroCameraStages = 6 ENDIF BREAK CASE 6 BREAK ENDSWITCH ENDPROC PROC REMOVE_SKINNED_PHONE_PROP() VECTOR vPlayerPos IF NOT DOES_ENTITY_EXIST(oPayPhoneAnimated) EXIT ENDIF IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) ENDIF IF VDIST2(vPlayerPos, vPhoneLocation) > 10000 // 100m IF DOES_ENTITY_EXIST(oPayPhoneAnimated) SET_MODEL_AS_NO_LONGER_NEEDED(P_PHONEBOX_01B_S) DELETE_OBJECT(oPayPhoneAnimated) PRINTLN("DELETING OBJECT - oPayPhoneAnimated") ENDIF IF DOES_ENTITY_EXIST(oPayPhone) SET_ENTITY_VISIBLE(oPayPhone, TRUE) SET_ENTITY_COLLISION(oPayPhone, TRUE) PRINTLN("TURNING BACK ON VISIBILITY AND COLLISION") ENDIF ENDIF ENDPROC PROC DO_STAGE_INTRO_CUTSCENE(ASS_ARGS& args) // PRINTLN("TIME: ", TIMERB()) // IF STREAMVOL_HAS_LOADED(svPhoneCutscene) // PRINTLN("WE'RE LOADED") // ENDIF SWITCH payPhoneCutsceneStages CASE PAYPHONE_CUTSCENE_INIT REQUEST_ANIM_DICT("oddjobs@assassinate@vice@call") PRINTLN("REQUESTING ANIM DICTIONARY - oddjobs@asssasinate@vice@call") REQUEST_MODEL(P_PHONEBOX_01B_S) PRINTLN("REQUESTING MODEL - P_PHONEBOX_01B_S") IF HAS_ANIM_DICT_LOADED("oddjobs@assassinate@vice@call") AND HAS_MODEL_LOADED(P_PHONEBOX_01B_S) bContinueWithScene = TRUE ENDIF IF bContinueWithScene IF DOES_ENTITY_EXIST(oPayPhone) RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<216.874176,-854.317871,28.321516>>, <<210.036118,-851.764282,34.494335>>, 5.000000, <<220.3139, -851.9946, 29.1151>>, 250.2144) PRINTLN("REPOSITIONING VEHICLE") CLEAR_AREA(<<214.449524,-852.867249,29.3496>>, 3.5, TRUE) IF NOT IS_TIMER_STARTED(tPayphoneCameraTimer) START_TIMER_NOW(tPayphoneCameraTimer) PRINTLN("STARTING TIMER - tPayphoneCameraTimer") ENDIF IF DOES_ENTITY_EXIST(oPayPhone) SET_ENTITY_VISIBLE(oPayPhone, FALSE) SET_ENTITY_COLLISION(oPayPhone, FALSE) SET_ENTITY_CAN_BE_DAMAGED(oPayPhone, FALSE) PRINTLN("TURNING OFF VISIBILITY AND COLLISION") // oPayPhoneAnimated = CREATE_OBJECT(P_PHONEBOX_01B_S, <<214.449524,-852.867249,29.387089>>) // Having to lower prop for some reason?! ... to fix Bug # 1352784 oPayPhoneAnimated = CREATE_OBJECT(P_PHONEBOX_01B_S, <<214.449524,-852.867249,29.3496>>) SET_ENTITY_ROTATION(oPayPhoneAnimated, <<0.000000,0.000000,-21.253237>>) SET_ENTITY_COLLISION(oPayPhoneAnimated, FALSE) SET_ENTITY_CAN_BE_DAMAGED(oPayPhoneAnimated, FALSE) PRINTLN("CREATING SKINNED VERSION OF PROP") SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE) PRINTLN("TURNING BACK ON PLAYER VISIBILITY") ENDIF svPhoneCutscene = STREAMVOL_CREATE_SPHERE(<<214.449524,-852.867249,29.3496>>, 350, FLAG_MAPDATA) PRINTLN("CREATING STREAM VOLUME - svPhoneCutscene") // Start the cutscene. SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE) CLEAR_AREA_OF_PEDS(<<214.449524,-852.867249,29.3396>>, 5.0) IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), vPlayerWarpPosition) SET_ENTITY_HEADING(PLAYER_PED_ID(), fPlayerWarpHeading) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE) PRINTLN("MOVING FRANKLIN TO PHONE") ENDIF // scenePosition = << 214.473, -852.907, 29.367 >> // sceneRotation = << 0.000, 0.000, -31.000 >> // iSceneId = CREATE_SYNCHRONIZED_SCENE(scenePosition, sceneRotation) iSceneId = CREATE_SYNCHRONIZED_SCENE(scenePosition, sceneRotation) IF DOES_ENTITY_EXIST(oPayPhoneAnimated) ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSceneId, oPayPhoneAnimated, -1) PRINTLN("oPayPhoneAnimated EXISTS, ATTACHING SCENE TO IT") ELSE PRINTLN("NOTHING EXISTS") ENDIF TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSceneId, "oddjobs@assassinate@vice@call", "ass_call_vice_p1", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT, SYNCED_SCENE_TAG_SYNC_OUT) PRINTLN("TASKING FRANKLIN TO TALK ON THE PHONE") PLAY_SYNCHRONIZED_ENTITY_ANIM(oPayPhoneAnimated, iSceneId, "ass_call_vice_phone", "oddjobs@assassinate@vice@call", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT) PRINTLN("PLAYING ANIMATION ON PAYPHONE PROP") IF NOT DOES_CAM_EXIST(camPayPhoneIntro01) camPayPhoneIntro01 = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vCameraPosition01, vCameraRotation01, 31.3943, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) PRINTLN("CREATING CAMERA - camPayPhoneIntro01") SHAKE_CAM(camPayPhoneIntro01, "HAND_SHAKE", 0.2) ENDIF // PLAY_SYNCHRONIZED_CAM_ANIM(camPayPhoneIntro01, iSceneId, "ass_call_vice_cam", "oddjobs@assassinate@vice@call") // PRINTLN("PLAYING ANIMATION ON CAMERA") ADD_PED_FOR_DIALOGUE(args.assConv, 3, NULL, "LESTER") ADD_PED_FOR_DIALOGUE(args.assConv, 1, PLAYER_PED_ID(), "FRANKLIN") DISPLAY_RADAR(FALSE) DISPLAY_HUD(FALSE) iNavMeshBlocking = ADD_NAVMESH_BLOCKING_OBJECT(<<214.449524,-852.867249,29.3496>>, <<1.3,1.3,2>>, 152.0039) PRINTLN("CREATING NAVMESH BLOCKING OBJECT - iNavMeshBlocking") SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_REMOVE_EXPLOSIONS | SPC_REMOVE_FIRES | SPC_REMOVE_PROJECTILES) // | SPC_LEAVE_CAMERA_CONTROL_ON) PRINTLN("REMOVING PLAYER CONTROL") DISABLE_CHEAT(CHEAT_TYPE_ALL, TRUE) payPhoneCutsceneStages = PAYPHONE_CUTSCENE_UPDATE PRINTLN("VICE: GOING TO STATE - PAYPHONE_CUTSCENE_UPDATE") ELSE REQUEST_ANIM_DICT("oddjobs@assassinate@vice@call") PRINTLN("REQUESTING ANIM DICTIONARY - oddjobs@asssasinate@vice@call") REQUEST_MODEL(P_PHONEBOX_01B_S) PRINTLN("REQUESTING MODEL - P_PHONEBOX_01B_S") IF NOT DOES_ENTITY_EXIST(oPayPhone) oPayPhone = GET_CLOSEST_OBJECT_OF_TYPE(vPhoneLocation, 5.0, prop_phonebox_01b) PRINTLN("VICE: PAYPHONE WAS NOT FOUND IN TRIGGER SCENE, FIND IN SCRIPT") ENDIF ENDIF ENDIF BREAK //---------------------------------------------------------------------------------------------------------------------- CASE PAYPHONE_CUTSCENE_UPDATE HANDLE_INTRO_CAMERAS() IF IS_TIMER_STARTED(tPayphoneCutsceneTimer) IF GET_TIMER_IN_SECONDS(tPayphoneCutsceneTimer) > 1.0 IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED() bSkipCutscene = TRUE IF NOT IS_SCREEN_FADED_OUT() FADE_DOWN() ENDIF payPhoneCutsceneStages = PAYPHONE_CUTSCENE_SKIP PRINTLN("VICE: GOING TO STATE - PAYPHONE_CUTSCENE_SKIP") BREAK ENDIF ENDIF ENDIF IF NOT bPlayedPayPhoneConvo IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) IF IS_SYNCHRONIZED_SCENE_RUNNING(iSceneId) IF GET_SYNCHRONIZED_SCENE_PHASE(iSceneId) > 0.05 IF CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAScnt_hk", CONV_PRIORITY_VERY_HIGH) IF NOT IS_TIMER_STARTED(tPayphoneCutsceneTimer) START_TIMER_NOW(tPayphoneCutsceneTimer) PRINTLN("STARTING TIMER - tPayphoneCutsceneTimer") bPlayedPayPhoneConvo = TRUE IF IS_REPEAT_PLAY_ACTIVE() FADE_IN() ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF IS_TIMER_STARTED(tPayphoneCutsceneTimer) IF GET_TIMER_IN_SECONDS(tPayphoneCutsceneTimer) > fCutsceneLength OR (IS_SYNCHRONIZED_SCENE_RUNNING(iSceneId) AND GET_SYNCHRONIZED_SCENE_PHASE(iSceneId) >= 0.958) OR bSkipCutscene payPhoneCutsceneStages = PAYPHONE_CUTSCENE_CLEANUP PRINTLN("VICE: GOING TO STATE - PAYPHONE_CUTSCENE_CLEANUP") ENDIF ENDIF BREAK //---------------------------------------------------------------------------------------------------------------------- CASE PAYPHONE_CUTSCENE_SKIP STOP_SCRIPTED_CONVERSATION(FALSE) IF bSkipCutscene IF IS_SCREEN_FADED_OUT() IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), <<213.8028, -853.5229, 29.3963>>) SET_ENTITY_HEADING(PLAYER_PED_ID(), 63.2918) PRINTLN("MOVING FRANKLIN - SKIP CUTSCENE") ENDIF REMOVE_WALKBY_GIRL(TRUE) STOP_SYNCHRONIZED_ENTITY_ANIM (oPayPhoneAnimated, INSTANT_BLEND_OUT, TRUE) WAIT(0) DO_SCREEN_FADE_IN(500) DESTROY_ALL_CAMS() RENDER_SCRIPT_CAMS(FALSE, FALSE) SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() payPhoneCutsceneStages = PAYPHONE_CUTSCENE_CLEANUP PRINTLN("VICE: GOING TO STATE - PAYPHONE_CUTSCENE_CLEANUP") ENDIF ENDIF BREAK //---------------------------------------------------------------------------------------------------------------------- CASE PAYPHONE_CUTSCENE_CLEANUP IF NOT bSkipCutscene STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP() DESTROY_ALL_CAMS() ENDIF IF STREAMVOL_IS_VALID(svPhoneCutscene) STREAMVOL_DELETE(svPhoneCutscene) PRINTLN("DELETING STREAM VOLUME - svPhoneCutscene VIA PAYPHONE_CUTSCENE_CLEANUP") ENDIF REMOVE_WALKBY_GIRL() SET_ENTITY_COLLISION(oPayPhoneAnimated, TRUE) DISPLAY_RADAR(TRUE) DISPLAY_HUD(TRUE) CLEAR_PED_TASKS(PLAYER_PED_ID()) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE, TRUE) DISABLE_CHEAT(CHEAT_TYPE_ALL, FALSE) SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE) //to fix Bug 1173621 - (3/12/13) - MB SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) REMOVE_ANIM_DICT("oddjobs@assassinate@vice@call") SET_OBJECT_AS_NO_LONGER_NEEDED(oPayPhone) IF DOES_NAVMESH_BLOCKING_OBJECT_EXIST(iNavMeshBlocking) REMOVE_NAVMESH_BLOCKING_OBJECT(iNavMeshBlocking) PRINTLN("REMOVING NAVMESH BLOCKING OBJECT - iNavMeshBlocking") ENDIF curStage = MISSION_STATE_INIT PRINTLN("VICE: GOING TO STATE - MISSION_STATE_INIT") BREAK ENDSWITCH ENDPROC //MAIN UPDATE LOOP FOR THE ASSASSINATION FUNC BOOL UPDATE_ASSASSINATION_VICE(ASS_ARGS& args, AMBIENT_PEDS_IN_SCENE& ambHook) IF NOT IS_ENTITY_DEAD(args.myOtherPed) IF IS_ENTITY_PLAYING_ANIM(args.myOtherPed, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_intro_f") OR IS_ENTITY_PLAYING_ANIM(args.myOtherPed, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_loop_f") OR IS_ENTITY_PLAYING_ANIM(args.myOtherPed, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_outro_f") OR IS_ENTITY_PLAYING_ANIM(args.myOtherPed, "ODDJOBS@ASSASSINATE@VICE@SEX", "FrontSeat_CarSex_Normal_Outro_f") OR IS_ENTITY_PLAYING_ANIM(args.myOtherPed, "ODDJOBS@assassinate@vice@incar", "passenger_KO_female_f") REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() ENDIF ENDIF IF NOT IS_ENTITY_DEAD(args.myTarget) IF IS_ENTITY_PLAYING_ANIM(args.myTarget, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_intro_m") OR IS_ENTITY_PLAYING_ANIM(args.myTarget, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_loop_m") OR IS_ENTITY_PLAYING_ANIM(args.myTarget, "ODDJOBS@ASSASSINATE@VICE@SEX", "frontseat_carsex_outro_m") OR IS_ENTITY_PLAYING_ANIM(args.myOtherPed, "ODDJOBS@ASSASSINATE@VICE@SEX", "FrontSeat_CarSex_Normal_Outro_m") OR IS_ENTITY_PLAYING_ANIM(args.myTarget, "ODDJOBS@assassinate@vice@incar", "passenger_KO_female_m") REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() ENDIF ENDIF SWITCH curStage // CASE MISSION_STATE_TIME_LAPSE // timeLapseCutscene() // BREAK CASE MISSION_BRIEF_INIT IF Is_Replay_In_Progress() IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE() PRINTLN("REPLAY VEHICLE IS AVAILABLE - HOOKER") bReplayVehicleAvailable = TRUE ELSE PRINTLN("REPLAY VEHICLE IS NOT AVAILABLE - HOOKER") ENDIF bReplaying = TRUE curStage = MISSION_STATE_INIT BREAK ENDIF DO_STAGE_INTRO_CUTSCENE(args) BREAK //initialize necessities for mission and create peds/vehicles/props for assassination scene CASE MISSION_STATE_INIT INIT_VICE_DATA() IF bReplayVehicleAvailable INIT_MISSION_REQUESTS_AND_UI_LABELS(targetData, sLoadQueue, TRUE) ELSE INIT_MISSION_REQUESTS_AND_UI_LABELS(targetData, sLoadQueue) ENDIF // CREATE_AMBIENT_PEDS_FOR_HOOKER(assArgs, ambVice) IF bReplaying IF g_savedGlobals.sAssassinData.fViceMissionTime <> 0 RESTART_TIMER_AT(tMissionTime, g_savedGlobals.sAssassinData.fViceMissionTime) PRINTLN("RESTARTING TIMER - missionTimer AT: ", g_savedGlobals.sAssassinData.fViceMissionTime) ENDIF IF iStageToUse = 0 GO_TO_CHECKPOINT_1() ELIF iStageToUse = 1 GO_TO_CHECKPOINT_2() ELIF iStageToUse = 2 GO_TO_CHECKPOINT_3() ELIF iStageToUse = 3 GO_TO_CHECKPOINT_4() ENDIF FADE_IN() ELSE IF NOT IS_TIMER_STARTED(tMissionTime) START_TIMER_NOW(tMissionTime) PRINTLN("STARTING TIMER - tMissionTime") g_savedGlobals.sAssassinData.fViceMissionTime = 0 PRINTLN("VICE GLOBAL MISSION TIMER = ", g_savedGlobals.sAssassinData.fViceMissionTime) ENDIF BLIP_HOOKER_DESTINATION(targetData, assArgs) SETUP_FRANKLIN_FOR_DIALOGUE_AND_SET_TAXI_DESTINATION() SET_TAXI_DROPOFF_LOCATION_FOR_BLIP(args.mytargetblip, assArgs.vTargetBlipTaxiPos, assArgs.fTargetBlipTaxiHead) // CREATE_ASSASSINATION_SCENE_HOOKER(targetData, assArgs) // GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, 50, FALSE, FALSE) PRINTLN("curStage = MISSION_STATE_PRINTS - 02") curStage = MISSION_STATE_PRINTS ENDIF BREAK //print the objectives and help messages immediately after launching the mission CASE MISSION_STATE_PRINTS //tell the player to lose their wanted level if needed and handle blipping of destination IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) PRINT_NOW(targetData.OBJECTIVES[0], DEFAULT_GOD_TEXT_TIME, 1) bFirstObjectivePrinted = TRUE ELSE REMOVE_BLIP(args.myTargetBlip) PRINTLN("REMOVING BLIP - args.myTargetBlip") PRINT_NOW("ASS_HK_COPS", DEFAULT_GOD_TEXT_TIME, 1) ENDIF SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "assassin_hooker_locate_hooker") OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(viReplayVehicle) // IF NOT IS_TIMER_STARTED(tTextTimer) // START_TIMER_NOW(tTextTimer) // PRINTLN("STARTING TIMER - tTextTimer") // ELSE // RESTART_TIMER_NOW(tTextTimer) // PRINTLN("RESTARTING TIMER - tTextTimer") // ENDIF SETUP_FRANKLIN_FOR_DIALOGUE_AND_SET_TAXI_DESTINATION() ADD_PED_FOR_DIALOGUE(args.assConv, 1, PLAYER_PED_ID(), "FRANKLIN") PRINTLN("curStage = MISSION_STATE_TRAVEL") curStage = MISSION_STATE_TRAVEL BREAK //player is en route to the target. Trigger intro cutscene when in range if not wanted CASE MISSION_STATE_TRAVEL REMOVE_SKINNED_PHONE_PROP() GRAB_RETRY_VEHICLE() IF NOT bCreatedViceScene IF GET_PLAYER_DISTANCE_FROM_LOCATION(targetData.vOtherPedPos) < 250 IF ARE_MODELS_LOADED_FOR_VICE_LOT() CREATE_AMBIENT_PEDS_FOR_HOOKER(assArgs, ambVice) CREATE_ASSASSINATION_SCENE_HOOKER(targetData, assArgs) bCreatedViceScene = TRUE ENDIF ENDIF ENDIF // IF NOT bSentText // IF IS_TIMER_STARTED(tTextTimer) // IF GET_TIMER_IN_SECONDS(tTextTimer) > 5.0 // SEND_TEXT_MESSAGE_TO_CHARACTER_BUFFER(CHAR_FRANKLIN, CHAR_LESTER, "ASSC_VICE_TEXT", TXTMSG_UNLOCKED, TXTMSG_CRITICAL) // bSentText = TRUE // ENDIF // ENDIF // ENDIF // b* 2439095 - added IF HAS_PANIC_TRIGGERED_IN_VICE_MISSION(args, ambHook, FALSE) SET_AMBIENT_VICE_PEDS_TO_FLEE(assArgs, ambVice) SET_MISSION_FAILED(asnArgs, targetData, FAIL_BLOWN_COVER) PRINTLN("FAILING COVER BLOWN 03") ENDIF IF DOES_BLIP_EXIST(args.myTargetBlip) //set bit to check for wanted as a parameter for triggering panic CHECK_FOR_WANTED_IN_AGGRO_CHECKS() // IF IS_ENTITY_OCCLUDED(assArgs.myOtherPed) // PRINTLN("ENTITY IS OCCLUDED") // ELSE // PRINTLN("ENTITY IS NOT OCCLUDED") // ENDIF // IF IS_ENTITY_ON_SCREEN(assArgs.myOtherPed) // PRINTLN("ENTITY IS ONSCREEN") // ELSE // PRINTLN("ENTITY IS NOT ONSCREEN") // ENDIF // IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-545.783264,-1804.771973,20.571665>>, <<-566.846558,-1792.358643,28.833838>>, 17.250000) // PRINTLN("PLAYER IS IN ANGLED AREA") // ENDIF //monitor to see if player has become wanted or blown their cover prior to triggering the intro cutscene and handle accordingly IF NOT HAS_PANIC_TRIGGERED_IN_VICE_MISSION(args, ambHook, TRUE) AND NOT DO_AGGRO_CHECK(piHookerCutscenePed, args.myOtherVehicle, aggroArgs, aggroReason, TRUE, SHOULD_CHECK_FOR_PROJECTILES(piHookerCutscenePed)) //ped in car in intro cutscene AND NOT DO_AGGRO_CHECK(assArgs.myOtherPed, args.myOtherVehicle, aggroArgs, aggroReason, TRUE, SHOULD_CHECK_FOR_PROJECTILES(assArgs.myOtherPed)) IF IS_PLAYER_NEAR_EITHER_VECTOR(vIntroCutscenePos[0], 35, vIntroCutscenePos[1], 35) OR ( DOES_ENTITY_EXIST(assArgs.myOtherPed) AND GET_PLAYER_DISTANCE_FROM_ENTITY(assArgs.myOtherPed, FALSE) <= 35 ) IF bCreatedViceScene AND (NOT IS_ENTITY_DEAD(assArgs.myOtherPed) AND IS_ENTITY_ON_SCREEN(assArgs.myOtherPed) AND NOT IS_ENTITY_OCCLUDED(assArgs.myOtherPed)) AND (NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-545.783264,-1804.771973,20.571665>>, <<-566.846558,-1792.358643,28.833838>>, 17.250000)) // Hack check to fix Bug # 646393 //remove the destination blip REMOVE_BLIP(args.myTargetBlip) IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) TRIGGER_MUSIC_EVENT("ASS3_RADIO_FADE_OUT") PRINTLN("TRIGGERING MUSIC - ASS3_RADIO_FADE_OUT") ELSE PRINTLN("PLAYER IS NOT IN A VEHICLE - NO MUSIC") ENDIF ENDIF // PRINT_NOW("ASS_HK_WAIT", DEFAULT_GOD_TEXT_TIME, 1) PRINTLN("curStage = MISSION_STATE_CUTSCENE_SETUP") curStage = MISSION_STATE_CUTSCENE_SETUP ENDIF ENDIF ENDIF IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) IF GET_PLAYER_DISTANCE_FROM_LOCATION(targetData.vOtherPedPos) > 100 //hooker position REMOVE_BLIP_AND_PRINT_OBJECTIVE_MSG_IF_WANTED(args.myTargetBlip, "ASS_HK_COPS") ELSE PRINTLN("FAILING SCRIPT - HAS_PANIC_TRIGGERED_IN_VICE_MISSION - MISSION_NAME_HOOKER") SET_MISSION_FAILED(asnArgs, targetData, FAIL_BLOWN_COVER) PRINTLN("FAILING COVER BLOWN 01") ENDIF ENDIF ELSE // PRINTLN("DOES_BLIP_EXIST(args.myTargetBlip) = FALSE!") //print destination objective message when not wanted and re-blip the hooker/destination IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) // IF DOES_ENTITY_EXIST(assArgs.myOtherPed) // args.myTargetBlip = ADD_BLIP_FOR_ENTITY(assArgs.myOtherPed) // SET_BLIP_COLOUR(args.myTargetBlip, BLIP_COLOUR_BLUE) // SET_BLIP_ROUTE(args.myTargetBlip, TRUE) // SET_BLIP_ROUTE_COLOUR(args.myTargetBlip, BLIP_COLOUR_BLUE) // ELSE // PRINTLN("GIRL DOESN'T EXIST YET") // ENDIF // IF DOES_ENTITY_EXIST(assArgs.myOtherPed) BLIP_HOOKER_DESTINATION(targetData, assArgs) // ENDIF IF NOT bFirstObjectivePrinted PRINT_NOW("ASS_HK_WAIT", DEFAULT_GOD_TEXT_TIME, 1) bFirstObjectivePrinted = TRUE ENDIF ELSE //flip the bit so that it doesn't check for wanted in aggro checks (HAS_PANIC_TRIGGERED_IN_VICE_MISSION will handle this below) DONT_CHECK_FOR_WANTED_IN_AGGRO_CHECKS() IF GET_PLAYER_DISTANCE_FROM_LOCATION(vIntroCutscenePos[0]) < 50 OR HAS_PANIC_TRIGGERED_IN_VICE_MISSION(args, ambHook, FALSE) // AND (NOT IS_ENTITY_DEAD(assArgs.myOtherPed) AND IS_ENTITY_ON_SCREEN(assArgs.myOtherPed) AND NOT IS_ENTITY_OCCLUDED(assArgs.myOtherPed)) SET_AMBIENT_VICE_PEDS_TO_FLEE(assArgs, ambVice) SET_MISSION_FAILED(asnArgs, targetData, FAIL_BLOWN_COVER) PRINTLN("FAILING COVER BLOWN 02") ENDIF ENDIF ENDIF BREAK //intro cutscene has been triggered - set it up properly CASE MISSION_STATE_CUTSCENE_SETUP //stop the player/player car gracefully START_HOOKER_CUTSCENE_ANIMS(args) PRINTLN("curStage = MISSION_STATE_CUTSCENE") curStage = MISSION_STATE_CUTSCENE BREAK //play the appropriate intro cutscene CASE MISSION_STATE_CUTSCENE // fpCutsceneCustomIntro = fpCutsceneCustomIntro PRINTLN("curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL") curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL BREAK //waiting for player to kill the target CASE MISSION_STATE_WAITING_FOR_TARGET_KILL PLAY_HOOKER_CUTSCENE_NO_CAMERAS(args) RUN_INTRO_OBJECTIVE_AND_DIALOGUE(args) IF ( bHookerTaskedToEnterCar AND CHECK_FOR_TARGET_DEATH(assArgs, targetData) ) //everyone flee! SET_AMBIENT_VICE_PEDS_TO_FLEE(assArgs, ambVice, TRUE) RELEASE_ALL_AMBIENT_PED_MODELS_FOR_VICE_LOT(ambHook) IF DOES_BLIP_EXIST(args.myTargetBlip) REMOVE_BLIP(args.myTargetBlip) ENDIF VICE_PED_LEAVE_VEHICLE_AND_FLEE_PLAYER_GIRL(args.myOtherPed) PRINTLN("TASKING GIRLS TO LEAVE AND FLEE - 03") IF NOT IS_ENTITY_DEAD(args.myVehicle) IF IS_ENTITY_DEAD(args.myTarget) AND IS_PED_IN_VEHICLE(args.myTarget, args.myVehicle) START_VEHICLE_HORN(args.myVehicle, 100000) PRINTLN("PLAYING HORN ON TARGET'S VEHICLE") ENDIF SET_VEHICLE_DOORS_LOCKED(args.myVehicle, VEHICLELOCK_UNLOCKED) PRINTLN("UNLOCKING TARGET VEHICLE'S DOOR") ENDIF KILL_CHASE_HINT_CAM(localChaseHintCamStruct) ADD_PED_FOR_DIALOGUE(args.assConv, 1, PLAYER_PED_ID(), "FRANKLIN") HANDLE_FRANKLIN_PLAYING_TARGET_KILL_LINE(bTargetKillLinePlayed, args.assConv, "OJASAUD", "OJAS_VICOM", CONV_PRIORITY_VERY_HIGH) PRINTLN("curStage = MISSION_STATE_KILLCAM") curStage = MISSION_STATE_KILLCAM ELSE //main target update loop UPDATE_LOOP_VICE(assArgs, ambVice) ENDIF BREAK //add objective to leave the scrapyard if the player is inside it (to fix bug 1181504 - 3/19/13 - MB) CASE MISSION_STATE_KILLCAM IF NOT HAS_PLAYER_LEFT_AREA() IF NOT bLeaveAreaPrinted DESTROY_SEX_CAM() IF NOT IS_TIMER_STARTED(tLeaveAreaCopTimer) START_TIMER_NOW(tLeaveAreaCopTimer) PRINTLN("STARTING TIMER - tLeaveAreaCopTimer") ELSE RESTART_TIMER_NOW(tLeaveAreaCopTimer) PRINTLN("RESTARTING TIMER - tLeaveAreaCopTimer") ENDIF PRINT_NOW("ASS_HK_LEAVE", DEFAULT_GOD_TEXT_TIME, 1) bLeaveAreaPrinted = TRUE ENDIF // If the player has not left the area within 30 seconds, trigger a wanted level. IF IS_TIMER_STARTED(tLeaveAreaCopTimer) IF GET_TIMER_IN_SECONDS(tLeaveAreaCopTimer) > 30.0 IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0 SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 2) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) PRINTLN("SETTING THE PLAYER'S WANTED LEVEL - 2") ENDIF ENDIF ENDIF IF NOT bPlayerWentWanted IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 bPlayerWentWanted = TRUE ENDIF ENDIF ELSE IF PREPARE_MUSIC_EVENT("ASS3_RADIO_PASS") TRIGGER_MUSIC_EVENT("ASS3_RADIO_PASS") PRINTLN("TRIGGERING MUSIC - ASS3_RADIO_PASS") ENDIF PRINTLN("curStage = MISSION_STATE_SUCCESS") curStage = MISSION_STATE_SUCCESS ENDIF HANDLE_FRANKLIN_PLAYING_TARGET_KILL_LINE(bTargetKillLinePlayed, args.assConv, "OJASAUD", "OJAS_VICOM", CONV_PRIORITY_VERY_HIGH) BREAK //pass the mission CASE MISSION_STATE_SUCCESS HANDLE_FRANKLIN_PLAYING_TARGET_KILL_LINE(bTargetKillLinePlayed, args.assConv, "OJASAUD", "OJAS_VICOM", CONV_PRIORITY_VERY_HIGH) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0 // Pad the cell phone call by 3 seconds - to fix Bug # 1081593 IF IS_TIMER_STARTED(tCellPhoneBufferTimer) IF GET_TIMER_IN_SECONDS(tCellPhoneBufferTimer) > 3.0 IF HAS_ENDING_CELL_PHONE_CALL_COMPLETED(args) RETURN TRUE ENDIF ENDIF ELSE START_TIMER_NOW(tCellPhoneBufferTimer) PRINTLN("STARTING TIMER - tCellPhoneBufferTimer") ENDIF ELSE IF NOT bLoseCopsPrinted PRINT_NOW("ASS_HK_COPS", DEFAULT_GOD_TEXT_TIME, 1) bLoseCopsPrinted = TRUE ENDIF ENDIF ENDIF BREAK ENDSWITCH // //do mission timeout checks prior to mission // IF curStage < MISSION_STATE_WAITING_FOR_TARGET_KILL // IF HAS_PLAYER_ABANDONED_ASSASSINATION_AREA(bWarningHelp, targetData.vOtherPedPos, "ASS_HK_FAILWARN", 600) //uses the hooker spawn position // PRINTLN("FAILING HOOKER ASSASSINATION SCRIPT BECAUSE PLAYER ABANDONED THE AREA") // SET_MISSION_FAILED(asnArgs, targetData, FAIL_ABANDONED_MISSION) // PRINTLN("HOOKER: FAILING - PLAYER HAS ABANDONDED MISSION") // ENDIF // ENDIF RETURN FALSE ENDFUNC PROC DO_FADE_OUT_WITH_WAIT() IF NOT IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME) WHILE NOT IS_SCREEN_FADED_OUT() WAIT(0) ENDWHILE ENDIF ENDPROC PROC JUMP_TO_STAGE(MISSION_STATE state, MISSION_VICE_STAGE stage, BOOL bIsDebugJump = FALSE) DO_FADE_OUT_WITH_WAIT() //Update mission checkpoint in case they skipped the stages where it gets set. IF bIsDebugJump SWITCH state CASE MISSION_STATE_PRINTS GO_TO_CHECKPOINT_1() BREAK CASE MISSION_STATE_WAITING_FOR_TARGET_KILL SWITCH stage CASE MISSION_VICE_SETUP GO_TO_CHECKPOINT_2() BREAK CASE MISSION_VICE_SEND_CARS GO_TO_CHECKPOINT_3() BREAK // CASE MISSION_VICE_TARGET_COMBAT // GO_TO_CHECKPOINT_4() // BREAK ENDSWITCH BREAK ENDSWITCH ENDIF ENDPROC // debug builds only for J-skipping #IF IS_DEBUG_BUILD MISSION_STATE eState MISSION_VICE_STAGE eStage // debug skips PROC DO_DEBUG_SKIPS_VICE() IF LAUNCH_MISSION_STAGE_MENU(sSkipMenu, iDebugJumpStage) IF iDebugJumpStage = 0 eState = MISSION_STATE_PRINTS eStage = MISSION_VICE_SETUP ELIF iDebugJumpStage = 1 eState = MISSION_STATE_WAITING_FOR_TARGET_KILL eStage = MISSION_VICE_SETUP ELIF iDebugJumpStage = 2 eState = MISSION_STATE_WAITING_FOR_TARGET_KILL eStage = MISSION_VICE_SEND_CARS ENDIF bDoingPSkip = TRUE JUMP_TO_STAGE(eState, eStage, TRUE) ENDIF // mission pass S IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S) CLEAR_HELP() CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID()) curStage = MISSION_STATE_SUCCESS ENDIF // mission failed F IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F) SET_MISSION_FAILED(asnArgs, targetData, FAIL_ABANDONED_MISSION) ENDIF // skip stage P IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P) bDoingPSkip = TRUE IF curStage > MISSION_STATE_INIT AND curStage < MISSION_STATE_SUCCESS IF curStage > MISSION_STATE_INIT AND curStage < MISSION_STATE_WAITING_FOR_TARGET_KILL eState = MISSION_STATE_PRINTS eStage = MISSION_VICE_SETUP PRINTLN("P-SKIP: eState = MISSION_STATE_PRINTS") PRINTLN("P-SKIP: eStage = MISSION_VICE_SETUP") ELIF curStage >= MISSION_STATE_WAITING_FOR_TARGET_KILL AND curStage < MISSION_STATE_SUCCESS IF targetStage >= MISSION_VICE_SETUP AND targetStage < MISSION_VICE_SEND_CARS eState = MISSION_STATE_PRINTS eStage = MISSION_VICE_SETUP PRINTLN("P-SKIP: eState = MISSION_STATE_PRINTS") PRINTLN("P-SKIP: eStage = MISSION_VICE_SETUP") ELIF targetStage >= MISSION_VICE_SEND_CARS AND targetStage <= MISSION_VICE_CHECK_CARS eState = MISSION_STATE_WAITING_FOR_TARGET_KILL eStage = MISSION_VICE_SETUP PRINTLN("P-SKIP: eState = MISSION_STATE_PRINTS") PRINTLN("P-SKIP: eStage = MISSION_VICE_SETUP") ELIF targetStage >= MISSION_VICE_ENTER_CAR AND targetStage <= MISSION_VICE_TARGET_COMBAT eState = MISSION_STATE_WAITING_FOR_TARGET_KILL eStage = MISSION_VICE_SEND_CARS PRINTLN("P-SKIP: eState = MISSION_STATE_WAITING_FOR_TARGET_KILL") PRINTLN("P-SKIP: eStage = MISSION_VICE_SETUP") ENDIF ENDIF //TODO add cleanup JUMP_TO_STAGE(eState, eStage, TRUE) ENDIF ENDIF // skip stage J IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J) bDoingJSkip = TRUE IF curStage > MISSION_STATE_INIT AND curStage < MISSION_STATE_SUCCESS IF curStage < MISSION_STATE_WAITING_FOR_TARGET_KILL eState = MISSION_STATE_WAITING_FOR_TARGET_KILL eStage = MISSION_VICE_SETUP PRINTLN("J-SKIP: eState = MISSION_STATE_WAITING_FOR_TARGET_KILL") PRINTLN("J-SKIP: eStage = MISSION_VICE_SETUP") ELIF curStage >= MISSION_STATE_WAITING_FOR_TARGET_KILL AND curStage < MISSION_STATE_SUCCESS IF targetStage < MISSION_VICE_SEND_CARS eState = MISSION_STATE_WAITING_FOR_TARGET_KILL eStage = MISSION_VICE_SEND_CARS PRINTLN("J-SKIP: eState = MISSION_STATE_WAITING_FOR_TARGET_KILL") PRINTLN("J-SKIP: eStage = MISSION_VICE_SEND_CARS") ELSE CLEAR_HELP() CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID()) curStage = MISSION_STATE_SUCCESS ENDIF ENDIF //TODO add cleanup IF curStage != MISSION_STATE_SUCCESS JUMP_TO_STAGE(eState, eStage, TRUE) ENDIF ENDIF ENDIF ENDPROC #ENDIF //PROC CHECK_FOR_ACTION_MODE() // IF NOT bSetActionMode // IF targetStage >= MISSION_VICE_TASK_PLAYER // IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_PED_INJURED(PLAYER_PED_ID()) // IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) // SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1) // PRINTLN("HOOKER: SETTING ACTION MODE ON THE PLAYER") // bSetActionMode = TRUE // ENDIF // ENDIF // ENDIF // ENDIF //ENDPROC PROC SAVE_MISSION_TIMER_FOR_MISSION() IF IS_TIMER_STARTED(tMissionTime) g_savedGlobals.sAssassinData.fViceMissionTime = GET_TIMER_IN_SECONDS(tMissionTime) PRINTLN("CLEANUP: tMissionTime = ", g_savedGlobals.sAssassinData.fViceMissionTime) ELSE PRINTLN("CLEANUP: tMissionTime WAS NOT STARTED!!!") ENDIF ENDPROC //main script SCRIPT DEBUG_MESSAGE("Assassination Vice Start") SET_MISSION_FLAG(TRUE) IF (HAS_FORCE_CLEANUP_OCCURRED()) DEBUG_MESSAGE("FORCE CLEANUP HAS OCCURRED!!!") SAVE_MISSION_TIMER_FOR_MISSION() TRIGGER_MUSIC_EVENT("ASS3_FAIL") PRINTLN("TRIGGERING MUSIC - ASS3_FAIL - 02") SET_BITMASK_AS_ENUM(g_savedGlobals.sAssassinData.iGenericData, ACD_FAILED) Mission_Flow_Mission_Force_Cleanup() //restore phone stuff IF DOES_ENTITY_EXIST(oPayPhone) SET_ENTITY_VISIBLE(oPayPhone, TRUE) SET_ENTITY_COLLISION(oPayPhone, TRUE) SET_ENTITY_CAN_BE_DAMAGED(oPayPhone, TRUE) ENDIF MISSION_CLEANUP(sLoadQueue) ENDIF IF Is_Replay_In_Progress() bHaveRetryOnce = TRUE PRINTLN("VICE: SETTING - bHaveRetryOnce = TRUE") iStageToUse = Get_Replay_Mid_Mission_Stage() PRINTLN("START - REPLAY IS IN PROGRESS, iStageToUse = ", iStageToUse) IF g_bShitskipAccepted iStageToUse ++ PRINTLN("INCREMENTING iStageToUse DUE TO SHITSKIP. NEW STAGE TO USE = ", iStageToUse) ENDIF IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE() PRINTLN("REPLAY VEHICLE IS AVAILABLE") bReplayVehicleAvailable = TRUE ELSE PRINTLN("REPLAY VEHICLE IS NOT AVAILABLE") ENDIF IF bReplayVehicleAvailable REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL() WHILE NOT HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED() PRINTLN("HOOKER: Waiting for HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED") WAIT(0) ENDWHILE ENDIF IF bReplayVehicleAvailable //create the replay vehicle but make sure it isnt a water based vehicle (so we dont spawn it on land) IF iStageToUse = 0 viReplayVehicle = CREATE_REPLAY_CHECKPOINT_VEHICLE(vMoveVehiclePosition01, fMoveVehicleHeading01) ELIF iStageToUse = 1 OR iStageToUse = 2 viReplayVehicle = CREATE_REPLAY_CHECKPOINT_VEHICLE(vMoveVehiclePosition02, fMoveVehicleHeading02) ELIF iStageToUse = 3 viReplayVehicle = CREATE_REPLAY_CHECKPOINT_VEHICLE(<<-385.7669, -1720.9408, 17.9849>>, 331.5191) //outside the scrapyard ENDIF IF NOT IS_THIS_MODEL_A_BOAT(GET_ENTITY_MODEL(viReplayVehicle)) AND NOT IS_THIS_MODEL_A_PLANE(GET_ENTITY_MODEL(viReplayVehicle)) AND NOT IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(viReplayVehicle)) SET_VEHICLE_ON_GROUND_PROPERLY(viReplayVehicle) ELSE DELETE_VEHICLE(viReplayVehicle) ENDIF ENDIF IF iStageToUse = 0 START_REPLAY_SETUP(<<213.5436, -854.7532, 29.3921>>, 64.8106) PRINTLN("CALLING START REPLAY SETUP FOR GO_TO_CHECKPOINT_1 ") ELIF iStageToUse = 1 OR iStageToUse = 2 START_REPLAY_SETUP(vPlayerCheckpointPosNearHooker, fPlayerCheckpointHeadNearHooker) ELIF iStageToUse = 3 START_REPLAY_SETUP(<<-380.8187, -1721.7848, 18.0069>>, 331.5191) //outside the scrapyard ENDIF bReplaying = TRUE ELSE bReplaying = FALSE ENDIF #IF IS_DEBUG_BUILD AddWidgets(myDebugData) // GET_RANDOM_VEHICLE_IN_SPHERE() #ENDIF SETUP_DEBUG() // Turning off roads along path that the target takes in his waypoint recording SET_ROADS_IN_ANGLED_AREA(<<-480.974152,-1801.921509,19.280453>>, <<-712.896790,-1671.164429,29.938675>>, 170.000000, FALSE, FALSE) SET_ROADS_IN_ANGLED_AREA(<<-662.699280,-1645.326172,24.071472>>, <<-672.214417,-1777.590088,38.812481>>, 45.000000, FALSE, FALSE) SET_ROADS_IN_ANGLED_AREA(<<-382.960785,-1688.731567,17.898500>>, <<-431.251160,-1811.230469,37.682495>>, 80.000000, FALSE, FALSE) SET_ROADS_IN_ANGLED_AREA(<<-674.891479,-1683.639404,9.116446>>, <<-446.189026,-1807.699585,31.724640>>, 200.000000, FALSE, FALSE) SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.4) // SET_PED_MODEL_IS_SUPPRESSED(S_M_Y_Cop_01, TRUE) SET_VEHICLE_MODEL_IS_SUPPRESSED(PEYOTE, TRUE) iSpeedNode = ADD_ROAD_NODE_SPEED_ZONE(<<-390.0703, -1698.8711, 17.8068>>, 10.0, 0) PRINTLN("TURNING OFF ROADS ALONG WAYPOINT PATH") // Fix Bug # 712684 IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, FALSE) ENDIF ASSASSINATION_ClearUnneededGenericData() iCurAssassinRank = ENUM_TO_INT(ASSASSINATION_Vice) //g_savedGlobals.sAssassinData.iCurrentAssassinRank missionData = ASSASSINATION_GetMissionData(iCurAssassinRank) PRINTLN("Current rank is... ", iCurAssassinRank) curStage = MISSION_BRIEF_INIT PRINTLN("STARTING MISSION ON STAGE - MISSION_BRIEF_INIT") CLEAR_AREA(<< -463.2923, -1708.1483, 17.6777 >>, 50.0, TRUE) sbi01 = ADD_SCENARIO_BLOCKING_AREA((<<-463.2923, -1708.1483, 17.6777>> - <<50,50,50>>), (<<-463.2923, -1708.1483, 17.6777>> + <<50,50,50>>)) //main loop WHILE TRUE WAIT(0) UPDATE_LOAD_QUEUE_LARGE(sLoadQueue) REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_ASS3") // UPDATE_ZVOLUME_WIDGETS() // PRINTLN("MISSION STATE = ", ENUM_TO_INT(curStage)) // PRINTLN("TARGET STATE = ", ENUM_TO_INT(targetStage)) #IF IS_DEBUG_BUILD DO_DEBUG_SKIPS_VICE() #ENDIF // CHECK_FOR_ACTION_MODE() UPDATE_PRINT_DELAY(printTimer, 7, TRUE) IF UPDATE_FAIL_CONDITIONS(targetData) IF GET_MISSION_FLOW_SAFE_TO_CLEANUP() SAVE_MISSION_TIMER_FOR_MISSION() REMOVE_SCENARIO_BLOCKING_AREA(sbi01) PRINTLN("REMOVING SCENARIO BLOCK AREA - sbi01") TRIGGER_MUSIC_EVENT("ASS3_FAIL") PRINTLN("TRIGGERING MUSIC - ASS3_FAIL - 01") //to fix bug 1182530 - Player spawned on sidewalk and out of the vehicle when retrying from a fail - (3/11/13) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) g_replay.iReplayInt[0] = 1 //set this integer to true that we will check later in GO_TO_CHECKPOINT_2() ELSE g_replay.iReplayInt[0] = 0 //reset this value ENDIF MISSION_FAILED(sLoadQueue) ENDIF ELIF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF UPDATE_ASSASSINATION_VICE(assArgs, ambVice) IF IS_TIMER_STARTED(tMissionTime) g_savedGlobals.sAssassinData.fViceMissionTime = GET_TIMER_IN_SECONDS(tMissionTime) PRINTLN("GLOBAL VICE MISSION TIME = ", g_savedGlobals.sAssassinData.fViceMissionTime) fTimeTaken = g_savedGlobals.sAssassinData.fViceMissionTime PRINTLN("fTimeTaken = ", fTimeTaken) ENDIF IF NOT bPlayerWentWanted //we need to track if the player went wanted forcibly by script IF NOT bLoseCopsPrinted AND NOT g_bShitskipAccepted bBonus = TRUE passReasonCore = PASS_BONUS PRINTLN("passReasonCore = PASS_BONUS") ENDIF ENDIF IF NOT bBonus passReasonCore = PASS_STANDARD PRINTLN("passReasonCore = PASS_STANDARD") ENDIF MISSION_PASSED(missionData, cucEndScreenCore, sLoadQueue) ENDIF ENDIF // DRAW_DEBUG_SPHERE(myDebugData.vDebugVector, myDebugData.fDebugFloat) ENDWHILE ENDSCRIPT