////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // // SCRIPT NAME : Assassin_Multi.sch // // AUTHOR : Michael Bagley // // DESCRIPTION : 4 Assassination targets - Timed mission // // Window Washer // // Body Builder // // Guy on Bike // // Guy on Yacht // ////////////////////////////////////////////////////////////////////////////////////////////////////////////// //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 "shared_hud_displays.sch" USING "replay_public.sch" USING "script_oddjob_queues.sch" USING "clearMissionArea.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 ************************************* CONST_INT NUM_ASSASSIN_TARGETS 4 CONST_INT NUM_BYSTANDER_PEDS 2 CONST_INT NUM_GAS_STATION_VEHICLES 4 CONST_INT NUM_GAS_STATION_VEHICLE_MODELS 3 CONST_INT iTOTAL_TIME_ALLOTTED 540000 ENUM CURRENT_ASSASSIN_TARGET ASSASSIN_TARGET_BODYBUILDER = 0, ASSASSIN_TARGET_YACHT, ASSASSIN_TARGET_WASHER, ASSASSIN_TARGET_BIKER ENDENUM CURRENT_ASSASSIN_TARGET curTarget ENUM CURRENT_TARGET_STAGE TARGET_STAGE_BLIP_TARGET = 0, TARGET_STAGE_WAITING, TARGET_STAGE_PANICKING ENDENUM CURRENT_TARGET_STAGE curTargetStage ENUM BB_ANIM_STAGE BB_ANIM_INTRO = 0, BB_ANIM_WALK_TO_NEXT, BB_ANIM_PERFORM ENDENUM BB_ANIM_STAGE curBBAnimStage ENUM BYSTAND_GOAL BG_WATCH = 0, BG_IDLE, BG_LEAVE ENDENUM // ------------------------------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 CAMERA_INDEX camPayPhoneIntro01a VECTOR vPhoneLocation = <<-700.1431, -917.7708, 18.2147>> VECTOR vPlayerWarpPosition = <<-700.1431, -917.7708, 18.2147>> FLOAT fPlayerWarpHeading = 3.2830 FLOAT fCutsceneLength = 42.0 FLOAT fRightX, fRightY VECTOR vCameraPosition01a = <<-699.1455, -917.3423, 19.7904>> VECTOR vCameraRotation01a = <<-5.6096, -0.1143, 75.6741>> VECTOR vCameraPosition01 = <<-699.1455, -917.3423, 19.7904>> VECTOR vCameraRotation01 = <<-2.4284, -0.1143, 81.9337>> structTimer tPayphoneCutsceneTimer structTimer tPayphoneCameraTimer BOOL bSkipCutscene = FALSE BOOL bPlayedPayPhoneConvo = FALSE VECTOR scenePosition = <<0,0,0>> VECTOR sceneRotation = <<0,0,0>> INT iSceneIdPayPhone STREAMVOL_ID svPhoneCutscene structTimer tBeepTimer // ------------------------------Cutscene variables------------------------------ BOOL bMissionTimerStarted BOOL bMissionTimerExpired BOOL bLocatePrinted BOOL bReplaying = FALSE BOOL bReplayVehicleAvailable = FALSE BOOL bCheckpointDataSet = FALSE BOOL bRopeDetached BOOL bTargetCruising BOOL bPanicking BOOL bWarning BOOL bPanicLinePlayed BOOL bThreatenLinePlayed BOOL bSunbatherPanic = FALSE BOOL bAttackedBystanders BOOL bSeenAimingAtTarget //BOOL bSetActionMode = FALSE BOOL bAttachedRope = FALSE BOOL bTaskedToFlee = FALSE BOOL bTaskedBystandersToFlee = FALSE BOOL bDoingPSkip BOOL bPlayerHasShitSkipped = FALSE //BOOL bPrepareMusic = FALSE BOOL bPlayedCellPhoneCall = FALSE BOOL bAggroAtDistance = FALSE BOOL bSplashSoundPlayed = FALSE BOOL bPlayedBystanderPanicLine = FALSE BOOL bGaveTextMessage = FALSE BOOL bContinueWithScene = FALSE //BOOL bTouchedRightStick = FALSE BOOL bPedsForCurrentTargetCreated = FALSE BOOL bTargetKillLinePlayed = FALSE BOOL bPoliceChaseLinePlayed = FALSE BOOL bNewsReportPlayed = FALSE INT iNumTargetsKilled INT iMissionTimerStart = 540000 //this and fMissionTime should be the same INT iDialogueLine INT iLineIDXToPlay = -1 INT iDialogueIdleLine INT iTimeSoFar INT iFrameCounter INT iBystanderCounter INT iIdleSpeechStage INT iWarningSpeechStage INT iRopeStages INT iFranklinsReactionToTime = 0 INT iStageToUse = 0 INT iIntroCameraStages = 0 INT iSoundIdMulti = -1 INT iTimeToDisplayOnTimer INT iCheckpointSavedTime = -1 FLOAT fCutsceneTriggerDist = 75 FLOAT fFailDist FLOAT fSpeechTime = 3 FLOAT fMissionTime = 540000 ROPE_INDEX ropeWindowB ROPE_INDEX ropeWindowA //CAMERA_INDEX cutCam VECTOR vFlexPos = << -1208.4615, -1559.6609, 3.6087 >> VECTOR vReplayStartPos FLOAT fReplayStartHead VECTOR vVehReplayStartPos FLOAT fVehReplayStartHead VEHICLE_INDEX viJetski VEHICLE_INDEX viYacht VEHICLE_INDEX viRestStopCamper VEHICLE_INDEX viRestStopCar VEHICLE_INDEX viGasStationVehicle[NUM_GAS_STATION_VEHICLES] VEHICLE_INDEX viPlayerLastVehicle VEHICLE_INDEX viReplayVehicle MODEL_NAMES modelParkedVehicle[NUM_GAS_STATION_VEHICLE_MODELS] SCENARIO_BLOCKING_INDEX sbi01 //structTimer bystanderLeaveTimer //structTimer bystanderArriveTimer structTimer speechTimerTarget structTimer warningTimer structTimer aimTimer structTimer printTimer //structTimer tPrepMusicTimer structTimer tLeaveAreaTimer structTimer tDelayPhoneCallTimer structTimer tPoliceScanner structTimer tRadioNewsTimer VECTOR vFirstCheckpointStartPos = <<-702.6807, -920.2365, 18.0144>> VECTOR vTargetLocation[3] FLOAT fFirstCheckpointStartHeading = 120.5394 INT iSceneId = -1 structPedsForConversation cutsceneConvStruct CHASE_HINT_CAM_STRUCT localChaseHintCamStruct SIMPLE_USE_CONTEXT cucEndScreenCore LoadQueueLarge sLoadQueue STRUCT BYSTANDER_PED_STRUCT PED_INDEX ped VECTOR vSpawnPos VECTOR vIdlePos FLOAT fHead BYSTAND_GOAL goal ENDSTRUCT BYSTANDER_PED_STRUCT bystanders[NUM_BYSTANDER_PEDS] //DEBUG ONLY #IF IS_DEBUG_BUILD // DEBUG_POS_DATA myDebugData MissionStageMenuTextStruct sSkipMenu[4] INT iDebugJumpStage = 0 // PROC SHOW_BYSTANDER_POSITIONS() // TEXT_LABEL_3 tempstring // VECTOR pedPos // INT tempInt // // REPEAT NUM_BYSTANDER_PEDS tempInt // IF DOES_ENTITY_EXIST(bystanders[tempInt].ped) // IF NOT IS_PED_INJURED(bystanders[tempInt].ped) // tempstring = tempInt // DRAW_DEBUG_SPHERE(bystanders[tempInt].vSpawnPos, 0.25) // DRAW_DEBUG_TEXT(tempstring, bystanders[tempInt].vSpawnPos ) // pedPos = GET_ENTITY_COORDS(bystanders[tempInt].ped) // DRAW_DEBUG_TEXT(tempstring, pedPos ) // ENDIF // ENDIF // ENDREPEAT // ENDPROC PROC SETUP_DEBUG() sSkipMenu[0].sTxtLabel = "BODY_BUILDER" sSkipMenu[1].sTxtLabel = "GUY_ON_YACHT" sSkipMenu[2].sTxtLabel = "WINDOW_WASHER" sSkipMenu[3].sTxtLabel = "GUY_ON_BIKE" ENDPROC #ENDIF // ********************************** END SCRIPT GLOBALS ************************************* PROC timeLapseCutscene() IF NOT IS_REPLAY_IN_PROGRESS() IF DO_TIMELAPSE(SP_MISSION_ASSASSIN_2, sTimelapse, FALSE, FALSE) PRINTLN("GOING TO STATE - MISSION_BRIEF_INIT VIA timeLapseCutscene") curStage = MISSION_BRIEF_INIT ENDIF ELSE PRINTLN("GOING TO STATE - MISSION_BRIEF_INIT VIA timeLapseCutscene, REPLAY") curStage = MISSION_BRIEF_INIT 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 INIT_PARKED_VEHICLE_MODELS_FOR_GAS_STATION() modelParkedVehicle[0] = PREMIER modelParkedVehicle[1] = DILETTANTE modelParkedVehicle[2] = VIGERO ENDPROC PROC REQUEST_PARKED_VEHICLE_MODELS_FOR_GAS_STATION() INT idx REPEAT NUM_GAS_STATION_VEHICLE_MODELS idx REQUEST_MODEL(modelParkedVehicle[idx]) ENDREPEAT ENDPROC FUNC BOOL ARE_PARKED_VEHICLE_MODELS_STREAMED() REQUEST_MODEL(PREMIER) REQUEST_MODEL(DILETTANTE) REQUEST_MODEL(VIGERO) WHILE NOT HAS_MODEL_LOADED(PREMIER) OR NOT HAS_MODEL_LOADED(DILETTANTE) OR NOT HAS_MODEL_LOADED(VIGERO) PRINTLN("WAITING ON PARKED CAR MODELS TO LOAD") RETURN FALSE ENDWHILE RETURN TRUE ENDFUNC /// PURPOSE: /// Releases all vehicle models for the parked cars that were created in the gas station of the phone cutscene (if in memory) PROC SET_PARKED_VEHICLE_MODELS_AS_NO_LONGER_NEEDED() INT idx REPEAT NUM_GAS_STATION_VEHICLE_MODELS idx IF modelParkedVehicle[idx] != DUMMY_MODEL_FOR_SCRIPT SET_MODEL_AS_NO_LONGER_NEEDED(modelParkedVehicle[idx]) ENDIF ENDREPEAT ENDPROC PROC INIT_BODYBUILDER_DATA_DONT_STREAM_PEDS(ASS_TARGET_DATA& targetData) targetData.targetEnum = U_M_Y_BABYD targetData.vTargetPos = vFlexPos targetData.bNonTemp = TRUE targetData.fTargetHead = 24.7111 targetData.vDestPos = << -1183.1202, -1523.1781, 3.3640 >> //<< -1207.5627, -1553.2156, 3.3728 >> targetData.vWarpPos = << -1205.3925, -1548.0220, 3.3229 >> targetData.vCutscenePos = << -1202.3690, -1550.9016, 5.8757 >> targetData.vCutsceneHead = << -4.6, -0.0003, 152.2 >> targetData.fCutsceneDoF = 35 targetData.sAnimDict[0] = "oddjobs@assassinate@multi@" targetData.sAnimDict[1] = "misscommon@response" aggroArgs.iShotIRange = 5 // ADD_STREAMED_MODEL(targetData.streamedModels, targetData.targetEnum) // ADD_STREAMED_MODEL(targetData.streamedModels, A_F_Y_BEACH_01) //bystander ped // ADD_STREAMED_MODEL(targetData.streamedModels, A_F_Y_Fitness_02) //bystander ped ADD_STREAMED_MODEL(targetData.streamedModels, PREMIER) //bystander ped ADD_STREAMED_MODEL(targetData.streamedModels, DILETTANTE) //bystander ped ADD_STREAMED_MODEL(targetData.streamedModels, VIGERO) //bystander ped ADD_STREAMED_ANIM(targetData.streamedAnims, targetData.sAnimDict[0]) ADD_STREAMED_ANIM(targetData.streamedAnims, targetData.sAnimDict[1]) fFailDist = 175 INIT_PARKED_VEHICLE_MODELS_FOR_GAS_STATION() ENDPROC FUNC BOOL IS_BODYBUILDER_DATA_LOADED_NO_PEDS(ASS_TARGET_DATA& targetData) IF ARE_MODELS_STREAMED(targetData.streamedModels) AND ARE_ANIMS_STREAMED(sLoadQueue) AND ARE_PARKED_VEHICLE_MODELS_STREAMED() RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_BODYBUILDER_DATA_LOADED_PEDS_ONLY(ASS_TARGET_DATA& targetData) REQUEST_MODEL(targetData.targetEnum) REQUEST_MODEL(A_F_Y_BEACH_01) REQUEST_MODEL(A_F_Y_Fitness_02) IF HAS_MODEL_LOADED(targetData.targetEnum) AND HAS_MODEL_LOADED(A_F_Y_BEACH_01) AND HAS_MODEL_LOADED(A_F_Y_Fitness_02) RETURN TRUE ENDIF RETURN FALSE ENDFUNC PROC SET_BODYBUILDER_PEDS_AND_MODELS_AS_NO_LONGER_NEEDED(ASS_ARGS& args, ASS_TARGET_DATA& targetData) IF targetData.targetEnum != DUMMY_MODEL_FOR_SCRIPT SET_MODEL_AS_NO_LONGER_NEEDED(targetData.targetEnum) ENDIF SET_MODEL_AS_NO_LONGER_NEEDED(A_F_Y_BEACH_01) SET_MODEL_AS_NO_LONGER_NEEDED(A_F_Y_Fitness_02) IF DOES_ENTITY_EXIST(args.myTarget) SET_PED_AS_NO_LONGER_NEEDED(args.myTarget) ENDIF INT idx FOR idx = 0 TO NUM_BYSTANDER_PEDS - 1 IF DOES_ENTITY_EXIST(bystanders[idx].ped) SET_PED_AS_NO_LONGER_NEEDED(bystanders[idx].ped) ENDIF ENDFOR ENDPROC PROC INIT_LEAVE_AREA_LOCATIONS() vTargetLocation[0] = << -1208.4615, -1559.6609, 3.6087 >> // Body Builder vTargetLocation[1] = <<-2164.7234, -405.4532, 12.3954>> // Yacht guy vTargetLocation[2] = <<-693.6130, 233.9349, 79.7011>> // window washer ENDPROC PROC INIT_YACHT_DATA_DONT_STREAM_PEDS(ASS_TARGET_DATA& targetData) targetData.targetEnum = A_M_M_BEACH_01 targetData.vTargetPos = << -2211.7424, -587.6183, -0.4 >> targetData.fTargetHead = 222.5630 targetData.bNonTemp = TRUE targetData.otherPedEnum = A_F_Y_BEACH_01 //girl on yacht targetData.vOtherPedPos = << -2211.7424, -587.6183, -0.4 >> //sunbathing chick next to jetski targetData.auxPedEnum = A_F_Y_BEACH_01 // MAKE SURE TO ADD A STREAMED MODEL REQUESTIF THIS CHANGES FROM A_F_Y_BEACH_01!!! Currently not adding to streamed model list since it is the same as targetData.otherPedEnum targetData.vAuxPedPos = << -2155.47949, -459.90463, 2.53347 >> targetData.fAuxPedHead = 129.6666 targetData.vehEnum = MARQUIS targetData.vVehPos = << -2211.7424, -587.6183, -0.4 >> targetData.fVehHead = 222.5630 targetData.vDestPos = << -2172.9009, -395.7628, 12.3490 >> //<< -2178.8555, -410.6809, 12.1595 >> targetData.vWarpPos = << -2178.8555, -410.6809, 12.1595 >> targetData.vCutscenePos = << -2171.4619, -446.2333, 5.9263 >> targetData.vCutsceneHead = << -5.0921, -0.0249, 163.0108 >> targetData.fCutsceneDoF = 35 targetData.sAnimDict[0] = "oddjobs@assassinate@multi@yachttarget@lapdance" targetData.sAnimDict[1] = "amb@world_human_sunbathe@female@back@idle_a" targetData.sAnimDict[2] = "veh@boat@marquis@rps@enter_exit" aggroArgs.iShotIRange = 5 // ADD_STREAMED_MODEL(targetData.streamedModels, targetData.targetEnum) // ADD_STREAMED_MODEL(targetData.streamedModels, targetData.otherPedEnum) ADD_STREAMED_MODEL(targetData.streamedModels, targetData.vehEnum) ADD_STREAMED_MODEL(targetData.streamedModels, SEASHARK) ADD_STREAMED_ANIM(targetData.streamedAnims, targetData.sAnimDict[0]) ADD_STREAMED_ANIM(targetData.streamedAnims, targetData.sAnimDict[1]) // LOAD_STREAM("MULT_ASSAS_WATER_SPLASH_master") // PRINTLN("REQUESTING LOAD_STREAM for 'MULT_ASSAS_WATER_SPLASH_master'") fFailDist = 400 ENDPROC FUNC BOOL IS_YACHT_DATA_LOADED_NO_PEDS(ASS_TARGET_DATA& targetData) IF ARE_MODELS_STREAMED(targetData.streamedModels) AND ARE_ANIMS_STREAMED(sLoadQueue) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_YACHT_DATA_LOADED_PEDS_ONLY(ASS_TARGET_DATA& targetData) REQUEST_MODEL(targetData.targetEnum) REQUEST_MODEL(targetData.otherPedEnum) IF HAS_MODEL_LOADED(targetData.targetEnum) AND HAS_MODEL_LOADED(targetData.otherPedEnum) // AND LOAD_STREAM("MULT_ASSAS_WATER_SPLASH_master") PRINTLN("IS_YACHT_DATA_LOADED_PEDS_ONLY RETURNED TRUE!") RETURN TRUE ENDIF RETURN FALSE ENDFUNC PROC SET_YACHT_PEDS_AND_MODELS_AS_NO_LONGER_NEEDED(ASS_ARGS& args, ASS_TARGET_DATA& targetData) IF targetData.targetEnum != DUMMY_MODEL_FOR_SCRIPT SET_MODEL_AS_NO_LONGER_NEEDED(targetData.targetEnum) ENDIF IF targetData.otherPedEnum != DUMMY_MODEL_FOR_SCRIPT SET_MODEL_AS_NO_LONGER_NEEDED(targetData.otherPedEnum) ENDIF IF DOES_ENTITY_EXIST(args.myTarget) SET_PED_AS_NO_LONGER_NEEDED(args.myTarget) ENDIF IF DOES_ENTITY_EXIST(args.myOtherPed) SET_PED_AS_NO_LONGER_NEEDED(args.myOtherPed) ENDIF IF DOES_ENTITY_EXIST(args.myAuxPed) SET_PED_AS_NO_LONGER_NEEDED(args.myAuxPed) ENDIF ENDPROC PROC INIT_WASHER_DATA_DONT_STREAM_PEDS(ASS_TARGET_DATA& targetData) targetData.targetEnum = S_M_Y_WinClean_01 targetData.propEnum[0] = Prop_BMU_02_LD // the platform targetData.propEnum[1] = Prop_BMU_02_LD_Sup // the anchors targetData.vPropPos[0] = << -643.750, 305.280, 99.200 >> //<< -719.3, 269.5, 123.8 >> targetData.fPropHead[0] = 175.3 targetData.vPropPos[1] = << -643.51, 308.26, 138.62 >> // << -722.0, 268.2, 130.3 >> targetData.fPropHead[1] = 175 // 297 targetData.vTargetPos = << -642.6985, 305.8230, 111.5572 >>// << -720.8910, 271.1867, 124.7611 >> targetData.fTargetHead = 349.4722 targetData.vDestPos = << -662.15826, 255.09444, 80.40974 >> //<< -681.2297, 274.3849, 80.4044 >> targetData.vCutscenePos = << -660.3444, 184.7394, 80.3851 >> targetData.vCutsceneHead = << 12.3694, 0.0001, -20.5050 >> targetData.fCutsceneDoF = 35 targetData.sAnimDict[0] = "oddjobs@assassinate@multi@windowwasher" // targetData.sAnimDict[1] = "amb@world_human_stand_impatient@male@no_sign@base" targetData.vWarpPos = << -662.6647, 242.4725, 80.3006 >> targetData.bNonTemp = TRUE aggroArgs.iShotIRange = 15 // ADD_STREAMED_MODEL(targetData.streamedModels, targetData.targetEnum) ADD_STREAMED_MODEL(targetData.streamedModels, targetData.propEnum[0]) ADD_STREAMED_MODEL(targetData.streamedModels, targetData.propEnum[1]) ADD_STREAMED_ANIM(targetData.streamedAnims, targetData.sAnimDict[0]) // ADD_STREAMED_ANIM(targetData.streamedAnims, targetData.sAnimDict[1]) LOAD_STREAM("WINDOWWASHERFALL_MASTER") PRINTLN("REQUESTING LOAD_STREAM for 'WINDOWWASHERFALL_MASTER'") fFailDist = 500 ENDPROC FUNC BOOL IS_WASHER_DATA_LOADED_NO_PEDS(ASS_TARGET_DATA& targetData) IF ARE_MODELS_STREAMED(targetData.streamedModels) AND ARE_ANIMS_STREAMED(sLoadQueue) // AND LOAD_STREAM("WINDOWWASHERFALL_MASTER") PRINTLN("IS_WASHER_DATA_LOADED_NO_PEDS RETURNED TRUE!") RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_WASHER_DATA_LOADED_PEDS_ONLY(ASS_TARGET_DATA& targetData) REQUEST_MODEL(targetData.targetEnum) IF HAS_MODEL_LOADED(targetData.targetEnum) RETURN TRUE ENDIF RETURN FALSE ENDFUNC PROC SET_WASHER_PEDS_AND_MODELS_AS_NO_LONGER_NEEDED(ASS_ARGS& args, ASS_TARGET_DATA& targetData) IF targetData.targetEnum != DUMMY_MODEL_FOR_SCRIPT SET_MODEL_AS_NO_LONGER_NEEDED(targetData.targetEnum) ENDIF IF DOES_ENTITY_EXIST(args.myTarget) SET_PED_AS_NO_LONGER_NEEDED(args.myTarget) ENDIF ENDPROC PROC INIT_BIKER_DATA_DONT_STREAM_PEDS(ASS_TARGET_DATA& targetData) targetData.targetEnum = U_M_Y_SBike targetData.vTargetPos = << -1406.7675, 738.4614, 182.4823 >> targetData.fTargetHead = 125.2133 targetData.bNonTemp = TRUE targetData.weapTarget = WEAPONTYPE_PISTOL targetData.vDestPos = << -1408.1696, 742.0872, 182.0377 >> //<< -1265.9923, 866.4904, 190.0261 >> targetData.vehEnum = BATI targetData.vVehPos = << -1408.1696, 742.0872, 182.0377 >> targetData.fVehHead = 15.0077 targetData.vWarpPos = << -1382.6913, 744.9668, 182.2854 >> targetData.vCutscenePos = << -1402.0939, 738.1398, 183.9362 >> targetData.vCutsceneHead = << -0.2429, -0.0000, 76.3241 >> targetData.fCutsceneDoF = 35 aggroArgs.iShotIRange = 5 // ADD_STREAMED_MODEL(targetData.streamedModels, targetData.targetEnum) ADD_STREAMED_MODEL(targetData.streamedModels, targetData.vehEnum) ADD_STREAMED_MODEL(targetData.streamedModels, BJXL) ADD_STREAMED_MODEL(targetData.streamedModels, CAMPER) fFailDist = 250 ENDPROC FUNC BOOL IS_BIKER_DATA_LOADED_NO_PEDS(ASS_TARGET_DATA& targetData) IF ARE_MODELS_STREAMED(targetData.streamedModels) AND ARE_ANIMS_STREAMED(sLoadQueue) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_BIKER_DATA_LOADED_PEDS_ONLY(ASS_TARGET_DATA& targetData) REQUEST_MODEL(targetData.targetEnum) IF HAS_MODEL_LOADED(targetData.targetEnum) RETURN TRUE ENDIF RETURN FALSE ENDFUNC PROC SET_BIKER_PEDS_AND_MODELS_AS_NO_LONGER_NEEDED(ASS_ARGS& args, ASS_TARGET_DATA& targetData) IF targetData.targetEnum != DUMMY_MODEL_FOR_SCRIPT SET_MODEL_AS_NO_LONGER_NEEDED(targetData.targetEnum) ENDIF IF DOES_ENTITY_EXIST(args.myTarget) SET_PED_AS_NO_LONGER_NEEDED(args.myTarget) ENDIF ENDPROC PROC UPDATE_MISSION_TIMER(INT& startTime, INT& iTimePassed, FLOAT& fTimeLimit, BOOL& bTimerStarted, BOOL& bTimeExpired) // Grab starting game time IF NOT bTimerStarted startTime = GET_GAME_TIMER() PRINTLN("START TIME = ", startTime) bTimerStarted = TRUE ENDIF // Variable time - include iTimeOffsetReplay to address TimeRemaining when a player restarts a mission from a checkpoint so they don't start with full time) iTimePassed = GET_GAME_TIMER() - startTime // PRINTLN("iTimePassed = ", iTimePassed) iTimeToDisplayOnTimer = ROUND(fTimeLimit) - iTimePassed // PRINTLN("iTimeToDisplayOnTimer = ", iTimeToDisplayOnTimer) IF iTimeToDisplayOnTimer < 60000 IF iTimeToDisplayOnTimer <= 11000 AND iTimeToDisplayOnTimer >= 5000 IF IS_TIMER_STARTED(tBeepTimer) IF GET_TIMER_IN_SECONDS(tBeepTimer) > 1 PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET") RESTART_TIMER_NOW(tBeepTimer) PRINTLN("PLAYING BEEP") ENDIF ELSE PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET") START_TIMER_NOW(tBeepTimer) PRINTLN("STARTING TIMER - tBeepTimer - 01") ENDIF ELIF iTimeToDisplayOnTimer <= 5000 AND iTimeToDisplayOnTimer > 0 IF IS_TIMER_STARTED(tBeepTimer) IF GET_TIMER_IN_SECONDS(tBeepTimer) > 0.5 PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET") RESTART_TIMER_NOW(tBeepTimer) PRINTLN("PLAYING BEEP") ENDIF ELSE START_TIMER_NOW(tBeepTimer) PRINTLN("STARTING TIMER - tBeepTimer - 02") ENDIF ENDIF DRAW_GENERIC_TIMER(iTimeToDisplayOnTimer, "ASS_TIME", 0, TIMER_STYLE_DONTUSEMILLISECONDS, -1, PODIUMPOS_NONE, HUDORDER_DONTCARE, FALSE, HUD_COLOUR_RED) ELSE DRAW_GENERIC_TIMER(iTimeToDisplayOnTimer, "ASS_TIME") ENDIF IF iTimePassed > fTimeLimit PLAY_SOUND_FRONTEND(-1, "TIMER_STOP", "HUD_MINI_GAME_SOUNDSET") PRINTLN("PLAYING - TIMER_STOP") bTimeExpired = TRUE PRINTLN("bTimeExpired = TRUE") ENDIF ENDPROC //initialize all the necessities for the mission PROC INIT_CURRENT_TARGET_DATA(ASS_TARGET_DATA& targetData) SWITCH curTarget CASE ASSASSIN_TARGET_BODYBUILDER INIT_BODYBUILDER_DATA_DONT_STREAM_PEDS(targetData) REQUEST_PARKED_VEHICLE_MODELS_FOR_GAS_STATION() BREAK CASE ASSASSIN_TARGET_YACHT INIT_YACHT_DATA_DONT_STREAM_PEDS(targetData) BREAK CASE ASSASSIN_TARGET_WASHER INIT_WASHER_DATA_DONT_STREAM_PEDS(targetData) BREAK CASE ASSASSIN_TARGET_BIKER INIT_BIKER_DATA_DONT_STREAM_PEDS(targetData) BREAK ENDSWITCH REQUEST_ALL_MODELS(targetData.streamedModels) REQUEST_ALL_ANIMS(targetData.streamedAnims, sLoadQueue) ENDPROC FUNC BOOL IS_CURRENT_TARGET_DATA_LOADED_NO_PEDS(ASS_TARGET_DATA& targetData) PRINTLN("waiting for current target data to load") SWITCH curTarget CASE ASSASSIN_TARGET_WASHER IF NOT IS_WASHER_DATA_LOADED_NO_PEDS(targetData) RETURN FALSE ENDIF BREAK CASE ASSASSIN_TARGET_YACHT IF NOT IS_YACHT_DATA_LOADED_NO_PEDS(targetData) RETURN FALSE ENDIF BREAK CASE ASSASSIN_TARGET_BIKER IF NOT IS_BIKER_DATA_LOADED_NO_PEDS(targetData) RETURN FALSE ENDIF BREAK CASE ASSASSIN_TARGET_BODYBUILDER IF NOT IS_BODYBUILDER_DATA_LOADED_NO_PEDS(targetData) RETURN FALSE ENDIF BREAK ENDSWITCH PRINTLN("current target data loaded! - PEDS ONLY!") RETURN TRUE ENDFUNC //handles objective print messages PROC DO_CURRENT_TARGET_OBJECTIVE_PRINT() SWITCH curTarget CASE ASSASSIN_TARGET_BODYBUILDER IF NOT bLocatePrinted PRINT_NOW("ASS_ML_T01", DEFAULT_GOD_TEXT_TIME, 1) REGISTER_PRINT_DELAY(printTimer, "ASS_TIME_TK") bLocatePrinted = TRUE ENDIF BREAK CASE ASSASSIN_TARGET_YACHT IF NOT bLocatePrinted PRINT_NOW("ASS_ML_T01", DEFAULT_GOD_TEXT_TIME, 1) bLocatePrinted = TRUE ENDIF BREAK CASE ASSASSIN_TARGET_WASHER IF NOT bLocatePrinted PRINT_NOW("ASS_ML_T01", DEFAULT_GOD_TEXT_TIME, 1) bLocatePrinted = TRUE ENDIF BREAK CASE ASSASSIN_TARGET_BIKER IF NOT bLocatePrinted PRINT_NOW("ASS_ML_T01", DEFAULT_GOD_TEXT_TIME, 1) bLocatePrinted = TRUE ENDIF BREAK ENDSWITCH ENDPROC //handles objective print messages PROC DO_SET_CHECKPOINT() SWITCH curTarget CASE ASSASSIN_TARGET_BODYBUILDER SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "assassin_multi_locate_bodybuilder") OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(viReplayVehicle) BREAK CASE ASSASSIN_TARGET_YACHT SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(1, "assassin_multi_locate_yacht_target") BREAK CASE ASSASSIN_TARGET_WASHER SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(2, "assassin_multi_locate_window_washer") BREAK CASE ASSASSIN_TARGET_BIKER SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(3, "assassin_multi_locate_biker") BREAK ENDSWITCH ENDPROC PROC CREATE_CURRENT_TARGET_BLIP(ASS_ARGS& args) IF DOES_BLIP_EXIST(args.myTargetBlip) REMOVE_BLIP(args.myTargetBlip) ENDIF args.myTargetBlip = CREATE_BLIP_ON_ENTITY(args.myTarget, FALSE) SET_BLIP_COLOUR(args.myTargetBlip, BLIP_COLOUR_RED) SET_BLIP_ROUTE(args.myTargetBlip, FALSE) ENDPROC //checks to see if the player has a wanted level and is within fDistToCheck of pedToCheck FUNC BOOL ARE_COPS_NEAR_TARGET_WHILE_PLAYER_IS_WANTED(PED_INDEX pedToCheck, FLOAT fDistToCheck) VECTOR vPedPos IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 IF NOT IS_PED_INJURED(pedToCheck) vPedPos = GET_ENTITY_COORDS(pedToCheck) IF IS_COP_PED_IN_AREA_3D(<< vPedPos.x - fDistToCheck, vPedPos.y - fDistToCheck, vPedPos.z - fDistToCheck>>, << vPedPos.x + fDistToCheck, vPedPos.y + fDistToCheck, vPedPos.z + fDistToCheck>>) RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC PROC PLAY_FRANKLIN_LINE_REACTING_TO_POLICE_IF_WANTED() IF NOT bPoliceChaseLinePlayed IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "SPOT_POLICE") bPoliceChaseLinePlayed = TRUE ENDIF ENDIF ENDIF ENDPROC //plays a random anim for the bystander ped depending on their state PROC PLAY_RANDOM_BYSTANDER_ANIM(PED_INDEX ped, BOOL bWatchingTarget = TRUE) INT randInt IF NOT IS_PED_RAGDOLL(ped) IF bWatchingTarget IF IS_PED_MALE(ped) randInt = GET_RANDOM_INT_IN_RANGE() % 3 IF randInt = 0 TASK_PLAY_ANIM(ped, "oddjobs@assassinate@multi@" , "react_big_variations_a", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1 , AF_LOOPING, GET_RANDOM_FLOAT_IN_RANGE()) ELIF randInt = 1 TASK_PLAY_ANIM(ped, "oddjobs@assassinate@multi@", "react_big_variations_b", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1 , AF_LOOPING, GET_RANDOM_FLOAT_IN_RANGE()) ELSE TASK_PLAY_ANIM(ped, "oddjobs@assassinate@multi@", "react_big_variations_c", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1 , AF_LOOPING, GET_RANDOM_FLOAT_IN_RANGE()) ENDIF ELSE randInt = GET_RANDOM_INT_IN_RANGE() % 2 IF randInt = 0 TASK_PLAY_ANIM(ped, "oddjobs@assassinate@multi@", "idle_a_pros", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1 , AF_LOOPING, GET_RANDOM_FLOAT_IN_RANGE()) ELSE TASK_PLAY_ANIM(ped, "oddjobs@assassinate@multi@", "idle_a_pros", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1 , AF_LOOPING, GET_RANDOM_FLOAT_IN_RANGE()) ENDIF ENDIF ENDIF ENDIF ENDPROC //creates peds that are spawned around bodybuilder target and has them play a random anim PROC CREATE_BYSTANDER_PEDS() bystanders[0].vSpawnPos = <<-1209.0311, -1553.9404, 3.3721>> bystanders[1].vSpawnPos = <<-1214.1919, -1558.5959, 3.3476>> bystanders[0].goal = BG_IDLE bystanders[1].goal = BG_IDLE bystanders[0].ped = CREATE_PED(PEDTYPE_CIVFEMALE, A_F_Y_Fitness_02, bystanders[0].vSpawnPos, 169.9513) PLAY_RANDOM_BYSTANDER_ANIM(bystanders[0].ped) PRINTLN("CREATING FIRST BYSTANDER") bystanders[1].ped = CREATE_PED(PEDTYPE_CIVFEMALE, A_F_Y_BEACH_01, bystanders[1].vSpawnPos, 257.4617) PLAY_RANDOM_BYSTANDER_ANIM(bystanders[1].ped) PRINTLN("CREATING SECOND BYSTANDER") SET_PED_COMBAT_ATTRIBUTES(bystanders[0].ped, CA_ALWAYS_FLEE, TRUE) SET_PED_COMBAT_ATTRIBUTES(bystanders[0].ped, CA_USE_VEHICLE, FALSE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(bystanders[0].ped, TRUE) SET_PED_COMBAT_ATTRIBUTES(bystanders[1].ped, CA_ALWAYS_FLEE, TRUE) SET_PED_COMBAT_ATTRIBUTES(bystanders[1].ped, CA_USE_VEHICLE, FALSE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(bystanders[1].ped, TRUE) ENDPROC ////have the bystanders leave the scene periodically if not already panicking //PROC UPDATE_BYSTANDERS_LEAVING_AREA(INT iMaxNumPedsToLeave, INT iNumSecondsBetweenLeaving) // INT iPedNum // // //only have a max of iMaxNumPedsToLeave peds leave the scene so there is still a decent crowd at any given time as long as panic hasnt been triggered // IF iNumBystandersLeavingArea <= iMaxNumPedsToLeave // IF NOT IS_TIMER_STARTED(bystanderLeaveTimer) // RESTART_TIMER_NOW(bystanderLeaveTimer) // ELSE // IF GET_TIMER_IN_SECONDS(bystanderLeaveTimer) > iNumSecondsBetweenLeaving // iPedNum = GET_RANDOM_INT_IN_RANGE() % 11 //only search the first group of peds spawned near the gym // IF NOT IS_PED_INJURED(bystanders[iPedNum].ped) // IF bystanders[iPedNum].goal <> BG_LEAVE // AND GET_SCRIPT_TASK_STATUS(bystanders[iPedNum].ped, SCRIPT_TASK_PLAY_ANIM) = PERFORMING_TASK // bystanders[iPedNum].goal = BG_LEAVE // iNumBystandersLeavingArea ++ // ENDIF // ENDIF // // RESTART_TIMER_NOW(bystanderLeaveTimer) // ENDIF // ENDIF // ENDIF //ENDPROC //PROC UPDATE_BYSTANDERS_ARRIVING(INT iNumSecondsBeforeTasking) // INT iPedNum // // IF NOT IS_TIMER_STARTED(bystanderArriveTimer) // RESTART_TIMER_NOW(bystanderArriveTimer) // ELSE // IF GET_TIMER_IN_SECONDS(bystanderArriveTimer) > iNumSecondsBeforeTasking // iPedNum = GET_RANDOM_INT_IN_RANGE(8, NUM_BYSTANDER_PEDS) // IF NOT IS_PED_INJURED(bystanders[iPedNum].ped) // IF bystanders[iPedNum].goal = BG_IDLE // CLEAR_PED_TASKS(bystanders[iPedNum].ped) // bystanders[iPedNum].goal = BG_WATCH // PRINTLN("bystanders[", iPedNum, "] = BG_WATCH") // ENDIF // ENDIF // // RESTART_TIMER_NOW(bystanderArriveTimer) // ENDIF // ENDIF //ENDPROC //update bystanders - only update one bystander per frame PROC UPDATE_BYSTANDERS_STATES() INT idx SEQUENCE_INDEX tempSeq IF iBystanderCounter < NUM_BYSTANDER_PEDS idx = iBystanderCounter ELSE iBystanderCounter = 0 ENDIF IF NOT IS_PED_INJURED(bystanders[idx].ped) SWITCH bystanders[idx].goal CASE BG_WATCH IF GET_ENTITY_DISTANCE_FROM_LOCATION(bystanders[idx].ped, bystanders[idx].vSpawnPos) > 2 IF GET_SCRIPT_TASK_STATUS(bystanders[idx].ped, SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK CLEAR_PED_TASKS(bystanders[idx].ped) OPEN_SEQUENCE_TASK(tempSeq) TASK_GO_TO_COORD_ANY_MEANS(NULL, bystanders[idx].vSpawnPos, PEDMOVE_WALK, NULL) TASK_TURN_PED_TO_FACE_COORD(NULL, vFlexPos) CLOSE_SEQUENCE_TASK(tempSeq) TASK_PERFORM_SEQUENCE(bystanders[idx].ped, tempSeq) CLEAR_SEQUENCE_TASK(tempSeq) ENDIF ELSE IF GET_SCRIPT_TASK_STATUS(bystanders[idx].ped, SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK AND GET_SCRIPT_TASK_STATUS(bystanders[idx].ped, SCRIPT_TASK_PLAY_ANIM) <> PERFORMING_TASK PLAY_RANDOM_BYSTANDER_ANIM(bystanders[idx].ped) ENDIF ENDIF BREAK CASE BG_IDLE IF GET_SCRIPT_TASK_STATUS(bystanders[idx].ped, SCRIPT_TASK_PLAY_ANIM) <> PERFORMING_TASK PLAY_RANDOM_BYSTANDER_ANIM(bystanders[idx].ped, FALSE) ENDIF BREAK CASE BG_LEAVE IF GET_SCRIPT_TASK_STATUS(bystanders[idx].ped, SCRIPT_TASK_WANDER_STANDARD) <> PERFORMING_TASK TASK_WANDER_STANDARD(bystanders[idx].ped) ENDIF BREAK ENDSWITCH ENDIF //increment this value iBystanderCounter ++ ENDPROC //aggro checks for bystanders watching the weightlifter FUNC BOOL HAS_PLAYER_ATTACKED_BYSTANDERS(BOOL& bBoolToFlip) //only check one ped per frame IF DO_AGGRO_CHECK(bystanders[iFrameCounter].ped, NULL, aggroArgs, aggroReason, FALSE, FALSE) bBoolToFlip = TRUE RETURN TRUE ENDIF iFrameCounter ++ IF iFrameCounter > NUM_BYSTANDER_PEDS - 1 iFrameCounter = 0 ENDIF RETURN FALSE ENDFUNC //player is most likely in the gym area poiting a gun at the target - this function will ensure that panic is triggered even if the target doesn't see player targetting him FUNC BOOL IS_PLAYER_SEEN_THREATENING_TARGET_BY_BYSTANDERS(PED_INDEX pedTarget, structTimer& timerToCheck, FLOAT fTimeToCheck, FLOAT fDistToCheck, BOOL& bBoolToFlip) IF GET_PLAYER_DISTANCE_FROM_ENTITY(pedTarget) < fDistToCheck IF IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_GUN) IF IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), pedTarget) OR IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), pedTarget) IF NOT IS_TIMER_STARTED(timerToCheck) RESTART_TIMER_NOW(timerToCheck) ELSE IF GET_TIMER_IN_SECONDS(timerToCheck) >= fTimeToCheck bBoolToFlip = TRUE RETURN TRUE ENDIF ENDIF ELSE RESTART_TIMER_NOW(timerToCheck) ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC FUNC VECTOR GET_RANDOM_COORDINATE() VECTOR vToReturn INT iRand iRand = GET_RANDOM_INT_IN_RANGE() % 6 SWITCH iRand CASE 0 vToReturn = << -1328.2563, -1595.2444, 3.4691 >> PRINTLN("vToReturn = ", vToReturn) BREAK CASE 1 vToReturn = << -1226.8425, -1627.8441, 3.0966 >> PRINTLN("vToReturn = ", vToReturn) BREAK CASE 2 vToReturn = << -1277.8651, -1499.7965, 3.4114 >> PRINTLN("vToReturn = ", vToReturn) BREAK CASE 3 vToReturn = << -1245.8002, -1473.1765, 3.2454 >> PRINTLN("vToReturn = ", vToReturn) BREAK CASE 4 vToReturn = << -1153.4226, -1599.5081, 3.3860 >> PRINTLN("vToReturn = ", vToReturn) BREAK CASE 5 vToReturn = << -1272.2239, -1612.4363, 3.0916 >> PRINTLN("vToReturn = ", vToReturn) BREAK DEFAULT vToReturn = << -1272.2239, -1612.4363, 3.0916 >> PRINTLN("DEFAULT: vToReturn = ", vToReturn) BREAK ENDSWITCH RETURN vToReturn ENDFUNC //tasks all bystander peds around weightlifter target to flee PROC TASK_BYSTANDERS_TO_FLEE(BOOL bReleasePeds = FALSE) INT tempInt INT iRandInt IF NOT bTaskedBystandersToFlee FOR tempInt = 0 TO NUM_BYSTANDER_PEDS - 1 IF NOT IS_PED_INJURED(bystanders[tempInt].ped) iRandInt = GET_RANDOM_INT_IN_RANGE() % 3 IF (iRandInt = 0) OR (iRandInt = 1) IF GET_SCRIPT_TASK_STATUS(bystanders[tempInt].ped, SCRIPT_TASK_SMART_FLEE_PED) <> PERFORMING_TASK TASK_SMART_FLEE_PED(bystanders[tempInt].ped, PLAYER_PED_ID(), 200, -1) SET_PED_KEEP_TASK(bystanders[tempInt].ped, TRUE) PRINTLN("TASKING PED TO FLEE, INDEX = ", tempInt) ENDIF ELSE IF GET_SCRIPT_TASK_STATUS(bystanders[tempInt].ped, SCRIPT_TASK_SMART_FLEE_PED) <> PERFORMING_TASK TASK_GO_TO_COORD_ANY_MEANS(bystanders[tempInt].ped, GET_RANDOM_COORDINATE(), PEDMOVEBLENDRATIO_RUN, NULL) SET_PED_KEEP_TASK(bystanders[tempInt].ped, TRUE) PRINTLN("TASKING PED TO GO TO COORDS, INDEX = ", tempInt) ENDIF ENDIF ENDIF IF bReleasePeds SET_PED_AS_NO_LONGER_NEEDED(bystanders[tempInt].ped) ENDIF ENDFOR bTaskedBystandersToFlee = TRUE ENDIF ENDPROC //detects to see if a bullet or explosion has impacted in a volume around where the ropes exist for the washer target and detaches the rope if hit PROC HANDLE_SHOT_ROPE() IF curTarget = ASSASSIN_TARGET_WASHER IF NOT DOES_ROPE_EXIST(ropeWindowA) // PRINTLN("ropeWindowA DOES NOT EXIST") // APPLY_FORCE_TO_ENTITY(objectToDetach, APPLY_TYPE_EXTERNAL_IMPULSE, <<-5,0,-4>>, <<-5,0,0>>, 0, TRUE, TRUE, TRUE) IF NOT IS_PED_INJURED(assArgs.myTarget) IF NOT bRopeDetached SET_ENTITY_LOAD_COLLISION_FLAG(assArgs.myTarget, TRUE) SET_PED_TO_RAGDOLL(assArgs.myTarget, 1, 1, TASK_RELAX) ENDIF ENDIF // IF LOAD_STREAM("WINDOWWASHERFALL_MASTER") // ODDJOB_STOP_SOUND(iSoundIdMulti) // ODDJOB_PLAY_SOUND("WINDOWWASHERFALL_MASTER", iSoundIdMulti, FALSE, NULL, -648.59, 305.73, 120) IF LOAD_STREAM("WINDOWWASHERFALL_MASTER") PLAY_STREAM_FROM_POSITION(<< -648.59, 305.73, 120 >>) PRINTLN("WINDOWWASHERFALL_MASTER PLAYING from ropeWindowA!!!!!") ELSE PRINTLN("WINDOWWASHERFALL_MASTER NOT PLAYING from ropeWindowA") ENDIF // ELSE // PRINTLN("WINDOWWASHERFALL_MASTER NOT LOADED for ropeWindowA!!!!!") // ENDIF // SET_PED_TO_RAGDOLL_WITH_FALL(pedToRagdoll, 500, 1000, TYPE_FROM_HIGH, -GET_ENTITY_FORWARD_VECTOR(pedToRagdoll), 85, <<0,0,0>>, <<0,0,0>>) // SET_CAM_PARAMS(camKill, << -652.6349, 304.7316, 136.5523 >>, << -23.1959, -0.0000, -84.5266 >>, 35) IF IS_FIRST_PERSON_AIM_CAM_ACTIVE() SET_FIRST_PERSON_AIM_CAM_ZOOM_FACTOR(1.0) ENDIF bRopeDetached = TRUE ELIF NOT DOES_ROPE_EXIST(ropeWindowB) // PRINTLN("ropeWindowB DOES NOT EXIST") // APPLY_FORCE_TO_ENTITY(objectToDetach, APPLY_TYPE_EXTERNAL_IMPULSE, <<5,0,-4>>, <<5,0,0>>, 0, TRUE, TRUE, TRUE) IF NOT IS_PED_INJURED(assArgs.myTarget) IF NOT bRopeDetached SET_ENTITY_LOAD_COLLISION_FLAG(assArgs.myTarget, TRUE) SET_PED_TO_RAGDOLL(assArgs.myTarget, 1, 1, TASK_RELAX) ENDIF ENDIF // IF LOAD_STREAM("WINDOWWASHERFALL_MASTER") // ODDJOB_STOP_SOUND(iSoundIdMulti) // ODDJOB_PLAY_SOUND("WINDOWWASHERFALL_MASTER", iSoundIdMulti, FALSE, NULL, -638.19312, 306.01401, 121.42364) IF LOAD_STREAM("WINDOWWASHERFALL_MASTER") PLAY_STREAM_FROM_POSITION(<< -638.19312, 306.01401, 121.42364 >>) //sound of wire breaking PRINTLN("WINDOWWASHERFALL_MASTER PLAYING from ropeWindowB!!!!!") ELSE PRINTLN("WINDOWWASHERFALL_MASTER NOT PLAYING from ropeWindowB") ENDIF PRINTLN("WINDOWWASHERFALL_MASTER PLAYING from ropeWindowB!!!!!") // ELSE // PRINTLN("WINDOWWASHERFALL_MASTER NOT LOADED for ropeWindowB !!!!!") // ENDIF // SET_PED_TO_RAGDOLL_WITH_FALL(pedToRagdoll, 500, 1000, TYPE_FROM_HIGH, -GET_ENTITY_FORWARD_VECTOR(pedToRagdoll), 85, <<0,0,0>>, <<0,0,0>>) // SET_CAM_PARAMS(camKill, << -633.9470, 302.5992, 138.1284 >>, << -34.5233, 0.0000, 73.4838 >>, 35) IF IS_FIRST_PERSON_AIM_CAM_ACTIVE() SET_FIRST_PERSON_AIM_CAM_ZOOM_FACTOR(1.0) ENDIF bRopeDetached = TRUE ENDIF ENDIF ENDPROC ////make the target loop through a series of window washing animations if the player has not triggered panic in the Window Washer assassination //PROC UPDATE_WASHER_ANIMS(ASS_ARGS& args) //// SEQUENCE_INDEX tempSeq // // IF NOT bTaskedWindowWasherAnims // IF NOT bRopeDetached AND bRopeWindingDone // IF NOT IS_PED_INJURED(args.myTarget) // IF NOT IS_PED_RAGDOLL(args.myTarget) // OR NOT IS_ENTITY_IN_AIR(args.myTarget) //// IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_PLAY_ANIM) != PERFORMING_TASK //// CLEAR_SEQUENCE_TASK(tempSeq) //// OPEN_SEQUENCE_TASK(tempSeq) // TASK_PLAY_ANIM(args.myTarget, "oddjobs@assassinate@multi@windowwasher", "_idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) //// CLOSE_SEQUENCE_TASK(tempSeq) //// TASK_PERFORM_SEQUENCE(args.myTarget, tempSeq) //// CLEAR_SEQUENCE_TASK(tempSeq) // // bTaskedWindowWasherAnims = TRUE //// ENDIF // ENDIF // ENDIF // ENDIF // ENDIF //ENDPROC //have target cycle through some flexing poses until the scnearios in the gym are are working PROC UPDATE_BODYBUILDER_ANIMS(ASS_TARGET_DATA& targetData, ASS_ARGS& args) SEQUENCE_INDEX tempSeq FLOAT fTempHead SWITCH curBBAnimStage CASE BB_ANIM_INTRO IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK fTempHead = GET_ENTITY_HEADING(args.myTarget) //make sure target is facing the right way before tasking to cycle through his anims IF fTempHead < targetData.fTargetHead - 20 OR fTempHead > targetData.fTargetHead + 20 IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_ACHIEVE_HEADING) <> PERFORMING_TASK TASK_ACHIEVE_HEADING(args.myTarget, targetData.fTargetHead) ENDIF ELSE OPEN_SEQUENCE_TASK(tempSeq) TASK_PLAY_ANIM(NULL, "oddjobs@assassinate@multi@", "idle_a", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(tempSeq) TASK_PERFORM_SEQUENCE(args.myTarget, tempSeq) CLEAR_SEQUENCE_TASK(tempSeq) ENDIF ENDIF BREAK ENDSWITCH ENDPROC //tells ped to turn and face the player and play the appropriate anim PROC FACE_PLAYER_AND_PLAY_ANIM(PED_INDEX ped, STRING animDict, STRING animString) SEQUENCE_INDEX tempSeq CLEAR_PED_TASKS(ped) CLEAR_SEQUENCE_TASK(tempSeq) OPEN_SEQUENCE_TASK(tempSeq) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID()) TASK_PLAY_ANIM(NULL, animDict, animString, SLOW_BLEND_IN, SLOW_BLEND_OUT) CLOSE_SEQUENCE_TASK(tempSeq) TASK_PERFORM_SEQUENCE(ped, tempSeq) CLEAR_SEQUENCE_TASK(tempSeq) ENDPROC //gets closest bystander ped to VECTOR and distance passed in FUNC PED_INDEX GET_CLOSEST_BYSTANDER(BOOL bSearchForMale, VECTOR vSearchLoc, FLOAT fProbeDist) INT tempInt FLOAT fDist = fProbeDist FLOAt fCurDist PED_INDEX pedToReturn FOR tempInt = 0 TO NUM_BYSTANDER_PEDS - 1 IF NOT IS_PED_INJURED(bystanders[tempInt].ped) IF bSearchForMale AND IS_PED_MALE(bystanders[tempInt].ped) OR ( NOT bSearchForMale AND NOT IS_PED_MALE(bystanders[tempInt].ped) ) fCurDist = GET_ENTITY_DISTANCE_FROM_LOCATION(bystanders[tempInt].ped, vSearchLoc) IF fCurDist <= fDist pedToReturn = bystanders[tempInt].ped fDist = fCurDist ENDIF ENDIF ENDIF ENDFOR RETURN pedToReturn ENDFUNC //have bodybuilder start talking shit and reacting with anims to the player as he warns the player for getting too close PROC MANAGE_BODYBUILDER_WARNING_BEHAVIOR(ASS_ARGS& args) IF NOT IS_PED_INJURED(args.myTarget) //turn and face player and play line IF iWarningSpeechStage = 0 FACE_PLAYER_AND_PLAY_ANIM(args.myTarget, "misscommon@response", "bring_it_on") RESTART_TIMER_NOW(warningTimer) iWarningSpeechStage ++ PRINTLN("iWarningSpeechStage = ", iWarningSpeechStage) ELIF iWarningSpeechStage = 1 IF IS_ENTITY_PLAYING_ANIM(args.myTarget, "misscommon@response", "bring_it_on") CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASml_bbWN1", CONV_PRIORITY_HIGH) //"No pussies allowed in this gym buddy. Better leave before you trip over a dumbbell." RESTART_TIMER_NOW(warningTimer) iWarningSpeechStage ++ PRINTLN("iWarningSpeechStage = ", iWarningSpeechStage) ENDIF //wait to see if the player has walked away or is still bothering the target ELIF iWarningSpeechStage = 2 IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_PLAY_ANIM) <> PERFORMING_TASK AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF GET_TIMER_IN_SECONDS(warningTimer) > 5.5 IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) > 3.5 bWarning = FALSE ENDIF iWarningSpeechStage ++ PRINTLN("iWarningSpeechStage = ", iWarningSpeechStage) ENDIF ENDIF //turn and face the player and warn him once more ELIF iWarningSpeechStage = 3 IF bWarning FACE_PLAYER_AND_PLAY_ANIM(args.myTarget, "misscommon@response", "threaten") RESTART_TIMER_NOW(warningTimer) iWarningSpeechStage ++ PRINTLN("iWarningSpeechStage = ", iWarningSpeechStage) ENDIF ELIF iWarningSpeechStage = 4 IF IS_ENTITY_PLAYING_ANIM(args.myTarget, "misscommon@response", "threaten") CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASml_bbWN2", CONV_PRIORITY_HIGH) //"Did you hear me numbnuts? Get outta here before I smash you." RESTART_TIMER_NOW(warningTimer) iWarningSpeechStage ++ PRINTLN("iWarningSpeechStage = ", iWarningSpeechStage) ENDIF //react appropriately if the player continues to approach the target ELIF iWarningSpeechStage = 5 IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_PLAY_ANIM) <> PERFORMING_TASK IF GET_TIMER_IN_SECONDS(warningTimer) > 7 IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < 3.5 bPanicking = TRUE // PRINTLN("bPanicking = TRUE") ELSE bWarning = FALSE // PRINTLN("bWarning = FALSE") ENDIF ELSE // PRINTLN("TIMER STILL GOING") ENDIF ELSE // PRINTLN("BODY BUILDER STILL PERFORMING ANIMATION") ENDIF ENDIF ENDIF ENDPROC //manages idle chatter from target and onlookers when there has not been any panic triggered yet in the bodybuilder event PROC MANAGE_BODYBUILDER_IDLE_SPEECH(ASS_ARGS& args) // PED_INDEX pedToSpeak IF NOT IS_TIMER_STARTED(speechTimerTarget) RESTART_TIMER_NOW(speechTimerTarget) ELSE IF iIdleSpeechStage < 7 IF GET_TIMER_IN_SECONDS(speechTimerTarget) > fSpeechTime AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() SWITCH iIdleSpeechStage CASE 0 CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASml_bbId0", CONV_PRIORITY_HIGH) BREAK CASE 1 ADD_PED_FOR_DIALOGUE(args.assConv, 4, bystanders[0].ped, "OJAmlGymOnlookerF") CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASml_bbBY1", CONV_PRIORITY_HIGH) BREAK CASE 2 CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASml_bbId2", CONV_PRIORITY_HIGH) BREAK CASE 3 CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASml_bbBY3", CONV_PRIORITY_HIGH) BREAK CASE 4 CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASml_bbId0", CONV_PRIORITY_HIGH) BREAK ENDSWITCH //restart timer and increment speech stage RESTART_TIMER_NOW(speechTimerTarget) fSpeechTime = GET_RANDOM_FLOAT_IN_RANGE(5, 8) iIdleSpeechStage ++ ENDIF ENDIF ENDIF ENDPROC //manages bodybuilder speech while he is in the gym area PROC UPDATE_BODYBUILDER_SPEECH(ASS_ARGS& args) IF NOT IS_PED_INJURED(args.myTarget) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF NOT bPanicking IF NOT bWarning IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < 3.5 bWarning = TRUE ELSE IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < 20 AND NOT IS_MESSAGE_BEING_DISPLAYED() //bodybuilder idle chatter as he is showing off to onlookers MANAGE_BODYBUILDER_IDLE_SPEECH(args) ENDIF ENDIF ELSE //have bodybuilder interact with target and threaten him MANAGE_BODYBUILDER_WARNING_BEHAVIOR(args) ENDIF ELSE IF NOT bPanicLinePlayed IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_SMART_FLEE_PED) = PERFORMING_TASK CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASml_bbHLP", CONV_PRIORITY_HIGH) //"Someone help! I can't go out like this!" bPanicLinePlayed = TRUE ENDIF ENDIF IF NOT bThreatenLinePlayed IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_COMBAT) = PERFORMING_TASK IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < 15 CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASml_bbKIL", CONV_PRIORITY_HIGH) //"Oh hell no! Do you have any idea who I am? I'll rip you apart!" bThreatenLinePlayed = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC //updating anims for 2 peds on yacht getting/giving lap dance PROC UPDATE_YACHT_PEDS(ASS_ARGS& args) VECTOR vGuyOffsetPosition = <<-0.78, -4.48, 1.05>> VECTOR vGuyOffsetRotation = <<0, 0, 275.04>> VECTOR vGirlOffsetPosition = <<-0.18, -4.450, 1.5>> VECTOR vGirlOffsetRotation = <<0, 0, 0>> IF IS_VEHICLE_DRIVEABLE(args.myVehicle) IF NOT IS_PED_INJURED(args.myTarget) IF NOT IS_ENTITY_PLAYING_ANIM(args.myTarget, "oddjobs@assassinate@multi@yachttarget@lapdance", "yacht_ld_m") TASK_PLAY_ANIM(args.myTarget, "oddjobs@assassinate@multi@yachttarget@lapdance", "yacht_ld_m", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) ENDIF IF NOT IS_ENTITY_ATTACHED(args.myTarget) ATTACH_ENTITY_TO_ENTITY(args.myTarget, args.myVehicle, 0, vGuyOffsetPosition, vGuyOffsetRotation, TRUE, TRUE) ENDIF ENDIF IF NOT IS_PED_INJURED(args.myOtherPed) IF NOT IS_ENTITY_PLAYING_ANIM(args.myOtherPed, "oddjobs@assassinate@multi@yachttarget@lapdance", "yacht_ld_f") TASK_PLAY_ANIM(args.myOtherPed, "oddjobs@assassinate@multi@yachttarget@lapdance", "yacht_ld_f", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) ENDIF IF NOT IS_ENTITY_ATTACHED(args.myOtherPed) ATTACH_ENTITY_TO_ENTITY(args.myOtherPed, args.myVehicle, 0, vGirlOffsetPosition, vGirlOffsetRotation, TRUE, TRUE, TRUE) ENDIF ENDIF ENDIF ENDPROC ////shows the target play the pissing anim and then walk to his vehicle //PROC UPDATE_BIKER_IN_CUTSCENE(ASS_ARGS& args) // SEQUENCE_INDEX tempSeq // // IF NOT IS_PED_INJURED(args.myTarget) // IF IS_VEHICLE_DRIVEABLE(args.myVehicle) // IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK // SET_VEHICLE_ON_GROUND_PROPERLY(args.myVehicle) // // OPEN_SEQUENCE_TASK(tempSeq) // TASK_ENTER_VEHICLE(NULL, args.myVehicle, DEFAULT_TIME_BEFORE_WARP, VS_DRIVER, PEDMOVEBLENDRATIO_WALK) // CLOSE_SEQUENCE_TASK(tempSeq) // TASK_PERFORM_SEQUENCE(args.myTarget, tempSeq) // CLEAR_SEQUENCE_TASK(tempSeq) // ENDIF // ENDIF // ENDIF //ENDPROC PROC RESTART_SPEECH_TIMER_AND_ASSIGN_RANDOM_DELAY() RESTART_TIMER_NOW(speechTimerTarget) fSpeechTime = GET_RANDOM_FLOAT_IN_RANGE(3, 7) ENDPROC FUNC BOOL CAN_DIALOGUE_PLAY_WITH_DELAY() IF IS_TIMER_STARTED(speechTimerTarget) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND GET_TIMER_IN_SECONDS(speechTimerTarget) > fSpeechTime RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC PROC ADVANCE_IDLE_LINE_AND_RESTART_IDLE_DIALOGUE_TIMER() iDialogueIdleLine ++ iLineIDXToPlay = -1 RESTART_SPEECH_TIMER_AND_ASSIGN_RANDOM_DELAY() PRINTLN("iDialogueIdleLine = ", iDialogueIdleLine) ENDPROC /// PURPOSE: /// Goes through a series of dialogue lines that should be played by the yachtsman when idle PROC HANDLE_YACHTSMAN_PLAYING_IDLE_LINES() SWITCH iDialogueIdleLine CASE 0 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF iLineIDXToPlay = -1 iLineIDXToPlay = GET_RANDOM_INT_IN_RANGE(0, 4) ELSE IF iLineIDXToPlay = 0 IF PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytT1", "OJASml_ytT1_1", CONV_PRIORITY_VERY_HIGH) ADVANCE_IDLE_LINE_AND_RESTART_IDLE_DIALOGUE_TIMER() ENDIF ELIF iLineIDXToPlay = 1 IF PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytT1", "OJASml_ytT1_2", CONV_PRIORITY_HIGH) ADVANCE_IDLE_LINE_AND_RESTART_IDLE_DIALOGUE_TIMER() ENDIF ELIF iLineIDXToPlay = 2 IF PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytT1", "OJASml_ytT1_3", CONV_PRIORITY_HIGH) ADVANCE_IDLE_LINE_AND_RESTART_IDLE_DIALOGUE_TIMER() ENDIF ELSE IF PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytT1", "OJASml_ytT1_4", CONV_PRIORITY_HIGH) ADVANCE_IDLE_LINE_AND_RESTART_IDLE_DIALOGUE_TIMER() ENDIF ENDIF ENDIF ENDIF BREAK CASE 1 IF CAN_DIALOGUE_PLAY_WITH_DELAY() IF iLineIDXToPlay = -1 iLineIDXToPlay = GET_RANDOM_INT_IN_RANGE(0, 4) ELSE IF iLineIDXToPlay = 0 IF PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytT1", "OJASml_ytT1_5", CONV_PRIORITY_VERY_HIGH) ADVANCE_IDLE_LINE_AND_RESTART_IDLE_DIALOGUE_TIMER() ENDIF ELIF iLineIDXToPlay = 1 IF PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytT1", "OJASml_ytT1_6", CONV_PRIORITY_HIGH) ADVANCE_IDLE_LINE_AND_RESTART_IDLE_DIALOGUE_TIMER() ENDIF ELIF iLineIDXToPlay = 2 IF PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytT1", "OJASml_ytT1_7", CONV_PRIORITY_HIGH) ADVANCE_IDLE_LINE_AND_RESTART_IDLE_DIALOGUE_TIMER() ENDIF ELSE IF PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytT1", "OJASml_ytT1_8", CONV_PRIORITY_HIGH) ADVANCE_IDLE_LINE_AND_RESTART_IDLE_DIALOGUE_TIMER() ENDIF ENDIF ENDIF ENDIF BREAK CASE 2 IF CAN_DIALOGUE_PLAY_WITH_DELAY() IF iLineIDXToPlay = -1 iLineIDXToPlay = GET_RANDOM_INT_IN_RANGE(0, 3) ELSE IF iLineIDXToPlay = 0 IF PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytT1", "OJASml_ytT1_9", CONV_PRIORITY_VERY_HIGH) ADVANCE_IDLE_LINE_AND_RESTART_IDLE_DIALOGUE_TIMER() ENDIF ELIF iLineIDXToPlay = 1 IF PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytT1", "OJASml_ytT1_10", CONV_PRIORITY_HIGH) ADVANCE_IDLE_LINE_AND_RESTART_IDLE_DIALOGUE_TIMER() ENDIF ELIF iLineIDXToPlay = 2 IF PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytT1", "OJASml_ytT1_11", CONV_PRIORITY_HIGH) ADVANCE_IDLE_LINE_AND_RESTART_IDLE_DIALOGUE_TIMER() ENDIF ENDIF ENDIF ENDIF BREAK // CASE 3 // IF CAN_DIALOGUE_PLAY_WITH_DELAY() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytT1", "OJASml_ytT1_4", CONV_PRIORITY_HIGH) // RESTART_SPEECH_TIMER_AND_ASSIGN_RANDOM_DELAY() // iDialogueIdleLine ++ // ENDIF // BREAK // CASE 4 // IF CAN_DIALOGUE_PLAY_WITH_DELAY() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytT1", "OJASml_ytT1_5", CONV_PRIORITY_HIGH) // RESTART_SPEECH_TIMER_AND_ASSIGN_RANDOM_DELAY() // iDialogueIdleLine ++ // ENDIF // BREAK // CASE 5 // IF CAN_DIALOGUE_PLAY_WITH_DELAY() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytT1", "OJASml_ytT1_6", CONV_PRIORITY_HIGH) // RESTART_SPEECH_TIMER_AND_ASSIGN_RANDOM_DELAY() // iDialogueIdleLine ++ // ENDIF // BREAK // CASE 6 // IF CAN_DIALOGUE_PLAY_WITH_DELAY() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytT1", "OJASml_ytT1_7", CONV_PRIORITY_HIGH) // RESTART_SPEECH_TIMER_AND_ASSIGN_RANDOM_DELAY() // iDialogueIdleLine ++ // ENDIF // BREAK // CASE 7 // IF CAN_DIALOGUE_PLAY_WITH_DELAY() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytT1", "OJASml_ytT1_8", CONV_PRIORITY_HIGH) // RESTART_SPEECH_TIMER_AND_ASSIGN_RANDOM_DELAY() // iDialogueIdleLine ++ // ENDIF // BREAK // CASE 8 // IF CAN_DIALOGUE_PLAY_WITH_DELAY() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytT1", "OJASml_ytT1_9", CONV_PRIORITY_HIGH) // RESTART_SPEECH_TIMER_AND_ASSIGN_RANDOM_DELAY() // iDialogueIdleLine ++ // ENDIF // BREAK // CASE 9 // IF CAN_DIALOGUE_PLAY_WITH_DELAY() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytT1", "OJASml_ytT1_10", CONV_PRIORITY_HIGH) // RESTART_SPEECH_TIMER_AND_ASSIGN_RANDOM_DELAY() // iDialogueIdleLine ++ // ENDIF // BREAK // CASE 10 // IF CAN_DIALOGUE_PLAY_WITH_DELAY() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytT1", "OJASml_ytT1_11", CONV_PRIORITY_HIGH) // RESTART_SPEECH_TIMER_AND_ASSIGN_RANDOM_DELAY() // iDialogueIdleLine ++ // ENDIF // BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Goes through a series of dialogue lines that should be played if the player is fucking around near the yacht /// PARAMS: /// iDiagLine - Dialogue Line counter to be used. Increments after a line is played /// RETURNS: /// TRUE if all warning lines have been exhausted FUNC BOOL HAS_YACHTSMAN_PLAYED_ALL_WARNING_LINES(INT& iDiagLine) SWITCH iDiagLine CASE 0 CREATE_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_spot", CONV_PRIORITY_VERY_HIGH) TASK_LOOK_AT_ENTITY(assArgs.myTarget, PLAYER_PED_ID(), 5000) iDiagLine ++ BREAK CASE 1 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_get", "OJASml_get_1", CONV_PRIORITY_HIGH) // Mike - I had to switch this, because it kept playing the same line over, since it's random... we should be okay to play the convo. CREATE_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_get", CONV_PRIORITY_HIGH) TASK_LOOK_AT_ENTITY(assArgs.myTarget, PLAYER_PED_ID(), 5000) RETURN TRUE ENDIF BREAK // CASE 2 // IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_get", "OJASml_get_2", CONV_PRIORITY_HIGH) // iDiagLine ++ // ENDIF // BREAK // CASE 3 // IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_get", "OJASml_get_3", CONV_PRIORITY_HIGH) // RETURN TRUE // ENDIF // BREAK ENDSWITCH RETURN FALSE ENDFUNC /// PURPOSE: /// Goes through a series of dialogue lines that should be played by the yachtsman after panic has been triggered /// PARAMS: /// iDiagLine - Dialogue Line counter to be used. Increments after a line is played /// RETURNS: /// TRUE if all panic lines have been exhausted FUNC BOOL HAS_YACHTSMAN_PLAYED_ALL_PANIC_LINES(INT& iDiagLine) SWITCH iDiagLine CASE 0 CREATE_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_ytTP2", CONV_PRIORITY_HIGH) iDiagLine ++ BREAK CASE 1 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_beg", "OJASml_beg_1", CONV_PRIORITY_HIGH) CREATE_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_beg", CONV_PRIORITY_HIGH) RETURN TRUE ENDIF BREAK // CASE 2 // IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_beg", "OJASml_beg_2", CONV_PRIORITY_HIGH) // iDiagLine ++ // ENDIF // BREAK // CASE 3 // IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_beg", "OJASml_beg_3", CONV_PRIORITY_HIGH) // RETURN TRUE // ENDIF // BREAK ENDSWITCH RETURN FALSE ENDFUNC /// PURPOSE: /// Goes through a series of dialogue lines that should be played by the yachtsman after panic has been triggered /// PARAMS: /// iDiagLine - Dialogue Line counter to be used. Increments after a line is played /// RETURNS: /// TRUE if all panic lines have been exhausted FUNC BOOL HAS_WASHER_PLAYED_ALL_PANIC_LINES(INT& iDiagLine) SWITCH iDiagLine CASE 0 CREATE_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_wwTP2", CONV_PRIORITY_HIGH) iDiagLine ++ BREAK CASE 1 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_wwPAN", "OJASml_wwPAN_1", CONV_PRIORITY_HIGH) CREATE_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_wwPAN", CONV_PRIORITY_HIGH) RETURN TRUE ENDIF BREAK // CASE 2 // IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_wwPAN", "OJASml_wwPAN_2", CONV_PRIORITY_HIGH) // iDiagLine ++ // ENDIF // BREAK // CASE 3 // IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_wwPAN", "OJASml_wwPAN_3", CONV_PRIORITY_HIGH) // RETURN TRUE // ENDIF // BREAK ENDSWITCH RETURN FALSE ENDFUNC /// PURPOSE: /// Goes through a series of dialogue lines that should be played by the yachtsman after panic has been triggered /// PARAMS: /// iDiagLine - Dialogue Line counter to be used. Increments after a line is played /// RETURNS: /// TRUE if all panic lines have been exhausted FUNC BOOL HAS_BIKER_PLAYED_ALL_PANIC_LINES(INT& iDiagLine) SWITCH iDiagLine CASE 0 CREATE_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_bkTP1", CONV_PRIORITY_HIGH) //Jesus, put the gun down! RESTART_SPEECH_TIMER_AND_ASSIGN_RANDOM_DELAY() iDiagLine ++ BREAK CASE 1 IF CAN_DIALOGUE_PLAY_WITH_DELAY() CREATE_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_bkTP2", CONV_PRIORITY_HIGH) //begs for his life RETURN TRUE ENDIF BREAK // CASE 2 // IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_bkTP1", "OJASml_bkTP1_3", CONV_PRIORITY_HIGH) //Jesus, what do you want from me? // iDiagLine ++ // ENDIF // BREAK // CASE 3 // IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_bkSHT", "OJASml_bkSHT_1", CONV_PRIORITY_HIGH) //What the hell are you doing? // iDiagLine ++ // ENDIF // BREAK // CASE 4 // IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_bkSHT", "OJASml_bkSHT_2", CONV_PRIORITY_HIGH) //Are you crazy? // iDiagLine ++ // ENDIF // BREAK // CASE 5 // IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_bkSHT", "OJASml_bkSHT_3", CONV_PRIORITY_HIGH) //Get away from me! // iDiagLine ++ // ENDIF // BREAK // CASE 6 // IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_bkSHT", "OJASml_bkSHT_4", CONV_PRIORITY_HIGH) //What is wrong with you? // iDiagLine ++ // ENDIF // BREAK // CASE 7 // IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // PLAY_SINGLE_LINE_FROM_CONVERSATION(assArgs.assConv, "OJASAUD", "OJASml_bkSHT", "OJASml_bkSHT_5", CONV_PRIORITY_HIGH) //I'm serious, man. Back off! // RETURN TRUE // ENDIF // BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC BOOL IS_PLAYER_JACKING_OR_TOUCHING_YACHT(ASS_ARGS& args) IF IS_VEHICLE_DRIVEABLE(args.myVehicle) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), args.myVehicle, TRUE) OR IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), args.myVehicle) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC PROC CREATE_VEHICLES_AT_GAS_STATION_OF_PHONE_CUTSCENE() IF NOT DOES_ENTITY_EXIST(viGasStationVehicle[0]) viGasStationVehicle[0] = CREATE_VEHICLE(modelParkedVehicle[0], <<-723.8201, -916.5402, 18.0145>>, 267.7980) // - parking spot ENDIF IF NOT DOES_ENTITY_EXIST(viGasStationVehicle[1]) viGasStationVehicle[1] = CREATE_VEHICLE(modelParkedVehicle[1], <<-735.5003, -931.6205, 18.0173>>, 359.3239) // - pump near phone SET_ENTITY_LOD_DIST(viGasStationVehicle[1], 100) ENDIF IF NOT DOES_ENTITY_EXIST(viGasStationVehicle[2]) viGasStationVehicle[2] = CREATE_VEHICLE(modelParkedVehicle[0], <<-726.7143, -940.2681, 18.0173>>, 178.3615) // - pump away from phone ENDIF IF NOT DOES_ENTITY_EXIST(viGasStationVehicle[3]) viGasStationVehicle[3] = CREATE_VEHICLE(modelParkedVehicle[2], <<-730.5711, -909.9425, 18.0349>>, 357.4066) // - in corner ENDIF ENDPROC PROC CLEANUP_VEHICLES_AT_GAS_STATION_OF_PHONE_CUTSCENE() INT idx REPEAT NUM_GAS_STATION_VEHICLES idx IF DOES_ENTITY_EXIST(viGasStationVehicle[idx]) SET_VEHICLE_AS_NO_LONGER_NEEDED(viGasStationVehicle[idx]) ENDIF ENDREPEAT ENDPROC //go through and initialize the model array slots to DUMMY_MODEL_FOR_SCRIPT to clear them all out PROC RESET_MODEL_ARRAY(STREAMED_MODEL& streamedModel[]) INT modelIndex REPEAT COUNT_OF(streamedModel) modelIndex streamedModel[modelIndex].thisModel = DUMMY_MODEL_FOR_SCRIPT ENDREPEAT ENDPROC //go through and initialize the anim array slots to NULL STRINGS to clear them all out PROC RESET_ANIM_ARRAY(STREAMED_ANIM& streamedAnim[]) INT animIndex REPEAT COUNT_OF(streamedAnim) animIndex streamedAnim[animIndex].thisAnim = NULL_STRING() ENDREPEAT ENDPROC PROC SET_ALL_PEDS_USED_IN_MISSION_AS_NO_LONGER_NEEDED(ASS_ARGS& args, ASS_TARGET_DATA& targetData) SET_BODYBUILDER_PEDS_AND_MODELS_AS_NO_LONGER_NEEDED(args, targetData) SET_YACHT_PEDS_AND_MODELS_AS_NO_LONGER_NEEDED(args, targetData) SET_WASHER_PEDS_AND_MODELS_AS_NO_LONGER_NEEDED(args, targetData) SET_BIKER_PEDS_AND_MODELS_AS_NO_LONGER_NEEDED(args, targetData) ENDPROC //resets all models/variables to their default state so that they can be ready for the next target PROC RESET_TARGET_DATA(ASS_TARGET_DATA& targetData, ASS_ARGS& args) INT idx SET_PARKED_VEHICLE_MODELS_AS_NO_LONGER_NEEDED() CLEANUP_VEHICLES_AT_GAS_STATION_OF_PHONE_CUTSCENE() SET_ALL_PEDS_USED_IN_MISSION_AS_NO_LONGER_NEEDED(args, targetData) SET_ALL_MODELS_AS_NO_LONGER_NEEDED(targetData.streamedModels) SET_ALL_ANIMS_AS_NO_LONGER_NEEDED(targetData.streamedAnims) RESET_MODEL_ARRAY(targetData.streamedModels) RESET_ANIM_ARRAY(targetData.streamedAnims) CLEANUP_LOAD_QUEUE_LARGE(sLoadQueue) // To Fix Bug # 929669 args.myTarget = NULL // SET_PED_AS_NO_LONGER_NEEDED(args.myTarget) IF curTarget != ASSASSIN_TARGET_YACHT SET_VEHICLE_AS_NO_LONGER_NEEDED(args.myVehicle) IF DOES_ENTITY_EXIST(viYacht) SET_VEHICLE_AS_NO_LONGER_NEEDED(viYacht) ENDIF ELSE IF DOES_ENTITY_EXIST(args.myVehicle) viYacht = args.myVehicle //assign the yacht vehicle index. we will clear this up the next time this function is called (to fix bug 1490795 - 6/20/13 MB) ENDIF ENDIF IF DOES_ENTITY_EXIST(viJetski) SET_VEHICLE_AS_NO_LONGER_NEEDED(viJetski) ENDIF IF DOES_ENTITY_EXIST(viRestStopCar) SET_VEHICLE_AS_NO_LONGER_NEEDED(viRestStopCar) ENDIF IF DOES_ENTITY_EXIST(viRestStopCamper) SET_VEHICLE_AS_NO_LONGER_NEEDED(viRestStopCamper) ENDIF bPanicking = FALSE iIdleSpeechStage = 0 iKillCamStage = 0 bThreatenLinePlayed = FALSE bPanicLinePlayed = FALSE bRopeDetached = FALSE bGaveTextMessage = FALSE iDialogueLine = 0 bTargetKillLinePlayed = FALSE bPedsForCurrentTargetCreated = FALSE bPoliceChaseLinePlayed = FALSE bSplashSoundPlayed = FALSE bNewsReportPlayed = FALSE FOR idx = 3 TO 9 REMOVE_PED_FOR_DIALOGUE(args.assConv, idx) ENDFOR ENDPROC /// PURPOSE: /// Calls SET_PED_RESET_FLAG(assArgs.myTarget, PRF_SuppressLethalMeleeActions, TRUE) every frame to disallow targets from being knocked out in one punch PROC DISABLE_KNOCKOUT_ON_TARGET() IF DOES_ENTITY_EXIST(assArgs.myTarget) IF NOT IS_PED_INJURED(assArgs.myTarget) SET_PED_RESET_FLAG(assArgs.myTarget, PRF_PreventAllMeleeTakedowns, TRUE) SET_PED_RESET_FLAG(assArgs.myTarget, PRF_SuppressLethalMeleeActions, TRUE) ENDIF ENDIF ENDPROC //update loop that runs while the bodybuilder target is active PROC UPDATE_TARGET_BODYBUILDER(ASS_TARGET_DATA& targetData, ASS_ARGS& args) PED_INDEX pedToSpeak WEAPON_TYPE wtPlayerIsUsing BOOL bOkayToCheck //to try and fix bug 1147295 - Characters can be assassinated with a single punch. - 3/2/13 - MB DISABLE_KNOCKOUT_ON_TARGET() SWITCH curTargetStage CASE TARGET_STAGE_BLIP_TARGET CREATE_CURRENT_TARGET_BLIP(args) curTargetStage = TARGET_STAGE_WAITING BREAK CASE TARGET_STAGE_WAITING IF DO_AGGRO_CHECK(args.myTarget, NULL, aggroArgs, aggroReason, TRUE, FALSE) OR HAS_PLAYER_ATTACKED_BYSTANDERS(bAttackedBystanders) OR IS_PLAYER_SEEN_THREATENING_TARGET_BY_BYSTANDERS(args.myTarget, aimTimer, 1.0, 20.0, bSeenAimingAtTarget) OR ( ARE_COPS_NEAR_TARGET_WHILE_PLAYER_IS_WANTED(args.myTarget, 25) AND bPanicking ) OR IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_DONTCARE, << -1218.0418 , -1549.6161, -3.3703 >>, << -1185.3494, -1597.1029, 10.5993 >>, 46.0) OR bPanicking STOP_SCRIPTED_CONVERSATION(FALSE) IF GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), wtPlayerIsUsing) IF wtPlayerIsUsing <> WEAPONTYPE_INVALID bOkayToCheck = TRUE PRINTLN("bOkayToCheck = TRUE") ENDIF ENDIF IF IS_PED_SHOOTING(PLAYER_PED_ID()) OR (bOkayToCheck AND (wtPlayerIsUsing <> WEAPONTYPE_UNARMED)) TASK_SMART_FLEE_PED(args.myTarget, PLAYER_PED_ID(), 500, -1) PRINTLN("TASKING BODYBUILDER TO FLEE") ELSE TASK_COMBAT_PED(args.myTarget, PLAYER_PED_ID()) ENDIF TASK_BYSTANDERS_TO_FLEE() SET_ENTITY_LOAD_COLLISION_FLAG(args.myTarget, TRUE) bPanicking = TRUE curTargetStage = TARGET_STAGE_PANICKING ELSE IF NOT IS_PED_INJURED(args.myTarget) IF NOT bWarning UPDATE_BODYBUILDER_ANIMS(targetData, args) ENDIF //update peds leaving and arriving at scene // UPDATE_BYSTANDERS_LEAVING_AREA(5, 8) // UPDATE_BYSTANDERS_ARRIVING(3) UPDATE_BYSTANDERS_STATES() ENDIF ENDIF BREAK CASE TARGET_STAGE_PANICKING IF bAttackedBystanders OR bSeenAimingAtTarget pedToSpeak = GET_CLOSEST_BYSTANDER(FALSE, GET_ENTITY_COORDS(PLAYER_PED_ID()), 20) IF pedToSpeak <> NULL ADD_PED_FOR_DIALOGUE(args.assConv, 4, pedToSpeak, "OJAmlGymOnlookerF") ENDIF IF bAttackedBystanders IF NOT bPlayedBystanderPanicLine IF CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASml_bbWN3", CONV_PRIORITY_HIGH) //"Help! What are you doing? No! bPlayedBystanderPanicLine = TRUE PRINTLN("bPlayedBystanderPanicLine = TRUE - 01") ENDIF ENDIF ELSE IF NOT bPlayedBystanderPanicLine IF CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASml_bbWN4", CONV_PRIORITY_HIGH) //"Run! He has a gun! bPlayedBystanderPanicLine = TRUE PRINTLN("bPlayedBystanderPanicLine = TRUE - 02") ENDIF ENDIF ENDIF ENDIF IF NOT IS_PED_INJURED(args.myTarget) IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_SMART_FLEE_PED) <> PERFORMING_TASK IF IS_PED_SHOOTING(PLAYER_PED_ID()) CLEAR_PED_TASKS(args.myTarget) TASK_SMART_FLEE_PED(args.myTarget, PLAYER_PED_ID(), 500, -1) PRINTLN("TASKING BODY BUILDER TO FLEE - 01") ENDIF ENDIF ENDIF IF HAS_TARGET_ESCAPED(args.myTarget, fFailDist) SET_MISSION_FAILED(assArgs, targetData, FAIL_PED_ESCAPED) ENDIF BREAK ENDSWITCH //update the bodybuilder / bystander speech UPDATE_BODYBUILDER_SPEECH(args) ENDPROC //update loop that runs while the yacht target is active PROC UPDATE_TARGET_YACHT(ASS_TARGET_DATA& targetData, ASS_ARGS& args) SEQUENCE_INDEX tempSeq FLOAT fPlayerDist FLOAT fScenePhase // INT iBoneIndex SWITCH curTargetStage CASE TARGET_STAGE_BLIP_TARGET CREATE_CURRENT_TARGET_BLIP(args) IF NOT IS_ENTITY_DEAD(args.myVehicle) SET_BOAT_SINKS_WHEN_WRECKED(args.myVehicle, TRUE) ENDIF IF NOT IS_ENTITY_DEAD(args.myTarget) SET_RAGDOLL_BLOCKING_FLAGS(args.myTarget, RBF_PLAYER_IMPACT) ENDIF IF NOT IS_ENTITY_DEAD(args.myOtherPed) SET_RAGDOLL_BLOCKING_FLAGS(args.myOtherPed, RBF_PLAYER_IMPACT) SET_ENTITY_HEALTH(args.myOtherPed, 105) PRINTLN("SETTIGN YACHT GIRL HEALTH TO 105") ENDIF REQUEST_ANIM_DICT("veh@boat@marquis@rps@enter_exit") PRINTLN("GOING TO STATE - TARGET_STAGE_WAITING") curTargetStage = TARGET_STAGE_WAITING BREAK CASE TARGET_STAGE_WAITING fPlayerDist = GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) IF DO_AGGRO_CHECK(args.myTarget, args.myVehicle, aggroArgs, aggroReason, FALSE) OR DO_AGGRO_CHECK(args.myOtherPed, args.myVehicle, aggroArgs, aggroReason, FALSE) OR IS_PLAYER_JACKING_OR_TOUCHING_YACHT(args) OR ( ARE_COPS_NEAR_TARGET_WHILE_PLAYER_IS_WANTED(args.myTarget, 50) AND bPanicking ) IF NOT IS_PED_INJURED(args.myTarget) IF fPlayerDist <= 75 IF NOT IS_ENTITY_DEAD(args.myVehicle) IF HAS_ANIM_DICT_LOADED("veh@boat@marquis@rps@enter_exit") iSceneId = CREATE_SYNCHRONIZED_SCENE (<<0,0,0>>, <<0,0,0>>) ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSceneId, args.myVehicle, GET_ENTITY_BONE_INDEX_BY_NAME(args.myVehicle, "seat_dside_r")) TASK_SYNCHRONIZED_SCENE(args.myTarget, iSceneId, "veh@boat@marquis@rps@enter_exit", "jump_out", SLOW_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_NONE, RBF_BULLET_IMPACT) PRINTLN("TASKING TO JUMP OUT") ENDIF ENDIF ELSE bAggroAtDistance = TRUE IF NOT IS_ENTITY_DEAD(args.myVehicle) iSceneId = CREATE_SYNCHRONIZED_SCENE (<<0,0,0>>, <<0,0,0>>) ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSceneId, args.myVehicle, GET_ENTITY_BONE_INDEX_BY_NAME(args.myVehicle, "seat_dside_r")) TASK_SYNCHRONIZED_SCENE(args.myTarget, iSceneId, "oddjobs@assassinate@multi@yachttarget@lapdance", "exit_steer_m", SLOW_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_NONE, RBF_BULLET_IMPACT) PRINTLN("TASKING TO PLAY GO TO DRIVER SEAT") ENDIF ENDIF ENDIF IF NOT IS_PED_INJURED(args.myOtherPed) //girl on yacht OPEN_SEQUENCE_TASK(tempSeq) IF fPlayerDist <= 75 TASK_PLAY_ANIM(NULL, "oddjobs@assassinate@multi@yachttarget@lapdance", "exit_quick_f") TASK_PLAY_ANIM(NULL, "oddjobs@assassinate@multi@yachttarget@lapdance", "exit_cower_loop_f", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) ELSE TASK_PLAY_ANIM(NULL, "oddjobs@assassinate@multi@yachttarget@lapdance", "exit_steer_f") TASK_PLAY_ANIM(NULL, "oddjobs@assassinate@multi@yachttarget@lapdance", "exit_cower_loop_f", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) ENDIF CLOSE_SEQUENCE_TASK(tempSeq) TASK_PERFORM_SEQUENCE(args.myOtherPed, tempSeq) CLEAR_SEQUENCE_TASK(tempSeq) SET_PED_KEEP_TASK(args.myOtherPed, TRUE) IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myOtherPed) <= 50 ADD_PED_FOR_DIALOGUE(args.assConv, 5, args.myOtherPed, "YachtPed1") CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASml_ytG1", CONV_PRIORITY_HIGH) //"Aaaah! Someone help us!" ENDIF ENDIF IF NOT IS_PED_INJURED(args.myAuxPed) //sunbathing girl IF GET_SCRIPT_TASK_STATUS(args.myAuxPed, SCRIPT_TASK_SMART_FLEE_PED) <> PERFORMING_TASK CLEAR_PED_TASKS(args.myAuxPed) TASK_SMART_FLEE_PED(args.myAuxPed, PLAYER_PED_ID(), 200, -1) SET_PED_KEEP_TASK(args.myAuxPed, TRUE) PRINTLN("TASKING SUNBATHING GIRL TO FLEE") ENDIF ENDIF //initialize this variable so that we can use it in handling panic dialogue iDialogueLine = 0 SET_ENTITY_LOAD_COLLISION_FLAG(args.myTarget, TRUE) curTargetStage = TARGET_STAGE_PANICKING ELSE //make sure peds on yacht are playing their anims UPDATE_YACHT_PEDS(args) IF fPlayerDist <= 15 AND NOT bThreatenLinePlayed IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF HAS_YACHTSMAN_PLAYED_ALL_WARNING_LINES(iDialogueLine) bThreatenLinePlayed = TRUE ENDIF ENDIF ELSE IF fPlayerDist <= 25 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() HANDLE_YACHTSMAN_PLAYING_IDLE_LINES() ENDIF ENDIF ENDIF //have sunbathing girl on shore freak out if player jacks her jetski (but dont trigger panic on the target) IF NOT bSunbatherPanic IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viJetski) IF NOT IS_PED_INJURED(args.myAuxPed) IF GET_SCRIPT_TASK_STATUS(args.myAuxPed, SCRIPT_TASK_SMART_FLEE_PED) <> PERFORMING_TASK CLEAR_PED_TASKS(args.myAuxPed) TASK_SMART_FLEE_PED(args.myAuxPed, PLAYER_PED_ID(), 200, -1) SET_PED_KEEP_TASK(args.myAuxPed, TRUE) PRINTLN("TASKING SUNBATHING GIRL TO FLEE") IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myAuxPed) < 50 ADD_PED_FOR_DIALOGUE(args.assConv, 4, args.myAuxPed, "OJAmlSUNBATHER" ) CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASml_ytSUN", CONV_PRIORITY_HIGH) //"Someone help! He just stole my jetski!" ENDIF bSunbatherPanic = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE TARGET_STAGE_PANICKING IF NOT IS_ENTITY_DEAD(args.myTarget) IF NOT IS_ENTITY_DEAD(args.myVehicle) IF GET_PED_IN_VEHICLE_SEAT(args.myVehicle) <> args.myTarget IF bAggroAtDistance IF IS_SYNCHRONIZED_SCENE_RUNNING(iSceneId) fScenePhase = GET_SYNCHRONIZED_SCENE_PHASE(iSceneId) PRINTLN("bAggroAtDistance - fScenePhase = ", fScenePhase) ENDIF IF fScenePhase > 0.80 CLEAR_PED_TASKS(args.myTarget) SET_PED_INTO_VEHICLE(args.myTarget, args.myVehicle) PRINTLN("SETTING PED INTO VEHICLE SEAT - NO LONGER PLAYING ANIMATION") ELSE // PRINTLN("SYNCED SCENE STILL RUNNING") ENDIF ELSE IF IS_SYNCHRONIZED_SCENE_RUNNING(iSceneId) fScenePhase = GET_SYNCHRONIZED_SCENE_PHASE(iSceneId) PRINTLN("fScenePhase = ", fScenePhase) ENDIF IF fScenePhase > 0.90 IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_SMART_FLEE_PED) <> PERFORMING_TASK TASK_SMART_FLEE_PED(args.myTarget, PLAYER_PED_ID(), 1000, -1) PRINTLN("THE TARGET HAS JUMPED IN THE WATER, TASKING HIM TO FLEE") ENDIF ELIF NOT bSplashSoundPlayed IF fScenePhase > 0.36 // IF LOAD_STREAM("MULT_ASSAS_WATER_SPLASH_master") ODDJOB_STOP_SOUND(iSoundIdMulti) ODDJOB_PLAY_SOUND("MULT_ASSAS_WATER_SPLASH_master", iSoundIdMulti, FALSE, args.myTarget) // PLAY_STREAM_FROM_PED(args.myTarget) PRINTLN("SPLASH SOUND PLAYED") bSplashSoundPlayed = TRUE // ELSE // PRINTLN("SPLASH SOUND NOT LOADED!!!") // ENDIF ENDIF ENDIF ENDIF ELSE IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_VEHICLE_MISSION) <> PERFORMING_TASK TASK_VEHICLE_MISSION_COORS_TARGET(args.myTarget, args.myVehicle, GET_ENTITY_COORDS(PLAYER_PED_ID()), MISSION_FLEE, 20, DRIVINGMODE_AVOIDCARS_RECKLESS, 500, -1) PRINTLN("THE TARGET IS IN THE DRIVER'S SEAT, TASKING HIM TO FLEE") ENDIF ENDIF ENDIF IF NOT bPanicLinePlayed IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < 35 IF HAS_YACHTSMAN_PLAYED_ALL_PANIC_LINES(iDialogueLine) bPanicLinePlayed = TRUE ENDIF ENDIF ENDIF ELSE PRINTLN("TARGET IS DEAD") ENDIF IF HAS_TARGET_ESCAPED(args.myTarget, fFailDist) SET_MISSION_FAILED(assArgs, targetData, FAIL_PED_ESCAPED) ENDIF BREAK ENDSWITCH ENDPROC //update loop that runs while the washer target is active PROC UPDATE_TARGET_WASHER(ASS_ARGS& args) SWITCH curTargetStage CASE TARGET_STAGE_BLIP_TARGET CREATE_CURRENT_TARGET_BLIP(args) curTargetStage = TARGET_STAGE_WAITING BREAK CASE TARGET_STAGE_WAITING IF NOT bRopeDetached IF DO_AGGRO_CHECK(args.myTarget, NULL, aggroArgs, aggroReason, FALSE) OR HAS_BULLET_IMPACTED_IN_AREA(GET_ENTITY_COORDS(args.myTarget), 15.0, FALSE) OR bPanicking OR GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < 5 OR ( IS_PED_IN_FLYING_VEHICLE(PLAYER_PED_ID()) AND GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) <= 35.0 ) IF NOT IS_PED_INJURED(args.myTarget) PRINTLN("WASHER GOING TO PANIC MODE") IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) <= 100 CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASml_wwTP", CONV_PRIORITY_HIGH) //"what the hell was that" ENDIF TASK_PLAY_ANIM(args.myTarget, "oddjobs@assassinate@multi@windowwasher", "_shot_reaction", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME) curTargetStage = TARGET_STAGE_PANICKING ENDIF ENDIF ENDIF BREAK CASE TARGET_STAGE_PANICKING IF NOT bPanicLinePlayed IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) <= 100 AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF HAS_WASHER_PLAYED_ALL_PANIC_LINES(iDialogueLine) bPanicLinePlayed = TRUE ENDIF ENDIF ENDIF //to fix an issue I saw today where if the target was hurt but not killed would stand up and not cower since he was broken out of his previous anim task IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_PLAY_ANIM) != PERFORMING_TASK AND GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_COWER) != PERFORMING_TASK TASK_COWER(args.myTarget, -1) ENDIF BREAK ENDSWITCH IF bAttachedRope HANDLE_SHOT_ROPE() ENDIF ENDPROC //update loop that runs while the biker target is active PROC UPDATE_TARGET_BIKER(ASS_TARGET_DATA& targetData, ASS_ARGS& args) SEQUENCE_INDEX tempSeq SWITCH curTargetStage CASE TARGET_STAGE_BLIP_TARGET CREATE_CURRENT_TARGET_BLIP(args) SET_ENTITY_LOAD_COLLISION_FLAG(args.myTarget, TRUE) // IF NOT bPanicking //set target onto bike after cutscene has finished // IF NOT IS_PED_INJURED(args.myTarget) // IF IS_VEHICLE_DRIVEABLE(args.myVehicle) // SET_ENTITY_COORDS(args.myVehicle, targetData.vVehPos) // SET_ENTITY_HEADING(args.myVehicle, targetData.fVehHead) // SET_ENTITY_LOAD_COLLISION_FLAG(args.myTarget, TRUE) // IF NOT IS_PED_IN_ANY_VEHICLE(args.myTarget) // SET_PED_INTO_VEHICLE(args.myTarget, args.myVehicle) // SET_VEHICLE_ON_GROUND_PROPERLY(args.myVehicle) // ENDIF // ENDIF // ENDIF // ENDIF SETTIMERA(0) curTargetStage = TARGET_STAGE_WAITING BREAK CASE TARGET_STAGE_WAITING IF DO_AGGRO_CHECK(args.myTarget, args.myVehicle, aggroArgs, aggroReason, TRUE, FALSE) OR bPanicking IF NOT IS_PED_INJURED(args.myTarget) SET_ENTITY_LOAD_COLLISION_FLAG(args.myTarget, TRUE) // CLEAR_PED_TASKS(args.myTarget) IF IS_PED_IN_VEHICLE(args.myTarget, args.myVehicle) IF IS_VEHICLE_DRIVEABLE(args.myVehicle) IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) TASK_VEHICLE_MISSION_PED_TARGET(args.myTarget, args.myVehicle, PLAYER_PED_ID(), MISSION_FLEE, 35, DRIVINGMODE_AVOIDCARS_RECKLESS, 500, -1) ELSE TASK_VEHICLE_MISSION(args.myTarget, args.myVehicle, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), MISSION_FLEE, 35, DRIVINGMODE_AVOIDCARS_RECKLESS, 500, -1) ENDIF PRINTLN("WE'VE AGGROED THE BIKER, MAKE HIM GO FASTER") // ADD_VEHICLE_SUBTASK_ATTACK_PED(args.myTarget, PLAYER_PED_ID()) ENDIF ELSE // TASK_COMBAT_PED(args.myTarget, PLAYER_PED_ID()) TASK_SMART_FLEE_PED(args.myTarget, PLAYER_PED_ID(), 1000, -1) PRINTLN("TASKING BIKER TO FLEE PLAYER - 01") ENDIF ENDIF SETTIMERA(0) curTargetStage = TARGET_STAGE_PANICKING ELSE IF NOT bTargetCruising IF NOT IS_PED_IN_ANY_VEHICLE(args.myTarget) SET_PED_INTO_VEHICLE(args.myTarget, args.myVehicle) SET_VEHICLE_ON_GROUND_PROPERLY(args.myVehicle) ENDIF SET_VEHICLE_FORWARD_SPEED(args.myVehicle, 4) OPEN_SEQUENCE_TASK(tempSeq) TASK_VEHICLE_MISSION_COORS_TARGET(NULL, args.myVehicle, << -1637.6823, 1018.6192, 152.1026 >>, MISSION_GOTO, 22, DRIVINGMODE_AVOIDCARS_RECKLESS, 10, -1) TASK_VEHICLE_DRIVE_WANDER(NULL, args.myVehicle, 22, DRIVINGMODE_AVOIDCARS_RECKLESS) CLOSE_SEQUENCE_TASK(tempSeq) TASK_PERFORM_SEQUENCE(args.myTarget, tempSeq) CLEAR_SEQUENCE_TASK(tempSeq) bTargetCruising = TRUE ENDIF ENDIF BREAK CASE TARGET_STAGE_PANICKING IF HAS_TARGET_ESCAPED(args.myTarget, fFailDist) SET_MISSION_FAILED(assArgs, targetData, FAIL_PED_ESCAPED) ELSE IF NOT IS_PED_INJURED(args.myTarget) IF NOT bTaskedToFlee IF NOT IS_PED_IN_ANY_VEHICLE(args.myTarget) IF GET_SCRIPT_TASK_STATUS(args.myTarget, SCRIPT_TASK_COMBAT) <> PERFORMING_TASK SET_PED_COMBAT_ATTRIBUTES(args.myTarget, CA_USE_VEHICLE, FALSE) // TASK_COMBAT_PED(args.myTarget, PLAYER_PED_ID()) TASK_SMART_FLEE_PED(args.myTarget, PLAYER_PED_ID(), 1000, -1) PRINTLN("TASKING BIKER TO FLEE PLAYER - 02") bTaskedToFlee = TRUE ENDIF ENDIF ENDIF //have target threaten the player while escaping IF GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < 15 AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_PED_RAGDOLL(args.myTarget) IF NOT bThreatenLinePlayed IF HAS_BIKER_PLAYED_ALL_PANIC_LINES(iDialogueLine) bThreatenLinePlayed = TRUE SETTIMERA(0) ENDIF ELIF NOT bPanicLinePlayed IF TIMERA() >= 10000 CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASml_bkTP2", CONV_PRIORITY_HIGH) bPanicLinePlayed = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF BREAK ENDSWITCH // To Fix Bug # 732292 //make sure that the player always has a minimum of 2 star wanted level during this update loop // IF ARE_PLAYER_FLASHING_STARS_ABOUT_TO_DROP(PLAYER_ID()) // SET_PLAYER_WANTED_CENTRE_POSITION(PLAYER_ID(), GET_ENTITY_COORDS(PLAYER_PED_ID())) // ENDIF ENDPROC //does update loop for current active target PROC UPDATE_CURRENT_TARGET(ASS_TARGET_DATA& targetData, ASS_ARGS& args) SWITCH curTarget CASE ASSASSIN_TARGET_BODYBUILDER UPDATE_TARGET_BODYBUILDER(targetData, args) BREAK CASE ASSASSIN_TARGET_YACHT UPDATE_TARGET_YACHT(targetData, args) BREAK CASE ASSASSIN_TARGET_WASHER UPDATE_TARGET_WASHER(args) BREAK CASE ASSASSIN_TARGET_BIKER UPDATE_TARGET_BIKER(targetData, args) BREAK ENDSWITCH CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, args.myTarget) ENDPROC PROC ATTACH_ROPE_TO_PROPS(ASS_TARGET_DATA& targetData, ASS_ARGS& args) VECTOR vPlayerPosition, vTargetPos VECTOR vPlatformPosition VECTOR vPlatformPositionForAttachment SEQUENCE_INDEX tempSeq IF DOES_ENTITY_EXIST(args.myProp[0]) vPlatformPositionForAttachment = GET_ENTITY_COORDS(args.myProp[0]) // PRINTLN("vPlatformPositionForAttachment = ", vPlatformPositionForAttachment) ELSE vPlatformPositionForAttachment = targetData.vPropPos[0] // PRINTLN("args.myProp[0] DOES NOT EXIST USING VECTOR = ", targetData.vPropPos[0]) ENDIF float topZ = 142.1 float ropeLen = topZ - vPlatformPositionForAttachment.z IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID()) ENDIF IF NOT IS_ENTITY_DEAD(args.myTarget) vTargetPos = GET_ENTITY_COORDS(args.myTarget) ENDIF SWITCH iRopeStages CASE 0 IF NOT bAttachedRope IF curTarget = ASSASSIN_TARGET_WASHER // PRINTLN("INSIDE ATTACH_ROPE_TO_PROPS") IF VDIST2(vPlayerPosition, vTargetPos) < 40000 // 200 * 200 IF DOES_ENTITY_EXIST(args.myProp[0]) IF DOES_ENTITY_EXIST(args.myProp[1]) IF NOT ROPE_ARE_TEXTURES_LOADED() ROPE_LOAD_TEXTURES() ELSE // IF NOT IS_PED_INJURED(args.myTarget) // ATTACH_ENTITY_TO_ENTITY(args.myTarget, args.myProp[0], 0, <<0,0,0.25>>, <<0,0,180>>, TRUE, TRUE) // IF curTargetStage < TARGET_STAGE_PANICKING // TASK_PLAY_ANIM(args.myTarget, "oddjobs@assassinate@multi@windowwasher", "_idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) // PRINTLN("TASKING WASHER TO PLAY IDLE ANIMATION") // ENDIF // ENDIF IF NOT DOES_ROPE_EXIST(ropeWindowA) ropeWindowA = ADD_ROPE(<< -648.59, 305.73, topZ >>, <<0,90,0>>, ropeLen, PHYSICS_ROPE_THIN, -1, 5, 0.5, FALSE, FALSE, TRUE, 5, TRUE) PRINTLN("CREATING ropeWindowA") ENDIF IF NOT DOES_ROPE_EXIST(ropeWindowB) ropeWindowB = ADD_ROPE(<< -638.93, 304.92, topZ >>, <<0,90,0>>, ropeLen, PHYSICS_ROPE_THIN, -1, 5, 0.5, FALSE, FALSE, TRUE, 5, TRUE) PRINTLN("CREATING ropeWindowB") ENDIF IF DOES_ROPE_EXIST(ropeWindowB) AND DOES_ROPE_EXIST(ropeWindowA) ATTACH_ENTITIES_TO_ROPE(ropeWindowA, args.myProp[1], args.myProp[0], << -648.59, 305.73, topZ >>, << -648.59, 305.73, vPlatformPositionForAttachment.z >>, ropeLen, 0, 0) ATTACH_ENTITIES_TO_ROPE(ropeWindowB, args.myProp[1], args.myProp[0], << -638.93, 304.92, topZ >>, << -638.93, 304.92, vPlatformPositionForAttachment.z >>, ropeLen, 0, 0) PRINTLN("bAttachedRope = TRUE") bAttachedRope = TRUE PRINTLN("iRopeStages = 1") iRopeStages = 1 ELSE SCRIPT_ASSERT("Ropes do not exist") ENDIF ENDIF ELSE SCRIPT_ASSERT("args.myProp[1] DOES NOT EXIST") ENDIF ELSE SCRIPT_ASSERT("args.myProp[0] DOES NOT EXIST") ENDIF ELSE // PRINTLN("WE'RE GREATER THAN 125m") ENDIF ENDIF ENDIF BREAK //=================================================================================================================== CASE 1 IF VDIST2(vPlayerPosition, vTargetPos) < 18225 //135m // The player has seen the platform IF IS_ENTITY_ON_SCREEN(args.myProp[0]) //AND NOT IS_ENTITY_OCCLUDED(args.myProp[0]) IF curTargetStage < TARGET_STAGE_PANICKING IF NOT IS_PED_INJURED(args.myTarget) OPEN_SEQUENCE_TASK(tempSeq) TASK_PLAY_ANIM(NULL, "oddjobs@assassinate@multi@windowwasher", "_idle_to_up") TASK_PLAY_ANIM(NULL, "oddjobs@assassinate@multi@windowwasher", "_up_loop", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(tempSeq) TASK_PERFORM_SEQUENCE(args.myTarget, tempSeq) CLEAR_SEQUENCE_TASK(tempSeq) ENDIF ENDIF PRINTLN("PLATFORM IS ONSCREEN") PRINTLN("iRopeStages = 2") iRopeStages = 2 ELSE // PRINTLN("PLATFORM IS NOT ONSCREEN") ENDIF ELSE // PRINTLN("NOT CLOSE ENOUGH TO TARGET") ENDIF BREAK //=================================================================================================================== CASE 2 vPlatformPosition = GET_ENTITY_COORDS(args.myProp[0]) // PRINTLN("ROPE Z POSITION = ", vPlatformPosition.z) IF IS_ENTITY_DEAD(args.myTarget) PRINTLN("iRopeStages = 3") iRopeStages = 3 ENDIF IF DOES_ROPE_EXIST(ropeWindowA) AND DOES_ROPE_EXIST(ropeWindowB) START_ROPE_WINDING(ropeWindowA) START_ROPE_WINDING(ropeWindowB) IF vPlatformPosition.z >= 125.0 IF curTargetStage < TARGET_STAGE_PANICKING IF NOT IS_PED_INJURED(args.myTarget) OPEN_SEQUENCE_TASK(tempSeq) TASK_PLAY_ANIM(NULL, "oddjobs@assassinate@multi@windowwasher", "_up_to_wash") TASK_PLAY_ANIM(NULL, "oddjobs@assassinate@multi@windowwasher", "_wash_loop", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(tempSeq) TASK_PERFORM_SEQUENCE(args.myTarget, tempSeq) CLEAR_SEQUENCE_TASK(tempSeq) ENDIF ENDIF STOP_ROPE_WINDING(ropeWindowA) STOP_ROPE_WINDING(ropeWindowB) PRINTLN("iRopeStages = 3") iRopeStages = 3 APPLY_FORCE_TO_ENTITY(args.myProp[0], APPLY_TYPE_EXTERNAL_FORCE, << -20.0, 0.0, -20.0 >>, << -4.78, 0.65, -0.78 >>, 0, FALSE, FALSE, TRUE ) // INCREASE_ROPE_CONSTRAINT_DISTANCE(ropeWindowA, 0.1) // INCREASE_ROPE_CONSTRAINT_DISTANCE(ropeWindowB, 0.1) ENDIF ELSE IF DOES_ROPE_EXIST(ropeWindowA) STOP_ROPE_WINDING(ropeWindowA) ENDIF IF DOES_ROPE_EXIST(ropeWindowB) STOP_ROPE_WINDING(ropeWindowB) ENDIF ENDIF BREAK //=================================================================================================================== CASE 3 // bRopeWindingDone = TRUE IF DOES_ROPE_EXIST(ropeWindowA) STOP_ROPE_WINDING(ropeWindowA) ENDIF IF DOES_ROPE_EXIST(ropeWindowB) STOP_ROPE_WINDING(ropeWindowB) ENDIF BREAK ENDSWITCH ENDPROC //do anything else needed for current target that CREATE_ASSASSIANTION_SCENE doesn't already do PROC CREATE_ADDITIONAL_NEEDS_FOR_CURRENT_TARGET(ASS_TARGET_DATA& targetData, ASS_ARGS& args) SWITCH curTarget CASE ASSASSIN_TARGET_BODYBUILDER IF NOT IS_PED_INJURED(args.myTarget) SET_PED_COMPONENT_VARIATION(args.myTarget, INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head) SET_PED_COMPONENT_VARIATION(args.myTarget, INT_TO_ENUM(PED_COMPONENT,3), 1, 0, 0) //(uppr) SET_PED_COMPONENT_VARIATION(args.myTarget, INT_TO_ENUM(PED_COMPONENT,4), 1, 0, 0) //(lowr) SET_PED_COMPONENT_VARIATION(args.myTarget, INT_TO_ENUM(PED_COMPONENT,8), 1, 0, 0) //(accs) SET_COMBAT_FLOAT(args.myTarget, CCF_FIGHT_PROFICIENCY, 1.0) ADD_PED_FOR_DIALOGUE(cutsceneConvStruct, 3, args.myTarget, "OJAmlBODYBUILDER") //to have him speak in the intro cutscene ADD_PED_FOR_DIALOGUE(args.assConv, 3, args.myTarget, "OJAmlBODYBUILDER") ENDIF CREATE_BYSTANDER_PEDS() BREAK CASE ASSASSIN_TARGET_YACHT //create sunbathing girl on shore next to jetski IF NOT DOES_ENTITY_EXIST(args.myAuxPed) args.myAuxPed = CREATE_PED(PEDTYPE_CIVFEMALE, targetData.auxPedEnum, targetData.vAuxPedPos, targetData.fAuxPedHead) FORCE_PED_AI_AND_ANIMATION_UPDATE(args.myAuxPed) TASK_START_SCENARIO_AT_POSITION(args.myAuxPed, "WORLD_HUMAN_SUNBATHE", targetData.vAuxPedPos, targetData.fAuxPedHead ) SET_PED_COMBAT_ATTRIBUTES(args.myAuxPed, CA_ALWAYS_FLEE, TRUE) ENDIF IF NOT IS_PED_INJURED(args.myOtherPed) //girl on yacht SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(args.myOtherPed, TRUE) SET_PED_DIES_IN_WATER(args.myOtherPed, FALSE) SET_PED_COMPONENT_VARIATION(args.myOtherPed, INT_TO_ENUM(PED_COMPONENT,0), 1, 0, 0) //(head) SET_PED_COMPONENT_VARIATION(args.myOtherPed, INT_TO_ENUM(PED_COMPONENT,2), 1, 2, 0) //(hair) SET_PED_COMPONENT_VARIATION(args.myOtherPed, INT_TO_ENUM(PED_COMPONENT,3), 0, 3, 0) //(uppr) SET_PED_COMPONENT_VARIATION(args.myOtherPed, INT_TO_ENUM(PED_COMPONENT,4), 0, 3, 0) //(lowr) SET_PED_COMPONENT_VARIATION(args.myOtherPed, INT_TO_ENUM(PED_COMPONENT,8), 1, 0, 0) //(accs) ENDIF IF DOES_ENTITY_EXIST(args.myVehicle) SET_VEHICLE_RADIO_ENABLED(args.myVehicle, TRUE) SET_VEHICLE_RADIO_LOUD(args.myVehicle, TRUE) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(args.myVehicle, TRUE) ENDIF IF NOT IS_PED_INJURED(args.myTarget) SET_PED_DIES_IN_WATER(args.myTarget, FALSE) ADD_PED_FOR_DIALOGUE(cutsceneConvStruct, 3, args.myTarget, "OJAmlYACHTTARGET") //to have him speak in the intro cutscene ADD_PED_FOR_DIALOGUE(args.assConv, 3, args.myTarget, "OJAmlYACHTTARGET") SET_ENTITY_LOAD_COLLISION_FLAG(args.myTarget, TRUE) ENDIF // IF NOT IS_ENTITY_DEAD(args.myTarget) AND NOT IS_ENTITY_DEAD(args.myVehicle) // SET_PED_INTO_VEHICLE(args.myTarget, args.myVehicle, VS_BACK_LEFT) // ENDIF viJetski = CREATE_VEHICLE(SEASHARK, << -2190.7407, -470.3163, -0.4779 >>, 308.1181) //to block the peds and jetskis parked next to the one we create REMOVE_SCENARIO_BLOCKING_AREA(sbi01) sbi01 = ADD_SCENARIO_BLOCKING_AREA((<< -2182.36279, -468.89261, -0.10296 >> - <<15,15,15>>), (<< -2182.36279, -468.89261, -0.10296 >> + <<15,15,15>>)) iLineIDXToPlay = -1 iDialogueIdleLine = 0 BREAK CASE ASSASSIN_TARGET_WASHER IF NOT IS_PED_INJURED(args.myTarget) AND DOES_ENTITY_EXIST(args.myProp[0]) AND DOES_ENTITY_EXIST(args.myProp[1]) ADD_PED_FOR_DIALOGUE(args.assConv, 3, args.myTarget, "OJAmlWASHER") ATTACH_ENTITY_TO_ENTITY(args.myTarget, args.myProp[0], 0, << -2.1, -0.4, 0.25 >>, << 0, 0, 180 >>, TRUE, TRUE) TASK_PLAY_ANIM(args.myTarget, "oddjobs@assassinate@multi@windowwasher", "_idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) SET_ENTITY_LOD_DIST(args.myProp[0], 225) SET_ENTITY_LOD_DIST(args.myProp[1], 225) PRINTLN("LOD DISTANCES SET FOR WASHER PROPS!") ENDIF // camKill = CREATE_CAMERA(CAMTYPE_SCRIPTED) // SET_CAM_PARAMS(camKill, << -648.3, 296.3, 134.3538 >>, << -12.6, -0.0000, -24.7813 >>, 35) BREAK CASE ASSASSIN_TARGET_BIKER IF NOT IS_PED_INJURED(args.myTarget) SET_PED_COMBAT_ATTRIBUTES(args.myTarget, CA_FLEE_WHILST_IN_VEHICLE, TRUE) GIVE_PED_HELMET(args.myTarget, FALSE, PV_FLAG_DEFAULT_HELMET) SET_PED_HELMET(args.myTarget, TRUE) PRINTLN("GIVING BIKER HELMET") ADD_PED_FOR_DIALOGUE(cutsceneConvStruct, 3, args.myTarget, "OJAmlBIKER") //to have him speak in the intro cutscene ADD_PED_FOR_DIALOGUE(args.assConv, 3, args.myTarget, "OJAmlBIKER") //start the biker on his bike IF IS_VEHICLE_DRIVEABLE(args.myVehicle) SET_PED_INTO_VEHICLE(args.myTarget, args.myVehicle) SET_VEHICLE_ON_GROUND_PROPERLY(args.myVehicle) ENDIF ENDIF viRestStopCamper = CREATE_VEHICLE(CAMPER, << -1400.5751, 738.8264, 182.1478 >>, 194.6070) SET_VEHICLE_ON_GROUND_PROPERLY(viRestStopCamper) viRestStopCar = CREATE_VEHICLE(BJXL, <<-1371.2687, 734.4243, 182.5433>>, 182.7660) SET_VEHICLE_ON_GROUND_PROPERLY(viRestStopCar) BREAK ENDSWITCH //bump up the target's lockon to fix Bug 470575 IF NOT IS_PED_INJURED(args.myTarget) SET_ENTITY_IS_TARGET_PRIORITY(args.myTarget, TRUE) ENDIF ENDPROC //reset these variables before activating the next target PROC INITIALIZE_NEXT_STAGE(ASS_TARGET_DATA& targetData) INT tempInt bLocatePrinted = FALSE curTarget = INT_TO_ENUM(CURRENT_ASSASSIN_TARGET, iNumTargetsKilled) curTargetStage = TARGET_STAGE_BLIP_TARGET introCutsceneState = INTRO_CUTSCENE_CREATE cutArgs.cutsceneState = CUTSCENE_STATE_START //reset these variables targetData.vehEnum = DUMMY_MODEL_FOR_SCRIPT targetData.auxVehEnum = DUMMY_MODEL_FOR_SCRIPT targetData.targetEnum = DUMMY_MODEL_FOR_SCRIPT targetData.vTargetPos = NULL_VECTOR() targetData.fTargetHead = 0 targetData.otherPedEnum = DUMMY_MODEL_FOR_SCRIPT targetData.vOtherPedPos = NULL_VECTOR() targetData.auxPedEnum = DUMMY_MODEL_FOR_SCRIPT targetData.vAuxPedPos = NULL_VECTOR() targetData.fAuxPedHead = 0 targetData.auxVehEnum = DUMMY_MODEL_FOR_SCRIPT targetData.vAuxVehPos = NULL_VECTOR() targetData.fAuxVehHead = 0 targetData.vehEnum = DUMMY_MODEL_FOR_SCRIPT targetData.vVehPos = NULL_VECTOR() targetData.fVehHead = 0 targetData.vDestPos = NULL_VECTOR() targetData.vWarpPos = NULL_VECTOR() targetData.weapTarget = WEAPONTYPE_INVALID REPEAT maxProps tempInt targetData.vPropPos[tempInt] = NULL_VECTOR() ENDREPEAT ENDPROC ////cutscene to show bodybuilder //FUNC BOOL ASSASSIN_INTRO_CUSTOM_BODYBUILDER() // PED_INDEX pedToSpeak // // SWITCH introCutsceneState // CASE INTRO_CUTSCENE_CREATE // //create camera to interp to // cutCam = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, << -1205.9753, -1549.2823, 5.8757 >>, << -4.5982, -0.0003, 170.5105 >>, 35) // SET_CAM_ACTIVE_WITH_INTERP(cutCam, myCamera, 10500, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_LINEAR) // SETTIMERA(0) // // //grab a nearby female bystander and have her talk during cutscene // pedToSpeak = GET_CLOSEST_BYSTANDER(FALSE, vFlexPos, 15) // IF pedToSpeak <> NULL // ADD_PED_FOR_DIALOGUE(cutsceneConvStruct, 4, pedToSpeak, "OJAmlGymOnlookerF") // CREATE_CONVERSATION(cutsceneConvStruct, "OJASAUD", "OJASml_bbBY3", CONV_PRIORITY_HIGH) //"Have you ever seen such a perfectly sculpted bod before? *whistles* // ENDIF // introCutsceneState = INTRO_CUTSCENE_TRANSITIONA // BREAK // CASE INTRO_CUTSCENE_TRANSITIONA // IF TIMERA() >= 7000 // SET_CAM_PARAMS(cutCam, << -1211.1, -1557.95, 4.9 >>, << -1.4, -0.0003, -114.8 >>, 35) // SHAKE_CAM(cutCam, "HAND_SHAKE", 0.25) // SETTIMERA(0) // // IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // CREATE_CONVERSATION(cutsceneConvStruct, "OJASAUD", "OJASml_bbId0", CONV_PRIORITY_HIGH) //"Ugh! *grunts*" - Target // ENDIF // introCutsceneState = INTRO_CUTSCENE_TRANSITIONB // ENDIF // BREAK // CASE INTRO_CUTSCENE_TRANSITIONB // IF TIMERA() >= 2000 // introCutsceneState = INTRO_CUTSCENE_END // ENDIF // BREAK // CASE INTRO_CUTSCENE_END // REMOVE_PED_FOR_DIALOGUE(cutsceneConvStruct, 3) // REMOVE_PED_FOR_DIALOGUE(cutsceneConvStruct, 4) // RETURN TRUE // BREAK // ENDSWITCH // // IF HANDLE_SKIP_CUTSCENE(iCutsceneStartTime) // KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() // REMOVE_PED_FOR_DIALOGUE(cutsceneConvStruct, 3) // REMOVE_PED_FOR_DIALOGUE(cutsceneConvStruct, 4) // RETURN TRUE // ENDIF // // RETURN FALSE //ENDFUNC ////cutscene to show yacht target with girl //FUNC BOOL ASSASSIN_INTRO_CUSTOM_YACHT() // CAMERA_INDEX tempCam // // SWITCH introCutsceneState // CASE INTRO_CUTSCENE_CREATE // //create camera to interp to // tempCam = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, << -2172.7625, -446.5406, 5.9327 >>, << -6.3389, -0.0378, 166.4011 >>, 35) // SET_CAM_ACTIVE_WITH_INTERP(tempCam, myCamera, 6500, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_LINEAR) // SETTIMERA(0) // introCutsceneState = INTRO_CUTSCENE_TRANSITIONA // BREAK // CASE INTRO_CUTSCENE_TRANSITIONA // IF TIMERA() >= 4000 // SET_CAM_PARAMS(myCamera,<< -2215.9033, -587.4893, 2.2662 >>, << -7.9346, -0.0000, -19.8626 >>, 35) // tempCam = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, << -2216.8484, -587.1091, 2.0171 >>, << -8.9524, -0.0000, -30.1767 >>, 35) // SET_CAM_ACTIVE_WITH_INTERP(tempCam, myCamera, 6500, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_LINEAR) // SETTIMERA(0) // CREATE_CONVERSATION(cutsceneConvStruct, "OJASAUD", "OJASml_ytT1", CONV_PRIORITY_HIGH) //"Shake it girl! Don't be shy, get closer!" // introCutsceneState = INTRO_CUTSCENE_TRANSITIONB // ENDIF // BREAK // CASE INTRO_CUTSCENE_TRANSITIONB // IF TIMERA() >= 6000 // introCutsceneState = INTRO_CUTSCENE_END // ENDIF // BREAK // CASE INTRO_CUTSCENE_END // RETURN TRUE // BREAK // ENDSWITCH // // // IF HANDLE_SKIP_CUTSCENE(iCutsceneStartTime) // KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() // RETURN TRUE // ENDIF // // RETURN FALSE //ENDFUNC ////cutscene to show window washer //FUNC BOOL ASSASSIN_INTRO_CUSTOM_WASHER() // CAMERA_INDEX tempCam // // SWITCH introCutsceneState // CASE INTRO_CUTSCENE_CREATE // tempCam = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, << -659.5249, 186.9299, 82.3559 >>, << 16.1452, 0.0001, -13.9383 >>, 35) // SET_CAM_ACTIVE_WITH_INTERP(tempCam, myCamera, 6500, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_LINEAR) // SETTIMERA(0) // introCutsceneState = INTRO_CUTSCENE_TRANSITIONA // BREAK // CASE INTRO_CUTSCENE_TRANSITIONA // IF TIMERA() >= 4000 // SET_CAM_PARAMS(myCamera, << -631.8769, 297.3616, 133.1730 >>, << -2.7339, 0.0001, 57.6381 >>, 35) // tempCam = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, << -634.4907, 299.0185, 133.1846 >>, << -2.7339, 0.0001, 55.9964 >>, 35) // SET_CAM_ACTIVE_WITH_INTERP(tempCam, myCamera, 8500, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_LINEAR) // SETTIMERA(0) // introCutsceneState = INTRO_CUTSCENE_TRANSITIONB // ENDIF // BREAK // CASE INTRO_CUTSCENE_TRANSITIONB // IF TIMERA() >= 4000 // introCutsceneState = INTRO_CUTSCENE_END // ENDIF // BREAK // CASE INTRO_CUTSCENE_END // RETURN TRUE // BREAK // ENDSWITCH // // // IF HANDLE_SKIP_CUTSCENE(iCutsceneStartTime) // RETURN TRUE // ENDIF // // RETURN FALSE //ENDFUNC ////cutscene to show biker //FUNC BOOL ASSASSIN_INTRO_CUSTOM_BIKER() // CAMERA_INDEX tempCam // // SWITCH introCutsceneState // CASE INTRO_CUTSCENE_CREATE // //create camera to interp to // tempCam = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, << -1402.3571, 737.4949, 183.9362 >>, << -0.2429, -0.0000, 66.1243 >>, 35) // SET_CAM_ACTIVE_WITH_INTERP(tempCam, myCamera, 8000, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_LINEAR) // SETTIMERA(0) // introCutsceneState = INTRO_CUTSCENE_TRANSITIONA // BREAK // CASE INTRO_CUTSCENE_TRANSITIONA // IF TIMERA() >= 3000 // SET_CAM_PARAMS(myCamera, << -1407.5659, 736.5976, 184.1755 >>, << -1.8515, 0.0000, -13.3541 >>, 35) // tempCam = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, << -1407.6451, 736.6487, 184.1740 >>, << -1.8515, 0.0000, -10.2147 >>, 35) // SET_CAM_ACTIVE_WITH_INTERP(tempCam, myCamera, 5500, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_LINEAR) // CREATE_CONVERSATION(cutsceneConvStruct, "OJASAUD", "OJASml_bkPEE", CONV_PRIORITY_HIGH) //"I knew I shouldn't have chugged that mega Sprunk before i left" // SETTIMERA(0) // introCutsceneState = INTRO_CUTSCENE_END // ENDIF // BREAK // CASE INTRO_CUTSCENE_END // IF TIMERA() >= 6000 // RETURN TRUE // ENDIF // BREAK // ENDSWITCH // // IF HANDLE_SKIP_CUTSCENE(iCutsceneStartTime) // KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() // RETURN TRUE // ENDIF // // RETURN FALSE //ENDFUNC ////grab the cutscene info for the current target //PROC GET_CURRENT_TARGET_CUTSCENE() // SWITCH curTarget // CASE ASSASSIN_TARGET_YACHT // fpCutsceneCustomIntro = &ASSASSIN_INTRO_CUSTOM_YACHT // BREAK // CASE ASSASSIN_TARGET_WASHER // fpCutsceneCustomIntro = &ASSASSIN_INTRO_CUSTOM_WASHER // BREAK // CASE ASSASSIN_TARGET_BIKER // fpCutsceneCustomIntro = &ASSASSIN_INTRO_CUSTOM_BIKER // BREAK // CASE ASSASSIN_TARGET_BODYBUILDER // fpCutsceneCustomIntro = &ASSASSIN_INTRO_CUSTOM_BODYBUILDER // BREAK // ENDSWITCH //ENDPROC //PROC SETUP_LOAD_SCENE_FOR_CHECKPOINT(VECTOR vPosition, FLOAT fRadius = 10.0) // BOOL bLoadSceneCalled = FALSE // // IF IS_SCREEN_FADED_OUT() // OR IS_REPLAY_IN_PROGRESS() // NEW_LOAD_SCENE_START_SPHERE(vPosition, fRadius) // bLoadSceneCalled = TRUE // PRINTLN("ASSASSINATION MULTI: CALLING NEW_LOAD_SCENE_START_SPHERE") // ELSE // PRINTLN("ASSASSINATION MULTI CHECKPOINT: SCREEN IS NOT FADED OUT") // ENDIF // // IF bLoadSceneCalled // WHILE NOT IS_NEW_LOAD_SCENE_LOADED() // WAIT(0) // PRINTLN("ASSASSINATION MULTI: WAITING FOR SCENE TO LOAD") // ENDWHILE // // PRINTLN("ASSASSINATION MULTI: SCENE HAS LOADED") // NEW_LOAD_SCENE_STOP() // ENDIF //ENDPROC //do distance check to see if player is close enough to trigger the target cutscene FUNC BOOL IS_PLAYER_IN_CUTSCENE_RANGE(ASS_TARGET_DATA& targetData, ASS_ARGS& args) SWITCH curTarget CASE ASSASSIN_TARGET_BODYBUILDER IF GET_PLAYER_DISTANCE_FROM_LOCATION(targetData.vDestPos) < fCutsceneTriggerDist OR GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < fCutsceneTriggerDist IF DOES_BLIP_EXIST(args.myTargetBlip) REMOVE_BLIP(args.myTargetBlip) ENDIF RETURN TRUE ENDIF BREAK CASE ASSASSIN_TARGET_YACHT IF GET_PLAYER_DISTANCE_FROM_LOCATION(targetData.vDestPos) < fCutsceneTriggerDist OR GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < fCutsceneTriggerDist IF DOES_BLIP_EXIST(args.myTargetBlip) REMOVE_BLIP(args.myTargetBlip) ENDIF RETURN TRUE ENDIF BREAK CASE ASSASSIN_TARGET_WASHER IF GET_PLAYER_DISTANCE_FROM_LOCATION(targetData.vDestPos) < fCutsceneTriggerDist OR GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < fCutsceneTriggerDist IF DOES_BLIP_EXIST(args.myTargetBlip) REMOVE_BLIP(args.myTargetBlip) ENDIF RETURN TRUE ENDIF BREAK CASE ASSASSIN_TARGET_BIKER IF GET_PLAYER_DISTANCE_FROM_LOCATION(targetData.vDestPos) < fCutsceneTriggerDist OR GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < ( fCutsceneTriggerDist + 50 ) IF DOES_BLIP_EXIST(args.myTargetBlip) REMOVE_BLIP(args.myTargetBlip) ENDIF RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC BOOL UPDATE_REACTIONS_TO_TIME(ASS_ARGS& args) SWITCH iFranklinsReactionToTime CASE 0 IF iTimeSoFar >= fMissionTime * 1/2 AND NOT IS_MESSAGE_BEING_DISPLAYED() ADD_PED_FOR_DIALOGUE(args.assConv, 1, PLAYER_PED_ID(), "FRANKLIN") CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASml_TIME2", CONV_PRIORITY_HIGH) // Ah shit, not much time left. I can do this! iFranklinsReactionToTime = 1 PRINTLN("iFranklinsReactionToTime = 1") ENDIF BREAK // CASE 1 // IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() //// PRINT_HELP("ASS_TIME1_TK") // iFranklinsReactionToTime = 2 // PRINTLN("iFranklinsReactionToTime = 2") // ENDIF // BREAK // CASE 2 // //// IF bTimeToGoRed //// CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJASml_TIME1", CONV_PRIORITY_HIGH) //"Shit I am runnin' out of time! //// iFranklinsReactionToTime = 3 //// PRINTLN("iFranklinsReactionToTime = 3") //// ENDIF // BREAK ENDSWITCH RETURN FALSE ENDFUNC //handles the updating of the mission timer and logic to fail the mission if it expires before the player kills all the targets PROC FAIL_MISSION_IF_TIMER_EXPIRES(ASS_TARGET_DATA& targetData, ASS_ARGS& args) //fail the mission if time expires IF curStage >= MISSION_STATE_INIT AND curStage <> MISSION_STATE_SUCCESS IF NOT bMissionTimerExpired UPDATE_MISSION_TIMER(iMissionTimerStart, iTimeSoFar, fMissionTime, bMissionTimerStarted, bMissionTimerExpired) UPDATE_REACTIONS_TO_TIME(args) ELSE SET_MISSION_FAILED(assArgs, targetData, FAIL_TIME_EXPIRED) ENDIF ENDIF ENDPROC FUNC FLOAT GET_PLAYERS_MULTI_MISSION_TIME() RETURN TO_FLOAT(iTOTAL_TIME_ALLOTTED - iTimeToDisplayOnTimer) ENDFUNC //checks to see if player has killed targets within allotted time set for bonus requirement PROC CHECK_FOR_TIME_BONUS() FLOAT fBonusTime //set bonus to require the player to have a minute or greater left on the clock fBonusTime = (iTOTAL_TIME_ALLOTTED - 60000) PRINTLN("fBonusTime = ", fBonusTime) //check if player completed the mission with a minute or greater left IF GET_PLAYERS_MULTI_MISSION_TIME() <= fBonusTime PRINTLN("AWARDING SPEEDY KILLER BONUS") bBonus = TRUE passReasonCore = PASS_BONUS ELSE PRINTLN("GET_PLAYERS_MULTI_MISSION_TIME() = ", GET_PLAYERS_MULTI_MISSION_TIME()) ENDIF ENDPROC //checks before intro cutscene has played for the current target FUNC BOOL HAS_PLAYER_TRIGGERED_PREMATURE_PANIC_FOR_CURRENT_TARGET(ASS_ARGS& args) IF curTarget = ASSASSIN_TARGET_BODYBUILDER IF DO_AGGRO_CHECK(args.myTarget, NULL, aggroArgs, aggroReason, FALSE, FALSE) OR HAS_PLAYER_ATTACKED_BYSTANDERS(bAttackedBystanders) OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, vFlexPos, 25) PRINTLN("PLAYER HAS TRIGGERD PANIC - ASSASSIN_TARGET_BODYBUILDER") RETURN TRUE ENDIF ELIF curTarget = ASSASSIN_TARGET_YACHT IF DO_AGGRO_CHECK(args.myTarget, args.myVehicle, aggroArgs, aggroReason, FALSE, FALSE) OR DO_AGGRO_CHECK(args.myOtherPed, NULL, aggroArgs, aggroReason, FALSE, FALSE) PRINTLN("PLAYER HAS TRIGGERD PANIC - ASSASSIN_TARGET_YACHT") RETURN TRUE ENDIF ELSE IF DO_AGGRO_CHECK(args.myTarget, args.myVehicle, aggroArgs, aggroReason, FALSE, FALSE) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC //adjust fail distance variable if the cutscene was triggered at a distance larger than the original fFailDist value so the script wont immediately fail for losing the target after triggering the cutscene PROC ADJUST_FAIL_DISTANCE_IF_NEEDED(PED_INDEX targetPed) IF GET_PLAYER_DISTANCE_FROM_ENTITY(targetPed, FALSE) > fFailDist fFailDist = GET_PLAYER_DISTANCE_FROM_ENTITY(targetPed, FALSE) + 50 ENDIF ENDPROC /// PURPOSE: /// Make sure that the player's last vehicle is set as a mission entity so that it wont get cleared up aggeressively by garbage collection while on the mission PROC SAVE_LAST_PLAYER_VEHICLE() VEHICLE_INDEX vehLast IF curStage > MISSION_STATE_INIT IF NOT IS_PED_INJURED(PLAYER_PED_ID()) vehLast = GET_LAST_DRIVEN_VEHICLE() IF DOES_ENTITY_EXIST(vehLast) IF IS_VEHICLE_DRIVEABLE(vehLast) IF vehLast != viPlayerLastVehicle AND NOT IS_ENTITY_IN_WATER(vehLast) AND NOT IS_ENTITY_A_MISSION_ENTITY(vehLast) // //clear out the previous one // IF viPlayerLastVehicle != NULL // IF IS_ENTITY_A_MISSION_ENTITY(viPlayerLastVehicle) // SET_VEHICLE_AS_NO_LONGER_NEEDED(viPlayerLastVehicle) // ENDIF // ENDIF //set the new vehicle as the current mission entity vehicle viPlayerLastVehicle = vehLast SET_ENTITY_AS_MISSION_ENTITY(viPlayerLastVehicle) SET_VEHICLE_HAS_BEEN_DRIVEN_FLAG(viPlayerLastVehicle, FALSE) ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC //PROC HANDLE_MUSIC_PREP() // IF IS_TIMER_STARTED(tPrepMusicTimer) // IF GET_TIMER_IN_SECONDS(tPrepMusicTimer) > 5.0 // // Preparing music events // IF NOT bPrepareMusic // IF iNumTargetsKilled = 1 // PREPARE_MUSIC_EVENT("ASS2_YCT_OS") // PRINTLN("PREPARING MUSIC EVENT - ASS2_YCT_OS") // bPrepareMusic = TRUE // ELIF iNumTargetsKilled = 2 // PREPARE_MUSIC_EVENT("ASS2_WW_OS") // PRINTLN("PREPARING MUSIC EVENT - ASS2_WW_OS") // bPrepareMusic = TRUE // ELIF iNumTargetsKilled = 3 // PREPARE_MUSIC_EVENT("ASS2_BKR_OS") // PRINTLN("PREPARING MUSIC EVENT - ASS2_BKR_OS") // bPrepareMusic = TRUE // ENDIF // ENDIF // ENDIF // ENDIF //ENDPROC PROC HANDLE_LEAVE_AREA_TRIGGER() VECTOR vPlayerPosition IF IS_TIMER_STARTED(tLeaveAreaTimer) IF GET_TIMER_IN_SECONDS(tLeaveAreaTimer) > 30.0 IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID()) ENDIF IF iNumTargetsKilled = 1 IF VDIST(vPlayerPosition, vTargetLocation[0]) < 100 OR IS_PED_IN_FLYING_VEHICLE(PLAYER_PED_ID()) IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0 SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 2) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) PRINTLN("SETTING WANTED LEVEL - LEAVE AREA CHECK FAIL - 01") ENDIF ENDIF ELIF iNumTargetsKilled = 2 IF VDIST(vPlayerPosition, vTargetLocation[1]) < 100 OR IS_PED_IN_FLYING_VEHICLE(PLAYER_PED_ID()) IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0 SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 2) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) PRINTLN("SETTING WANTED LEVEL - LEAVE AREA CHECK FAIL - 02") ENDIF ENDIF ELIF iNumTargetsKilled = 3 IF VDIST(vPlayerPosition, vTargetLocation[2]) < 100 OR IS_PED_IN_FLYING_VEHICLE(PLAYER_PED_ID()) IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0 SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 2) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) PRINTLN("SETTING WANTED LEVEL - LEAVE AREA CHECK FAIL - 03") ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC PROC HANDLE_RADIO_NEWS_EVENTS() IF NOT bNewsReportPlayed IF IS_TIMER_STARTED(tRadioNewsTimer) IF GET_TIMER_IN_SECONDS(tRadioNewsTimer) > 40.0 IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() ADD_PED_FOR_DIALOGUE(cutsceneConvStruct, 8, NULL, "OJASNEWS") SWITCH iNumTargetsKilled CASE 1 CREATE_CONVERSATION(cutsceneConvStruct, "OJASAUD", "OJAS_NEWS1", CONV_PRIORITY_HIGH) BREAK CASE 2 CREATE_CONVERSATION(cutsceneConvStruct, "OJASAUD", "OJAS_NEWS2", CONV_PRIORITY_HIGH) BREAK CASE 3 CREATE_CONVERSATION(cutsceneConvStruct, "OJASAUD", "OJAS_NEWS3", CONV_PRIORITY_HIGH) BREAK CASE 4 CREATE_CONVERSATION(cutsceneConvStruct, "OJASAUD", "OJAS_NEWS4", CONV_PRIORITY_HIGH) BREAK ENDSWITCH bNewsReportPlayed = TRUE CANCEL_TIMER(tRadioNewsTimer) ENDIF ENDIF ELSE RESTART_TIMER_NOW(tRadioNewsTimer) ENDIF ENDIF ENDPROC FUNC BOOL HAS_ENDING_CELL_PHONE_CALL_COMPLETED(ASS_ARGS& args) IF NOT IS_TIMER_STARTED(tDelayPhoneCallTimer) START_TIMER_NOW(tDelayPhoneCallTimer) PRINTLN("STARTING TIMER - tDelayPhoneCallTimer") ELSE IF NOT bPlayedCellPhoneCall IF GET_TIMER_IN_SECONDS(tDelayPhoneCallTimer) > 5.0 ADD_PED_FOR_DIALOGUE(args.assConv, 1, PLAYER_PED_ID(), "FRANKLIN") ADD_PED_FOR_DIALOGUE(args.assConv, 3, NULL, "LESTER") IF PLAYER_CALL_CHAR_CELLPHONE(args.assConv, CHAR_LESTER, "OJASAUD", "OJAS_MULTI_C", CONV_MISSION_CALL) PRINTLN("MULIT - CELL PHONE CALL") bPlayedCellPhoneCall = TRUE ENDIF 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 ENDIF RETURN FALSE ENDFUNC PROC SEND_TEXT_MESSAGE_FOR_CURRENT_TARGET() STRING sTextMsg SWITCH curTarget CASE ASSASSIN_TARGET_BODYBUILDER sTextMsg = "ASS_ML_TXT_BB" BREAK CASE ASSASSIN_TARGET_YACHT sTextMsg = "ASS_ML_TXT_YT" BREAK CASE ASSASSIN_TARGET_WASHER sTextMsg = "ASS_ML_TXT_WW" BREAK CASE ASSASSIN_TARGET_BIKER sTextMsg = "ASS_ML_TXT_BK" BREAK ENDSWITCH IF NOT IS_STRING_NULL_OR_EMPTY(sTextMsg) SEND_SILENT_TEXT_MESSAGE_TO_PLAYER_CHARACTER(CHAR_LESTER, SILENT_FRANKLIN, sTextMsg, TXTMSG_UNLOCKED) // SEND_TEXT_MESSAGE_TO_CHARACTER_BUFFER(CHAR_FRANKLIN, CHAR_LESTER, sTextMsg, TXTMSG_UNLOCKED) ENDIF ENDPROC 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 HANDLE_INTRO_CAMERAS() SWITCH iIntroCameraStages CASE 0 IF ADJUST_CAMERA(camPayPhoneIntro01, 8.0, <<-728.4891, -933.7799, 19.9947>>, <<-4.0865, 0.0581, -61.3739>>, 30.7441, TRUE, 0.2) PRINTLN("iIntroCameraStages = 1") iIntroCameraStages = 1 ENDIF BREAK CASE 1 IF ADJUST_CAMERA(camPayPhoneIntro01, 14.0, <<-702.2474, -918.3937, 19.7582>>, <<-1.9904, 0.0000, -56.7173>>, 30.0, TRUE, 0.3) PRINTLN("iIntroCameraStages = 2") iIntroCameraStages = 2 ENDIF BREAK CASE 2 IF ADJUST_CAMERA(camPayPhoneIntro01, 23.0, <<-698.2410, -917.8708, 19.5330>>, <<-3.3396, -0.0000, 75.4344>>, 40.0, TRUE, 0.3) PRINTLN("iIntroCameraStages = 3") iIntroCameraStages = 3 ENDIF BREAK CASE 3 // Tighten the Fov on this one IF ADJUST_CAMERA(camPayPhoneIntro01, 28.0, <<-716.4577, -945.2582, 19.8525>>, <<-1.1558, -0.0000, -21.0827>>, 31.0, TRUE, 0.2) PRINTLN("iIntroCameraStages = 4") iIntroCameraStages = 4 ENDIF BREAK CASE 4 IF ADJUST_CAMERA(camPayPhoneIntro01, 33.0, <<-702.0552, -917.9715, 19.7381>>, <<-3.1893, 0.0000, -63.3392>>, 33.4611, TRUE, 0.2) PRINTLN("iIntroCameraStages = 5") iIntroCameraStages = 5 ENDIF BREAK CASE 5 IF ADJUST_CAMERA(camPayPhoneIntro01, 39.0, <<-697.3740, -918.0989, 19.8386>>, <<-4.5194, 0.0000, 86.2972>>, 42.0, TRUE, 0.2) PRINTLN("iIntroCameraStages = 6") iIntroCameraStages = 6 ENDIF BREAK CASE 6 BREAK ENDSWITCH ENDPROC PROC REMOVE_SKINNED_PHONE_PROP() VECTOR vPlayerPosition IF NOT DOES_ENTITY_EXIST(oPayPhoneAnimated) EXIT ENDIF IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID()) ENDIF IF VDIST2(vPlayerPosition, 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 IF payPhoneCutsceneStages < PAYPHONE_CUTSCENE_CLEANUP SET_HD_AREA(<< -717.83478, -932.17358, 18.01735 >>, 26.0) // PRINTLN("SET_HD_AREA of 26.0 m around << -718.92120, -932.86932, 18.01735 >>") ENDIF SWITCH payPhoneCutsceneStages CASE PAYPHONE_CUTSCENE_INIT REQUEST_ANIM_DICT("oddjobs@assassinate@multi@call") PRINTLN("REQUESTING ANIM DICTIONARY - oddjobs@assassinate@multi@call") REQUEST_MODEL(P_PHONEBOX_01B_S) PRINTLN("REQUESTING MODEL - P_PHONEBOX_01B_S") INIT_PARKED_VEHICLE_MODELS_FOR_GAS_STATION() SETTIMERA(0) // WHILE NOT REQUEST_SCRIPT_AUDIO_BANK("SCRIPT\\ASSASSINATION_MULTI") AND TIMERA() < 5000 // PRINTLN("SCRIPT\\ASSASSINATION_MULTI - Waiting on audio bank to load") // WAIT(0) // ENDWHILE // PRINTLN("Loaded audio bank SCRIPT\\ASSASSINATION_MULTI") // REQUEST_SCRIPT_AUDIO_BANK("SCRIPT\\ASSASSINATION_MULTI") IF HAS_ANIM_DICT_LOADED("oddjobs@assassinate@multi@call") AND HAS_MODEL_LOADED(P_PHONEBOX_01B_S) AND ARE_PARKED_VEHICLE_MODELS_STREAMED() bContinueWithScene = TRUE ENDIF IF bContinueWithScene IF DOES_ENTITY_EXIST(oPayPhone) RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<-736.790771,-924.130310,18.163729>>, <<-696.861389,-923.751709,19.658636>>, 45.0, <<-711.86017, -920.71411, 18.01450>>, 0.0954, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR()) PRINTLN("REPOSITIONING VEHICLE") CLEAR_AREA(<<-700.122620,-916.869873,18.1667>>, 5.0, 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, <<-700.122620,-916.869873,18.214081>>) // Having to lower prop for some reason?! ... to fix Bug # 1352784 oPayPhoneAnimated = CREATE_OBJECT(P_PHONEBOX_01B_S, <<-700.122620,-916.869873,18.1667>>) SET_ENTITY_ROTATION(oPayPhoneAnimated, <<0.000000,0.000000,0.000000>>) SET_ENTITY_COLLISION(oPayPhoneAnimated, FALSE) SET_ENTITY_CAN_BE_DAMAGED(oPayPhoneAnimated, FALSE) PRINTLN("CREATING SKINNED VERSION OF PROP") ENDIF svPhoneCutscene = STREAMVOL_CREATE_SPHERE(<<-700.122620,-916.869873,18.1667>>, 350, FLAG_MAPDATA) PRINTLN("CREATING STREAM VOLUME - svPhoneCutscene") // Start the cutscene. SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE) 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 iSceneIdPayPhone = CREATE_SYNCHRONIZED_SCENE(scenePosition, sceneRotation) IF DOES_ENTITY_EXIST(oPayPhoneAnimated) ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSceneIdPayPhone, oPayPhoneAnimated, -1) PRINTLN("oPayPhone EXISTS, ATTACHING SCENE TO IT") ELSE PRINTLN("NOTHING EXISTS") ENDIF // Franklin Animation TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSceneIdPayPhone, "oddjobs@assassinate@multi@call", "ass_multi_target_call_p1", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT, SYNCED_SCENE_TAG_SYNC_OUT) PRINTLN("TASKING FRANKLIN TO TALK ON THE PHONE") // Phone Prop Animation PLAY_SYNCHRONIZED_ENTITY_ANIM(oPayPhoneAnimated, iSceneIdPayPhone, "ass_multi_target_call_phone", "oddjobs@assassinate@multi@call", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT) PRINTLN("PLAYING ANIMATION ON PAYPHONE PROP") // Camera Creation IF NOT DOES_CAM_EXIST(camPayPhoneIntro01) camPayPhoneIntro01a = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vCameraPosition01a, vCameraRotation01a, 35.0, TRUE) // Change to animated once cam is online camPayPhoneIntro01 = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vCameraPosition01, vCameraRotation01, 35.0, FALSE) // Change to animated once cam is online SET_CAM_ACTIVE_WITH_INTERP(camPayPhoneIntro01, camPayPhoneIntro01a, 2500) RENDER_SCRIPT_CAMS(TRUE, FALSE) PRINTLN("CREATING CAMERA - camPayPhoneIntro01") SHAKE_CAM(camPayPhoneIntro01, "HAND_SHAKE", 0.2) ENDIF CREATE_VEHICLES_AT_GAS_STATION_OF_PHONE_CUTSCENE() // Camera Animation // PLAY_SYNCHRONIZED_CAM_ANIM(camPayPhoneIntro01, iSceneIdPayPhone, "ass_multi_target_call_cam", "oddjobs@assassinate@multi@call") // PRINTLN("PLAYING ANIMATION ON CAMERA") // Setup speakers ADD_PED_FOR_DIALOGUE(args.assConv, 3, NULL, "LESTER") ADD_PED_FOR_DIALOGUE(args.assConv, 1, PLAYER_PED_ID(), "FRANKLIN") // Turn off HUD elements DISPLAY_RADAR(FALSE) DISPLAY_HUD(FALSE) // DISABLE_NAVMESH_IN_AREA(<< vPhoneLocation.x-20, vPhoneLocation.y-20, vPhoneLocation.z-20 >>, << vPhoneLocation.x+20, vPhoneLocation.y+20, vPhoneLocation.z+20 >>, TRUE) 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("MULTI: GOING TO STATE - PAYPHONE_CUTSCENE_UPDATE") ELSE REQUEST_ANIM_DICT("oddjobs@assassinate@multi@call") PRINTLN("REQUESTING ANIM DICTIONARY - oddjobs@asssasinate@multi@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("MULTI: PAYPHONE WAS NOT FOUND IN TRIGGER SCENE, FIND IN SCRIPT") ENDIF ENDIF ENDIF BREAK //---------------------------------------------------------------------------------------------------------------------- CASE PAYPHONE_CUTSCENE_UPDATE HANDLE_INTRO_CAMERAS() IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) ENDIF 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("MULTI: 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(iSceneIdPayPhone) IF GET_SYNCHRONIZED_SCENE_PHASE(iSceneIdPayPhone) > 0.05 IF CREATE_CONVERSATION(args.assConv, "OJASAUD", "OJAScnt_ml", 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) AND GET_TIMER_IN_SECONDS(tPayphoneCutsceneTimer) > fCutsceneLength) OR (IS_SYNCHRONIZED_SCENE_RUNNING(iSceneIdPayPhone) AND GET_SYNCHRONIZED_SCENE_PHASE(iSceneIdPayPhone) >= 0.978) OR bSkipCutscene payPhoneCutsceneStages = PAYPHONE_CUTSCENE_CLEANUP PRINTLN("MULTI: GOING TO STATE - PAYPHONE_CUTSCENE_CLEANUP") 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(), <<-700.2628, -917.5313, 18.2147>>) SET_ENTITY_HEADING(PLAYER_PED_ID(), 73.3924) PRINTLN("MOVING FRANKLIN - SKIP CUTSCENE") ENDIF 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 SET_ENTITY_COLLISION(oPayPhoneAnimated, TRUE) CLEAR_HD_AREA() 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@multi@call") SET_OBJECT_AS_NO_LONGER_NEEDED(oPayPhone) curStage = MISSION_STATE_INIT PRINTLN("MULTI: GOING TO STATE - MISSION_STATE_INIT") BREAK ENDSWITCH ENDPROC //main update loop for the assassination FUNC BOOL UPDATE_ASSASSINATION_MULTI(ASS_TARGET_DATA& targetData, ASS_ARGS& args) // INT iWantedLevel = 0 SEQUENCE_INDEX tempSeq SWITCH curStage // CASE MISSION_STATE_TIME_LAPSE // timeLapseCutscene() // BREAK CASE MISSION_BRIEF_INIT IF Is_Replay_In_Progress() curStage = MISSION_STATE_INIT BREAK ENDIF DO_STAGE_INTRO_CUTSCENE(args) BREAK //print the objectives and help messages immediately after launching the mission CASE MISSION_STATE_INIT targetData.myType = MISSION_NAME_MULTI IF bReplaying AND NOT bCheckpointDataSet //handle checkpoint start pos, wanted level, player vehicle position (if applicable), and time remaining // IF g_savedGlobals.sAssassinData.fMultiMissionTime <> 0 // RESTART_TIMER_AT(tMissionTime, g_savedGlobals.sAssassinData.fMultiMissionTime) // PRINTLN("RESTARTING TIMER - missionTimer AT: ", g_savedGlobals.sAssassinData.fMultiMissionTime) // ENDIF //assign the iCheckpointSavedTime based on the saved global variable iCheckpointSavedTime = g_replay.iReplayInt[0] PRINTLN("iCheckpointSavedTime = ", iCheckpointSavedTime) IF iStageToUse = 0 iNumTargetsKilled = 0 fMissionTime = fMissionTime ELIF iStageToUse = 1 iNumTargetsKilled = 1 PRINTLN("g_savedGlobals.sAssassinData.fMultiMissionTime = ", g_savedGlobals.sAssassinData.fMultiMissionTime) IF iCheckpointSavedTime < (fMissionTime) * 3/4 OR bPlayerHasShitSkipped fMissionTime = (fMissionTime * 3/4) ELSE fMissionTime = TO_FLOAT(iCheckpointSavedTime) ENDIF PRINTLN("iStageToUse = 1 - fMissionTime = ", fMissionTime) ELIF iStageToUse = 2 iNumTargetsKilled = 2 PRINTLN("g_savedGlobals.sAssassinData.fMultiMissionTime = ", g_savedGlobals.sAssassinData.fMultiMissionTime) IF iCheckpointSavedTime < (fMissionTime) * 1/2 OR bPlayerHasShitSkipped fMissionTime = (fMissionTime * 1/2) ELSE fMissionTime = TO_FLOAT(iCheckpointSavedTime) ENDIF PRINTLN("iStageToUse = 2 - fMissionTime = ", fMissionTime) ELIF iStageToUse = 3 iNumTargetsKilled = 3 PRINTLN("g_savedGlobals.sAssassinData.fMultiMissionTime = ", g_savedGlobals.sAssassinData.fMultiMissionTime) IF iCheckpointSavedTime < (fMissionTime) * 1/4 OR bPlayerHasShitSkipped fMissionTime = (fMissionTime * 1/4) ELSE fMissionTime = TO_FLOAT(iCheckpointSavedTime) ENDIF PRINTLN("iStageToUse = 3 - fMissionTime = ", fMissionTime) ELIF iStageToUse = 4 fMissionTime = iTOTAL_TIME_ALLOTTED PRINTLN("iStageToUse = 4 - fMissionTime = ", fMissionTime) ENDIF START_TIMER_NOW(tMissionTime) //set the current target IF iStageToUse < 4 curTarget = INT_TO_ENUM(CURRENT_ASSASSIN_TARGET, iNumTargetsKilled) ENDIF bCheckpointDataSet = TRUE ELSE IF NOT IS_TIMER_STARTED(tMissionTime) START_TIMER_NOW(tMissionTime) PRINTLN("STARTING TIMER - tMissionTime") g_savedGlobals.sAssassinData.fMultiMissionTime = 0 PRINTLN("MULTI GLOBAL MISSION TIMER = ", g_savedGlobals.sAssassinData.fMultiMissionTime) ENDIF ENDIF // IF iNumTargetsKilled = 0 // PREPARE_MUSIC_EVENT("ASS2_BB_OS") // PRINTLN("PREPARING MUSIC EVENT - ASS2_BB_OS") // ENDIF // // Timer for music prep // IF NOT IS_TIMER_STARTED(tPrepMusicTimer) // START_TIMER_NOW(tPrepMusicTimer) // PRINTLN("STARTING TIMER - tPrepMusicTimer") // ELSE // RESTART_TIMER_NOW(tPrepMusicTimer) // PRINTLN("RESTARTING TIMER - tPrepMusicTimer") // IF bPrepareMusic // bPrepareMusic = FALSE // PRINTLN("bPrepareMusic = FALSE") // ENDIF // ENDIF IF iStageToUse < 4 //initialize necessities for mission and create peds/vehicles/props for current assassination scene INIT_CURRENT_TARGET_DATA(targetData) INIT_LEAVE_AREA_LOCATIONS() ENDIF //Do any necessary requests and check to see if a replay vehicle should be created IF bReplayVehicleAvailable INIT_MISSION_REQUESTS_AND_UI_LABELS(targetData, sLoadQueue, TRUE) CLEAR_AREA(vVehReplayStartPos, 5.0, TRUE) //create the replay vehicle but make sure it isnt a water based vehicle (sso we dont spawn it on land) VEHICLE_INDEX vehPlayer vehPlayer = CREATE_REPLAY_CHECKPOINT_VEHICLE(vVehReplayStartPos, fVehReplayStartHead) 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) ELSE DELETE_VEHICLE(vehPlayer) ENDIF ELSE INIT_MISSION_REQUESTS_AND_UI_LABELS(targetData, sLoadQueue) ENDIF IF curTarget = ASSASSIN_TARGET_BODYBUILDER AND iStageToUse != 4 //create these if they haven't already been created CREATE_VEHICLES_AT_GAS_STATION_OF_PHONE_CUTSCENE() ENDIF IF bReplaying END_REPLAY_SETUP() IF IS_SCREEN_FADED_OUT() SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() ENDIF ENDIF //make sure game fades in (if retrying mission) FADE_IN() IF iStageToUse < 4 curStage = MISSION_STATE_STREAMING PRINTLN("curStage = MISSION_STATE_STREAMING") ELSE CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID()) curStage = MISSION_STATE_SUCCESS PRINTLN("curStage = MISSION_STATE_SUCCESS") ENDIF BREAK CASE MISSION_STATE_STREAMING IF ARE_MISSION_REQUESTS_FINISHED_STREAMING(targetData, sLoadQueue) AND IS_CURRENT_TARGET_DATA_LOADED_NO_PEDS(targetData) PRINTLN("GOING TO STATE - MISSION_STATE_PRINTS") curStage = MISSION_STATE_PRINTS ENDIF BREAK CASE MISSION_STATE_PRINTS SETTIMERA(0) SEND_TEXT_MESSAGE_FOR_CURRENT_TARGET() DO_SET_CHECKPOINT() //STORE OFF THE CHECKPOINT TIMER AS THE GLOBAL MISSION VARIABLE SO THAT IT CAN BE ACCESSED ON REPLAYS iCheckpointSavedTime = iTimeToDisplayOnTimer g_replay.iReplayInt[0] = iCheckpointSavedTime //store this off here so it can be accessed on replays PRINTLN("STORING OFF iCheckpointSavedTime AS: ", iCheckpointSavedTime) // blip location and set route IF NOT DOES_BLIP_EXIST(args.myTargetBlip) args.myTargetBlip = ADD_BLIP_FOR_COORD(targetData.vDestPos) SET_BLIP_ROUTE(args.myTargetBlip, TRUE) SET_BLIP_ROUTE_COLOUR(args.myTargetBlip, BLIP_COLOUR_RED) SET_BLIP_COLOUR(args.myTargetBlip, BLIP_COLOUR_RED) PRINTLN("CREATING BLIP MULTI - args.myTargetBlip") ENDIF curStage = MISSION_STATE_TRAVEL PRINTLN("curStage = MISSION_STATE_TRAVEL") BREAK CASE MISSION_STATE_TRAVEL REMOVE_SKINNED_PHONE_PROP() // HANDLE_RADIO_NEWS_EVENTS() IF NOT bGaveTextMessage IF TIMERA() > 15000 DO_CURRENT_TARGET_OBJECTIVE_PRINT() // Moving to fix Bug # 1487350 - DS bGaveTextMessage = TRUE ENDIF ENDIF IF iNumTargetsKilled = 0 GRAB_RETRY_VEHICLE() ENDIF // Special check to see if the player is close enough to attach the ropes to the window washer prop. ATTACH_ROPE_TO_PROPS(targetData, args) IF bAttachedRope HANDLE_SHOT_ROPE() ENDIF // HANDLE_MUSIC_PREP() HANDLE_LEAVE_AREA_TRIGGER() //remove the yacht from memory if the player has killed the yacht target and is a good distance away from the yacht IF curTarget >= ASSASSIN_TARGET_WASHER IF DOES_ENTITY_EXIST(viYacht) IF GET_DISTANCE_BETWEEN_ENTITIES(viYacht, PLAYER_PED_ID()) > 500 SET_VEHICLE_AS_NO_LONGER_NEEDED(viYacht) ENDIF ENDIF ENDIF IF NOT bPedsForCurrentTargetCreated IF curTarget = ASSASSIN_TARGET_BODYBUILDER IF GET_PLAYER_DISTANCE_FROM_LOCATION(targetData.vDestPos) < 400 OR GET_PLAYER_DISTANCE_FROM_LOCATION(targetData.vTargetPos) < 400 IF IS_BODYBUILDER_DATA_LOADED_PEDS_ONLY(targetData) CREATE_ASSASSINATION_SCENE(targetData, assArgs) CREATE_ADDITIONAL_NEEDS_FOR_CURRENT_TARGET(targetData, assArgs) bPedsForCurrentTargetCreated = TRUE ENDIF ENDIF ELIF curTarget = ASSASSIN_TARGET_YACHT IF GET_PLAYER_DISTANCE_FROM_LOCATION(targetData.vDestPos) < 400 OR GET_PLAYER_DISTANCE_FROM_LOCATION(targetData.vTargetPos) < 400 IF IS_YACHT_DATA_LOADED_PEDS_ONLY(targetData) CREATE_ASSASSINATION_SCENE(targetData, assArgs) CREATE_ADDITIONAL_NEEDS_FOR_CURRENT_TARGET(targetData, assArgs) bPedsForCurrentTargetCreated = TRUE ENDIF ENDIF ELIF curTarget = ASSASSIN_TARGET_WASHER IF GET_PLAYER_DISTANCE_FROM_LOCATION(targetData.vDestPos) < 400 OR GET_PLAYER_DISTANCE_FROM_LOCATION(targetData.vTargetPos) < 400 IF IS_WASHER_DATA_LOADED_PEDS_ONLY(targetData) CREATE_ASSASSINATION_SCENE(targetData, assArgs) CREATE_ADDITIONAL_NEEDS_FOR_CURRENT_TARGET(targetData, assArgs) bPedsForCurrentTargetCreated = TRUE ENDIF ENDIF ELIF curTarget = ASSASSIN_TARGET_BIKER IF GET_PLAYER_DISTANCE_FROM_LOCATION(targetData.vDestPos) < 500 OR GET_PLAYER_DISTANCE_FROM_LOCATION(targetData.vTargetPos) < 500 IF IS_BIKER_DATA_LOADED_PEDS_ONLY(targetData) CREATE_ASSASSINATION_SCENE(targetData, assArgs) CREATE_ADDITIONAL_NEEDS_FOR_CURRENT_TARGET(targetData, assArgs) bPedsForCurrentTargetCreated = TRUE ENDIF ENDIF ENDIF ELSE IF CHECK_FOR_TARGET_DEATH(assArgs, targetData) OR ( bRopeDetached = TRUE AND curTarget = ASSASSIN_TARGET_WASHER) IF curTarget = ASSASSIN_TARGET_BODYBUILDER TASK_BYSTANDERS_TO_FLEE(TRUE) ENDIF curStage = MISSION_STATE_KILLCAM PRINTLN("curStage = MISSION_STATE_KILLCAM") ELSE IF NOT HAS_PLAYER_TRIGGERED_PREMATURE_PANIC_FOR_CURRENT_TARGET(assArgs) IF IS_PLAYER_IN_CUTSCENE_RANGE(targetData, args) OR ( IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), args.myTarget) AND GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < 150.0 ) OR ( IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), args.myTarget) AND GET_PLAYER_DISTANCE_FROM_ENTITY(args.myTarget) < 150.0 ) ADJUST_FAIL_DISTANCE_IF_NEEDED(args.myTarget) // curStage = MISSION_STATE_CUTSCENE_SETUP // PRINTLN("curStage = MISSION_STATE_CUTSCENE_SETUP") curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL PRINTLN("curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL") ELSE //play necessary anims for the target so they aren't seen standing still prior to triggering the cutscene IF curTarget = ASSASSIN_TARGET_BODYBUILDER IF NOT bWarning UPDATE_BODYBUILDER_ANIMS(targetData, args) ENDIF ELIF curTarget = ASSASSIN_TARGET_YACHT UPDATE_YACHT_PEDS(args) ENDIF ENDIF ELSE bPanicking = TRUE ADJUST_FAIL_DISTANCE_IF_NEEDED(args.myTarget) curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL PRINTLN("PED PANICKING - BYPASSING CUTSCENE AND MOVING STRAIGHT TO MISSION_STATE_WAITING_FOR_TARGET_KILL") ENDIF ENDIF ENDIF BREAK // //intro cutscene has been triggered - set it up properly // CASE MISSION_STATE_CUTSCENE_SETUP // //setup cutscene // /* To Fix Bug # 565173 - for some reason if you disable vehicle controls while on an incline, // your car will float up in the air. Need to find a better solution for this.*/ // IF curTarget = ASSASSIN_TARGET_WASHER // IF IS_PLAYER_READY_FOR_ASSASSINATION_CUTSCENE_WASHER() // //reset washer to make sure he is playing his anims during his cutscene in next stage (to fix Bug 535924) //// IF curTarget = ASSASSIN_TARGET_WASHER //// IF NOT IS_PED_INJURED(args.myTarget) //// CLEAR_PED_TASKS(args.myTarget) //// SET_ENTITY_COORDS(args.myTarget, targetData.vTargetPos) //// SET_ENTITY_HEADING(args.myTarget, targetData.fTargetHead) //// ENDIF //// ENDIF // //// GET_CURRENT_TARGET_CUTSCENE() // GET_ASSASSIN_CUTSCENE_START_TIME() // curStage = MISSION_STATE_CUTSCENE // PRINTLN("curStage = MISSION_STATE_CUTSCENE") // ENDIF // ELSE // IF IS_PLAYER_READY_FOR_ASSASSINATION_CUTSCENE() // //reset washer to make sure he is playing his anims during his cutscene in next stage (to fix Bug 535924) //// IF curTarget = ASSASSIN_TARGET_WASHER //// IF NOT IS_PED_INJURED(args.myTarget) //// CLEAR_PED_TASKS(args.myTarget) //// SET_ENTITY_COORDS(args.myTarget, targetData.vTargetPos) //// SET_ENTITY_HEADING(args.myTarget, targetData.fTargetHead) //// ENDIF //// ENDIF // //// GET_CURRENT_TARGET_CUTSCENE() // GET_ASSASSIN_CUTSCENE_START_TIME() // // curStage = MISSION_STATE_CUTSCENE // PRINTLN("curStage = MISSION_STATE_CUTSCENE") // ENDIF // ENDIF // BREAK // //intro cutscene has been triggered - set it up properly // CASE MISSION_STATE_CUTSCENE // IF DO_CUTSCENE_CUSTOM(cutArgs.cutsceneState, cutArgs.cutSceneTimer, targetData.vCutscenePos, targetData.vCutsceneHead, myCamera, "", fpCutsceneCustomIntro, FALSE, FALSE, FALSE, targetData.fCutsceneDoF) // CLEAR_AREA_OF_COPS(GET_ENTITY_COORDS(PLAYER_PED_ID()), 35) // FADE_IN() // // IF curTarget = ASSASSIN_TARGET_YACHT // IF DOES_ENTITY_EXIST(args.myVehicle) AND IS_VEHICLE_DRIVEABLE(args.myVehicle) // SET_ENTITY_LOD_DIST(args.myVehicle, 500) // ENDIF // ENDIF // // IF CHECK_FOR_TARGET_DEATH(args, targetData) // IF curTarget = ASSASSIN_TARGET_BODYBUILDER // TASK_BYSTANDERS_TO_FLEE(TRUE) // ENDIF // curStage = MISSION_STATE_KILLCAM // PRINTLN("curStage = MISSION_STATE_KILLCAM") // ELSE // curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL // PRINTLN("curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL") // ENDIF // ELSE // IF curTarget = ASSASSIN_TARGET_BODYBUILDER // IF NOT IS_PED_INJURED(args.myTarget) // UPDATE_BODYBUILDER_ANIMS(targetData, args) // ENDIF // ELIF curTarget = ASSASSIN_TARGET_YACHT // UPDATE_YACHT_PEDS(args) // ELIF curTarget = ASSASSIN_TARGET_BIKER // UPDATE_BIKER_IN_CUTSCENE(args) //// ELIF curTarget = ASSASSIN_TARGET_WASHER //// UPDATE_WASHER_ANIMS(args) // ENDIF // ENDIF // BREAK //waiting for player to kill the target CASE MISSION_STATE_WAITING_FOR_TARGET_KILL // Special check to see if the player is close enough to attach the ropes to the window washer prop. ATTACH_ROPE_TO_PROPS(targetData, args) IF CHECK_FOR_TARGET_DEATH(assArgs, targetData) OR bRopeDetached IF bRopeDetached AND NOT IS_PED_INJURED(args.myTarget) //have window washer target scream as he falls KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() PLAY_PAIN(args.myTarget, AUD_DAMAGE_REASON_FALLING) ENDIF KILL_CHASE_HINT_CAM(localChaseHintCamStruct) // IF curTarget = ASSASSIN_TARGET_BODYBUILDER // TRIGGER_MUSIC_EVENT("ASS2_BB_OS") // PRINTLN("TRIGGERING MUSIC - ASS2_BB_OS") // ELIF curTarget = ASSASSIN_TARGET_YACHT // TRIGGER_MUSIC_EVENT("ASS2_YCT_OS") // PRINTLN("TRIGGERING MUSIC - ASS2_YCT_OS") // ELIF curTarget = ASSASSIN_TARGET_WASHER // TRIGGER_MUSIC_EVENT("ASS2_WW_OS") // PRINTLN("TRIGGERING MUSIC - ASS2_WW_OS") // ELIF curTarget = ASSASSIN_TARGET_BIKER // TRIGGER_MUSIC_EVENT("ASS2_BKR_OS") // PRINTLN("TRIGGERING MUSIC - ASS2_BKR_OS") // ENDIF IF NOT IS_TIMER_STARTED(tLeaveAreaTimer) START_TIMER_NOW(tLeaveAreaTimer) PRINTLN("STARTING TIMER - tLeaveAreaTimer") ELSE RESTART_TIMER_NOW(tLeaveAreaTimer) PRINTLN("RESTARTING TIMER - tLeaveAreaTimer") ENDIF IF curTarget = ASSASSIN_TARGET_BODYBUILDER TASK_BYSTANDERS_TO_FLEE(TRUE) ENDIF KILL_ANY_CONVERSATION() SETTIMERA(0) curStage = MISSION_STATE_KILLCAM PRINTLN("curStage = MISSION_STATE_KILLCAM") ELSE UPDATE_CURRENT_TARGET(targetData, assArgs) // HANDLE_RADIO_NEWS_EVENTS() ENDIF BREAK //play the kill cam cutscene CASE MISSION_STATE_KILLCAM // IF ( curTarget = ASSASSIN_TARGET_WASHER AND HAS_SLOW_KILLCAM_FINISHED(args.myTarget, TRUE, FALSE) ) //don't play slow motion camera // OR ( curTarget <> ASSASSIN_TARGET_WASHER AND HAS_SLOW_KILLCAM_FINISHED(args.myTarget) ) STRING sKillLine IF curTarget = ASSASSIN_TARGET_BODYBUILDER sKillLine = "OJAS_BDCOM" ELIF curTarget = ASSASSIN_TARGET_YACHT sKillLine = "OJAS_YACOM" ELIF curTarget = ASSASSIN_TARGET_WASHER sKillLine = "OJAS_WWCOM" ELIF curTarget = ASSASSIN_TARGET_BIKER sKillLine = "OJAS_BICOM" ENDIF IF DOES_BLIP_EXIST(args.myTargetBlip) REMOVE_BLIP(args.myTargetBlip) ENDIF HANDLE_FRANKLIN_PLAYING_TARGET_KILL_LINE(bTargetKillLinePlayed, args.assConv, "OJASAUD", sKillLine, CONV_PRIORITY_VERY_HIGH) IF bTargetKillLinePlayed OR TIMERA() > 1000 IF NOT IS_PED_INJURED(args.myTarget) AND curTarget = ASSASSIN_TARGET_WASHER SET_ENTITY_HEALTH(args.myTarget, 0) //to account for window washer possibly still being alive if the ropes were shot out and he is still falling ENDIF IF curTarget = ASSASSIN_TARGET_YACHT IF NOT IS_PED_INJURED(args.myOtherPed) //make sure the girl on the yacht contiunes to cower if she isn't already dead OPEN_SEQUENCE_TASK(tempSeq) TASK_PLAY_ANIM(NULL, "oddjobs@assassinate@multi@yachttarget@lapdance", "exit_quick_f") TASK_PLAY_ANIM(NULL, "oddjobs@assassinate@multi@yachttarget@lapdance", "exit_cower_loop_f", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(tempSeq) TASK_PERFORM_SEQUENCE(args.myOtherPed, tempSeq) CLEAR_SEQUENCE_TASK(tempSeq) ENDIF IF DOES_ENTITY_EXIST(args.myVehicle) IF IS_VEHICLE_DRIVEABLE(args.myVehicle) SET_VEHICLE_HAS_BEEN_DRIVEN_FLAG(args.myVehicle, FALSE) ENDIF ENDIF ENDIF //increment this iNumTargetsKilled ++ // //reset variables to prepare for next target // INITIALIZE_NEXT_STAGE(targetData) //increment the players wanted level by 1 after each target is killed (starting after killing the 2nd target) // IF iNumTargetsKilled > 1 // SET_PLAYER_WANTED_LEVEL_NO_DROP_NOW(iNumTargetsKilled - 1) // ENDIF //create next target or advance to next stage if all have been eliminated IF iNumTargetsKilled >= NUM_ASSASSIN_TARGETS curStage = MISSION_STATE_SUCCESS PRINTLN("curStage = MISSION_STATE_SUCCESS") ELSE //flush ped asset requests to ready for next target RESET_TARGET_DATA(targetData, assArgs) //reset all variables to prepare for next target INITIALIZE_NEXT_STAGE(targetData) curStage = MISSION_STATE_INIT PRINTLN("INIT NEXT TARGET!") ENDIF ENDIF // ENDIF BREAK //pass the mission CASE MISSION_STATE_SUCCESS IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0 IF HAS_ENDING_CELL_PHONE_CALL_COMPLETED(args) RETURN TRUE ENDIF ELSE IF NOT bLoseCopsPrinted PRINT_NOW("ASS_ML_COPS", DEFAULT_GOD_TEXT_TIME, 1) RESTART_TIMER_NOW(tPoliceScanner) bLoseCopsPrinted = TRUE ELSE IF TIMER_DO_ONCE_WHEN_READY(tPoliceScanner, 2) PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_ASS_MULTI_01", 0.0) ENDIF ENDIF ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC PROC SKIP_CLEANUP_HELPER(ASS_ARGS& args, ASS_TARGET_DATA& targetData) IF bDoingPSkip //rope stuff // DELETE_ROPE now doesn't crash even rope doesn't exists anymore // DELETE_ROPE will also delete all parent ropes, in this specific scenarion , rope A or B might have been broken ROPE_UNLOAD_TEXTURES() DELETE_ROPE(ropeWindowA) PRINTLN("DELETING ropeWindowA THROUGH P-SKIP") DELETE_ROPE(ropeWindowB) PRINTLN("DELETING ropeWindowB THROUGH P-SKIP") IF bAttachedRope bAttachedRope = FALSE PRINTLN("SETTING bAttachedRope = FALSE VIA P-SKIP") ENDIF REMOVE_ALL_ENTITIES_IN_ASS_STRUCT(args) iRopeStages = 0 // IF DOES_CAM_EXIST(camKill) // DESTROY_CAM(camKill) // ENDIF RESET_TARGET_DATA(targetData, assArgs) INIT_MISSION_REQUESTS_AND_UI_LABELS(targetData, sLoadQueue) INITIALIZE_NEXT_STAGE(targetData) INIT_CURRENT_TARGET_DATA(targetData) WHILE NOT IS_CURRENT_TARGET_DATA_LOADED_NO_PEDS(targetData) WAIT(0) ENDWHILE bCheckpointDataSet = TRUE // //setup the scene // CREATE_ASSASSINATION_SCENE(targetData, assArgs) // CREATE_ADDITIONAL_NEEDS_FOR_CURRENT_TARGET(targetData, assArgs) curStage = MISSION_STATE_PRINTS PRINTLN("curStage = MISSION_STATE_PRINTS - DOING p-SKIP") bDoingPSkip = FALSE FADE_IN() IF iNumTargetsKilled < 4 curStage = MISSION_STATE_PRINTS ELSE curStage = MISSION_STATE_SUCCESS ENDIF ENDIF ENDPROC PROC GO_TO_CHECKPOINT_1(ASS_ARGS& args, ASS_TARGET_DATA& targetData) PRINTLN("Trying to start from checkpoint 1") CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID()) // GIVE_PLAYER_WEAPONS(WEAPONTYPE_HEAVYSNIPER, 10) // GIVE_PLAYER_WEAPONS(WEAPONTYPE_PISTOL, 25) //teleport player to checkpoint pos SET_ENTITY_COORDS(PLAYER_PED_ID(), vFirstCheckpointStartPos) SET_ENTITY_HEADING(PLAYER_PED_ID(), fFirstCheckpointStartHeading) SET_GAMEPLAY_CAM_RELATIVE_HEADING() iNumTargetsKilled = 0 SKIP_CLEANUP_HELPER(args, targetData) ENDPROC PROC GO_TO_CHECKPOINT_2(ASS_ARGS& args, ASS_TARGET_DATA& targetData) PRINTLN("Trying to start from checkpoint 2") VECTOR vCheckpointStartPos FLOAT fCheckpointStartHeading CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID()) vCheckpointStartPos = << -1205.3925, -1548.0220, 3.3229 >> fCheckpointStartHeading = 30.1673 // GIVE_PLAYER_WEAPONS(WEAPONTYPE_HEAVYSNIPER, 10) // GIVE_PLAYER_WEAPONS(WEAPONTYPE_PISTOL, 25) //teleport player to checkpoint pos SET_ENTITY_COORDS(PLAYER_PED_ID(), vCheckpointStartPos) SET_ENTITY_HEADING(PLAYER_PED_ID(), fCheckpointStartHeading) SET_GAMEPLAY_CAM_RELATIVE_HEADING() iNumTargetsKilled = 1 SKIP_CLEANUP_HELPER(args, targetData) ENDPROC PROC GO_TO_CHECKPOINT_3(ASS_ARGS& args, ASS_TARGET_DATA& targetData) PRINTLN("Trying to start from checkpoint 3") VECTOR vCheckpointStartPos FLOAT fCheckpointStartHeading CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID()) vCheckpointStartPos = << -2178.8555, -410.6809, 12.1595 >> fCheckpointStartHeading = 13.1631 // GIVE_PLAYER_WEAPONS(WEAPONTYPE_HEAVYSNIPER, 10) // GIVE_PLAYER_WEAPONS(WEAPONTYPE_PISTOL, 25) //teleport player to checkpoint pos SET_ENTITY_COORDS(PLAYER_PED_ID(), vCheckpointStartPos) SET_ENTITY_HEADING(PLAYER_PED_ID(), fCheckpointStartHeading) SET_GAMEPLAY_CAM_RELATIVE_HEADING() iNumTargetsKilled = 2 SKIP_CLEANUP_HELPER(args, targetData) ENDPROC PROC GO_TO_CHECKPOINT_4(ASS_ARGS& args, ASS_TARGET_DATA& targetData) PRINTLN("Trying to start from checkpoint 4") VECTOR vCheckpointStartPos FLOAT fCheckpointStartHeading CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID()) vCheckpointStartPos = << -702.8256, 224.2350, 79.1613 >> fCheckpointStartHeading = 291.4638 // GIVE_PLAYER_WEAPONS(WEAPONTYPE_HEAVYSNIPER, 10) // GIVE_PLAYER_WEAPONS(WEAPONTYPE_PISTOL, 25) //teleport player to checkpoint pos SET_ENTITY_COORDS(PLAYER_PED_ID(), vCheckpointStartPos) SET_ENTITY_HEADING(PLAYER_PED_ID(), fCheckpointStartHeading) SET_GAMEPLAY_CAM_RELATIVE_HEADING() iNumTargetsKilled = 3 SKIP_CLEANUP_HELPER(args, targetData) ENDPROC PROC GO_TO_CHECKPOINT_5(ASS_ARGS& args, ASS_TARGET_DATA& targetData) PRINTLN("Trying to start from checkpoint 5") VECTOR vCheckpointStartPos FLOAT fCheckpointStartHeading CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID()) IF DOES_BLIP_EXIST(args.myTargetBlip) REMOVE_BLIP(args.myTargetBlip) ENDIF vCheckpointStartPos = <<-1986.3782, 531.8684, 108.2430>> fCheckpointStartHeading = 149.1485 //teleport player to checkpoint pos SET_ENTITY_COORDS(PLAYER_PED_ID(), vCheckpointStartPos) SET_ENTITY_HEADING(PLAYER_PED_ID(), fCheckpointStartHeading) SET_GAMEPLAY_CAM_RELATIVE_HEADING() iNumTargetsKilled = 4 SKIP_CLEANUP_HELPER(args, targetData) ENDPROC 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 /// PURPOSE: /// /// PARAMS: /// args - /// targetData - /// targetsKilled - NEW number we want for iNumTargetsKilled /// bIsDebugJump - PROC JUMP_TO_STAGE(ASS_ARGS& args, ASS_TARGET_DATA& targetData, INT targetsKilled, BOOL bIsDebugJump = FALSE) DO_FADE_OUT_WITH_WAIT() bDoingPSkip = TRUE //Update mission checkpoint in case they skipped the stages where it gets set. IF bIsDebugJump IF targetsKilled = 0 GO_TO_CHECKPOINT_1(args, targetData) ELIF targetsKilled = 1 GO_TO_CHECKPOINT_2(args, targetData) ELIF targetsKilled = 2 GO_TO_CHECKPOINT_3(args, targetData) ELIF targetsKilled = 3 GO_TO_CHECKPOINT_4(args, targetData) ELIF targetsKilled = 4 GO_TO_CHECKPOINT_5(args, targetData) ENDIF ENDIF ENDPROC // debug builds only for J-skipping #IF IS_DEBUG_BUILD // debug skips PROC DO_DEBUG_SKIPS_MULTI(ASS_ARGS& args, ASS_TARGET_DATA& targetData) IF LAUNCH_MISSION_STAGE_MENU(sSkipMenu, iDebugJumpStage) bDoingPSkip = TRUE JUMP_TO_STAGE(args, targetData, iDebugJumpStage, TRUE) ENDIF IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P) KILL_CHASE_HINT_CAM(localChaseHintCamStruct) IF curStage = MISSION_STATE_TRAVEL //if we're locating the target, go to the checkpoint for the previous target IF iNumTargetsKilled = 0 PRINTLN("You haven't progressed far enough to use the P-SKIP feature.") ELSE JUMP_TO_STAGE(args, targetData, (iNumTargetsKilled - 1), TRUE) ENDIF ELIF curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL //if we're trying to kill a target go to the checkpoint for current target JUMP_TO_STAGE(args, targetData, iNumTargetsKilled, TRUE) ELSE PRINTLN("Can't P-SKIP while in this state! You need to be in locate or kill state.") ENDIF ENDIF // mission pass S IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S) KILL_CHASE_HINT_CAM(localChaseHintCamStruct) CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID()) curStage = MISSION_STATE_SUCCESS ENDIF // mission failed F IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F) KILL_CHASE_HINT_CAM(localChaseHintCamStruct) SET_MISSION_FAILED(assArgs, targetData, FAIL_TIME_EXPIRED) ENDIF //output debug cam coords relative to entity IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_N) OUTPUT_DEBUG_CAM_RELATIVE_TO_ENTITY(args.myVehicle) ENDIF // skip stage J IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J) // KILL_CHASE_HINT_CAM(localChaseHintCamStruct) // // IF curStage < MISSION_STATE_WAITING_FOR_TARGET_KILL // SET_ENTITY_COORDS(PLAYER_PED_ID(), targetData.vDestPos) // ELSE // IF NOT IS_PED_INJURED(args.myTarget) // IF curTarget = ASSASSIN_TARGET_BODYBUILDER // TASK_BYSTANDERS_TO_FLEE(TRUE) // ENDIF // SET_ENTITY_HEALTH(args.myTarget, 0) // curStage = MISSION_STATE_KILLCAM // ELSE // SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0) // ENDIF // ENDIF bDoingPSkip = TRUE KILL_CHASE_HINT_CAM(localChaseHintCamStruct) IF iNumTargetsKilled <= 3 iNumTargetsKilled ++ JUMP_TO_STAGE(args, targetData, iNumTargetsKilled, TRUE) ELSE KILL_CHASE_HINT_CAM(localChaseHintCamStruct) REMOVE_BLIP(args.myTargetBlip) CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID()) curStage = MISSION_STATE_SUCCESS ENDIF ENDIF ENDPROC #ENDIF //PROC CHECK_FOR_ACTION_MODE() // IF NOT bSetActionMode // IF curStage = MISSION_STATE_WAITING_FOR_TARGET_KILL // 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("MULTI: SETTING ACTION MODE ON THE PLAYER TO TRUE") // bSetActionMode = TRUE // ENDIF // ENDIF // ENDIF // ELSE // IF curStage <> MISSION_STATE_WAITING_FOR_TARGET_KILL // 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(), FALSE, -1) // PRINTLN("MULTI: SETTING ACTION MODE ON THE PLAYER TO FALSE") // bSetActionMode = FALSE // ENDIF // ENDIF // ENDIF // ENDIF //ENDPROC //main script SCRIPT(ASS_TARGET_DATA targetData) DEBUG_MESSAGE("Assassination Multi Start") SET_MISSION_FLAG(TRUE) IF (HAS_FORCE_CLEANUP_OCCURRED()) CLEAR_HD_AREA() FLUSH_TEXT_MESSAGE_FEED_ENTRIES() DEBUG_MESSAGE("FORCE CLEANUP HAS OCCURRED!!!") g_savedGlobals.sAssassinData.fMultiMissionTime = GET_PLAYERS_MULTI_MISSION_TIME() PRINTLN("g_savedGlobals.sAssassinData.fMultiMissionTime = ", g_savedGlobals.sAssassinData.fMultiMissionTime) 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() IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE() bReplayVehicleAvailable = TRUE ENDIF bReplaying = TRUE ELSE bReplaying = FALSE ENDIF //disable this since we don't want a target's intro cutscene to be skipped just because the player approached the scene wanted SET_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, EAggro_Wanted) PRINTLN("SETTING BIT TO NOT CHECK WANTED LEVEL") //don't allow the player to hail taxis while the mission is active DISABLE_TAXI_HAILING(TRUE) #IF IS_DEBUG_BUILD // AddWidgets(myDebugData) SETUP_DEBUG() #ENDIF // Fix Bug # 712684 IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, FALSE) ENDIF sbi01 = ADD_SCENARIO_BLOCKING_AREA((vFlexPos - <<2,2,2>>), (vFlexPos + <<2,2,2>>)) ASSASSINATION_ClearUnneededGenericData() iCurAssassinRank = ENUM_TO_INT(ASSASSINATION_Multi) //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") //HANDLE STREAMING AROUND REPLAY START POSITION IF IS_REPLAY_IN_PROGRESS() FLUSH_TEXT_MESSAGE_FEED_ENTRIES() bHaveRetryOnce = TRUE PRINTLN("MULTI: SETTING - bHaveRetryOnce = TRUE") iStageToUse = Get_Replay_Mid_Mission_Stage() PRINTLN("START - REPLAY IS IN PROGRESS, USING STAGE = ", iStageToUse) IF g_bShitskipAccepted bPlayerHasShitSkipped = TRUE iStageToUse ++ //increment this by one since we shit skipped ENDIF IF iStageToUse = 0 vReplayStartPos = vFirstCheckpointStartPos fReplayStartHead = fFirstCheckpointStartHeading vVehReplayStartPos = <<-711.8262, -920.7407, 18.0144>> fVehReplayStartHead = 0.0954 START_REPLAY_SETUP(vFirstCheckpointStartPos, fFirstCheckpointStartHeading) PRINTLN("CALLING START REPLAY SETUP FOR CHECKPOINT = ", iStageToUse) ELIF iStageToUse = 1 vReplayStartPos = << -1205.3925, -1548.0220, 3.3229 >> fReplayStartHead = 30.1673 vVehReplayStartPos = << -1192.2059, -1532.9329, 3.4095 >> fVehReplayStartHead = 304.3640 START_REPLAY_SETUP(vReplayStartPos, fReplayStartHead) PRINTLN("CALLING START REPLAY SETUP FOR CHECKPOINT = ", iStageToUse) ELIF iStageToUse = 2 vReplayStartPos = << -2178.8555, -410.6809, 12.1595 >> fReplayStartHead = 13.1631 vVehReplayStartPos = << -2175.7822, -400.1200, 12.1925 >> fVehReplayStartHead = 347.9469 START_REPLAY_SETUP(vReplayStartPos, fReplayStartHead) PRINTLN("CALLING START REPLAY SETUP FOR CHECKPOINT = ", iStageToUse) ELIF iStageToUse = 3 vReplayStartPos = << -702.8256, 224.2350, 79.1613 >> fReplayStartHead = 291.4638 vVehReplayStartPos = << -700.4276, 229.6938, 79.2745 >> fVehReplayStartHead = 296.3371 START_REPLAY_SETUP(vReplayStartPos, fReplayStartHead) PRINTLN("CALLING START REPLAY SETUP FOR CHECKPOINT = ", iStageToUse) ELIF iStageToUse = 4 vReplayStartPos = <<-1986.3782, 531.8684, 108.2430>> fReplayStartHead = 149.1485 vVehReplayStartPos = <<-1984.4498, 529.9053, 107.9867>> fVehReplayStartHead = 163.9831 START_REPLAY_SETUP(vReplayStartPos, fReplayStartHead) PRINTLN("CALLING START REPLAY SETUP FOR CHECKPOINT = ", iStageToUse) ENDIF ENDIF //main loop WHILE TRUE WAIT(0) UPDATE_LOAD_QUEUE_LARGE(sLoadQueue) REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_ASS2") // DRAW_DEBUG_SPHERE(<< -717.83478, -932.17358, 18.01735 >>, 26.0) UPDATE_PRINT_DELAY(printTimer, 14, TRUE) IF UPDATE_FAIL_CONDITIONS(targetData) IF GET_MISSION_FLOW_SAFE_TO_CLEANUP() IF IS_TIMER_STARTED(tMissionTime) g_savedGlobals.sAssassinData.fMultiMissionTime = GET_PLAYERS_MULTI_MISSION_TIME() PRINTLN("CLEANUP: tMissionTime = ", g_savedGlobals.sAssassinData.fMultiMissionTime) ELSE PRINTLN("CLEANUP: tMissionTime WAS NOT STARTED!!!") ENDIF REMOVE_SCENARIO_BLOCKING_AREA(sbi01) FLUSH_TEXT_MESSAGE_FEED_ENTRIES() MISSION_FAILED(sLoadQueue) ENDIF ELIF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF UPDATE_ASSASSINATION_MULTI(targetData, assArgs) g_savedGlobals.sAssassinData.fMultiMissionTime = GET_PLAYERS_MULTI_MISSION_TIME() PRINTLN("GLOBAL MULTI MISSION TIME = ", g_savedGlobals.sAssassinData.fMultiMissionTime) fTimeTaken = g_savedGlobals.sAssassinData.fMultiMissionTime / 1000 PRINTLN("fTimeTaken = ", fTimeTaken) //manually override the mission time to fit this mission so that it displays properly on the end of the results screen RESTART_TIMER_AT(tMissionTime, fTimeTaken) PAUSE_TIMER(tMissionTime) PRINTLN("tMissionTime = ", GET_TIMER_IN_SECONDS(tMissionTime)) IF NOT bPlayerHasShitSkipped CHECK_FOR_TIME_BONUS() ENDIF FLUSH_TEXT_MESSAGE_FEED_ENTRIES() MISSION_PASSED(missionData, cucEndScreenCore, sLoadQueue) ELSE //to fix bug 1052071 - make sure that the player's last vehicle doesnt get cleaned up (3/4/13 - MB) SAVE_LAST_PLAYER_VEHICLE() PLAY_FRANKLIN_LINE_REACTING_TO_POLICE_IF_WANTED() ENDIF //handle the mission timer stuff FAIL_MISSION_IF_TIMER_EXPIRES(targetData, assArgs) ENDIF #IF IS_DEBUG_BUILD DO_DEBUG_SKIPS_MULTI(assArgs, targetData) // IF DOES_ENTITY_EXIST(assArgs.myProp[0]) //assArgs.myProp[myDebugData.iDebugFloat] // SET_ENTITY_COORDS(assArgs.myProp[0], << myDebugData.vDebugVector.X, myDebugData.vDebugVector.Y, myDebugData.vDebugVector.Z >>) // SET_ENTITY_HEADING(assArgs.myProp[0], myDebugData.fRotateZ) // ENDIF // IF myDebugData.bTurnOnDebugPos // IF DOES_ENTITY_EXIST(assArgs.myOtherPed) //the ped you are attaching // AND DOES_ENTITY_EXIST(assArgs.myVehicle) // ATTACH_ENTITY_TO_ENTITY(assArgs.myOtherPed, assArgs.myVehicle, 0, << myDebugData.fOffsetX, myDebugData.fOffsetY, myDebugData.fOffsetZ >>, << myDebugData.fRotateX, myDebugData.fRotateY, myDebugData.fRotateZ >>) // SET_ENTITY_ROTATION(assArgs.myOtherPed, << myDebugData.fRotateX, myDebugData.fRotateY, myDebugData.fRotateZ >>) // ENDIF // ENDIF // IF myDebugData.bTurnOnDebugPos // IF DOES_ENTITY_EXIST(assArgs.myTarget) // AND DOES_ENTITY_EXIST(assArgs.myProp[0]) // ATTACH_ENTITY_TO_ENTITY(assArgs.myTarget, assArgs.myProp[0], 0, << myDebugData.fOffsetX, myDebugData.fOffsetY, myDebugData.fOffsetZ >>, << myDebugData.fRotateX, myDebugData.fRotateY, myDebugData.fRotateZ >>, TRUE, TRUE) // ENDIF // ENDIF // SHOW_BYSTANDER_POSITIONS() #ENDIF ENDWHILE ENDSCRIPT